+
    üÐjæ  ã                   ó  € R t ^ RIt^ RIt^ RIHtHtHtHt ^ RIH	t	 ^ RI
HtHt ^ RIHt ^ RIHt ^ RIHt ^RIHtHt ^R	IHtHtHtHt  ! R
 R]4      t ! R R]4      t^ðt^tRtRt]	! ]P@                  4       ! R R4      4       t!R# )zD
IProxyParser implementation for version two of the PROXY protocol.
N)ÚCallableÚTupleÚTypeÚUnion)Úimplementer)ÚValueConstantÚValues)ÚLiteral)Úaddress)Úcompat)Ú_infoÚ_interfaces)ÚInvalidNetworkProtocolÚInvalidProxyHeaderÚMissingAddressDataÚconvertErrorc                   óZ   € ] tR t^tRt]! ^ 4      t]! ^4      t]! ^ 4      t]! ^04      t	Rt
R# )Ú	NetFamilyz 
Values for the 'family' field.
© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚUNSPECÚINETÚINET6ÚUNIXÚ__static_attributes__r   ó    ÚE/usr/lib/python3/dist-packages/twisted/protocols/haproxy/_v2parser.pyr   r      s1   † ññ ˜4Ó €FÙ˜Ó€DÙ˜$Ó€EÙ˜Ó„Dr   r   c                   óJ   € ] tR t^)tRt]! ^ 4      t]! ^4      t]! ^4      tRt	R# )ÚNetProtocolz
Values for 'protocol' field.
r   N)
r   r   r   r   r   r   r   ÚSTREAMÚDGRAMr   r   r   r    r"   r"   )   s'   † ññ ˜1Ó€FÙ˜1Ó€FÙ˜!Ó„Er   r"   ÚLOCALÚPROXYc                   óÎ   a € ] tR t^9t o RtRt^ .t^ ]^]/t	^R^R^!R^"R^1R^2R/t
V 3R lR ltV 3R lR	 lt]V 3R
 lR l4       t]V 3R lR l4       t]V 3R lR l4       tRtV tR# )ÚV2Parserzb
PROXY protocol version two header parser.

Version two of the PROXY protocol is a binary format.
s   

 
QUIT
z!4s4s2Hz	!16s16s2Hz	!108s108sc                ó   <€ V ^8„  d   QhRR/# )é   ÚreturnNr   )ÚformatÚ__classdict__s   "€r    Ú__annotate__ÚV2Parser.__annotate__P   s   ø€ ÷ ñ ˜$ñ r   c                ó   € R V n         R# )r   N©Úbuffer)Úselfs   &r    Ú__init__ÚV2Parser.__init__P   s	   € ØˆŽr   c                ót   <€ V ^8„  d   QhRS[ RS[S[S[P                  S[ 3,          S[R,          3,          /# )r*   Údatar+   ©NN)Úbytesr   r   r   Ú	ProxyInfo)r,   r-   s   "€r    r.   r/   S   s:   ø€ ÷ !ñ !Ùð!á	‰u‘U—_‘_¡eÐ+Õ,©e°JÕ.?Ð?Õ	@ñ!r   c                ó�  € V ;P                   V,          un         \        V P                   4      ^8  d   \        4       h\        P                  ! RV P                   R,          4      ^ ,          ^,           p\        V P                   4      V8  d   R# V P                   RV V P                   VR rCRV n         V P                  V4      pWT3# )a›  
Consume a chunk of data and attempt to parse it.

@param data: A bytestring.
@type data: bytes

@return: A two-tuple containing, in order, a L{_interfaces.IProxyInfo}
    and any bytes fed to the parser that followed the end of the
    header.  Both of these values are None until a complete header is
    parsed.

@raises InvalidProxyHeader: If the bytes fed to the parser create an
    invalid PROXY header.
z!H:é   é   NNr   r8   )r2   Úlenr   ÚstructÚunpackÚparse)r3   r7   ÚsizeÚheaderÚ	remainingÚinfos   &&    r    ÚfeedÚV2Parser.feedS   s¡   € ð" 	�Š�tÕ�Üˆt�{‰{Ó˜bÔ Ü$Ó&Ð&ä�}Š}˜T 4§;¡;¨uÕ#5Ó6°qÕ9¸BÕ>ˆÜˆt�{‰{Ó˜dÔ"ØÐà ŸK™K¨¨Ð.°·±¸D¸EÐ0B�	ØˆŒØ�z‰z˜&Ó!ˆØÐ Ð r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# ©r*   Ú
bytestringr+   ©r9   )r,   r-   s   "€r    r.   r/   r   s   ø€ ÷ 
ñ 
¡ð 
©5ñ 
r   c                óZ   € RP                  R \        P                  ! V 4       4       4      # )zÿ
Convert packed 32-bit IPv4 address bytes into a dotted-quad ASCII bytes
representation of that address.

@param bytestring: 4 octets representing an IPv4 address.
@type bytestring: L{bytes}

@return: a dotted-quad notation IPv4 address.
@rtype: L{bytes}
ó   .c              3   óf   "  € T F'  pR \        V4      3,          P                  R4      x € K)  	  R# 5i)z%iÚasciiN)ÚordÚencode)Ú.0Úbs   & r    Ú	<genexpr>Ú(V2Parser._bytesToIPv4.<locals>.<genexpr>}   s-   é € ð 
Ù8T°1ˆT”S˜“V�IÕ×%Ñ% g×.Ð.Ó8Tùs   ‚/1)Újoinr   Ú	iterbytes)rJ   s   &r    Ú_bytesToIPv4ÚV2Parser._bytesToIPv4q   s-   € ð �y‰yñ 
Ü8>×8HÒ8HÈÔ8Tó
ó 
ð 	
r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# rI   rK   )r,   r-   s   "€r    r.   r/   ‚   s   ø€ ÷ 
ñ 
¡ð 
©5ñ 
r   c                ó|   a€ \         P                  ! V 4      oRP                  V3R l\        ^ ^ ^4       4       4      # )a  
Convert packed 128-bit IPv6 address bytes into a colon-separated ASCII
bytes representation of that address.

@param bytestring: 16 octets representing an IPv6 address.
@type bytestring: L{bytes}

@return: a dotted-quad notation IPv6 address.
@rtype: L{bytes}
ó   :c              3   óp   <"  € T F+  p\        SW^,            ^4      R P                  R4      x € K-  	  R# 5i)é   ÚxrO   N)ÚintrQ   )rR   rS   Ú	hexStrings   & €r    rT   Ú(V2Parser._bytesToIPv6.<locals>.<genexpr>Ž   s;   øé € ð 
á$�ô �I˜a a¥%Ð(¨"Ó-¨aÐ0×9Ñ9¸'×BÐBÛ$ùs   ƒ36)ÚbinasciiÚb2a_hexrV   Úrange)rJ   ra   s   &@r    Ú_bytesToIPv6ÚV2Parser._bytesToIPv6�   s;   ø€ ô ×$Ò$ ZÓ0ˆ	Ø�y‰yô 
ä˜1˜b !”_ó
ó 
ð 	
r   c                ó:   <€ V ^8„  d   QhRS[ RS[P                  /# )r*   Úliner+   )r9   r   r:   )r,   r-   s   "€r    r.   r/   ”   s#   ø€ ÷ E
ñ E
™ð E
¡5§?¡?ñ E
r   c           
     óŒ  € VR,          pRp\        \        \        4      ;_uu_ 4        \        VR,          4      p\        VR,          4      pRRR4       W P                  8w  d   \        4       hX\
        ,          V\        ,          rvW`P                  9  g   WpP                  9  d   \        4       hV P                  V,          \        8X  d   \        P                  ! VRR4      # X\
        ,          V\        ,          r˜\        \        \        4      ;_uu_ 4        \        P                  V4      p\         P                  V	4      p	RRR4       V\        P"                  J g   V	\         P"                  J d   \        P                  ! VRR4      # V P$                  V,          p
V^^\&        P(                  ! V
4      ,            pV\        P*                  J d¦   \        \&        P,                  \.        4      ;_uu_ 4        \&        P0                  ! W£4      w  r¼RRR4       \        P                  ! V\2        P4                  ! XP7                  R4      4      \2        P4                  ! XP7                  R4      4      4      # RpV	\         P8                  J d   Rp\2        P:                  pV P<                  pV\        P>                  J d   \2        P@                  pV PB                  p\        \&        P,                  \.        4      ;_uu_ 4        \&        P0                  ! W£4      pVw  r¼ppRRR4       \        P                  ! VV! Wß! X4      PE                  4       X4      V! Wß! X4      PE                  4       X4      4      #   + '       g   i     EL3; i  + '       g   i     ELN; i  + '       g   i     EL”; i  + '       g   i     Lš; i)aI  
Parse a bytestring as a full PROXY protocol header.

@param line: A bytestring that represents a valid HAProxy PROXY
    protocol version 2 header.
@type line: bytes

@return: A L{_interfaces.IProxyInfo} containing the
    parsed data.

@raises InvalidProxyHeader: If the bytestring does not represent a
    valid PROXY header.
:Né   NN:rk   é   N:rl   r<   Nó    ÚTCPÚUDP)#r   Ú
IndexErrorr   rP   ÚPREFIXÚ_HIGHÚ_LOWÚVERSIONSÚCOMMANDSÚ_LOCALCOMMANDr   r:   Ú
ValueErrorr   r   ÚlookupByValuer"   r   ÚADDRESSFORMATSr?   Úcalcsizer   Úerrorr   r@   r
   ÚUNIXAddressÚrstripr$   ÚIPv4AddressrX   r   ÚIPv6Addressrf   Údecode)Úclsri   ÚprefixÚaddrInfoÚversionCommandÚfamilyProtoÚversionÚcommandÚfamilyÚnetprotoÚaddressFormatÚsourceÚdestÚaddrTypeÚaddrClsÚ
addrParserrE   ÚsPortÚdPorts   &&                 r    rA   ÚV2Parser.parse“   sÁ  € ð �c•ˆØˆÜœ*Ô&8×9Õ9ô !  e¥Ó-ˆNÜ˜d 5�kÓ*ˆK÷	 :ð —Z‘ZÔÜ$Ó&Ð&à)¬EÕ1°>ÄDÕ3H�ØŸ,™,Ô&¨'¿¹Ô*EÜ$Ó&Ð&à�<‰<˜Õ ¤MÔ1Ü—?’? 4¨¨tÓ4Ð4à&¬Õ.°¼dÕ0B�Üœ*Ô&<×=Õ=Ü×,Ñ,¨VÓ4ˆFÜ"×0Ñ0°Ó:ˆH÷ >ð ”Y×%Ñ%Ó%¨´[×5GÑ5GÓ)GÜ—?’? 4¨¨tÓ4Ð4à×*Ñ*¨;Õ7ˆØ˜˜R¤&§/¢/°-Ó"@Õ@ÐAˆØ”Y—^‘^Ó#ÜœfŸl™lÔ,>×?Õ?Ü%Ÿ}š}¨]ÓE‘�÷ @ä—?’?ØÜ×#Ò# F§M¡M°'Ó$:Ó;Ü×#Ò# D§K¡K°Ó$8Ó9óð ð ;@ˆØ”{×(Ñ(Ó(ØˆHô ×Ñð 	ð 03×/?Ñ/?ˆ
Ø”Y—_‘_Ó$Ü×)Ñ)ˆGØ×)Ñ)ˆJäœ&Ÿ,™,Ô(:×;Õ;Ü—=’= Ó9ˆDØ)-Ñ&ˆF˜% ÷ <ô �ŠØÙ�H˜j¨Ó0×7Ñ7Ó9¸5ÓAÙ�H˜j¨Ó.×5Ñ5Ó7¸Ó?ó
ð 	
÷c :×9Ð9ú÷" >×=Ð=ú÷ @×?Ð?ú÷& <×;ús/   ¨%M7Ä+NÇ;NÌN3Í7N	ÎN	ÎN0	Î3O	r1   N)r   r   r   r   r   rq   rt   rv   Ú_PROXYCOMMANDru   ry   r4   rF   ÚstaticmethodrX   rf   ÚclassmethodrA   r   Ú__classdictcell__)r-   s   @r    r(   r(   9   s    ø‡ € ñð A€FØˆt€HØ�= ! ]Ð3€Hð 	ˆIØ
ˆIà
ˆKØ
ˆKà
ˆKØ
ˆKð
€N÷ð ÷!ð !ð< ÷
ó ð
ð ÷
ó ð
ð" ÷E
ó öE
r   r(   )"r   rc   r?   Útypingr   r   r   r   Úzope.interfacer   Ú
constantlyr   r   r	   Útwisted.internetr
   Útwisted.pythonr   Ú r   r   Ú_exceptionsr   r   r   r   r   r"   rr   rs   rv   r“   ÚIProxyParserr(   r   r   r    Ú<module>rŸ      s‰   ðñó Û ß /Ó /å &ç ,Ý å $Ý !ß  ÷ó ô�ô ô�&ô ð 	€Ø€Ø€Ø€ñ ˆ[×%Ñ%Ó&÷_
ð _
ó 'ò_
r   