Ë
    ojkO  ã                  ó¦  — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
mZmZ ddlmZmZmZmZmZ ddlmZ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 m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 	 ddl6m7Z8 e8Z9erddl;m<Z< e ejz                  e"ej|                  iZ? ee&ej€                  ej‚                  «       G d„ dej„                  e1e,«      «       ZCe9� eeCejˆ                  «        G d„ de-e.eC«      ZE G d„ deC«      ZF G d„ de+«      Z* eejŽ                  «       G d„ de1e«      «       ZHy# e:$ r dZ9Y Œ½w xY w)z
TCP support for IOCP reactor
é    )ÚannotationsN)ÚTYPE_CHECKINGÚOptionalÚUnion)ÚclassImplementsÚimplementer)ÚaddressÚdeferÚerrorÚ
interfacesÚmain)Ú	_LogOwnerÚisIPv6Address)ÚIPv4AddressÚIPv6Address)Ú	IProtocol)ÚabstractÚiocpsupport)ÚERROR_CONNECTION_REFUSEDÚERROR_IO_PENDINGÚERROR_NETWORK_UNREACHABLEÚSO_UPDATE_ACCEPT_CONTEXTÚSO_UPDATE_CONNECT_CONTEXT)ÚIReadWriteHandle)ÚProtocol)Ú	ConnectorÚ_AbortingMixinÚ_BaseBaseClientÚ_BaseTCPClientÚ_getsocknameÚ_resolveIPv6Ú_SocketCloser)ÚfailureÚlogÚreflect)ÚstartTLS)ÚIOCPReactorc                  óœ   — e Zd ZdZdZdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Ze�dd„Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zy)Ú
ConnectionzÞ
    @ivar TLS: C{False} to indicate the connection is in normal TCP mode,
        C{True} to indicate that TLS has been started and that operations must
        be routed through the L{TLSMemoryBIOProtocol} instance.
    FNc                ó‚   — t         j                  j                  | |«       || _        |j                  | _        || _        y ©N)r   Ú
FileHandleÚ__init__ÚsocketÚfilenoÚgetFileHandleÚprotocol)ÚselfÚsockÚprotoÚreactors       úB/usr/lib/python3/dist-packages/twisted/internet/iocpreactor/tcp.pyr-   zConnection.__init__F   s2   € Ü×Ñ×$Ñ$ T¨7Ô3ØˆŒØ!Ÿ[™[ˆÔØˆ�ó    c                ó   — | j                   S r+   )r.   ©r2   s    r6   Ú	getHandlezConnection.getHandleL   s   € Ø�{‰{Ðr7   c                óÂ   — t        |t        «      rn3t        |t        «      rt        |«      }nt        dt	        |«      z   «      ‚| j
                  j                  |«       y)z`
        @param rbuffer: Data received.
        @type rbuffer: L{bytes} or L{bytearray}
        z%data must be bytes or bytearray, not N)Ú
isinstanceÚbytesÚ	bytearrayÚ	TypeErrorÚtyper1   ÚdataReceived)r2   Úrbuffers     r6   rA   zConnection.dataReceivedO   sK   € ô
 �gœuÔ%ØÜ˜¤Ô+ä˜G“n‰GäÐCÄdÈ7ÃmÑSÓTÐTà�‰×"Ñ" 7Õ+r7   c                óL   — t        j                  | j                  «       ||«      S r+   )Ú_iocpÚrecvr0   )r2   ÚbufflistÚevts      r6   ÚreadFromHandlezConnection.readFromHandle^   s   € Ü�z‰z˜$×,Ñ,Ó.°¸#Ó>Ð>r7   c                ó˜   — t        |«      }t        j                  | j                  «       |d| j                   j                  «       |«      S )zŽ
        Send C{buff} to current file handle using C{_iocp.send}. The buffer
        sent is limited to a size of C{self.SEND_LIMIT}.
        r   )Ú
memoryviewrD   Úsendr0   Ú
SEND_LIMITÚtobytes)r2   ÚbuffrG   Ú	writeViews       r6   ÚwriteToHandlezConnection.writeToHandlea   sC   € ô
 ˜tÓ$ˆ	Ü�z‰zØ×ÑÓ  )¨A°·±Ð"@×"HÑ"HÓ"JÈCó
ð 	
r7   c                óR  — 	 | j                   j                  d«       t        j                  | j
                  d «      }|r	 |j                  «        y y # t        $ r Y Œ@w xY w# t        $ r< t        j                  «       }t        j                  «        | j                  |«       Y y w xY w)Né   )r.   ÚshutdownÚOSErrorr   ÚIHalfCloseableProtocolr1   ÚwriteConnectionLostÚBaseExceptionr#   ÚFailurer$   ÚerrÚconnectionLost)r2   ÚpÚfs      r6   Ú_closeWriteConnectionz Connection._closeWriteConnectionk   s‘   € ð	Ø�K‰K× Ñ  Ô#ô ×-Ñ-¨d¯m©m¸TÓBˆÙð'Ø×%Ñ%Õ'ð øô ò 	Ùð	ûô !ò 'Ü—O‘OÓ%�Ü—‘”	Ø×#Ñ# AÖ&ð'ús$   ‚A Á A! Á	AÁAÁ!AB&Â%B&c                ó  — t        j                  | j                  d «      }|r	 |j                  «        y | j                  |«       y # t        $ r: t        j                  «        | j                  t        j                  «       «       Y y w xY wr+   )
r   rU   r1   ÚreadConnectionLostrW   r$   rY   rZ   r#   rX   )r2   Úreasonr[   s      r6   r_   zConnection.readConnectionLosty   sk   € Ü×-Ñ-¨d¯m©m¸TÓBˆÙð7Ø×$Ñ$Õ&ð
 ×Ñ Õ'øô	 !ò 7Ü—‘”	Ø×#Ñ#¤G§O¡OÓ$5Ö6ð7ús   ¤A ÁA B
Â	B
c                ó  — | j                   ry t        j                  j                  | |«       |d u xs  |j	                  t
        j                  «       }| j                  |«       | j                  }| `| `	| `
|j                  |«       y r+   )Údisconnectedr   r,   rZ   Úcheckr   ÚConnectionAbortedÚ_closeSocketr1   r.   r0   )r2   r`   ÚisCleanr1   s       r6   rZ   zConnection.connectionLost„   sy   € Ø×ÒØÜ×Ñ×*Ñ*¨4°Ô8Ø˜D�.ÒM¨¯©´U×5LÑ5LÓ(MÐ$MˆØ×Ñ˜'Ô"Ø—=‘=ˆØˆMØˆKØÐØ×Ñ Õ'r7   c                ó   — | j                   S )zN
        Return the prefix to log with when I own the logging thread.
        )Úlogstrr9   s    r6   Ú	logPrefixzConnection.logPrefix�   ó   € ð �{‰{Ðr7   c                ó„   — t        | j                  j                  t        j                  t        j                  «      «      S r+   )Úboolr.   Ú
getsockoptÚIPPROTO_TCPÚTCP_NODELAYr9   s    r6   ÚgetTcpNoDelayzConnection.getTcpNoDelay–   s*   € Ü�D—K‘K×*Ñ*¬6×+=Ñ+=¼v×?QÑ?QÓRÓSÐSr7   c                óv   — | j                   j                  t         j                  t         j                  |«       y r+   )r.   Ú
setsockoptrn   ro   ©r2   Úenableds     r6   ÚsetTcpNoDelayzConnection.setTcpNoDelay™   s$   € Ø�‰×Ñœv×1Ñ1´6×3EÑ3EÀwÕOr7   c                ó„   — t        | j                  j                  t        j                  t        j                  «      «      S r+   )rl   r.   rm   Ú
SOL_SOCKETÚSO_KEEPALIVEr9   s    r6   ÚgetTcpKeepAlivezConnection.getTcpKeepAliveœ   s*   € Ü�D—K‘K×*Ñ*¬6×+<Ñ+<¼f×>QÑ>QÓRÓSÐSr7   c                óv   — | j                   j                  t         j                  t         j                  |«       y r+   )r.   rr   rw   rx   rs   s     r6   ÚsetTcpKeepAlivezConnection.setTcpKeepAliveŸ   s$   € Ø�‰×Ñœv×0Ñ0´&×2EÑ2EÀwÕOr7   c                ó<   — t        | ||t        j                  «       y)z9
            @see: L{ITLSTransport.startTLS}
            N)Ú	_startTLSr   r,   )r2   ÚcontextFactoryÚnormals      r6   r&   zConnection.startTLS¤   s   € ô �d˜N¨F´H×4GÑ4GÕHr7   c                ó®   — | j                   ry| j                  r| j                  j                  |«       yt        j
                  j                  | |«       y)zò
        Write some data, either directly to the underlying handle or, if TLS
        has been started, to the L{TLSMemoryBIOProtocol} for it to encrypt and
        send.

        @see: L{twisted.internet.interfaces.ITransport.write}
        N)rb   ÚTLSr1   Úwriter   r,   )r2   Údatas     r6   r‚   zConnection.writeª   s?   € ð ×ÒØØ�8Š8Ø�M‰M×Ñ Õ%ä×Ñ×%Ñ% d¨DÕ1r7   c                ó®   — | j                   ry| j                  r| j                  j                  |«       yt        j
                  j                  | |«       y)zú
        Write some data, either directly to the underlying handle or, if TLS
        has been started, to the L{TLSMemoryBIOProtocol} for it to encrypt and
        send.

        @see: L{twisted.internet.interfaces.ITransport.writeSequence}
        N)rb   r�   r1   ÚwriteSequencer   r,   )r2   Úiovecs     r6   r…   zConnection.writeSequence¹   s?   € ð ×ÒØØ�8Š8Ø�M‰M×'Ñ'¨Õ.ä×Ñ×-Ñ-¨d°EÕ:r7   c                óÆ   — | j                   r5| j                  r(| j                  s| j                  j	                  «        yyyt
        j                  j	                  | |«       y)z®
        Close the underlying handle or, if TLS has been started, first shut it
        down.

        @see: L{twisted.internet.interfaces.ITransport.loseConnection}
        N)r�   Ú	connectedÚdisconnectingr1   ÚloseConnectionr   r,   )r2   r`   s     r6   rŠ   zConnection.loseConnectionÈ   sI   € ð �8Š8Ø�~Š~ d×&8Ò&8Ø—‘×,Ñ,Õ.ð '9ˆ~ô ×Ñ×.Ñ.¨t°VÕ<r7   c                ó˜   — | j                   r| j                  j                  ||«       yt        j                  j                  | ||«       y)zc
        Register a producer.

        If TLS is enabled, the TLS connection handles this.
        N)r�   r1   ÚregisterProducerr   r,   )r2   ÚproducerÚ	streamings      r6   rŒ   zConnection.registerProducerÕ   s9   € ð �8Š8ð
 �M‰M×*Ñ*¨8°YÕ?ä×Ñ×0Ñ0°°xÀÕKr7   c                ó�   — | j                   r| j                  j                  «        yt        j                  j                  | «       y)ze
        Unregister a producer.

        If TLS is enabled, the TLS connection handles this.
        N)r�   r1   ÚunregisterProducerr   r,   r9   s    r6   r�   zConnection.unregisterProducerä   s/   € ð �8Š8Ø�M‰M×,Ñ,Õ.ä×Ñ×2Ñ2°4Õ8r7   c                 ó   — y r+   © r9   s    r6   ÚgetHostzConnection.getHostï   ó   € àr7   c                 ó   — y r+   r’   r9   s    r6   ÚgetPeerzConnection.getPeeró   r”   r7   r+   )T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r�   r-   r:   rA   rH   rP   r]   r_   rZ   ri   rp   ru   ry   r{   r}   r&   r‚   r…   rŠ   rŒ   r�   r“   r–   r’   r7   r6   r)   r)   <   s…   „ ñð €Cóòò,ò?ò
ò'ò	(ò
(òòTòPòTòPð Ðó	Iò2ò;ó=òLò	9òór7   r)   c                  ól   — e Zd ZdZej
                  Zej                  ZdZ	e
Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy	)
ÚClientzº
    @ivar _tlsClientDefault: Always C{True}, indicating that this is a client
        connection, and by default when TLS is negotiated this class will act as
        a TLS client.
    Tc                óN   — |€d}|| _         t        j                  | |||||«       y )N)Ú r   )r5   r   r-   )r2   ÚhostÚportÚbindAddressÚ	connectorr5   s         r6   r-   zClient.__init__	  s,   € àÐØ!ˆKØˆŒÜ×Ñ  d¨D°+¸yÈ'ÕRr7   c                ób   — | j                   j                  | j                  | j                  «      S )zd
        Create a socket registered with the IOCP reactor.

        @see: L{_BaseTCPClient}
        )r5   ÚcreateSocketÚaddressFamilyÚ
socketTyper9   s    r6   ÚcreateInternetSocketzClient.createInternetSocket  s%   € ð �|‰|×(Ñ(¨×);Ñ);¸T¿_¹_ÓMÐMr7   c                ó   — | ` | `y)z–
        Clean up potentially circular references to the socket and to its
        C{getFileHandle} method.

        @see: L{_BaseBaseClient}
        N)r.   r0   r9   s    r6   Ú_collectSocketDetailszClient._collectSocketDetails  s   € ð ˆK˜Ñ+r7   c                ó:   — | j                   j                  | «       y)z^
        Remove the active handle from the reactor.

        @see: L{_BaseBaseClient}
        N)r5   ÚremoveActiveHandler9   s    r6   Ú_stopReadingAndWritingzClient._stopReadingAndWriting!  s   € ð 	�‰×'Ñ'¨Õ-r7   c           	     óÖ  — |r[t         j                  ||«      }| j                  t        j                  |t
        j                  j                  |d«      f«      «       y | j                  j                  t        j                  t        t        j                  d| j                  j                  «       «      «       | j                  j                  | j!                  «       «      | _        d| _        | j'                  | j"                  «      }|dz   | _        | j"                  € t+        «       | _        | j-                  «        y | j"                  j/                  | «       | j1                  «        y )NzUnknown errorÚPTz,client)ÚconnectExErrorsÚgetÚfailIfNotConnectedr   ÚgetConnectErrorÚerrnoÚ	errorcoder.   rr   rw   r   ÚstructÚpackr/   r¢   ÚbuildProtocolr–   r1   rˆ   Ú_getLogPrefixrh   r   rŠ   ÚmakeConnectionÚstartReading)r2   Úrcrƒ   rG   ri   s        r6   Ú	cbConnectzClient.cbConnect)  s  € ÙÜ ×$Ñ$ R¨Ó,ˆBØ×#Ñ#Ü×%Ñ% r¬5¯?©?×+>Ñ+>¸rÀ?Ó+SÐ&TÓUõð �K‰K×"Ñ"Ü×!Ñ!Ü)Ü—‘˜C §¡×!3Ñ!3Ó!5Ó6ôð
 !ŸN™N×8Ñ8¸¿¹»ÓHˆDŒMØ!ˆDŒNØ×*Ñ*¨4¯=©=Ó9ˆIØ# iÑ/ˆDŒKØ�}‰}Ð$ô !)£
�”à×#Ñ#Õ%à—‘×,Ñ,¨TÔ2Ø×!Ñ!Õ#r7   c                ój  — t        | d«      sy t        j                  sJ ‚| j                  j	                  | «       t        j
                  | j                  | «      }t        j                  | j                  j                  «       | j                  |«      }|r|t        k7  r| j                  |d|«       y y y )Nr¢   r   )ÚhasattrrD   Úhave_connectexr5   ÚaddActiveHandleÚEventr¼   Úconnectr.   r/   ÚrealAddressr   )r2   rG   r»   s      r6   Ú	doConnectzClient.doConnectG  s�   € Ü�t˜[Ô)ð Ü×#Ò#Ð#Ð#Ø�‰×$Ñ$ TÔ*Ü�k‰k˜$Ÿ.™.¨$Ó/ˆä�]‰]˜4Ÿ;™;×-Ñ-Ó/°×1AÑ1AÀ3ÓGˆÙ�"Ô(Ò(Ø�N‰N˜2˜q #Õ&ð )ˆ2r7   N)r—   r˜   r™   rš   r.   ÚAF_INETr¥   ÚSOCK_STREAMr¦   Ú_tlsClientDefaultr)   Ú_commonConnectionr-   r§   r©   r¬   r¼   rÄ   r’   r7   r6   rœ   rœ   ü   sI   „ ñð —N‘N€MØ×#Ñ#€JàÐØ"ÐòSòNò,ò.ò$ó<'r7   rœ   c                  óH   — e Zd ZdZdZ	 	 	 	 	 	 	 	 	 	 	 	 dd„Zd	d„Zd„ Zd„ Zy)
ÚServeraV  
    Serverside socket-stream connection class.

    I am a serverside network connection transport; a socket which came from an
    accept() on a server.

    @ivar _tlsClientDefault: Always C{False}, indicating that this is a server
        connection, and by default when TLS is negotiated this class will act as
        a TLS server.
    Fc                ó°  — t         j                  | |||«       || _        || _        || _        | j                  | j                  «      }|› d|› d| j                  j                  › �| _        dj                  | j                  j                  j                  | j                  | j                  j                  «      | _        d| _        | j                  «        y)a  
        Server(sock, protocol, client, server, sessionno)

        Initialize me with a socket, a protocol, a descriptor for my peer (a
        tuple of host, port describing the other end of the connection), an
        instance of Port, and a session number.
        ú,z<{} #{} on {}>TN)r)   r-   Ú
serverAddrÚ
clientAddrÚ	sessionnor¸   r1   rŸ   rh   ÚformatÚ	__class__r—   r    Úrepstrrˆ   rº   )r2   r3   r1   rÎ   rÍ   rÏ   r5   ri   s           r6   r-   zServer.__init__c  s²   € ô  	×Ñ˜D $¨°'Ô:Ø$ˆŒØ$ˆŒØ"ˆŒØ×&Ñ& t§}¡}Ó5ˆ	Ø"˜ 1 Y K¨q°·±×1EÑ1EÐ0FÐGˆŒØ+×2Ñ2Ø�M‰M×#Ñ#×,Ñ,Ø�N‰NØ�O‰O× Ñ ó
ˆŒð
 ˆŒØ×ÑÕr7   c                ó   — | j                   S )z=
        A string representation of this connection.
        )rÒ   r9   s    r6   Ú__repr__zServer.__repr__�  rj   r7   c                ó   — | j                   S )zW
        Returns an IPv4Address.

        This indicates the server's address.
        )rÍ   r9   s    r6   r“   zServer.getHost‡  ó   € ð �‰Ðr7   c                ó   — | j                   S )zW
        Returns an IPv4Address.

        This indicates the client's address.
        )rÎ   r9   s    r6   r–   zServer.getPeer�  rÖ   r7   N)r3   zsocket.socketr1   r   rÎ   úUnion[IPv4Address, IPv6Address]rÍ   rØ   rÏ   Úintr5   r'   ©ÚreturnÚstr)	r—   r˜   r™   rš   rÇ   r-   rÔ   r“   r–   r’   r7   r6   rÊ   rÊ   U  s]   „ ñ	ð Ððàðð ðð 4ð	ð
 4ðð ðð óó<òór7   rÊ   c                  ó   — e Zd Zd„ Zy)r   c                óp   — t        | j                  | j                  | j                  | | j                  «      S r+   )rœ   rŸ   r    r¡   r5   r9   s    r6   Ú_makeTransportzConnector._makeTransport™  s'   € Ü�d—i‘i §¡¨D×,<Ñ,<¸dÀDÇLÁLÓQÐQr7   N)r—   r˜   r™   rß   r’   r7   r6   r   r   ˜  s   „ óRr7   r   c                  óú   — e Zd ZU dZdZdZej                  Zej                  Z
ej                  ZdZdZded<   dZdd„Zdd„Zd	„ Z ej,                  ej0                  «      fd
„ZeZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!y)ÚPortFr   NzOptional[int]Ú_realPortNumberÚTCPc                ó¶   — || _         || _        || _        || _        || _        t        |«      r+t        j                  | _        t        j                  | _        y y r+   )r    ÚfactoryÚbacklogÚ	interfacer5   r   r.   ÚAF_INET6r¥   r	   r   Ú_addressType)r2   r    rå   ræ   rç   r5   s         r6   r-   zPort.__init__±  sL   € ØˆŒ	ØˆŒØˆŒØ"ˆŒØˆŒÜ˜Ô#Ü!'§¡ˆDÔÜ '× 3Ñ 3ˆDÕð $r7   c                óð   — | j                   �;dj                  | j                  | j                  j                  | j                   «      S dj                  | j                  | j                  j                  «      S )Nz<{} of {} on {}>z<{} of {} (not listening)>)râ   rÐ   rÑ   rå   r9   s    r6   rÔ   zPort.__repr__»  sg   € Ø×ÑÐ+Ø%×,Ñ,Ø—‘Ø—‘×&Ñ&Ø×$Ñ$óð ð 0×6Ñ6Ø—‘Ø—‘×&Ñ&óð r7   c                óÆ  — 	 | j                   j                  | j                  | j                  «      }| j                  t        j
                  k(  r!t        | j                  | j                  «      }n| j                  | j                  f}|j                  |«       t        j                  |j                  «       «      | _        |j#                  «       d   | _        t'        j(                  | j+                  | j,                  «      ›d| j$                  ›�«       | j,                  j/                  «        |j1                  | j2                  «       d| _        d| _        | j                   j9                  | «       || _        | j                  j                  | _        | j=                  «        y # t        $ r0}t        j                  | j                  | j                  |«      ‚d }~ww xY w)NrR   z starting on TF)r5   r¤   r¥   r¦   r.   rè   r!   rç   r    ÚbindrT   r   ÚCannotListenErrorrD   Ú
maxAddrLenr/   ÚaddrLenÚgetsocknamerâ   r$   Úmsgr¸   rå   ÚdoStartÚlistenræ   rˆ   rb   rÀ   r0   ÚdoAccept)r2   ÚsktÚaddrÚles       r6   ÚstartListeningzPort.startListeningÈ  s]  € ð		IØ—,‘,×+Ñ+¨D×,>Ñ,>ÀÇÁÓPˆCà×!Ñ!¤V§_¡_Ò4Ü# D§N¡N°D·I±IÓ>‘àŸ™¨¯	©	Ð2�Ø�H‰H�TŒNô ×'Ñ'¨¯
©
«Ó5ˆŒð  #Ÿ™Ó0°Ñ3ˆÔä�‰à×!Ñ! $§,¡,Õ/°×1EÒ1EðGô	
ð
 	�‰×ÑÔØ�
‰
�4—<‘<Ô ØˆŒØ!ˆÔØ�‰×$Ñ$ TÔ*ØˆŒØ!Ÿ[™[×/Ñ/ˆÔØ�‰�øô+ ò 	IÜ×)Ñ)¨$¯.©.¸$¿)¹)ÀRÓHÐHûð	Iús   ‚BF' Æ'	G Æ0+GÇG c                óÂ   — d| _         | j                  rLt        j                  «       | _        | j
                  j                  d| j                  |«       | j                  S y)zæ
        Stop accepting connections on this port.

        This will shut down my socket and call self.connectionLost().
        It returns a deferred which will fire successfully when the
        port is actually closed.
        Tr   N)r‰   rˆ   r
   ÚDeferredÚdeferredr5   Ú	callLaterrZ   )r2   ÚconnDones     r6   rŠ   zPort.loseConnectionè  sL   € ð "ˆÔØ�>Š>Ü!ŸN™NÓ,ˆDŒMØ�L‰L×"Ñ" 1 d×&9Ñ&9¸8ÔDØ—=‘=Ð ð r7   c                ód   — t        j                  d| j                  › d| j                  › d�«       y)z.
        Log message for closing port
        ú(z Port z Closed)N)r$   rñ   Ú_typerâ   r9   s    r6   Ú_logConnectionLostMsgzPort._logConnectionLostMsgø  s*   € ô 	�‰�!�D—J‘J�<˜v d×&:Ñ&:Ð%;¸8ÐDÕEr7   c                óÊ  — | j                  «        d| _        d}t        | d«      r| j                  }| `d| _        | j
                  j                  | «       d| _        | j                  d«       | `	| `
	 | j                  j                  «        d| _        |�|j                  d«       yy# t        $ r0 d| _        |�%|j!                  t#        j$                  «       «       Y y‚ w xY w)z'
        Cleans up the socket.
        Nrû   TF)r  râ   r¾   rû   rb   r5   r«   rˆ   re   r.   r0   rå   ÚdoStopr‰   ÚcallbackrW   Úerrbackr#   rX   )r2   r`   Úds      r6   rZ   zPort.connectionLostþ  sØ   € ð 	×"Ñ"Ô$Ø#ˆÔØˆÜ�4˜Ô$Ø—‘ˆAØ�à ˆÔØ�‰×'Ñ'¨Ô-ØˆŒØ×Ñ˜$ÔØˆKØÐð	!Ø�L‰L×ÑÔ!ð "'ˆDÔØˆ}Ø—
‘
˜4Õ ð øô ò 	Ø!&ˆDÔØˆ}Ø—	‘	œ'Ÿ/™/Ó+Ö,àð	ús   Á3B) Â)5C"Ã C"c                óT   — t        j                  | j                  j                  «      S )zK
        Returns the name of my class, to prefix log entries with.
        )r%   Úqualrå   rÑ   r9   s    r6   ri   zPort.logPrefix  s   € ô �|‰|˜DŸL™L×2Ñ2Ó3Ð3r7   c                óN   —  | j                   dgt        | j                  «      ¢­Ž S )zf
        Returns an IPv4Address or IPv6Address.

        This indicates the server's address.
        rã   )ré   r    r.   r9   s    r6   r“   zPort.getHost#  s%   € ð !ˆt× Ñ  ÐC¬°d·k±kÓ)BÒCÐCr7   c                ó|   — | j                  ||«       | j                  s| j                  s| j                  «        y y y r+   )ÚhandleAcceptr‰   rb   rô   )r2   r»   rƒ   rG   s       r6   ÚcbAcceptzPort.cbAccept+  s4   € Ø×Ñ˜"˜cÔ"Ø×"Ò" d×&7Ò&7Ø�M‰M�Oð '8Ð"r7   c           	     ó8  — | j                   s| j                  ry|r;t        j                  dt        j
                  j                  |d«      ›d|›d�«       y|j                  j                  t        j                  t        t        j                  d| j                  j                  «       «      «       t        j                   |j                  j                  «       |j"                  «      \  }}}|| j$                  k(  sJ ‚d|d   v r,t'        |d   j)                  d«      d	   «      }|d   |d	   d|f}d|d   v r,t'        |d   j)                  d«      d	   «      }|d   |d	   d|f}| j*                  j-                   | j.                  d
g|¢­Ž «      }|€|j                  j1                  «        y| j2                  }|d	z   | _        t5        |j                  | | j.                  d
g|¢­Ž  | j.                  d
g|¢­Ž || j6                  «      }	|j9                  |	«       y)NFz#Could not accept new connection -- zunknown errorz (ú)r®   ú%r   rR   rã   T)r‰   rb   r$   rñ   r³   r´   r°   Únewsktrr   r.   rw   r   rµ   r¶   r/   rD   Úget_accept_addrsrN   r¥   rÙ   Úsplitrå   r·   ré   ÚcloserÏ   rÊ   r5   r¹   )
r2   r»   rG   ÚfamilyÚlAddrÚrAddrÚscoper1   ÚsÚ	transports
             r6   r  zPort.handleAccept0  sò  € Ø×Ò ×!2Ò!2Øñ Ü�GŠGä—?‘?×&Ñ& r¨?Õ;ºRðAôð ð �J‰J×!Ñ!Ü×!Ñ!Ü(Ü—‘˜C §¡×!3Ñ!3Ó!5Ó6ôô
 $)×#9Ñ#9¸#¿*¹*×:KÑ:KÓ:MÈsÏxÉxÓ#XÑ ˆF�E˜5Ø˜T×/Ñ/Ò/Ð/Ð/ð �e˜A‘h‰Ü˜E !™HŸN™N¨3Ó/°Ñ2Ó3�Ø˜q™ 5¨¡8¨Q°Ð6�Ø�e˜A‘h‰Ü˜E !™HŸN™N¨3Ó/°Ñ2Ó3�Ø˜q™ 5¨¡8¨Q°Ð6�à—|‘|×1Ñ1Ð2C°$×2CÑ2CÀEÐ2RÈEÒ2RÓSˆHØÐØ—
‘
× Ñ Ô"ð ð —N‘N�Ø!" Q¡�”Ü"Ø—J‘JØØ%�D×%Ñ% eÐ4¨eÒ4Ø%�D×%Ñ% eÐ4¨eÒ4ØØ—L‘Ló�	ð ×'Ñ'¨	Ô2Ør7   c                ó°  — t        j                  | j                  | «      }t        d| j                  dz   z  «      x|_        }| j                  j                  | j                  | j                  «      x|_
        }t        j                  | j                  j                  «       |j                  «       ||«      }|r|t        k7  r| j                  ||«       y y y )Né   é   )rD   rÁ   r  r>   rï   rN   r5   r¤   r¥   r¦   r  Úacceptr.   r/   r   r  )r2   rG   rN   r  r»   s        r6   rô   zPort.doAcceptc  s®   € Ü�k‰k˜$Ÿ-™-¨Ó.ˆô $ A¨¯©¸Ñ):Ñ$;Ó<Ð<ˆŒ�4à"Ÿl™l×7Ñ7Ø×Ñ §¡ó
ð 	
ˆŒ
�Vô �\‰\˜$Ÿ+™+×,Ñ,Ó.°·±³ÀÀsÓKˆá�"Ô(Ò(Ø×Ñ˜b #Õ&ð )ˆ2r7   )é2   rž   NrÚ   )"r—   r˜   r™   rˆ   rb   r‰   r.   rÅ   r¥   rÆ   r¦   r	   r   ré   rÏ   râ   Ú__annotations__r   r-   rÔ   rø   r#   rX   r   ÚCONNECTION_DONErŠ   ÚstopListeningr  rZ   ri   r“   r  r  rô   r’   r7   r6   rá   rá   �  s    … à€IØ€LØ€MØ—N‘N€MØ×#Ñ#€JØ×&Ñ&€LØ€Ið &*€O�]Ó)ð €Eó4óòð@ '6 g§o¡o°d×6JÑ6JÓ&Kó !ð #€MòFò!ò>4òDòò
1óf'r7   rá   )Irš   Ú
__future__r   r³   r.   rµ   Útypingr   r   r   Úzope.interfacer   r   Útwisted.internetr	   r
   r   r   r   Útwisted.internet.abstractr   r   Útwisted.internet.addressr   r   Útwisted.internet.interfacesr   Útwisted.internet.iocpreactorr   r   rD   Ú"twisted.internet.iocpreactor.constr   r   r   r   r   Ú'twisted.internet.iocpreactor.interfacesr   Útwisted.internet.protocolr   Útwisted.internet.tcpr   ÚTCPConnectorr   r   r   r    r!   r"   Útwisted.pythonr#   r$   r%   Útwisted.internet._newtlsr&   Ú
__startTLSr}   ÚImportErrorÚ$twisted.internet.iocpreactor.reactorr'   ÚWSAECONNREFUSEDÚWSAENETUNREACHr¯   ÚITCPTransportÚISystemHandler,   r)   ÚITLSTransportrœ   rÊ   ÚIListeningPortrá   r’   r7   r6   ú<module>r:     s[  ðñõ #ã Û Û ß 1Ñ 1ç 7ç DÕ Dß >ß =Ý 1ß G÷õ õ EÝ .÷÷ ñ ÷ 1Ñ 0ðÝ?ð €Iáå@ð ˜e×3Ñ3Ø˜u×3Ñ3ð€ñ Ð˜z×7Ñ7¸×9QÑ9QÓRôx�×$Ñ$ m°^ó xó Sðxðv ÐÙ�J 
× 8Ñ 8Ô9ôV'ˆ_˜n¨jô V'ôr@ˆZô @ôFR�ô Rñ
 ˆZ×&Ñ&Ó'ôQ'ˆ=˜)ó Q'ó (ñQ'øðe ò Ø‚Iðús   Â
E ÅEÅE