Ë
    êmxi-’  ã                   ó’  — d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZmZ ddlZddlmZmZmZmZm Z m!Z!m"Z"m#Z# ejH                  rddlm%Z%m&Z&m'Z'm(Z( dd	l)m*Z* ne+Z* G d
„ de*«      Z, e!d«      Z- e!de,¬«      Z. G d„ de«      Z/ G d„ d«      Z0 G d„ d«      Z1y)a©  An I/O event loop for non-blocking sockets.

In Tornado 6.0, `.IOLoop` is a wrapper around the `asyncio` event loop, with a
slightly different interface. The `.IOLoop` interface is now provided primarily
for backwards compatibility; new code should generally use the `asyncio` event
loop interface directly. The `IOLoop.current` class method provides the
`IOLoop` instance corresponding to the running `asyncio` event loop.

é    N)Úisawaitable)ÚFutureÚ	is_futureÚchain_futureÚfuture_set_exc_infoÚfuture_add_done_callback)Úapp_log)ÚConfigurableÚTimeoutErrorÚimport_object)ÚUnionÚAnyÚTypeÚOptionalÚCallableÚTypeVarÚTupleÚ	Awaitable)ÚDictÚListÚSetÚ	TypedDict)ÚProtocolc                   ó    — e Zd Zdefd„Zdd„Zy)Ú_SelectableÚreturnc                  ó   — y ©N© ©Úselfs    úE/home/htdocs/ttos/venv/lib/python3.12/site-packages/tornado/ioloop.pyÚfilenoz_Selectable.fileno=   ó   € Øó    Nc                  ó   — y r   r   r    s    r"   Úclosez_Selectable.close@   r$   r%   ©r   N)Ú__name__Ú
__module__Ú__qualname__Úintr#   r'   r   r%   r"   r   r   <   s   „ ð˜ó ôr%   r   Ú_TÚ_S)Úboundc            
       óà  ‡ — e Zd ZdZdZdZdZdZ e«       Z	 e
«       Zeddded	d
fˆ fd„«       ZedHd„«       ZdId„ZedId„«       Zej(                  edHd„«       «       Zej(                  edJded	ed    fd„«       «       ZedJded	ed    fd„«       ZdId„ZdId„ZedId„«       ZedId„«       ZdId„Zed	ee   fd„«       Zed	ee   fd„«       Z dJded	d
fd„Z!dKded	d
fd„Z"ej(                  de#de$e#e#gd
f   d e#d	d
fd!„«       Z%ej(                  de&de$e&e#gd
f   d e#d	d
fd"„«       Z%de'e#e(f   de$d#   d e#d	d
fd$„Z%de'e#e(f   d e#d	d
fd%„Z)de'e#e(f   d	d
fd&„Z*dId'„Z+dId(„Z,dLd)e$d*ee-   d	efd+„Z.d	e-fd,„Z/d-e'e-e0jb                  f   d.e$d/eded	e2f
d0„Z3d1e-d.e$d/eded	e2f
d2„Z4d3e-d.e$d/eded	e2f
d4„Z5d*e2d	d
fd5„Z6d.e$d/eded	d
fd6„Z7d.e$d/eded	d
fd7„Z8d.e$d/eded	d
fd8„Z9d9d:d.e$d;gd
f   d	d
fd<„Z:d=ee;jx                  jz                     d)e$d>e>f   d/ed	d;fd?„Z?d=e;jx                  jz                  d	d
fd@„Z@d.e$g ef   d	d
fdA„ZAd9eBd	d
fdB„ZCde'e#e(f   d	eDe#e'e#e(f   f   fdC„ZEde'e#e(f   d	d
fdD„ZFdEeBd	d
fdF„ZGdEeBd	d
fdG„ZHˆ xZIS )MÚIOLoopaÜ  An I/O event loop.

    As of Tornado 6.0, `IOLoop` is a wrapper around the `asyncio` event loop.

    Example usage for a simple TCP server:

    .. testcode::

        import asyncio
        import errno
        import functools
        import socket

        import tornado
        from tornado.iostream import IOStream

        async def handle_connection(connection, address):
            stream = IOStream(connection)
            message = await stream.read_until_close()
            print("message from client:", message.decode().strip())

        def connection_ready(sock, fd, events):
            while True:
                try:
                    connection, address = sock.accept()
                except BlockingIOError:
                    return
                connection.setblocking(0)
                io_loop = tornado.ioloop.IOLoop.current()
                io_loop.spawn_callback(handle_connection, connection, address)

        async def main():
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.setblocking(0)
            sock.bind(("", 8888))
            sock.listen(128)

            io_loop = tornado.ioloop.IOLoop.current()
            callback = functools.partial(connection_ready, sock)
            io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
            await asyncio.Event().wait()

        if __name__ == "__main__":
            asyncio.run(main())

    Most applications should not attempt to construct an `IOLoop` directly,
    and instead initialize the `asyncio` event loop and use `IOLoop.current()`.
    In some cases, such as in test frameworks when initializing an `IOLoop`
    to be run in a secondary thread, it may be appropriate to construct
    an `IOLoop` with ``IOLoop(make_current=False)``.

    In general, an `IOLoop` cannot survive a fork or be shared across processes
    in any way. When multiple processes are being used, each process should
    create its own `IOLoop`, which also implies that any objects which depend on
    the `IOLoop` (such as `.AsyncHTTPClient`) must also be created in the child
    processes. As a guideline, anything that starts processes (including the
    `tornado.process` and `multiprocessing` modules) should do so as early as
    possible, ideally the first thing the application does after loading its
    configuration, and *before* any calls to `.IOLoop.start` or `asyncio.run`.

    .. versionchanged:: 4.2
       Added the ``make_current`` keyword argument to the `IOLoop`
       constructor.

    .. versionchanged:: 5.0

       Uses the `asyncio` event loop by default. The ``IOLoop.configure`` method
       cannot be used on Python 3 except to redundantly specify the `asyncio`
       event loop.

    .. versionchanged:: 6.3
       ``make_current=True`` is now the default when creating an IOLoop -
       previously the default was to make the event loop current if there wasn't
       already a current one.
    r   é   é   é   Úimplz$Union[None, str, Type[Configurable]]Úkwargsr   Nc                 ó¶   •— ddl m} t        |t        «      rt	        |«      }t        |t
        «      rt        ||«      st        d«      ‚t        ‰| �$  |fi |¤Ž y )Nr   )ÚBaseAsyncIOLoopz5only AsyncIOLoop is allowed when asyncio is available)
Útornado.platform.asyncior8   Ú
isinstanceÚstrr   ÚtypeÚ
issubclassÚRuntimeErrorÚsuperÚ	configure)Úclsr5   r6   r8   Ú	__class__s       €r"   r@   zIOLoop.configure«   sM   ø€ õ 	=ä�dœCÔ Ü  Ó&ˆDÜ�dœDÔ!¬*°T¸?Ô*KÜÐVÓWÐWÜ‰Ñ˜$Ñ) &Ó)r%   c                  ó*   — t         j                  «       S )aK  Deprecated alias for `IOLoop.current()`.

        .. versionchanged:: 5.0

           Previously, this method returned a global singleton
           `IOLoop`, in contrast with the per-thread `IOLoop` returned
           by `current()`. In nearly all cases the two were the same
           (when they differed, it was generally used from non-Tornado
           threads to communicate back to the main thread's `IOLoop`).
           This distinction is not present in `asyncio`, so in order
           to facilitate integration with that package `instance()`
           was changed to be an alias to `current()`. Applications
           using the cross-thread communications aspect of
           `instance()` should instead set their own global variable
           to point to the `IOLoop` they want to use.

        .. deprecated:: 5.0
        )r1   Úcurrentr   r%   r"   ÚinstancezIOLoop.instance·   s   € ô( �~‰~ÓÐr%   c                 ó$   — | j                  «        y)a`  Deprecated alias for `make_current()`.

        .. versionchanged:: 5.0

           Previously, this method would set this `IOLoop` as the
           global singleton used by `IOLoop.instance()`. Now that
           `instance()` is an alias for `current()`, `install()`
           is an alias for `make_current()`.

        .. deprecated:: 5.0
        N)Úmake_currentr    s    r"   ÚinstallzIOLoop.installÍ   s   € ð 	×ÑÕr%   c                  ó,   — t         j                  «        y)ak  Deprecated alias for `clear_current()`.

        .. versionchanged:: 5.0

           Previously, this method would clear the `IOLoop` used as
           the global singleton by `IOLoop.instance()`. Now that
           `instance()` is an alias for `current()`,
           `clear_instance()` is an alias for `clear_current()`.

        .. deprecated:: 5.0

        N)r1   Úclear_currentr   r%   r"   Úclear_instancezIOLoop.clear_instanceÛ   s   € ô 	×ÑÕr%   c                   ó   — y r   r   r   r%   r"   rD   zIOLoop.currentë   ó   € ð 	r%   rE   c                  ó   — y r   r   ©rE   s    r"   rD   zIOLoop.currentð   rM   r%   c                 ó  — 	 t        j                  «       }	 t
        j                  |   S # t        $ r0 | sY yt        j                  «       }t        j                  |«       Y ŒLw xY w# t        $ r | rddlm	}  |«       }Y |S d}Y |S w xY w)aC  Returns the current thread's `IOLoop`.

        If an `IOLoop` is currently running or has been marked as
        current by `make_current`, returns that instance.  If there is
        no current `IOLoop` and ``instance`` is true, creates one.

        .. versionchanged:: 4.1
           Added ``instance`` argument to control the fallback to
           `IOLoop.instance()`.
        .. versionchanged:: 5.0
           On Python 3, control of the current `IOLoop` is delegated
           to `asyncio`, with this and other methods as pass-through accessors.
           The ``instance`` argument now controls whether an `IOLoop`
           is created automatically when there is none, instead of
           whether we fall back to `IOLoop.instance()` (which is now
           an alias for this method). ``instance=False`` is deprecated,
           since even if we do not create an `IOLoop`, this method
           may initialize the asyncio loop.

        .. deprecated:: 6.2
           It is deprecated to call ``IOLoop.current()`` when no `asyncio`
           event loop is running.
        Nr   )ÚAsyncIOMainLoop)
ÚasyncioÚget_event_loopr>   Únew_event_loopÚset_event_loopr1   Ú_ioloop_for_asyncioÚKeyErrorr9   rQ   )rE   ÚlooprQ   rD   s       r"   rD   zIOLoop.currentõ   s�   € ð2	)Ü×)Ñ)Ó+ˆDð	Ü×-Ñ-¨dÑ3Ð3øô ò 	)ÙÙä×)Ñ)Ó+ˆDÜ×"Ñ" 4Ö(ð	)ûô ò 	ÙÝDá)Ó+‘ð ˆð ‘Øˆð	ús+   ‚* —A& ªA#·)A#Á"A#Á&BÂBÂBc                 ó\   — t        j                  dt        d¬«       | j                  «        y)aó  Makes this the `IOLoop` for the current thread.

        An `IOLoop` automatically becomes current for its thread
        when it is started, but it is sometimes useful to call
        `make_current` explicitly before starting the `IOLoop`,
        so that code run at startup time can find the right
        instance.

        .. versionchanged:: 4.1
           An `IOLoop` created while there is no current `IOLoop`
           will automatically become current.

        .. versionchanged:: 5.0
           This method also sets the current `asyncio` event loop.

        .. deprecated:: 6.2
           Setting and clearing the current event loop through Tornado is
           deprecated. Use ``asyncio.set_event_loop`` instead if you need this.
        z6make_current is deprecated; start the event loop firsté   ©Ú
stacklevelN)ÚwarningsÚwarnÚDeprecationWarningÚ_make_currentr    s    r"   rG   zIOLoop.make_current"  s'   € ô( 	�‰ØDÜØõ	
ð
 	×ÑÕr%   c                 ó   — t        «       ‚r   ©ÚNotImplementedErrorr    s    r"   r`   zIOLoop._make_current=  s   € ä!Ó#Ð#r%   c                  ód   — t        j                  dt        d¬«       t        j	                  «        y)zÿClears the `IOLoop` for the current thread.

        Intended primarily for use by test frameworks in between tests.

        .. versionchanged:: 5.0
           This method also clears the current `asyncio` event loop.
        .. deprecated:: 6.2
        zclear_current is deprecatedrZ   r[   N)r]   r^   r_   r1   Ú_clear_currentr   r%   r"   rJ   zIOLoop.clear_currentA  s'   € ô 	�‰Ø)ÜØõ	
ô
 	×ÑÕr%   c                  óV   — t         j                  d¬«      } | �| j                  «        y y )NFrO   )r1   rD   Ú_clear_current_hook)Úolds    r"   re   zIOLoop._clear_currentR  s(   € ä�n‰n eˆnÓ,ˆØˆ?Ø×#Ñ#Õ%ð r%   c                  ó   — y)z�Instance method called when an IOLoop ceases to be current.

        May be overridden by subclasses as a counterpart to make_current.
        Nr   r    s    r"   rg   zIOLoop._clear_current_hookX  s   € ð
 	r%   c                 ó   — t         S r   )r1   )rA   s    r"   Úconfigurable_basezIOLoop.configurable_base_  s   € äˆr%   c                 ó   — ddl m} |S )Nr   )ÚAsyncIOLoop)r9   rm   )rA   rm   s     r"   Úconfigurable_defaultzIOLoop.configurable_defaultc  s   € å8àÐr%   rG   c                 ó*   — |r| j                  «        y y r   )r`   )r!   rG   s     r"   Ú
initializezIOLoop.initializei  s   € ÙØ×ÑÕ ð r%   Úall_fdsc                 ó   — t        «       ‚)a¨  Closes the `IOLoop`, freeing any resources used.

        If ``all_fds`` is true, all file descriptors registered on the
        IOLoop will be closed (not just the ones created by the
        `IOLoop` itself).

        Many applications will only use a single `IOLoop` that runs for the
        entire lifetime of the process.  In that case closing the `IOLoop`
        is not necessary since everything will be cleaned up when the
        process exits.  `IOLoop.close` is provided mainly for scenarios
        such as unit tests, which create and destroy a large number of
        ``IOLoops``.

        An `IOLoop` must be completely stopped before it can be closed.  This
        means that `IOLoop.stop()` must be called *and* `IOLoop.start()` must
        be allowed to return before attempting to call `IOLoop.close()`.
        Therefore the call to `close` will usually appear just after
        the call to `start` rather than near the call to `stop`.

        .. versionchanged:: 3.1
           If the `IOLoop` implementation supports non-integer objects
           for "file descriptors", those objects will have their
           ``close`` method when ``all_fds`` is true.
        rb   )r!   rq   s     r"   r'   zIOLoop.closem  s   € ô2 "Ó#Ð#r%   ÚfdÚhandlerÚeventsc                  ó   — y r   r   ©r!   rs   rt   ru   s       r"   Úadd_handlerzIOLoop.add_handlerˆ  ó   € ð 	r%   c                  ó   — y r   r   rw   s       r"   rx   zIOLoop.add_handlerŽ  ry   r%   ).Nc                 ó   — t        «       ‚)a+  Registers the given handler to receive the given events for ``fd``.

        The ``fd`` argument may either be an integer file descriptor or
        a file-like object with a ``fileno()`` and ``close()`` method.

        The ``events`` argument is a bitwise or of the constants
        ``IOLoop.READ``, ``IOLoop.WRITE``, and ``IOLoop.ERROR``.

        When an event occurs, ``handler(fd, events)`` will be run.

        .. versionchanged:: 4.0
           Added the ability to pass file-like objects in addition to
           raw file descriptors.
        rb   rw   s       r"   rx   zIOLoop.add_handler”  s   € ô" "Ó#Ð#r%   c                 ó   — t        «       ‚)z¹Changes the events we listen for ``fd``.

        .. versionchanged:: 4.0
           Added the ability to pass file-like objects in addition to
           raw file descriptors.
        rb   )r!   rs   ru   s      r"   Úupdate_handlerzIOLoop.update_handler§  ó   € ô "Ó#Ð#r%   c                 ó   — t        «       ‚)zµStop listening for events on ``fd``.

        .. versionchanged:: 4.0
           Added the ability to pass file-like objects in addition to
           raw file descriptors.
        rb   ©r!   rs   s     r"   Úremove_handlerzIOLoop.remove_handler°  r~   r%   c                 ó   — t        «       ‚)z¶Starts the I/O loop.

        The loop will run until one of the callbacks calls `stop()`, which
        will make the loop stop after the current event iteration completes.
        rb   r    s    r"   ÚstartzIOLoop.start¹  s   € ô "Ó#Ð#r%   c                 ó   — t        «       ‚)a‘  Stop the I/O loop.

        If the event loop is not currently running, the next call to `start()`
        will return immediately.

        Note that even after `stop` has been called, the `IOLoop` is not
        completely stopped until `IOLoop.start` has also returned.
        Some work that was scheduled before the call to `stop` may still
        be run before the `IOLoop` shuts down.
        rb   r    s    r"   ÚstopzIOLoop.stopÁ  s   € ô "Ó#Ð#r%   ÚfuncÚtimeoutc                 óú  ‡ ‡‡— t         j                  rt        dt        t           t
        dœ«      }dddœŠdˆˆˆ fd„}‰ j                  |«       |�*dˆˆ fd„}‰ j                  ‰ j                  «       |z   |«      }‰ j                  «        |�‰ j                  «       ‰d   €J ‚‰d   j                  «       s‰d   j                  «       s‰d   rt        d	|z  «      ‚t        d
«      ‚‰d   j                  «       S )a¯  Starts the `IOLoop`, runs the given function, and stops the loop.

        The function must return either an awaitable object or
        ``None``. If the function returns an awaitable object, the
        `IOLoop` will run until the awaitable is resolved (and
        `run_sync()` will return the awaitable's result). If it raises
        an exception, the `IOLoop` will stop and the exception will be
        re-raised to the caller.

        The keyword-only argument ``timeout`` may be used to set
        a maximum duration for the function.  If the timeout expires,
        a `asyncio.TimeoutError` is raised.

        This method is useful to allow asynchronous calls in a
        ``main()`` function::

            async def main():
                # do stuff...

            if __name__ == '__main__':
                IOLoop.current().run_sync(main)

        .. versionchanged:: 4.3
           Returning a non-``None``, non-awaitable value is now an error.

        .. versionchanged:: 5.0
           If a timeout occurs, the ``func`` coroutine will be cancelled.

        .. versionchanged:: 6.2
           ``tornado.util.TimeoutError`` is now an alias to ``asyncio.TimeoutError``.
        Ú
FutureCell)ÚfutureÚtimeout_calledNFc                  óP  •— 	  ‰«       } | �ddl m}  || «      } t        | «      r| ‰d<   n!t        «       }|‰d<   |j	                  | «       	 ‰d   €J ‚‰j                  ‰d   ˆfd„«       y # t
        $ r0 t        «       }|‰d<   t        |t        j                  «       «       Y ŒXw xY w)Nr   )Úconvert_yieldedrŠ   c                 ó$   •— ‰j                  «       S r   )r…   )rŠ   r!   s    €r"   ú<lambda>z.IOLoop.run_sync.<locals>.run.<locals>.<lambda>  s   ø€ À$Ç)Á)Ã+€ r%   )
Útornado.genr�   r   r   Ú
set_resultÚ	Exceptionr   ÚsysÚexc_infoÚ
add_future)Úresultr�   Úfutr†   Úfuture_cellr!   s      €€€r"   ÚrunzIOLoop.run_sync.<locals>.runô  sª   ø€ ð+Ù›�ØÐ%Ý;á,¨VÓ4�Fô ˜VÔ$Ø,2�K Ò)ä ›(�CØ,/�K Ñ)Ø—N‘N 6Õ*Ø˜xÑ(Ð4Ð4Ð4Ø�O‰O˜K¨Ñ1Ó3MÕNøô ò 9Ü“h�Ø(+�˜HÑ%Ü# C¬¯©«Ö8ð9ús   ƒA, Á,6B%Â$B%c                  óf   •— d‰ d<   ‰ d   €J ‚‰ d   j                  «       s‰j                  «        y y )NTr‹   rŠ   )Úcancelr…   )r˜   r!   s   €€r"   Útimeout_callbackz)IOLoop.run_sync.<locals>.timeout_callback  s@   ø€ à04�Ð,Ñ-ð
 # 8Ñ,Ð8Ð8Ð8Ø" 8Ñ,×3Ñ3Ô5Ø—I‘I•Kð 6r%   rŠ   r‹   z$Operation timed out after %s secondsz+Event loop stopped before Future completed.r(   )ÚtypingÚTYPE_CHECKINGr   r   r   ÚboolÚadd_callbackÚadd_timeoutÚtimerƒ   Úremove_timeoutÚ	cancelledÚdoner   r>   r–   )r!   r†   r‡   r‰   r™   rœ   Útimeout_handler˜   s   ``     @r"   Úrun_synczIOLoop.run_syncÎ  s   ú€ ô@ ×ÒÜ"Ø¬´&Ñ)9ÌTÑRóˆJð "&¸Ñ?ˆ÷	Oð* 	×Ñ˜#ÔØÐö	 ð "×-Ñ-¨d¯i©i«k¸GÑ.CÐEUÓVˆNØ�
‰
ŒØÐØ×Ñ Ô/Ø˜8Ñ$Ð0Ð0Ð0Ø�xÑ ×*Ñ*Ô,°KÀÑ4I×4NÑ4NÔ4PØÐ+Ò,Ü"Ð#IÈGÑ#SÓTÐTô #Ð#PÓQÐQØ˜8Ñ$×+Ñ+Ó-Ð-r%   c                 ó*   — t        j                   «       S )a‡  Returns the current time according to the `IOLoop`'s clock.

        The return value is a floating-point number relative to an
        unspecified time in the past.

        Historically, the IOLoop could be customized to use e.g.
        `time.monotonic` instead of `time.time`, but this is not
        currently supported and so this method is equivalent to
        `time.time`.

        )r¢   r    s    r"   r¢   zIOLoop.time%  s   € ô �y‰y‹{Ðr%   ÚdeadlineÚcallbackÚargsc                 ó   — t        |t        j                  «      r | j                  ||g|¢­i |¤ŽS t        |t        j
                  «      r6 | j                  | j                  «       |j                  «       z   |g|¢­i |¤ŽS t        d|z  «      ‚)a   Runs the ``callback`` at the time ``deadline`` from the I/O loop.

        Returns an opaque handle that may be passed to
        `remove_timeout` to cancel.

        ``deadline`` may be a number denoting a time (on the same
        scale as `IOLoop.time`, normally `time.time`), or a
        `datetime.timedelta` object for a deadline relative to the
        current time.  Since Tornado 4.0, `call_later` is a more
        convenient alternative for the relative case since it does not
        require a timedelta object.

        Note that it is not safe to call `add_timeout` from other threads.
        Instead, you must use `add_callback` to transfer control to the
        `IOLoop`'s thread, and then call `add_timeout` from there.

        Subclasses of IOLoop must implement either `add_timeout` or
        `call_at`; the default implementations of each will call
        the other.  `call_at` is usually easier to implement, but
        subclasses that wish to maintain compatibility with Tornado
        versions prior to 4.0 must use `add_timeout` instead.

        .. versionchanged:: 4.0
           Now passes through ``*args`` and ``**kwargs`` to the callback.
        úUnsupported deadline %r)	r:   ÚnumbersÚRealÚcall_atÚdatetimeÚ	timedeltar¢   Útotal_secondsÚ	TypeError)r!   r©   rª   r«   r6   s        r"   r¡   zIOLoop.add_timeout3  s�   € ô@ �h¤§¡Ô-Ø�4—<‘< ¨(ÐD°TÒD¸VÑDÐDÜ˜¤(×"4Ñ"4Ô5Ø�4—<‘<Ø—	‘	“˜h×4Ñ4Ó6Ñ6¸ðØCGòØKQñð ô Ð5¸Ñ@ÓAÐAr%   Údelayc                 óR   —  | j                   | j                  «       |z   |g|¢­i |¤ŽS )a‚  Runs the ``callback`` after ``delay`` seconds have passed.

        Returns an opaque handle that may be passed to `remove_timeout`
        to cancel.  Note that unlike the `asyncio` method of the same
        name, the returned object does not have a ``cancel()`` method.

        See `add_timeout` for comments on thread-safety and subclassing.

        .. versionadded:: 4.0
        )r°   r¢   )r!   rµ   rª   r«   r6   s        r"   Ú
call_laterzIOLoop.call_later\  s,   € ð ˆt�|‰|˜DŸI™I›K¨%Ñ/°ÐK¸DÒKÀFÑKÐKr%   Úwhenc                 ó0   —  | j                   ||g|¢­i |¤ŽS )aæ  Runs the ``callback`` at the absolute time designated by ``when``.

        ``when`` must be a number using the same reference point as
        `IOLoop.time`.

        Returns an opaque handle that may be passed to `remove_timeout`
        to cancel.  Note that unlike the `asyncio` method of the same
        name, the returned object does not have a ``cancel()`` method.

        See `add_timeout` for comments on thread-safety and subclassing.

        .. versionadded:: 4.0
        )r¡   )r!   r¸   rª   r«   r6   s        r"   r°   zIOLoop.call_atk  s#   € ð   ˆt×Ñ  hÐ@°Ò@¸Ñ@Ð@r%   c                 ó   — t        «       ‚)zÃCancels a pending timeout.

        The argument is a handle as returned by `add_timeout`.  It is
        safe to call `remove_timeout` even if the callback has already
        been run.
        rb   )r!   r‡   s     r"   r£   zIOLoop.remove_timeout}  r~   r%   c                 ó   — t        «       ‚)aÙ  Calls the given callback on the next I/O loop iteration.

        It is safe to call this method from any thread at any time,
        except from a signal handler.  Note that this is the **only**
        method in `IOLoop` that makes this thread-safety guarantee; all
        other interaction with the `IOLoop` must be done from that
        `IOLoop`'s thread.  `add_callback()` may be used to transfer
        control from other threads to the `IOLoop`'s thread.
        rb   ©r!   rª   r«   r6   s       r"   r    zIOLoop.add_callback†  s   € ô "Ó#Ð#r%   c                 ó   — t        «       ‚)aˆ  Calls the given callback on the next I/O loop iteration.

        Intended to be afe for use from a Python signal handler; should not be
        used otherwise.

        .. deprecated:: 6.4
           Use ``asyncio.AbstractEventLoop.add_signal_handler`` instead.
           This method is suspected to have been broken since Tornado 5.0 and
           will be removed in version 7.0.
        rb   r¼   s       r"   Úadd_callback_from_signalzIOLoop.add_callback_from_signal’  s   € ô "Ó#Ð#r%   c                 ó0   —  | j                   |g|¢­i |¤Ž y)z§Calls the given callback on the next IOLoop iteration.

        As of Tornado 6.0, this method is equivalent to `add_callback`.

        .. versionadded:: 4.0
        N©r    r¼   s       r"   Úspawn_callbackzIOLoop.spawn_callback¡  s   € ð 	ˆ×Ñ˜(Ð4 TÒ4¨VÓ4r%   rŠ   z0Union[Future[_T], concurrent.futures.Future[_T]]z
Future[_T]c                 óŽ   ‡ ‡— t        |t        «      r|j                  ˆˆ fd„«       yt        |«      sJ ‚t	        |ˆˆ fd„«       y)aA  Schedules a callback on the ``IOLoop`` when the given
        `.Future` is finished.

        The callback is invoked with one argument, the
        `.Future`.

        This method only accepts `.Future` objects and not other
        awaitables (unlike most of Tornado where the two are
        interchangeable).
        c                 óN   •— ‰j                  t        j                  ‰| «      «      S r   )Ú_run_callbackÚ	functoolsÚpartial©Úfrª   r!   s    €€r"   r�   z#IOLoop.add_future.<locals>.<lambda>Ã  s   ø€ ˜$×,Ñ,¬Y×->Ñ->¸xÈÓ-KÓL€ r%   c                 ó(   •— ‰j                  ‰| «      S r   rÀ   rÇ   s    €€r"   r�   z#IOLoop.add_future.<locals>.<lambda>É  s   ø€ °t×7HÑ7HÈÐSTÓ7U€ r%   N)r:   r   Úadd_done_callbackr   r   )r!   rŠ   rª   s   ` `r"   r•   zIOLoop.add_futureª  s?   ù€ ô �fœfÔ%ð ×$Ñ$ÜLõô ˜VÔ$Ð$Ð$ô % VÔ-UÕVr%   Úexecutor.c                 ó  ‡— |€Kt        | d«      s3ddlm} t        j                  j                   |«       dz  ¬«      | _        | j                  } |j                  |g|¢­Ž }t        «       Š| j                  |ˆfd„«       ‰S )z÷Runs a function in a ``concurrent.futures.Executor``. If
        ``executor`` is ``None``, the IO loop's default executor will be used.

        Use `functools.partial` to pass keyword arguments to ``func``.

        .. versionadded:: 5.0
        Ú	_executorr   )Ú	cpu_counté   )Úmax_workersc                 ó   •— t        | ‰«      S r   )r   )rÈ   Út_futures    €r"   r�   z(IOLoop.run_in_executor.<locals>.<lambda>ä  s   ø€ ¬L¸¸HÓ,E€ r%   )
ÚhasattrÚtornado.processrÎ   Ú
concurrentÚfuturesÚThreadPoolExecutorrÍ   Úsubmitr   r•   )r!   rË   r†   r«   rÎ   Úc_futurerÒ   s         @r"   Úrun_in_executorzIOLoop.run_in_executorË  s|   ø€ ð ÐÜ˜4 Ô-Ý5ä!+×!3Ñ!3×!FÑ!FÙ!*£¨q¡ð "Gó "�”ð —~‘~ˆHØ"�8—?‘? 4Ð/¨$Ò/ˆô “8ˆØ�‰˜Ó"EÔFØˆr%   c                 ó   — || _         y)zfSets the default executor to use with :meth:`run_in_executor`.

        .. versionadded:: 5.0
        N)rÍ   )r!   rË   s     r"   Úset_default_executorzIOLoop.set_default_executorç  s   € ð
 "ˆ�r%   c                 ó"  — 	  |«       }|�5ddl m} 	 |j                  |«      }| j                  || j                  «       yy# |j
                  $ r Y yw xY w# t        j                  $ r Y yt        $ r t        j                  d|d¬«       Y yw xY w)z€Runs a callback with error handling.

        .. versionchanged:: 6.0

           CancelledErrors are no longer logged.
        Nr   )ÚgenúException in callback %rT©r”   )ÚtornadorÞ   r�   r•   Ú_discard_future_resultÚBadYieldErrorrR   ÚCancelledErrorr’   r	   Úerror)r!   rª   ÚretrÞ   s       r"   rÄ   zIOLoop._run_callbackî  s˜   € ð	OÙ“*ˆCØˆÝ'ðFØ×-Ñ-¨cÓ2�Cð —O‘O C¨×)DÑ)DÕEð øð ×(Ñ(ò ñ ð	ûô ×%Ñ%ò 	ÙÜò 	OÜ�M‰MÐ4°hÈ×Nð	Oús9   ‚A ’A £A ÁAÁA ÁAÁA ÁBÁ+ BÂBc                 ó$   — |j                  «        y)z;Avoid unhandled-exception warnings from spawned coroutines.N)r–   )r!   rŠ   s     r"   râ   zIOLoop._discard_future_result  s   € à�‰�r%   c                 óN   — t        |t        «      r||fS |j                  «       |fS r   )r:   r,   r#   r€   s     r"   Úsplit_fdzIOLoop.split_fd  s'   € ô$ �bœ#ÔØ�r�6ˆMØ�y‰y‹{˜BˆÐr%   c                 ó�   — 	 t        |t        «      rt        j                  |«       y |j                  «        y # t        $ r Y y w xY wr   )r:   r,   Úosr'   ÚOSErrorr€   s     r"   Úclose_fdzIOLoop.close_fd&  s7   € ð	Ü˜"œcÔ"Ü—‘˜•à—‘•
øÜò 	Ùð	ús   ‚%9 ¨9 ¹	AÁArÈ   c                 ó:   — | j                   j                  |«       y r   )Ú_pending_tasksÚadd©r!   rÈ   s     r"   Ú_register_taskzIOLoop._register_task:  s   € Ø×Ñ×Ñ Õ"r%   c                 ó:   — | j                   j                  |«       y r   )rï   Údiscardrñ   s     r"   Ú_unregister_taskzIOLoop._unregister_task=  s   € Ø×Ñ×#Ñ# AÕ&r%   )r   r1   r(   )T)Fr   )Jr)   r*   r+   Ú__doc__ÚNONEÚREADÚWRITEÚERRORÚdictrV   Úsetrï   Úclassmethodr   r@   ÚstaticmethodrE   rH   rK   r�   ÚoverloadrD   rŸ   r   rG   r`   rJ   re   rg   r   r
   rk   rn   rp   r'   r,   r   rx   r.   r   r   r}   r�   rƒ   r…   Úfloatr§   r¢   r±   r²   Úobjectr¡   r·   r°   r£   r    r¾   rÁ   r•   rÕ   rÖ   ÚExecutorr-   rÚ   rÜ   rÄ   r   râ   r   ré   rí   rò   rõ   Ú__classcell__)rB   s   @r"   r1   r1   H   sE  ø„ ñKð\ €DØ€DØ€EØ€Eñ ›&Ðñ “U€Nàð	*Ø9ð	*ØEHð	*à	ô	*ó ð	*ð ò ó ð ó*ð òó ðð ‡_�_Øòó ó ðð ‡_�_Øñ˜$ð ¨(°8Ñ*<ò ó ó ðð ñ*˜$ð *¨(°8Ñ*<ò *ó ð*óXó6$ð ò ó ð ð  ò&ó ð&ó
ð ð $ |Ñ"4ò ó ðð ð T¨,Ñ%7ò ó ðñ
! tð !°tó !ñ$˜Tð $¨dó $ð6 ‡_�_ðØðØ (¨#¨s¨°TÐ)9Ñ :ðØDGðà	òó ðð
 ‡_�_ðØðØ'¨¨S¨	°4¨Ñ8ðØBEðà	òó ðð
$Ø˜˜[Ð(Ñ)ð$Ø4<¸YÑ4Gð$ØQTð$à	ó$ð&$  s¨KÐ'7Ñ!8ð $À#ð $È$ó $ð$  s¨KÐ'7Ñ!8ð $¸Tó $ó$ó$ñU.˜Xð U.°¸±ð U.È3ó U.ðn�eó ð'Bà˜˜x×1Ñ1Ð1Ñ2ð'Bð ð'Bð ð	'Bð
 ð'Bð 
ó'BðRLØðLØ&.ðLØ7:ðLØFIðLà	óLðAØðAØ%-ðAØ69ðAØEHðAà	óAð$$ fð $°ó $ð
$ Xð 
$°cð 
$ÀSð 
$ÈTó 
$ð$Ø ð$Ø),ð$Ø8;ð$à	ó$ð5 xð 5¸ð 5Àsð 5Ètó 5ðWàBðWð ˜L˜>¨4Ð/Ñ0ðWð 
ó	WðBà˜:×-Ñ-×6Ñ6Ñ7ðð �s˜B�wÑðð ð	ð
 
óð8"¨Z×-?Ñ-?×-HÑ-Hð "ÈTó "ðO h¨r°3¨wÑ&7ð O¸Dó Oð<¨Vð ¸ó ðØ˜˜[Ð(Ñ)ðà	ˆs�E˜#˜{Ð*Ñ+Ð+Ñ	,óð,˜5  kÐ!1Ñ2ð °tó ð(# ð #¨4ó #ð' &ð '¨T÷ 'r%   r1   c                   óZ   — e Zd ZdZg d¢Zdedeg df   deddfd„Zd	d de	fd
„Z
d	d de	fd„Zy)Ú_Timeoutz2An IOLoop timeout, a UNIX timestamp and a callback)r©   rª   Ú	tdeadliner©   rª   NÚio_loopr   c                 ó¨   — t        |t        j                  «      st        d|z  «      ‚|| _        || _        |t        |j                  «      f| _        y )Nr­   )	r:   r®   r¯   r´   r©   rª   ÚnextÚ_timeout_counterr  )r!   r©   rª   r  s       r"   Ú__init__z_Timeout.__init__G  sK   € ô ˜(¤G§L¡LÔ1ÜÐ5¸Ñ@ÓAÐAØ ˆŒØ ˆŒàÜ�×)Ñ)Ó*ð
ˆ�r%   Úotherc                 ó4   — | j                   |j                   k  S r   ©r  ©r!   r  s     r"   Ú__lt__z_Timeout.__lt__W  s   € Ø�~‰~ §¡Ñ/Ð/r%   c                 ó4   — | j                   |j                   k  S r   r  r  s     r"   Ú__le__z_Timeout.__le__Z  s   € Ø�~‰~ §¡Ñ0Ð0r%   )r)   r*   r+   rö   Ú	__slots__r   r   r1   r  rŸ   r  r  r   r%   r"   r  r  A  s`   „ Ù<ò 6€Ið

Øð

Ø)1°"°d°(Ñ);ð

ØFLð

à	ó

ð 0˜Jð 0¨4ó 0ð1˜Jð 1¨4ô 1r%   r  c            	       ó–   — e Zd ZdZ	 ddeg ee   f   deej                  e
f   de
ddfd„Zdd„Zdd	„Zdefd
„Zdd„Zdd„Zde
ddfd„Zy)ÚPeriodicCallbacka�  Schedules the given callback to be called periodically.

    The callback is called every ``callback_time`` milliseconds when
    ``callback_time`` is a float. Note that the timeout is given in
    milliseconds, while most other time-related functions in Tornado use
    seconds. ``callback_time`` may alternatively be given as a
    `datetime.timedelta` object.

    If ``jitter`` is specified, each callback time will be randomly selected
    within a window of ``jitter * callback_time`` milliseconds.
    Jitter can be used to reduce alignment of events with similar periods.
    A jitter of 0.1 means allowing a 10% variation in callback time.
    The window is centered on ``callback_time`` so the total number of calls
    within a given interval should not be significantly affected by adding
    jitter.

    If the callback runs for longer than ``callback_time`` milliseconds,
    subsequent invocations will be skipped to get back on schedule.

    `start` must be called after the `PeriodicCallback` is created.

    .. versionchanged:: 5.0
       The ``io_loop`` argument (deprecated since version 4.1) has been removed.

    .. versionchanged:: 5.1
       The ``jitter`` argument is added.

    .. versionchanged:: 6.2
       If the ``callback`` argument is a coroutine, and a callback runs for
       longer than ``callback_time``, subsequent invocations will be skipped.
       Previously this was only true for regular functions, not coroutines,
       which were "fire-and-forget" for `PeriodicCallback`.

       The ``callback_time`` argument now accepts `datetime.timedelta` objects,
       in addition to the previous numeric milliseconds.
    rª   Úcallback_timeÚjitterr   Nc                 óÜ   — || _         t        |t        j                  «      r|t        j                  d¬«      z  | _        n|dk  rt        d«      ‚|| _        || _        d| _        d | _        y )Nr2   )Úmillisecondsr   z4Periodic callback must have a positive callback_timeF)	rª   r:   r±   r²   r  Ú
ValueErrorr  Ú_runningÚ_timeout)r!   rª   r  r  s       r"   r  zPeriodicCallback.__init__„  se   € ð !ˆŒÜ�m¤X×%7Ñ%7Ô8Ø!.´×1CÑ1CÐQRÔ1SÑ!SˆDÕà Ò!Ü Ð!WÓXÐXØ!.ˆDÔØˆŒØˆŒØˆ�r%   c                 ó¢   — t         j                  «       | _        d| _        | j                  j	                  «       | _        | j                  «        y)zStarts the timer.TN)r1   rD   r  r  r¢   Ú_next_timeoutÚ_schedule_nextr    s    r"   rƒ   zPeriodicCallback.start•  s:   € ô
 —~‘~Ó'ˆŒØˆŒØ!Ÿ\™\×.Ñ.Ó0ˆÔØ×ÑÕr%   c                 ó„   — d| _         | j                  �-| j                  j                  | j                  «       d| _        yy)zStops the timer.FN)r  r  r  r£   r    s    r"   r…   zPeriodicCallback.stopŸ  s5   € àˆŒØ�=‰=Ð$Ø�L‰L×'Ñ'¨¯©Ô6Ø ˆD�Mð %r%   c                 ó   — | j                   S )zfReturns ``True`` if this `.PeriodicCallback` has been started.

        .. versionadded:: 4.1
        )r  r    s    r"   Ú
is_runningzPeriodicCallback.is_running¦  s   € ð
 �}‰}Ðr%   c              ƒ   ó&  K  — | j                   sy 	 | j                  «       }|�t        |«      r
|ƒ d {  –—†  | j                  «        y 7 Œ# t        $ r% t	        j
                  d| j                  d¬«       Y Œ@w xY w# | j                  «        w xY w­w)Nrß   Trà   )r  rª   r   r’   r	   rå   r  )r!   Úvals     r"   Ú_runzPeriodicCallback._run­  sz   è ø€ Ø�}Š}Øð	"Ø—-‘-“/ˆCØˆ¤;¨sÔ#3Ø—	�	ð ×ÑÕ!ð	 ùÜò 	TÜ�M‰MÐ4°d·m±mÈd×Sð	Tûð ×ÑÕ!üsC   ‚B‘"A ³A	´A ¸BÁ	A Á+A9Á6A< Á8A9Á9A< Á<BÂBc                 óÚ   — | j                   r_| j                  | j                  j                  «       «       | j                  j	                  | j
                  | j                  «      | _        y y r   )r  Ú_update_nextr  r¢   r¡   r  r%  r  r    s    r"   r  zPeriodicCallback._schedule_next¹  sK   € Ø�=Š=Ø×Ñ˜dŸl™l×/Ñ/Ó1Ô2Ø ŸL™L×4Ñ4°T×5GÑ5GÈÏÉÓSˆD�Mð r%   Úcurrent_timec                 óT  — | j                   dz  }| j                  r*|d| j                  t        j                  «       dz
  z  z   z  }| j                  |k  r?| xj                  t	        j
                  || j                  z
  |z  «      dz   |z  z  c_        y | xj                  |z  c_        y )Ng     @�@r2   g      à?)r  r  Úrandomr  ÚmathÚfloor)r!   r(  Úcallback_time_secs      r"   r'  zPeriodicCallback._update_next¾  sž   € Ø ×.Ñ.°Ñ7ÐØ�;Š;à  d§k¡k´V·]±]³_ÀsÑ5JÑ&KÑ!LÑLÐØ×Ñ Ò-ð
 ×ÒÜ—
‘
˜L¨4×+=Ñ+=Ñ=ÐARÑRÓSÐVWÑWØ!ñ#"ñ "Öð$ ×ÒÐ"3Ñ3Ör%   )r   r(   )r)   r*   r+   rö   r   r   r   r   r±   r²   r   r  rƒ   r…   rŸ   r"  r%  r  r'  r   r%   r"   r  r  ^  s‹   „ ñ#ðR ñ	à˜2˜x¨	Ñ2Ð2Ñ3ðð ˜X×/Ñ/°Ð6Ñ7ðð ð	ð
 
óó"ó!ð˜Dó ó
"óTð
4¨ð 4°4ô 4r%   r  )2rö   rR   Úconcurrent.futuresrÕ   r±   rÅ   r®   rë   r“   r¢   r+  r*  r]   Úinspectr   Útornado.concurrentr   r   r   r   r   Útornado.logr	   Útornado.utilr
   r   r   r�   r   r   r   r   r   r   r   r   rž   r   r   r   r   Útyping_extensionsr   r  r   r-   r.   r1   r  r  r   r%   r"   ú<module>r4     s°   ðñ ó Û Û Û Û Û 	Û 
Û Û Û Û Ý ÷õ õ  ß BÑ Bã ß R× RÓ Rà	×Òß1Ó1æ*à€Hô�(ô ñ ˆTƒ]€ÙˆT˜Ô%€ôv'ˆ\ô v'÷r1ñ 1÷:|4ò |4r%   