a
    If                     @   s  d Z ddlZejdkred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 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 ddlmZ ddlmZ dZdZdZdZdZdZdZG dd dejZ G dd dejZ!G dd de!Z"G dd de!Z#G dd de$Z%G dd  d ej&Z'G d!d" d"ej(Z)G d#d$ d$Z*G d%d& d&ej+Z,e'Z-G d'd( d(ej.Z/G d)d* d*ej.Z0e0Z1dS )+z.Selector and proactor event loops for Windows.    NZwin32z
win32 only   )events)base_subprocess)futures)
exceptions)proactor_events)selector_events)tasks)windows_utils)logger)SelectorEventLoopProactorEventLoopIocpProactorDefaultEventLoopPolicyWindowsSelectorEventLoopPolicyWindowsProactorEventLoopPolicy    i  i  gMbP?g?c                       s`   e Zd ZdZdd fdd
Z fddZdd	 Zd fd
d	Z fddZ fddZ	  Z
S )_OverlappedFuturezSubclass of Future which represents an overlapped operation.

    Cancelling it will immediately cancel the overlapped operation.
    Nloopc                   s&   t  j|d | jr| jd= || _d S Nr   )super__init___source_traceback_ov)selfovr   	__class__ 'lib/python3.9/asyncio/windows_events.pyr   6   s    z_OverlappedFuture.__init__c                    sH   t   }| jd urD| jjr dnd}|dd| d| jjdd |S )NpendingZ	completedr   zoverlapped=<z, #x>)r   
_repr_infor   r"   insertaddressr   infostater   r    r!   r%   <   s
    

 z_OverlappedFuture._repr_infoc              
   C   st   | j d u rd S z| j   W nL tyh } z4d|| d}| jrH| j|d< | j| W Y d }~n
d }~0 0 d | _ d S )Nz&Cancelling an overlapped future failedmessage	exceptionfuturesource_traceback)r   cancelOSErrorr   _loopcall_exception_handler)r   exccontextr    r    r!   _cancel_overlappedC   s    

"z$_OverlappedFuture._cancel_overlappedc                    s   |    t j|dS N)msg)r6   r   r0   r   r8   r   r    r!   r0   S   s    z_OverlappedFuture.cancelc                    s   t  | |   d S N)r   set_exceptionr6   r   r-   r   r    r!   r;   W   s    z_OverlappedFuture.set_exceptionc                    s   t  | d | _d S r:   )r   
set_resultr   r   resultr   r    r!   r=   [   s    z_OverlappedFuture.set_result)N)__name__
__module____qualname____doc__r   r%   r6   r0   r;   r=   __classcell__r    r    r   r!   r   0   s   r   c                       sp   e Zd ZdZdd fdd
Zdd Z fdd	Zd
d Zdd Zd fdd	Z	 fddZ
 fddZ  ZS )_BaseWaitHandleFuturez2Subclass of Future which represents a wait handle.Nr   c                   s8   t  j|d | jr| jd= || _|| _|| _d| _d S )Nr   r   T)r   r   r   r   _handle_wait_handle_registered)r   r   handlewait_handler   r   r    r!   r   c   s    z_BaseWaitHandleFuture.__init__c                 C   s   t | jdt jkS Nr   )_winapiZWaitForSingleObjectrF   ZWAIT_OBJECT_0r   r    r    r!   _pollq   s    z_BaseWaitHandleFuture._pollc                    sd   t   }|d| jd | jd urB|  r4dnd}|| | jd ur`|d| jd |S )Nzhandle=r#   ZsignaledZwaitingzwait_handle=)r   r%   appendrF   rN   rG   r(   r   r    r!   r%   v   s    



z _BaseWaitHandleFuture._repr_infoc                 C   s
   d | _ d S r:   )r   r   futr    r    r!   _unregister_wait_cb   s    z)_BaseWaitHandleFuture._unregister_wait_cbc              
   C   s   | j s
d S d| _ | j}d | _zt| W nf ty } zN|jtjkr|d|| d}| jrb| j|d< | j	| W Y d }~d S W Y d }~n
d }~0 0 | 
d  d S NFz$Failed to unregister the wait handler+   r/   )rH   rG   _overlappedZUnregisterWaitr1   winerrorERROR_IO_PENDINGr   r2   r3   rR   r   rJ   r4   r5   r    r    r!   _unregister_wait   s$    
$z&_BaseWaitHandleFuture._unregister_waitc                    s   |    t j|dS r7   )rX   r   r0   r9   r   r    r!   r0      s    z_BaseWaitHandleFuture.cancelc                    s   |    t | d S r:   )rX   r   r;   r<   r   r    r!   r;      s    z#_BaseWaitHandleFuture.set_exceptionc                    s   |    t | d S r:   )rX   r   r=   r>   r   r    r!   r=      s    z _BaseWaitHandleFuture.set_result)N)r@   rA   rB   rC   r   rN   r%   rR   rX   r0   r;   r=   rD   r    r    r   r!   rE   `   s   
rE   c                       sF   e Zd ZdZdd fdd
Zdd Z fdd	Z fd
dZ  ZS )_WaitCancelFuturezoSubclass of Future which represents a wait for the cancellation of a
    _WaitHandleFuture using an event.
    Nr   c                   s   t  j||||d d | _d S )Nr   )r   r   _done_callback)r   r   eventrJ   r   r   r    r!   r      s    z_WaitCancelFuture.__init__c                 C   s   t dd S )Nz'_WaitCancelFuture must not be cancelled)RuntimeErrorrM   r    r    r!   r0      s    z_WaitCancelFuture.cancelc                    s$   t  | | jd ur | |  d S r:   )r   r=   rZ   r>   r   r    r!   r=      s    
z_WaitCancelFuture.set_resultc                    s$   t  | | jd ur | |  d S r:   )r   r;   rZ   r<   r   r    r!   r;      s    
z_WaitCancelFuture.set_exception)	r@   rA   rB   rC   r   r0   r=   r;   rD   r    r    r   r!   rY      s
   rY   c                       s6   e Zd Zdd fdd
Z fddZdd Z  ZS )	_WaitHandleFutureNr   c                   s<   t  j||||d || _d| _td ddd | _d | _d S )Nr   TF)r   r   	_proactorZ_unregister_proactorrT   ZCreateEvent_event
_event_fut)r   r   rI   rJ   proactorr   r   r    r!   r      s
    z_WaitHandleFuture.__init__c                    sF   | j d ur"t| j  d | _ d | _| j| j d | _t | d S r:   )	r_   rL   CloseHandler`   r^   _unregisterr   r   rR   rP   r   r    r!   rR      s    
	z%_WaitHandleFuture._unregister_wait_cbc              
   C   s   | j s
d S d| _ | j}d | _zt|| j W nf ty } zN|jtjkrd|| d}| jrf| j|d< | j	
| W Y d }~d S W Y d }~n
d }~0 0 | j| j| j| _d S rS   )rH   rG   rT   ZUnregisterWaitExr_   r1   rU   rV   r   r2   r3   r^   _wait_cancelrR   r`   rW   r    r    r!   rX      s(    
$
z"_WaitHandleFuture._unregister_wait)r@   rA   rB   r   rR   rX   rD   r    r    r   r!   r]      s   r]   c                   @   s<   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZeZ	dS )
PipeServerzXClass representing a pipe server.

    This is much like a bound, listening socket.
    c                 C   s,   || _ t | _d | _d | _| d| _d S NT)_addressweakrefWeakSet_free_instances_pipe_accept_pipe_future_server_pipe_handle)r   r'   r    r    r!   r      s
    
zPipeServer.__init__c                 C   s   | j | d }| _ |S )NF)rk   rm   )r   tmpr    r    r!   _get_unconnected_pipe  s    z PipeServer._get_unconnected_pipec              
   C   sr   |   rd S tjtjB }|r&|tjO }t| j|tjtjB tj	B tj
tjtjtjtj}t|}| j| |S r:   )closedrL   ZPIPE_ACCESS_DUPLEXZFILE_FLAG_OVERLAPPEDZFILE_FLAG_FIRST_PIPE_INSTANCEZCreateNamedPiperg   ZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ	PIPE_WAITZPIPE_UNLIMITED_INSTANCESr
   ZBUFSIZEZNMPWAIT_WAIT_FOREVERNULL
PipeHandlerj   add)r   firstflagshpiper    r    r!   rm     s"    


zPipeServer._server_pipe_handlec                 C   s
   | j d u S r:   )rg   rM   r    r    r!   rp     s    zPipeServer.closedc                 C   sR   | j d ur| j   d | _ | jd urN| jD ]}|  q*d | _d | _| j  d S r:   )rl   r0   rg   rj   closerk   clear)r   rw   r    r    r!   rx   "  s    




zPipeServer.closeN)
r@   rA   rB   rC   r   ro   rm   rp   rx   __del__r    r    r    r!   re      s   
re   c                   @   s   e Zd ZdZdS )_WindowsSelectorEventLoopz'Windows version of selector event loop.N)r@   rA   rB   rC   r    r    r    r!   r{   1  s   r{   c                       sH   e Zd ZdZd fdd	Z fddZdd Zd	d
 ZdddZ  Z	S )r   z2Windows version of proactor event loop using IOCP.Nc                    s   |d u rt  }t | d S r:   )r   r   r   )r   ra   r   r    r!   r   8  s    zProactorEventLoop.__init__c              	      s   zd| j d u sJ | | j t   W | j d ur| j j}| j   |d ur^|js^| j	| d | _ n>| j d ur| j j}| j   |d ur|js| j	| d | _ 0 d S r:   )
Z_self_reading_future	call_soonZ_loop_self_readingr   run_foreverr   r0   r"   r^   rc   r   r   r   r    r!   r}   =  s     



zProactorEventLoop.run_foreverc                    s8   | j |}|I d H }| }| j||d|id}||fS )Naddrextra)r^   connect_pipe_make_duplex_pipe_transport)r   protocol_factoryr'   frw   protocoltransr    r    r!   create_pipe_connectionP  s    
z(ProactorEventLoop.create_pipe_connectionc                    s.   t  d fdd	 gS )Nc              
      s  d }zn| rN|   }j|  r4|  W d S  }j||d id  }|d u rdW d S j|} W n t	y } zN|r|
 dkrd||d |  njrtjd|dd W Y d }~n8d }~0  tjy   |r|  Y n0 | _|  d S )	Nr   r   r   zPipe accept failed)r,   r-   rw   zAccept pipe failed on pipe %rT)exc_info)r?   rj   discardrp   rx   r   ro   r^   accept_piper1   filenor3   Z_debugr   Zwarningr   CancelledErrorrl   add_done_callback)r   rw   r   r4   r'   loop_accept_piper   r   Zserverr    r!   r   [  sB    

z>ProactorEventLoop.start_serving_pipe.<locals>.loop_accept_pipe)N)re   r|   )r   r   r'   r    r   r!   start_serving_pipeX  s    (
z$ProactorEventLoop.start_serving_pipec	              	      s   |   }
t| |||||||f|
|d|	}z|
I d H  W n@ ttfyR    Y n* tyz   |  | I d H   Y n0 |S )N)waiterr   )create_future_WindowsSubprocessTransport
SystemExitKeyboardInterruptBaseExceptionrx   Z_wait)r   r   argsshellstdinstdoutstderrbufsizer   kwargsr   Ztranspr    r    r!   _make_subprocess_transport  s"    
z,ProactorEventLoop._make_subprocess_transport)N)N)
r@   rA   rB   rC   r   r}   r   r   r   rD   r    r    r   r!   r   5  s   0 r   c                   @   s   e Zd ZdZd;ddZdd Zdd Zd	d
 Zd<ddZdd Z	d=ddZ
d>ddZd?ddZd@ddZdAddZdd Zdd Zdd  Zd!d" Zd#d$ ZdBd%d&Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 ZdCd3d4Zd5d6 Zd7d8 Zd9d: ZdS )Dr   z#Proactor implementation using IOCP.r   c                 C   sD   d | _ g | _ttjtd|| _i | _t	 | _
g | _t	 | _d S rK   )r2   _resultsrT   CreateIoCompletionPortINVALID_HANDLE_VALUErq   _iocp_cacherh   ri   rH   _unregistered_stopped_serving)r   Zconcurrencyr    r    r!   r     s    

zIocpProactor.__init__c                 C   s   | j d u rtdd S )NzIocpProactor is closed)r   r\   rM   r    r    r!   _check_closed  s    
zIocpProactor._check_closedc                 C   sF   dt | j dt | j g}| jd u r0|d d| jjd|f S )Nzoverlapped#=%sz
result#=%srp   z<%s %s> )lenr   r   r   rO   r   r@   join)r   r)   r    r    r!   __repr__  s    

zIocpProactor.__repr__c                 C   s
   || _ d S r:   )r2   )r   r   r    r    r!   set_loop  s    zIocpProactor.set_loopNc                 C   s    | j s| | | j }g | _ |S r:   )r   rN   )r   timeoutrn   r    r    r!   select  s
    
zIocpProactor.selectc                 C   s   | j  }|| |S r:   )r2   r   r=   )r   valuerQ   r    r    r!   _result  s    

zIocpProactor._resultr   c                 C   s|   |  | tt}z4t|tjr6|| || n|| | W n t	yd   | 
d Y S 0 dd }| |||S )N    c              
   S   sT   z
|  W S  tyN } z,|jtjtjfv r8t|j n W Y d }~n
d }~0 0 d S r:   	getresultr1   rU   rT   ZERROR_NETNAME_DELETEDZERROR_OPERATION_ABORTEDConnectionResetErrorr   r   keyr   r4   r    r    r!   finish_recv  s    
z&IocpProactor.recv.<locals>.finish_recv)_register_with_iocprT   
Overlappedrq   
isinstancesocketZWSARecvr   ZReadFileBrokenPipeErrorr   	_registerr   connnbytesru   r   r   r    r    r!   recv  s    


zIocpProactor.recvc                 C   s|   |  | tt}z4t|tjr6|| || n|| | W n t	yd   | 
d Y S 0 dd }| |||S )Nr   c              
   S   sT   z
|  W S  tyN } z,|jtjtjfv r8t|j n W Y d }~n
d }~0 0 d S r:   r   r   r    r    r!   r     s    
z+IocpProactor.recv_into.<locals>.finish_recv)r   rT   r   rq   r   r   ZWSARecvIntor   ZReadFileIntor   r   r   )r   r   bufru   r   r   r    r    r!   	recv_into  s    


zIocpProactor.recv_intoc                 C   s^   |  | tt}z|| || W n tyF   | d Y S 0 dd }| |||S )N)r   Nc              
   S   sT   z
|  W S  tyN } z,|jtjtjfv r8t|j n W Y d }~n
d }~0 0 d S r:   r   r   r    r    r!   r     s    
z*IocpProactor.recvfrom.<locals>.finish_recv)	r   rT   r   rq   ZWSARecvFromr   r   r   r   r   r    r    r!   recvfrom  s    


zIocpProactor.recvfromc                 C   s>   |  | tt}|| ||| dd }| |||S )Nc              
   S   sT   z
|  W S  tyN } z,|jtjtjfv r8t|j n W Y d }~n
d }~0 0 d S r:   r   r   r    r    r!   finish_send	  s    
z(IocpProactor.sendto.<locals>.finish_send)r   rT   r   rq   Z	WSASendTor   r   )r   r   r   ru   r   r   r   r    r    r!   sendto  s
    


zIocpProactor.sendtoc                 C   sZ   |  | tt}t|tjr4|| || n|| | dd }| 	|||S )Nc              
   S   sT   z
|  W S  tyN } z,|jtjtjfv r8t|j n W Y d }~n
d }~0 0 d S r:   r   r   r    r    r!   r     s    
z&IocpProactor.send.<locals>.finish_send)
r   rT   r   rq   r   r   ZWSASendr   Z	WriteFiler   )r   r   r   ru   r   r   r    r    r!   send  s    


zIocpProactor.sendc                    sv   |   | j tt}|     fdd}dd }| ||}|| }t	j
|| jd |S )Nc                    sD   |   td } tjtj|  	
     fS )Nz@P)r   structZpackr   
setsockoptr   
SOL_SOCKETrT   ZSO_UPDATE_ACCEPT_CONTEXT
settimeoutZ
gettimeoutZgetpeername)r   r   r   r   r   listenerr    r!   finish_accept/  s    z*IocpProactor.accept.<locals>.finish_acceptc                    s2   z| I d H  W n t jy,   |   Y n0 d S r:   )r   r   rx   )r.   r   r    r    r!   accept_coro8  s
    z(IocpProactor.accept.<locals>.accept_coror   )r   _get_accept_socketfamilyrT   r   rq   ZAcceptExr   r   r	   Zensure_futurer2   )r   r   r   r   r   r.   coror    r   r!   accept)  s    

	
zIocpProactor.acceptc              
      s    j tjkr4t  | | j }|d  |S | 	  zt
   j W nD ty } z,|jtjkrr   d dkr W Y d }~n
d }~0 0 tt}|  |  fdd}| | |S )Nr   r   c                    s   |    tjtjd  S rK   )r   r   r   r   rT   ZSO_UPDATE_CONNECT_CONTEXTr   r   r   r   r    r!   finish_connect[  s
    z,IocpProactor.connect.<locals>.finish_connect)typer   Z
SOCK_DGRAMrT   Z
WSAConnectr   r2   r   r=   r   Z	BindLocalr   r1   rU   errnoZ	WSAEINVALZgetsocknamer   rq   Z	ConnectExr   )r   r   r'   rQ   er   r   r    r   r!   connectE  s"    



zIocpProactor.connectc           	   	   C   sb   |  | tt}|d@ }|d? d@ }|| t| |||dd dd }| |||S )Nr       r   c              
   S   sT   z
|  W S  tyN } z,|jtjtjfv r8t|j n W Y d }~n
d }~0 0 d S r:   r   r   r    r    r!   finish_sendfilen  s    
z.IocpProactor.sendfile.<locals>.finish_sendfile)	r   rT   r   rq   ZTransmitFiler   msvcrtZget_osfhandler   )	r   Zsockfileoffsetcountr   Z
offset_lowZoffset_highr   r    r    r!   sendfiled  s    


	zIocpProactor.sendfilec                    sJ   |    tt}|  }|r0|  S  fdd}| | |S )Nc                    s   |    S r:   )r   r   rw   r    r!   finish_accept_pipe  s    z4IocpProactor.accept_pipe.<locals>.finish_accept_pipe)r   rT   r   rq   ZConnectNamedPiper   r   r   )r   rw   r   Z	connectedr   r    r   r!   r   y  s    


zIocpProactor.accept_pipec              
      st   t }zt|}W qjW n2 tyH } z|jtjkr4 W Y d }~n
d }~0 0 t|d t}t	|I d H  qt
|S )N   )CONNECT_PIPE_INIT_DELAYrT   ZConnectPiper1   rU   ZERROR_PIPE_BUSYminCONNECT_PIPE_MAX_DELAYr	   sleepr
   rr   )r   r'   ZdelayrI   r4   r    r    r!   r     s    
zIocpProactor.connect_pipec                 C   s   |  ||dS )zWait for a handle.

        Return a Future object. The result of the future is True if the wait
        completed, or False if the wait did not complete (on timeout).
        F)_wait_for_handle)r   rI   r   r    r    r!   wait_for_handle  s    zIocpProactor.wait_for_handlec                 C   s   |  |d d}||_|S rf   )r   rZ   )r   r[   Zdone_callbackrQ   r    r    r!   rd     s    zIocpProactor._wait_cancelc                    s   |    |d u rtj}nt|d }tt}t|| j	|j
|}|r\t|||| jd nt|||| | jd  jr~ jd=  fdd} |d|f| j|j
<  S )N     @@r   r   c                    s      S r:   )rN   r   r   r    r!   finish_wait_for_handle  s    z=IocpProactor._wait_for_handle.<locals>.finish_wait_for_handler   )r   rL   INFINITEmathceilrT   r   rq   ZRegisterWaitWithQueuer   r'   rY   r2   r]   r   r   )r   rI   r   Z
_is_cancelmsr   rJ   r   r    r   r!   r     s$    

	zIocpProactor._wait_for_handlec                 C   s0   || j vr,| j | t| | jdd d S rK   )rH   rs   rT   r   r   r   r   objr    r    r!   r     s    
z IocpProactor._register_with_iocpc              
   C   s   |    t|| jd}|jr$|jd= |jstz|d d |}W n. tyh } z|| W Y d }~nd }~0 0 || ||||f| j|j	< |S r   )
r   r   r2   r   r"   r1   r;   r=   r   r'   )r   r   r   callbackr   r   r   r    r    r!   r     s     

zIocpProactor._registerc                 C   s   |    | j| dS )a  Unregister an overlapped object.

        Call this method when its future has been cancelled. The event can
        already be signalled (pending in the proactor event queue). It is also
        safe if the event is never signalled (because it was cancelled).
        N)r   r   rO   r~   r    r    r!   rc     s    zIocpProactor._unregisterc                 C   s   t  |}|d |S rK   )r   r   )r   r   sr    r    r!   r     s    

zIocpProactor._get_accept_socketc                 C   s  |d u rt }n0|dk r tdnt|d }|t kr>tdt| j|}|d u rXqZd}|\}}}}z| j|\}}	}
}W nV t	y   | j
 r| j
dd||||f d |dtjfvrt| Y q>Y n0 |
| jv r|  q>| s>z||||	}W n< ty@ } z"|| | j| W Y d }~q>d }~0 0 || | j| q>| jD ]}	| j|	jd  q`| j  d S )Nr   znegative timeoutr   ztimeout too bigz8GetQueuedCompletionStatus() returned an unexpected eventz)err=%s transferred=%s key=%#x address=%#x)r,   status)r   
ValueErrorr   r   rT   ZGetQueuedCompletionStatusr   r   popKeyErrorr2   Z	get_debugr3   r   rL   rb   r   r0   Zdoner1   r;   r   rO   r=   r   r'   ry   )r   r   r   r   errZtransferredr   r'   r   r   r   r   r   r   r    r    r!   rN     sL    


	




"

zIocpProactor._pollc                 C   s   | j | d S r:   )r   rs   r   r    r    r!   _stop_serving>  s    zIocpProactor._stop_servingc                 C   s  | j d u rd S t| j D ]\}\}}}}| r6qt|trBqz|  W q ty } z>| j	d urd||d}|j
r|j
|d< | j	| W Y d }~qd }~0 0 qd}t }	|	| }
| jr|
t krtd| t |	  t | }
| | qg | _t| j  d | _ d S )NzCancelling a future failedr+   r/   g      ?z,%r is running after closing for %.1f seconds)r   listr   itemsZ	cancelledr   rY   r0   r1   r2   r   r3   time	monotonicr   debugrN   r   rL   rb   )r   r'   rQ   r   r   r   r4   r5   Z
msg_updateZ
start_timeZnext_msgr    r    r!   rx   D  s>    



$zIocpProactor.closec                 C   s   |    d S r:   )rx   rM   r    r    r!   rz   s  s    zIocpProactor.__del__)r   )N)r   )r   )r   )r   N)r   )N)N)r@   rA   rB   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rd   r   r   r   rc   r   rN   r   rx   rz   r    r    r    r!   r     s8   








"
 

7/r   c                   @   s   e Zd Zdd ZdS )r   c           
         sP   t j|f|||||d| _ fdd} jjt jj}	|	| d S )N)r   r   r   r   r   c                    s    j  } | d S r:   )_procZpollZ_process_exited)r   
returncoderM   r    r!   r   ~  s    
z4_WindowsSubprocessTransport._start.<locals>.callback)	r
   Popenr  r2   r^   r   intrF   r   )
r   r   r   r   r   r   r   r   r   r   r    rM   r!   _starty  s    z"_WindowsSubprocessTransport._startN)r@   rA   rB   r  r    r    r    r!   r   w  s   r   c                   @   s   e Zd ZeZdS )r   N)r@   rA   rB   r   _loop_factoryr    r    r    r!   r     s   r   c                   @   s   e Zd ZeZdS )r   N)r@   rA   rB   r   r  r    r    r    r!   r     s   r   )2rC   sysplatformImportErrorrT   rL   r   r   r   r   r   r   rh    r   r   r   r   r   r   r	   r
   logr   __all__rq   r   ZERROR_CONNECTION_REFUSEDZERROR_CONNECTION_ABORTEDr   r   ZFuturer   rE   rY   r]   objectre   ZBaseSelectorEventLoopr{   ZBaseProactorEventLoopr   r   ZBaseSubprocessTransportr   r   ZBaseDefaultEventLoopPolicyr   r   r   r    r    r    r!   <module>   sX   
0J4;e   `