
     iRf                        S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  S SKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  \" 5       rSr " S S5      r " S S5      r " S S\R4                  5      rg)    )futuresN)deque)datetime)partial   )base   )http)util)sock)wsgig      @c                   2    \ rS rSrS rS rS rS rS rSr	g)	TConn*   c                     Xl         X l        X0l        X@l        S U l        S U l        SU l        SU l        SU l        U R                  R                  S5        g )NF)
cfgr   clientservertimeoutparserinitializedis_http2
data_readysetblocking)selfr   r   r   r   s        J/var/www/ias/venv/lib/python3.13/site-packages/gunicorn/workers/gthread.py__init__TConn.__init__,   sN    	  			e$    c                    U R                   (       a  g SU l         U R                  R                  S5        U R                  Gc=  U R                  R
                  (       a  [        R                  " U R                  U R                  5      U l        U R                  R                  (       d  U R                  R                  5         [        R                  " U R                  5      (       a\  SU l
        [        R                  " U R                  U R                  U R                  SS9U l        U R                  R                  5         g [        R                  " U R                  U R                  U R                  5      U l        g g )NT)http2_connection)r   r   r   r   r   is_sslssl_wrap_socketdo_handshake_on_connectdo_handshakeis_http2_negotiatedr   r
   
get_parserr   initiate_connectionr   s    r   init
TConn.init<   s    		d#;;xx 00DHHE	 xx77II**, ++DII66$(DM"&//$))T[[4#DK KK335 //$((DIIt{{KDK) r   c                 f    [         R                  " 5       U R                  R                  -   U l        g N)time	monotonicr   	keepaliver   r)   s    r   set_timeoutTConn.set_timeoutY   s    ~~'$((*<*<<r   c                    U R                   (       a  g[        R                  " 5       n UR                  U R                  [        R
                  5        UR                  US9nU(       a  SU l          UR                  5         g UR                  5         g! [        [        4 a     UR                  5         gf = f! UR                  5         f = f)aB  Wait for data to be available on the socket.

Uses selectors to wait for the socket to become readable within
the given timeout. This prevents slow clients from blocking
thread pool slots indefinitely.

Args:
    timeout: Maximum time to wait in seconds.

Returns:
    True if data is available, False if timeout expired.
Tr   F)
r   	selectorsDefaultSelectorregisterr   
EVENT_READselectcloseOSError
ValueError)r   r   seleventss       r   wait_for_dataTConn.wait_for_data]   s     ?? '')	LLI$8$89ZZZ0F"& IIK 
 IIK	 $ 	IIK		 IIKs$   AB B7$B: 6B77B: :Cc                 D    [         R                  " U R                  5        g r-   )r   r:   r   r)   s    r   r:   TConn.close|   s    

499r   )	r   r   r   r   r   r   r   r   r   N)
__name__
__module____qualname____firstlineno__r   r*   r1   r?   r:   __static_attributes__ r   r   r   r   *   s    % L:=>r   r   c                   @    \ rS rSrSrS rS rS rS rS r	SS jr
S	rg
)PollableMethodQueue   a  Thread-safe queue that can wake up a selector.

Uses a pipe to allow worker threads to signal the main thread
when work is ready, enabling lock-free coordination.

This approach is compatible with all POSIX systems including
Linux, macOS, FreeBSD, OpenBSD, and NetBSD. The pipe is set to
non-blocking mode to prevent worker threads from blocking if
the pipe buffer fills up under extreme load.
c                 .    S U l         S U l        S U l        g r-   )_read_fd	_write_fd_queuer)   s    r   r   PollableMethodQueue.__init__   s    r   c                     [         R                  " 5       u  U l        U l        [         R                  " U R                  S5        [         R                  " U R                  S5        [
        R                  " 5       U l        g)zInitialize the pipe and queue.FN)ospiperM   rN   set_blockingqueueSimpleQueuerO   r)   s    r   r*   PollableMethodQueue.init   sL    (*	%t~ 	u-
.'')r   c                     U R                   b!   [        R                  " U R                   5        U R                  b"   [        R                  " U R                  5        gg! [         a     N<f = f! [         a     gf = f)z Close the pipe file descriptors.N)rM   rR   r:   r;   rN   r)   s    r   r:   PollableMethodQueue.close   sn    ==$' >>%( &  
  s"    A  A/ 
A,+A,/
A<;A<c                     U R                   $ )z>Return the readable file descriptor for selector registration.)rM   r)   s    r   filenoPollableMethodQueue.fileno   s    }}r   c                     U R                   R                  [        U/UQ76 5         [        R                  " U R
                  S5        g! [         a     gf = f)a  Queue a callback to be run on the main thread.

The callback is added to the queue first, then a wake-up byte
is written to the pipe. If the pipe write fails (buffer full),
it's safe to ignore because the main thread will eventually
drain the queue when it reads other wake-up bytes.
    N)rO   putr   rR   writerN   r;   )r   callbackargss      r   deferPollableMethodQueue.defer   sI     	0401	HHT^^W- 	 	s   !A	 	
AAc                 <    [         R                  " U R                  U5      nSnU[	        U5      S-   :  a<   U R
                  R                  5       nU" 5         US-  nU[	        U5      S-   :  a  M;  gg! [         a     gf = f! [        R                   a     gf = f)zRun queued callbacks. Called when the pipe is readable.

Drains all available wake-up bytes and runs corresponding callbacks.
The max_callbacks limit prevents starvation of other event sources.
Nr   
   r   )	rR   readrM   r;   lenrO   
get_nowaitrU   Empty)r   _fileobjmax_callbacksdatacallbacks_runra   s         r   run_callbacks!PollableMethodQueue.run_callbacks   s    	774==-8D c$i"n,;;113
"	 c$i"n,  		 ;; s"   !A4 &B 4
B BBB)rO   rM   rN   N)2   )rC   rD   rE   rF   __doc__r   r*   r:   r[   rc   ro   rG   rH   r   r   rJ   rJ      s%    	
* r   rJ   c                      ^  \ rS rSrU 4S jr\S 5       rU 4S jrS rS r	U 4S jr
S rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rSrU =r$ )ThreadWorker   c                 R  > [         TU ]  " U0 UD6  U R                  R                  U l        U R                  R                  U R                  R                  -
  U l        S U l        S U l        [        5       U l	        [        5       U l        [        5       U l        SU l        SU l        g )Nr   F)superr   r   worker_connectionsthreadsmax_keepalivedtpoolpollerrJ   method_queuer   keepalived_connspending_connsnr_conns
_accepting)r   rb   kwargs	__class__s      r   r   ThreadWorker.__init__   s    $)&)"&(("="="hh99DHH<L<LL
/1 %"Wr   c                     UR                   UR                  -
  nUS::  a$  UR                  (       a  UR                  S5        g g g )Nr   z]No keepalived connections can be handled. Check the number of worker connections and threads.)rx   ry   r0   warning)clsr   logrz   s       r   check_configThreadWorker.check_config   s?    //#++=Q3==KK N O $1r   c                    > U R                  5       U l        [        R                  " 5       U l        U R
                  R                  5         [        TU ]!  5         g r-   )	get_thread_poolr{   r5   r6   r|   r}   r*   rw   init_process)r   r   s    r   r   ThreadWorker.init_process   s@    ))+
//1 r   c                 R    [         R                  " U R                  R                  S9$ )z@Override this method to customize how the thread pool is created)max_workers)r   ThreadPoolExecutorr   ry   r)   s    r   r   ThreadWorker.get_thread_pool   s    ))dhh6F6FGGr   c                 n    U R                   (       a$  SU l         U R                  R                  S 5        gg)z)Handle SIGTERM - begin graceful shutdown.Fc                      g r-   rH   rH   r   r   <lambda>*ThreadWorker.handle_exit.<locals>.<lambda>   s    Dr   N)aliver}   rc   )r   sigframes      r   handle_exitThreadWorker.handle_exit   s)    ::DJ##L1 r   c                 V   > U R                   R                  SS9  [        TU ]  X5        g)z$Handle SIGQUIT - immediate shutdown.FwaitN)r{   shutdownrw   handle_quit)r   r   r   r   s      r   r   ThreadWorker.handle_quit   s%    

'C'r   c                 *   XR                   :X  a  gU R                   Hm  nU(       aH  UR                  S5        U R                  R	                  U[
        R                  U R                  5        MR  U R                  R                  U5        Mo     Xl         g)z,Enable or disable accepting new connections.NF)	r   socketsr   r|   r7   r5   r8   accept
unregister)r   enabledlisteners      r   set_accept_enabledThreadWorker.set_accept_enabled  sg    oo%H$$U+$$Xy/C/CT[[Q&&x0 % "r   c                    ^ ^ T R                   R                  T R                  T5      nUR                  UU 4S j5        g)z0Submit connection to thread pool for processing.c                 R   > TR                   R                  TR                  TU 5      $ r-   )r}   rc   finish_request)futconnr   s    r   r   *ThreadWorker.enqueue_req.<locals>.<lambda>  s     ))//0C0CT3Or   N)r{   submithandleadd_done_callback)r   r   fss   `` r   enqueue_reqThreadWorker.enqueue_req  s/    ZZt{{D1
O	Qr   c                     UR                  5       u  p#U =R                  S-  sl        UR                  S5        [        U R                  X#UR                  5       5      nU R                  U5        g! [         aH  nUR                  [        R                  [        R                  [        R                  4;  a  e  SnAgSnAff = f)z/Accept a new connection from a listener socket.r   TN)r   r   r   r   r   getsocknamer   r;   errnoEAGAINECONNABORTEDEWOULDBLOCK)r   r   client_sockclient_addrr   es         r   r   ThreadWorker.accept  s    	'/'8$KMMQM##D);X=Q=Q=STD T" 	wwu||U-?-?ARARSS T	s   A.A1 1
C;>B>>Cc                     U R                   R                  U5        U R                  R                  U5        U R	                  U5        g)z0Handle a keepalive connection becoming readable.N)r|   r   r~   remover   r   r   r   s      r   on_client_socket_readable&ThreadWorker.on_client_socket_readable%  s8    v&$$T* 	r   c                     U R                   R                  U5        U R                  R                  U5        SUl        U R                  U5        g)z9Handle a pending (deferred) connection becoming readable.TN)r|   r   r   r   r   r   r   s      r   on_pending_socket_readable'ThreadWorker.on_pending_socket_readable-  sA    v&!!$'  	r   c                    [         R                  " 5       nU R                  (       a  U R                  S   nUR                  U-
  nUS:  a  gU R                  R	                  5          U R
                  R                  UR                  5        U =R                  S-  sl        UR                  5         U R                  (       a  M  gg! [        [        [        4 a     NQf = f)z$Close expired keepalive connections.r   r   N)r.   r/   r~   r   popleftr|   r   r   r;   KeyErrorr<   r   r:   r   nowr   deltas       r   murder_keepalivedThreadWorker.murder_keepalived8  s    nn##((+DLL3&Eqy !!))+&&tyy1 MMQMJJL ### Xz2    '%C CCc                    [         R                  " 5       nU R                  (       a  U R                  S   nUR                  U-
  nUS:  a  gU R                  R	                  5          U R
                  R                  UR                  5        U =R                  S-  sl        UR                  5         U R                  (       a  M  gg! [        [        [        4 a     NQf = f)z=Close expired pending connections (waiting for initial data).r   r   N)r.   r/   r   r   r   r|   r   r   r;   r   r<   r   r:   r   s       r   murder_pendingThreadWorker.murder_pendingJ  s    nn  %%a(DLL3&Eqy &&(&&tyy1 MMQMJJL     Xz2 r   c                     U R                   [        R                  " 5       :w  a  U R                  R	                  SU 5        gg)Nz!Parent changed, shutting down: %sFT)ppidrR   getppidr   infor)   s    r   is_parent_aliveThreadWorker.is_parent_alive\  s-    99

$HHMM=tDr   c                      U R                   R                  U5      nU H#  u  p4UR                  nU" UR                  5        M%     g! [         a)  nUR
                  [
        R                  :w  a  e  SnAgSnAff = f)z'Wait for events and dispatch callbacks.N)r|   r9   rm   fileobjr;   r   EINTR)r   r   r>   key_ra   r   s          r   wait_for_and_dispatch_events)ThreadWorker.wait_for_and_dispatch_eventsc  sf    	[[''0F 88% !  	ww%++% &	s   AA 
A:A55A:c                    U R                   R                  U R                  R                  5       [        R
                  U R                  R                  5        U R                  S5        U R                  (       a  U R                  5         U R                  U R                  :  nXR                  :w  a  U R                  U5        U R                  SS9  U R                  5       (       d  O3U R                  5         U R!                  5         U R                  (       a  M  U R                  S5        ["        R$                  " 5       U R&                  R(                  -   nU R                  S:  aj  [+        U["        R$                  " 5       -
  S5      nUS:X  a  OAU R                  US9  U R                  5         U R!                  5         U R                  S:  a  Mj  U R,                  R/                  SS9  U R                   R1                  5         U R                  R1                  5         U R2                   H  nUR1                  5         M     g )NTg      ?r4   Fr   r   )r|   r7   r}   r[   r5   r8   ro   r   r   notifyr   rx   r   r   r   r   r   r.   r/   r   graceful_timeoutmaxr{   r   r:   r   )r   
can_acceptr   time_remainingss        r   runThreadWorker.runn  s   T..557&11!..<<	>
 	%jjKKM )@)@@J__,''
3 --c-:'')) ""$!# jjj( 	&  >>+dhh.G.GGmma !1DNN4D!DaHN"--n-E""$! mma 	

'!AGGI r   c                     UR                  5       (       d  UR                  5       OSnU[        L a  U R                  (       a  UR                  R                  S5        [        R                  " 5       U R                  R                  -   Ul
        U R                  R                  U5        U R                  R                  UR                  [        R                   [#        U R$                  U5      5        gU(       a  U R                  (       a  UR                  R                  S5        UR'                  5         U R(                  R                  U5        U R                  R                  UR                  [        R                   [#        U R*                  U5      5        gU =R,                  S-  sl        UR/                  5         g! [0         a(    U =R,                  S-  sl        UR/                  5          gf = f)zHHandle completion of a request (called via method_queue on main thread).Fr   N)	cancelledresult_DEFERr   r   r   r.   r/   r   r0   r   r   appendr|   r7   r5   r8   r   r   r1   r~   r   r   r:   	Exception)r   r   r   r   s       r   r   ThreadWorker.finish_request  sM   	(*RYY[EFDJJ 		%%e,#~~/$((2D2DD""))$/$$TYY	0D0D%,T-L-Ld%SUDJJ		%%e,  "%%,,T2$$TYY	0D0D%,T-K-KT%RT "

 	MMQMJJL	s   C1G 4B'G %G /G43G4c                    Sn UR                   (       d1  UR                  (       d   UR                  [        5      (       d  [        $ UR
                  R                  S5        UR                  5         UR                  (       a  U R                  U5      $ [        UR                  5      nU(       d  gU R                  X!5      nU(       a  UR                  R                  5         g g! [        R                  R                    a&  nU R"                  R%                  SU5         SnAgSnAf[&         a&  nU R"                  R%                  SU5         SnAgSnAf[(        R*                   a  nUR,                  S   [(        R.                  :X  a:  U R"                  R%                  S5        UR
                  R1                  5          SnAgU R"                  R%                  S5        U R3                  X!R
                  UR4                  U5         SnAgSnAf[6         a  nUR8                  [8        R:                  [8        R<                  [8        R>                  4;  a   U R"                  RA                  S	5         SnAgUR8                  [8        R<                  :X  a   U R"                  R%                  S
5         SnAgUR8                  [8        R>                  :X  a   U R"                  R%                  S5         SnAgU R"                  R%                  S5         SnAgSnAf[B         a1  nU R3                  X!R
                  UR4                  U5         SnAgSnAff = f)z:Handle a request on a connection. Runs in a worker thread.NTFz*Ignored premature client disconnection. %szClosing connection. %sr   zssl connection closedzError processing SSL request.z Socket error processing request.zIgnoring connection resetzIgnoring socket not connectedzIgnoring connection epipe)"r   r   r?   DEFAULT_WORKER_DATA_TIMEOUTr   r   r   r*   r   handle_http2nextr   handle_requestfinish_bodyr
   errors
NoMoreDatar   debugStopIterationsslSSLErrorrb   SSL_ERROR_EOFr:   handle_errorr   r;   r   EPIPE
ECONNRESETENOTCONN	exceptionr   )r   r   reqr0   r   s        r   r   ThreadWorker.handle  s{   :	>
 ##DOO))*EFF!M II!!$' IIK }}((..t{{#C ++C6I '')	 : 1 {{%% 	LHHNNGKK. -  	8HHNN3Q77* ) || 	BvvayC---67		!!"  >?!!#yy$++qAA   		@wwu{{E,<,<ennMM""#EFF  77e...HHNN#>??  WW.HHNN#BCC 	 HHNN#>??   	>c99dkk1==	>sv   AC% AC% C% 02C% %MD$$M1EM)AHAHMAL59L39L1LM'M

Mc           	      d   UR                   n UR                  (       d  U R                  (       a  UR                  5       nU H;  n U R	                  XAU5        UR                  UR                  R                  5        M=     U R                  (       d  UR                  5          g
UR                  (       d  U R                  (       a  M  g
! [
         aj  nU R                  R                  S5         UR                  UR                  R                  S[        U5      5         SnAN! [
         a      SnANf = fSnAff = f! UR                  UR                  R                  5        f = f! [        R                  R                    a    U R                  R#                  S5         g
[$        R&                   ag  nUR(                  S   [$        R*                  :X  a   U R                  R#                  S5         SnAg
U R                  R#                  SU5         SnAg
SnAf[,         ab  nUR.                  [.        R0                  [.        R2                  [.        R4                  4;  a  U R                  R                  S5         SnAg
SnAf[
         a    U R                  R                  S	5         g
f = f)zHandle an HTTP/2 connection. Runs in a worker thread.

HTTP/2 connections are persistent and multiplex multiple streams.
We handle all streams until the connection is closed.

Returns:
    False (HTTP/2 connections don't use keepalive polling)
zError handling HTTP/2 requesti  Nz"HTTP/2 connection closed by clientr   zHTTP/2 SSL connection closedzHTTP/2 SSL error: %szHTTP/2 socket errorzHTTP/2 connection errorF)r   	is_closedr   receive_datahandle_http2_requestr   r   r  
send_errorstream	stream_idstrcleanup_streamr:   r
   r   r   r   r   r   rb   r   r;   r   r   r   r  )r   r   h2_connrequestsr  r   s         r   r   ThreadWorker.handle_http2  s    ++"	:''DJJ"//1#C
E11#WE  ..szz/C/CD $ zzMMO G ''DJJJF 9 % !**+JK!#..szz/C/CS#a&QQ( ! !	!  ..szz/C/CD {{%% 	AHHNN?@  || 	:vvayC---=>>  5q99   	:wwu{{E,<,<ennMM""#89   	:HH89	:s   7E* C	A
E* $"E* 	
D=D8/0D$E $
D5.D8/E 4D55D88D==E  'E''E* *9J/%J/8<H9HJ/'AJ(J/.J/c                 $  ^^^ 0 nSnUR                   R                  m U R                  R                  X5        [        R
                  " 5       n[        R                  " XR                  UR                  UR                  U R                  5      u  pTSUS'   SUS'   UU4S jnXtS'   / mU4S jnXS	'   U =R                  S
-  sl        U R                  U R                  :  a3  U R                  (       a"  U R                  R                  S5        SU l        U R                  XER                   5      n	Sn
 [#        U	S5      (       a  U	 H  nU(       d  M  X-  n
M     [#        U	S5      (       a  U	R%                  5         T(       a  S['        UR(                  5      4/nUR*                   H/  u  pUR-                  UR/                  5       ['        U5      45        M1     TR0                  R3                  TUSS9  TR4                  T   nUR3                  USS9  TR7                  5         U
(       a;  TR0                  R9                  TU
SS9  UR9                  U
SS9  TR7                  5         TR;                  TT5        O(TR=                  TUR(                  UR*                  U
5        [        R
                  " 5       U-
  nU R                  R?                  XQUU5         U R                  RA                  XXE5        g! [#        U	S5      (       a  U	R%                  5         f f = f! [B         a    U R                  RE                  S5         gf = f!  U R                  RA                  XXE5        f ! [B         a    U R                  RE                  S5         f f = f= f)z&Handle a single HTTP/2 request/stream.NTwsgi.multithread2HTTP_VERSIONc                 ,   > TR                  TSU 5        g)z!Send 103 Early Hints over HTTP/2.g   N)send_informational)headersr  r  s    r   send_early_hints_h2>ThreadWorker.handle_http2_request.<locals>.send_early_hints_h2>  s    **9c7Cr   zwsgi.early_hintsc                 (   > TR                  U 5        g)z.Queue trailers to be sent after response body.N)extend)trailerspending_trailerss    r   send_trailers_h2;ThreadWorker.handle_http2_request.<locals>.send_trailers_h2G  s     ''1r   zgunicorn.http2.send_trailersr   ,Autorestarting worker after current request.Fr   __iter__r:   z:status)
end_streamException in post_request hook)#r
  r  r   pre_requestr   r   r   creater   r   r   nrmax_requestsr   r   r   start_responsehasattrr:   r  status_coder  r   lowerr  send_headersstreams_send_pending_data	send_datasend_trailerssend_responseaccesspost_requestr   r  )r   r  r   r  environresprequest_startr  r  respiterresponse_bodyitemresponse_headersnamevaluer
  request_timer  r  s      `             @@r   r  !ThreadWorker.handle_http2_request-  s   JJ((	T	EHH  +$LLNM !KKYY(,TXX?MD*.G&'&)GN#D +>&'  "2 7G23GGqLGww$+++::HHMM"PQ!&DJ yy*=*=>H  M%8Z00 (4)1M !) 8W--NN$   &/D4D4D0E$F#G #'<<KD$++TZZ\3u:,FG $0 ,,Y8HUZ,[ 3##$4#G**, !OO--iSX-Y$$]u$E..0 %%i1AB %%$$LL!	 $<<>M9LHHOODw=E%%d?O 8W--NN$ .P  E""#CDEE%%d? E""#CDEsa   DM 3K3 K3 E;M L 3$LM %MMNM$#N$%N	NNNc                    0 nS n U R                   R                  X5        [        R                  " 5       n[        R
                  " XR                  UR                  UR                  U R                   5      u  pCSUS'   U =R                  S-  sl	        U R                  U R                  :  aC  U R                  (       a"  U R                  R                  S5        SU l        UR                  5         U R                  (       a  U R                   R                  (       d  UR                  5         O3[!        U R"                  5      U R$                  :  a  UR                  5         U R	                  X4R&                  5      n [)        XcS   5      (       a  UR+                  U5        OU H  nUR-                  U5        M     UR/                  5         [        R                  " 5       U-
  nU R                  R1                  XAX85        [3        US5      (       a  UR/                  5         UR5                  5       (       a:  U R                  R7                  S5          U R                   R9                  XX45        g  U R                   R9                  XX45        g! [        R                  " 5       U-
  nU R                  R1                  XAX85        [3        US5      (       a  UR/                  5         f f = f! [:         a    U R                  R=                  S	5         gf = f! [>         a)    [@        RB                  " [D        RF                  " 5       6    N[:         a    U(       a  URH                  (       a  U R                  R=                  S
5         UR                  RK                  [L        RN                  5        UR                  R/                  5         [Q        5       e! [>         a     [Q        5       ef = fe f = f! [:         a    U R                  R=                  S	5         gf = f!  U R                   R9                  XX45        f ! [:         a    U R                  R=                  S	5         f f = f= f)NTr  r   r!  Fzwsgi.file_wrapperr:   zClosing connection.r$  zError handling request))r   r%  r   r   r   r&  r   r   r   r'  r(  r   r   r   force_closer0   rh   r~   rz   r)  
isinstance
write_filer`   r:   r3  r*  should_closer   r4  r   r  r;   r   reraisesysexc_infoheaders_sentr   socket	SHUT_RDWRr   )	r   r  r   r5  r6  r7  r8  r:  r>  s	            r   r   ThreadWorker.handle_request  sO   7	EHH  +$LLNM KKYY(,TXX?MD*.G&'GGqLGww$+++::HHMM"PQ!&DJ  "::TXX%7%7  "T**+t/B/BB  "yy*=*=>H%h0C(DEEOOH- (

4( !) 

'||~=7A8W--NN$  ""45"E%%d?) #&E%%d? ;  (||~=7A8W--NN$ .0  E""#CDE%  	*LL#,,.) 	)) ""#;<II&&v'7'78IIOO% $o%  #o% 	  E""#CDEE%%d? E""#CDEs   E5L <AJ BL K) /P 1O. AK&&L )%LL0O+P <O+AO
O+
O&O+%O&&O++P .%PPQ#P87Q#8%Q Q#Q  Q#)
r   r   r~   rz   r}   r   r   r|   r{   rx   )rC   rD   rE   rF   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   rG   __classcell__)r   s   @r   rt   rt      s      O OH2(
"Q	$$	/b8?B/bZEx< <r   rt   )
concurrentr   r   rR   rU   r5   rI  r   rF  r.   collectionsr   r   	functoolsr    r   r
   r   r   r   objectr   r   r   rJ   Workerrt   rH   r   r   <module>rT     sw      	    
 
          

 " S SlQ Qhq4;; qr   