Ë
    B²jxˆ  ã                  ó*  — U d Z ddlm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mZ ddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddl m!Z! erddl"m#Z#m$Z$ ed   Z%dZ&dZ' e(edd«      Z)e
jT                  dk7  xr ejV                  ejX                  v Z- e«       Z.de/d<    ej`                  «       a1da2da3 ed¬«       G d„ d«      «       Z4e G d„ d«      «       Z5 ed¬«       G d„ d«      «       Z6e G d„ d«      «       Z7 G d „ d!e8«      Z9 G d"„ d#e9¬$«      Z: G d%„ d&ejv                  «      Z<dd'œd3d(„Z=dd'œd4d)„Z>d5d*„Z?dd'œ	 	 	 	 	 	 	 	 	 d6d+„Z@dd'œd7d,„ZAdd'œd7d-„ZBd8d.„ZCd9d/„ZDd:d0„ZEd:d1„ZFd:d2„ZGd#gZHy);zZCross-process and cross-host reader/writer lock built on :class:`SoftFileLock` primitives.é    )ÚannotationsN)ÚcontextmanagerÚsuppress)Ú	dataclass)ÚPath)ÚTYPE_CHECKINGÚLiteral)ÚWeakValueDictionary)ÚAcquireReturnProxy)ÚTimeout)ÚSoftFileLock)Úensure_directory_exists)ÚCallableÚ	Generator)ÚreadÚwritez.breaki   Ú
O_NOFOLLOWÚwin32ú,WeakValueDictionary[Path, SoftReadWriteLock]Ú_all_instancesFT)Úfrozenc                  ó,   — e Zd ZU ded<   ded<   ded<   y)Ú_PathsÚstrÚstater   ÚreadersN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úV/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/filelock/_soft_rw/_sync.pyr   r   -   s   … àƒJØƒJØ„Lr#   r   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)Ú_Locksúthreading.LockÚinternalÚtransactionr   r   Nr   r"   r#   r$   r&   r&   4   s   … àÓØÓØÔr#   r&   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)Ú_MarkerInfor   ÚtokenÚintÚpidÚhostnameNr   r"   r#   r$   r+   r+   ;   s   … àƒJØ	ƒHØ„Mr#   r+   c                  ób   — e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   y)Ú_HoldzYEverything that exists only while a lock is held; ``None`` when the instance has no lock.r-   ÚlevelÚ_ModeÚmodeú
int | NoneÚwrite_thread_idr   Úmarker_nameÚboolÚ	is_readerr,   Ú_HeartbeatThreadÚheartbeat_threadúthreading.EventÚheartbeat_stopN)r   r   r    Ú__doc__r!   r"   r#   r$   r1   r1   B   s1   … ácàƒJØ
ƒKØÓØÓØƒOØƒJØ&Ó&Ø#Ô#r#   r1   c                  óf   ‡ — e Zd ZU ded<   ded<   	 ddddddd	œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd
„Zˆ xZS )Ú_SoftRWMetar   Ú
_instancesr'   Ú_instances_lockTç      >@Nç      Ð?©ÚblockingÚis_singletonÚheartbeat_intervalÚstale_thresholdÚpoll_intervalc          
     óÊ  •— |st         ‰| �  |||||||¬«      S t        |«      j                  «       }| j                  5  | j
                  j                  |«      }	|	€&t         ‰| �  |||||||¬«      }	|	| j
                  |<   nK|	j                  |k7  s|	j                  |k7  r-d|	j                  › d|	j                  › d|› d|› �}
t        |
«      ‚|	cd d d «       S # 1 sw Y   y xY w)NrE   z$Singleton lock created with timeout=z, blocking=z, cannot be changed to timeout=)
ÚsuperÚ__call__r   ÚresolverB   rA   ÚgetÚtimeoutrF   Ú
ValueError)ÚclsÚ	lock_filerP   rF   rG   rH   rI   rJ   Ú
normalizedÚinstanceÚmsgÚ	__class__s              €r$   rM   z_SoftRWMeta.__call__T   s  ø€ ñ Ü‘7Ñ#ØØØ!Ø)Ø#5Ø /Ø+ð $ó ð ô ˜)“_×,Ñ,Ó.ˆ
Ø× Ñ ñ 	Ø—~‘~×)Ñ)¨*Ó5ˆHØÐÜ ™7Ñ+ØØØ%Ø!-Ø'9Ø$3Ø"/ð ,ó �ð .6�—‘˜zÒ*Ø×!Ñ! WÒ,°×0AÑ0AÀXÒ0Mà:¸8×;KÑ;KÐ:LÈKÐX`×XiÑXiÐWjð k5Ø5<°I¸[ÈÈ
ðTð ô ! “oÐ%Ø÷'	÷ 	ò 	ús   ¿BCÃC"©éÿÿÿÿ)rS   ústr | os.PathLike[str]rP   ÚfloatrF   r8   rG   r8   rH   r[   rI   úfloat | NonerJ   r[   ÚreturnÚSoftReadWriteLock)r   r   r    r!   rM   Ú__classcell__©rW   s   @r$   r@   r@   P   s‚   ø… Ø<Ó<Ø#Ó#ð
 ð*ð
 Ø!Ø$(Ø(,Ø#ñ*à)ð*ð ð*ð
 ð*ð ð*ð "ð*ð &ð*ð ð*ð 
÷*ñ *r#   r@   c                  ó°  — e Zd ZU dZ e«       Zded<    ej                  «       Z		 dddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d d	„Z
ed!dd
œd"d„«       Zed!dd
œd"d„«       Zd!dd
œd#d„Zd!dd
œd#d„Zd$d„Zddœd%d„Ze	 ddd
œ	 	 	 	 	 	 	 d&d„«       Z	 	 	 	 	 	 	 	 d'd„Zd(d„Z	 	 	 	 	 	 	 	 d)d„Z	 	 	 	 	 	 	 	 d)d„Z	 	 	 	 	 	 	 	 d*d„Zd$d„Zd+d„Zd,d„Zd-d„Zd+d„Zd$d„Zy).r^   uÉ
  
    Cross-process and cross-host reader/writer lock built on :class:`SoftFileLock` primitives.

    Use this class instead of :class:`~filelock.ReadWriteLock` when the lock file lives on a network
    filesystem (NFS, Lustre with ``-o flock``, HPC cluster shared storage). ``ReadWriteLock`` is backed
    by SQLite and cannot run on NFS because SQLite's ``fcntl`` locking is unreliable there.

    Layout on disk for a lock at ``foo.lock``:

    - ``foo.lock.state`` â€” a :class:`SoftFileLock` taken only during state transitions (microseconds).
    - ``foo.lock.write`` â€” writer marker; its presence means a writer is claiming or holding the lock.
    - ``foo.lock.readers/<host>.<pid>.<uuid>`` â€” one file per reader.

    Each marker stores a random token (``secrets.token_hex(16)``), the holder's pid, and the holder's
    hostname. A daemon heartbeat thread refreshes ``mtime`` on every held marker. A marker whose mtime
    has not advanced in ``stale_threshold`` seconds may be evicted by any process on any host, giving
    correct behavior when a compute node crashes with a lock held.

    Writer acquire is two-phase and writer-preferring: phase 1 claims ``.write`` (blocking any new
    reader), phase 2 waits for existing readers to drain. Writer starvation is impossible.

    Reentrancy, upgrade/downgrade rules, thread pinning, and singleton caching by resolved path match
    :class:`~filelock.ReadWriteLock`.

    Forking while holding a lock invalidates the inherited instance in the child so the child cannot
    double-own the lock with its parent; ``release()`` on a fork-invalidated instance is a no-op, and
    the child must re-acquire if it needs a lock.

    Trust boundary: protects against same-UID non-cooperating processes (one host or cross-host) and
    same-host different-UID users via ``0o600`` / ``0o700`` permissions. Does not protect against root
    compromise, NTP tampering on same-UID cross-host nodes, or multi-tenant mounts where hostile
    co-tenants share the UID.

    :param lock_file: path to the lock file; sidecar state/write/readers live next to it
    :param timeout: maximum wait time in seconds; ``-1`` means block indefinitely
    :param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately on contention
    :param is_singleton: if ``True``, reuse existing instances for the same resolved path
    :param heartbeat_interval: seconds between heartbeat refreshes; default 30 s
    :param stale_threshold: seconds of ``mtime`` inactivity before a marker is stale; defaults to
        ``3 * heartbeat_interval``, matching etcd's ``LeaseKeepAlive`` convention
    :param poll_interval: seconds between acquire retries under contention; default 0.25 s

    .. versionadded:: 3.27.0

    r   rA   TrC   NrD   rE   c               ó2  — |dk  rd|› �}t        |«      ‚|€|dz  }||k  rd|› d|› d�}t        |«      ‚|dk  rd|› �}t        |«      ‚t        j                  |«      | _        || _        || _        || _        || _        || _        t        | j                  › d�| j                  › d	�| j                  › d
�¬«      | _
        t        | j                  «       t        t        j                  «       t        j                  «       t        | j                  j                   d¬«      ¬«      | _        d | _        d | _        d| _        d| _        t,        5  | t.        t1        | j                  «      j3                  «       <   t5        «        d d d «       y # 1 sw Y   y xY w)Nr   z)heartbeat_interval must be positive, got é   z0stale_threshold must exceed heartbeat_interval (z <= ú)z$poll_interval must be positive, got z.statez.writez.readers)r   r   r   rY   ©rP   ©r(   r)   r   F)rQ   ÚosÚfspathrS   rP   rF   rH   rI   rJ   r   Ú_pathsr   r&   Ú	threadingÚLockr   r   Ú_locksÚ_readers_dir_fdÚ_holdÚ_fork_invalidatedÚ_closedÚ_all_instances_lockr   r   rN   Ú_register_hooks)	ÚselfrS   rP   rF   rG   rH   rI   rJ   rV   s	            r$   Ú__init__zSoftReadWriteLock.__init__³   s‰  € ð  Ò"Ø=Ð>PÐ=QÐRˆCÜ˜S“/Ð!ØÐ"Ø0°1Ñ4ˆOØÐ0Ò0ØDÀ_ÐDUÐUYÐZlÐYmÐmnÐoˆCÜ˜S“/Ð!Ø˜AÒØ8¸¸ÐHˆCÜ˜S“/Ð!ä Ÿi™i¨	Ó2ˆŒØ%ˆŒØ&ˆŒØ);ˆÔØ&5ˆÔØ$1ˆÔäØ—^‘^Ð$ FÐ+Ø—^‘^Ð$ FÐ+Ø—~‘~Ð& hÐ/ô
ˆŒô
 	  §¡Ô/ÜÜ—^‘^Ó%Ü!Ÿ™Ó(Ü˜tŸ{™{×0Ñ0¸"Ô=ô
ˆŒð
 ,0ˆÔØ#'ˆŒ
Ø',ˆÔØ"ˆŒä ñ 	Ø=AŒNœ4 §¡Ó/×7Ñ7Ó9Ñ:ÜÔ÷	÷ 	ñ 	ús   Å5FÆF©rF   c             #  ó†   K  — | j                  ||¬«       	 d–— | j                  «        y# | j                  «        w xY w­w)a  
        Context manager that acquires and releases a shared read lock.

        Falls back to instance defaults for *timeout* and *blocking* when ``None``.

        :param timeout: maximum wait time in seconds, or ``None`` to use the instance default
        :param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately; ``None`` uses the instance default

        :raises RuntimeError: if a write lock is already held on this instance
        :raises Timeout: if the lock cannot be acquired within *timeout* seconds

        ru   N)Úacquire_readÚrelease©rs   rP   rF   s      r$   Ú	read_lockzSoftReadWriteLock.read_lockå   s5   è ø€ ð 	×Ñ˜'¨HÐÔ5ð	Ûà�L‰L�NøˆD�L‰L�Nüó   ‚A—, ›A¬>¾Ac             #  ó†   K  — | j                  ||¬«       	 d–— | j                  «        y# | j                  «        w xY w­w)a@  
        Context manager that acquires and releases an exclusive write lock.

        Falls back to instance defaults for *timeout* and *blocking* when ``None``.

        :param timeout: maximum wait time in seconds, or ``None`` to use the instance default
        :param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately; ``None`` uses the instance default

        :raises RuntimeError: if a read lock is already held, or a write lock is held by a different thread
        :raises Timeout: if the lock cannot be acquired within *timeout* seconds

        ru   N)Úacquire_writerx   ry   s      r$   Ú
write_lockzSoftReadWriteLock.write_lockù   s5   è ø€ ð 	×Ñ˜7¨XÐÔ6ð	Ûà�L‰L�NøˆD�L‰L�Nür{   c               ó*   — | j                  d||¬«      S )uf  
        Acquire a shared read lock.

        If this instance already holds a read lock, the lock level is incremented (reentrant). Attempting to acquire a
        read lock while holding a write lock raises :class:`RuntimeError` (downgrade not allowed). On the 0â†’1
        transition a daemon heartbeat thread is started that refreshes the reader marker's ``mtime`` every
        ``heartbeat_interval`` seconds so peers on other hosts do not evict the marker as stale.

        :param timeout: maximum wait time in seconds, or ``None`` to use the instance default; ``-1`` means block
            indefinitely
        :param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately when the lock is unavailable;
            ``None`` uses the instance default

        :returns: a proxy that can be used as a context manager to release the lock

        :raises RuntimeError: if a write lock is already held on this instance, if this instance was invalidated by
            :func:`os.fork`, or if :meth:`close` was called
        :raises Timeout: if the lock cannot be acquired within *timeout* seconds

        r   ru   ©Ú_acquirery   s      r$   rw   zSoftReadWriteLock.acquire_read  s   € ð* �}‰}˜V W°xˆ}Ó@Ð@r#   c               ó*   — | j                  d||¬«      S )a¨  
        Acquire an exclusive write lock.

        If this instance already holds a write lock from the same thread, the lock level is incremented (reentrant).
        Attempting to acquire a write lock while holding a read lock raises :class:`RuntimeError` (upgrade not
        allowed). Write locks are pinned to the acquiring thread: a different thread trying to re-enter also raises
        :class:`RuntimeError`.

        Writer acquisition runs in two phases. Phase 1 atomically claims ``<path>.write`` via ``O_CREAT | O_EXCL``,
        which immediately blocks any new reader on any host. Phase 2 waits for existing readers to drain. Writer
        starvation is impossible: new readers see ``<path>.write`` during phase 2 and wait behind the pending writer.

        :param timeout: maximum wait time in seconds, or ``None`` to use the instance default; ``-1`` means block
            indefinitely
        :param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately when the lock is unavailable;
            ``None`` uses the instance default

        :returns: a proxy that can be used as a context manager to release the lock

        :raises RuntimeError: if a read lock is already held, if a write lock is held by a different thread, if this
            instance was invalidated by :func:`os.fork`, or if :meth:`close` was called
        :raises Timeout: if the lock cannot be acquired within *timeout* seconds

        r   ru   r€   ry   s      r$   r}   zSoftReadWriteLock.acquire_write$  s   € ð2 �}‰}˜W g¸ˆ}ÓAÐAr#   c                ód  — | j                  d¬«       | j                  j                  5  | j                  r
	 ddd«       yd| _        | j                  �>t        t        «      5  t        j                  | j                  «       ddd«       d| _        ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)u  
        Release any held lock and release internal filesystem resources.

        Idempotent. After calling this method the instance can no longer acquire locks â€” subsequent acquires raise
        :class:`RuntimeError`. A fork-invalidated instance is closed without raising.
        T©ÚforceN)	rx   rl   r(   rp   rm   r   ÚOSErrorrg   Úclose©rs   s    r$   r‡   zSoftReadWriteLock.close?  s™   € ð 	�‰˜4ˆÔ Ø�[‰[×!Ñ!ñ 	,Ø�|Š|Ø÷	,ð 	,ð  ˆDŒLØ×#Ñ#Ð/ÜœgÓ&ñ 3Ü—H‘H˜T×1Ñ1Ô2÷3à'+�Ô$÷	,ð 	,÷
3ð 3ú÷	,ð 	,ús)   ©B&Á "B&Á" BÂB&ÂB#	ÂB&Â&B/Fr„   c               ó   — | j                   j                  5  | j                  rd| _        	 ddd«       y| j                  }|€3|r
	 ddd«       yd| j                  › dt        | «      › d�}t        |«      ‚|rd|_        n|xj                  dz  c_        |j                  dkD  r
	 ddd«       yd| _        ddd«       j                  j                  «        |j                  j                  | j                  dz   ¬«       |j                  r"t        |j                  | j                   ¬	«       yt        |j                  «       y# 1 sw Y   Œ�xY w)
a8  
        Release one level of the current lock.

        When the lock level reaches zero the heartbeat thread is stopped and the held marker file is unlinked. On a
        fork-invalidated instance (that is, the child of a :func:`os.fork` call made while the parent held a lock)
        this method is a no-op so inherited ``with`` blocks can unwind cleanly in the child.

        :param force: if ``True``, release the lock completely regardless of the current lock level

        :raises RuntimeError: if no lock is currently held and *force* is ``False``

        NzCannot release a lock on ú (lock id: z) that is not heldr   é   g      ð?re   ©Údir_fd)rl   r(   ro   rn   rS   ÚidÚRuntimeErrorr2   r=   Úsetr;   ÚjoinrH   r9   Ú_unlinkr7   rm   )rs   r…   ÚholdrV   s       r$   rx   zSoftReadWriteLock.releaseP  s(  € ð �[‰[×!Ñ!ñ 	Ø×%Ò%à!�”
Ø÷		ð 	ð
 —:‘:ˆDØˆ|ÙØ÷	ð 	ð 2°$·.±.Ð1AÀÌRÐPTËXÈJÐVhÐi�Ü" 3Ó'Ð'ÙØ�•
à—
’
˜a‘•
Ø�z‰z˜AŠ~Ø÷!	ð 	ð" ˆDŒJ÷#	ð, 	×Ñ×ÑÔ!Ø×Ñ×"Ñ"¨4×+BÑ+BÀSÑ+HÐ"ÔIØ�>Š>Ü�D×$Ñ$¨T×-AÑ-AÖBä�D×$Ñ$Õ%÷7	ð 	ús   —EµEÁAEÂ.EÅEc               ó   —  | |||¬«      S )a  
        Return the singleton :class:`SoftReadWriteLock` for *lock_file*.

        :param lock_file: path to the lock file; sidecar state/write/readers live next to it
        :param timeout: maximum wait time in seconds; ``-1`` means block indefinitely
        :param blocking: if ``False``, raise :class:`~filelock.Timeout` immediately when the lock is unavailable

        :returns: the singleton lock instance

        :raises ValueError: if an instance already exists for this path with different *timeout* or *blocking* values

        ru   r"   )rR   rS   rP   rF   s       r$   Úget_lockzSoftReadWriteLock.get_lockz  s   € ñ( �9˜g°Ô9Ð9r#   c               ó€  — |€| j                   n|}|€| j                  n|}| j                  j                  5  | j                  rd| j
                  › d�}t        |«      ‚| j                  rd| j
                  › d�}t        |«      ‚| j                  �| j                  |«      cd d d «       S 	 d d d «       t        j                  «       }|s'| j                  j                  j                  d¬«      }nS|dk(  r'| j                  j                  j                  d¬«      }n'| j                  j                  j                  d|¬«      }|st        | j
                  «      d ‚	 | j                  j                  5  | j                  �>| j                  |«      cd d d «       | j                  j                  j                  «        S 	 d d d «       |dk(  rd n||z   }	t!        j"                  d	«      }
|d
k(  r| j%                  |
|	|¬«      \  }}n| j'                  |
|	|¬«      \  }}t)        j*                  «       }t-        | j.                  | j0                  |dt3        | «      d›�¬«      }| j                  j                  5  t5        d||d
k(  rt)        j6                  «       nd |||
||¬«      | _        d d d «       |j9                  «        t;        | ¬«      | j                  j                  j                  «        S # 1 sw Y   �ŒFxY w# 1 sw Y   �Œ@xY w# 1 sw Y   ŒcxY w# | j                  j                  j                  «        w xY w)NzSoftReadWriteLock on z4 was invalidated by fork(); construct a new instancez has been closedFru   rY   T)rF   rP   é   r   ©ÚdeadlinerF   zfilelock-heartbeat-Úx)ÚrefreshÚintervalÚ
stop_eventÚnamer‹   )r2   r4   r6   r7   r9   r,   r;   r=   ©Úlock)rP   rF   rl   r(   ro   rS   r�   rp   rn   Ú_validate_reentrantÚtimeÚperf_counterr)   Úacquirer   rx   ÚsecretsÚ	token_hexÚ_acquire_writer_slotÚ_acquire_reader_slotrj   ÚEventr:   Ú_refresh_markerrH   rŽ   r1   Ú	get_identÚstartr   )rs   r4   rP   rF   Úeffective_timeoutÚeffective_blockingrV   r¬   Úacquiredr™   r,   r7   r9   r�   Ú	heartbeats                  r$   r�   zSoftReadWriteLock._acquire�  sý  € ð -4¨O˜DŸLšLÀÐØ.6Ð.>˜TŸ]š]ÀHÐà�[‰[×!Ñ!ñ 	6Ø×%Ò%Ø-¨d¯n©nÐ-=Ð=qÐr�Ü" 3Ó'Ð'Ø�|Š|Ø-¨d¯n©nÐ-=Ð=MÐN�Ü" 3Ó'Ð'Ø�z‰zÐ%Ø×/Ñ/°Ó5÷	6ñ 	6ð &÷	6ô ×!Ñ!Ó#ˆÙ!Ø—{‘{×.Ñ.×6Ñ6ÀÐ6ÓF‰HØ "Ò$Ø—{‘{×.Ñ.×6Ñ6ÀÐ6ÓE‰Hà—{‘{×.Ñ.×6Ñ6ÀÐN_Ð6Ó`ˆHÙÜ˜$Ÿ.™.Ó)¨tÐ3ð'	.Ø—‘×%Ñ%ñ :Ø—:‘:Ð)Ø×3Ñ3°DÓ9÷:ð :ðL �K‰K×#Ñ#×+Ñ+Õ-ðK *÷:ð  1°BÒ6‘t¸EÐDUÑ<UˆHÜ×%Ñ% bÓ)ˆEØ�wŠØ)-×)BÑ)BØ HÐ7Ið *Có *Ñ&�™Yð *.×)BÑ)BØ HÐ7Ið *Có *Ñ&�˜Yô #Ÿ™Ó*ˆJÜ(Ø×,Ñ,Ø×0Ñ0Ø%Ø*¬2¨d«8°A¨,Ð7ô	ˆIð —‘×%Ñ%ñ 
Ü"ØØØ=AÀWº_¤I×$7Ñ$7Ô$9ÐRVØ +Ø'ØØ%.Ø#-ô	�”
÷
ð �O‰OÔÜ%¨4Ô0à�K‰K×#Ñ#×+Ñ+Õ-÷u	6ñ 	6ú÷(:ñ :ú÷.
ð 
ûð �K‰K×#Ñ#×+Ñ+Õ-úsO   ·A+K1ÅL Å4K>Æ	L Ç B7L É72LÊ)#L Ë1K;Ë>LÌL ÌLÌL Ì&L=c                óÂ  — | j                   }|€J ‚|j                  |k7  rB|dk(  rdnd}|dk(  rdnd}d|› d| j                  › dt        | «      › d|› d	|› d
�}t	        |«      ‚|dk(  rYt        j                  «       x}|j                  k7  r6d| j                  › dt        | «      › d|› d|j                  › �}t	        |«      ‚|xj                  dz  c_        t        | ¬«      S )Nr   r   Ú	downgradeÚupgradezCannot acquire z	 lock on rŠ   z): already holding a z lock (z not allowed)zCannot acquire write lock on z) from thread z while it is held by thread r‹   rŸ   )
rn   r4   rS   rŽ   r�   rj   r«   r6   r2   r   )rs   r4   r“   ÚoppositeÚ	directionrV   Úcurs          r$   r¡   z%SoftReadWriteLock._validate_reentrantÖ  s  € Ø�z‰zˆØÐÐÐØ�9‰9˜ÒØ"&¨&¢.‘w°fˆHØ'+¨v¢~™¸9ˆIà! $  y°·±Ð0@ÀÌBÈtËHÈ:ð V%Ø%- J¨g°i°[ÀðOð ô ˜sÓ#Ð#Ø�7Š?¤y×':Ñ':Ó'<Ð < À×AUÑAUÒUà/°·±Ð/?¸{Ì2ÈdË8È*ð UØ"˜eÐ#?À×@TÑ@TÐ?UðWð ô ˜sÓ#Ð#Ø�
Š
�a‰�
Ü! tÔ,Ð,r#   c               ó  ‡ ‡— ‰ j                  «        dˆ ˆfd„}dˆ fd„}‰ j                  |||¬«       	 ‰ j                  |||¬«       ‰ j                  j
                  dfS # t        $ r! t        ‰ j                  j
                  «       ‚ w xY w)Nc                 óœ  •— ‰ j                   j                  5  t        ‰ j                  j                  ‰ j
                  t        j                  «       ¬«       t        ‰ j                  j                  «      r
	 d d d «       y	 t        ‰ j                  j                  ‰«       	 d d d «       y# t        $ r Y d d d «       yw xY w# 1 sw Y   yxY w)N©rI   ÚnowFT)
rl   r   Ú_break_stale_markerri   r   rI   r¢   Ú_file_existsÚ_atomic_create_markerÚFileExistsError)rs   r,   s   €€r$   Útry_claim_writerz@SoftReadWriteLock._acquire_writer_slot.<locals>.try_claim_writerõ  s¦   ø€ Ø—‘×"Ñ"ñ !Ü# D§K¡K×$5Ñ$5Àt×G[ÑG[Ôae×ajÑajÓalÕmÜ §¡× 1Ñ 1Ô2Ø ÷!ð !ð!Ü)¨$¯+©+×*;Ñ*;¸UÕC÷!ð øô 'ò !Ø ÷!ð !ð!ú÷!ð ús*   ˜ACÂ B+Â+	B?Â4CÂ>B?Â?CÃCc                 óJ  •— ‰ j                   j                  5  t        t        «      5  t	        ‰ j
                  j                  «       d d d «       ‰ j                  t        j                  «       «       ‰ j                  «        cd d d «       S # 1 sw Y   ŒFxY w# 1 sw Y   y xY w©N)
rl   r   r   r†   Ú_touchri   r   Ú_break_stale_readersr¢   Ú_any_readersrˆ   s   €r$   Úreaders_drained_touchingzHSoftReadWriteLock._acquire_writer_slot.<locals>.readers_drained_touching   s~   ø€ Ø—‘×"Ñ"ñ /ô œgÓ&ñ .Ü˜4Ÿ;™;×,Ñ,Ô-÷.à×)Ñ)¬$¯)©)«+Ô6Ø×,Ñ,Ó.Ð.÷/ñ /÷.ð .ú÷/ð /ús"   ˜B¨ BÁ;BÂB	ÂBÂB"r˜   F©r]   r8   )Ú_open_readers_dirÚ	_wait_forr   r’   ri   r   )rs   r,   r™   rF   r¿   rÅ   s   ``    r$   r§   z&SoftReadWriteLock._acquire_writer_slotê  s†   ù€ ð 	×ÑÔ ö		õ	/ð 	�‰Ð'°(ÀXˆÔNð	Ø�N‰NÐ3¸hÐQYˆNÔZð
 �{‰{× Ñ  %Ð'Ð'øô	 ò 	ä�D—K‘K×%Ñ%Ô&Øð	ús   µA! Á!*Bc               óT  ‡ ‡‡‡‡— ‰ j                  «        t        j                  «       j                  › dt	        j
                  «       › �Š‰ j                  Št        t        ‰ j                  j                  «      ‰z  «      Šdˆˆˆˆ ˆfd„}‰ j                  |||¬«       ‰�‰dfS ‰dfS )Nú.c                 óf  •— ‰j                   j                  5  t        ‰j                  j                  ‰j
                  t        j                  «       ¬«       t        ‰j                  j                  «      r
	 d d d «       y‰ �t        ‰‰‰ ¬«       nt        ‰‰«       	 d d d «       y# 1 sw Y   y xY w)Nr¹   FrŒ   T)	rl   r   r»   ri   r   rI   r¢   r¼   r½   )r�   Úfull_reader_pathÚreader_namers   r,   s   €€€€€r$   Útry_claim_readerz@SoftReadWriteLock._acquire_reader_slot.<locals>.try_claim_reader  sŒ   ø€ Ø—‘×"Ñ"ñ Ü# D§K¡K×$5Ñ$5Àt×G[ÑG[Ôae×ajÑajÓalÕmÜ §¡× 1Ñ 1Ô2Ø ÷ð ð Ð%Ü)¨+°uÀVÖLä)Ð*:¸EÔBØ÷÷ ñ ús   ˜AB'Â B'Â'B0r˜   TrÆ   )rÇ   ÚuuidÚuuid4Úhexrg   Úgetpidrm   r   r   ri   r   rÈ   )rs   r,   r™   rF   rÎ   r�   rÌ   rÍ   s   ``   @@@r$   r¨   z&SoftReadWriteLock._acquire_reader_slot  s˜   ü€ ð 	×ÑÔ ÜŸ™›×)Ñ)Ð*¨!¬B¯I©I«K¨=Ð9ˆØ×%Ñ%ˆÜœt D§K¡K×$7Ñ$7Ó8¸;ÑFÓGÐ÷		ñ 		ð 	�‰Ð'°(ÀXˆÔNØ%Ð1�È$ÐNÐNÐ7GÈ$ÐNÐNr#   c               ó  — 	  |«       ry t        j                  «       }|st        | j                  «      ‚|�||k\  rt        | j                  «      ‚| j                  }|�t        |t        ||z
  d«      «      }t        j                  |«       ŒŒ)Ng        )r¢   r£   r   rS   rJ   ÚminÚmaxÚsleep)rs   Ú	predicater™   rF   rº   Ú	sleep_fors         r$   rÈ   zSoftReadWriteLock._wait_for,  sƒ   € ð ÙŒ{ØÜ×#Ñ#Ó%ˆCÙÜ˜dŸn™nÓ-Ð-ØÐ#¨¨xªÜ˜dŸn™nÓ-Ð-Ø×*Ñ*ˆIØÐ#Ü 	¬3¨x¸#©~¸sÓ+CÓD�	Ü�J‰J�yÔ!ð r#   c                óž  — t        | j                  j                  «      }t        t        «      5  |j                  d¬«       d d d «       t        j                  | j                  j                  «      }t        j                  |j                  «      st        j                  |j                  «      s$| j                  j                  › d�}t        |«      ‚| j                  €`t        rYt        j                  t!        t        dd«      z  t"        z  }t        j$                  | j                  j                  |«      | _        y y y # 1 sw Y   �ŒxY w)NiÀ  )r4   zB exists but is not a directory or is a symlink; refusing to use itÚO_DIRECTORYr   )r   ri   r   r   r¾   Úmkdirrg   ÚlstatÚstatÚS_ISLNKÚst_modeÚS_ISDIRr�   rm   Ú_SUPPORTS_DIR_FDÚO_RDONLYÚgetattrÚ_O_NOFOLLOWÚopen)rs   Úreaders_pathÚstrV   Úflagss        r$   rÇ   z#SoftReadWriteLock._open_readers_dir@  sð   € Ü˜DŸK™K×/Ñ/Ó0ˆÜ”oÓ&ñ 	+Ø×Ñ EÐÔ*÷	+ô �X‰X�d—k‘k×)Ñ)Ó*ˆÜ�<‰<˜Ÿ
™
Ô#¬4¯<©<¸¿
¹
Ô+CØ—[‘[×(Ñ(Ð)Ð)kÐlˆCÜ˜sÓ#Ð#Ø×ÑÐ'Õ,<Ü—K‘K¤'¬"¨m¸QÓ"?Ñ?Ä+ÑMˆEÜ#%§7¡7¨4¯;©;×+>Ñ+>ÀÓ#FˆDÕ ð -=Ð'÷	+ñ 	+ús   ¯EÅEc                ó0   — | j                  «       D ]  } y y)NTF)Ú_iter_reader_entries)rs   Ú_s     r$   rÄ   zSoftReadWriteLock._any_readersN  s    € Ø×*Ñ*Ó,ò 	ˆAÙð	àr#   c              #  óð  K  — | j                   �Wt        j                  | j                   «      5 }|D ](  }t        |j                  «      rŒ|j                  df–— Œ* 	 ddd«       yt        | j                  j                  «      }t        j                  |«      5 }|D ]4  }t        |j                  «      rŒt        ||j                  z  «      df–— Œ6 	 ddd«       y# 1 sw Y   yxY w# 1 sw Y   yxY w­w)a#  
        Yield ``(name, dirfd_relative)`` pairs for every live reader marker.

        ``dirfd_relative`` is ``True`` when *name* should be passed to ``dir_fd=``-aware syscalls; ``False``
        when *name* is a full path because dirfd-relative I/O is unavailable on this platform.
        NTF)	rm   rg   ÚscandirÚ_is_housekeeping_namerž   r   ri   r   r   )rs   ÚitÚentryræ   s       r$   rê   z&SoftReadWriteLock._iter_reader_entriesS  sâ   è ø€ ð ×ÑÐ+Ü—‘˜D×0Ñ0Ó1ð /°RØò /�EÜ0°·±Õ<Ø#Ÿj™j¨$Ð.Ó.ñ/÷/ð Ü˜DŸK™K×/Ñ/Ó0ˆÜ�Z‰Z˜Ó%ð 	@¨Øò @�Ü,¨U¯Z©ZÕ8Ü˜l¨U¯Z©ZÑ7Ó8¸%Ð?Ó?ñ@÷	@ð 	@÷/ð ú÷	@ð 	@üs@   ‚,C6®CÁ
CÁ=C6ÂC*Â6C*Ã	C6ÃC'Ã#C6Ã*C3Ã/C6c                óâ   — g }	 | j                  «       D ]&  \  }}|j                  ||r| j                  nd f«       Œ( 	 |D ]  \  }}t	        || j
                  ||¬«       Œ  y # t        $ r Y y w xY w)N)rI   rº   r�   )rê   Úappendrm   r†   r»   rI   )rs   rº   Únamesrž   Údirfd_relativeÚfds         r$   rÃ   z&SoftReadWriteLock._break_stale_readersf  sˆ   € Ø.0ˆð	Ø(,×(AÑ(AÓ(Cò WÑ$��nØ—‘˜d¹N D×$8Ò$8ÐPTÐUÕVñWð ò 	`‰HˆD�"Ü °d×6JÑ6JÐPSÐ\^Ö_ñ	`øô ò 	Ùð	ús   „9A" Á"	A.Á-A.c                ó˜  — | j                   j                  5  | j                  }|€
	 d d d «       y|j                  }|j                  }|j
                  r| j                  nd }d d d «       t        ¬«      }|€y|\  }}|� t        j                  |j                  «      sy	 t        ||¬«       y# 1 sw Y   ŒPxY w# t        $ r Y yw xY w)NFrŒ   T)rl   r(   rn   r7   r,   r9   rm   Ú_read_markerÚhmacÚcompare_digestrÂ   ÚFileNotFoundError)rs   r“   r7   r,   r�   Úread_resultÚinfoÚ_mtimes           r$   rª   z!SoftReadWriteLock._refresh_markerp  sÒ   € Ø�[‰[×!Ñ!ñ 	FØ—:‘:ˆDØˆ|Ø÷	Fð 	Fð ×*Ñ*ˆKØ—J‘JˆEØ-1¯^ª^�T×)Ò)ÀˆF÷	Fô # ;°vÔ>ˆØÐØØ"‰ˆˆfð ˆ<œt×2Ñ2°4·:±:¸uÔEØð	Ü�; vÕ.ð ÷)	Fð 	Fûô$ !ò 	Ùð	ús"   —B1°2B1Â#B= Â1B:Â=	C	ÃC	c                óÚ   — t        t        j                  «       t        j                  «       t        | j                  j
                  d¬«      ¬«      | _        d | _        d | _        d| _	        y )NrY   re   rf   T)
r&   rj   rk   r   ri   r   rl   rn   rm   ro   rˆ   s    r$   Ú_reset_after_fork_in_childz,SoftReadWriteLock._reset_after_fork_in_child‡  sQ   € ô Ü—^‘^Ó%Ü!Ÿ™Ó(Ü˜tŸ{™{×0Ñ0¸"Ô=ô
ˆŒð
 ˆŒ
Ø#ˆÔØ!%ˆÕr#   rX   )rS   rZ   rP   r[   rF   r8   rG   r8   rH   r[   rI   r\   rJ   r[   r]   ÚNonerÁ   )rP   r\   rF   úbool | Noner]   zGenerator[None])rP   r\   rF   r  r]   r   ©r]   r   )r…   r8   r]   r   )rS   rZ   rP   r[   rF   r8   r]   r^   )r4   r3   rP   r\   rF   r  r]   r   )r4   r3   r]   r   )r,   r   r™   r\   rF   r8   r]   ztuple[str, bool])r×   úCallable[[], bool]r™   r\   rF   r8   r]   r   rÆ   )r]   zGenerator[tuple[str, bool]])rº   r[   r]   r   )r   r   r    r>   r
   rA   r!   rj   rk   rB   rt   r   rz   r~   rw   r}   r‡   rx   Úclassmethodr•   r�   r¡   r§   r¨   rÈ   rÇ   rÄ   rê   rÃ   rª   rÿ   r"   r#   r$   r^   r^   �   s$  … ñ,ñ\ @SÓ?T€JÐ<ÓTØ$�i—n‘nÓ&€Oð
 ð0ð
 Ø!Ø$(Ø(,Ø#ñ0à)ð0ð ð0ð
 ð0ð ð0ð "ð0ð &ð0ð ð0ð 
ó0ðd ðÐQUô ó ðð& ðÐRVô ó ðð&AÐTXõ Að.BÐUYõ Bó6,ð" (-õ (&ðT ð ð:ð
 ñ:à)ð:ð ð:ð
 ð:ð 
ò:ó ð:ð*D.àðD.ð ðD.ð
 ðD.ð 
óD.óL-ð(&(àð&(ð ð	&(ð
 ð&(ð 
ó&(ðPOàðOð ð	Oð
 ðOð 
óOð4"à%ð"ð ð	"ð
 ð"ð 
ó"ó(Góó
@ó&`óô.&r#   r^   )Ú	metaclassc                  ó<   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )r:   c                óR   •— t         ‰| �  |d¬«       || _        || _        || _        y )NT)rž   Údaemon)rL   rt   Ú_refreshÚ	_intervalÚ_stop_event)rs   r›   rœ   r�   rž   rW   s        €r$   rt   z_HeartbeatThread.__init__–  s-   ø€ ô 	‰Ñ˜d¨4ÐÔ0ØˆŒØ!ˆŒØ%ˆÕr#   c                óò   — | j                   j                  | j                  «      sR| j                  «       s| j                   j	                  «        y | j                   j                  | j                  «      sŒQy y rÁ   )r  Úwaitr
  r	  r�   rˆ   s    r$   Úrunz_HeartbeatThread.run¢  sR   € Ø×"Ñ"×'Ñ'¨¯©Ô7Ø—=‘=”?Ø× Ñ ×$Ñ$Ô&Øð ×"Ñ"×'Ñ'¨¯©×7r#   )
r›   r  rœ   r[   r�   r<   rž   r   r]   r   r  )r   r   r    rt   r  r_   r`   s   @r$   r:   r:   •  s=   ø„ ð
&à#ð
&ð ð
&ð $ð	
&ð
 ð
&ð 
õ
&÷r#   r:   rŒ   c               óð  — t         j                  t         j                  z  t         j                  z  t        z  }t
        r|�t        j                  | |d|¬«      }nt        j                  | |d«      }	 |› dt        j                  «       › dt        j                  «       › d�j                  d«      }t        j                  ||«       t        j                  |«       y # t        j                  |«       w xY w)Ni€  rŒ   ú
Úascii)rg   ÚO_CREATÚO_EXCLÚO_WRONLYrä   rá   rå   rÒ   ÚsocketÚgethostnameÚencoder   r‡   )rž   r,   r�   rè   rõ   Úcontents         r$   r½   r½   ©  s¯   € ô �J‰JœŸ™Ñ"¤R§[¡[Ñ0´;Ñ>€EÝ˜FÐ.Ü�W‰W�T˜5 %°Ô7‰ä�W‰W�T˜5 %Ó(ˆðØ�G˜2œbŸi™i›k˜]¨"¬V×-?Ñ-?Ó-AÐ,BÀ"ÐE×LÑLÈWÓUˆÜ
�‰��WÔä
�‰��øŒ�‰��ús   Á4AC ÃC5c               óú  — t         j                  t        z  }	 t        r|�t        j                  | ||¬«      nt        j                  | |«      }	 	 t        j                  |«      }t        j                  |t        dz   «      }	 t        j                  |«       t        |«      |j                  fS # t
        $ r Y y w xY w# t
        $ r Y t        j                  |«       y w xY w# t        j                  |«       w xY w)NrŒ   r‹   )rg   râ   rä   rá   rå   r†   Úfstatr   Ú_MAX_MARKER_SIZEr‡   Ú_parse_marker_bytesÚst_mtime)rž   r�   rè   rõ   rç   Údatas         r$   r÷   r÷   ¸  sÐ   € ô �K‰Kœ+Ñ%€EðÝ4DÈÐI[ŒR�W‰W�T˜5¨Õ0Ôac×ahÑahÐimÐotÓauˆðð	Ü—‘˜"“ˆBÜ—7‘7˜2Ô/°!Ñ3Ó4‰Dô 	�‰�ŒÜ˜tÓ$ b§k¡kÐ1Ð1øô ò Ùðûô ò 	Øä
�‰��ð	ûô 	�‰��ús5   ™6B0 Á2B? Â0	B<Â;B<Â?	C ÃC# ÃC Ã C# Ã#C:c                ó  — | rt        | «      t        kD  ry 	 | j                  d«      }t	        j
                  d|t        j                  «      }|€y t        |d   d«      }|dkD  ry t        |d   ||d   ¬«      S # t        $ r Y y w xY w)	Nr  uå  
        \A                                  # start of string
        (?P<token>    [0-9a-f]{32}     ) \n # 128-bit hex token
        (?P<pid>      [1-9][0-9]{0,9}  ) \n # decimal pid: no leading zero, â‰¤ 10 digits
        (?P<hostname> [\x21-\x7e]{1,253})   # printable non-whitespace ASCII (RFC 1123 hostname limit)
        \n*                                 # tolerate sloppy writers that append extra newlines
        \Z                                  # end of string
        r.   é
   iÿÿÿr,   r/   )r,   r.   r/   )	Úlenr  ÚdecodeÚUnicodeDecodeErrorÚreÚmatchÚVERBOSEr-   r+   )r  Útextr%  r.   s       r$   r  r  Ë  sš   € ñ ”3�t“9Ô/Ò/ØðØ�{‰{˜7Ó#ˆô �H‰Hð	ð 	Ü
�
‰
ó€Eð €}ØÜ
ˆe�E‰l˜BÓ
€CØ
ˆY‚ØÜ˜U 7™^°¸uÀZÑ?PÔQÐQøô' ò Ùðús   —A9 Á9	BÂBc               ó(  — t        | |¬«      }|€y|\  }}||z
  |k  ry|€t        | |¬«       y| › t        › dt        j                  «       › dt        j                  d«      › �}	 t        r|�t        j                  | |||¬«       nt        | «      j                  |«       t        ||¬«      }|€y|\  }	}
|	€t        ||¬«       yt        j                  |j                  |	j                  «      sy|
|kD  ryt        ||¬«       y# t        $ r Y yw xY w)NrŒ   FTrÊ   r—   )Ú
src_dir_fdÚ
dst_dir_fd)r÷   r’   Ú_BREAK_SUFFIXrg   rÒ   r¥   r¦   rá   Úrenamer   r†   rø   rù   r,   )rž   rI   rº   r�   rû   Úinfo_beforeÚmtime_beforeÚ
break_nameÚ
read_afterÚ
info_afterÚmtime_afters              r$   r»   r»   é  s"  € ô ˜t¨FÔ3€KØÐØØ +Ñ€K�Ø
ˆ\Ñ˜_Ò,ØØÐÜ�˜VÕ$Øà�6œ-˜¨¬"¯)©)«+¨°a¼×8IÑ8IÈ"Ó8MÐ7NÐO€JðÝ Ð 2Ü�I‰I�d˜J°6ÀfÖMä�‹J×Ñ˜jÔ)ô ˜j°Ô8€JØÐØØ(Ñ€J�ØÐÜ�
 6Õ*ØÜ×Ñ˜{×0Ñ0°*×2BÑ2BÔCØØ�\Ò!ØÜˆJ˜vÕ&Øøô ò Ùðús   Á%<D Ä	DÄDc               ó¾   — t        t        «      5  t        r|�t        j                  | |¬«       nt        | «      j	                  «        d d d «       y # 1 sw Y   y xY w©NrŒ   )r   rú   rá   rg   Úunlinkr   ©rž   r�   s     r$   r’   r’     sF   € Ü	Ô#Ó	$ñ  Ý Ð 2ä�I‰I�d 6Ö*ä�‹J×ÑÔ÷ ÷  ñ  ús   �:AÁAc               ór   — t         r|�t        j                  | d |¬«       y t        j                  | d «       y r4  )rá   rg   Úutimer6  s     r$   rÂ   rÂ     s(   € Ý˜FÐ.Ü
�‰��t FÖ+ä
�‰��tÕr#   c                óŠ   — 	 t        j                  | «      }t        j                  |j
                  «      S # t        $ r Y yw xY w)NF)rg   rÜ   rú   rÝ   ÚS_ISREGrß   )Úpathrç   s     r$   r¼   r¼   &  s=   € ðÜ�X‰X�d‹^ˆô �<‰<˜Ÿ
™
Ó#Ð#øô ò Ùðús   ‚6 ¶	AÁAc                ó8   — | j                  d«      xs t        | v S )NrÊ   )Ú
startswithr+  )rž   s    r$   rî   rî   .  s   € Ø�?‰?˜3ÓÒ8¤=°DÐ#8Ð8r#   c                 ó�   — t        j                  «       at        t        j                  «       «      D ]  } | j                  «        Œ y rÁ   )rj   rk   rq   Úlistr   Úvaluesrÿ   ©rU   s    r$   Ú_reset_all_after_forkrB  2  s:   € ô
 $Ÿ.™.Ó*ÐÜœ×.Ñ.Ó0Ó1ò .ˆØ×+Ñ+Õ-ñ.r#   c                 ó´   — t        t        j                  «       «      D ],  } t        t        «      5  | j                  d¬«       d d d «       Œ. y # 1 sw Y   Œ9xY w)NTr„   )r?  r   r@  r   Ú	Exceptionrx   rA  s    r$   Ú_cleanup_all_instancesrE  <  sR   € Üœ×.Ñ.Ó0Ó1ò )ˆÜ”iÓ ñ 	)Ø×Ñ 4ÐÔ(÷	)ð 	)ñ)÷	)ð 	)ús   °AÁA	c                 ó®   — t         st        j                  t        «       da t        s.t        t        d«      rt        j                  t        ¬«       day y y )NTÚregister_at_fork)Úafter_in_child)	Ú_atexit_registeredÚatexitÚregisterrE  Ú_fork_registeredÚhasattrrg   rG  rB  r"   r#   r$   rr   rr   B  sC   € åÜ�‰Ô.Ô/Ø!Ðå¤¬Ð,>Ô ?Ü
×ÑÔ+@ÕAØÑð !@Ðr#   )rž   r   r,   r   r�   r5   r]   r   )rž   r   r�   r5   r]   z'tuple[_MarkerInfo | None, float] | None)r  Úbytesr]   z_MarkerInfo | None)
rž   r   rI   r[   rº   r[   r�   r5   r]   r8   )rž   r   r�   r5   r]   r   )r;  r   r]   r8   )rž   r   r]   r8   r  )Ir>   Ú
__future__r   rJ  rø   rg   r$  r¥   r  rÝ   Úsysrj   r¢   rÏ   Ú
contextlibr   r   Údataclassesr   Úpathlibr   Útypingr   r	   Úweakrefr
   Úfilelock._apir   Úfilelock._errorr   Úfilelock._softr   Úfilelock._utilr   Úcollections.abcr   r   r3   r+  r  rã   rä   Úplatformrå   Úsupports_dir_fdrá   r   r!   rk   rq   rI  rL  r   r&   r+   r1   Útyper@   r^   ÚThreadr:   r½   r÷   r  r»   r’   rÂ   r¼   rî   rB  rE  rr   Ú__all__r"   r#   r$   ú<module>r`     sí  ðÚ `å "ã Û Û 	Û 	Û Û Û Û 
Û Û Û ß /Ý !Ý ß )Ý 'å ,Ý #Ý 'Ý 2áß3ð 	�Ñ €Ø€ØÐ Ù�b˜,¨Ó*€ð —<‘< 7Ñ*ÒL¨r¯w©w¸"×:LÑ:LÐ/LÐ á?RÓ?T€Ð<Ó TØ$�i—n‘nÓ&Ð ØÐ ØÐ ñ �$Ô÷ð ó ðð ÷ð ó ðñ �$Ô÷ð ó ðð ÷
$ð 
$ó ð
$ô.�$ô .ôbQ& +õ Q&ôh�y×'Ñ'ô ð( JNõ ð 59õ 2ó&RðF ñ*Ø
ð*ð ð*ð 
ð	*ð
 ð*ð 
ó*ðZ 04õ  ð /3õ ó$ó9ó.ó)ó ð ð�r#   