o
    Df                     @   sX  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mZ ddlmZ ddlmZmZ d dlmZ dd	l
mZ zdd
lmZ W n eyk   ejdkrg dZY nw ejdkr}ejZejZejZejZg dZeedZdZ dZ!e" Z#dZ$dgZ%eedrdZ$e%dg7 Z%ejdkrdZ$e%dg7 Z%e!fddZ&dd Z'dd Z(dd Z)dd Z*G dd dZ+G dd  d Z,erG d!d" d"e,Z-G d#d$ d$e,Z.G d%d& d&Z/d]d'd(Z0d)d* Z1ejdkrd^d-d.Z2nd^d/d.Z2G d0d1 d1Z3d2d3 Z4ejdkr#G d4d5 d5Z5ej6ej7ffd6d7Z8d8Z9d9Z:d:Z;d;Z<d<d= Z=d>d? Z>G d@dA dAZ?dBdC Z@dDdE ZAG dFdG dGe/ZBdHdI ZCejdkrddJdK ZDejEejFhZGd_dLdMZHneedNrodOdP ZIndQdP ZId_dRdMZHejdkrdSdT ZJdUdV ZKe
Le.eJ dWdX ZMdYdZ ZNe
Le-eM dS d[dT ZJd\dV ZKe
Le.eJ dS )`    N   )	reduction)util)AuthenticationErrorBufferTooShort)	_billiard)setblockingsend_offset	monotonic)ForkingPickler)_winapiwin32)ClientListenerPipewaitpypy_version_infoi    g      4@AF_INETAF_UNIXAF_PIPEc                 C   s
   t  |  S Nr
   )timeout r   L/home/ubuntu/webapp/venv/lib/python3.10/site-packages/billiard/connection.py_init_timeoutE      
r   c                 C   s
   t  | kS r   r
   )tr   r   r   _check_timeoutI   r   r   c                 C   sT   | dkrdS | dkrt jdt dS | dkr&t jdt ttf ddS td	)
z?
    Return an arbitrary free address for the given family
    r   )	localhostr   r   z	listener-)prefixdirr   z\\.\pipe\pyc-%d-%d- zunrecognized family)	tempfilemktempr   get_temp_dirosgetpidnext_mmap_counter
ValueErrorfamilyr   r   r   arbitrary_addressQ   s   r-   c                 C   sR   t jdkr| dkrtd|  t jdkr#| dkr%tt| s'td|  dS dS dS )zD
    Checks if the family is valid for the current environment.
    r   r   zFamily %s is not recognized.r   N)sysplatformr*   hasattrsocketr+   r   r   r   _validate_family`   s   
r2   c                 C   sF   t | tkrdS t | tu r| drdS t | tu rdS td|  )z]
    Return the types of the address

    This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE'
    r   z\\r   r   zaddress type of %r unrecognized)typetuplestr
startswithr*   )addressr   r   r   address_typem   s   r8   c                   @      e Zd Zdd ZdS )_SocketContainerc                 C   s
   || _ d S r   sock)selfr<   r   r   r   __init__   r   z_SocketContainer.__init__N)__name__
__module____qualname__r>   r   r   r   r   r:          r:   c                   @   s   e Zd ZdZd/ddZdd Zdd Zd	d
 Zdd Zdd Z	e
dd Ze
dd Ze
dd Zdd Zdd Zd0ddZdd Zd1ddZd2d d!Zd"d# Zd3d%d&Zd'd( Zd)d* Zd+d, Zd-d. ZdS )4_ConnectionBaseNTc                 C   sZ   t |tr|j| _|j }| }|dk rtd|s"|s"td|| _|| _|| _	d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)

isinstancer:   r<   _socketfileno	__index__r*   _handle	_readable	_writable)r=   handlereadablewritabler   r   r   r>      s   


z_ConnectionBase.__init__c                 C   s   | j d ur|   d S d S r   rH   _closer=   r   r   r   __del__   s   
z_ConnectionBase.__del__c                 C   s   | j d u r	tdd S )Nzhandle is closed)rH   OSErrorrP   r   r   r   _check_closed   s   
z_ConnectionBase._check_closedc                 C      | j stdd S )Nzconnection is write-only)rI   rR   rP   r   r   r   _check_readable      z_ConnectionBase._check_readablec                 C   rT   )Nzconnection is read-only)rJ   rR   rP   r   r   r   _check_writable   rV   z_ConnectionBase._check_writablec                 C   s$   | j r
d| _td|   td)NFzbad message length)rJ   rI   closerR   rP   r   r   r   _bad_message_length   s
   z#_ConnectionBase._bad_message_lengthc                 C   s
   | j du S )z True if the connection is closedNrH   rP   r   r   r   closed   s   
z_ConnectionBase.closedc                 C      | j S )z"True if the connection is readable)rI   rP   r   r   r   rL         z_ConnectionBase.readablec                 C   r\   )z"True if the connection is writable)rJ   rP   r   r   r   rM      r]   z_ConnectionBase.writablec                 C   s   |    | jS )z+File descriptor or handle of the connection)rS   rH   rP   r   r   r   rF      s   z_ConnectionBase.filenoc                 C   s,   | j durz
|   W d| _ dS d| _ w dS )zClose the connectionNrN   rP   r   r   r   rX      s
   

z_ConnectionBase.closer   c                 C   s   |    |   t|}|jdkrtt|}t|}|dk r#td||k r+td|du r4|| }n|dk r<td|| |krFtd| ||||   dS )z,Send the bytes data from a bytes-like objectr   r   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rS   rW   
memoryviewitemsizebyteslenr*   _send_bytes)r=   bufoffsetsizemnr   r   r   
send_bytes   s"   

z_ConnectionBase.send_bytesc                 C   s$   |    |   | t| dS )zSend a (picklable) objectN)rS   rW   rb   r   dumpsr=   objr   r   r   send   s   z_ConnectionBase.sendc                 C   sJ   |    |   |dur|dk rtd| |}|du r!|   | S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)rS   rU   r*   _recv_bytesrY   getvalue)r=   	maxlengthrc   r   r   r   
recv_bytes   s   
z_ConnectionBase.recv_bytesc                 C   s   |    |   t|K}|j}|t| }|dk rtd||kr&td|  }| }||| k r:t|	 |
d |||| || |   |W  d   S 1 sZw   Y  dS )zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)rS   rU   r^   r_   ra   r*   rm   tellr   rn   seekreadinto)r=   rc   rd   rf   r_   bytesizeresultre   r   r   r   recv_bytes_into   s&   

$z_ConnectionBase.recv_bytes_intoc                 C   s"   |    |   |  }t|S )zReceive a (picklable) object)rS   rU   rm   r   loadbuf)r=   rc   r   r   r   recv  s   
z_ConnectionBase.recv        c                 C   s   |    |   | |S )z/Whether there is any input available to be read)rS   rU   _pollr=   r   r   r   r   poll  s   
z_ConnectionBase.pollc                 C      | S r   r   rP   r   r   r   	__enter__     z_ConnectionBase.__enter__c                 C      |    d S r   rX   r=   exc_type	exc_valueexc_tbr   r   r   __exit__     z_ConnectionBase.__exit__c                 C   s   t |  ||S r   )r	   rF   )r=   rc   rd   r   r   r   r	   "     z_ConnectionBase.send_offsetc                 C   s   t |  | d S r   )r   rF   )r=   blockingr   r   r   r   %  s   z_ConnectionBase.setblocking)TT)r   Nr   )r   )ry   )r?   r@   rA   rH   r>   rQ   rS   rU   rW   rY   propertyr[   rL   rM   rF   rX   rh   rl   rp   rv   rx   r|   r~   r   r	   r   r   r   r   r   rC      s4    







rC   c                   @   sD   e Zd ZdZdZejfddZdd Zddd	Z	d
d Z
dd ZdS )PipeConnectionz
        Connection class based on a Windows named pipe.
        Overlapped I/O is used, so the handles must have been created
        with FILE_FLAG_OVERLAPPED.
        Fc                 C      || j  d S r   rZ   )r=   _CloseHandler   r   r   rO   3     zPipeConnection._closec              	   C   s   t j| j|dd\}}z(z|t jkr!t |jgdt}|tks!J W n   |   W |	d\}}n|	d\}}w |dksBJ |t
|ksJJ d S )NT
overlappedFr   )r   	WriteFilerH   ERROR_IO_PENDINGWaitForMultipleObjectseventINFINITEWAIT_OBJECT_0cancelGetOverlappedResultra   )r=   rc   overrwaitresnwrittenr   r   r   rb   6  s   

 zPipeConnection._send_bytesNc           	   
   C   sh  | j r
d| _ t S |d u rdnt|d}ztj| j|dd\}}zFz|tjkr7t|j	gdt
}|tks7J W n   |   W |d\}}|dkr[t }||  |W S |tjkrg| ||W S n2|d\}}|dkrt }||  |     Y W S |tjkr| ||     Y W S w W td ty } z	|jtjkrt d }~ww )NF   Tr   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr   ReadFilerH   r   r   r   r   r   r   r   write	getbufferERROR_MORE_DATA_get_more_datarR   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	r=   maxsizebsizer   r   r   nreadfer   r   r   rm   F  sX   




zPipeConnection._recv_bytesc                 C   s.   | j st| jd dkrdS tt| g|S )Nr   T)r   r   PeekNamedPiperH   boolr   r{   r   r   r   rz   h  s   zPipeConnection._pollc                 C   s   |  }t }|| t| jd }|dksJ |d ur+t|| |kr+|   tj	| j|dd\}}|
d\}}|dksCJ ||ksIJ ||   |S )Nr   r   Tr   )r   r   r   r   r   r   rH   ra   rY   r   r   )r=   r   r   rc   r   leftr   rbytesr   r   r   r   n  s   
zPipeConnection._get_more_datar   )r?   r@   rA   __doc__r   r   CloseHandlerO   rb   rm   rz   r   r   r   r   r   r   +  s    
"r   c                   @   s   e Zd ZdZerejfddZejZ	ej
ZnejfddZejZ	ejZe	fddZefddZefd	d
ZdddZdd ZdS )
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 C   r   r   rZ   r=   rO   r   r   r   rO     r   zConnection._closec                 C   r   r   rZ   r   r   r   r   rO     r   c              
   C   s~   t |}	 z|| j|}W n  tttjfy- } zt|dd tjkr# W Y d }~nd }~ww ||8 }|dkr8d S ||d  }q)NTerrnor   )	ra   rH   rR   IOErrorr1   errorgetattrr   EINTR)r=   rc   r   	remainingrg   excr   r   r   _send  s   zConnection._sendc           	   
   C   s   t  }| j}|}|dkrTz|||}W n  tttjfy4 } zt|dd tj	kr* W Y d }~n d }~ww t
|}|dkrG||krCttd|| ||8 }|dks|S )Nr   r   zgot end of file during message)r   r   rH   rR   r   r1   r   r   r   r   ra   r   r   )	r=   re   readrc   rK   r   chunkr   rg   r   r   r   _recv  s*   
zConnection._recvc                 C   sX   t |}td|}|dkr| | | | d S t||r#| }| ||  d S )N!ii @  )ra   structpackr   rD   tobytes)r=   rc   r^   rg   headerr   r   r   rb     s   

zConnection._send_bytesNc                 C   s:   |  d}td| \}|d ur||krd S |  |S )N   r   )r   r   unpackrn   )r=   r   rc   re   r   r   r   rm     s
   

zConnection._recv_bytesc                 C   s   t | g|}t|S r   )r   r   )r=   r   rr   r   r   rz     s   zConnection._pollr   )r?   r@   rA   r   r   r   closesocketrO   rl   _writerx   _readr&   rX   r   r   r   r   r^   rb   rm   rz   r   r   r   r   r   ~  s    
r   c                   @   sR   e Zd ZdZdddZdd Zdd	 Zed
d Zedd Z	dd Z
dd ZdS )r   z
    Returns a listener object.

    This is a wrapper for a bound socket which is 'listening' for
    connections, or for a Windows named pipe.
    Nr   c                 C   sp   |p	|ot |p	t}|pt|}t| |dkrt||| _nt|||| _|d ur3t|ts3t	d|| _
d S )Nr   authkey should be a byte string)r8   default_familyr-   r2   PipeListener	_listenerSocketListenerrD   r`   	TypeError_authkey)r=   r7   r,   backlogauthkeyr   r   r   r>     s   

zListener.__init__c                 C   s>   | j du r	td| j  }| jrt|| j t|| j |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        Nzlistener is closed)r   rR   acceptr   deliver_challengeanswer_challenge)r=   cr   r   r   r     s   

zListener.acceptc                 C   s$   | j }|durd| _ |  dS dS )zA
        Close the bound socket or named pipe of `self`.
        N)r   rX   )r=   listenerr   r   r   rX     s
   zListener.closec                 C      | j jS r   )r   _addressrP   r   r   r   <lambda>      zListener.<lambda>c                 C   r   r   )r   _last_acceptedrP   r   r   r   r     r   c                 C   r}   r   r   rP   r   r   r   r~     r   zListener.__enter__c                 C   r   r   r   r   r   r   r   r     r   zListener.__exit__)NNr   N)r?   r@   rA   r   r>   r   rX   r   r7   last_acceptedr~   r   r   r   r   r   r     s    
	r   c                 C   sh   |pt | }t| |dkrt| }nt| }|dur$t|ts$td|dur2t|| t|| |S )z=
    Returns a connection to the address of a `Listener`
    r   Nr   )	r8   r2   
PipeClientSocketClientrD   r`   r   r   r   )r7   r,   r   r   r   r   r   r     s   


r   c                 C   s   t | dr	|  S t| S )Ndetach)r0   r   r:   r;   r   r   r   r   !  s   
r   TFc           	      C   s   | r$t  \}}||  ||  tt|}tt|}||fS t \}}|r1t|d |r8t|d t|dd}t|dd}||fS )L
        Returns pair of connection objects at either end of a pipe
        r   FrM   rL   )r1   
socketpairr   r   r   r&   pipe)	duplex	rnonblock	wnonblocks1s2c1c2fd1fd2r   r   r   r   +  s   


r   c              
   C   s  |rJ d|rJ dt d}| r!tj}tjtjB }tt}}ntj}tj}dt}}t||tjB tj	B tj
tjB tjB d||tjtj}t||dtjtjtjtj}	t|	tjdd tj|dd}
|
d\}}|dkssJ t|| d	}t|	| d
}||fS )r   z"rnonblock not supported on windowsz"wnonblock not supported on windowsr   r   r   NTr   r   r   )r-   r   PIPE_ACCESS_DUPLEXGENERIC_READGENERIC_WRITEBUFSIZEPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE	PIPE_WAITNMPWAIT_WAIT_FOREVERNULL
CreateFileOPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPiper   r   )r   r   r   r7   openmodeaccessobsizeibsizeh1h2r   _r   r   r   r   r   r   r   B  sB   



	
c                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )r   zO
    Representation of a socket which is bound to an address and listening
    r   c                 C   s   t  tt || _z)tjdkr| jt jt jd | jd | j	| | j
| | j | _W n ty?   | j   w || _d | _|dkrXtj| tj|fdd| _d S d | _d S )Nposixr   Tr   r   argsexitpriority)r1   r   rE   r&   name
setsockopt
SOL_SOCKETSO_REUSEADDRr   bindlistengetsocknamer   rR   rX   _familyr   r   Finalizeunlink_unlink)r=   r7   r,   r   r   r   r   r>   u  s*   



zSocketListener.__init__c              
   C   sr   	 z
| j  \}| _W n  tttjfy+ } zt|dd tj	kr! W Y d }~nd }~ww nq|
d tt|S )NTr   )rE   r   r   rR   r   r1   r   r   r   r   r   r   r   )r=   sr   r   r   r   r     s   
zSocketListener.acceptc                 C   sN   z| j   W | j}|d urd | _|  d S d S | j}|d ur&d | _|  w w r   )rE   rX   r  )r=   r  r   r   r   rX     s   
zSocketListener.closeN)r   )r?   r@   rA   r   r>   r   rX   r   r   r   r   r   q  s
    
r   c                 C   s8   t | }ttt|}|d ||  tt|S )zO
    Return a connection object connected to the socket given by `address`
    T)r8   r1   r   r   connectr   r   )r7   r,   r  r   r   r   r     s
   

r   c                   @   s8   e Zd ZdZdddZdddZdd	 Zed
d ZdS )r   z0
        Representation of a named pipe
        Nc                 C   sL   || _ | jddg| _d | _td| j  tj| tj| j| j fdd| _	d S )NT)firstz listener created with address=%rr   r  )
r   _new_handle_handle_queuer   r   	sub_debugr  r   _finalize_pipe_listenerrX   )r=   r7   r   r   r   r   r>     s   zPipeListener.__init__Fc              
   C   sH   t jt jB }|r|t jO }t | j|t jt jB t jB t j	t
t
t jt jS r   )r   r   r   r   r   r   r   r   r   PIPE_UNLIMITED_INSTANCESr   r   r   )r=   r  flagsr   r   r   r    s   

zPipeListener._new_handlec              
   C   s   | j |   | j d}z	tj|dd}W n ty3 } z|jtjkr& W Y d }~t|S d }~ww z+zt	|j
gdt W n   |  t|  W |d\}}|dks\J t|S |d\}}|dksmJ w )Nr   Tr   F)r  appendr  popr   r  rR   r   ERROR_NO_DATAr   r   r   r   r   r   r   )r=   rK   r   r   r
  r   r   r   r   r     s2   


zPipeListener.acceptc                 C   s$   t d| | D ]}t| qd S )Nz closing listener with address=%r)r   r  r   r   )queuer7   rK   r   r   r   r     s   z$PipeListener._finalize_pipe_listenerr   )F)	r?   r@   rA   r   r>   r  r   staticmethodr   r   r   r   r   r     s    

r   c              
   C   s   t  }	 zt| d t| tjtjB dtjtjtjtj}W n t	y; } z|j
|vs0t|r1 W Y d}~nd}~ww nqt|tjdd t|S )zU
        Return a connection object connected to the pipe given by `address`
        r     r   N)r   r   WaitNamedPiper   r   r   r   r  r   rR   r   r   r  r   r   )r7   _ignorer   hr   r   r   r   r     s*   

r      s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 C   sr   dd l }t|tsJ tt}| t|  |||d	 }| 
d}||kr0| t d S | t td)Nr   md5   zdigest received was wrong)hmacrD   r`   r&   urandomMESSAGE_LENGTHrh   	CHALLENGEnewdigestrp   WELCOMEFAILUREr   
connectionr   r/  messager4  responser   r   r   r     s   


r   c                 C   s   dd l }t|tsJ | d}|d tt tks J d| |ttd  }|||d }| | | d}|t	krCt
dd S )Nr   r.  zmessage = %rr-  zdigest sent was rejected)r/  rD   r`   rp   ra   r2  r3  r4  rh   r5  r   r7  r   r   r   r     s   
 

r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ConnectionWrapperc                 C   s6   || _ || _|| _dD ]}t||}t| || qd S )N)rF   rX   r|   rp   rh   )_conn_dumps_loadsr   setattr)r=   connri   loadsattrrk   r   r   r   r>   2  s   
zConnectionWrapper.__init__c                 C   s   |  |}| j| d S r   )r=  r<  rh   )r=   rk   r  r   r   r   rl   :  s   
zConnectionWrapper.sendc                 C   s   | j  }| |S r   )r<  rp   r>  )r=   r  r   r   r   rx   >  s   

zConnectionWrapper.recvN)r?   r@   rA   r>   rl   rx   r   r   r   r   r;  0  s    r;  c                 C   s   t | fd d d d}|dS )Nr   utf-8)	xmlrpclibri   encode)rk   or   r   r   
_xml_dumpsC  s   
rG  c                 C   s   t | d\\}}|S )NrC  )rD  rA  decode)r  rk   methodr   r   r   
_xml_loadsH  s   rJ  c                   @   r9   )XmlListenerc                 C   s"   dd l ma t| }t|ttS Nr   )xmlrpc.clientclientrD  r   r   r;  rG  rJ  rj   r   r   r   r   O  s   
zXmlListener.acceptN)r?   r@   rA   r   r   r   r   r   rK  M  rB   rK  c                  O   s"   dd l ma tt| i |ttS rL  )rM  rN  rD  r;  r   rG  rJ  )r  kwdsr   r   r   	XmlClientV  s   rP  c                 C   s   t | }g }|rZt|d|}|tkr	 |S t|  kr$tt| k r+n n|t8 }nt|  kr9tt| k rCn td|t8 }ntd|||  ||d d  }d}|s|S )NFzShould not get herer   r   )	listr   r   WAIT_TIMEOUTr   ra   WAIT_ABANDONED_0r   r#  )handlesr   Lreadyresr   r   r   _exhaustive_waita  s$   
 

rX  c           
         sx  |du rt }n|dk rd}nt|d d }t| } i g }t  t }z| D ]W}zt|d}W n ty?   || < Y q'w zt| dd\}}W n t	yf } z|j
}|tvr\ W Y d}~nd}~ww |tjkrw|| ||j< q' | d}q't |}W |D ]}|  q|D ]A}z	|d\}	}W n t	y } z|j
}|tvr W Y d}~nd}~ww |tjkrӈ|j } | |dkrt|drd|_qnR|D ]}|  q|D ]E}z	|d\}	}W n t	y } z|j
}|tvr W Y d}~nd}~ww |tjkr%|j } | |dkr%t|dr%d|_qw  fdd	|D   fd
d| D S )
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   r(  g      ?rF   Tr   c                 3   s    | ]} | V  qd S r   r   ).0r+  )waithandle_to_objr   r   	<genexpr>  s    zwait.<locals>.<genexpr>c                    s   g | ]}| v r|qS r   r   )rZ  p)ready_objectsr   r   
<listcomp>  s    zwait.<locals>.<listcomp>)r   intrQ  setr   AttributeErrorrG   r   r   rR   r   _ready_errorsr   r#  r   addrX  keysr   r   ERROR_OPERATION_ABORTEDr0   r   update)
object_listr   ov_listready_handlesrF  rF   r   r   r   r
  r   )r^  r[  r   r   w  s   











r   r|   c                 C   s   |d ur
t |d }i }t }| D ]}||tj t|dr'||| < q|||< qg }||D ]\}}|tj@ rBtd| |	||  q3|S )Nr(  rF   zinvalid file descriptor %i)
r`  selectr|   registerPOLLINr0   rF   POLLNVALr*   r#  )fdsr   fd_mappollsterfdlsr   r   r   r   rz     s   


rz   c                 C   s   t  | g g |d S rL  )rk  )ro  r   r   r   r   rz     s   c              
   C   s   |dur|dkrt | dS t | }	 zt | |W S  tttjfy6 } z|jtjkr, W Y d}~nd}~ww |dur@|t  }q)rY  Nr   )rz   r   rR   r   r1   r   r   r   )rh  r   deadliner   r   r   r   r     s    


c                 C   sf   |   }t|tjtj}ddlm} ||}t|| j	| j
ffW  d    S 1 s,w   Y  d S )Nr   )resource_sharer)rF   r1   fromfdr   SOCK_STREAMr"   ru  	DupSocketrebuild_connectionrL   rM   )r@  rK   r  ru  dsr   r   r   reduce_connection  s   
$r{  c                 C   s   |   }tt |||S r   )r   r   )rz  rL   rM   r<   r   r   r   ry    s   ry  c                 C   sB   | j rtjnd| jrtjndB }t|  |}t|| j | jffS rL  )	rL   r   FILE_GENERIC_READrM   FILE_GENERIC_WRITEr   	DupHandlerF   rebuild_pipe_connection)r@  r  dhr   r   r   reduce_pipe_connection  s
   r  c                 C      t t| ||S r   )r   r   )r  rL   rM   r   r   r   r    r   r  c                 C   s    t |  }t|| j| jffS r   )r   DupFdrF   ry  rL   rM   )r@  dfr   r   r   r{    s   c                 C   r  r   )r   r   )r  rL   rM   r   r   r   ry    r   )NN)TFFr   )Or   r   r&   r.   r1   rk  r   r#   	itertoolsr"   r   r   r   r   _extr   compatr   r	   timer   r   r   ImportErrorr/   r   rS  rR  r   __all__r0   is_pypyr   CONNECTION_TIMEOUTcountr)   r   familiesr   r   r-   r2   r8   r:   rC   r   r   r   r   r   r   r   r   r   ERROR_SEM_TIMEOUTERROR_PIPE_BUSYr   r1  r2  r5  r6  r   r   r;  rG  rJ  rK  rP  rX  r   ERROR_NETNAME_DELETEDrc  r   rz   r{  ry  rl  r  r  r   r   r   r   <module>   s   	






 #SV
8

/28		G

