ó
    Rì?gÌC  ã                   ó4  • S SK r S SKrS SKrS SKJrJr  S SKJrJr  S SK	J
r
JrJrJrJr  S SK	r	\	R                  (       a  S SK	JrJr  / SQr " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)é    N)ÚgenÚioloop)ÚFutureÚ"future_set_result_unless_cancelled)ÚUnionÚOptionalÚTypeÚAnyÚ	Awaitable)ÚDequeÚSet)Ú	ConditionÚEventÚ	SemaphoreÚBoundedSemaphoreÚLockc                   ó,   • \ rS rSrSrSS jrSS jrSrg)Ú_TimeoutGarbageCollectoré   zÍBase class for objects that periodically clean up timed-out waiters.

Avoids memory leak in a common pattern like:

    while True:
        yield condition.wait(short_timeout)
        print('looping....')
Nc                 óF   • [         R                  " 5       U l        SU l        g )Nr   )ÚcollectionsÚdequeÚ_waitersÚ	_timeouts©Úselfs    Ú//usr/lib/python3/dist-packages/tornado/locks.pyÚ__init__Ú!_TimeoutGarbageCollector.__init__)   s   € Ü#×)Ò)Ó+ˆŒØˆ�ó    c                 ó¶   • U =R                   S-  sl         U R                   S:”  a4  SU l         [        R                  " S U R                   5       5      U l        g g )Né   éd   r   c              3   óR   #   • U  H  oR                  5       (       a  M  Uv •  M     g 7f©N)Údone)Ú.0Úws     r   Ú	<genexpr>Ú<_TimeoutGarbageCollector._garbage_collect.<locals>.<genexpr>2   s   é € Ð-Wº°AÏfÉfÏh¯a©aºùs   ‚'ž	')r   r   r   r   r   s    r   Ú_garbage_collectÚ)_TimeoutGarbageCollector._garbage_collect-   sD   € à�Š˜!Ñ�Ø�>‰>˜CÓØˆDŒNÜ'×-Ò-Ñ-W¸¿ºÓ-WÓWˆD�Mð  r    )r   r   ©ÚreturnN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r+   Ú__static_attributes__© r    r   r   r      s   † ñô÷Xr    r   c                   óˆ   • \ rS rSrSrS\4S jr SS\\\	\
R                  4      S\\   4S jjrSS\SS4S	 jjrSS
 jrSrg)r   é5   a  A condition allows one or more coroutines to wait until notified.

Like a standard `threading.Condition`, but does not need an underlying lock
that is acquired and released.

With a `Condition`, coroutines can wait to be notified by other coroutines:

.. testcode::

    import asyncio
    from tornado import gen
    from tornado.locks import Condition

    condition = Condition()

    async def waiter():
        print("I'll wait right here")
        await condition.wait()
        print("I'm done waiting")

    async def notifier():
        print("About to notify")
        condition.notify()
        print("Done notifying")

    async def runner():
        # Wait for waiter() and notifier() in parallel
        await gen.multi([waiter(), notifier()])

    asyncio.run(runner())

.. testoutput::

    I'll wait right here
    About to notify
    Done notifying
    I'm done waiting

`wait` takes an optional ``timeout`` argument, which is either an absolute
timestamp::

    io_loop = IOLoop.current()

    # Wait up to 1 second for a notification.
    await condition.wait(timeout=io_loop.time() + 1)

...or a `datetime.timedelta` for a timeout relative to the current time::

    # Wait up to 1 second.
    await condition.wait(timeout=datetime.timedelta(seconds=1))

The method returns False if there's no notification before the deadline.

.. versionchanged:: 5.0
   Previously, waiters could be notified synchronously from within
   `notify`. Now, the notification will always be received on the
   next iteration of the `.IOLoop`.
r.   c                 ó˜   • SU R                   R                  < 3nU R                  (       a  US[        U R                  5      -  -  nUS-   $ )NÚ<z waiters[%s]Ú>)Ú	__class__r/   r   Úlen)r   Úresults     r   Ú__repr__ÚCondition.__repr__q   s=   � ØŸ.™.×1Ó1Ð3ˆØ�=�=Ø�n¤s¨4¯=©=Ó'9Ñ9Ñ9ˆFØ˜‰|Ðr    NÚtimeoutc                 ó  ^ ^^^• [        5       mT R                  R                  T5        U(       aN  SU U4S jjn[        R                  R                  5       mTR                  X5      mTR                  UU4S j5        T$ )z|Wait for `.notify`.

Returns a `.Future` that resolves ``True`` if the condition is notified,
or ``False`` after a timeout.
c                  óh   >• TR                  5       (       d  [        TS5        T R                  5         g ©NF)r&   r   r+   ©r   Úwaiters   €€r   Ú
on_timeoutÚ"Condition.wait.<locals>.on_timeoutƒ   s$   ø€ Ø—{‘{—}‘}Ü6°v¸uÔEØ×%Ñ%Õ'r    c                 ó&   >• TR                  T5      $ r%   ©Úremove_timeout©Ú_Úio_loopÚtimeout_handles    €€r   Ú<lambda>Ú Condition.wait.<locals>.<lambda>Š   s   ø€ ¨w×/EÑ/EÀnÔ/Ur    r-   )r   r   Úappendr   ÚIOLoopÚcurrentÚadd_timeoutÚadd_done_callback©r   r@   rF   rM   rN   rE   s   `  @@@r   ÚwaitÚCondition.waitw   sc   û€ ô “ˆØ�‰×Ñ˜VÔ$Þ÷(ð (ô
 —m‘m×+Ñ+Ó-ˆGØ$×0Ñ0°ÓEˆNØ×$Ñ$Õ%UÔVØˆr    Únc                 ó   • / nU(       ap  U R                   (       a_  U R                   R                  5       nUR                  5       (       d  US-  nUR                  U5        U(       a  U R                   (       a  M_  U H  n[	        US5        M     g)zWake ``n`` waiters.r"   TN)r   Úpopleftr&   rQ   r   )r   rY   ÚwaitersrE   s       r   ÚnotifyÚCondition.notify�   se   € àˆÞ�D—M—MØ—]‘]×*Ñ*Ó,ˆFØ—;‘;—=‘=Ø�Q‘�Ø—‘˜vÔ&ö	 �D—M—M‘Mó ˆFÜ.¨v°tÖ<ò r    c                 óL   • U R                  [        U R                  5      5        g)zWake all waiters.N)r]   r<   r   r   s    r   Ú
notify_allÚCondition.notify_all™   s   € à�‰”C˜Ÿ™Ó&Õ'r    r5   r%   ©r"   r-   )r/   r0   r1   r2   r3   Ústrr>   r   r   ÚfloatÚdatetimeÚ	timedeltar   ÚboolrW   Úintr]   r`   r4   r5   r    r   r   r   5   sa   † ñ9ðv˜#ô ð EIñØ  e¨X×-?Ñ-?Ð&?Ñ @ÑAðà	�4‰õñ,
=˜ð 
= Dõ 
=÷(r    r   c                   ó”   • \ rS rSrSrSS jrS\4S jrS\4S jr	SS jr
SS	 jr SS
\\\\R                   4      S\S   4S jjrSrg)r   éž   a6  An event blocks coroutines until its internal flag is set to True.

Similar to `threading.Event`.

A coroutine can wait for an event to be set. Once it is set, calls to
``yield event.wait()`` will not block unless the event has been cleared:

.. testcode::

    import asyncio
    from tornado import gen
    from tornado.locks import Event

    event = Event()

    async def waiter():
        print("Waiting for event")
        await event.wait()
        print("Not waiting this time")
        await event.wait()
        print("Done")

    async def setter():
        print("About to set the event")
        event.set()

    async def runner():
        await gen.multi([waiter(), setter()])

    asyncio.run(runner())

.. testoutput::

    Waiting for event
    About to set the event
    Not waiting this time
    Done
r.   Nc                 ó0   • SU l         [        5       U l        g rC   )Ú_valueÚsetr   r   s    r   r   ÚEvent.__init__Æ   s   € ØˆŒÜ›ˆ�r    c                 ón   • SU R                   R                  < SU R                  5       (       a  SOS< S3$ )Nr9   Ú rm   Úclearr:   )r;   r/   Úis_setr   s    r   r>   ÚEvent.__repr__Ê   s+   � à�N‰N×#Ô#Ø—[‘[—]‘]‰E¨Ò/ð
ð 	
r    c                 ó   • U R                   $ )z-Return ``True`` if the internal flag is true.©rl   r   s    r   rr   ÚEvent.is_setÐ   s   € à�{‰{Ðr    c                 ó¬   • U R                   (       dC  SU l         U R                   H+  nUR                  5       (       a  M  UR                  S5        M-     gg)zsSet the internal flag to ``True``. All waiters are awakened.

Calling `.wait` once the flag is set will not block.
TN)rl   r   r&   Ú
set_result)r   Úfuts     r   rm   Ú	Event.setÔ   s<   € ð
 �{�{ØˆDŒKà—}”}�Ø—x‘x—z“zØ—N‘N 4Ö(ò %ð r    c                 ó   • SU l         g)z[Reset the internal flag to ``False``.

Calls to `.wait` will block until `.set` is called.
FNru   r   s    r   rq   ÚEvent.clearà   s   € ð
 ˆ�r    r@   c                 ó(  ^ ^• [        5       mT R                  (       a  TR                  S5        T$ T R                  R	                  T5        TR                  U 4S j5        Uc  T$ [        R                  " UT5      nUR                  U4S j5        U$ )zxBlock until the internal flag is true.

Returns an awaitable, which raises `tornado.util.TimeoutError` after a
timeout.
Nc                 ó:   >• TR                   R                  U 5      $ r%   )r   Úremove)ry   r   s    €r   rO   ÚEvent.wait.<locals>.<lambda>ô   s   ø€ ¨$¯-©-×*>Ñ*>¸sÔ*Cr    c                 óR   >• TR                  5       (       d  TR                  5       $ S $ r%   )r&   Úcancel)Útfry   s    €r   rO   r€   ý   s   ø€ ¨s¯x©x¯z©z˜3Ÿ:™:›<ÐC¸tÐCr    )r   rl   rx   r   ÚaddrU   r   Úwith_timeout)r   r@   Útimeout_futry   s   `  @r   rW   Ú
Event.waitç   s|   ù€ ô ‹hˆØ�;�;Ø�N‰N˜4Ô ØˆJØ�‰×Ñ˜#ÔØ×ÑÔCÔDØ‰?ØˆJä×*Ò*¨7°CÓ8ˆKð ×)Ñ)ÜCôð Ðr    )rl   r   r-   r%   )r/   r0   r1   r2   r3   r   rc   r>   rg   rr   rm   rq   r   r   rd   re   rf   r   rW   r4   r5   r    r   r   r   ž   si   † ñ%ôNð
˜#ô 
ð˜ô ô
)ôð EIñØ  e¨X×-?Ñ-?Ð&?Ñ @ÑAðà	�4‰÷ð r    r   c                   ón   • \ rS rSrSrS\SS4S jrSS jrSS	S
\\	   S\\
R                     SS4S jrSrg)Ú_ReleasingContextManageri  z—Releases a Lock or Semaphore at the end of a "with" statement.

with (yield semaphore.acquire()):
    pass

# Now semaphore.release() has been called.
Úobjr.   Nc                 ó   • Xl         g r%   ©Ú_obj)r   rŠ   s     r   r   Ú!_ReleasingContextManager.__init__  s   € Ø�	r    c                 ó   • g r%   r5   r   s    r   Ú	__enter__Ú"_ReleasingContextManager.__enter__  s   € Ør    Úexc_typeúOptional[Type[BaseException]]Úexc_valÚexc_tbc                 ó8   • U R                   R                  5         g r%   )r�   Úrelease)r   r’   r”   r•   s       r   Ú__exit__Ú!_ReleasingContextManager.__exit__  s   € ð 	�	‰	×ÑÕr    rŒ   r-   )r/   r0   r1   r2   r3   r
   r   r�   r   ÚBaseExceptionÚtypesÚTracebackTyper˜   r4   r5   r    r   r‰   r‰     sZ   † ñð˜Cð  Dô ôðà1ðð ˜-Ñ(ðð ˜×,Ñ,Ñ-ð	ð
 
÷r    r‰   c                   ó$  ^ • \ rS rSrSrSS\SS4U 4S jjjrS\4U 4S jjrSS jr	 SS	\
\\\R                  4      S\\   4S
 jjrSS jrSSS\
\   S\
\R*                     SS4S jrSS jrSSS\
\   S\
\R*                     SS4S jrSrU =r$ )r   i  a®
  A lock that can be acquired a fixed number of times before blocking.

A Semaphore manages a counter representing the number of `.release` calls
minus the number of `.acquire` calls, plus an initial value. The `.acquire`
method blocks if necessary until it can return without making the counter
negative.

Semaphores limit access to a shared resource. To allow access for two
workers at a time:

.. testsetup:: semaphore

   from collections import deque

   from tornado import gen
   from tornado.ioloop import IOLoop
   from tornado.concurrent import Future

   inited = False

   async def simulator(futures):
       for f in futures:
           # simulate the asynchronous passage of time
           await gen.sleep(0)
           await gen.sleep(0)
           f.set_result(None)

   def use_some_resource():
       global inited
       global futures_q
       if not inited:
           inited = True
           # Ensure reliable doctest output: resolve Futures one at a time.
           futures_q = deque([Future() for _ in range(3)])
           IOLoop.current().add_callback(simulator, list(futures_q))

       return futures_q.popleft()

.. testcode:: semaphore

    import asyncio
    from tornado import gen
    from tornado.locks import Semaphore

    sem = Semaphore(2)

    async def worker(worker_id):
        await sem.acquire()
        try:
            print("Worker %d is working" % worker_id)
            await use_some_resource()
        finally:
            print("Worker %d is done" % worker_id)
            sem.release()

    async def runner():
        # Join all workers.
        await gen.multi([worker(i) for i in range(3)])

    asyncio.run(runner())

.. testoutput:: semaphore

    Worker 0 is working
    Worker 1 is working
    Worker 0 is done
    Worker 2 is working
    Worker 1 is done
    Worker 2 is done

Workers 0 and 1 are allowed to run concurrently, but worker 2 waits until
the semaphore has been released once, by worker 0.

The semaphore can be used as an async context manager::

    async def worker(worker_id):
        async with sem:
            print("Worker %d is working" % worker_id)
            await use_some_resource()

        # Now the semaphore has been released.
        print("Worker %d is done" % worker_id)

For compatibility with older versions of Python, `.acquire` is a
context manager, so ``worker`` could also be written as::

    @gen.coroutine
    def worker(worker_id):
        with (yield sem.acquire()):
            print("Worker %d is working" % worker_id)
            yield use_some_resource()

        # Now the semaphore has been released.
        print("Worker %d is done" % worker_id)

.. versionchanged:: 4.3
   Added ``async with`` support in Python 3.5.

Úvaluer.   Nc                 óP   >• [         TU ]  5         US:  a  [        S5      eXl        g )Nr   z$semaphore initial value must be >= 0)Úsuperr   Ú
ValueErrorrl   ©r   rž   r;   s     €r   r   ÚSemaphore.__init__  s&   ø€ Ü‰ÑÔØ�1‹9ÜÐCÓDÐDà�r    c                 ó  >• [         TU ]  5       nU R                  S:X  a  SOSR                  U R                  5      nU R                  (       a%  SR                  U[        U R                  5      5      nSR                  USS U5      $ )Nr   Úlockedzunlocked,value:{0}z{0},waiters:{1}z<{0} [{1}]>r"   éÿÿÿÿ)r    r>   rl   Úformatr   r<   )r   ÚresÚextrar;   s      €r   r>   ÚSemaphore.__repr__†  sr   ø€ Ü‰gÑÓ ˆàŸ™ qÓ(‰HÐ.B×.IÑ.IÈ$Ï+É+Ó.Vð 	ð �=�=Ø%×,Ñ,¨U´C¸¿¹Ó4FÓGˆEØ×#Ñ# C¨¨" I¨uÓ5Ð5r    c                 ó6  • U =R                   S-  sl         U R                  (       as  U R                  R                  5       nUR                  5       (       d0  U =R                   S-  sl         UR	                  [        U 5      5        gU R                  (       a  Mr  gg)ú*Increment the counter and wake one waiter.r"   N)rl   r   r[   r&   rx   r‰   rD   s     r   r—   ÚSemaphore.release�  sf   € à�Š�qÑ�Ø�m�mØ—]‘]×*Ñ*Ó,ˆFØ—;‘;—=‘=Ø—’˜qÑ •ð ×!Ñ!Ô":¸4Ó"@ÔAØð �m�m‹mr    r@   c                 ó„  ^ ^^^• [        5       mT R                  S:”  a1  T =R                  S-  sl        TR                  [        T 5      5        T$ T R                  R                  T5        U(       aN  SU U4S jjn[        R                  R                  5       mTR                  X5      mTR                  UU4S j5        T$ )zŸDecrement the counter. Returns an awaitable.

Block if the counter is zero and wait for a `.release`. The awaitable
raises `.TimeoutError` after the deadline.
r   r"   c                  ó˜   >• TR                  5       (       d$  TR                  [        R                  " 5       5        T R	                  5         g r%   )r&   Úset_exceptionr   ÚTimeoutErrorr+   rD   s   €€r   rF   Ú%Semaphore.acquire.<locals>.on_timeout°  s1   ø€ Ø!Ÿ;™;Ÿ=™=Ø×,Ñ,¬S×-=Ò-=Ó-?Ô@Ø×)Ñ)Õ+r    c                 ó&   >• TR                  T5      $ r%   rI   rK   s    €€r   rO   Ú#Semaphore.acquire.<locals>.<lambda>¸  s   ø€ ˜g×4Ñ4°^ÔDr    r-   )r   rl   rx   r‰   r   rQ   r   rR   rS   rT   rU   rV   s   `  @@@r   ÚacquireÚSemaphore.acquire   s�   û€ ô “ˆØ�;‰;˜‹?Ø�KŠK˜1Ñ�KØ×ÑÔ6°tÓ<Ô=ð ˆð �M‰M× Ñ  Ô(Þ÷,ð ,ô
 !Ÿ-™-×/Ñ/Ó1�Ø!(×!4Ñ!4°WÓ!I�Ø×(Ñ(ÝDôð ˆr    c                 ó   • [        S5      e)Nz0Use 'async with' instead of 'with' for Semaphore©ÚRuntimeErrorr   s    r   r�   ÚSemaphore.__enter__¼  s   € ÜÐMÓNÐNr    Útypr“   Ú	tracebackc                 ó$   • U R                  5         g r%   ©r�   )r   r»   rž   r¼   s       r   r˜   ÚSemaphore.__exit__¿  ó   € ð 	�‰Õr    c              ƒ   ó@   #   • U R                  5       I S h  v•N   g  N7fr%   ©rµ   r   s    r   Ú
__aenter__ÚSemaphore.__aenter__Ç  ó   é € Ø�l‰l‹n×Óùó   ‚–—Útbc              ƒ   ó,   #   • U R                  5         g 7fr%   ©r—   ©r   r»   rž   rÇ   s       r   Ú	__aexit__ÚSemaphore.__aexit__Ê  ó   é € ð 	�‰�ùó   ‚ru   rb   r-   r%   )r/   r0   r1   r2   r3   rh   r   rc   r>   r—   r   r   rd   re   rf   r   r‰   rµ   r�   rš   r›   rœ   r˜   rÃ   rË   r4   Ú__classcell__©r;   s   @r   r   r     sð   ø† ñbñH˜cð ¨$÷ ð ð6˜#÷ 6ôð$ EIñØ  e¨X×-?Ñ-?Ð&?Ñ @ÑAðà	Ð+Ñ	,õô8Oðà,ðð ˜Ñ&ðð ˜E×/Ñ/Ñ0ð	ð
 
ôôðà,ðð ˜Ñ&ðð �U×(Ñ(Ñ)ð	ð
 
÷ò r    r   c                   óL   ^ • \ rS rSrSrS	S\SS4U 4S jjjrS
U 4S jjrSrU =r	$ )r   iÓ  a&  A semaphore that prevents release() being called too many times.

If `.release` would increment the semaphore's value past the initial
value, it raises `ValueError`. Semaphores are mostly used to guard
resources with limited capacity, so a semaphore released too many times
is a sign of a bug.
rž   r.   Nc                 ó,   >• [         TU ]  US9  Xl        g )N©rž   )r    r   Ú_initial_valuer¢   s     €r   r   ÚBoundedSemaphore.__init__Ü  s   ø€ Ü‰Ñ˜uÐÑ%Ø#Õr    c                 ól   >• U R                   U R                  :¼  a  [        S5      e[        TU ]  5         g)r¬   z!Semaphore released too many timesN)rl   rÔ   r¡   r    r—   )r   r;   s    €r   r—   ÚBoundedSemaphore.releaseà  s+   ø€ à�;‰;˜$×-Ñ-Ó-ÜÐ@ÓAÐAÜ‰‰Õr    )rÔ   rb   r-   )
r/   r0   r1   r2   r3   rh   r   r—   r4   rÏ   rÐ   s   @r   r   r   Ó  s*   ø† ññ$˜cð $¨$÷ $ð $÷õ r    r   c                   ó  • \ rS rSrSrSS jrS\4S jr SS\\	\
\R                  4      S\\   4S jjrSS	 jrSS
 jrSSS\\   S\\R(                     SS4S jrSS jrSSS\\   S\\R(                     SS4S jrSrg)r   iç  ag  A lock for coroutines.

A Lock begins unlocked, and `acquire` locks it immediately. While it is
locked, a coroutine that yields `acquire` waits until another coroutine
calls `release`.

Releasing an unlocked lock raises `RuntimeError`.

A Lock can be used as an async context manager with the ``async
with`` statement:

>>> from tornado import locks
>>> lock = locks.Lock()
>>>
>>> async def f():
...    async with lock:
...        # Do something holding the lock.
...        pass
...
...    # Now the lock is released.

For compatibility with older versions of Python, the `.acquire`
method asynchronously returns a regular context manager:

>>> async def f2():
...    with (yield lock.acquire()):
...        # Do something holding the lock.
...        pass
...
...    # Now the lock is released.

.. versionchanged:: 4.3
   Added ``async with`` support in Python 3.5.

r.   Nc                 ó    • [        SS9U l        g )Nr"   rÓ   )r   Ú_blockr   s    r   r   ÚLock.__init__  s   € Ü&¨QÑ/ˆ�r    c                 óT   • SU R                   R                  < SU R                  < S3$ )Nr9   z _block=r:   )r;   r/   rÚ   r   s    r   r>   ÚLock.__repr__  s   � Ø#'§>¡>×#:Ô#:¸D¿K¼KÐHÐHr    r@   c                 ó8   • U R                   R                  U5      $ )zxAttempt to lock. Returns an awaitable.

Returns an awaitable, which raises `tornado.util.TimeoutError` after a
timeout.
)rÚ   rµ   )r   r@   s     r   rµ   ÚLock.acquire  s   € ð �{‰{×"Ñ" 7Ó+Ð+r    c                 ól   •  U R                   R                  5         g! [         a    [        S5      ef = f)zrUnlock.

The first coroutine in line waiting for `acquire` gets the lock.

If not locked, raise a `RuntimeError`.
zrelease unlocked lockN)rÚ   r—   r¡   r¹   r   s    r   r—   ÚLock.release  s2   € ð	8Ø�K‰K×ÑÕ!øÜó 	8ÜÐ6Ó7Ð7ð	8ús   ‚ �3c                 ó   • [        S5      e)Nz+Use `async with` instead of `with` for Lockr¸   r   s    r   r�   ÚLock.__enter__(  s   € ÜÐHÓIÐIr    r»   r“   rž   rÇ   c                 ó$   • U R                  5         g r%   r¾   rÊ   s       r   r˜   ÚLock.__exit__+  rÀ   r    c              ƒ   ó@   #   • U R                  5       I S h  v•N   g  N7fr%   rÂ   r   s    r   rÃ   ÚLock.__aenter__3  rÅ   rÆ   c              ƒ   ó,   #   • U R                  5         g 7fr%   rÉ   rÊ   s       r   rË   ÚLock.__aexit__6  rÍ   rÎ   )rÚ   r-   r%   )r/   r0   r1   r2   r3   r   rc   r>   r   r   rd   re   rf   r   r‰   rµ   r—   r�   rš   r›   rœ   r˜   rÃ   rË   r4   r5   r    r   r   r   ç  sØ   † ñ"ôH0ðI˜#ô Ið EIñ,Ø  e¨X×-?Ñ-?Ð&?Ñ @ÑAð,à	Ð+Ñ	,õ,ô
8ôJðà,ðð ˜Ñ&ðð �U×(Ñ(Ñ)ð	ð
 
ôôðà,ðð ˜Ñ&ðð �U×(Ñ(Ñ)ð	ð
 
÷r    r   )r   re   r›   Útornador   r   Útornado.concurrentr   r   Útypingr   r   r	   r
   r   ÚTYPE_CHECKINGr   r   Ú__all__Úobjectr   r   r   r‰   r   r   r   r5   r    r   Ú<module>rð      s“   ðó Û Û ç ß Iç 8Õ 8Û à	××ß!â
I€ôX˜vô Xô,f(Ð(ô f(ôRaˆFô aôH˜vô ô0vÐ(ô vôr�yô ô(Uˆ6õ Ur    