ó
    Ö›‘h’/  ã                   ó`  • S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr   " S	 S
\5      rS rS rSrSrSrSrSrSrSrSrSrS rSq\" S5        Sr " S S\R>                  \R@                  5      r!\!" 5       r"\"RG                  5         \"RI                  S5        S r%S r&g)zé
Banana -- s-exp based protocol.

Future Plans: This module is almost entirely stable.  The same caveat applies
to it as applies to L{twisted.spread.jelly}, however.  Read its future plans
for more details.

@author: Glyph Lefkowitz
é    N)ÚBytesIO)Úprotocol)Ústyles)Úlog)Ú	iterbytes)ÚfullyQualifiedNamec                   ó   • \ rS rSrSrg)ÚBananaErroré   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    ÚYC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/spread/banana.pyr
   r
      s   † Úr   r
   c                 ó’   • U S:X  a	  U" S5        g U S:”  d   S5       eU (       a$  U" [        U S-  45      5        U S-	  n U (       a  M#  g g )Nr   ó    z!can only encode positive integersé   é   )Úbytes)ÚintegerÚstreams     r   Úint2b128r      sL   € Ø�!ƒ|ÙˆuŒØØ�Q‹;Ð;Ð;Ó;ˆ;Þ
ÙŒu�g ‘nÐ&Ó'Ô(Ø˜Q‘,ˆ÷ Š'r   c                 ó`   • SnSn[        U 5       H  n[        U5      nX$U-  -  nUS-  nM     U$ )zÕ
Convert an integer represented as a base 128 string into an L{int}.

@param st: The integer encoded in a byte string.
@type st: L{bytes}

@return: The integer value extracted from the byte string.
@rtype: L{int}
é   r   r   )r   Úord)ÚstÚeÚiÚcharÚns        r   Úb1282intr$   )   s@   € ð 	
€AØ	€AÜ˜"–ˆÜ�‹IˆØ	�‰U‰
ˆØ	ˆa‰Šñ ð €Hr   ó   €ó   �ó   ‚ó   ƒó   „ó   …ó   †ó   ‡c                 ó   • U q g)aK  
Set the limit on the prefix length for all Banana connections
established after this call.

The prefix length limit determines how many bytes of prefix a banana
decoder will allow before rejecting a potential object as too large.

@type limit: L{int}
@param limit: The number of bytes of prefix for banana to allow when
decoding.
N)Ú_PREFIX_LIMIT)Úlimits    r   ÚsetPrefixLimitr0   K   s	   € ð �Mr   é@   i  
 c                   ó@  • \ rS rSrSrSS/rSr\rS r	S r
S rS	 rS
 rS rSrS rS r0 SS_SS_SS_SS_SS_SS_SS_SS_SS _S!S"_S#S$_S%S&_S'S(_S)S*_S+S,_S-S._S/S0_S1S2S3S4S5S6S7S8S9S:S;S<S=S>S?.Er0 r\R)                  5        H  u  rr\\\'   M     SDS@ jrSA rSB rSCrg)EÚBananaéa   zÑ
L{Banana} implements the I{Banana} s-expression protocol, client and
server.

@ivar knownDialects: These are the profiles supported by this Banana
    implementation.
@type knownDialects: L{list} of L{bytes}
ó   pbó   noneNc                 ón   • Xl         SUS-  -  * S-   U l        SU l        SU l        SUS-  -  S-
  U l        g)z\
Set the prefix limit for decoding done by this protocol instance.

@see: L{setPrefixLimit}
é   r   r   i   €iÿÿÿN)ÚprefixLimitÚ_smallestLongIntÚ_smallestIntÚ_largestIntÚ_largestLongInt)Úselfr/   s     r   r0   ÚBanana.setPrefixLimitr   sI   € ð !ÔØ"#¨°©	Ñ"2Ð 3°aÑ 7ˆÔØ$ˆÔØ$ˆÔØ  U¨Q¡YÑ/°!Ñ3ˆÕr   c                 ó   • g)z@Surrogate for connectionMade
Called after protocol negotiation.
Nr   ©r>   s    r   ÚconnectionReadyÚBanana.connectionReady~   s   � r   c                 ó0   • Xl         U R                  5         g ©N)ÚcurrentDialectrB   )r>   Údialects     r   Ú_selectDialectÚBanana._selectDialectƒ   s   € Ø%ÔØ×ÑÕr   c                 óè  • U R                   (       a  U R                  U5        g U R                  (       am  U H6  nX R                  ;   d  M  U R	                  U5        U R                  U5          g    [        R                  " S5        U R                  R                  5         g XR                  ;   a  U R                  U5        g [        R                  " S5        U R                  R                  5         g )NzSThe client doesn't speak any of the protocols offered by the server: disconnecting.zYThe client selected a protocol the server didn't suggest and doesn't know: disconnecting.)
rF   ÚexpressionReceivedÚisClientÚknownDialectsÚsendEncodedrH   r   ÚmsgÚ	transportÚloseConnection)r>   ÚobjÚ	serverVers      r   ÚcallExpressionReceivedÚBanana.callExpressionReceived‡   s½   € Ø××Ø×#Ñ# CÕ(ð �}�}ã!$�IØ ×$6Ñ$6Õ6Ø×(Ñ(¨Ô3Ø×+Ñ+¨IÔ6Ùñ	 "%ô —G’Gð@ôð —N‘N×1Ñ1Õ3à×,Ñ,Ó,Ø×'Ñ'¨Õ,ô —G’GðCôð —N‘N×1Ñ1Õ3r   c                 ó–   • U R                  [        5        S U l        U R                  (       d  U R	                  U R
                  5        g g rE   )r0   r.   rF   rL   rN   rM   rA   s    r   ÚconnectionMadeÚBanana.connectionMade¥   s8   € Ø×ÑœMÔ*Ø"ˆÔØ�}�}Ø×Ñ˜T×/Ñ/Õ0ð r   c                 ó|   • U R                   nU(       a  US   S   R                  U5        g U R                  U5        g )Néÿÿÿÿr   )Ú	listStackÚappendrT   )r>   ÚitemÚls      r   ÚgotItemÚBanana.gotItem«   s0   € Ø�N‰NˆÞØˆb‰E�!‰H�O‰O˜DÕ!à×'Ñ'¨Õ-r   r   c                 ó\  • U R                   U-   nU R                  nU R                  nU(       Gaö  U R                   U:w  d3   SR                  [	        U R                   5      [	        U5      5      5       eX l         Sn[        U5       H  nU[        :¼  a    O2US-   nM     XPR                  :”  a  [        SU R                  4-  5      eg US U nX%US-    nX%S-   S  n	[        U5      U R                  :”  a  [        SU R                  4-  5      eU[        :X  a7  [        U5      nU[        :”  a  [        S5      eUR                  U/ 45        U	nGOnU[        :X  aA  [        U5      nU[        :”  a  [        S5      e[        U	5      U:¼  a  X—S  nU" U	S U 5        GO$g U[        :X  a  U	n[        U5      nU" U5        GOU[         :X  a  U	n[        U5      nU" U5        OâU["        :X  a  U	n[        U5      nU" U* 5        OÁU[$        :X  a  U	n[        U5      * nU" U5        O U[&        :X  aD  U	n[        U5      nU R(                  U   n
U R*                  S:X  a	  U" U
5        Oa[-        S	U
< 35      eU[.        :X  a9  [        U	5      S
:¼  a)  U	S
S  nU" [0        R2                  " SU	S S
 5      S   5        Og [-        SU< 35      eU(       aZ  [        US   S   5      US   S   :X  a?  UR5                  5       S   n
U" U
5        U(       a  [        US   S   5      US   S   :X  a  M?  U(       a  GMö  SU l         g )NzThis ain't right: {} {}r   r   z1Security precaution: more than %d bytes of prefixz9Security precaution: longer than %d bytes worth of prefixz#Security precaution: List too long.z%Security precaution: String too long.r5   zInvalid item for pb protocol é   ú!dzInvalid Type Byte rZ   r   )Úbufferr[   r_   ÚformatÚreprr   ÚHIGH_BIT_SETr9   r
   ÚlenÚLISTr$   Ú
SIZE_LIMITr\   ÚSTRINGÚINTÚLONGINTÚLONGNEGÚNEGÚVOCABÚincomingVocabularyrF   ÚNotImplementedErrorÚFLOATÚstructÚunpackÚpop)r>   Úchunkrd   r[   r_   ÚposÚchÚnumÚtypebyteÚrestr]   s              r   ÚdataReceivedÚBanana.dataReceived´   s(  € Ø—‘˜uÑ$ˆØ—N‘Nˆ	Ø—,‘,ˆßØ—;‘; &Ó(ð Ð*C×*JÑ*JÜ�T—[‘[Ó!Ü�V“ó+ó Ð(ð !ŒKØˆCÜ Ö'�ØœÓ%ÙØ˜A‘g’ñ (ð
 ×)Ñ)Ó)Ü%ØKØ×+Ñ+Ð-ñ.óð ð Ø˜˜#�,ˆCØ C¨!¡GÐ,ˆHØ ™'˜)Ð$ˆDÜ�3‹x˜$×*Ñ*Ó*Ü!ØOØ×'Ñ'Ð)ñ*óð ð œ4ÓÜ˜s“m�ØœÓ#Ü%Ð&KÓLÐLØ× Ñ  # r Ô+Ø’ØœVÓ#Ü˜s“m�ØœÓ#Ü%Ð&MÓNÐNÜ�t“9 Ó#Ø! $˜Z�FÙ˜D  #˜JÖ'àØœS“Ø�Ü˜s“m�Ù˜–ØœWÓ$Ø�Ü˜s“m�Ù˜•ØœWÓ$Ø�Ü˜s“m�Ù˜˜•ØœS“Ø�Ü “}�n�Ù˜•ØœUÓ"Ø�Ü˜s“m�Ø×.Ñ.¨sÑ3�Ø×&Ñ&¨%Ó/á˜D•Mä-Ð0MÈdÉXÐ.VÓWÐWØœUÓ"Ü�t“9 “>Ø! ! "˜X�FÙœFŸMšM¨$°°R°a°Ó9¸!Ñ<Õ=àä)Ð,>¸x¹lÐ*KÓLÐLÞ¤ Y¨r¡]°1Ñ%5Ó!6¸)ÀB¹-ÈÑ:JÓ!JØ —}‘}“ qÑ)�Ù˜”ö ¤ Y¨r¡]°1Ñ%5Ó!6¸)ÀB¹-ÈÑ:JÕ!J÷U ‰fðZ ˆ�r   c                 ó   • [        5       e)z=Called when an expression (list, string, or int) is received.)rr   )r>   Úlsts     r   rK   ÚBanana.expressionReceived  s   € ä!Ó#Ð#r   s   Noner   s   classr8   s   dereferenceé   s	   referenceé   s
   dictionaryé   s   functioné   s   instancer   s   listrb   s   moduleé	   s
   persistenté
   s   tupleé   s   unpersistableé   s   copyé   s   cacheé   s   cachedé   s   remoteé   s   localé   é   é   é   é   é   é   é   é   é   r   é   é   é   é   )s   lcaches   versions   logins   passwords	   challenges	   logged_ins   not_logged_ins   cachemessages   messages   answers   errors   decrefs   decaches   uncachec                 óv   • / U l         [        R                  " U R                  5      U l        SU l        Xl        g )Nr   )r[   ÚcopyÚoutgoingVocabularyÚoutgoingSymbolsÚoutgoingSymbolCountrL   )r>   rL   s     r   Ú__init__ÚBanana.__init__4  s-   € ØˆŒÜ#Ÿyšy¨×)@Ñ)@ÓAˆÔØ#$ˆÔ Ø �r   c                 ó¤   • [        5       nU R                  XR                  5        UR                  5       nU R                  R                  U5        g)zÜ
Send the encoded representation of the given object:

@param obj: An object to encode and send.

@raise BananaError: If the given object is not an instance of one of
    the types supported by Banana.

@return: L{None}
N)r   Ú_encodeÚwriteÚgetvaluerP   )r>   rR   ÚencodeStreamÚvalues       r   rN   ÚBanana.sendEncoded:  s=   € ô “yˆØ�‰�S×,Ñ,Ô-Ø×%Ñ%Ó'ˆØ�‰×Ñ˜UÕ#r   c           	      óÒ  • [        U[        [        45      (       ag  [        U5      [        :”  a  [        S[        U5      4-  5      e[        [        U5      U5        U" [        5        U H  nU R                  X25        M     g [        U[        5      (       aµ  XR                  :  d  XR                  :”  a  [        SU4-  5      eXR                  :  a  [        U* U5        U" [        5        g US:  a  [        U* U5        U" [        5        g XR                  ::  a  [        X5        U" [         5        g [        X5        U" ["        5        g [        U[$        5      (       a*  U" [&        5        U" [(        R*                  " SU5      5        g [        U[,        5      (       a›  U R.                  S:X  a6  XR0                  ;   a'  U R0                  U   n[        XB5        U" [2        5        g [        U5      [        :”  a  [        S[        U5      4-  5      e[        [        U5      U5        U" [4        5        U" U5        g [        SR7                  [9        [;        U5      5      U5      5      e)Nz#list/tuple is too long to send (%d)zint is too large to send (%d)r   rc   r5   z$byte string is too long to send (%d)z#Banana cannot send {} objects: {!r})Ú
isinstanceÚlistÚtuplerh   rj   r
   r   ri   r¤   Úintr:   r=   r;   rn   ro   r<   rl   rm   Úfloatrs   rt   Úpackr   rF   rŸ   rp   rk   re   r   Útype)r>   rR   r¥   ÚelemÚsymbolIDs        r   r¤   ÚBanana._encodeJ  sÕ  € Ü�cœD¤%˜=×)Ñ)Ü�3‹xœ*Ó$Ü!Ð"GÌ3ÈsË8È+Ñ"UÓVÐVÜ”S˜“X˜uÔ%Ù”$ŒKÛ�Ø—‘˜TÖ)ò ä˜œS×!Ñ!Ø×*Ñ*Ó*¨c×4HÑ4HÓ.HÜ!Ð"AÀSÀFÑ"JÓKÐKØ×&Ñ&Ó&Ü˜#˜˜uÔ%Ù”g•Ø�q“Ü˜#˜˜uÔ%Ù”c•
Ø×(Ñ(Ó(Ü˜Ô$Ù”c•
ä˜Ô$Ù”g•Ü˜œU×#Ñ#Ù”%ŒLÙ”&—+’+˜d CÓ(Õ)Ü˜œU×#Ñ#à×"Ñ" eÓ+°×7KÑ7KÓ0KØ×/Ñ/°Ñ4�Ü˜Ô)Ù”e•ä�s“8œjÓ(Ü%Ø>Ä#ÀcÃ(ÀÑLóð ô œ˜S› 5Ô)Ù”f”Ù�c•
äØ5×<Ñ<Ü&¤t¨C£yÓ1°3óóð r   )r<   r=   r;   r:   rd   rF   rL   r[   r    rŸ   r9   )r   )r   r   r   r   Ú__doc__rM   r9   rj   Ú	sizeLimitr0   rB   rH   rT   rW   r_   rd   r}   rK   rž   rq   ÚitemsÚkÚvr¡   rN   r¤   r   r   r   r   r3   r3   a   sŒ  † ñð ˜GÐ$€Mà€KØ€Iò
4òò
ò4ò<1ò.ð €FòQòf$ð#à�ð#ð 	�!ð#ð 	˜ð	#ð
 	�að#ð 	�qð#ð 	�Qð#ð 	�Qð#ð 	�ð#ð 	�1ð#ð 	�rð#ð 	�"ð#ð 	˜"ð#ð 	�ð#ð  	�"ð!#ð" 	�2ð##ð$ 	�2ð%#ð& 	�"ð'#ð( àØØØØØØØØØØØØòE#ÐðJ ÐØ"×(Ñ(Ö*‰ˆˆ1Ø !Ð˜1Óñ +ô!ò$õ -r   r3   r6   c                 óv   • [        5       nU[        l        [        R                  U 5        UR	                  5       $ )zEncode a list s-expression.)r   Ú_irP   rN   r¦   )r€   r§   s     r   Úencoder¼   €  s+   € ä“9€LØ„B„LÜ‡N�N�3ÔØ× Ñ Ó"Ð"r   c                 ó´   • / nUR                   [        l         [        R                  U 5        S[        l        [        ?US   $ ! S[        l        [        ?f = f)z!
Decode a banana-encoded string.
r   r   )r\   r»   rK   r}   rd   )r   r^   s     r   Údecoder¾   ˆ  sM   € ð 	€AØŸH™H„BÔð"Ü
�‰˜ÔàŒŒ	ÜÐ!ØˆQ‰4€Køð ŒŒ	ÜÑ!ús   ™A ÁA)'rµ   r�   rt   Úior   Útwisted.internetr   Útwisted.persistedr   Útwisted.pythonr   Útwisted.python.compatr   Útwisted.python.reflectr   Ú	Exceptionr
   r   r$   ri   rl   rk   ro   rs   rm   rn   rp   rg   r0   r.   rj   ÚProtocolÚ	Ephemeralr3   r»   rW   rH   r¼   r¾   r   r   r   Ú<module>rÈ      sÌ   ðñ
ó Û Ý å %Ý $Ý Ý +Ý 5ô	�)ô 	òòð( €Ø€Ø	€Ø€Ø€à
€Ø
€à€à€òð  €Ù ˆrÔ à€
ôVˆX×Ñ × 0Ñ 0ô Vñt ƒX€Ø × Ñ Ô Ø × Ñ �'Ô ò#ór   