Ë
    oj‡S  ã                   óÜ  — d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZmZ dd	lmZmZ dd
lm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'  e	jP                  d«      Z) e	jP                  d«      Z*	 ddl+m,Z- e-Z,	 ddlm/Z0 e0Z/e!dk(  Z1dZ2e1r
ddlm3Z3m4Z4 dZ2 e jj                  «       r	 ddl6Z6dZ2 G d„ d«      Z7 eeee«       G d„ de7e«      «       Z8 G d„ d«      Z9 ee«       G d„ de9e7«      «       Z:e,€e/�	 ee8e«       e1r
 ee8ee«       e2r	 ee8e«        e;edd«      �	 ee8e«       dgZ<y# e.$ r dZ,Y Œ¼w xY w# e.$ r dZ/Y ŒÀw xY w# e.$ r dZ6Y Œ¢w xY w)z
Posix reactor base class
é    N)ÚSequence)ÚclassImplementsÚimplementer)ÚerrorÚtcpÚudp)ÚReactorBase)
ÚIHalfCloseableDescriptorÚIReactorFDSetÚIReactorMulticastÚIReactorProcessÚIReactorSocketÚIReactorSSLÚIReactorTCPÚIReactorUDPÚIReactorUNIXÚIReactorUNIXDatagram)ÚCONNECTION_DONEÚCONNECTION_LOST)ÚfailureÚlog)ÚplatformÚplatformTypeé   )ÚSignalHandlingÚ_ChildSignalHandlingÚ_IWakerÚ_MultiSignalHandlingÚ_WakerzHandler has no fileno methodzFile descriptor lost)Útls)ÚsslÚposixF)ÚprocessÚunixTc                   óÆ   — e Zd ZdZej
                   ej                   ej
                  «       «      ej                   ej                   ej                  «       «      ifd„Z	y)Ú_DisconnectSelectableMixinz>
    Mixin providing the C{_disconnectSelectable} method.
    c                 óœ  — | j                  |«       |j                  |j                  «      }|ri|rD|j                  t        j                  k(  r't        j                  |«      r|j                  |«       y| j                  |«       |j                  |«       y| j                  |«       |j                  t        j                  |«      «       y)z¿
        Utility function for disconnecting a selectable.

        Supports half-close notification, isRead should be boolean indicating
        whether error resulted from doRead().
        N)ÚremoveReaderÚgetÚ	__class__r   ÚConnectionDoner
   Ú
providedByÚreadConnectionLostÚremoveWriterÚconnectionLostr   ÚFailure)ÚselfÚ
selectableÚwhyÚisReadÚfaildictÚfs         ú</usr/lib/python3/dist-packages/twisted/internet/posixbase.pyÚ_disconnectSelectablez0_DisconnectSelectableMixin._disconnectSelectableS   s™   € ð  	×Ñ˜*Ô%Ø�L‰L˜Ÿ™Ó'ˆÙáØ—M‘M¤U×%9Ñ%9Ò9Ü,×7Ñ7¸
ÔCà×-Ñ-¨aÕ0à×!Ñ! *Ô-Ø×)Ñ)¨!Õ,à×Ñ˜jÔ)Ø×%Ñ%¤g§o¡o°cÓ&:Õ;ó    N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r+   r   r0   ÚConnectionLostr8   © r9   r7   r&   r&   N   sW   „ ñð × Ñ  / '§/¡/Ð2F°%×2FÑ2FÓ2HÓ"IØ× Ñ  / '§/¡/Ð2F°%×2FÑ2FÓ2HÓ"Ið
ô<r9   r&   c                   óh  ‡ — e Zd ZU dZdZdefd„Zd„ Zdefˆ fd„Z	di dddddfd	„Z
dd
„Z	 dd„Zdd„Zdd„Zdd„Z	 dd„Zer6ej&                  ej(                  ej*                  fZeej0                     ed<   nej&                  ej(                  fZd„ Zd„ Z	 dd„Zd d„Zd!d„Z	 d!d„Zd d„Z d„ Z!ˆ xZ"S )"ÚPosixReactorBasezÄ
    A basis for reactors that use file descriptors.

    @ivar _childWaker: L{None} or a reference to the L{_SIGCHLDWaker}
        which is used to properly notice child process termination.
    NÚreturnc                 ó   — t        «       S ©N)r   ©r1   s    r7   Ú_wakerFactoryzPosixReactorBase._wakerFactory�   s	   € Ü‹xˆr9   c                 óÈ   — | j                   sV| j                  «       | _         | j                  j                  | j                   «       | j	                  | j                   «       yy)zå
        Install a `waker' to allow threads and signals to wake up the IO thread.

        We use the self-pipe trick (http://cr.yp.to/docs/selfpipe.html) to wake
        the reactor. On Windows we use a pair of sockets.
        N)ÚwakerrF   Ú_internalReadersÚaddÚ	addReaderrE   s    r7   ÚinstallWakerzPosixReactorBase.installWaker„   sH   € ð �zŠzØ×+Ñ+Ó-ˆDŒJØ×!Ñ!×%Ñ% d§j¡jÔ1Ø�N‰N˜4Ÿ:™:Õ&ð r9   c                 óŒ   •— t         ‰| �  «       }t        dk(  r+t        |t	        | j
                  | j                  «      f«      S |S )zj
        Customize reactor signal handling to support child processes on POSIX
        platforms.
        r"   )ÚsuperÚ_signalsFactoryr   r   r   Ú_addInternalReaderÚ_removeInternalReader)r1   ÚbaseHandlingr*   s     €r7   rO   z PosixReactorBase._signalsFactory�   sS   ø€ ô
 ‘wÑ.Ó0ˆä˜7Ò"ä'ð !ä(Ø×/Ñ/Ø×2Ñ2óð	ó
ð 
ð Ðr9   r?   r   c
                 ó~  — t         dk(  rI|r*|	�t        d«      ‚t        j                  | ||||||||«	      S t        j                  | ||||||||	«	      S t         dk(  rX|�t        d«      ‚|�t        d«      ‚|rt        d«      ‚|	rt        d«      ‚t
        rdd	lm}
  |
| |||||«      S t        d
«      ‚t        d«      ‚)Nr"   z1Using childFDs is not supported with usePTY=True.Úwin32z,Setting UID is unsupported on this platform.z,Setting GID is unsupported on this platform.z1The usePTY parameter is not supported on Windows.z1Customizing childFDs is not supported on Windows.r   )ÚProcessz:spawnProcess not available since pywin32 is not installed.z0spawnProcess only available on Windows or POSIX.)r   Ú
ValueErrorr#   Ú
PTYProcessrU   Úwin32processÚtwisted.internet._dumbwin32procÚNotImplementedError)r1   ÚprocessProtocolÚ
executableÚargsÚenvÚpathÚuidÚgidÚusePTYÚchildFDsrU   s              r7   ÚspawnProcesszPosixReactorBase.spawnProcessª   s  € ô ˜7Ò"ÙØÐ'Ü$ØKóð ô ×)Ñ)Ø˜* d¨C°°ÈÈSÐRXóð ô —‘ØØØØØØ#ØØØó
ð 
ô ˜WÒ$ØˆÜ Ð!OÓPÐPØˆÜ Ð!OÓPÐPÙÜ Ð!TÓUÐUÙÜ Ð!TÓUÐUåÝCá˜t _°jÀ$ÈÈTÓRÐRä)ØPóð ô &ØBóð r9   c                 óX   — t        j                  ||||| «      }|j                  «        |S )z‡Connects a given L{DatagramProtocol} to the given numeric UDP port.

        @returns: object conforming to L{IListeningPort}.
        )r   ÚPortÚstartListening)r1   ÚportÚprotocolÚ	interfaceÚmaxPacketSizeÚps         r7   Ú	listenUDPzPosixReactorBase.listenUDPä   s+   € ô
 �H‰H�T˜8 Y°¸tÓDˆØ	×ÑÔØˆr9   c                 óZ   — t        j                  ||||| |«      }|j                  «        |S )z˜Connects a given DatagramProtocol to the given numeric UDP port.

        EXPERIMENTAL.

        @returns: object conforming to IListeningPort.
        )r   ÚMulticastPortrg   )r1   rh   ri   rj   rk   ÚlistenMultiplerl   s          r7   ÚlistenMulticastz PosixReactorBase.listenMulticastï   s4   € ô ×ÑØ�(˜I }°d¸Nó
ˆð 	
×ÑÔØˆr9   c                 ór   — t         sJ d«       ‚t        j                  |||| |«      }|j                  «        |S ©NúUNIX support is not present)ÚunixEnabledr$   Ú	ConnectorÚconnect)r1   ÚaddressÚfactoryÚtimeoutÚcheckPIDÚcs         r7   ÚconnectUNIXzPosixReactorBase.connectUNIX   s4   € ÝÐ9Ð9Ó9ˆ{Ü�N‰N˜7 G¨W°d¸HÓEˆØ	�	‰	ŒØˆr9   c                 ót   — t         sJ d«       ‚t        j                  ||||| |«      }|j                  «        |S rs   )ru   r$   rf   rg   )r1   rx   ry   ÚbacklogÚmodeÚwantPIDrl   s          r7   Ú
listenUNIXzPosixReactorBase.listenUNIX  s9   € ÝÐ9Ð9Ó9ˆ{Ü�I‰I�g˜w¨°°t¸WÓEˆØ	×ÑÔØˆr9   c                 ór   — t         sJ d«       ‚t        j                  ||||| «      }|j                  «        |S )z›
        Connects a given L{DatagramProtocol} to the given path.

        EXPERIMENTAL.

        @returns: object conforming to L{IListeningPort}.
        rt   )ru   r$   ÚDatagramPortrg   )r1   rx   ri   rk   r€   rl   s         r7   ÚlistenUNIXDatagramz#PosixReactorBase.listenUNIXDatagram  s;   € õ Ð9Ð9Ó9ˆ{Ü×Ñ˜g x°ÀÀdÓKˆØ	×ÑÔØˆr9   c                 ót   — t         sJ d«       ‚t        j                  |||||| «      }|j                  «        |S )zd
        Connects a L{ConnectedDatagramProtocol} instance to a path.

        EXPERIMENTAL.
        rt   )ru   r$   ÚConnectedDatagramPortrg   )r1   rx   ri   rk   r€   ÚbindAddressrl   s          r7   ÚconnectUNIXDatagramz$PosixReactorBase.connectUNIXDatagram  sB   € õ Ð9Ð9Ó9ˆ{Ü×&Ñ&Ø�X˜}¨d°KÀó
ˆð 	
×ÑÔØˆr9   Ú_supportedAddressFamiliesc                 ó&  — || j                   vrt        j                  |«      ‚t        r5|t        j
                  k(  r"t        j                  j                  | ||«      }n"t        j                  j                  | |||«      }|j                  «        |S )a0  
        Create a new L{IListeningPort} from an already-initialized socket.

        This just dispatches to a suitable port implementation (eg from
        L{IReactorTCP}, etc) based on the specified C{addressFamily}.

        @see: L{twisted.internet.interfaces.IReactorSocket.adoptStreamPort}
        )rŠ   r   ÚUnsupportedAddressFamilyru   ÚsocketÚAF_UNIXr$   rf   Ú_fromListeningDescriptorr   rg   )r1   ÚfileDescriptorÚaddressFamilyry   rl   s        r7   ÚadoptStreamPortz PosixReactorBase.adoptStreamPort8  sy   € ð  × >Ñ >Ñ>Ü×0Ñ0°Ó?Ð?å˜=¬F¯N©NÒ:Ü—	‘	×2Ñ2°4¸ÈÓQ‰Aä—‘×1Ñ1Ø�n m°WóˆAð 	
×ÑÔØˆr9   c                 ó   — || j                   vrt        j                  |«      ‚t        r4|t        j
                  k(  r!t        j                  j                  ||| «      S t        j                  j                  |||| «      S )zg
        @see:
            L{twisted.internet.interfaces.IReactorSocket.adoptStreamConnection}
        )
rŠ   r   rŒ   ru   r�   rŽ   r$   ÚServerÚ_fromConnectedSocketr   )r1   r�   r‘   ry   s       r7   ÚadoptStreamConnectionz&PosixReactorBase.adoptStreamConnectionM  sj   € ð
  × >Ñ >Ñ>Ü×0Ñ0°Ó?Ð?å˜=¬F¯N©NÒ:Ü—;‘;×3Ñ3°NÀGÈTÓRÐRä—:‘:×2Ñ2Ø ¨w¸óð r9   c                 óÜ   — |t         j                  t         j                  fvrt        j                  |«      ‚t
        j                  j                  | ||||¬«      }|j                  «        |S )N)rk   )	r�   ÚAF_INETÚAF_INET6r   rŒ   r   rf   r�   rg   )r1   r�   r‘   ri   rk   rl   s         r7   ÚadoptDatagramPortz"PosixReactorBase.adoptDatagramPort\  sa   € ð ¤§¡´·±Ð AÑAÜ×0Ñ0°Ó?Ð?ä�H‰H×-Ñ-Ø�. -°Èð .ó 
ˆð 	
×ÑÔØˆr9   c                 óX   — t        j                  ||||| «      }|j                  «        |S rD   )r   rf   rg   )r1   rh   ry   r   rj   rl   s         r7   Ú	listenTCPzPosixReactorBase.listenTCPj  s)   € Ü�H‰H�T˜7 G¨Y¸Ó=ˆØ	×ÑÔØˆr9   c                 óZ   — t        j                  |||||| «      }|j                  «        |S rD   )r   rv   rw   )r1   Úhostrh   ry   rz   rˆ   r|   s          r7   Ú
connectTCPzPosixReactorBase.connectTCPo  s(   € Ü�M‰M˜$  g¨w¸ÀTÓJˆØ	�	‰	ŒØˆr9   c           	      óÚ   — t         �,t         j                  |d|«      }| j                  |||||«      S t        �-t        j	                  ||||||| «      }|j                  «        |S J d«       ‚)NTúSSL support is not present)r    ÚTLSMemoryBIOFactoryrŸ   r!   rv   rw   )	r1   rž   rh   ry   ÚcontextFactoryrz   rˆ   Ú
tlsFactoryr|   s	            r7   Ú
connectSSLzPosixReactorBase.connectSSLv  sq   € ô ˆ?Ü×0Ñ0°ÀÀwÓOˆJØ—?‘? 4¨¨z¸7ÀKÓPÐPÜˆ_Ü—‘Ø�d˜G ^°W¸kÈ4óˆAð �I‰IŒKØˆHà6Ð6Ó6�5r9   c                 óè   — t         �4t         j                  |d|«      }| j                  ||||«      }d|_        |S t        �,t        j                  |||||| «      }|j                  «        |S J d«       ‚)NFÚTLSr¡   )r    r¢   rœ   Ú_typer!   rf   rg   )r1   rh   ry   r£   r   rj   r¤   rl   s           r7   Ú	listenSSLzPosixReactorBase.listenSSL…  st   € Üˆ?Ü×0Ñ0°ÀÈÓPˆJØ—>‘> $¨
°G¸YÓGˆDØˆDŒJØˆKÜˆ_Ü—‘˜˜w¨¸ÀÈDÓQˆAØ×ÑÔØˆHà6Ð6Ó6�5r9   c                 óÄ   — t        |«      | j                  z
  }|D ]  }| j                  |«       Œ t        |«      }|D ]  }| j                  |«       Œ t	        ||z  «      S )ag  
        Remove all readers and writers, and list of removed L{IReadDescriptor}s
        and L{IWriteDescriptor}s.

        Meant for calling from subclasses, to implement removeAll, like::

          def removeAll(self):
              return self._removeAll(self._reads, self._writes)

        where C{self._reads} and C{self._writes} are iterables.
        )ÚsetrI   r(   r.   Úlist)r1   ÚreadersÚwritersÚremovedReadersÚreaderÚremovedWritersÚwriters          r7   Ú
_removeAllzPosixReactorBase._removeAll’  so   € ô ˜W›¨×(=Ñ(=Ñ=ˆØ$ò 	&ˆFØ×Ñ˜fÕ%ð	&ô ˜W›ˆØ$ò 	&ˆFØ×Ñ˜fÕ%ð	&ô �N ^Ñ3Ó4Ð4r9   )Ú é    )r´   rµ   F)é   r   )é2   é¶  r   )rµ   r¸   )rµ   r¸   N)rµ   )r·   r´   )r¶   N)#r:   r;   r<   r=   Ú_childWakerr   rF   rL   r   rO   rd   rm   rq   r}   r‚   r…   r‰   ru   r�   r˜   r™   rŽ   rŠ   r   ÚAddressFamilyÚ__annotations__r’   r–   rš   rœ   rŸ   r¥   r©   r³   Ú__classcell__)r*   s   @r7   rA   rA   t   sø   ø… ñð €Kð˜wó ò
'ð õ ð< ØØØØØØó6ótð PUóó"óóð NRóñ" à�N‰NØ�O‰OØ�N‰NðE
Ð! 8¨F×,@Ñ,@Ñ#Aô 	
ð �N‰NØ�O‰Oð%
Ð!ò
ò*ð  FJó
óó
ð LPó7ó7ö5r9   rA   c                   ó   — e Zd ZdZd„ Zy)Ú_PollLikeMixina¤  
    Mixin for poll-like reactors.

    Subclasses must define the following attributes::

      - _POLL_DISCONNECTED - Bitmask for events indicating a connection was
        lost.
      - _POLL_IN - Bitmask for events indicating there is input to read.
      - _POLL_OUT - Bitmask for events indicating output can be written.

    Must be mixed in to a subclass of PosixReactorBase (for
    _disconnectSelectable).
    c                 óâ  — d}d}|| j                   z  r-|| j                  z  s|| j                  v r	d}t        }nft        }n_	 |j                  «       dk(  rt        }nD|| j                  z  r|j                  «       }d}|s!|| j                  z  r|j                  «       }d}|r| j                  |||«       yy# t        $ r. t        j                  «       d   }t        j                  «        Y ŒMw xY w)zg
        fd is available for read or write, do the work and raise errors if
        necessary.
        NFTéÿÿÿÿr   )Ú_POLL_DISCONNECTEDÚ_POLL_INÚ_readsr   r   ÚfilenoÚ_NO_FILEDESCÚdoReadÚ	_POLL_OUTÚdoWriteÚBaseExceptionÚsysÚexc_infor   Úerrr8   )r1   r2   ÚfdÚeventr3   ÚinReads         r7   Ú_doReadOrWritez_PollLikeMixin._doReadOrWrite¸  sñ   € ð
 ˆØˆØ�4×*Ñ*Ò*°E¸D¿M¹MÒ4Ið �T—[‘[Ñ ð
 �Ü%‘ô &‘ðð ×$Ñ$Ó&¨"Ò,ô '‘Cà˜tŸ}™}Ò,à(×/Ñ/Ó1˜Ø!%˜Ù 5¨4¯>©>Ò#9ð )×0Ñ0Ó2˜Ø!&˜ñ Ø×&Ñ& z°3¸Õ?ð øô !ò ô —l‘l“n QÑ'�Ü—‘–	ð	ús   ÁAB7 Â74C.Ã-C.N)r:   r;   r<   r=   rÐ   r?   r9   r7   r¾   r¾   ©  s   „ ñó7@r9   r¾   c                   ód   — e 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d„ Zd„ Zd„ Zd„ Zd„ Zy)Ú_ContinuousPollinga£  
    Schedule reads and writes based on the passage of time, rather than
    notification.

    This is useful for supporting polling filesystem files, which C{epoll(7)}
    does not support.

    The implementation uses L{_PollLikeMixin}, which is a bit hacky, but
    re-implementing and testing the relevant code yet again is unappealing.

    @ivar _reactor: The L{EPollReactor} that is using this instance.

    @ivar _loop: A C{LoopingCall} that drives the polling, or L{None}.

    @ivar _readers: A C{set} of C{FileDescriptor} objects that should be read
        from.

    @ivar _writers: A C{set} of C{FileDescriptor} objects that should be
        written to.
    r   é   é   c                 ó\   — || _         d | _        t        «       | _        t        «       | _        y rD   )Ú_reactorÚ_loopr«   Ú_readersÚ_writers)r1   Úreactors     r7   Ú__init__z_ContinuousPolling.__init__  s"   € ØˆŒØˆŒ
Ü›ˆŒÜ›ˆ�r9   c                 óZ  — | j                   s| j                  re| j                  €Xddlm}m}  || j                  «      | _        | j                  | j                  _        | j                  j                  |d¬«       yy| j                  r"| j                  j                  «        d| _        yy)zh
        Start or stop a C{LoopingCall} based on whether there are readers and
        writers.
        Nr   )Ú_EPSILONÚLoopingCallF)Únow)rØ   rÙ   r×   Útwisted.internet.taskrÝ   rÞ   ÚiteraterÖ   ÚclockÚstartÚstop)r1   rÝ   rÞ   s      r7   Ú
_checkLoopz_ContinuousPolling._checkLoop  s   € ð
 �=Š=˜DŸMšMØ�z‰zÐ!ßGá(¨¯©Ó6�”
Ø#'§=¡=�—
‘
Ô ð —
‘
× Ñ  ¨uÐ Õ5ð "ð �ZŠZØ�J‰J�O‰OÔØˆD�Jð r9   c                 óà   — t        | j                  «      D ]  }| j                  ||| j                  «       Œ! t        | j                  «      D ]  }| j                  ||| j
                  «       Œ! y)zX
        Call C{doRead} and C{doWrite} on all readers and writers respectively.
        N)r¬   rØ   rÐ   rÂ   rÙ   rÇ   )r1   r°   r²   s      r7   rá   z_ContinuousPolling.iterate&  sb   € ô ˜4Ÿ=™=Ó)ò 	?ˆFØ×Ñ ¨°·±Õ>ð	?ä˜4Ÿ=™=Ó)ò 	@ˆFØ×Ñ ¨°·±Õ?ñ	@r9   c                 óZ   — | j                   j                  |«       | j                  «        y)zU
        Add a C{FileDescriptor} for notification of data available to read.
        N)rØ   rJ   rå   ©r1   r°   s     r7   rK   z_ContinuousPolling.addReader/  ó    € ð 	�‰×Ñ˜&Ô!Ø�‰Õr9   c                 óZ   — | j                   j                  |«       | j                  «        y)zV
        Add a C{FileDescriptor} for notification of data available to write.
        N)rÙ   rJ   rå   ©r1   r²   s     r7   Ú	addWriterz_ContinuousPolling.addWriter6  ré   r9   c                 óz   — 	 | j                   j                  |«       | j                  «        y# t        $ r Y yw xY w)zY
        Remove a C{FileDescriptor} from notification of data available to read.
        N)rØ   ÚremoveÚKeyErrorrå   rè   s     r7   r(   z_ContinuousPolling.removeReader=  s9   € ð	Ø�M‰M× Ñ  Ô(ð 	�‰Õøô ò 	Ùð	úó   ‚. ®	:¹:c                 óz   — 	 | j                   j                  |«       | j                  «        y# t        $ r Y yw xY w)zb
        Remove a C{FileDescriptor} from notification of data available to
        write.
        N)rÙ   rî   rï   rå   rë   s     r7   r.   z_ContinuousPolling.removeWriterG  s9   € ð
	Ø�M‰M× Ñ  Ô(ð 	�‰Õøô ò 	Ùð	úrð   c                 ó²   — t        | j                  | j                  z  «      }| j                  j                  «        | j                  j                  «        |S )z1
        Remove all readers and writers.
        )r¬   rØ   rÙ   Úclear)r1   Úresults     r7   Ú	removeAllz_ContinuousPolling.removeAllR  sB   € ô �d—m‘m d§m¡mÑ3Ó4ˆð 	�‰×ÑÔØ�‰×ÑÔØˆr9   c                 ó,   — t        | j                  «      S )z/
        Return a list of the readers.
        )r¬   rØ   rE   s    r7   Ú
getReadersz_ContinuousPolling.getReaders]  ó   € ô �D—M‘MÓ"Ð"r9   c                 ó,   — t        | j                  «      S )z/
        Return a list of the writers.
        )r¬   rÙ   rE   s    r7   Ú
getWritersz_ContinuousPolling.getWritersc  rø   r9   c                 ó   — || j                   v S )aj  
        Checks if the file descriptor is currently being observed for read
        readiness.

        @param fd: The file descriptor being checked.
        @type fd: L{twisted.internet.abstract.FileDescriptor}
        @return: C{True} if the file descriptor is being observed for read
            readiness, C{False} otherwise.
        @rtype: C{bool}
        )rØ   ©r1   rÍ   s     r7   Ú	isReadingz_ContinuousPolling.isReadingi  ó   € ð �T—]‘]Ð"Ð"r9   c                 ó   — || j                   v S )al  
        Checks if the file descriptor is currently being observed for write
        readiness.

        @param fd: The file descriptor being checked.
        @type fd: L{twisted.internet.abstract.FileDescriptor}
        @return: C{True} if the file descriptor is being observed for write
            readiness, C{False} otherwise.
        @rtype: C{bool}
        )rÙ   rü   s     r7   Ú	isWritingz_ContinuousPolling.isWritingv  rþ   r9   N)r:   r;   r<   r=   rÁ   rÂ   rÇ   rÛ   rå   rá   rK   rì   r(   r.   rõ   r÷   rú   rý   r   r?   r9   r7   rÒ   rÒ   ò  sV   „ ñð, ÐØ€HØ€Iòòò$@òòòò	ò	ò#ò#ò#ó#r9   rÒ   Úfromfd)=r=   r�   rÊ   Útypingr   Úzope.interfacer   r   Útwisted.internetr   r   r   Útwisted.internet.baser	   Útwisted.internet.interfacesr
   r   r   r   r   r   r   r   r   r   Útwisted.internet.mainr   r   Útwisted.pythonr   r   Útwisted.python.runtimer   r   Ú_signalsr   r   r   r   r   ÚConnectionFdescWentAwayÚ
_NO_FILENOrÅ   Útwisted.protocolsr    Ú_tlsÚImportErrorr!   Ú_sslru   ÚprocessEnabledr#   r$   Ú	isWindowsrX   r&   rA   r¾   rÒ   ÚgetattrÚ__all__r?   r9   r7   ú<module>r     sÈ  ðñ
ó
 Û 
Ý ç 7ç ,Ñ ,Ý -÷÷ ÷ ÷ Cß 'ß 9÷õ ð +ˆU×*Ñ*Ð+IÓJ€
Ø,ˆu×,Ñ,Ð-CÓD€ðÝ-ð €CðÝ,ð €Cà˜gÑ%€à€Ùß.à€Nð €8×ÑÔðÛàˆ÷
#<ñ #<ñL ˆ[˜+Ð'8Ó9ôq5Ð1°;ó q5ó :ðq5÷h	F@ñ F@ñR ˆ]ÓôN#˜Ð)Có N#ó ðN#ðb €?�c�oÙÐ$ kÔ2ÙÙÐ$ lÐ4HÔIÙÙÐ$ oÔ6Ù
ˆ6�8˜TÓ"Ð.ÙÐ$ nÔ5àÐ
�øð{ ò Ø
‚Cðûð ò Ø
‚Cðûð& ò ØŠðús6   ÂE ÂE ÃE! ÅEÅEÅEÅEÅ!E+Å*E+