§
    Ètºf»H  ã                   óæ  — d 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	 e	dk    r3ddl
mZ ddl
mZ dd	l
mZmZmZmZmZmZmZ eeeegZeeeegZeZeZeZeZndd
l
mZmZmZmZmZmZ eeegZegZddlmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%  ee"j&        e"j'        e"j(        ¦  «         G d„ dej)        ¦  «        ¦   «         Z* G d„ d¦  «        Z+ ee"j,        ¦  «         G d„ de+e*¦  «        ¦   «         Z-dS )a�  
Various asynchronous UDP classes.

Please do not use this module directly.

@var _sockErrReadIgnore: list of symbolic error constants (from the C{errno}
    module) representing socket errors where the error is temporary and can be
    ignored.

@var _sockErrReadRefuse: list of symbolic error constants (from the C{errno}
    module) representing socket errors that indicate connection refused.
é    N)ÚOptional)Úimplementer)ÚplatformTypeÚwin32)ÚWSAEINPROGRESS)ÚWSAEWOULDBLOCK)ÚWSAECONNREFUSEDÚWSAECONNRESETÚWSAEINTRÚWSAEMSGSIZEÚWSAENETRESETÚWSAENOPROTOOPTÚWSAETIMEDOUT)ÚEAGAINÚECONNREFUSEDÚEINTRÚEMSGSIZEÚENOPROTOOPTÚEWOULDBLOCK)ÚabstractÚaddressÚbaseÚdeferÚerrorÚ
interfaces)ÚfailureÚlogc                   óì   — e Zd ZU dZej        Zej        ZdZ	dZ
ee         ed<   dZdd„Zed„ ¦   «         Zd	efd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%dS )ÚPorta©  
    UDP port, listening for packets.

    @ivar maxThroughput: Maximum number of bytes read in one event
        loop iteration.

    @ivar addressFamily: L{socket.AF_INET} or L{socket.AF_INET6}, depending on
        whether this port is listening on an IPv4 address or an IPv6 address.

    @ivar _realPortNumber: Actual port number being listened on. The
        value will be L{None} until this L{Port} is listening.

    @ivar _preexistingSocket: If not L{None}, a L{socket.socket} instance which
        was created and initialized outside of the reactor and will be used to
        listen for connections (instead of a new socket being created by this
        L{Port}).
    i   NÚ_realPortNumberÚ é    c                 óÜ   — t           j                             | |¦  «         || _        || _        || _        || _        |                      ¦   «          d| _        |  	                    ¦   «          dS )a  
        @param port: A port number on which to listen.
        @type port: L{int}

        @param proto: A C{DatagramProtocol} instance which will be
            connected to the given C{port}.
        @type proto: L{twisted.internet.protocol.DatagramProtocol}

        @param interface: The local IPv4 or IPv6 address to which to bind;
            defaults to '', ie all IPv4 addresses.
        @type interface: L{str}

        @param maxPacketSize: The maximum packet size to accept.
        @type maxPacketSize: L{int}

        @param reactor: A reactor which will notify this C{Port} when
            its socket is ready for reading or writing. Defaults to
            L{None}, ie the default global reactor.
        @type reactor: L{interfaces.IReactorFDSet}
        N)
r   ÚBasePortÚ__init__ÚportÚprotocolÚmaxPacketSizeÚ	interfaceÚ	setLogStrÚ_connectedAddrÚ_setAddressFamily)Úselfr&   Úprotor)   r(   Úreactors         úS/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/internet/udp.pyr%   zPort.__init__[   si   € õ* 	Œ×Ò˜t WÑ-Ô-Ð-ØˆŒ	ØˆŒØ*ˆÔØ"ˆŒØ�ŠÑÔÐØ"ˆÔØ×ÒÑ Ô Ð Ð Ð ó    c                 óž   — t          j        ||| j        ¦  «        }|                     ¦   «         d         } | d||||¬¦  «        }||_        |S )a�  
        Create a new L{Port} based on an existing listening
        I{SOCK_DGRAM} socket.

        @param reactor: A reactor which will notify this L{Port} when
            its socket is ready for reading or writing. Defaults to
            L{None}, ie the default global reactor.
        @type reactor: L{interfaces.IReactorFDSet}

        @param fd: An integer file descriptor associated with a listening
            socket.  The socket must be in non-blocking mode.  Any additional
            attributes desired, such as I{FD_CLOEXEC}, must also be set already.
        @type fd: L{int}

        @param addressFamily: The address family (sometimes called I{domain}) of
            the existing socket.  For example, L{socket.AF_INET}.
        @type addressFamily: L{int}

        @param protocol: A C{DatagramProtocol} instance which will be
            connected to the C{port}.
        @type protocol: L{twisted.internet.protocol.DatagramProtocol}

        @param maxPacketSize: The maximum packet size to accept.
        @type maxPacketSize: L{int}

        @return: A new instance of C{cls} wrapping the socket given by C{fd}.
        @rtype: L{Port}
        r   N)r)   r/   r(   )ÚsocketÚfromfdÚ
socketTypeÚgetsocknameÚ_preexistingSocket)	Úclsr/   ÚfdÚaddressFamilyr'   r(   r&   r)   r-   s	            r0   Ú_fromListeningDescriptorzPort._fromListeningDescriptory   sd   € õ@ Œ}˜R °´Ñ?Ô?ˆØ×$Ò$Ñ&Ô& qÔ)ˆ	ØˆsØØØØØ'ð
ñ 
ô 
ˆð #'ˆÔØˆr1   Úreturnc                 ó`   — | j         �d| j        j        › d| j         › d�S d| j        j        › d�S )Nú<z on ú>z not connected>)r    r'   Ú	__class__©r-   s    r0   Ú__repr__zPort.__repr__¥   sB   € ØÔÐ+ØK�t”}Ô.ÐKÐK°DÔ4HÐKÐKÐKÐKà?�t”}Ô.Ð?Ð?Ð?Ð?r1   c                 ó   — | j         S )z)
        Return a socket object.
        )r3   rA   s    r0   Ú	getHandlezPort.getHandle«   ó   € ð Œ{Ðr1   c                 óV   — |                       ¦   «          |                      ¦   «          dS )zÐ
        Create and bind my socket, and begin listening on it.

        This is called on unserialization, and must be called after creating a
        server to begin listening on the specified port.
        N)Ú_bindSocketÚ_connectToProtocolrA   s    r0   ÚstartListeningzPort.startListening±   s.   € ð 	×ÒÑÔÐØ×ÒÑ!Ô!Ð!Ð!Ð!r1   c                 óê  — | j         €i	 |                      ¦   «         }|                     | j        | j        f¦  «         n@# t
          $ r%}t          j        | j        | j        |¦  «        ‚d}~ww xY w| j         }d| _         |                     ¦   «         d         | _	        t          j        |                      | j        ¦  «        ›d| j	        ›�¦  «         d| _        || _        | j        j        | _        dS )aJ  
        Prepare and assign a L{socket.socket} instance to
        C{self.socket}.

        Either creates a new SOCK_DGRAM L{socket.socket} bound to
        C{self.interface} and C{self.port} or takes an existing
        L{socket.socket} provided via the
        L{interfaces.IReactorSocket.adoptDatagramPort} interface.
        Né   z starting on )r7   ÚcreateInternetSocketÚbindr)   r&   ÚOSErrorr   ÚCannotListenErrorr6   r    r   ÚmsgÚ_getLogPrefixr'   Ú	connectedr3   Úfileno©r-   ÚsktÚles      r0   rG   zPort._bindSocket»   s  € ð Ô"Ð*ðMØ×/Ò/Ñ1Ô1�Ø—’˜$œ.¨$¬)Ð4Ñ5Ô5Ð5Ð5øÝð Mð Mð MÝÔ-¨d¬n¸d¼iÈÑLÔLÐLøøøøðMøøøð Ô)ˆCØ&*ˆDÔ#ð  #ŸšÑ0Ô0°Ô3ˆÔåŒà×!Ò! $¤-Ñ0Ô0Ð0Ð0°$Ô2FÐ2FðHñ	
ô 	
ð 	
ð
 ˆŒØˆŒØ”kÔ(ˆŒˆˆs   ‰5? ¿
A.Á	 A)Á)A.c                 ób   — | j                              | ¦  «         |                      ¦   «          d S ©N)r'   ÚmakeConnectionÚstartReadingrA   s    r0   rH   zPort._connectToProtocolÞ   s0   € ØŒ×$Ò$ TÑ*Ô*Ð*Ø×ÒÑÔÐÐÐr1   c                 ó  — d}|| j         k     rÿ	 | j                             | j        ¦  «        \  }}|t	          |¦  «        z  }| j        t          j        k    r
|dd…         }	 | j                             ||¦  «         n�# t          $ r t          j        ¦   «          Y nbw xY w# t          $ rQ}|j        d         }|t          v rY d}~dS |t          v r&| j        r| j                             ¦   «          Y d}~dS ‚ d}~ww xY w|| j         k     °ýdS dS )z=
        Called when my socket is ready for reading.
        r   Né   )ÚmaxThroughputr3   Úrecvfromr(   Úlenr:   ÚAF_INET6r'   ÚdatagramReceivedÚBaseExceptionr   ÚerrrN   ÚargsÚ_sockErrReadIgnoreÚ_sockErrReadRefuser+   ÚconnectionRefused)r-   ÚreadÚdataÚaddrÚseÚnos         r0   ÚdoReadzPort.doReadâ   sO  € ð ˆØ�TÔ'Ò'Ð'ðØ!œ[×1Ò1°$Ô2DÑEÔE‘
��dð �˜D™	œ	Ñ!�ØÔ%­¬Ò8Ð8ð     œ8�DðØ”M×2Ò2°4¸Ñ>Ô>Ð>Ð>øÝ$ð ð ð Ý”G‘I”I�I�I�Iðøøøøõ+ ð ð ð Ø”W˜Q”Z�ØÕ+Ð+Ð+Ø�F�F�F�F�FØÕ+Ð+Ð+ØÔ*ð :Øœ×7Ò7Ñ9Ô9Ð9Ø�F�F�F�F�FØøøøøðøøøð �TÔ'Ò'Ð'Ð'Ð'Ð'Ð's5   �"B" Á#A? Á?BÂBÂ"
C=Â,C8Ã)C8Ã7C8Ã8C=c                 ó¨  — | j         r·|d| j         fv sJ ‚	 | j                             |¦  «        S # t          $ r‚}|j        d         }|t
          k    r|                      |¦  «        cY d}~S |t          k    rt          j	        d¦  «        ‚|t          k    r| j                             ¦   «          n‚ Y d}~dS d}~ww xY w|dk    sJ ‚t          j        |d         ¦  «        sAt          j        |d         ¦  «        s'|d         dk    rt          j        |d         d¦  «        ‚t          j        |d         ¦  «        s|d         dk    r0| j        t          j        k    rt          j        |d         d¦  «        ‚t          j        |d         ¦  «        r0| j        t          j        k    rt          j        |d         d¦  «        ‚	 | j                             ||¦  «        S # t          $ ri}|j        d         }|t
          k    r|                      ||¦  «        cY d}~S |t          k    rt          j	        d¦  «        ‚|t          k    rY d}~dS ‚ d}~ww xY w)az  
        Write a datagram.

        @type datagram: L{bytes}
        @param datagram: The datagram to be sent.

        @type addr: L{tuple} containing L{str} as first element and L{int} as
            second element, or L{None}
        @param addr: A tuple of (I{stringified IPv4 or IPv6 address},
            I{integer port number}); can be L{None} in connected mode.
        Nr   zmessage too longz<broadcast>z0write() only accepts IP addresses, not hostnamesz7IPv6 port write() called with IPv4 or broadcast addressz*IPv4 port write() called with IPv6 address)r+   r3   ÚsendrN   rd   r   Úwriter   r   ÚMessageLengthErrorr   r'   rg   r   ÚisIPAddressÚisIPv6AddressÚInvalidAddressErrorr:   r`   ÚAF_INETÚsendto)r-   Údatagramrj   rk   rl   s        r0   rp   z
Port.write  s¡  € ð Ôð 0	Ø˜D $Ô"5Ð6Ð6Ð6Ð6Ð6ðØ”{×'Ò'¨Ñ1Ô1Ð1øÝð 	ð 	ð 	Ø”W˜Q”Z�Ø�’;�;ØŸ:š: hÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ø�8’^�^ÝÔ2Ð3EÑFÔFÐFØ�<Ò'Ð'Ø”M×3Ò3Ñ5Ô5Ð5Ð5àð 6Ð5Ð5Ð5Ð5Ð5øøøøð	øøøð ˜4’<�<�<�<åÔ(¨¨a¬Ñ1Ô1ðå Ô.¨t°A¬wÑ7Ô7ðð ˜”G˜}Ò,Ð,åÔ/Ø˜”GÐOñô ð õ Ô$ T¨!¤WÑ-Ô-ðØ15°a´¸MÒ1IÐ1IØÔ$­¬Ò7Ð7ÝÔ/Ø˜”GÐVñô ð õ Ô% d¨1¤gÑ.Ô.ð °4Ô3EÍÌÒ3WÐ3WÝÔ/Ø˜”GÐIñô ð ðØ”{×)Ò)¨(°DÑ9Ô9Ð9øÝð ð ð Ø”W˜Q”Z�Ø�’;�;ØŸ:š: h°Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ø�8’^�^ÝÔ2Ð3EÑFÔFÐFØ�<Ò'Ð'ð �F�F�F�F�FàøøøøðøøøsK   –0 °
B<º,B7Á&B<Á,AB7Â7B<ÇG Ç
IÇ(-IÈIÈ*IÉIÉIc                 óX   — |                       d                     |¦  «        |¦  «         dS )aÛ  
        Write a datagram constructed from an iterable of L{bytes}.

        @param seq: The data that will make up the complete datagram to be
            written.
        @type seq: an iterable of L{bytes}

        @type addr: L{tuple} containing L{str} as first element and L{int} as
            second element, or L{None}
        @param addr: A tuple of (I{stringified IPv4 or IPv6 address},
            I{integer port number}); can be L{None} in connected mode.
        r1   N)rp   Újoin)r-   Úseqrj   s      r0   ÚwriteSequencezPort.writeSequence@  s(   € ð 	�
Š
�3—8’8˜C‘=”= $Ñ'Ô'Ð'Ð'Ð'r1   c                 óö   — | j         rt          d¦  «        ‚t          j        |¦  «        s)t          j        |¦  «        st          j        |d¦  «        ‚||f| _         | j                             ||f¦  «         dS )z-
        'Connect' to remote server.
        z:already connected, reconnecting is not currently supportedúnot an IPv4 or IPv6 address.N)	r+   ÚRuntimeErrorr   rr   rs   r   rt   r3   Úconnect)r-   Úhostr&   s      r0   r   zPort.connectO  s�   € ð Ôð 	ÝØLñô ð õ Ô# DÑ)Ô)ð 	Rµ(Ô2HÈÑ2NÔ2Nð 	RÝÔ+¨DÐ2PÑQÔQÐQØ# T˜lˆÔØŒ×Ò˜T 4˜LÑ)Ô)Ð)Ð)Ð)r1   c                 ó€   — |                       ¦   «          | j        r"| j                             d| j        ¦  «         d S d S )Nr   )ÚstopReadingrR   r/   Ú	callLaterÚconnectionLostrA   s    r0   Ú_loseConnectionzPort._loseConnection\  sI   € Ø×ÒÑÔÐØŒ>ð 	;ØŒL×"Ò" 1 dÔ&9Ñ:Ô:Ð:Ð:Ð:ð	;ð 	;r1   c                 óv   — | j         rt          j        ¦   «         x}| _        nd }|                      ¦   «          |S rX   )rR   r   ÚDeferredÚdr…   )r-   Úresults     r0   ÚstopListeningzPort.stopListeninga  s>   € ØŒ>ð 	Ý#œnÑ.Ô.Ð.ˆF�T”V�VàˆFØ×ÒÑÔÐØˆr1   c                 óf   — t          j        dt          d¬¦  «         |                      ¦   «          d S )Nz-Please use stopListening() to disconnect portr\   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrŠ   rA   s    r0   ÚloseConnectionzPort.loseConnectioni  s>   € ÝŒØ;ÝØð	
ñ 	
ô 	
ð 	
ð
 	×ÒÑÔÐÐÐr1   c                 ób  — t          j        d| j        z  ¦  «         d| _        d| _        t          j                             | |¦  «         | j                             ¦   «          | j	         
                    ¦   «          | `	| `t          | d¦  «        r| j                             d¦  «         | `dS dS )z&
        Cleans up my socket.
        z(UDP Port %s Closed)Néÿÿÿÿrˆ   )r   rP   r    r]   r   r$   r„   r'   ÚdoStopr3   ÚcloserS   Úhasattrrˆ   Úcallback)r-   Úreasons     r0   r„   zPort.connectionLostq  s°   € õ 	ŒÐ&¨Ô)=Ñ=Ñ>Ô>Ð>Ø#ˆÔØˆÔÝŒ×$Ò$ T¨6Ñ2Ô2Ð2ØŒ×ÒÑÔÐØŒ×ÒÑÔÐØˆKØˆKÝ�4˜ÑÔð 	ØŒF�OŠO˜DÑ!Ô!Ð!Ø���ð	ð 	r1   c                 óN   — |                       | j        ¦  «        }d|z  | _        dS )zP
        Initialize the C{logstr} attribute to be used by C{logPrefix}.
        z%s (UDP)N)rQ   r'   Úlogstr)r-   Ú	logPrefixs     r0   r*   zPort.setLogStr�  s)   € ð ×&Ò& t¤}Ñ5Ô5ˆ	Ø  9Ñ,ˆŒˆˆr1   c                 óø   — t          j        | j        ¦  «        rt          j        | _        dS t          j        | j        ¦  «        rt          j        | _        dS | j        rt          j	        | j        d¦  «        ‚dS )z8
        Resolve address family for the socket.
        r}   N)
r   rs   r)   r3   r`   r:   rr   ru   r   rt   rA   s    r0   r,   zPort._setAddressFamilyˆ  s   € õ Ô! $¤.Ñ1Ô1ð 	Ý!'¤ˆDÔÐÐÝÔ! $¤.Ñ1Ô1ð 	Ý!'¤ˆDÔÐÐØŒ^ð 	ÝÔ+Ø”Ð >ñô ð ð	ð 	r1   c                 ó   — | j         S )z0
        Return the prefix to log with.
        )r™   rA   s    r0   rš   zPort.logPrefix•  rE   r1   c                 óä   — | j                              ¦   «         }| j        t           j        k    rt	          j        dg|¢R Ž S | j        t           j        k    rt	          j        dg|dd…         ¢R Ž S dS )z¬
        Return the local address of the UDP connection

        @returns: the local address of the UDP connection
        @rtype: L{IPv4Address} or L{IPv6Address}
        ÚUDPNr\   )r3   r6   r:   ru   r   ÚIPv4Addressr`   ÚIPv6Address©r-   rj   s     r0   ÚgetHostzPort.getHost›  sy   € ð Œ{×&Ò&Ñ(Ô(ˆØÔ¥¤Ò/Ð/ÝÔ& uÐ4¨tÐ4Ð4Ð4Ð4ØÔ¥6¤?Ò2Ð2ÝÔ& uÐ:°°R°a°R´Ð:Ð:Ð:Ð:ð 3Ð2r1   c                 óf   — | j                              t           j        t           j        |¦  «         dS )z«
        Set whether this port may broadcast. This is disabled by default.

        @param enabled: Whether the port may broadcast.
        @type enabled: L{bool}
        N)r3   Ú
setsockoptÚ
SOL_SOCKETÚSO_BROADCAST)r-   Úenableds     r0   ÚsetBroadcastAllowedzPort.setBroadcastAllowed¨  s*   € ð 	Œ×Ò�vÔ0µ&Ô2EÀwÑOÔOÐOÐOÐOr1   c                 óz   — t          | j                             t          j        t          j        ¦  «        ¦  «        S )z“
        Checks if broadcast is currently allowed on this port.

        @return: Whether this port may broadcast.
        @rtype: L{bool}
        )Úboolr3   Ú
getsockoptr¥   r¦   rA   s    r0   ÚgetBroadcastAllowedzPort.getBroadcastAllowed±  s*   € õ �D”K×*Ò*­6Ô+<½fÔ>QÑRÔRÑSÔSÐSr1   )r!   r"   NrX   )&Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   ru   r:   Ú
SOCK_DGRAMr5   r]   r    r   ÚintÚ__annotations__r7   r%   Úclassmethodr;   ÚstrrB   rD   rI   rG   rH   rm   rp   r{   r   r…   rŠ   r�   r„   r*   r,   rš   r¢   r¨   r¬   © r1   r0   r   r   >   sÃ  € € € € € € ðð ð$ ”N€MØÔ"€JØ€Mà%)€O�X˜c”]Ð)Ð)Ñ)ØÐð!ð !ð !ð !ð< ð)ð )ñ „[ð)ðV@˜#ð @ð @ð @ð @ðð ð ð"ð "ð "ð!)ð !)ð !)ðFð ð ðð ð ð@<ð <ð <ð <ð|(ð (ð (ð*ð *ð *ð;ð ;ð ;ð
ð ð ðð ð ðð ð ð ð -ð -ð -ðð ð ðð ð ð;ð ;ð ;ðPð Pð PðTð Tð Tð Tð Tr1   r   c                   óX   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
dd
„Zd„ Zd„ Zdd„ZdS )ÚMulticastMixinz,
    Implement multicast functionality.
    c                 ó®   — | j                              t           j        t           j        ¦  «        }t          j        t          j        d|¦  «        ¦  «        S )Nz@i)r3   r«   Ú
IPPROTO_IPÚIP_MULTICAST_IFÚ	inet_ntoaÚstructÚpack)r-   Úis     r0   ÚgetOutgoingInterfacez#MulticastMixin.getOutgoingInterfaceÀ  s<   € ØŒK×"Ò"¥6Ô#4µfÔ6LÑMÔMˆÝÔ¥¤¨D°!Ñ 4Ô 4Ñ5Ô5Ð5r1   c                 óf   — | j                              |¦  «                             | j        ¦  «        S )zReturns Deferred of success.)r/   ÚresolveÚaddCallbackÚ_setInterfacer¡   s     r0   ÚsetOutgoingInterfacez#MulticastMixin.setOutgoingInterfaceÄ  s)   € àŒ|×#Ò# DÑ)Ô)×5Ò5°dÔ6HÑIÔIÐIr1   c                 óŽ   — t          j        |¦  «        }| j                              t           j        t           j        |¦  «         dS )NrK   )r3   Ú	inet_atonr¤   rº   r»   )r-   rj   r¿   s      r0   rÄ   zMulticastMixin._setInterfaceÈ  s7   € ÝÔ˜TÑ"Ô"ˆØŒ×Ò�vÔ0µ&Ô2HÈ!ÑLÔLÐLØˆqr1   c                 ó`   — | j                              t           j        t           j        ¦  «        S rX   )r3   r«   rº   ÚIP_MULTICAST_LOOPrA   s    r0   ÚgetLoopbackModezMulticastMixin.getLoopbackModeÍ  s    € ØŒ{×%Ò%¥fÔ&7½Ô9QÑRÔRÐRr1   c                 óª   — t          j        dt          |¦  «        ¦  «        }| j                             t          j        t          j        |¦  «         d S )NÚb)r½   r¾   rª   r3   r¤   rº   rÉ   )r-   Úmodes     r0   ÚsetLoopbackModezMulticastMixin.setLoopbackModeÐ  s?   € ÝŒ{˜3¥ T¡
¤
Ñ+Ô+ˆØŒ×Ò�vÔ0µ&Ô2JÈDÑQÔQÐQÐQÐQr1   c                 ó`   — | j                              t           j        t           j        ¦  «        S rX   )r3   r«   rº   ÚIP_MULTICAST_TTLrA   s    r0   ÚgetTTLzMulticastMixin.getTTLÔ  s    € ØŒ{×%Ò%¥fÔ&7½Ô9PÑQÔQÐQr1   c                 ó�   — t          j        d|¦  «        }| j                             t          j        t          j        |¦  «         d S )NÚB)r½   r¾   r3   r¤   rº   rÐ   )r-   Úttls     r0   ÚsetTTLzMulticastMixin.setTTL×  s9   € ÝŒk˜#˜sÑ#Ô#ˆØŒ×Ò�vÔ0µ&Ô2IÈ3ÑOÔOÐOÐOÐOr1   r!   c                 ój   — | j                              |¦  «                             | j        |d¦  «        S )z4Join a multicast group. Returns Deferred of success.rK   ©r/   rÂ   rÃ   Ú
_joinAddr1©r-   rj   r)   s      r0   Ú	joinGroupzMulticastMixin.joinGroupÛ  ó-   € àŒ|×#Ò# DÑ)Ô)×5Ò5°d´oÀyÐRSÑTÔTÐTr1   c                 ój   — | j                              |¦  «                             | j        ||¦  «        S rX   )r/   rÂ   rÃ   Ú
_joinAddr2)r-   rj   r)   ry   s       r0   rØ   zMulticastMixin._joinAddr1ß  s-   € ØŒ|×#Ò# IÑ.Ô.×:Ò:¸4¼?ÈDÐRVÑWÔWÐWr1   c                 ób  — t          j        |¦  «        }t          j        |¦  «        }|rt           j        }nt           j        }	 | j                              t           j        |||z   ¦  «         d S # t          $ r4}t          j        t          j
        ||g|j        ¢R Ž ¦  «        cY d }~S d }~ww xY wrX   )r3   rÇ   ÚIP_ADD_MEMBERSHIPÚIP_DROP_MEMBERSHIPr¤   rº   rN   r   ÚFailurer   ÚMulticastJoinErrorrd   )r-   r)   rj   ry   ÚcmdÚes         r0   rÝ   zMulticastMixin._joinAddr2â  sÃ   € ÝÔ Ñ%Ô%ˆÝÔ$ YÑ/Ô/ˆ	Øð 	,ÝÔ*ˆCˆCåÔ+ˆCð	WØŒK×"Ò"¥6Ô#4°c¸4À)Ñ;KÑLÔLÐLÐLÐLøÝð 	Wð 	Wð 	WÝ”?¥5Ô#;¸DÀ)Ð#UÈaÌfÐ#UÐ#UÐ#UÑVÔVÐVÐVÐVÐVÐVÐVøøøøð	Wøøøs   Á)A0 Á0
B.Á:)B)Â#B.Â)B.c                 ój   — | j                              |¦  «                             | j        |d¦  «        S )z2Leave multicast group, return Deferred of success.r   r×   rÙ   s      r0   Ú
leaveGroupzMulticastMixin.leaveGroupî  rÛ   r1   N)r!   )r­   r®   r¯   r°   rÀ   rÅ   rÄ   rÊ   rÎ   rÑ   rÕ   rÚ   rØ   rÝ   ræ   r¶   r1   r0   r¸   r¸   »  sì   € € € € € ðð ð6ð 6ð 6ðJð Jð Jðð ð ð
Sð Sð SðRð Rð RðRð Rð RðPð Pð PðUð Uð Uð UðXð Xð Xð
Wð 
Wð 
WðUð Uð Uð Uð Uð Ur1   r¸   c                   ó(   — e Zd ZdZ	 	 	 	 dd„Zd„ ZdS )	ÚMulticastPortz.
    UDP Port that supports multicasting.
    r!   r"   NFc                 óR   — t                                | |||||¦  «         || _        dS )zX
        @see: L{twisted.internet.interfaces.IReactorMulticast.listenMulticast}
        N)r   r%   ÚlistenMultiple)r-   r&   r.   r)   r(   r/   rê   s          r0   r%   zMulticastPort.__init__ù  s.   € õ 	�Š�d˜D %¨°MÀ7ÑKÔKÐKØ,ˆÔÐÐr1   c                 ót  — t                                | ¦  «        }| j        r–|                     t          j        t          j        d¦  «         t          t          d¦  «        rV	 |                     t          j        t          j        d¦  «         n)# t          $ r}|j
        t          k    rn‚ Y d }~nd }~ww xY w|S )NrK   ÚSO_REUSEPORT)r   rL   rê   r¤   r3   r¥   ÚSO_REUSEADDRr•   rì   rN   Úerrnor   rT   s      r0   rL   z"MulticastPort.createInternetSocket  s¸   € Ý×'Ò'¨Ñ-Ô-ˆØÔð 
	Ø�NŠN�6Ô,­fÔ.AÀ1ÑEÔEÐEÝ•v˜~Ñ.Ô.ð ðØ—N’N¥6Ô#4µfÔ6IÈ1ÑMÔMÐMÐMøÝð ð ð à”x¥;Ò.Ð.Øàð ˜˜˜˜øøøøðøøøð ˆ
s   Á#+B Â
B5ÂB0Â0B5)r!   r"   NF)r­   r®   r¯   r°   r%   rL   r¶   r1   r0   rè   rè   ó  sO   € € € € € ðð ð ØØØð-ð -ð -ð -ðð ð ð ð r1   rè   ).r°   r3   r½   r�   Útypingr   Úzope.interfacer   Útwisted.python.runtimer   rî   r   r   r	   r
   r   r   r   r   r   r   re   rf   r   r   r   r   r   Útwisted.internetr   r   r   r   r   r   Útwisted.pythonr   r   ÚIListeningPortÚIUDPTransportÚISystemHandler$   r   r¸   ÚIMulticastTransportrè   r¶   r1   r0   ú<module>rø      sœ  ðð
ð ð €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &à /Ð /Ð /Ð /Ð /Ð /à�7ÒÐØ$Ð$Ð$Ð$Ð$Ð$Ø$Ð$Ð$Ð$Ð$Ð$ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð # N°KÀÐPÐØ)¨=¸,ÈÐUÐð €HØ"€LØ€FØ€E€EàUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUà  %¨Ð5ÐØ&˜Ðð OÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ð €ØÔ˜zÔ7¸Ô9Qñô ðwTð wTð wTð wTð wTˆ4Œ=ñ wTô wTñô ðwTðt5Uð 5Uð 5Uð 5Uð 5Uñ 5Uô 5Uð 5Uðp €ˆZÔ+Ñ,Ô,ð!ð !ð !ð !ð !�N Dñ !ô !ñ -Ô,ð!ð !ð !r1   