o
    Þý°jI~  ã                #   @   sÜ  d Z ddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZmZmZ ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl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&m'Z' zddl(Z(W n e)y‰   ddl*m+Z( Y nw e&r�ddl,Z,ej-j.Z/dd„ Z0dYdd	„Z1	dYd
ej2j3dej4j5e6B de
de7dB dee8e7f f
dd„Z9										dZd
ej2j3de
dB de7dB de:de:deej;j<ej=j>f dB de6dB de:de:de:dej4j5dB de
fdd„Z?											d[dej4j5de@d e7dB d!e8d"e@dB d#e8de:de:de:de:d
ej2j3dB d$ej2jAdB de:dej4j5fd%d&„ZB											d\dej4j5de@d e7dB d!e8d"e@dB d#e8de:de:de:d'ej2j3dB d(ej2jCdB d$ej2jAdB de:deej4j5e:f fd)d*„ZD	dYd
ej2jCdej4j5e6B de7dB dee8e7f fd+d,„ZEd-d.„ ZF					d]d
ej2jCde7dB de:deej;j<ej=j>f dB de6dB de:deej4j5e7f fd/d0„ZG								d^dej4j5de@d e7dB d!e8d"e@dB d#e8de:de:d
ej2jCdB d$ej2jAdB dej4j5fd1d2„ZH		3									4d_dej4j5de@d e7dB d!e8d"e@dB d#e8de:de:d
ej2jCdB d$ej2jAdB d5e(jIdB d6e@dB d7e:e@B dej4j5fd8d9„ZJd:ed; dd;fd<d=„ZKdd>dddddd?d4d4ddejLejMfdej4j5de@d e7dB d!e8d"e@dB d#e8de:de:d@edA dBe@dCe:d7e:e@B e(jIB dDe@dB d:ed; dEe8dFedej4j5f"dGdH„ZN		>					4		4	d`dej4j5de@dIe@d e7dB d!e8d"e@dB d#e8de:de:d7e:e@B e(jIB d$ej2jAdB dCe:dJejOjPdB dej4j5fdKdL„ZQ		3						4			dadej4j5de@d e7dB d!e8d"e@dB d#e8de:de:dJejOjPdB d7e:e@B d$ej2jAdB dMe@dB d6e@dB dej4j5fdNdO„ZOdPejRjSdQej2jTdej4j5dRe8dB d e7dB de7de
fdSdT„ZUdddddde!jVdfde@dPejRjSdej4j5dB d!e8d e7dB dUe7dB d"e@dB d#e8dVe!d$ej2jAdB ddfdWdX„ZWdS )bzTalk to a DNS server.é    N)ÚAnyÚDictÚOptionalÚTupleÚcast)ÚNullContext)ÚBadResponseÚHTTPVersionÚNoDOHÚNoDOQÚUDPModeÚ_check_statusÚ_compute_timesÚ_matches_destinationÚ
_remainingÚhave_dohÚmake_ssl_contextc                 C   sV   |s|r)|d u r%| t jkrd}||fS | t jkrd}||fS td| › �ƒ‚||fS d S )Nz0.0.0.0z::zunknown address family )ÚsocketÚAF_INETÚAF_INET6ÚNotImplementedError)ÚafÚaddressÚport© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/dns/asyncquery.pyÚ_source_tupleB   s   

üÿr   c                 C   s&   | d ur|s
t   ¡ }t| | dƒS d S ©Nr   )ÚtimeÚmax)Ú
expirationÚnowr   r   r   Ú_timeoutR   s
   r"   ÚsockÚwhatÚdestinationr    Úreturnc                 Ã   sB   �t |tjjƒr| ¡ }t ¡ }|  ||t||ƒ¡I dH }||fS )a†  Send a DNS message to the specified UDP socket.

    *sock*, a ``dns.asyncbackend.DatagramSocket``.

    *what*, a ``bytes`` or ``dns.message.Message``, the message to send.

    *destination*, a destination tuple appropriate for the address family
    of the socket, specifying where to send the query.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.  The expiration value is meaningless for the asyncio backend, as
    asyncio's transport sendto() never blocks.

    Returns an ``(int, float)`` tuple of bytes sent and the sent time.
    N)Ú
isinstanceÚdnsÚmessageÚMessageÚto_wirer   Úsendtor"   )r#   r$   r%   r    Ú	sent_timeÚnr   r   r   Úsend_udp[   s   €r/   Fó    Úignore_unexpectedÚone_rr_per_rrsetÚkeyringÚrequest_macÚignore_trailingÚraise_on_truncationÚignore_errorsÚqueryc              
   Ã   sÖ   �d}	 |   dt|ƒ¡I dH \}}t| j|||ƒsqt ¡ }ztjj||||||d�}W n- tjjyN } z|	rI|
durI|
 	| ¡ ¡sIW Y d}~q‚ d}~w t
yY   |	rXY q‚ w |	rf|
durf|
 	|¡sfq|||fS )aj  Read a DNS message from a UDP socket.

    *sock*, a ``dns.asyncbackend.DatagramSocket``.

    See :py:func:`dns.query.receive_udp()` for the documentation of the other
    parameters, and exceptions.

    Returns a ``(dns.message.Message, float, tuple)`` tuple of the received message, the
    received time, and the address where the message arrived from.
    r0   Téÿÿ  N)r3   r4   r2   r5   r6   )Úrecvfromr"   r   Úfamilyr   r(   r)   Ú	from_wireÚ	TruncatedÚis_responseÚ	Exception)r#   r%   r    r1   r2   r3   r4   r5   r6   r7   r8   ÚwireÚfrom_addressÚreceived_timeÚrÚer   r   r   Úreceive_udpy   sF   €
ÿ
úÿÿ€ü
rE   é5   ÚqÚwhereÚtimeoutr   ÚsourceÚsource_portÚbackendc                 Ã   s$  �|   ¡ }t|ƒ\}}tj |¡}t||f|ƒ}|
rt|
ƒ}n%|s&tj ¡ }t	|||ƒ}| 
¡ r5||f}nd}| |tjd||¡I dH }|4 I dH š;}t||||ƒI dH  t|||||| j| j||	|| ƒI dH \}}}|| |_|sy|  |¡syt‚|W  d  ƒI dH  S 1 I dH s‹w   Y  dS )aF  Return the response obtained after sending a query via UDP.

    *sock*, a ``dns.asyncbackend.DatagramSocket``, or ``None``,
    the socket to use for the query.  If ``None``, the default, a
    socket is created.  Note that if a socket is provided, the
    *source*, *source_port*, and *backend* are ignored.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.udp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    Nr   )r+   r   r(   ÚinetÚaf_for_addressÚ_lltupler   ÚasyncbackendÚget_default_backendr   Údatagram_connection_requiredÚmake_socketr   Ú
SOCK_DGRAMr/   rE   r3   Úmacr   r>   r   )rG   rH   rI   r   rJ   rK   r1   r2   r5   r6   r#   rL   r7   r@   Ú
begin_timer    r   r%   ÚcmÚstupleÚdtupleÚsrC   rB   Ú_r   r   r   Úudp¶   sD   €


õ
0ìr\   Úudp_sockÚtcp_sockc                 Ã   sr   �zt | ||||||||d|	||ƒI dH }|dfW S  tjjy8   t| ||||||||
|ƒ
I dH }|df Y S w )aÃ  Return the response to the query, trying UDP first and falling back
    to TCP if UDP results in a truncated response.

    *udp_sock*, a ``dns.asyncbackend.DatagramSocket``, or ``None``,
    the socket to use for the UDP query.  If ``None``, the default, a
    socket is created.  Note that if a socket is provided the *source*,
    *source_port*, and *backend* are ignored for the UDP query.

    *tcp_sock*, a ``dns.asyncbackend.StreamSocket``, or ``None``, the
    socket to use for the TCP query.  If ``None``, the default, a
    socket is created.  Note that if a socket is provided *where*,
    *source*, *source_port*, and *backend*  are ignored for the TCP query.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.udp_with_fallback()` for the documentation
    of the other parameters, exceptions, and return type of this
    method.
    TNF)r\   r(   r)   r=   Útcp)rG   rH   rI   r   rJ   rK   r1   r2   r5   r]   r^   rL   r7   Úresponser   r   r   Úudp_with_fallbackø   sB   €#
ó

öóra   c                 Ã   s^   �t |tjjƒr|jdd�}n
t|ƒ dd¡| }t ¡ }|  |t	||ƒ¡I dH  t|ƒ|fS )zîSend a DNS message to the specified TCP socket.

    *sock*, a ``dns.asyncbackend.StreamSocket``.

    See :py:func:`dns.query.send_tcp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    T)Úprepend_lengthé   ÚbigN)
r'   r(   r)   r*   r+   ÚlenÚto_bytesr   Úsendallr"   )r#   r$   r    Útcpmsgr-   r   r   r   Úsend_tcp<  s   €ri   c                 Ã   sT   �d}|dkr(|   |t|ƒ¡I dH }|dkrtdƒ‚|t|ƒ }|| }|dks|S )z|Read the specified number of bytes from stream.  Keep trying until we
    either get the desired amount, or we hit EOF.
    r0   r   NÚEOF)Úrecvr"   ÚEOFErrorre   )r#   Úcountr    rZ   r.   r   r   r   Ú_read_exactlyU  s   €ûrn   c                 Ã   sZ   �t | d|ƒI dH }t d|¡\}t | ||ƒI dH }t ¡ }	tjj|||||d�}
|
|	fS )zçRead a DNS message from a TCP socket.

    *sock*, a ``dns.asyncbackend.StreamSocket``.

    See :py:func:`dns.query.receive_tcp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    rc   Nú!H©r3   r4   r2   r5   )rn   ÚstructÚunpackr   r(   r)   r<   )r#   r    r2   r3   r4   r5   ÚldataÚlr@   rB   rC   r   r   r   Úreceive_tcpc  s   €ûru   c
              	   Ã   s  �|   ¡ }
t|ƒ\}}|r| ¡ I dH  t|ƒ}n%tj |¡}t|||ƒ}||f}|	s0tj 	¡ }	|	 
|tjd|||¡I dH }|4 I dH š2}t||
|ƒI dH  t|||| j| j|ƒI dH \}}|| |_|  |¡sjt‚|W  d  ƒI dH  S 1 I dH s|w   Y  dS )aO  Return the response obtained after sending a query via TCP.

    *sock*, a ``dns.asyncbacket.StreamSocket``, or ``None``, the
    socket to use for the query.  If ``None``, the default, a socket
    is created.  Note that if a socket is provided
    *where*, *port*, *source*, *source_port*, and *backend* are ignored.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.tcp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    Nr   )r+   r   Úgetpeernamer   r(   rM   rN   r   rP   rQ   rS   r   ÚSOCK_STREAMri   ru   r3   rU   r   r>   r   )rG   rH   rI   r   rJ   rK   r2   r5   r#   rL   r@   rV   r    rW   r   rX   rY   rZ   rC   rB   r   r   r   r_   �  s:   €


ÿú

0ór_   éU  TÚssl_contextÚserver_hostnameÚverifyc                 Ã   sþ   �t |ƒ\}}|rt|ƒ}n4|
du rt||dudgƒ}
tj |¡}t|||ƒ}||f}|	s2tj ¡ }	|	 	|t
jd||||
|¡I dH }|4 I dH š*}t|ƒ}t| |||||||||	ƒ
I dH }t ¡ }|| |_|W  d  ƒI dH  S 1 I dH sxw   Y  dS )a¦  Return the response obtained after sending a query via TLS.

    *sock*, an ``asyncbackend.StreamSocket``, or ``None``, the socket
    to use for the query.  If ``None``, the default, a socket is
    created.  Note that if a socket is provided, it must be a
    connected SSL stream socket, and *where*, *port*,
    *source*, *source_port*, *backend*, *ssl_context*, and *server_hostname*
    are ignored.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.tls()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    NÚdotr   )r   r   r   r(   rM   rN   r   rP   rQ   rS   r   rw   r"   r_   r   )rG   rH   rI   r   rJ   rK   r2   r5   r#   rL   ry   rz   r{   rV   r    rW   r   rX   rY   rZ   r`   Úend_timer   r   r   Útls¾  sN   €


ø

ö
0ðr~   Úresolverzdns.asyncresolver.Resolverc                 C   s   | d u rdd l }|j ¡ } | S r   )Údns.asyncresolverÚasyncresolverÚResolver)r   r(   r   r   r   Ú_maybe_get_resolver  s   
rƒ   é»  z
/dns-queryÚclientz.httpx.AsyncClient|dns.quic.AsyncQuicConnectionÚpathÚpostÚbootstrap_addressr;   Úhttp_versionc           "      Ã   sf  �zt j |¡}W n ty   d}Y nw |}|dur@t j |¡r@|tjkr1d|› d|› |	› �}n|tjkr@d|› d|› |	› �}i }|du rltj	 
|¡}|jdu rUtdƒ‚t j |j¡rd|j}|j|d< |jdurl|j}|tjksx|tjkrÇtsÇ|du ršt|ƒ}|jdus‡J ‚| |j|¡I dH }t t| ¡ ƒ¡}|r§t|t jjƒs§tdƒ‚|du s´t|t jjƒs´J ‚t| ||||||||||
|d	�I dH S tsËt‚|r×t|tjƒs×td
ƒ‚|  ¡ }ddi}|tjtjfv }|tj tjfv }t j! "¡ }|du rýd}d}n|}|}|�r	t#|ƒ}n| $¡ ||||||||d�}tj||||d�}|4 I dH šI}|
�rG| %dt&t'|ƒƒdœ¡ | (|j)||||d�|¡I dH }nt* +|¡ ,d¡}| -¡ } | (|j.||d| i|d�|¡I dH }W d  ƒI dH  n1 I dH �svw   Y  |j/dk �s‡|j/dk�r•t|› d|j/› d|j0›�ƒ‚t j1j2|j0| j3| j4||d�}!|j5 6¡ |!_7|  8|!¡�s±t9‚|!S )aÃ  Return the response obtained after sending a query via DNS-over-HTTPS.

    *client*, a ``httpx.AsyncClient``.  If provided, the client to use for
    the query.

    Unlike the other dnspython async functions, a backend cannot be provided
    in this function because httpx always auto-detects the async backend.

    See :py:func:`dns.query.https()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    Nzhttps://ú:z	https://[z]:zno hostname in URLÚsni_hostnamez8client parameter must be a dns.quic.AsyncQuicConnection.)r{   r‡   Ú
connectionz-client parameter must be an httpx.AsyncClientÚacceptzapplication/dns-messager   )Úlocal_addressÚhttp1Úhttp2r{   Ú
local_portrˆ   r   r;   )r�   r�   r{   Ú	transport)zcontent-typezcontent-length)ÚheadersÚcontentÚ
extensionsó   =r(   )r“   Úparamsr•   éÈ   i+  z responded with status code z
Response body: rp   ):r(   rM   rN   Ú
ValueErrorÚ
is_addressr   r   r   ÚurllibÚparseÚurlparseÚhostnamer   r	   ÚH3ÚDEFAULTr   rƒ   Úresolve_nameÚrandomÚchoiceÚlistÚ	addressesr'   ÚquicÚAsyncQuicConnectionÚ_http3r
   ÚhttpxÚAsyncClientr+   ÚH1ÚH2rP   rQ   r   Úget_transport_classÚupdateÚstrre   Úwait_forr‡   Úbase64Úurlsafe_b64encodeÚrstripÚdecodeÚgetÚstatus_coder”   r)   r<   r3   r4   ÚelapsedÚtotal_secondsr   r>   r   )"rG   rH   rI   r   rJ   rK   r2   r5   r…   r†   r‡   r{   rˆ   r   r;   r‰   r   Úurlr•   ÚparsedÚanswersr@   r“   Úh1Úh2rL   rŽ   r‘   rW   r’   Ú
the_clientr`   ÚtwirerC   r   r   r   Úhttps  sø   €ÿ






ÿÿô

øÿ
þÿüù
üù*ê"ÿÿûrÀ   r¹   rŒ   c                 Ã   sÖ  �t jjs	tdƒ‚tj |¡}|j}|d usJ ‚|jd ur |j}d| _	|  
¡ }|r2t jj}t jj}nt j |
¡\}}|ƒ 4 I d H šŽ}|||	|dd�4 I d H š_}|rT|}n| ||||¡}t|ƒ\}}| |¡I d H }|4 I d H š$ | |||¡ | t|ƒ¡I d H }t| ¡ ||ƒ W d   ƒI d H  n1 I d H sšw   Y  t ¡ }W d   ƒI d H  n1 I d H s³w   Y  t jj|| j| j||d�}W d   ƒI d H  n1 I d H sÕw   Y  t|| dƒ|_|  |¡sét‚|S )Nz DNS-over-HTTP3 is not available.r   T)Úverify_modeÚserver_nameÚh3rp   ç        )r(   r¦   Ú	have_quicr
   r›   rœ   r�   rž   r   Úidr+   Únull_factoryÚfactories_for_backendÚconnectr   Úmake_streamÚsend_h3Úreceiver   r   r“   r   r)   r<   r3   r4   r   r>   r   )rG   rH   r¹   rI   r   rJ   rK   r2   r5   r{   rL   r‡   rŒ   Ú	url_partsrž   r@   ÚcfactoryÚmfactoryÚcontextÚthe_managerÚthe_connectionÚstartr    ÚstreamÚfinishrC   r   r   r   r¨   Â  sZ   €

ÿÿ(ü
(ðû(î
r¨   rž   c                 Ã   s¬  �t jjs	tdƒ‚|dur|du r|}d| _|  ¡ }|r't jj}t jj}|}nt j |
¡\}}|ƒ 4 I dH š„}|||	|d�4 I dH šV}|sM| ||||¡}t	|ƒ\}}| 
|¡I dH }|4 I dH š | |d¡I dH  | t|ƒ¡I dH }W d  ƒI dH  n1 I dH s…w   Y  t ¡ }W d  ƒI dH  n1 I dH sžw   Y  t jj|| j| j||d�}W d  ƒI dH  n1 I dH sÀw   Y  t|| dƒ|_|  |¡sÔt‚|S )ai  Return the response obtained after sending an asynchronous query via
    DNS-over-QUIC.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.quic()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    zDNS-over-QUIC is not available.Nr   )rÁ   rÂ   Trp   rÄ   )r(   r¦   rÅ   r   rÆ   r+   rÇ   rÈ   rÉ   r   rÊ   ÚsendrÌ   r   r   r)   r<   r3   r4   r   r>   r   )rG   rH   rI   r   rJ   rK   r2   r5   rŒ   r{   rL   rž   rz   r@   rÎ   rÏ   rÒ   rÐ   rÑ   rÓ   r    rÔ   rÕ   rC   r   r   r   r¦     sV   €ýÿ(þ
(òû(ð
r¦   Útxn_managerrZ   Úserialc                 C  sØ  �|j d j}|tjjk}|  ¡ }| ¡ }	|jtj	k}
|
r1t
tjj|ƒ}| |	dt|ƒ¡I dH  nt
tjj|ƒ}t dt|	ƒ¡|	 }| ||¡I dH  tj | |||
¡�Ž}d}d}d}|sºt|ƒ\}}|du so|durq||krq|}|
rƒt|ƒ}| d|¡I dH \}}nt|d|ƒI dH }t d|¡\}t|||ƒI dH }tjj||j|jd|||
 |d�}| |¡}|V  |j}|r]|jrÊ|durÒ|j sÚtj! "d	¡‚W d  ƒ dS W d  ƒ dS W d  ƒ dS 1 såw   Y  dS )
z'Given a socket, does the zone transfer.r   Nro   Fr9   rc   T)r3   r4   ÚxfrÚoriginÚtsig_ctxÚmultir2   zmissing TSIG)#ÚquestionÚrdtyper(   Ú	rdatatypeÚIXFRÚfrom_wire_originr+   Útyper   rT   r   rP   ÚDatagramSocketr,   r"   ÚStreamSocketrq   Úpackre   rg   rÙ   ÚInboundr   r:   rn   rr   r)   r<   r3   rU   Úprocess_messagerÛ   Úhad_tsigÚ	exceptionÚ	FormError)r×   rZ   r8   rØ   rI   r    rÞ   Úis_ixfrrÚ   r@   Úis_udpr]   r^   rh   ÚinboundÚdonerÛ   rC   r[   ÚmexpirationÚrwirers   rt   r   r   r   Ú_inbound_xfrH  sb   €	ø

çÿââ"ârñ   ÚlifetimeÚudp_modec
              	   Ã   s¶  �|du rt j |¡\}}
nt j |¡}
t j | ¡}t|||ƒ}| |f}|	s+t j ¡ }	t	|ƒ\}}|j
d jt jjkr›|tjkr›|	 |tjd||t|ƒ¡I dH }|4 I dH š: zt||||
||ƒ2 z3 dH W }qa6 W W d  ƒI dH  dS  t jjy…   |tjkrƒ‚ Y nw W d  ƒI dH  n1 I dH s–w   Y  |	 |tjd||t|ƒ¡I dH }|4 I dH š t||||
||ƒ2 z3 dH W }q»6 W d  ƒI dH  dS 1 I dH sÔw   Y  dS )am  Conduct an inbound transfer and apply it via a transaction from the
    txn_manager.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.inbound_xfr()` for the documentation of
    the other parameters, exceptions, and return type of this method.
    Nr   )r(   rÙ   Ú
make_queryÚextract_serial_from_queryrM   rN   r   rP   rQ   r   rÝ   rÞ   rß   rà   r   ÚNEVERrS   r   rT   r"   rñ   ÚUseTCPÚONLYrw   )rH   r×   r8   r   rI   rò   rJ   rK   ró   rL   rØ   r   rX   rY   r[   r    rZ   r   r   r   Úinbound_xfr  sZ   €

ÿúø	õ
ÿÿ(ó
ÿÿý.ÿrù   )N)
NNFFNr0   FFFN)NrF   Nr   FFFFNNF)NrF   Nr   FFFNNNF)NFNr0   F)NrF   Nr   FFNN)Nrx   Nr   FFNNNNT)
Nr„   Nr   FFTNTN)Nrx   Nr   FFNTNNN)XÚ__doc__r±   Ú
contextlibr¢   r   rq   r   Úurllib.parser›   Útypingr   r   r   r   r   Údns.asyncbackendr(   Údns.exceptionÚdns.inetÚdns.messageÚdns.nameÚdns.quicÚdns.rdatatypeÚdns.transactionÚdns.tsigÚdns.xfrÚdns._asyncbackendr   Ú	dns.queryr   r	   r
   r   r   r   r   r   r   r   r   ÚsslÚImportErrorÚdns._no_sslÚ_no_sslr©   rM   Úlow_level_address_tuplerO   r   r"   rP   rã   r)   r*   ÚbytesÚfloatÚintr/   ÚboolÚnameÚNameÚtsigÚKeyrE   r¯   ÚBackendr\   rä   ra   ri   rn   ru   r_   Ú
SSLContextr~   rƒ   Ú	AF_UNSPECr    rÀ   r¦   r§   r¨   ÚtransactionÚTransactionManagerÚSocketrñ   rö   rù   r   r   r   r   Ú<module>   sp  4ÿ
üÿ
þýü

û õÿþýüûúùø	÷
ö
õ
ô@óÿþýüûúùø	÷
ö
õ
ôó
òEóÿþýüûúùø	÷

ö
õ
ôó
òGýÿ
þý

üúÿþýüûú
ù!öÿþýüûúùø
	÷

ö
õ@óÿþýüûúùø
	÷

öõôó
òFÿ
þðÿþýüûúùø	÷
öõôóòñð
ï 5óÿþýüûúùø	÷
ö
õô
ó
òCóÿþýüûúùø
	÷
ö
õôó
òFÿþýüûú
ù:öÿþ
ýüûúùø	÷

öõ