§
    Hºiç†  ã            	       óÖ  — d dl 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	Z	d dl
Z
d dlZd dlZd dlZ	 d dlmZmZ n# e$ r d dlmZ d dlmZ Y nw xY wd dlmZ d dlmZ d d	lmZ d d
lmZ dD ] Z	  eei i dg¦  «        Z n# e$ r dZY Œw xY wej        ej        ej        hZdZ ddgZ!dZ" e# e$ e%dd¦  «        ¦  «         e$ e%dd¦  «        ¦  «        z    e$ e%dd¦  «        ¦  «        z    e$ e%dd¦  «        ¦  «        z   ¦  «        Z& G d„ de'¦  «        Z( G d„ d¦  «        Z) G d„ d¦  «        Z* G d„ de'¦  «        Z+ G d„ de'¦  «        Z, G d „ d!e-¦  «        Z. G d"„ d#e*¦  «        Z/dS )$é    N)ÚRandom)Úerror)Úmd5Úsha1)r   )Úsha)Ú	semaphore)Úwsgi)Úsocket)Ú	get_errno)zwsaccel.utf8validatorzautobahn.utf8validatorÚ i  € ÚWebSocketWSGIÚ	WebSockets$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11éè  iì  éï  iô  i¸  i   iˆ  c                   ó    ‡ — e Zd Zdˆ fd„	Zˆ xZS )Ú
BadRequestú400 Bad RequestNc                 ó€   •— t          t          | ¦  «                             ¦   «          || _        || _        || _        d S ©N)ÚsuperÚ	ExceptionÚ__init__ÚstatusÚbodyÚheaders)Úselfr   r   r   Ú	__class__s       €úW/home/mmwave/public_html/mmwave/venv/lib/python3.11/site-packages/eventlet/websocket.pyr   zBadRequest.__init__9   s8   ø€ Ý�i˜ÑÔ×'Ò'Ñ)Ô)Ð)ØˆŒØˆŒ	ØˆŒˆˆó    )r   NN©Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__©r   s   @r   r   r   8   s=   ø€ € € € € ðð ð ð ð ð ð ð ð ð r   r   c                   óf   — e Zd ZdZefd„Ze	 	 	 	 dd„¦   «         Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ ZdS )r   a®  Wraps a websocket handler function in a WSGI application.

    Use it like this::

      @websocket.WebSocketWSGI
      def my_handler(ws):
          from_browser = ws.wait()
          ws.send("from server")

    The single argument to the function will be an instance of
    :class:`WebSocket`.  To close the socket, simply return from the
    function.  Note that the server will log the websocket request at
    the time of closure.

    An optional argument max_frame_length can be given, which will set the
    maximum incoming *uncompressed* payload length of a frame. By default, this
    is set to 8MiB. Note that excessive values here might create a DOS attack
    vector.
    c                 óZ   — || _         d | _        d| _        g | _        d | _        || _        d S )NT)ÚhandlerÚprotocol_versionÚsupport_legacy_versionsÚsupported_protocolsÚorigin_checkerÚmax_frame_length)r   r(   r-   s      r   r   zWebSocketWSGI.__init__U   s7   € ØˆŒØ $ˆÔØ'+ˆÔ$Ø#%ˆÔ Ø"ˆÔØ 0ˆÔÐÐr   NFc                 ó8   ‡ ‡‡‡— ˆ ˆˆˆfd„}|€|S  ||¦  «        S )Nc                 óL   •—  ‰| ¦  «        }‰|_         ‰|_        ‰r‰|_        |S r   )r*   r,   r+   )r(   ÚinstÚclsr,   r*   r+   s     €€€€r   Ú	decoratorz+WebSocketWSGI.configured.<locals>.decoratorc   s5   ø€ Ø�3�w‘<”<ˆDØ+BˆDÔ(Ø"0ˆDÔØ"ð ?Ø+>�Ô(ØˆKr   © )r1   r(   r+   r,   r*   r2   s   ` ``` r   Ú
configuredzWebSocketWSGI.configured]   sK   øøøø€ ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ˆ?ØÐØˆy˜Ñ!Ô!Ð!r   c                 ó   — d„ |                      dd¦  «                             ¦   «                              d¦  «        D ¦   «         }d|v r,|                      dd¦  «                             ¦   «         dk    s |dd	g¦  «         g S 	 d
|v r|                      |¦  «        }n+| j        r|                      |¦  «        }nt          ¦   «         ‚nC# t          $ r6}|j        }|j        pd}|j	        pg } ||d	g|z   ¦  «         |gcY d }~S d }~ww xY wd|v r |d         ¦   «          	 |  
                    |¦  «         n.# t          $ r!}t          |¦  «        t          vr‚ Y d }~nd }~ww xY w|                     d¦  «         dt          j        _        g S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS r3   ©Ústrip)Ú.0Úparts     r   ú
<listcomp>z*WebSocketWSGI.__call__.<locals>.<listcomp>o   s6   € ð !Oð !Oð !Oàð �JŠJ‰LŒLð!Oð !Oð !Or   ÚHTTP_CONNECTIONr   Ú,ÚupgradeÚHTTP_UPGRADEÚ	websocketr   )Ú
ConnectionÚcloseÚHTTP_SEC_WEBSOCKET_VERSIONr   zeventlet.set_idleT)ÚgetÚlowerÚsplitÚ_handle_hybi_requestr*   Ú_handle_legacy_requestr   r   r   r   r(   ÚOSErrorr   ÚACCEPTABLE_CLIENT_ERRORSÚ_send_closing_framer	   Ú
WSGI_LOCALÚalready_handled)	r   ÚenvironÚstart_responseÚhttp_connection_partsÚwsÚer   r   r   s	            r   Ú__call__zWebSocketWSGI.__call__n   s  € ð!Oð !OàŸšÐ$5°rÑ:Ô:×@Ò@ÑBÔB×HÒHÈÑMÔMð!Oñ !Oô !OÐð Ð2Ð2Ð2Ø—’˜N¨BÑ/Ô/×5Ò5Ñ7Ô7¸;ÒFÐFàˆNÐ,Ð/FÐ.GÑHÔHÐHØˆIð	Ø+¨wÐ6Ð6Ø×.Ò.¨wÑ7Ô7��ØÔ-ð #Ø×0Ò0°Ñ9Ô9��å ‘l”lÐ"øøÝð 	ð 	ð 	Ø”XˆFØ”6�=˜SˆDØ”i�o 2ˆGØˆN˜6Ø3Ð6¸Ñ@ñBô Bð Bà�6ˆMˆMˆMˆMˆMˆMøøøøð	øøøð  'Ð)Ð)Ø(ˆGÐ'Ô(Ñ*Ô*Ð*ð	Ø�LŠL˜ÑÔÐÐøÝð 	ð 	ð 	Ý˜‰|Œ|Õ#;Ð;Ð;Øð <Ð;Ð;Ð;Ð;øøøøð	øøøð 	×Ò˜tÑ$Ô$Ð$ð +/�ŒÔ'Øˆ	s7   ÂAC Ã
DÃ+DÄDÄDÄ$D: Ä:
E%ÅE Å E%c                 ó  — d|v r|d                               ¦   «         }nd|v r	|d         }nt          d¦  «        ‚d|v rd| _        d|vrt          ¦   «         ‚nd| _        | j        dk    r˜|                      |d         ¦  «        }|                      |d         ¦  «        }d|d	         _        |d	                              d¦  «        }t          j        d
||¦  «        |z   }t          |¦  «         
                    ¦   «         }d}|                     d¦  «        dk    rd}|›d|                     d¦  «        ›|                     d¦  «        ›|                     d¦  «        ›�}	|                     d¦  «        }
|
�|	d|
z   z  }	| j        dk    rFd|                     d¦  «                             ¦   «         z   dz   |	                     ¦   «         z   dz   }n�| j        dk    rud|                     d¦  «                             ¦   «         z   dz   |                     dd¦  «                             ¦   «         z   dz   |	                     ¦   «         z   dz   |z   }nt          d¦  «        ‚|                     |¦  «         t          ||| j        ¦  «        S )Núeventlet.inputúgunicorn.socketú8No eventlet.input or gunicorn.socket present in environ.ÚHTTP_SEC_WEBSOCKET_KEY1éL   ÚHTTP_SEC_WEBSOCKET_KEY2éK   é   z
wsgi.inputz>IIrQ   zwsgi.url_schemeÚhttpsÚwssz://Ú	HTTP_HOSTÚSCRIPT_NAMEÚ	PATH_INFOÚQUERY_STRINGÚ?sg   HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: ÚHTTP_ORIGINs   
WebSocket-Location: ó   

sj   HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: s   
Sec-WebSocket-Protocol: ÚHTTP_SEC_WEBSOCKET_PROTOCOLÚdefaults   
Sec-WebSocket-Location: z#Unknown WebSocket protocol version.)Ú
get_socketr   r)   r   Ú_extract_numberÚcontent_lengthÚreadÚstructÚpackr   ÚdigestrD   ÚencodeÚ
ValueErrorÚsendallr   )r   rN   ÚsockÚkey1Úkey2Úkey3ÚkeyÚresponseÚschemeÚlocationÚqsÚhandshake_replys               r   rH   z$WebSocketWSGI._handle_legacy_request˜   së  € Ø˜wÐ&Ð&ØÐ+Ô,×7Ò7Ñ9Ô9ˆDˆDØ 'Ð)Ð)ØÐ,Ô-ˆDˆDåÐVÑWÔWÐWà$¨Ð/Ð/Ø$&ˆDÔ!Ø(°Ð7Ð7Ý ‘l”lÐ"ð 8ð %'ˆDÔ!àÔ  BÒ&Ð&Ø×'Ò'¨Ð0IÔ(JÑKÔKˆDØ×'Ò'¨Ð0IÔ(JÑKÔKˆDð 45ˆG�LÔ!Ô0Ø˜<Ô(×-Ò-¨aÑ0Ô0ˆDÝ”+˜e T¨4Ñ0Ô0°4Ñ7ˆCÝ˜3‘x”x—’Ñ(Ô(ˆHð ˆØ�;Š;Ð(Ñ)Ô)¨WÒ4Ð4ØˆFàˆFˆFØ�KŠK˜Ñ$Ô$Ð$Ø�KŠK˜Ñ&Ô&Ð&Ø�KŠK˜Ñ$Ô$Ð$ð	
ˆð �[Š[˜Ñ(Ô(ˆØˆ>Ø˜˜b™Ñ ˆHØÔ  BÒ&Ð&ð&ð )0¯ª°MÑ(BÔ(B×(IÒ(IÑ(KÔ(KñLðO(ñ(ð +3¯/ª/Ñ*;Ô*;ñ	<ð ?Jñ	Jð ˆOð Ô" bÒ(Ð(ð*ð -4¯KªK¸Ñ,FÔ,F×,MÒ,MÑ,OÔ,OñPðS,ñ,ð
 —’Ð9¸9ÑEÔE×LÒLÑNÔNñOð
R,ñ,ð /7¯oªoÑ.?Ô.?ñ@ðCñð #ñ#ð ˆOõ ÐBÑCÔCÐCØ�Š�_Ñ%Ô%Ð%Ý˜˜w¨Ô(=Ñ>Ô>Ð>r   c                 ó¼  — |€d S i }|                      d¦  «        D �]>}|                      d¦  «        }i }|dd …         D ]Æ}|                      d¦  «        }t          |¦  «        dk    r0d||d                              ¦   «                              ¦   «         <   ŒZ|d                              ¦   «                              d¦  «                             ¦   «         ||d                              ¦   «                              ¦   «         <   ŒÇ|                     |d                              ¦   «                              ¦   «         g ¦  «                             |¦  «         �Œ@|S )Nr=   ú;é   Ú=Tr   ú")rF   Úlenr8   rE   Ú
setdefaultÚappend)r   ÚheaderÚresÚextÚpartsÚconfigr:   Úkey_vals           r   Ú_parse_extension_headerz%WebSocketWSGI._parse_extension_headerÖ   s<  € Øˆ>Ø�4ØˆØ—<’< Ñ$Ô$ð 		Hñ 		HˆCØ—I’I˜c‘N”NˆEØˆFØ˜a˜b˜bœ	ð _ð _�ØŸ*š* S™/œ/�Ý�w‘<”< 1Ò$Ð$Ø9=�F˜7 1œ:×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5Ñ6Ð6à9@À¼×9IÒ9IÑ9KÔ9K×9QÒ9QÐRUÑ9VÔ9V×9\Ò9\Ñ9^Ô9^�F˜7 1œ:×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5Ñ6Ð6Ø�NŠN˜5 œ8Ÿ>š>Ñ+Ô+×1Ò1Ñ3Ô3°RÑ8Ô8×?Ò?ÀÑGÔGÐGÑGØˆ
r   c                 óV  — |sd S |                      d¦  «        }|€d S |D �]}|                      dd¦  «        |                      dd¦  «        dœ}t          t          j        d¦  «        }|                      d¦  «        }|�F|du r||d<   n<t	          |                      d|¦  «        ¦  «        |d<   d	|d         cxk    rdk    sn Œ§|                      d
¦  «        }|�G|du r||d
<   n=t	          |                      d
|¦  «        ¦  «        |d
<   d	|d
         cxk    rdk    sn �Œ|c S d S )Núpermessage-deflateÚserver_no_context_takeoverFÚclient_no_context_takeover)r�   rŽ   é   Úserver_max_window_bitsTr\   Úclient_max_window_bits)rD   ÚminÚzlibÚ	MAX_WBITSÚint)r   Ú
extensionsÚdeflaterˆ   Úwant_configÚ	max_wbitsÚmwbs          r   Ú_negotiate_permessage_deflatez+WebSocketWSGI._negotiate_permessage_deflateæ   sŒ  € Øð 	Ø�4Ø—.’.Ð!5Ñ6Ô6ˆØˆ?Ø�4Øð 	ñ 	ˆFð
 /5¯jªjÐ9UÐW\Ñ.]Ô.]Ø.4¯jªjÐ9UÐW\Ñ.]Ô.]ðð ˆKõ �DœN¨BÑ/Ô/ˆIØ—*’*Ð5Ñ6Ô6ˆCØˆØ˜$�;�;Ø<E�KÐ 8Ñ9Ð9õ ˜FŸJšJÐ'?ÀÑKÔKÑLÔLð  Ð 8Ñ9à Ð-EÔ!FÐLÐLÒLÐLÈ"ÒLÐLÐLÐLØ Ø—*’*Ð5Ñ6Ô6ˆCØˆØ˜$�;�;Ø<E�KÐ 8Ñ9Ð9õ ˜FŸJšJÐ'?ÀÑKÔKÑLÔLð  Ð 8Ñ9à Ð-EÔ!FÐLÐLÒLÐLÈ"ÒLÐLÐLÐLÙ ØÐÐÐØˆtr   c           	      óî  — |sd S g }|                      ¦   «         D ]Æ\  }}|                     ¦   «         g}|                      ¦   «         D ]o\  }}|du rŒ
|du r(|                     |                     ¦   «         ¦  «         Œ6|                     |›dt          |¦  «        ›�                     ¦   «         ¦  «         Œp|                     d                     |¦  «        ¦  «         ŒÇd                     |¦  «        S )NFTr   s   ; s   , )Úitemsro   rƒ   ÚstrÚjoin)r   Úparsed_extensionsr‡   Únamerˆ   Ú	ext_partsrv   Úvalues           r   Ú_format_extension_headerz&WebSocketWSGI._format_extension_header  sú   € Ø ð 	Ø�4ØˆØ-×3Ò3Ñ5Ô5ð 		0ð 		0‰LˆD�&ØŸš™œ˜ˆIØ$Ÿlšl™nœnð Mð M‘
��UØ˜E�>�>ØØ˜d�]�]Ø×$Ò$ S§Z¢Z¡\¤\Ñ2Ô2Ð2Ð2à×$Ò$°°°µc¸%±j´j°jÐ&A×%IÒ%IÑ%KÔ%KÑLÔLÐLÐLØ�LŠL˜Ÿš IÑ.Ô.Ñ/Ô/Ð/Ð/Ø�zŠz˜%Ñ Ô Ð r   c                 ó  — d|v r|d                               ¦   «         }nd|v r	|d         }nt          d¦  «        ‚|d         }|dvrt          ddg¬¦  «        ‚t          |¦  «        | _        d	|vrt          ¦   «         ‚|                     d
| j        dk    r|                     dd¦  «        nd¦  «        }| j        �9|                      |                     d¦  «        |¦  «        st          d¬¦  «        ‚|                     dd ¦  «        }d }|r/d„ |                     d¦  «        D ¦   «         D ]}|| j        v r|} nŒ|d	         }t          j
        t          |                     ¦   «         t          z   ¦  «                             ¦   «         ¦  «        }	dddd|	z   g}
|r*|
                     d|                     ¦   «         z   ¦  «         i }|                      |                     d¦  «        ¦  «        }|                      |¦  «        }|�||d<   |                      |¦  «        }|�|
                     d|z   ¦  «         |                     d                     |
¦  «        dz   ¦  «         t+          ||| j        ||| j        ¬¦  «        S )NrU   rV   rW   rC   )Ú8Ú13z426 Upgrade Required)zSec-WebSocket-Versionz8, 13)r   r   ÚHTTP_SEC_WEBSOCKET_KEYrd   r\   ÚHTTP_SEC_WEBSOCKET_ORIGINr   r_   z403 Forbidden)r   rf   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   r7   )r9   Úis     r   ú	<genexpr>z5WebSocketWSGI._handle_hybi_request.<locals>.<genexpr>6  s*   è è € Ð>Ð> A�a—g’g‘i”iÐ>Ð>Ð>Ð>Ð>Ð>r   r=   s    HTTP/1.1 101 Switching Protocolss   Upgrade: websockets   Connection: Upgrades   Sec-WebSocket-Accept: s   Sec-WebSocket-Protocol: ÚHTTP_SEC_WEBSOCKET_EXTENSIONSrŒ   s   Sec-WebSocket-Extensions: s   
re   )Úprotocolr–   r-   )rh   r   r   r•   r)   rD   r,   rF   r+   Úbase64Ú	b64encoder   ro   ÚPROTOCOL_GUIDrn   rƒ   rŠ   r›   r¤   rq   rŸ   ÚRFC6455WebSocketr-   )r   rN   rr   Úhybi_versionÚoriginÚ	protocolsÚnegotiated_protocolÚprv   rw   r{   r    r–   r—   Úformatted_exts                  r   rG   z"WebSocketWSGI._handle_hybi_request  sî  € Ø˜wÐ&Ð&ØÐ+Ô,×7Ò7Ñ9Ô9ˆDˆDØ 'Ð)Ð)ØÐ,Ô-ˆDˆDåÐVÑWÔWÐWàÐ;Ô<ˆØ˜}Ð,Ð,ÝÐ$:Ø&HÐ%IðKñ Kô Kð Kå # LÑ 1Ô 1ˆÔØ#¨7Ð2Ð2å‘,”,ÐØ—’ØàÔ%¨Ò*Ð*ð �[Š[Ð4°bÑ9Ô9Ð9Ø02ñ5ô 5ˆð ÔÐ*Ø×&Ò& w§{¢{°;Ñ'?Ô'?ÀÑHÔHð 9Ý ¨Ð8Ñ8Ô8Ð8Ø—K’KÐ =¸tÑDÔDˆ	Ø"ÐØð 	Ø>Ð>¨¯ª¸Ñ)=Ô)=Ð>Ñ>Ô>ð ð �Ø˜Ô0Ð0Ð0Ø*+Ð'Ø�Eð 1ð Ð.Ô/ˆÝÔ#¥D¨¯ª©¬½Ñ)EÑ$FÔ$F×$MÒ$MÑ$OÔ$OÑPÔPˆØ>Ø0Ø1Ø4°xÑ?ðAˆð ð 	_Ø×"Ò"Ð#>ÐAT×A[ÒA[ÑA]ÔA]Ñ#]Ñ^Ô^Ð^àÐØ×1Ò1°'·+²+Ð>]Ñ2^Ô2^Ñ_Ô_ˆ
à×4Ò4°ZÑ@Ô@ˆØÐØ6=ÐÐ2Ñ3à×5Ò5Ð6GÑHÔHˆØÐ$Ø×"Ò"Ð#@À=Ñ#PÑQÔQÐQà�Š�W—\’\ /Ñ2Ô2°[Ñ@ÑAÔAÐAÝ  g¨tÔ/DØ)<Ø+<Ø15Ô1FðHñ Hô Hð 	Hr   c                 óv   — d}d}|D ]!}|t           j        v r||z  }Œ|dk    r|dz  }Œ"t          |¦  «        |z  S )zš
        Utility function which, given a string like 'g98sd  5[]221@1', will
        return 9852211. Used to parse the Sec-WebSocket-Key headers.
        r   r   Ú r~   )ÚstringÚdigitsr•   )r   r£   ÚoutÚspacesÚchars        r   ri   zWebSocketWSGI._extract_numberU  sY   € ð
 ˆØˆØð 	ð 	ˆDØ•v”}Ð$Ð$Ø�t‘��Ø˜’�Ø˜!‘�øÝ�3‰xŒx˜6Ñ!Ð!r   )NNNF)r!   r"   r#   Ú__doc__ÚDEFAULT_MAX_FRAME_LENGTHr   Úclassmethodr4   rS   rH   rŠ   r›   r¤   rG   ri   r3   r   r   r   r   @   sÔ   € € € € € ðð ð( 2Jð 1ð 1ð 1ð 1ð àØ'+Ø"&Ø+0ð	"ð "ð "ñ „[ð"ð (ð (ð (ðT<?ð <?ð <?ð|ð ð ð $ð $ð $ðL!ð !ð !ð 7Hð 7Hð 7Hðr"ð "ð "ð "ð "r   c                   ó@   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zdd	„Z	d
„ Z
dS )r   a{  A websocket object that handles the details of
    serialization/deserialization to the socket.

    The primary way to interact with a :class:`WebSocket` object is to
    call :meth:`send` and :meth:`wait` in order to pass messages back
    and forth with the browser.  Also available are the following
    properties:

    path
        The path value of the request.  This is the same as the WSGI PATH_INFO variable,
        but more convenient.
    protocol
        The value of the Websocket-Protocol header.
    origin
        The value of the 'Origin' header.
    environ
        The full WSGI environment for this request.

    rY   c                 ó–  — |                      dt          j        ¦  «        | _        d                     |                      d¦  «        |                      dd¦  «        |                      dd¦  «        z   |                      d¦  «        |                      d¦  «        ¬	¦  «        | _        || _        |                      d
¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _	        || _
        || _        d| _        d| _        t          j        ¦   «         | _        t#          j        ¦   «         | _        dS )zê
        :param socket: The eventlet socket
        :type socket: :class:`eventlet.greenio.GreenSocket`
        :param environ: The wsgi environment
        :param version: The WebSocket spec version to follow (default is 76)
        zwsgi.errorsz-server={shost}/{spath} client={caddr}:{cport}r_   r`   r   ra   ÚREMOTE_ADDRÚREMOTE_PORT)ÚshostÚspathÚcaddrÚcportrd   ÚHTTP_WEBSOCKET_PROTOCOLFr   N)rD   ÚsysÚstderrÚlogÚformatÚlog_contextr
   r´   r®   ÚpathrN   ÚversionÚwebsocket_closedÚ_bufÚcollectionsÚdequeÚ_msgsr   Ú	SemaphoreÚ	_sendlock)r   rr   rN   rÒ   s       r   r   zWebSocket.__init__y  s  € ð —;’;˜}­c¬jÑ9Ô9ˆŒØJ×QÒQØ—+’+˜kÑ*Ô*Ø—+’+˜m¨RÑ0Ô0°7·;²;¸{ÈBÑ3OÔ3OÑOØ—+’+˜mÑ,Ô,°G·K²KÀÑ4NÔ4Nð Rñ 
ô 
ˆÔð
 ˆŒØ—k’k -Ñ0Ô0ˆŒØŸšÐ$=Ñ>Ô>ˆŒØ—K’K Ñ,Ô,ˆŒ	ØˆŒØˆŒØ %ˆÔØˆŒ	Ý Ô&Ñ(Ô(ˆŒ
Ý"Ô,Ñ.Ô.ˆŒˆˆr   c                 óØ   — t          |t          ¦  «        r|                     d¦  «        }n6t          |t          ¦  «        s!t          |¦  «                             ¦   «         }d|z   dz   }|S )zwPack the message inside ``00`` and ``FF``

        As per the dataframing section (5.3) for the websocket spec
        úutf-8ó    ó   ÿ)Ú
isinstancerž   ro   Úbytes©r   ÚmessageÚpackeds      r   Ú_pack_messagezWebSocket._pack_message‘  sf   € õ
 �g�sÑ#Ô#ð 	,Ø—n’n WÑ-Ô-ˆGˆGÝ˜G¥UÑ+Ô+ð 	,Ý˜'‘l”l×)Ò)Ñ+Ô+ˆGØ˜7Ñ" WÑ,ˆØˆr   c                 óv  — g }d}| j         }|r¤|d         }|dk    r[|                     d¦  «        }|dk    rnz|                     |d|…                              dd¦  «        ¦  «         ||dz   d…         }n9|dk    r!|d         dk    sJ d	|z  ¦   «         ‚d
| _        nt          d|z  ¦  «        ‚|°¤|| _         |S )a1   Parses for messages in the buffer *buf*.  It is assumed that
        the buffer contains the start character for a message, but that it
        may contain only part of the rest of the message.

        Returns an array of messages, and the buffer remainder that
        didn't contain any full messages.r   rÝ   éÿÿÿÿr~   rÛ   ÚreplaceNéÿ   z Unexpected closing handshake: %rTz6Don't understand how to parse this type of message: %r)rÔ   Úfindrƒ   ÚdecoderÓ   rp   )r   ÚmsgsÚend_idxÚbufÚ
frame_types        r   Ú_parse_messageszWebSocket._parse_messages�  sì   € ð ˆØˆØŒiˆØð 	aØ˜QœˆJØ˜QŠˆàŸ(š( 7Ñ+Ô+�Ø˜b’=�=ØØ—’˜C  ' 	œN×1Ò1°'¸9ÑEÔEÑFÔFÐFØ˜' A™+˜,˜,Ô'��Ø˜sÒ"Ð"à˜1”v ’{�{�{Ð$FÈÑ$L‘{”{�{Ø(,�Ô%Øå Ð!YÐ\_Ñ!_Ñ`Ô`Ð`ð ð 	að  ˆŒ	Øˆr   c                 ó  — |                       |¦  «        }| j                             ¦   «          	 | j                             |¦  «         | j                             ¦   «          dS # | j                             ¦   «          w xY w)zûSend a message to the browser.

        *message* should be convertable to a string; unicode objects should be
        encodable as utf-8.  Raises socket.error with errno of 32
        (broken pipe) if the socket has already been closed by the client.N)rã   rÙ   Úacquirer
   rq   Úreleaserà   s      r   ÚsendzWebSocket.sendº  s|   € ð ×#Ò# GÑ,Ô,ˆð 	Œ×ÒÑ Ô Ð ð	%ØŒK×Ò Ñ'Ô'Ð'àŒN×"Ò"Ñ$Ô$Ð$Ð$Ð$øˆDŒN×"Ò"Ñ$Ô$Ð$Ð$øøøs   °A% Á%B c                 ó"  — | j         sp| j        rdS | j                             d¦  «        }|dk    rdS | xj        |z  c_        |                      ¦   «         }| j                              |¦  «         | j         ¯p| j                              ¦   «         S )a"  Waits for and deserializes messages.

        Returns a single message; the oldest not yet processed. If the client
        has already closed the connection, returns None.  This is different
        from normal socket behavior because the empty string is a valid
        websocket message.Ni   r   )r×   rÓ   r
   ÚrecvrÔ   rî   ÚextendÚpopleft)r   Údeltarê   s      r   ÚwaitzWebSocket.waitÉ  sš   € ð ”*ð 
	$àÔ$ð Ø�tà”K×$Ò$ TÑ*Ô*ˆEØ˜Š|ˆ|Ø�tØˆIŒI˜ÑˆIŒIØ×'Ò'Ñ)Ô)ˆDØŒJ×Ò˜dÑ#Ô#Ð#ð ”*ð 
	$ð Œz×!Ò!Ñ#Ô#Ð#r   Fc                 óž   — | j         dk    r?| j        s:	 | j                             d¦  «         n# t          $ r |s‚ Y nw xY wd| _        dS dS dS )z3Sends the closing frame to the client, if required.rY   s   ÿ TN)rÒ   rÓ   r
   rq   rI   )r   Úignore_send_errorss     r   rK   zWebSocket._send_closing_frameÝ  s…   € àŒ<˜2ÒÐ dÔ&;ÐðØ”×#Ò# KÑ0Ô0Ð0Ð0øÝð ð ð ð *ð Øðð ðøøøð
 %)ˆDÔ!Ð!Ð!ð ÐÐÐs   ”/ ¯?¾?c                 ó–  — 	 |                       d¦  «         | j                             d¦  «         n`# t          $ rS}|j        t          j        k    r4| j                             d                     | j	        |¬¦  «        ¦  «         Y d}~nd}~ww xY w| j         
                    ¦   «          dS # | j         
                    ¦   «          w xY w)úcForcibly close the websocket; generally it is preferable to
        return from the handler method.Tú {ctx} socket shutdown error: {e}©ÚctxrR   N)rK   r
   ÚshutdownrI   ÚerrnoÚENOTCONNrÎ   ÚwriterÏ   rÐ   rB   )r   rR   s     r   rB   zWebSocket.closeé  sÍ   € ð	 Ø×$Ò$ TÑ*Ô*Ð*ØŒK× Ò  Ñ&Ô&Ð&Ð&øÝð 	eð 	eð 	eØŒw�%œ.Ò(Ð(Ø”—’ÐA×HÒHÈTÔM]ÐabÐHÑcÔcÑdÔdÐdøøøøøøøøøð	eøøøð ŒK×ÒÑÔÐÐÐøˆDŒK×ÒÑÔÐÐøøøs,   ‚/2 ±B- ²
B¼A	B
ÂB- Â
BÂB- Â-CN)rY   ©F)r!   r"   r#   rÀ   r   rã   rî   rò   rø   rK   rB   r3   r   r   r   r   d  s‘   € € € € € ðð ð(/ð /ð /ð /ð0
ð 
ð 
ðð ð ð:%ð %ð %ð$ð $ð $ð(
)ð 
)ð 
)ð 
)ð
 ð 
 ð 
 ð 
 ð 
 r   c                   ó   — e Zd ZdS )ÚConnectionClosedErrorN©r!   r"   r#   r3   r   r   r  r  ö  ó   € € € € € Ø€Dr   r  c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚFailedConnectionErrorc                 óh   •— t          ¦   «                              ||¦  «         || _        || _        d S r   )r   r   rá   r   )r   r   rá   r   s      €r   r   zFailedConnectionError.__init__û  s/   ø€ Ý‰Œ×Ò˜ Ñ)Ô)Ð)ØˆŒØˆŒˆˆr   r    r%   s   @r   r
  r
  ú  s8   ø€ € € € € ðð ð ð ð ð ð ð ð r   r
  c                   ó   — e Zd ZdS )ÚProtocolErrorNr  r3   r   r   r  r    r  r   r  c                   óÊ   ‡ — e Zd Zddddefˆ fd„	Z G d„ d¦  «        Zd„ Zd„ Zd	„ Z G d
„ d¦  «        Z	e
dd„¦   «         Zd„ Zd„ Zdd„Z	 	 dd„Zd„ Zd„ Zd„ Zdd„Zdd„Zˆ xZS )r²   é   NFc                 óæ   •— t          ¦   «                              |||¦  «         |                      ¦   «         | _        || _        || _        |pi | _        d | _        d | _        || _	        d | _
        d S r   )r   r   Ú_iter_framesÚiteratorÚclientr®   r–   Ú_deflate_encÚ_deflate_decr-   Ú_remote_close_data)	r   rr   rN   rÒ   r®   r  r–   r-   r   s	           €r   r   zRFC6455WebSocket.__init__  sr   ø€ å‰Œ×Ò˜˜w¨Ñ0Ô0Ð0Ø×)Ò)Ñ+Ô+ˆŒØˆŒØ ˆŒØ$Ð*¨ˆŒà ˆÔØ ˆÔØ 0ˆÔØ"&ˆÔÐÐr   c                   ó"   — e Zd Zd„ Zd„ Zdd„ZdS )úRFC6455WebSocket.UTF8Decoderc                 ó¦   — t           rt                                ¦   «         | _        nd | _        t          j        d¦  «        } |¦   «         | _        d S )NÚutf8)Úutf8validatorÚUtf8ValidatorÚ	validatorÚcodecsÚgetincrementaldecoderÚdecoder)r   Údecoderclasss     r   r   z%RFC6455WebSocket.UTF8Decoder.__init__  sG   € Ýð &Ý!.×!<Ò!<Ñ!>Ô!>�”�à!%�”Ý!Ô7¸Ñ?Ô?ˆLØ'˜<™>œ>ˆDŒLˆLˆLr   c                 óx   — | j         r| j                              ¦   «          | j                             ¦   «          d S r   )r  Úresetr   )r   s    r   r#  z"RFC6455WebSocket.UTF8Decoder.reset  s:   € ØŒ~ð 'Ø”×$Ò$Ñ&Ô&Ð&ØŒL×ÒÑ Ô Ð Ð Ð r   Fc                 ó¦   — | j         r0| j                              |¦  «        \  }}}}|st          d¦  «        ‚| j                             ||¦  «        S )NzData is not valid unicode)r  Úvalidaterp   r   ré   )r   ÚdataÚfinalÚvalidÚeocpÚc_iÚt_is          r   ré   z#RFC6455WebSocket.UTF8Decoder.decode!  s[   € ØŒ~ð BØ(,¬×(?Ò(?ÀÑ(EÔ(EÑ%��t˜S #Øð BÝ$Ð%@ÑAÔAÐAØ”<×&Ò& t¨UÑ3Ô3Ð3r   Nr  )r!   r"   r#   r   r#  ré   r3   r   r   ÚUTF8Decoderr    sF   € € € € € ð	*ð 	*ð 	*ð	!ð 	!ð 	!ð
	4ð 	4ð 	4ð 	4ð 	4ð 	4r   r,  c                 óØ   ‡ ‡— ‰ j                              d¦  «        Š‰€d S ˆˆ fd„}‰                     ‰ j        rdnd¦  «        r
 |¦   «         S ‰ j        € |¦   «         ‰ _        ‰ j        S )NrŒ   c                  ó¨   •— t          j        t           j        t           j        ‰                      ‰j        rdndt           j        ¦  «         ¦  «        S )Nr‘   r�   )r“   ÚcompressobjÚZ_DEFAULT_COMPRESSIONÚDEFLATEDrD   r  r”   ©Úoptionsr   s   €€r   Ú_makez;RFC6455WebSocket._get_permessage_deflate_enc.<locals>._make-  sU   ø€ ÝÔ#¥DÔ$>ÅÄØ%,§[¢[ÈTÌ[ð 2OÐ1IÐ1IØ6NÝ15´ñ&Aô &Að %AñBô Bð Br   rŽ   r�   )r–   rD   r  r  )r   r4  r3  s   ` @r   Ú_get_permessage_deflate_encz,RFC6455WebSocket._get_permessage_deflate_enc(  sŸ   øø€ Ø”/×%Ò%Ð&:Ñ;Ô;ˆØˆ?Ø�4ð	Bð 	Bð 	Bð 	Bð 	Bð 	Bð �;Š;°t´{ð 9Ð3Ð3Ø8ñ:ô :ð 	%ð �5‘7”7ˆNàÔ Ð(Ø$) E¡G¤G�Ô!ØÔ$Ð$r   c                 óÜ   ‡ ‡— ‰ j                              d¦  «        Š‰�|sd S ˆˆ fd„}‰                     ‰ j        rdnd¦  «        r
 |¦   «         S ‰ j        € |¦   «         ‰ _        ‰ j        S )NrŒ   c                  ó|   •— t          j        ‰                      ‰j        rdndt           j        ¦  «         ¦  «        S )Nr�   r‘   )r“   ÚdecompressobjrD   r  r”   r2  s   €€r   r4  z;RFC6455WebSocket._get_permessage_deflate_dec.<locals>._makeA  sK   ø€ ÝÔ% w§{¢{ÈtÌ{ð 4QÐ3KÐ3KØ8PÝ37´>ñ(Cô (Cð 'Cñ Dô Dð Dr   r�   rŽ   )r–   rD   r  r  )r   Úrsv1r4  r3  s   `  @r   Ú_get_permessage_deflate_decz,RFC6455WebSocket._get_permessage_deflate_dec<  s£   øø€ Ø”/×%Ò%Ð&:Ñ;Ô;ˆØˆ? $ˆ?Ø�4ð	Dð 	Dð 	Dð 	Dð 	Dð 	Dð
 �;Š;°t´{ð 9Ð3Ð3Ø8ñ:ô :ð 	%ð �5‘7”7ˆNàÔ Ð(Ø$) E¡G¤G�Ô!ØÔ$Ð$r   c                 óÔ   — d}t          |¦  «        |k     rR| j                             |t          |¦  «        z
  ¦  «        }|st          ¦   «         ‚||z   }t          |¦  «        |k     °R|S )Nr   )r�   r
   rô   r  )r   Únumbytesr&  Úds       r   Ú
_get_byteszRFC6455WebSocket._get_bytesO  so   € ØˆÝ�$‰iŒi˜(Ò"Ð"Ø”× Ò  ­C°©I¬IÑ!5Ñ6Ô6ˆAØð .Ý+Ñ-Ô-Ð-Ø˜!‘8ˆDõ	 �$‰iŒi˜(Ò"Ð"ð
 ˆr   c                   ó$   — e Zd Zdd„Zdd„Zd„ ZdS )úRFC6455WebSocket.MessageNc                 óZ   — || _         g | _        d| _        || _        || _        || _        d S )NF)r   r&  ÚfinishedÚopcodeÚdecompressorr-   )r   rC  r-   r   rD  s        r   r   z!RFC6455WebSocket.Message.__init__Y  s4   € Ø"ˆDŒLØˆDŒIØ!ˆDŒMØ ˆDŒKØ ,ˆDÔØ$4ˆDÔ!Ð!Ð!r   Fc                 óH   — || _         | j                             |¦  «         d S r   )rB  r&  rƒ   )r   r&  r'  s      r   ÚpushzRFC6455WebSocket.Message.pusha  s%   € Ø!ˆDŒMØŒI×Ò˜TÑ"Ô"Ð"Ð"Ð"r   c                 óX  — d                      | j        ¦  «        }| j        dz  s^| j        rW| j                             |dz   | j        ¦  «        }| j        j        r(t          dd                     | j        ¦  «        ¦  «        ‚| j	        r | j	         
                    || j        ¦  «        }|S )Nr   r\   ó     ÿÿéñ  z;Incoming compressed frame exceeds length limit of {} bytes.)rŸ   r&  rC  rD  Ú
decompressr-   Úunconsumed_tailr
  rÏ   r   ré   rB  )r   r&  s     r   Úgetvaluez!RFC6455WebSocket.Message.getvaluee  s¸   € Ø—8’8˜DœIÑ&Ô&ˆDØ”; ‘?ð u tÔ'8ð uØÔ(×3Ò3°DÐ;NÑ4NÐPTÔPeÑfÔf�ØÔ$Ô4ð uÝ/ØØU×\Ò\Ð]aÔ]rÑsÔsñuô uð uð Œ|ð @Ø”|×*Ò*¨4°´Ñ?Ô?�ØˆKr   )NNr  )r!   r"   r#   r   rF  rL  r3   r   r   ÚMessager@  X  sK   € € € € € ð	5ð 	5ð 	5ð 	5ð	#ð 	#ð 	#ð 	#ð	ð 	ð 	ð 	ð 	r   rM  r   c                 óŽ   ‡ ‡‡— |€t          ‰ ¦  «        }t          |¦  «        }d                     ˆ ˆˆfd„|D ¦   «         ¦  «        S )Nr   c              3   ób   •K  — | ])}t          ‰|         ‰‰|z   d z           z  f¦  «        V — Œ*dS )é   N)rß   )r9   r«   r&  ÚmaskÚoffsets     €€€r   r¬   z/RFC6455WebSocket._apply_mask.<locals>.<genexpr>w  sE   øè è € ÐPÐPÀq�˜t Aœw¨¨v¸©z¸QÑ.>Ô)?Ñ?ÐAÑBÔBÐPÐPÐPÐPÐPÐPr   )r�   ÚrangerŸ   )r&  rQ  ÚlengthrR  Úcnts   `` ` r   Ú_apply_maskzRFC6455WebSocket._apply_maskr  sM   øøø€ àˆ>Ý˜‘Y”YˆFÝ�F‰mŒmˆØ�xŠxÐPÐPÐPÐPÐPÐPÈCÐPÑPÔPÑPÔPÐPr   c                 ó$  — |dk    rÔ|| _         |sd}n¢t          |¦  «        dk    r�t          j        d|¦  «        d         }|r	|t          vrt          dd¦  «        ‚	 |                      ¦   «                              |dd …         d	¦  «        }n'# t          t          f$ r t          dd
¦  «        ‚w xY wd}|  
                    |df¬¦  «         t          ¦   «         ‚|dk    r|                      |d¬¦  «         d S |dk    rd S t          dd¦  «        ‚)Nr\   r   r~   ú!Hr   éê  zUnexpected close status code.é   Tz)Close message data should be valid UTF-8.r   ©Ú
close_dataé	   é
   ©Úcontrol_codezUnknown control frame received.)r  r�   rl   Úunpack_fromÚVALID_CLOSE_STATUSr
  r,  ré   ÚUnicodeDecodeErrorrp   rB   r  rò   )r   rC  r&  r   s       r   Ú_handle_control_framez&RFC6455WebSocket._handle_control_framey  sY  € Ø�QŠ;ˆ;Ø&*ˆDÔ#Øð Ø��Ý�T‘”˜Q’�ÝÔ+¨D°$Ñ7Ô7¸Ô:�Øð 9 Õ/AÐ!AÐ!AÝ/ØØ7ñ9ô 9ð 9ðEØ×+Ò+Ñ-Ô-×4Ò4°T¸!¸"¸"´X¸tÑDÔD�D�DøÝ*­JÐ7ð Eð Eð EÝ/ØØCñEô Eð EðEøøøð
 �Ø�JŠJ 6¨2 ,ˆJÑ/Ô/Ð/Ý'Ñ)Ô)Ð)Ø�qŠ[ˆ[Ø�IŠI�d¨ˆIÑ-Ô-Ð-Ð-Ð-Ø�sŠ]ˆ]ØˆDå'ØÐ7ñ9ô 9ð 9s   Á0B Â"B0c              #   ó  K  — d }	 	 |                       |¬¦  «        }|j        dz  r.|                      |j        |                     ¦   «         ¦  «         ŒO|r||urt	          d¦  «        ‚|}|j        r|                     ¦   «         }d }|V — Œ‡# t          $ r= t          j        ¦   «         \  }}}|  	                    |j
        |j        f¬¦  «         Y d S t          $ r Y d S t          $ r |  	                    d¬¦  «         ‚ w xY w)NT)rá   r\   zUnexpected message change.r[  )ió  zInternal Server Error)Ú_recv_framerC  rd  rL  ÚRuntimeErrorrB  r
  rÌ   Úexc_inforB   r   rá   r  r   )r   Úfragmented_messagerá   r&  Úexc_typÚexc_valÚexc_tbs          r   r  zRFC6455WebSocket._iter_frames–  s^  è è € Ø!Ðð	ðØ×*Ò*Ð3EÐ*ÑFÔF�Ø”> AÑ%ð Ø×.Ò.Øœ¨×(8Ò(8Ñ(:Ô(:ñ<ô <ð <àØ%ð E¨'Ð9KÐ*KÐ*KÝ&Ð'CÑDÔDÐDØ%,Ð"ØÔ#ð Ø-×6Ò6Ñ8Ô8�DØ)-Ð&Ø�J�J�Jðøõ %ð 	Eð 	Eð 	EÝ'*¤|¡~¤~Ñ$ˆG�W˜fØ�JŠJ 7¤>°7´?Ð"CˆJÑDÔDÐDÐDÐDÐDÝ$ð 	ð 	ð 	ØˆFˆFÝð 	ð 	ð 	Ø�JŠJÐ"AˆJÑBÔBÐBØð	øøøs   †BB ÂADÃ	DÃ !Dc                 ón  — | j         } |d¦  «        }t          j        d|¦  «        \  }}|dz	  dk    }|dz	  dz  }|dz  }|r|rd| j        vrt	          dd¦  «        ‚|d	z  }	|	d
vrt	          dd¦  «        ‚|dz  dk    }
|
s| j        st	          dd¦  «        ‚|dz  }|	dz  r)|st	          dd¦  «        ‚|dk    rt	          dd¦  «        ‚n(|	r|rt	          dd¦  «        ‚|	s|st	          dd¦  «        ‚|dk    r%t          j        d |d¦  «        ¦  «        d         }n*|dk    r$t          j        d |d¦  «        ¦  «        d         }|| j        k    r)t	          dd                     || j        ¦  «        ¦  «        ‚|
rt          j        d |d¦  «        ¦  «        }d}|r|	dz  rO|	dk    r|                      ¦   «         nd }|  	                    |¦  «        }|  
                    |	| j        ||¬¦  «        }|s|                     d|¬¦  «         n¦||k     r | j                             ||z
  ¦  «        }|st          ¦   «         ‚t          |¦  «        }|
r|                      ||||¬¦  «        }||z   }	 |                     ||¬¦  «         n%# t"          t$          f$ r t	          d d!¦  «        ‚w xY w||k     ° |S )"NrZ  z!BBé   r~   rP  rŒ   rY  zhRSV1, RSV2, RSV3: MUST be 0 unless an extension is negotiated that defines meanings for non-zero values.r�   )r   r~   rZ  r\   r]  r^  zUnknown opcode received.é€   z9A client MUST mask all frames that it sends to the serveré   r\   z&Control frames must not be fragmented.é}   zBAll control frames MUST have a payload length of 125 bytes or lessz=Received a non-continuation opcode within fragmented message.zAReceived continuation opcode with no previous fragments received.é~   rX  r   z!QrI  z=Incoming frame of {} bytes is above length limit of {} bytes.ú!BBBB)r   rD  r   )r'  )rT  rR  r   zText data must be valid utf-8)r>  rl   Úunpackr–   r
  r  r-   rÏ   r,  r:  rM  rF  r
   rô   r  r�   rV  rc  rp   )r   rá   rô   r„   ÚaÚbrB  Úrsv123r9  rC  ÚmaskedrT  rQ  Úreceivedr   rD  r=  Údlens                     r   rf  zRFC6455WebSocket._recv_frame¯  s»  € ØŒˆð ��a‘”ˆÝŒ}˜U FÑ+Ô+‰ˆˆ1Ø˜‘6˜Q’;ˆØ�a‘˜!‘ˆØ˜‰zˆØð 	NØð NÐ,°D´OÐCÐCå+ØðMñNô Nð Nð �R‘ˆØÐ-Ð-Ð-Ý'¨Ð.HÑIÔIÐIØ�S‘˜C’ˆØð 	H˜dœkð 	HÝ'¨ð /Gñ Hô Hð Hà�S‘ˆØ�A‰:ð 	(Øð ?Ý+¨Dð 3>ñ ?ô ?ð ?à˜Š|ˆ|Ý+Øð%ñ&ô &ð &ð ð
 ð 		(˜ð 		(Ý'Øð'ñ(ô (ð (ð ð 	( ð 	(Ý'Øð'ñ(ô (ð (ð �SŠ=ˆ=Ý”] 4¨¨¨a©¬Ñ1Ô1°!Ô4ˆFˆFØ�sŠ]ˆ]Ý”] 4¨¨¨a©¬Ñ1Ô1°!Ô4ˆFà�DÔ)Ò)Ð)Ý'¨Ð.m×.tÒ.tØ˜Ô-ñ//ô //ñ 0ô 0ð 0àð 	3Ý”= ¨$¨$¨q©'¬'Ñ2Ô2ˆDØˆØð 	n˜& 1™*ð 	nØ,2°aªK¨K�d×&Ò&Ñ(Ô(Ð(¸TˆGØ×;Ò;¸DÑAÔAˆLØ—l’l 6¨4Ô+@È'Ð`l�lÑmÔmˆGØð 	?Ø�LŠL˜ HˆLÑ-Ô-Ð-Ð-à˜VÒ#Ð#Ø”K×$Ò$ V¨hÑ%6Ñ7Ô7�Øð 2Ý/Ñ1Ô1Ð1Ý˜1‘v”v�Øð PØ×(Ò(¨¨D¸ÀhÐ(ÑOÔO�AØ# d™?�ð?Ø—L’L ¨(�LÑ3Ô3Ð3Ð3øÝ*­JÐ7ð ?ð ?ð ?Ý/ØÐ=ñ?ô ?ð ?ð?øøøð ˜VÒ#Ð#ð ˆs   É2J
 Ê
"J,Tc                 ó:  ‡— d}t          |t          ¦  «        r|                     d¦  «        }d}d}|                      ¦   «         }|pddz  }	|rW|rU|	sS|                     |¦  «        }||                     t          j        ¦  «        z  }|dd …         dk    sJ ‚|d d…         }d}t          |¦  «        }
|
sd}|rT|d	vrt          d
¦  «        ‚|s|st          d¦  «        ‚|
dk    rt          d¦  «        ‚t          j        d|dz  ¦  «        }n)|rdn|rdnd|z  }t          j        d||rdndz  ¦  «        }|rdnd}|
dk    rt          j        d|dz  |
¦  «        }n8|
dk    rt          j        d|dz  |
¦  «        }nt          j        d||
z  ¦  «        }|rjt          t          j        ¦   «         ¦  «        Šˆfd„t          d¦  «        D ¦   «         }t                               |||
¦  «        }t          j        dg|¢R Ž }nd}d                     ||||f¦  «        S )NFrÛ   Tr   r\   éüÿÿÿrH  é@   )r\   r]  r^  zUnknown control opcode.z#Control frame cannot be a fragment.rq  z$Control frame data too large (>125).z!Bro  r~   rZ  iÿÿ  z!BQrp  z!BHrr  c                 ó:   •— g | ]}‰                      d ¦  «        ‘ŒS )r\   )Úgetrandbits)r9   Ú_Úrands     €r   r;   z2RFC6455WebSocket._pack_message.<locals>.<listcomp>0  s'   ø€ Ð:Ð:Ð:¨A�D×$Ò$ QÑ'Ô'Ð:Ð:Ð:r   rP  rs  r   )rÞ   rž   ro   r5  ÚcompressÚflushr“   ÚZ_SYNC_FLUSHr�   r  rl   rm   r   ÚtimerS  r²   rV  rŸ   )r   rá   rx  Úcontinuationr'  r`  Úis_textÚcompress_bitÚ
compressorÚis_control_framerT  r„   rC  Ú
lengthdatarQ  Úmaskdatar�  s                   @r   rã   zRFC6455WebSocket._pack_messageü  s‡  ø€ àˆÝ�g�sÑ#Ô#ð 	Ø—n’n WÑ-Ô-ˆGØˆGàˆØ×5Ò5Ñ7Ô7ˆ
ð )Ð-¨A°Ñ2Ðð
 ð 	"�zð 	"Ð*:ð 	"Ø ×)Ò)¨'Ñ2Ô2ˆGØ�z×'Ò'­Ô(9Ñ:Ô:Ñ:ˆGØ˜2˜3˜3”<Ð#6Ò6Ð6Ð6Ð6Ø˜c˜r˜c”lˆGØ!ˆLå�W‘”ˆØð 	àˆFØð 
	JØ ;Ð.Ð.Ý#Ð$=Ñ>Ô>Ð>Øð K 5ð KÝ#Ð$IÑJÔJÐJØ˜Š|ˆ|Ý#Ð$JÑKÔKÐKÝ”[  |°fÑ'<Ñ=Ô=ˆFˆFà&ÐR�Q�Q°7Ð.A¨a¨aÀÀ\Ñ-QˆFÝ”[  v¸5Ð1G°°ÀaÑ'HÑIÔIˆFØ%Ð,�V�V¨1ˆ
Ø�EŠ>ˆ>Ýœ U¨J¸Ñ,<¸fÑEÔEˆJˆJØ�cŠ\ˆ\Ýœ U¨J¸Ñ,<¸fÑEÔEˆJˆJåœ T¨:¸Ñ+>Ñ?Ô?ˆJØð 	õ �$œ)™+œ+Ñ&Ô&ˆDØ:Ð:Ð:Ð:µ°q±´Ð:Ñ:Ô:ˆDÝ&×2Ò2°7¸DÀ&ÑIÔIˆGÝ”{ 7Ð2¨TÐ2Ð2Ð2ˆHˆHàˆHà�xŠx˜ ¨X°wÐ?Ñ@Ô@Ð@r   c                 ó    — | j         D ]}|c S d S r   )r  )r   r«   s     r   rø   zRFC6455WebSocket.wait8  s&   € Ø”ð 	ð 	ˆAØˆHˆHˆHð	ð 	r   c                 óÜ   — | j                              ¦   «          	 | j                             |¦  «         | j                              ¦   «          d S # | j                              ¦   «          w xY wr   )rÙ   rð   r
   rq   rñ   )r   Úframes     r   Ú_sendzRFC6455WebSocket._send<  se   € ØŒ×ÒÑ Ô Ð ð	%ØŒK×Ò Ñ&Ô&Ð&àŒN×"Ò"Ñ$Ô$Ð$Ð$Ð$øˆDŒN×"Ò"Ñ$Ô$Ð$Ð$øøøs   ›A ÁA+c                 ó`   — | j         |d<    | j        |fi |¤Ž}|                      |¦  «         d S )Nrx  )r  rã   r�  )r   rá   ÚkwÚpayloads       r   rò   zRFC6455WebSocket.sendC  s?   € Ø”{ˆˆ8‰Ø$�$Ô$ WÐ3Ð3°Ð3Ð3ˆØ�
Š
�7ÑÔÐÐÐr   c                 ó,  — | j         dv rˆ| j        sƒ|�H|\  }}t          |t          ¦  «        r|                     d¦  «        }t          j        d|¦  «        |z   }nd}	 |                      |d¬¦  «         n# t          $ r |s‚ Y nw xY wd| _        d S d S d S )N)r\   r  rÛ   rX  r   r\   r_  T)	rÒ   rÓ   rÞ   rž   ro   rl   rm   rò   rI   )r   rú   r\  r   Úmsgr&  s         r   rK   z$RFC6455WebSocket._send_closing_frameH  sÔ   € ØŒ<˜7Ð"Ð"¨4Ô+@Ð"ØÐ%Ø(‘�˜Ý˜c¥3Ñ'Ô'ð .ØŸ*š* WÑ-Ô-�CÝ”{ 4¨Ñ0Ô0°3Ñ6��à�ðØ—	’	˜$¨Q�	Ñ/Ô/Ð/Ð/øÝð ð ð ð *ð Øðð ðøøøð
 %)ˆDÔ!Ð!Ð!ð #Ð"Ð"Ð"s   ÁA6 Á6BÂBc                 ó®  — 	 |                       |d¬¦  «         | j                             t          j        ¦  «         n`# t          $ rS}|j        t
          j        k    r4| j                             d 	                    | j
        |¬¦  «        ¦  «         Y d}~nd}~ww xY w| j                             ¦   «          dS # | j                             ¦   «          w xY w)rü   T)r\  rú   rý   rþ   N)rK   r
   r   ÚSHUT_WRrI   r  r  rÎ   r  rÏ   rÐ   rB   )r   r\  rR   s      r   rB   zRFC6455WebSocket.closeZ  sÔ   € ð	 Ø×$Ò$°
ÈtÐ$ÑTÔTÐTØŒK× Ò ¥¤Ñ0Ô0Ð0Ð0øÝð 	eð 	eð 	eØŒw�%œ.Ò(Ð(Ø”—’ÐA×HÒHÈTÔM]ÐabÐHÑcÔcÑdÔdÐdøøøøøøøøøð	eøøøð ŒK×ÒÑÔÐÐÐøˆDŒK×ÒÑÔÐÐøøøs-   ‚;> ½B9 ¾
BÁA	BÂB9 ÂBÂB9 Â9C)Nr   r   )FFTN)FN)r!   r"   r#   rÁ   r   r,  r5  r:  r>  rM  ÚstaticmethodrV  rd  r  rf  rã   rø   r�  rò   rK   rB   r$   r%   s   @r   r²   r²     s˜  ø€ € € € € Ø.0¸4ÈÐZ^Ø":ð'ð 'ð 'ð 'ð 'ð 'ð4ð 4ð 4ð 4ð 4ñ 4ô 4ð 4ð*%ð %ð %ð(%ð %ð %ð&ð ð ðð ð ð ð ñ ô ð ð4 ðQð Qð Qñ „\ðQð9ð 9ð 9ð:ð ð ð2Kð Kð Kð KðZ -2ØCGð:Að :Að :Að :Aðxð ð ð%ð %ð %ðð ð ð
)ð )ð )ð )ð$
 ð 
 ð 
 ð 
 ð 
 ð 
 ð 
 ð 
 r   r²   )0r¯   r  rÕ   r  Úrandomr   r
   r   ÚSocketErrorr»   rl   rÌ   r…  r“   Úhashlibr   r   ÚImportErrorr   Úeventletr   r	   Úeventlet.greenÚeventlet.supportr   Ú_modÚ
__import__r  Ú
ECONNRESETÚEPIPEÚ	ESHUTDOWNrJ   rÁ   Ú__all__r±   ÚsetÚlistrS  rb  r   r   r   r   r  r
  rp   r  r²   r3   r   r   ú<module>r¨     sƒ  ðØ €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø €€€Ø €€€Ø 
€
€
€
Ø €€€à €€€ð Ø!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!øØð  ð  ð  ØÐÐÐÐÐØÐÐÐÐÐÐÐð øøøð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø &Ð &Ð &Ð &Ð &Ð &ð
 @ð 	ð 	€DðØ"˜
 4¨¨R°"°Ñ6Ô6ˆð 	ˆøð ð ð ð Øˆˆˆðøøøð
 "Ô,¨e¬k¸5¼?ÐKÐ Ø"Ð à˜KÐ
(€Ø7€Ø�SØ€Dˆˆˆt�TÑ	Ô	ÑÔØ€Dˆˆˆt�TÑ	Ô	ÑÔñð 	€Dˆˆˆt�TÑ	Ô	ÑÔñ	ð 	€Dˆˆˆt�TÑ	Ô	ÑÔññ	ô 	Ð ðð ð ð ð �ñ ô ð ða"ð a"ð a"ð a"ð a"ñ a"ô a"ð a"ðH	O ð O ð O ð O ð O ñ O ô O ð O ðd	ð 	ð 	ð 	ð 	˜Iñ 	ô 	ð 	ðð ð ð ð ˜Iñ ô ð ð	ð 	ð 	ð 	ð 	�Jñ 	ô 	ð 	ð_ ð _ ð _ ð _ ð _ �yñ _ ô _ ð _ ð _ ð _ s!   ²; »AÁAÁ/B Â B
Â	B
