o
    j                     @  s  U 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	m
Z
mZmZmZmZmZmZmZ d dl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 m!Z! d dlm"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.Z/d dl0Z/d dl1m2Z2m3Z3m4Z4 d dl0m5Z5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z< d dl=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZH ddlImJZJmKZKmLZLmMZM ddlNmOZO ddlPmQZQ ddlRmSZT ddlRmUZV ddlRmWZX ddlRmYZYmZZZ ddlRm[Z\ ddl]m^Z_ ddl]m`Z` ddlFmaZambZbmcZc dd ldmeZemfZf dd!lgmhZhmiZimjZj dd"lkmlZl e%r<d d#lmmnZn ejod$krKd d%l#mpZpmqZq nd d&lrmsZs d d%ltmpZpmqZq e+d'Zue+d(Zve+d)d*d+Zwe+d,exeaZyepd-Zze*d.Z{dod3d4Z|e/j}j~Z~G d5d6 d6e_Z^e ZG d7d8 d8e'eh eFjeh ZG d9d: d:eFjZed;d<G d=d> d>eFjZed;d<G d?d@ d@eFjZed;d<G dAdB dBeFjZG dCdD dDe/jFjZe~dEZdFedE< dpdJdKZG dLdM dMe'ey ZG dNdO dOeeFjZG dPdQ dQeeFjZG dRdS dSeeFjZG dTdU dUeeFjZG dVdW dWeea eFjZG dXdY dYeea eFjZG dZd[ d[eex eFjZG d\d] d]eex eFjZG d^d_ d_eVZUG d`da daeXZWG dbdc dce\Z[G ddde deeTZSe~dfZdFedf< G dgdh dhZG didj djeFjZG dkdl dleDZG dmdn dneeZeZdS )q    )annotationsN)AsyncGeneratorAsyncIterator	AwaitableCallable
Collection	CoroutineIterableSequence)AbstractContextManager)Context)	dataclass)partialwraps)IOBase)PathLike)Signals)AddressFamily
SocketKind)TracebackType)
IOTYPE_CHECKINGAnyGenericLiteralNoReturn	ParamSpecTypeVarcastoverload)ErrorOutcomeValue)current_root_taskcurrent_tasknotify_closingwait_readablewait_writable)
SocketType)run_sync   )CapacityLimiterStatisticsEventStatisticsLockStatisticsRunFinishedErrorTaskInfo
WouldBlockabc)claim_worker_thread)BrokenResourceErrorBusyResourceErrorClosedResourceErrorEndOfStream)convert_ipv6_sockaddr)create_memory_object_streamCapacityLimiterEventLock)ResourceGuardSemaphoreStatistics	SemaphoreCancelScope)
TaskHandle)IPSockAddrTypeUDPPacketTypeUNIXDatagramPacketType)AsyncBackendStrOrBytesPath)T_contracall_for_coroutineget_callable_name)MemoryObjectSendStream)FileDescriptorLike)      )TypeVarTupleUnpack)BaseExceptionGroupTT_RetvalT_coT)	covariant
T_SockAddrPosArgsTPfunc Callable[P, Awaitable[T_Retval]]return*Callable[P, Coroutine[Any, Any, T_Retval]]c                   s   t  d	 fdd}|S )
NargsP.argskwargsP.kwargsr^   Coroutine[Any, Any, T_Retval]c                    sF   | i | t  tr S t  ts S td fdd}| S )Nr^   rV   c                     s    I d H S N rf   	awaitablerf   S/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/anyio/_backends/_trio.pyinner_wrapperz   s   
z;ensure_returns_coro.<locals>.wrapper.<locals>.inner_wrapperr^   rV   )
isinstancer   r   r   )r`   rb   rj   r\   rg   ri   wrappern   s   

z$ensure_returns_coro.<locals>.wrapper)r`   ra   rb   rc   r^   rd   )r   )r\   rn   rf   rm   ri   ensure_returns_corok   s   ro   c                   @  s   e Zd ZdZ	d)d*dd	Zd)d+ddZd,ddZd-ddZd)d.ddZe	d/ddZ
e
jd0d!dZ
e	d1d"d#Ze	d1d$d%Ze	d1d&d'Zejd2d(d'ZdS )3rD   
__originalNoriginaltrio.CancelScope | Nonerb   objectr^   c                 K  
   t | S re   rt   __new__)clsrr   rb   rf   rf   ri   rw      s   
zCancelScope.__new__r   Nonec                 K  s   |p	t jdi || _d S Nrf   )triorD   _CancelScope__original)selfrr   rb   rf   rf   ri   __init__   s   zCancelScope.__init__c                 C  s   | j   | S re   )r|   	__enter__r}   rf   rf   ri   r      s   
zCancelScope.__enter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Noneboolc                 C     | j |||S re   )r|   __exit__r}   r   r   r   rf   rf   ri   r         zCancelScope.__exit__reason
str | Nonec                 C     | j | d S re   )r|   cancel)r}   r   rf   rf   ri   r         zCancelScope.cancelfloatc                 C     | j jS re   r|   deadliner   rf   rf   ri   r         zCancelScope.deadlinevaluec                 C     || j _d S re   r   r}   r   rf   rf   ri   r         c                 C  r   re   )r|   cancel_calledr   rf   rf   ri   r      r   zCancelScope.cancel_calledc                 C  r   re   )r|   cancelled_caughtr   rf   rf   ri   r      r   zCancelScope.cancelled_caughtc                 C  r   re   r|   shieldr   rf   rf   ri   r      r   zCancelScope.shieldc                 C  r   re   r   r   rf   rf   ri   r      r   re   )rr   rs   rb   rt   r^   rD   )rr   rs   rb   r   r^   ry   )r^   rD   r   r   r   r   r   r   r^   r   )r   r   r^   ry   r^   r   r   r   r^   ry   r^   r   )r   r   r^   ry   )__name__
__module____qualname__	__slots__rw   r~   r   r   r   propertyr   setterr   r   r   rf   rf   rf   ri   rD      s(    

rD   c                   @  s2   e Zd ZU eZded< dZded< ddd
dZdS )_TrioTaskStatuszT_contra | objectearly_start_valueNz'trio.TaskStatus[T_contra | None] | Nonereal_task_statusr   T_contra | Noner^   ry   c                 C  s6   | j d u r| jturtd|| _d S | j | d S )Nz.called 'started' twice on the same task status)r   r   empty_start_valueRuntimeErrorstartedr   rf   rf   ri   r      s
   


z_TrioTaskStatus.startedre   )r   r   r^   ry   )r   r   r   r   r   __annotations__r   r   rf   rf   rf   ri   r      s   
 r   c                   @  sZ   e Zd Zd)ddZd*ddZd+ddZd,d-ddZdddd.ddZdddd/d'd(ZdS )0	TaskGroupr^   ry   c                 C  s$   d| _ d| _tjdd| _d | _d S )NFT)strict_exception_groups)_entered_activer{   open_nursery_nursery_managercancel_scoper   rf   rf   ri   r~      s   
zTaskGroup.__init__c                   s@   | j rtdd| _ d| _| j I d H | _t| jj| _| S )Nz*TaskGroup cannot be entered more than onceT)r   r   r   r   
__aenter___nurseryrD   r   r   rf   rf   ri   r      s   zTaskGroup.__aenter__r   r   r   r   r   r   r   c              
     sl   z.z| j |||I d H W W ~~d| _S  ty/ } z|tjd s*tj | d }~ww ~~d| _w )NF   )r   	__aexit__r   rT   splitr{   	Cancelled_create)r}   r   r   r   excrf   rf   ri   r      s   zTaskGroup.__aexit__NcoroCoroutine | Nonec                 C  s"   | j s|d ur|  tdd S )Nz;This task group is not active; no new tasks can be started.)r   closer   )r}   r   rf   rf   ri   _check_active   s   zTaskGroup._check_active)namecontextCoroutine[Any, Any, T_co]r   rt   r   Context | NoneTaskHandle[T_co]c                C  sp   t |tstd|jj | | t||}|d ur,|t| j	j
|j|jd |S | j	j
|j|jd |S )Nzexpected a coroutine, got r   )rl   r   	TypeError	__class__r   r   rE   runr   r   
start_soon	_run_coror   )r}   r   r   r   handlerf   rf   ri   create_task  s   


zTaskGroup.create_taskF)r   return_handler\   7Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]]r`   Unpack[PosArgsT]r   Literal[False] | Literal[True]r   c                  sP   d fdd}|    t}| jj||dI d H }|r&|_S |S )	Ntask_statustrio.TaskStatus[Any]r^   ry   c                   sP   t  }t |d}|jtur| |j n| |_t| I d H  d S )N)r   )r   rL   r   r   r   r   rE   r   )r   wrapper_task_statusr   r`   r\   r   r   rf   ri   run_coro_with_task_status!  s   

z2TaskGroup.start.<locals>.run_coro_with_task_statusr   )r   r   r^   ry   )r   rM   r   start_start_value)r}   r\   r   r   r`   r   
final_namestart_valuerf   r   ri   r     s   	
zTaskGroup.startr^   ry   )r^   r   r   re   )r   r   r^   ry   )r   r   r   rt   r   r   r^   r   )
r\   r   r`   r   r   rt   r   r   r^   r   )	r   r   r   r~   r   r   r   r   r   rf   rf   rf   ri   r      s    



r   F)eqc                   @  s,   e Zd ZU ded< dddd	ZdddZdS )ReceiveStreamWrapperztrio.abc.ReceiveStream_streamN	max_bytes
int | Noner^   bytesc              
     s   |d ur|dk rt dz| j|I d H }W n! tjy) } zt|jd }~w tjy9 } zt|jd }~ww |r@t|S tNr   z$max_bytes must be a positive integer)	
ValueErrorr   receive_somer{   r5   	__cause__r3   r   r6   r}   r   datar   rf   rf   ri   receiveD  s   zReceiveStreamWrapper.receivery   c                      | j  I d H  d S re   r   acloser   rf   rf   ri   r   T     zReceiveStreamWrapper.aclosere   )r   r   r^   r   r   )r   r   r   r   r   r   rf   rf   rf   ri   r   @  s   
 r   c                   @  s*   e Zd ZU ded< dddZdd	d
ZdS )SendStreamWrapperztrio.abc.SendStreamr   itemr   r^   ry   c              
     s^   z| j |I d H  W d S  tjy } zt|jd }~w tjy. } zt|jd }~ww re   )r   send_allr{   r5   r   r3   r}   r   r   rf   rf   ri   send\  s   zSendStreamWrapper.sendc                   r   re   r   r   rf   rf   ri   r   d  r   zSendStreamWrapper.acloseNr   r   r^   ry   r   )r   r   r   r   r   r   rf   rf   rf   ri   r   X  s   
 
r   c                   @  s   e Zd ZU ded< ded< ded< ded< d#d
dZd$ddZd#ddZd#ddZd%ddZe	d$ddZ
e	d&ddZe	d'ddZe	d(ddZe	d(d d!Zd"S ))Processztrio.Process_processabc.ByteSendStream | None_stdinabc.ByteReceiveStream | None_stdout_stderrr^   ry   c                   s   t dd) | jr| j I d H  | jr| j I d H  | jr(| j I d H  W d    n1 s2w   Y  z
|  I d H  W d S  tyi   |   t dd |  I d H  W d     1 scw   Y   w NT)r   )rD   r   r   r   r   waitBaseExceptionkillr   rf   rf   ri   r   o  s*   
zProcess.acloseintc                      | j  I d H S re   )r   r   r   rf   rf   ri   r        zProcess.waitc                 C     | j   d S re   )r   	terminater   rf   rf   ri   r       zProcess.terminatec                 C  r  re   )r   r   r   rf   rf   ri   r     r  zProcess.killsignalr   c                 C  r   re   )r   send_signal)r}   r  rf   rf   ri   r    r   zProcess.send_signalc                 C  r   re   )r   pidr   rf   rf   ri   r    r   zProcess.pidr   c                 C  r   re   )r   
returncoder   rf   rf   ri   r	    r   zProcess.returncodec                 C     | j S re   )r   r   rf   rf   ri   stdin     zProcess.stdinc                 C  r
  re   )r   r   rf   rf   ri   stdout  r  zProcess.stdoutc                 C  r
  re   )r   r   rf   rf   ri   stderr  r  zProcess.stderrNr   r^   r   )r  r   r^   ry   r^   r   )r^   r   )r^   r   )r   r   r   r   r   r   r  r   r  r   r  r	  r  r  r  rf   rf   rf   ri   r   h  s(   
 




r   c                      s   e Zd Zd fddZ  ZS )_ProcessPoolShutdownInstrumentr^   ry   c                   s   t    d S re   )super	after_runr   r   rf   ri   r    r  z(_ProcessPoolShutdownInstrument.after_runr   )r   r   r   r  __classcell__rf   rf   r  ri   r    s    r  &current_default_worker_process_limiterztrio.lowlevel.RunVarworkersset[abc.Process]ry   c                   s   zt tjI d H  W d S  t jyI   | D ]}|jd u r"|  qtdd | D ]	}| I d H  q+W d    Y d S 1 sAw   Y  Y d S w r   )	r{   sleepmathinfr   r	  r   rD   r   )r  processrf   rf   ri   _shutdown_process_pool  s   
&r  c                   @  sB   e Zd ZdddZdddZedd
dZdddZdddZdS )_TrioSocketMixintrio_socketTrioSocketTyper^   ry   c                 C  s   || _ d| _d S NF)_trio_socket_closedr}   r  rf   rf   ri   r~     s   
z_TrioSocketMixin.__init__c                 C  s    | j rt| j dk rtd S Nr   )r#  r5   r"  filenor3   r   rf   rf   ri   _check_closed  s
   z_TrioSocketMixin._check_closedsocket.socketc                 C  r   re   )r"  _sockr   rf   rf   ri   _raw_socket  r   z_TrioSocketMixin._raw_socketc                   s(   | j  dkrd| _| j   d S d S )Nr   T)r"  r&  r#  r   r   rf   rf   ri   r     s
   z_TrioSocketMixin.acloser   r   r   c                 C  s@   t |tjr	t|| j dk r| jrtd t |trt||r%  )rl   r{   r5   r"  r&  r#  OSErrorr3   r}   r   rf   rf   ri   _convert_socket_error  s   
z&_TrioSocketMixin._convert_socket_errorNr  r   r^   ry   r   )r^   r(  )r   r   r^   r   )	r   r   r   r~   r'  r   r*  r   r-  rf   rf   rf   ri   r    s    


r  c                      s>   e Zd Zd fddZddddZdddZdddZ  ZS )SocketStreamr  r   r^   ry   c                   $   t  | td| _td| _d S Nreading from
writing tor  r~   r?   _receive_guard_send_guardr$  r  rf   ri   r~        
zSocketStream.__init__   r   r   r   c                   s   |dk r	t d| j1 z| j|I d H }W n ty/ } z| | W Y d }~nd }~ww |r;|W  d    S t1 s@w   Y  d S r   )r   r5  r"  recvr   r-  r6   r   rf   rf   ri   r     s   	zSocketStream.receiver   c                   s   | j B t|}|r>z| j|I d H }W n ty- } z| | W Y d }~nd }~ww ||d  }|sW d    d S W d    d S 1 sIw   Y  d S re   )r6  
memoryviewr"  r   r   r-  )r}   r   view
bytes_sentr   rf   rf   ri   r     s   "zSocketStream.sendc                   s   | j tj d S re   )r"  shutdownsocketSHUT_WRr   rf   rf   ri   send_eof  s   zSocketStream.send_eofr.  )r8  )r   r   r^   r   r   r   )r   r   r   r~   r   r   r@  r  rf   rf   r  ri   r/    s
    
r/  c                   @  s    e Zd ZdddZdddZdS )UNIXSocketStreammsglenr   maxfdsr^   tuple[bytes, list[int]]c                   sR  t |tr
|dk rtdt |tr|dk rtdtd}tj I d H  | j? 	 z| j	|t
||j I d H \}}}}W n tyZ } z| | W Y d }~nd }~ww |sa|satnq-W d    n1 smw   Y  |D ].\}	}
}|	t
jks|
t
jkrtd|d|	 d	|
 ||d t|t||j    qt|t|fS )
Nr   z%msglen must be a non-negative integerr   z!maxfds must be a positive integeriTz.Received unexpected ancillary data; message = z, cmsg_level = z, cmsg_type = )rl   r   r   arrayr{   lowlevel
checkpointr5  r"  recvmsgr>  CMSG_LENitemsizer   r-  r6   
SOL_SOCKET
SCM_RIGHTSr   	frombyteslenlist)r}   rB  rC  fdsmessageancdataflagsaddrr   
cmsg_level	cmsg_type	cmsg_datarf   rf   ri   receive_fds  sD   
&zUNIXSocketStream.receive_fdsrR  r   rQ  Collection[int | IOBase]ry   c                   s   |st d|st dg }|D ]}t|tr|| qt|tr*||  qtd|}tj	 I d H  | j
6 	 z| j|gtjtj|fgI d H  W n tyh } z| | W Y d }~nd }~ww q>W d    d S 1 suw   Y  d S )Nzmessage must not be emptyzfds must not be emptyrE  )r   rl   r   appendr   r&  rF  r{   rG  rH  r6  r"  sendmsgr>  rL  rM  r   r-  )r}   rR  rQ  filenosfdfdarrayr   rf   rf   ri   send_fds"  sB   



"zUNIXSocketStream.send_fdsN)rB  r   rC  r   r^   rD  )rR  r   rQ  rZ  r^   ry   )r   r   r   rY  r`  rf   rf   rf   ri   rA     s    
!rA  c                      (   e Zd Zd	 fddZd
ddZ  ZS )TCPSocketListener
raw_socketr(  c                   "   t  tj| td| _d S Nzaccepting connections fromr  r~   r{   r>  from_stdlib_socketr?   _accept_guardr}   rc  r  rf   ri   r~   D     zTCPSocketListener.__init__r^   r/  c                   s   | j , z| j I d H \}}W n ty( } z| | W Y d }~nd }~ww W d    n1 s3w   Y  |tjtjd t	|S Nr   )
rh  r"  acceptr   r-  
setsockoptr>  IPPROTO_TCPTCP_NODELAYr/  r}   r  _addrr   rf   rf   ri   rl  H  s   zTCPSocketListener.acceptrc  r(  )r^   r/  r   r   r   r~   rl  r  rf   rf   r  ri   rb  C      rb  c                      ra  )UNIXSocketListenerrc  r(  c                   rd  re  rf  ri  r  rf   ri   r~   T  rj  zUNIXSocketListener.__init__r^   rA  c                   s   | j 9 z| j I d H \}}W n ty( } z| | W Y d }~nd }~ww W d    t|S W d    t|S 1 s@w   Y  t|S re   )rh  r"  rl  r   r-  rA  rp  rf   rf   ri   rl  X  s    

zUNIXSocketListener.acceptrr  )r^   rA  rs  rf   rf   r  ri   ru  S  rt  ru  c                      s2   e Zd Zd fddZddd	ZdddZ  ZS )	UDPSocketr  r   r^   ry   c                   r0  r1  r4  r$  r  rf   ri   r~   c  r7  zUDPSocket.__init__tuple[bytes, IPSockAddrType]c                   s   | j : z| jdI d H \}}|t|fW W  d    S  ty5 } z| | W Y d }~nd }~ww W d    d S 1 sAw   Y  d S Nr8  )r5  r"  recvfromr7   r   r-  r}   r   rU  r   rf   rf   ri   r   h  s   "zUDPSocket.receiver   rG   c                      | j 4 z| jj| I d H  W n ty' } z| | W Y d }~nd }~ww W d    d S W d    d S 1 s;w   Y  d S re   r6  r"  sendtor   r-  r   rf   rf   ri   r   p     "zUDPSocket.sendr.  )r^   rw  )r   rG   r^   ry   r   r   r   r~   r   r   r  rf   rf   r  ri   rv  b      
rv  c                      2   e Zd Zd fddZddd	ZdddZ  ZS )ConnectedUDPSocketr  r   r^   ry   c                   r0  r1  r4  r$  r  rf   ri   r~   y  r7  zConnectedUDPSocket.__init__r   c                      | j 2 z| jdI d H W W  d    S  ty- } z| | W Y d }~nd }~ww W d    d S 1 s9w   Y  d S rx  r5  r"  r9  r   r-  r,  rf   rf   ri   r   ~     "zConnectedUDPSocket.receiver   c                      | j 4 z| j|I d H  W n ty' } z| | W Y d }~nd }~ww W d    d S W d    d S 1 s;w   Y  d S re   r6  r"  r   r   r-  r   rf   rf   ri   r     r~  zConnectedUDPSocket.sendr.  r^   r   r   r  rf   rf   r  ri   r  x  s    
r  c                      r  )UNIXDatagramSocketr  r   r^   ry   c                   r0  r1  r4  r$  r  rf   ri   r~     r7  zUNIXDatagramSocket.__init__rH   c                   s   | j 8 z| jdI d H \}}||fW W  d    S  ty3 } z| | W Y d }~nd }~ww W d    d S 1 s?w   Y  d S rx  )r5  r"  ry  r   r-  rz  rf   rf   ri   r     s   "zUNIXDatagramSocket.receiver   c                   r{  re   r|  r   rf   rf   ri   r     r~  zUNIXDatagramSocket.sendr.  )r^   rH   )r   rH   r^   ry   r  rf   rf   r  ri   r    r  r  c                      r  )ConnectedUNIXDatagramSocketr  r   r^   ry   c                   r0  r1  r4  r$  r  rf   ri   r~     r7  z$ConnectedUNIXDatagramSocket.__init__r   c                   r  rx  r  r,  rf   rf   ri   r     r  z#ConnectedUNIXDatagramSocket.receiver   c                   r  re   r  r   rf   rf   ri   r     r~  z ConnectedUNIXDatagramSocket.sendr.  r  r   r  rf   rf   r  ri   r    s    
r  c                   @  sL   e Zd ZdZdddZdddZdd	d
ZdddZdddZdddZ	dS )r<   rp   r^   c                 C  ru   re   rv   rx   rf   rf   ri   rw        
zEvent.__new__ry   c                 C  s   t  | _d S re   )r{   r<   _Event__originalr   rf   rf   ri   r~     r  zEvent.__init__r   c                 C  
   | j  S re   )r  is_setr   rf   rf   ri   r    r  zEvent.is_setc                   r  re   )r  r   r   rf   rf   ri   r     r  z
Event.waitr,   c                 C  s   | j  }t|jdS )N)tasks_waiting)r  
statisticsr,   r  r}   orig_statisticsrf   rf   ri   r    s   
zEvent.statisticsc                 C  r  re   )r  setr   rf   rf   ri   r    r  z	Event.setN)r^   r<   r   r   )r^   r,   )
r   r   r   r   rw   r~   r  r   r  r  rf   rf   rf   ri   r<     s    




r<   c                   @  sp   e Zd ZdZdddddZdddd
dZedddZdddZdddZ	d ddZ
dddZd!ddZdS )"r>   )_fast_acquirerq   Ffast_acquirer  r   r^   c                C  ru   re   rv   rx   r  rf   rf   ri   rw     r  zLock.__new__ry   c                C  s   || _ t | _d S re   )r  r{   r>   _Lock__original)r}   r  rf   rf   ri   r~     s   zLock.__init__r   r   c                 C  s   | j dkr
d| _ d S d S )N)z*attempt to re-acquire an already held Lock)z)Attempted to acquire an already held Lock)r`   )r   rf   rf   ri   _convert_runtime_error_msg  s   

zLock._convert_runtime_error_msgc              
     s   | j s"z| j I d H  W d S  ty! } z| |  d }~ww tj I d H  z| j  W d S  tj	yF   | jj
 I d H  Y d S  tyW } z| |  d }~ww re   )r  r  acquirer   r  r{   rG  checkpoint_if_cancelledacquire_nowaitr0   _lotparkr,  rf   rf   ri   r    s(   

zLock.acquirec              
   C  sJ   z| j   W d S  tjy   td  ty$ } z| |  d }~ww re   )r  r  r{   r0   r   r  r,  rf   rf   ri   r    s   
zLock.acquire_nowaitc                 C  r  re   )r  lockedr   rf   rf   ri   r    r  zLock.lockedc                 C  r  re   )r  releaser   rf   rf   ri   r    r  zLock.releaser-   c                 C  s.   | j  }|jrt|jnd }t|j||jS re   )r  r  ownerTrioTaskInfor-   r  r  )r}   r  r  rf   rf   ri   r    s
   

zLock.statisticsNr  r   r^   r>   )r  r   r^   ry   )r   r   r^   ry   r   r   )r^   r-   )r   r   r   r   rw   r~   staticmethodr  r  r  r  r  r  rf   rf   rf   ri   r>     s    


	
r>   c                      s   e Zd ZdZddddddZdddd fddZd ddZd ddZed!ddZ	ed"ddZ
d ddZd#ddZ  ZS )$rB   rp   NF	max_valuer  initial_valuer   r  r   r  r   r^   c                C  ru   re   rv   rx   r  r  r  rf   rf   ri   rw     s   
zSemaphore.__new__ry   c                  s&   t  j|||d tj||d| _d S )Nr  )r  )r  r~   r{   rB   _Semaphore__original)r}   r  r  r  r  rf   ri   r~     s   zSemaphore.__init__c                   sf   | j s| j I d H  d S tj I d H  z| j  W d S  tjy2   | jj	 I d H  Y d S w re   )
r  r  r  r{   rG  r  r  r0   r  r  r   rf   rf   ri   r  &  s   zSemaphore.acquirec                 C  (   z| j   W d S  tjy   td w re   )r  r  r{   r0   r   rf   rf   ri   r  2  
   zSemaphore.acquire_nowaitc                 C  r   re   )r  r  r   rf   rf   ri   r  8  r   zSemaphore.max_valuec                 C  r   re   )r  r   r   rf   rf   ri   r   <  r   zSemaphore.valuec                 C  r  re   )r  r  r   rf   rf   ri   r  @  r  zSemaphore.releaser@   c                 C  s   | j  }t|jS re   )r  r  r@   r  r  rf   rf   ri   r  C  s   

zSemaphore.statistics)r  r   r  r   r  r   r^   rB   )r  r   r  r   r  r   r^   ry   r   r  r  )r^   r@   )r   r   r   r   rw   r~   r  r  r   r  r   r  r  r  rf   rf   r  ri   rB     s     



rB   c                   @  s   e Zd ZdZ	d3ddd4d	d
Z	d3ddd5ddZd6ddZd7ddZed8ddZ	e	j
d9ddZ	ed:ddZed8d d!Zd6d"d#Zd;d&d'Zd6d(d)Zd;d*d+Zd6d,d-Zd;d.d/Zd<d1d2ZdS )=r:   rp   Nrr   total_tokensfloat | Nonerr   trio.CapacityLimiter | Noner^   c                C  ru   re   rv   )rx   r  rr   rf   rf   ri   rw   K  s   
zCapacityLimiter.__new__ry   c                C  s.   |d ur	|| _ d S |d usJ t|| _ d S re   )_CapacityLimiter__originalr{   r:   )r}   r  rr   rf   rf   ri   r~   S  s   
zCapacityLimiter.__init__c                   r  re   )r  r   r   rf   rf   ri   r   _  r  zCapacityLimiter.__aenter__r   r   r   r   r   r   c                   s   | j |||I d H  d S re   )r  r   r   rf   rf   ri   r   b  s   zCapacityLimiter.__aexit__r   c                 C  r   re   r  r  r   rf   rf   ri   r  j  r   zCapacityLimiter.total_tokensr   c                 C  r   re   r  r   rf   rf   ri   r  n  r   r   c                 C  r   re   )r  borrowed_tokensr   rf   rf   ri   r  r  r   zCapacityLimiter.borrowed_tokensc                 C  r   re   )r  available_tokensr   rf   rf   ri   r  v  r   z CapacityLimiter.available_tokensc                 C  r  re   )r  r  r{   r0   r   rf   rf   ri   r  z  r  zCapacityLimiter.acquire_nowaitborrowerrt   c                 C  s*   z	| j | W d S  tjy   td w re   )r  acquire_on_behalf_of_nowaitr{   r0   r}   r  rf   rf   ri   r    s
   z+CapacityLimiter.acquire_on_behalf_of_nowaitc                   r   re   )r  r  r   rf   rf   ri   r    r   zCapacityLimiter.acquirec                   s   | j |I d H  d S re   )r  acquire_on_behalf_ofr  rf   rf   ri   r    s   z$CapacityLimiter.acquire_on_behalf_ofc                 C  r  re   )r  r  r   rf   rf   ri   r    r  zCapacityLimiter.releasec                 C  s   | j |S re   )r  release_on_behalf_ofr  rf   rf   ri   r    s   z$CapacityLimiter.release_on_behalf_ofr+   c                 C  s&   | j  }t|j|jt|j|jdS )N)r  r  	borrowersr  )r  r  r+   r  r  tupler  r  )r}   origrf   rf   ri   r    s   
zCapacityLimiter.statisticsre   )r  r  rr   r  r^   r:   )r  r  rr   r  r^   ry   r   )r   r   r   r   r   r   r^   ry   r   r   r  )r  rt   r^   ry   )r^   r+   )r   r   r   r   rw   r~   r   r   r   r  r   r  r  r  r  r  r  r  r  r  rf   rf   rf   ri   r:   H  s6    








r:   _capacity_limiter_wrapperc                   @  sH   e Zd ZU ded< dddZddd	ZdddZdddZdddZdS )_SignalReceiverzAsyncIterator[int]	_iteratorsignalstuple[Signals, ...]c                 C  s
   || _ d S re   )_signals)r}   r  rf   rf   ri   r~     r  z_SignalReceiver.__init__r^   c                 C  s   t j| j | _| j | _| S re   )r{   open_signal_receiverr  _cmr   r  r   rf   rf   ri   r     s   z_SignalReceiver.__enter__r   r   r   r   r   r   bool | Nonec                 C  r   re   )r  r   r   rf   rf   ri   r     r   z_SignalReceiver.__exit__c                 C  s   | S re   rf   r   rf   rf   ri   	__aiter__  s   z_SignalReceiver.__aiter__r   c                   s   | j  I d H }t|S re   )r  	__anext__r   )r}   signumrf   rf   ri   r    s   z_SignalReceiver.__anext__N)r  r  )r^   r  )r   r   r   r   r   r   r^   r  )r^   r   )	r   r   r   r   r~   r   r   r  r  rf   rf   rf   ri   r    s   
 



r  c                   @  sf   e Zd Zd/ddZd0ddZd1ddZd2ddZd3ddZd4dd Zd5d%d&Z	d6d(d)Z
d7d,d-Zd.S )8
TestRunneroptionsr   r^   ry   c                 K  s$   ddl m} | | _d | _|| _d S )Nr   )Queue)queuer  _call_queue_send_stream_options)r}   r  r  rf   rf   ri   r~     s
   
zTestRunner.__init__r   r   r   r   r   types.TracebackType | Nonec                 C  s<   | j r| j   | j d ur| j   | j d usd S d S d S re   )r  r   r  getr   rf   rf   ri   r     s   

zTestRunner.__exit__r   c                 C  
   t j S re   )r{   rG  in_trio_taskr   rf   rf   ri   
is_running  r  zTestRunner.is_runningc                   s   t ttt tt f  d\| _}|= |2 z03 d H W \}}z|I d H }W n ty? } z|t	| W Y d }~qd }~ww |t
| q6 W d    d S 1 sTw   Y  d S rk  )r8   r  r   r   rP  r!   r  r   r[  r    r"   )r}   receive_streamrh   outcome_holderretvalr   rf   rf   ri   _run_tests_and_fixtures  s"   
"z"TestRunner._run_tests_and_fixturesoutcomert   c                 C  s
   d | _ d S re   )r  )r}   r  rf   rf   ri   _main_task_finished  r  zTestRunner._main_task_finishedr\   r]   r`   ra   rb   rc   rV   c                O  s   | j d u r'tjj| jf| jj| jd| j | j d u r'| j	   | j d u sg }| j 
||i ||f |s@| j	   |r8|d  S )N)run_sync_soon_threadsafedone_callbackr   )r  r{   rG  start_guest_runr  r  putr  r  r  send_nowaitunwrap)r}   r\   r`   rb   r  rf   rf   ri   _call_in_runner_task  s$   


zTestRunner._call_in_runner_taskfixture_func,Callable[..., AsyncGenerator[T_Retval, Any]]dict[str, Any]Iterable[T_Retval]c                 c  s`    |di |}|  |jd }|V  z	|  |jd  W n
 ty%   Y d S w |  |j td)Nz$Async generator fixture did not stoprf   )r  asendStopAsyncIterationr   r   )r}   r  rb   asyncgenfixturevaluerf   rf   ri   run_asyncgen_fixture  s   zTestRunner.run_asyncgen_fixture,Callable[..., Coroutine[Any, Any, T_Retval]]c                 C  s   | j |fi |S re   r  )r}   r  rb   rf   rf   ri   run_fixture  s   zTestRunner.run_fixture	test_func'Callable[..., Coroutine[Any, Any, Any]]c                 C  s   | j |fi | d S re   r  )r}   r  rb   rf   rf   ri   run_test  s   zTestRunner.run_testN)r  r   r^   ry   )r   r   r   r   r   r  r^   ry   r   r   )r  rt   r^   ry   )r\   r]   r`   ra   rb   rc   r^   rV   )r  r  rb   r  r^   r  )r  r  rb   r  r^   rV   )r  r  rb   r  r^   ry   )r   r   r   r~   r   r  r  r  r  r  r  r  rf   rf   rf   ri   r    s    

	





r  c                      ra  )r  tasktrio.lowlevel.Taskc                   sH   d }|j r|j jrt|j j}t t|||j|j t|| _	d S re   )
parent_nurseryparent_taskidr  r~   r   r   weakrefproxy_task)r}   r  	parent_idr  rf   ri   r~   $  s
   zTrioTaskInfo.__init__r^   r   c                 C  s"   z| j jjW S  ty   Y dS w r!  )r  _cancel_statuseffectively_cancelledReferenceErrorr   rf   rf   ri   has_pending_cancellation,  s
   z%TrioTaskInfo.has_pending_cancellation)r  r  r   )r   r   r   r~   r  r  rf   rf   r  ri   r  #  s    r  c                   @  s  e Zd Zedd
dZedddZedddZedddZedddZedddZ	edddZ
edddZeejdd dd%d&Zedd'd(Zedd*d+Zedd-d.Zedd1d2Zed3dd4dd:d;Zedd>d?Ze		3dddDdEZeddFdGZeddKdLZeddMdNZeddWdXZedd[d\Ze	3dddcddZeddhdiZeddmdnZeddodpZeddvdwZee dd{d|Z!ee dd~d|Z!eddd|Z!eddddddddZ"e	ddddZ#edddZ$edddZ%edddZ&edddZ'edddZ(edddZ)edddZ*edddZ+edddZ,edddZ-edddZ.edddZ/edddZ0edddZ1edddZ2edddZ3d3S )TrioBackendr\   1Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]]r`   tuple[Unpack[PosArgsT]]rb   r  r  r^   rV   c                 C  s(   |rJ dt jt|g|R i |S )Nz&unreachable, and not supported by Trio)r{   r   ro   )rx   r\   r`   rb   r  rf   rf   ri   r   6  s   zTrioBackend.runrt   c                 C  r  re   )r{   rG  current_trio_tokenr  rf   rf   ri   current_tokenA     
zTrioBackend.current_tokenr   c                 C     t  S re   )r{   current_timer  rf   rf   ri   r  E  r   zTrioBackend.current_timetype[BaseException]c                 C  s   t jS re   )r{   r   r  rf   rf   ri   cancelled_exception_classI  r  z%TrioBackend.cancelled_exception_classry   c                      t j I d H  d S re   )r{   rG  rH  r  rf   rf   ri   rH  M     zTrioBackend.checkpointc                   r  re   )r{   rG  r  r  rf   rf   ri   r  Q  r	  z#TrioBackend.checkpoint_if_cancelledc                   r  re   )r{   rG  cancel_shielded_checkpointr  rf   rf   ri   r
  U  r	  z&TrioBackend.cancel_shielded_checkpointdelayc                   s   t |I d H  d S re   )r{   r  )rx   r  rf   rf   ri   r  Y  r	  zTrioBackend.sleepFr   r   r   r   r   abc.CancelScopec                C  s   t ||dS )Nr  rC   )rx   r   r   rf   rf   ri   create_cancel_scope]  s   zTrioBackend.create_cancel_scopec                 C  r  re   )r{   current_effective_deadliner  rf   rf   ri   r  c  r   z&TrioBackend.current_effective_deadlineabc.TaskGroupc                 C     t  S re   )r   r  rf   rf   ri   create_task_groupg  r  zTrioBackend.create_task_group	abc.Eventc                 C  r  re   r;   r  rf   rf   ri   create_eventk  r  zTrioBackend.create_eventr  r>   c                C  s
   t |dS )Nr  r=   r  rf   rf   ri   create_locko  r  zTrioBackend.create_lockNr  r  r   r  r   abc.Semaphorec                C  s   t |||dS )Nr  rA   r  rf   rf   ri   create_semaphores  s   zTrioBackend.create_semaphorer  r:   c                 C     t |S re   r9   )rx   r  rf   rf   ri   create_capacity_limiter}  r   z#TrioBackend.create_capacity_limiter&Callable[[Unpack[PosArgsT]], T_Retval]abandon_on_cancellimiterabc.CapacityLimiter | Nonec                   s8   d fdd}t  t||ttj|dI d H S )Nr^   rV   c                     s6   t t   W  d    S 1 sw   Y  d S re   )r2   r  rf   r`   r\   tokenrf   ri   rn     s   $z6TrioBackend.run_sync_in_worker_thread.<locals>.wrapper)r  r  rk   )r  r  r)   r   r{   r:   )rx   r\   r`   r  r  rn   rf   r  ri   run_sync_in_worker_thread  s   
z%TrioBackend.run_sync_in_worker_threadc                 C  s   t j  d S re   )r{   from_threadcheck_cancelledr  rf   rf   ri   r"       zTrioBackend.check_cancelledr   r  rW   c                 C  >   t d|}ztjj|g|R d|iW S  tjy   td w Nztrio.lowlevel.TrioToken | None
trio_token)r   r{   r!  r   r.   rx   r\   r`   r  r&  rf   rf   ri   run_async_from_thread     
z!TrioBackend.run_async_from_threadc                 C  r$  r%  )r   r{   r!  r)   r.   r'  rf   rf   ri   run_sync_from_thread  r)  z TrioBackend.run_sync_from_threadcommand)StrOrBytesPath | Sequence[StrOrBytesPath]r  int | IO[Any] | Noner  r  r   r   c          
        s   ddd t |tttfr#tjj |f|||dd|I d H }ntjj fd	d
|D f|||dd|I d H }|jrDt|jnd }|j	rNt
|j	nd }|jrXt
|jnd }	t||||	S )Nr   rJ   r^   strc                 S  s"   t | }t|tr|S t |S re   )osfspathrl   r.  fsdecode)r   str_or_bytesrf   rf   ri   convert_item  s   


z.TrioBackend.open_process.<locals>.convert_itemT)r  r  r  shellc                   s   g | ]} |qS rf   rf   ).0r   r3  rf   ri   
<listcomp>  s    z,TrioBackend.open_process.<locals>.<listcomp>F)r   rJ   r^   r.  )rl   r.  r   r   r{   rG  open_processr  r   r  r   r  r   )
rx   r+  r  r  r  rb   r  stdin_streamstdout_streamstderr_streamrf   r6  ri   r8    s6   

		zTrioBackend.open_processr  r  c                 C  s   t jt| d S re   )r{   rG  spawn_system_taskr  )rx   r  rf   rf   ri   #setup_process_pool_exit_at_shutdown  s   z/TrioBackend.setup_process_pool_exit_at_shutdownhostr.  portlocal_addressIPSockAddrType | Noner/  c                   s   d|v rt jnt j}tj  |}|t jt jd |r$||I d H  z|||fI d H  W t|S  t	y?   |
   w )N:r   )r>  AF_INET6AF_INETr{   rm  rn  ro  bindconnectr   r   r/  )rx   r>  r?  r@  familyr  rf   rf   ri   connect_tcp  s   zTrioBackend.connect_tcppathstr | bytesabc.UNIXSocketStreamc                   sD   t jtj}z||I d H  W t|S  ty!   |   w re   )r{   r>  AF_UNIXrF  r   r   rA  )rx   rI  r  rf   rf   ri   connect_unix  s   zTrioBackend.connect_unixsockr(  abc.SocketListenerc                 C  r  re   )rb  rx   rN  rf   rf   ri   create_tcp_listener  r   zTrioBackend.create_tcp_listenerc                 C  r  re   )ru  rP  rf   rf   ri   create_unix_listener   r   z TrioBackend.create_unix_listenerrG  socket.AddressFamilyremote_address
reuse_portUDPSocket | ConnectedUDPSocketc                   sb   t jj|tjd}|r|tjtjd |r||I d H  |r-||I d H  t|S t	|S )N)rG  typer   )
r{   r>  
SOCK_DGRAMrm  rL  SO_REUSEPORTrE  rF  r  rv  )rx   rG  r@  rT  rU  r  rf   rf   ri   create_udp_socket  s   zTrioBackend.create_udp_socketrc  remote_pathabc.UNIXDatagramSocketc                      d S re   rf   rx   rc  r[  rf   rf   ri   create_unix_datagram_socket     z'TrioBackend.create_unix_datagram_socketabc.ConnectedUNIXDatagramSocketc                   r]  re   rf   r^  rf   rf   ri   r_     r`  str | bytes | None8abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocketc                   s2   t j|}|r||I d H  t|S t|S re   )r{   r>  rg  rF  r  r  )rx   rc  r[  r  rf   rf   ri   r_  &  s   r   )rG  rW  protorT  bytes | str | Nonestr | int | Noneint | AddressFamilyrW  int | SocketKindrd  rT  uSequence[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes]]]c                  s   t j||||||I d H S re   )r{   r>  getaddrinfo)rx   r>  r?  rG  rW  rd  rT  rf   rf   ri   rj  2  s   zTrioBackend.getaddrinfosockaddrrF   tuple[str, str]c                   s   t j||I d H S re   )r{   r>  getnameinfo)rx   rk  rT  rf   rf   ri   rm  G  s   zTrioBackend.getnameinfoobjrO   c              
     Z   z
t |I d H  W d S  tjy  } zt |jd d }~w tjy,   tdd w )Nr2  )r&   r{   r5   with_traceback__traceback__r4   rx   rn  r   rf   rf   ri   r&   M     
zTrioBackend.wait_readablec              
     ro  )Nr3  )r'   r{   r5   rp  rq  r4   rr  rf   rf   ri   r'   V  rs  zTrioBackend.wait_writablec                 C  s   t | d S re   )r%   )rx   rn  rf   rf   ri   r%   _  r   zTrioBackend.notify_closingc                   s(   t tdr|jtjkrt|S t|S )NrL  )hasattrr>  rG  rL  ru  rb  rP  rf   rf   ri   wrap_listener_socketc  s   z TrioBackend.wrap_listener_socketc                      t j|}t|S re   )r{   r>  rg  r/  rx   rN  	trio_sockrf   rf   ri   wrap_stream_socketj     zTrioBackend.wrap_stream_socketrA  c                   rv  re   )r{   r>  rg  rA  rw  rf   rf   ri   wrap_unix_stream_socketo  rz  z#TrioBackend.wrap_unix_stream_socketrv  c                   rv  re   )r{   r>  rg  rv  rw  rf   rf   ri   wrap_udp_sockett  rz  zTrioBackend.wrap_udp_socketr  c                   rv  re   )r{   r>  rg  r  rw  rf   rf   ri   wrap_connected_udp_sockety  rz  z%TrioBackend.wrap_connected_udp_socketr  c                   rv  re   )r{   r>  rg  r  rw  rf   rf   ri   wrap_unix_datagram_socket~  rz  z%TrioBackend.wrap_unix_datagram_socketr  c                   rv  re   )r{   r>  rg  r  rw  rf   rf   ri   #wrap_connected_unix_datagram_socket  s   z/TrioBackend.wrap_connected_unix_datagram_socketc                 C  s<   zt  W S  ty   ttj d}t | | Y S w )Nr  )r  r  LookupErrorr:   r{   	to_threadcurrent_default_thread_limiterr  )rx   r  rf   rf   ri   r    s   

z*TrioBackend.current_default_thread_limiterr  r   .AbstractContextManager[AsyncIterator[Signals]]c                 G  r  re   )r  )rx   r  rf   rf   ri   r    s   z TrioBackend.open_signal_receiverr/   c                 C  s   t  }t|S re   )r$   r  )rx   r  rf   rf   ri   get_current_task  s   zTrioBackend.get_current_taskSequence[TaskInfo]c                 C  sb   t  }|sJ t|g}|j}|r/g }|D ]}|jD ]}|t| ||j qq|}|s|S re   )r#   r  child_nurserieschild_tasksr[  extend)rx   	root_task
task_infos	nurseriesnew_nurseriesnurseryr  rf   rf   ri   get_running_tasks  s   

	zTrioBackend.get_running_tasksc                   s   ddl m} | I d H  d S )Nr   )wait_all_tasks_blocked)trio.testingr  )rx   r  rf   rf   ri   r    s   z"TrioBackend.wait_all_tasks_blockedr  c                 C  s   t di |S rz   )r  )rx   r  rf   rf   ri   create_test_runner  r#  zTrioBackend.create_test_runner)
r\   r  r`   r   rb   r  r  r  r^   rV   )r^   rt   r   )r^   r  r   )r  r   r^   ry   )r   r   r   r   r^   r  )r^   r  )r^   r  r  )r  r   r  r   r  r   r^   r  )r  r   r^   r:   )FN)
r\   r  r`   r   r  r   r  r  r^   rV   )r\   r   r`   r   r  rt   r^   rW   )r\   r  r`   r   r  rt   r^   rV   )r+  r,  r  r-  r  r-  r  r-  rb   r   r^   r   r  r  r^   ry   re   )r>  r.  r?  r   r@  rA  r^   r/  )rI  rJ  r^   rK  )rN  r(  r^   rO  )
rG  rS  r@  rA  rT  rA  rU  r   r^   rV  )rc  r(  r[  ry   r^   r\  )rc  r(  r[  rJ  r^   ra  )rc  r(  r[  rb  r^   rc  )r>  re  r?  rf  rG  rg  rW  rh  rd  r   rT  r   r^   ri  )r   )rk  rF   rT  r   r^   rl  )rn  rO   r^   ry   )rN  r(  r^   r/  )rN  r(  r^   rA  )rN  r(  r^   rv  )rN  r(  r^   r  )rN  r(  r^   r  )rN  r(  r^   r  )r^   r:   )r  r   r^   r  )r^   r/   )r^   r  )r  r  r^   r  )4r   r   r   classmethodr   r  r  r  rH  r  r
  r  r  r  r  r  r  r  r  r  r  r   r"  r(  r*  r8  r=  rH  rM  rQ  rR  rZ  r   r_  rj  rm  r&   r'   r%   ru  ry  r{  r|  r}  r~  r  r  r  r  r  r  r  rf   rf   rf   ri   r  5  s    
	(

r  )r\   r]   r^   r_   r  )
__future__r   rF  r  r/  r>  systypesr  collections.abcr   r   r   r   r   r   r	   r
   
contextlibr   contextvarsr   dataclassesr   	functoolsr   r   ior   r   r  r   r   r   r   typingr   r   r   r   r   r   r   r   r   r   trio.from_threadr{   trio.lowlevelr  r    r!   r"   r#   r$   r%   r&   r'   trio.socketr(   r   trio.to_threadr)    r+   r,   r-   r.   r/   r0   r1   _core._eventloopr2   _core._exceptionsr3   r4   r5   r6   _core._socketsr7   _core._streamsr8   _core._synchronizationr:   BaseCapacityLimiterr<   	BaseEventr>   BaseLockr?   r@   rB   BaseSemaphore_core._tasksrD   BaseCancelScoperE   rF   rG   rH   abc._eventlooprI   rJ   
abc._tasksrK   rL   rM   streams.memoryrN   	_typeshedrO   version_inforR   rS   exceptiongrouprT   typing_extensionsrU   rV   rW   r.  rY   rZ   r[   ro   rG  RunVarrt   r   
TaskStatusr   r   ByteReceiveStreamr   ByteSendStreamr   r   
Instrumentr  r  r   r  r  r/  rA  SocketListenerrb  ru  rv  r  r  r  r  r  r  r  r  backend_classrf   rf   rf   ri   <module>   s    (
0$	
7i8
$C

:8T _   
