§
    Ìtºfý‘ ã                   ó  — d dl Z d dlZd dlZd dlZd dl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mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZmZmZmZ d d	l m!Z! d d
l"m#Z#m$Z$m%Z%m&Z&m'Z' d dl"m(Z( d dl"m)Z) d dl*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl"m6Z6 d dl7Z7d dl8Z8 e9d¦  «        Z:dZ;d„ Z<d„ Z= G d„ de>¦  «        Z? G d„ de>¦  «        Z@d„ ZA G d„ de>¦  «        ZB G d„ de)¦  «        ZC ejD        eC¦  «          ejD        eC¦  «          ejD        eC¦  «          G d„ d e>¦  «        ZE G d!„ d"e>¦  «        ZFd#ZG G d$„ d%eC¦  «        ZH G d&„ d'eF¦  «        ZI G d(„ d)eC¦  «        ZJ G d*„ d+eF¦  «        ZKdS ),é    N)ÚOptionalÚUnionÚTupleÚDict)Úpformat)Údeque)Úparse)Ú__version__)ÚIWebSocketChannelÚIWebSocketChannelFrameApiÚIWebSocketChannelStreamingApi)ÚConnectingRequestÚConnectionRequestÚConnectionResponseÚConnectionDeny)ÚTransportDetails)Ú	StopwatchÚwildcards2patternsÚencode_truncateÚhltypeÚhlval)Ú_LazyHexFormatter)ÚObservableMixin)ÚUtf8Validator)ÚXorMaskerNullÚcreate_xor_masker)Ú PERMESSAGE_COMPRESSION_EXTENSION)Ú	parse_url)ÚPayloadExceededErrorÚDisconnected)Ú_maybe_tls_reason)ÚWebSocketProtocolÚWebSocketFactoryÚWebSocketServerProtocolÚWebSocketServerFactoryÚWebSocketClientProtocolÚWebSocketClientFactoryc                 óP  — |                       ¦   «         dk    rdS t          j        | ¦  «        }|j                              ¦   «         }|dk    rdS |j        }|j        }|€	 dddœ|         }n# t          $ r d}Y nw xY w|s"t          d                     | ¦  «        ¦  «        ‚|||fS )zª
    Given an RFC6455 Origin URL, this returns the (scheme, host, port)
    triple. If there's no port, and the scheme isn't http or https
    then port will be None
    ÚnullÚfileNi»  éP   )ÚhttpsÚhttpzNo host part in Origin '{}')	Úlowerr	   ÚurlsplitÚschemeÚhostnameÚportÚKeyErrorÚ
ValueErrorÚformat)ÚurlÚresr0   Úhostr2   s        úZ/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/autobahn/websocket/protocol.pyÚ_url_to_originr:   M   sÕ   € ð ‡y‚y�{„{�fÒÐØˆvå
Œ.˜Ñ
Ô
€CØŒZ×ÒÑÔ€FØ�ÒÐð ˆvàŒ<€DØŒ8€DØ€|ð	Ø ¨"Ð-Ð-¨fÔ5ˆDˆDøÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð ð DÝÐ6×=Ò=¸cÑBÔBÑCÔCÐCØ�4˜ÐÐs   Á!A- Á-A<Á;A<c                 óþ   — | dk    rdS t          | t          ¦  «        rt          | ¦  «        dk    st          d¦  «        ‚| \  }}}d}|                     |||¬¦  «        }|D ]}	|	                     |¦  «        r dS ŒdS )a   
    Internal helper. Returns True if the provided websocket_origin
    triple should be considered valid given the provided policy and
    expected host_port.

    Currently, the policy is just the list of allowedOriginsPatterns
    from the WebSocketProtocol instance. Schemes and ports are matched
    first, and only if there is not a mismatch do we compare each
    allowed-origin pattern against the host.
    r)   Fé   z$'websocket_origin' must be a 3-tuplez{scheme}://{host}:{port})r0   r8   r2   T)Ú
isinstanceÚtupleÚlenr4   r5   Úmatch)
Úwebsocket_originÚhost_schemeÚ	host_portÚhost_policyÚorigin_schemeÚorigin_hostÚorigin_portÚtemplateÚorigin_headerÚorigin_patterns
             r9   Ú_is_same_originrK   j   s¸   € ð ˜6Ò!Ð!àˆuåÐ&­Ñ.Ô.ð AµcÐ:JÑ6KÔ6KÈqÒ6PÐ6PÝÐ?Ñ@Ô@Ð@à0@Ñ-€]�K ð *€HØ—O’OØØØð $ñ ô €Mð &ð ð ˆØ×Ò Ñ.Ô.ð 	Ø�4�4ð	ð ˆ5ó    c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚTrafficStatsc                 ó.   — |                       ¦   «          d S ©N)Úreset©Úselfs    r9   Ú__init__zTrafficStats.__init__œ   s   € Ø�
Š
‰ŒˆˆˆrL   c                 ó®   — d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d S ©Nr   )ÚoutgoingOctetsWireLevelÚoutgoingOctetsWebSocketLevelÚoutgoingOctetsAppLevelÚoutgoingWebSocketFramesÚoutgoingWebSocketMessagesÚincomingOctetsWireLevelÚincomingOctetsWebSocketLevelÚincomingOctetsAppLevelÚincomingWebSocketFramesÚincomingWebSocketMessagesÚpreopenOutgoingOctetsWireLevelÚpreopenIncomingOctetsWireLevelrR   s    r9   rQ   zTrafficStats.resetŸ   sl   € ð ()ˆÔ$Ø,-ˆÔ)Ø&'ˆÔ#Ø'(ˆÔ$Ø)*ˆÔ&à'(ˆÔ$Ø,-ˆÔ)Ø&'ˆÔ#Ø'(ˆÔ$Ø)*ˆÔ&ð
 /0ˆÔ+Ø./ˆÔ+Ð+Ð+rL   c                 ó¶  — | j         dk    r*t          | j        ¦  «        t          | j         ¦  «        z  }nd }| j        dk    r*t          | j        ¦  «        t          | j        ¦  «        z  }nd }| j        dk    r2t          | j        | j        z
  ¦  «        t          | j        ¦  «        z  }nd }| j        dk    r2t          | j        | j        z
  ¦  «        t          | j        ¦  «        z  }nd }i d| j        “d| j        “d| j         “d|“d|“d| j        “d| j        “d	| j	        “d
| j        “d| j        “d| j        “d|“d|“d| j
        “d| j        “d| j        “S )Nr   rW   rX   rY   ÚoutgoingCompressionRatioÚoutgoingWebSocketOverheadrZ   r[   ra   r\   r]   r^   ÚincomingCompressionRatioÚincomingWebSocketOverheadr_   r`   rb   )rY   ÚfloatrX   r^   r]   rW   r\   rZ   r[   ra   r_   r`   rb   )rS   rd   rf   re   rg   s        r9   Ú__json__zTrafficStats.__json__´   s  € ð Ô&¨Ò*Ð*Ý',¨TÔ-NÑ'OÔ'OÕRWÐX\ÔXsÑRtÔRtÑ'tÐ$Ð$à'+Ð$ØÔ&¨Ò*Ð*Ý',¨TÔ-NÑ'OÔ'OÕRWÐX\ÔXsÑRtÔRtÑ'tÐ$Ð$à'+Ð$ð Ô,¨qÒ0Ð0Ý(-¨dÔ.JÈTÔMnÑ.nÑ(oÔ(oÕrwÐx|ô  yZñ  s[ô  s[ñ  )[Ð%Ð%à(,Ð%ØÔ,¨qÒ0Ð0Ý(-¨dÔ.JÈTÔMnÑ.nÑ(oÔ(oÕrwÐx|ô  yZñ  s[ô  s[ñ  )[Ð%Ð%à(,Ð%ðWÐ)¨4Ô+Gð WØ.°Ô0QðWà(¨$Ô*EðWð +Ð,DðWð ,Ð-Fð	Wð
 *¨4Ô+GðWð ,¨TÔ-KðWð 1°$Ô2UðWð *¨4Ô+GðWð /°Ô0QðWð )¨$Ô*EðWð +Ð,DðWð ,Ð-FðWð *¨4Ô+GðWð ,¨TÔ-KðWð  1°$Ô2Uð!Wð 	WrL   c                 óN   — t          j        |                      ¦   «         ¦  «        S rP   )ÚjsonÚdumpsri   rR   s    r9   Ú__str__zTrafficStats.__str__Þ   s   € ÝŒz˜$Ÿ-š-™/œ/Ñ*Ô*Ð*rL   N)Ú__name__Ú
__module__Ú__qualname__rT   rQ   ri   rm   © rL   r9   rN   rN   š   sT   € € € € € ðð ð ð0ð 0ð 0ð*(Wð (Wð (WðT+ð +ð +ð +ð +rL   rN   c                   ó   — e Zd ZdZd„ ZdS )ÚFrameHeaderzX
    Thin-wrapper for storing WebSocket frame metadata.

    FOR INTERNAL USE ONLY!
    c                 óL   — || _         || _        || _        || _        || _        dS )a€  
        Constructor.

        :param opcode: Frame opcode (0-15).
        :type opcode: int
        :param fin: Frame FIN flag.
        :type fin: bool
        :param rsv: Frame reserved flags (0-7).
        :type rsv: int
        :param length: Frame payload length.
        :type length: int
        :param mask: Frame mask (binary string) or None.
        :type mask: str
        N)ÚopcodeÚfinÚrsvÚlengthÚmask)rS   ru   rv   rw   rx   ry   s         r9   rT   zFrameHeader.__init__é   s+   € ð ˆŒØˆŒØˆŒØˆŒØˆŒ	ˆ	ˆ	rL   N©rn   ro   rp   Ú__doc__rT   rq   rL   r9   rs   rs   â   s-   € € € € € ðð ðð ð ð ð rL   rs   c                 ó  — |                       d¦  «                             ¦   «         }|d                              ¦   «         }i }i }|dd…         D ]­}|                     d¦  «        }|dk    r�|d|…                              ¦   «                              ¦   «         }||dz   d…                              ¦   «         }||v r4||xx         d                     |¦  «        z  cc<   ||xx         dz  cc<   Œ¢|||<   d||<   Œ­Œ®|||fS )as  
    Parses the beginning of a HTTP request header (the data up to the 

 line) into a pair
    of status line and HTTP headers dictionary.
    Header keys are normalized to all-lower-case.

    FOR INTERNAL USE ONLY!

    :param data: The HTTP header data up to the 

 line.
    :type data: bytes

    :returns: Tuple of HTTP status line, headers and headers count.
    z
iso-8859-1r   é   Nú:z, {})ÚdecodeÚ
splitlinesÚstripÚfindr.   r5   )	ÚdataÚrawÚhttp_status_lineÚhttp_headersÚhttp_headers_cntÚhÚiÚkeyÚvalues	            r9   ÚparseHttpHeaderrŒ   ÿ   s(  € ð* �+Š+�lÑ
#Ô
#×
.Ò
.Ñ
0Ô
0€CØ˜1”v—|’|‘~”~ÐØ€LØÐØ���ŒWð ð ˆØ�FŠF�3‰KŒKˆØˆqŠ5ˆ5à�B�Q�B”%—+’+‘-”-×%Ò%Ñ'Ô'ˆCØ�a˜!‘e�f�f”I—O’OÑ%Ô%ˆEð �lÐ"Ð"Ø˜SÐ!Ð!Ô! V§]¢]°5Ñ%9Ô%9Ñ9Ð!Ð!Ñ!Ø  Ð%Ð%Ô%¨Ñ*Ð%Ð%Ñ%Ð%à$)�˜SÑ!Ø()Ð  Ñ%Ð%ð Ø˜\Ð+;Ð;Ð;rL   c                   ó8   — e Zd ZdZd„ Zd„ Zd
d„Zd„ Zd„ Zd„ Z	d	S )ÚTimingsz}
    Helper class to track timings by key. This class also supports item access,
    iteration and conversion to string.
    c                 ó:   — t          ¦   «         | _        i | _        d S rP   )r   Ú
_stopwatchÚ_timingsrR   s    r9   rT   zTimings.__init__2  s   € Ý#™+œ+ˆŒØˆŒˆˆrL   c                 óH   — | j                              ¦   «         | j        |<   dS )zy
        Track elapsed for key.

        :param key: Key under which to track the timing.
        :type key: str
        N)r�   Úelapsedr‘   ©rS   rŠ   s     r9   ÚtrackzTimings.track6  s$   € ð "œ_×4Ò4Ñ6Ô6ˆŒ�cÑÐÐrL   Tc                 ó  — || j         v rã|| j         v rÚ| j         |         | j         |         z
  }|r»|dk     r&d                     t          |dz  ¦  «        ¦  «        }nz|dk     r&d                     t          |dz  ¦  «        ¦  «        }nN|dk     r&d                     t          |d	z  ¦  «        ¦  «        }n"d
                     t          |¦  «        ¦  «        }|                     d¦  «        S |S |rd                     d¦  «        S dS )aÉ  
        Get elapsed difference between two previously tracked keys.

        :param startKey: First key for interval (older timestamp).
        :type startKey: str
        :param endKey: Second key for interval (younger timestamp).
        :type endKey: str
        :param formatted: If ``True``, format computed time period and return string.
        :type formatted: bool

        :returns: Computed time period in seconds (or formatted string).
        çñhãˆµøä>z{} nsg    eÍÍAg{®Gáz„?z{} usg    €„.Aé
   z{} msg     @�@z{} sé   zn.a.N)r‘   r5   ÚroundÚrjust)rS   ÚstartKeyÚendKeyÚ	formattedÚdÚss         r9   ÚdiffzTimings.diff?  sþ   € ð �T”]Ð"Ð" x°4´=Ð'@Ð'@Ø”˜fÔ%¨¬°hÔ(?Ñ?ˆAØð Ø�w’;�;ØŸš¥u¨Q°©_Ñ'=Ô'=Ñ>Ô>�A�AØ˜’X�XØŸš¥u¨Q°©\Ñ':Ô':Ñ;Ô;�A�AØ˜’V�VØŸš¥u¨Q°©YÑ'7Ô'7Ñ8Ô8�A�AàŸš¥e¨A¡h¤hÑ/Ô/�AØ—w’w˜q‘z”zÐ!à�àð Ø—|’| A‘”Ð&à�trL   c                 ó8   — | j                              |d ¦  «        S rP   )r‘   Úgetr”   s     r9   Ú__getitem__zTimings.__getitem__`  s   € ØŒ}× Ò   dÑ+Ô+Ð+rL   c                 ó4   — | j                              ¦   «         S rP   )r‘   Ú__iter__rR   s    r9   r¦   zTimings.__iter__c  s   € ØŒ}×%Ò%Ñ'Ô'Ð'rL   c                 ó*   — t          | j        ¦  «        S rP   )r   r‘   rR   s    r9   rm   zTimings.__str__f  s   € Ý�t”}Ñ%Ô%Ð%rL   N©T)
rn   ro   rp   r{   rT   r•   r¡   r¤   r¦   rm   rq   rL   r9   rŽ   rŽ   ,  s~   € € € € € ðð ð
ð ð ð7ð 7ð 7ðð ð ð ðB,ð ,ð ,ð(ð (ð (ð&ð &ð &ð &ð &rL   rŽ   c                   óÞ  — e Zd ZdZdZg d¢Z	 ddgZ	 ddddddddddœ	Z	 dddœZ	 dZ		 d	Z
	 d
Z	 dZ	 dZ	 dZdZdZdZdZdZdZdZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ 	 dZ!	 dZ"	 dZ#	 dZ$	 dZ%	 dZ&	 eeeeeee e!e"e#e$gZ'	 g d ¢Z(	 g d!¢Z)	 g d"¢Z*	 d#„ Z+e,d$e-e.         fd%„¦   «         Z/d&„ Z0d'„ Z1d(„ Z2d)„ Z3d*„ Z4d+„ Z5d,„ Z6d-„ Z7d.„ Z8d/„ Z9d0„ Z:d1„ Z;d2„ Z<d3„ Z=d4„ Z>d5„ Z?d6„ Z@dcd8„ZAd9„ ZBed:fd;„ZCd<„ ZDd=„ ZEd>„ ZFd?„ ZGd@„ ZHdA„ ZIdB„ ZJdC„ ZKdD„ ZLdE„ ZMdF„ ZNdG„ ZOdH„ ZPdI„ ZQdJ„ ZRdddL„ZSdM„ ZTdN„ ZUdO„ ZVdP„ ZWdQ„ ZXdR„ ZY	 	 	 	 	 	 	 dedU„ZZdfdV„Z[dW„ Z\dX„ Z]dfdY„Z^dgdZ„Z_dhd[„Z`did\„Zad]„ Zbdcd^„Zcd_„ Zddcd`„Ze	 	 	 	 djda„Zfdkdb„ZgdKS )lr"   a   
    Protocol base class for WebSocket.

    This class implements:

      * :class:`autobahn.websocket.interfaces.IWebSocketChannel`
      * :class:`autobahn.websocket.interfaces.IWebSocketChannelFrameApi`
      * :class:`autobahn.websocket.interfaces.IWebSocketChannelStreamingApi`
    z<never connected>)	r˜   é   é   é   é   é   é   é   é   r™   r¬   r«   r±   )r™   r¬   s$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11r—   r}   é   r   r<   é   éè  ié  iê  ië  iì  ií  iî  iï  ið  iñ  iò  ió  iô  iõ  iö  i÷  )Ú	logOctetsÚ	logFramesÚtrackTimingsÚutf8validateIncomingÚ	applyMaskÚmaxFramePayloadSizeÚmaxMessagePayloadSizeÚautoFragmentSizeÚ
failByDropÚechoCloseCodeReasonÚopenHandshakeTimeoutÚcloseHandshakeTimeoutÚ
tcpNoDelayÚautoPingIntervalÚautoPingTimeoutÚautoPingSizeÚautoPingRestartOnAnyTraffic)ÚversionsÚ	webStatusÚrequireMaskedClientFramesÚmaskServerFramesÚperMessageCompressionAcceptÚserveFlashSocketPolicyÚflashSocketPolicyÚallowedOriginsÚallowedOriginsPatternsÚallowNullOriginÚmaxConnectionsÚtrustXForwardedFor)ÚversionÚacceptMaskedServerFramesÚmaskClientFramesÚserverConnectionDropTimeoutÚperMessageCompressionOffersrÊ   c                 ó¸   — t          j        ¦   «         | _        t          j        ¦   «         | _        |                      dg¦  «         t          ¦   «         | _        d S )NÚmessage)ÚtxaioÚcreate_futureÚ	is_closedÚis_openÚset_valid_eventsr   Ú_transport_detailsrR   s    r9   rT   zWebSocketProtocol.__init__(  s[   € åÔ,Ñ.Ô.ˆŒÝÔ*Ñ,Ô,ˆŒð 	×ÒØð
ñ 	ô 	ð 	õ ?OÑ>PÔ>PˆÔÐÐrL   Úreturnc                 ó   — | j         S )z\
        Implements :class:`autobahn.wamp.interfaces.ITransport.transport_details`.
        )rÞ   rR   s    r9   Útransport_detailsz#WebSocketProtocol.transport_details7  s   € ð
 Ô&Ð&rL   c                 ó:   — | j                              d¦  «         dS )z[
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onOpen`
        zWebSocketProtocol.onOpenN©ÚlogÚdebugrR   s    r9   ÚonOpenzWebSocketProtocol.onOpen>  s   € ð 	Œ�ŠÐ1Ñ2Ô2Ð2Ð2Ð2rL   c                 ó0   — || _         g | _        d| _        dS )zc
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageBegin`
        r   N)Úmessage_is_binaryÚmessage_dataÚmessage_data_total_length)rS   ÚisBinarys     r9   ÚonMessageBeginz WebSocketProtocol.onMessageBeginD  s"   € ð "*ˆÔØˆÔØ)*ˆÔ&Ð&Ð&rL   c                 óÀ  — || _         g | _        | xj        |z  c_        | j        s¶d| j        cxk     r| j        k     rKn nHd| _        |                      | j        | j        d                     | j        | j        ¦  «        ¦  «         dS d| j        cxk     r|k     rDn dS d| _	        |                      || j        d                     || j        ¦  «        ¦  «         dS dS dS )zh
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrameBegin`
        r   TzEreceived WebSocket message size {} exceeds payload limit of {} octetszCreceived WebSocket frame size {} exceeds payload limit of {} octetsN)
Úframe_lengthÚ
frame_datarê   Ú
failedByMer»   Ú wasMaxMessagePayloadSizeExceededÚ_max_message_size_exceededr5   rº   ÚwasMaxFramePayloadSizeExceeded)rS   rx   s     r9   ÚonMessageFrameBeginz%WebSocketProtocol.onMessageFrameBeginL  sd  € ð #ˆÔØˆŒØÐ&Ô&¨&Ñ0Ð&Ô&ØŒð 
	`Ø�4Ô-ÐNÐNÒNÐN°Ô0NÒNÐNÐNÐNÐNØ8<�Ô5Ø×/Ò/°Ô0NØ04Ô0JØ0w×0~Ò0~ð  @Dô  @^ð  `dô  `zñ  1{ô  1{ñ|ô |ð |ð |ð |ð �TÔ-Ð6Ð6Ò6Ð6°Ò6Ð6Ð6Ð6Ð6Ð6Ø6:�Ô3Ø×/Ò/°Ø04Ô0HØ0u×0|Ò0|ð  ~Dð  FJô  F^ñ  1_ô  1_ñ`ô `ð `ð `ð `ð
	`ð 
	`ð 7Ð6rL   c                 ó”  — | j         sÀ| j        dk    r™| xj        t          |¦  «        z  c_        d| j        cxk     r| j        k     rIn nFd| _        |                      | j        | j        d                     | j        | j        ¦  «        ¦  «         | j         	                    |¦  «         dS | j
         	                    |¦  «         dS dS )zg
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrameData`
        r   TzYreceived (partial) WebSocket message size {} (already) exceeds payload limit of {} octetsN)rð   Úwebsocket_versionrê   r?   r»   rñ   rò   r5   ré   Úappendrï   ©rS   Úpayloads     r9   ÚonMessageFrameDataz$WebSocketProtocol.onMessageFrameData_  s  € ð Œð 
	0ØÔ%¨Ò*Ð*ØÐ.Ô.µ#°g±,´,Ñ>Ð.Ô.Ø�tÔ1ÐRÐRÒRÐR°DÔ4RÒRÐRÐRÐRÐRØ<@�DÔ9Ø×3Ò3°DÔ4RØ48Ô4Nð 5P÷  5Wò  5Wð  X\ô  Xvð  x|ô  xRñ  5Sô  5SñTô Tð Tð Ô!×(Ò(¨Ñ1Ô1Ð1Ð1Ð1à”×&Ò& wÑ/Ô/Ð/Ð/Ð/ð
	0ð 
	0rL   c                 óV   — | j         s|                      | j        ¦  «         d| _        dS )zf
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrameEnd`
        N)rð   Ú_onMessageFramerï   rR   s    r9   ÚonMessageFrameEndz#WebSocketProtocol.onMessageFrameEndo  s/   € ð Œð 	2Ø× Ò  ¤Ñ1Ô1Ð1àˆŒˆˆrL   c                 óL   — | j         s| j                             |¦  «         dS dS )zc
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageFrame`
        N)rð   ré   Úextendrø   s     r9   ÚonMessageFramez WebSocketProtocol.onMessageFramex  s5   € ð Œð 	.ØÔ×$Ò$ WÑ-Ô-Ð-Ð-Ð-ð	.ð 	.rL   c                 ó@  ‡ — ‰ j         sŽd                     ‰ j        ¦  «        }‰ j        r‰ j                             d¦  «         ‰                      |‰ j        ¦  «         ‰                      d|‰ j        ¬¦  «        }ˆ fd„}t          j	        |d|¦  «         d‰ _        dS )za
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessageEnd`
        rL   Ú	onMessagerØ   )Ú	is_binaryc                 ó@   •— ‰j                              d| ¬¦  «         d S )Nz&Firing signal 'message' failed: {fail}©Úfail)rä   Úerror)ÚfrS   s    €r9   r  z-WebSocketProtocol.onMessageEnd.<locals>.error�  s0   ø€ Ø”—’Ø<Øð ñ ô ð ð ð rL   N)
rð   Újoinré   ÚtrackedTimingsr•   Ú
_onMessagerè   ÚfirerÙ   Úadd_callbacks)rS   rù   r  r  s   `   r9   ÚonMessageEndzWebSocketProtocol.onMessageEnd  s¶   ø€ ð Œð 	0Ø—h’h˜tÔ0Ñ1Ô1ˆGØÔ"ð 7ØÔ#×)Ò)¨+Ñ6Ô6Ð6Ø�OŠO˜G TÔ%;Ñ<Ô<Ð<ð —	’	˜) W¸Ô8N�	ÑOÔOˆAðð ð ð ð õ Ô  4¨Ñ/Ô/Ð/à ˆÔÐÐrL   c                 ób   — | j                              d|rt          |¦  «        nd|¬¦  «         dS )z^
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onMessage`
        zOWebSocketProtocol.onMessage(payload=<{payload_len} bytes)>, isBinary={isBinary}r   )Úpayload_lenrë   N©rä   rå   r?   )rS   rù   rë   s      r9   r  zWebSocketProtocol.onMessage—  sC   € ð 	Œ�ŠØ]Ø)0Ð7�˜W™œ˜°aØð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rL   c                 ó¸   — | j                              d|rt          |¦  «        nd¬¦  «         | j        t          j        k    r|                      |¦  «         dS dS )z[
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onPing`
        z7WebSocketProtocol.onPing(payload=<{payload_len} bytes>)r   ©r  N)rä   rå   r?   Ústater"   Ú
STATE_OPENÚsendPongrø   s     r9   ÚonPingzWebSocketProtocol.onPing¡  si   € ð 	Œ�ŠØEØ)0Ð7�˜W™œ˜°að 	ñ 	
ô 	
ð 	
ð Œ:Õ*Ô5Ò5Ð5Ø�MŠM˜'Ñ"Ô"Ð"Ð"Ð"ð 6Ð5rL   c                 ó`   — | j                              d|rt          |¦  «        nd¬¦  «         dS )z[
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onPong`
        z7WebSocketProtocol.onPong(payload=<{payload_len} bytes>)r   r  Nr  rø   s     r9   ÚonPongzWebSocketProtocol.onPong¬  s@   € ð 	Œ�ŠØEØ)0Ð7�˜W™œ˜°að 	ñ 	
ô 	
ð 	
ð 	
ð 	
rL   c                 óB   — | j                              d|||¬¦  «         dS )z\
        Implements :meth:`autobahn.websocket.interfaces.IWebSocketChannel.onClose`
        zLWebSocketProtocol.onClose(wasClean={wasClean}, code={code}, reason={reason}))ÚwasCleanÚcodeÚreasonNrã   )rS   r  r  r  s       r9   ÚonClosezWebSocketProtocol.onCloseµ  s7   € ð 	Œ�ŠØZØØØð	 	ñ 	
ô 	
ð 	
ð 	
ð 	
rL   c                 ó  — d| _         d| _        |�f|dk     s$d|cxk    rdk    rn n|t          j        vs|dk    r<|                      d                     |¦  «        ¦  «        rdS t          j        | _         n|| _         |�et          ¦   «         }|                     |¦  «        }|d         r|d         s|  	                    d	¦  «        rdS n| 
                    d
¦  «        | _        | j        t          j        k    rŸ| j        �:| j                             d¦  «         | j                             ¦   «          d| _        d| _        | j        j        r|                      d¬¦  «         dS | j        dk    r&t-          j        | j        | j        ¦  «        | _        dS dS | j        t          j        k    r¨d| _        | j        dk    r|                      d¬¦  «         nY| j        r1|                      | j         t=          | j        d¦  «        d¬¦  «         n!|                      t          j        d¬¦  «         | j        j        r|                      d¬¦  «         dS dS | j        t          j        k    r	d| _        dS tA          d¦  «        ‚)aQ  
        Callback when a Close frame was received. The default implementation answers by
        sending a Close when no Close was sent before. Otherwise it drops
        the TCP connection either immediately (when we are a server) or after a timeout
        (when we are a client and expect the server to drop the TCP).

        :param code: Close status code, if there was one (:class:`WebSocketProtocol`.CLOSE_STATUS_CODE_*).
        :type code: int
        :param reasonRaw: Close reason (when present, a status code MUST have been also be present).
        :type reasonRaw: bytes
        Nr´   i·  iˆ  zinvalid close code {}Tr   r}   z'invalid close reason (non-UTF8 payload)Úutf8z?connection closed properly: canceling closing handshake timeout©Úabort)ÚisReplyé{   ©r  Ú
reasonUtf8r#  )r  r#  Fúlogic error)!ÚremoteCloseCodeÚremoteCloseReasonr"   ÚCLOSE_STATUS_CODES_ALLOWEDÚ_protocol_violationr5   ÚCLOSE_STATUS_CODE_NORMALr   ÚvalidateÚ_invalid_payloadr   r  ÚSTATE_CLOSINGÚcloseHandshakeTimeoutCallrä   rå   Úcancelr  ÚfactoryÚisServerÚdropConnectionrÕ   rÙ   Ú
call_laterÚonServerConnectionDropTimeoutÚserverConnectionDropTimeoutCallr  rö   ÚsendCloseFramer¾   r   ÚSTATE_CLOSEDÚ	Exception)rS   r  Ú	reasonRawÚuÚvals        r9   ÚonCloseFramezWebSocketProtocol.onCloseFrameÀ  s  € ð  $ˆÔØ!%ˆÔð Ð ¨¢ °¸Ð1EÐ1EÒ1EÐ1EÀÒ1EÐ1EÐ1EÐ1EÐ1EÈ$ÕVgô  WCð  KCð  KCð  HLð  PTò  HTð  HTØ×'Ò'Ð(?×(FÒ(FÀtÑ(LÔ(LÑMÔMð RØ�tå'8Ô'Q�Ô$Ð$à#'ˆDÔ ð Ð õ ‘”ˆAØ—*’*˜YÑ'Ô'ˆCð ˜”Fð B˜s 1œvð BØ×(Ò(Ð)RÑSÔSð  Ø˜4ð ð *3×)9Ò)9¸&Ñ)AÔ)A�Ô&ð Œ:Õ*Ô8Ò8Ð8ð Ô-Ð9Ø”—’Ð`ÑaÔaÐaØÔ.×5Ò5Ñ7Ô7Ð7Ø15�Ô.à ˆDŒMàŒ|Ô$ð 
à×#Ò#¨$Ð#Ñ/Ô/Ð/Ð/Ð/ð Ô3°aÒ7Ð7Ý;@Ô;KØÔ8ØÔ:ñ<ô <�DÔ8Ð8Ð8ð 8Ð7ð ŒZÕ,Ô7Ò7Ð7ð !ˆDŒMàÔ%¨Ò*Ð*Ø×#Ò#¨DÐ#Ñ1Ô1Ð1Ð1ð Ô+ð gØ×'Ò'¨TÔ-AÍoÐ^bÔ^tÐvyÑNzÔNzð  EIÐ'ñ  Jô  Jð  Jð  Jà×'Ò'Õ->Ô-WÐaeÐ'ÑfÔfÐfàŒ|Ô$ð à×#Ò#¨%Ð#Ñ0Ô0Ð0Ð0Ð0ð
 �àŒZÕ,Ô9Ò9Ð9à!ˆDŒMˆMˆMõ ˜MÑ*Ô*Ð*rL   c                 óÌ   — d| _         | j        t          j        k    r-d| _        d| _        d| _        |                      d¬¦  «         dS | j         	                    d¦  «         dS )zØ
        We (a client) expected the peer (a server) to drop the connection,
        but it didn't (in time self.serverConnectionDropTimeout).
        So we drop the connection, but set self.wasClean = False.
        NFzPWebSocket closing handshake timeout (server did not drop TCP connection in time)Tr!  zQskipping closing handshake timeout: server did indeed drop the connection in time)
r7  r  r"   r9  r  ÚwasNotCleanReasonÚwasServerConnectionDropTimeoutr4  rä   rå   rR   s    r9   r6  z/WebSocketProtocol.onServerConnectionDropTimeout#  sl   € ð 04ˆÔ,àŒ:Õ*Ô7Ò7Ð7Ø!ˆDŒMØ%wˆDÔ"Ø26ˆDÔ/Ø×Ò dÐÑ+Ô+Ð+Ð+Ð+àŒH�NŠNÐnÑoÔoÐoÐoÐorL   c                 óì  — d| _         | j        t          j        t          j        fv r-d| _        d| _        d| _        |                      d¬¦  «         dS | j        t          j	        k    r| j
                             d¦  «         dS | j        t          j        k    r| j
                             d¦  «         dS | j        t          j        k    r| j
                             d¦  «         dS t          d	¦  «        ‚)
zÓ
        We expected the peer to complete the opening handshake with to us.
        It didn't do so (in time self.openHandshakeTimeout).
        So we drop the connection, but set self.wasClean = False.
        NFzWWebSocket opening handshake timeout (peer did not finish the opening handshake in time)Tr!  zeskipping opening handshake timeout: WebSocket connection is open (opening handshake already finished)zNskipping opening handshake timeout: WebSocket connection is already closing ..zJskipping opening handshake timeout: WebSocket connection is already closedr'  )ÚopenHandshakeTimeoutCallr  r"   ÚSTATE_CONNECTINGÚSTATE_PROXY_CONNECTINGr  r@  ÚwasOpenHandshakeTimeoutr4  r  rä   rå   r/  r9  r:  rR   s    r9   ÚonOpenHandshakeTimeoutz(WebSocketProtocol.onOpenHandshakeTimeout3  s   € ð )-ˆÔ%àŒ:Õ+Ô<Õ>OÔ>fÐgÐgÐgØ!ˆDŒMØ%~ˆDÔ"Ø+/ˆDÔ(Ø×Ò dÐÑ+Ô+Ð+Ð+Ð+ØŒZÕ,Ô7Ò7Ð7ØŒH�NŠNð  Cñ  Dô  Dð  Dð  Dð  DØŒZÕ,Ô:Ò:Ð:ØŒH�NŠNÐkÑlÔlÐlÐlÐlØŒZÕ,Ô9Ò9Ð9ØŒH�NŠNÐgÑhÔhÐhÐhÐhõ ˜MÑ*Ô*Ð*rL   c                 óÌ   — d| _         | j        t          j        k    r-d| _        d| _        d| _        |                      d¬¦  «         dS | j         	                    d¦  «         dS )zú
        We expected the peer to respond to us initiating a close handshake. It didn't
        respond (in time self.closeHandshakeTimeout) with a close response frame though.
        So we drop the connection, but set self.wasClean = False.
        NFzWWebSocket closing handshake timeout (peer did not finish the closing handshake in time)Tr!  zJskipping closing handshake timeout: WebSocket connection is already closed)
r0  r  r"   r9  r  r@  ÚwasCloseHandshakeTimeoutr4  rä   rå   rR   s    r9   ÚonCloseHandshakeTimeoutz)WebSocketProtocol.onCloseHandshakeTimeoutJ  sl   € ð *.ˆÔ&àŒ:Õ*Ô7Ò7Ð7Ø!ˆDŒMØ%~ˆDÔ"Ø,0ˆDÔ)Ø×Ò dÐÑ+Ô+Ð+Ð+Ð+àŒH�NŠNÐgÑhÔhÐhÐhÐhrL   c                 ó`   — | j                              dt          |¦  «        ||||¬¦  «         dS )a  
        When doing automatic ping/pongs, this is called upon a successful pong.

        :param ping_sent: Posix time in ns when ping was sent.
        :param ping_seq: Sequence number of ping that was sent.
        :param pong_received: Posix time in ns when pong was received.
        :param pong_rtt: Pong roundtrip-time in ms measured.
        :param payload: The complete WebSocket ping/pong message payload
            (ping_sent 8 bytes big-endian | ping_seq 4 bytes big endian | max. 113 optional random bytes).
        z‚Auto ping/pong: received pending pong (size={size}) for auto-ping (sent={sent}, seq={seq}, received={received}) in RTT of {rtt} ms)ÚsizeÚsentÚseqÚreceivedÚrttNr  )rS   Ú	ping_sentÚping_seqÚpong_receivedÚpong_rttrù   s         r9   Ú
onAutoPongzWebSocketProtocol.onAutoPongZ  sH   € ð 	Œ�Šð QÝ�W‘” I°8ÀmÐYað 	ñ 	cô 	cð 	cð 	cð 	crL   c                 ó\   — d| _         d| _        d| _        |                      d¬¦  «         dS )zš
        When doing automatic ping/pongs to detect broken connection, the peer
        did not reply in time to our ping. We drop the connection.
        Fz?WebSocket ping timeout (peer did not respond with pong in time)NTr!  )r  r@  ÚautoPingTimeoutCallr4  rR   s    r9   ÚonAutoPingTimeoutz#WebSocketProtocol.onAutoPingTimeouti  s8   € ð
 ˆŒØ!bˆÔØ#'ˆÔ Ø×Ò $ÐÑ'Ô'Ð'Ð'Ð'rL   Fc                 óÐ  — |                       ¦   «          | j        t          j        k    r›| j        r#| j                             d| j        |¬¦  «         n(| j                             d| j        || j	        ¬¦  «         d| _
        t          j        | _        t          j        | j        | ¦  «         |                      |¦  «         dS | j                             d| j        ¬¦  «         dS )	z5
        Drop the underlying TCP connection.
        z5dropping connection to peer {peer} with abort={abort})Úpeerr"  z?dropping connection to peer {peer} with abort={abort}: {reason})rZ  r"  r  TzFdropping connection to peer {peer} skipped - connection already closed)rZ  N)ÚunregisterProducerr  r"   r9  r  rä   rå   rZ  Úwarnr@  ÚdroppedByMerÙ   ÚresolverÛ   Ú_closeConnection)rS   r"  s     r9   r4  z WebSocketProtocol.dropConnections  sñ   € ð 	×ÒÑ!Ô!Ð!ØŒ:Õ*Ô7Ò7Ð7àŒ}ð ]Ø”—’ÐVÐ]aÔ]fÐns�ÑtÔtÐtÐtà”—’Ð_ÐfjÔfoÐw|ð  FJô  F\�ñ  ]ô  ]ð  ]à#ˆDÔõ
 +Ô7ˆDŒJÝŒM˜$œ.¨$Ñ/Ô/Ð/à×!Ò! %Ñ(Ô(Ð(Ð(Ð(àŒH�NŠNÐcÐjnÔjsˆNÑtÔtÐtÐtÐtrL   c                 óH   — 	 |                       t          j        |¦  «         d S rP   )Ú_fail_connectionr"   Ú!CLOSE_STATUS_CODE_MESSAGE_TOO_BIGr   )rS   Úmsg_sizeÚmax_msg_sizer  s       r9   rò   z,WebSocketProtocol._max_message_size_exceeded‹  s(   € ð	/Ø×!Ò!Õ"3Ô"UÐW]Ñ^Ô^Ð^Ð^Ð^rL   z
going awayc                 óÖ  — | j         t          j        k    r¹| j                             d||¬¦  «         d| _        | j        r9d| _        d                     |¦  «        | _	        |  
                    d¬¦  «         d
S | j         t          j        k    r(|                      |t          |d¦  «        d¬¦  «         d
S |  
                    d¬¦  «         d
S | j                             d	¦  «         d
S )z1
        Fails the WebSocket connection.
        z6failing WebSocket connection (code={code}): "{reason}")r  r  TFz+I dropped the WebSocket TCP connection: {0}r!  r$  r%  z=skip failing of connection since connection is already closedN)r  r"   r9  rä   r\  rð   r½   r  r5   r@  r4  r/  r8  r   rå   )rS   r  r  s      r9   ra  z"WebSocketProtocol._fail_connection’  sú   € ð Œ:Õ*Ô7Ò7Ð7ØŒH�MŠMÐRÐY]ÐflˆMÑmÔmÐmà"ˆDŒOàŒð 5à %�”Ø)V×)]Ò)]Ð^dÑ)eÔ)e�Ô&Ø×#Ò#¨$Ð#Ñ/Ô/Ð/Ð/Ð/ð ”:Õ!2Ô!@Ò@Ð@à×'Ò'¨T½oÈfÐVYÑ>ZÔ>ZÐdiÐ'ÑjÔjÐjÐjÐjð ×'Ò'¨eÐ'Ñ4Ô4Ð4Ð4Ð4ð ŒH�NŠNÐZÑ[Ô[Ð[Ð[Ð[rL   c                 ó�   — | j                              d|¬¦  «         |                      t          j        |¦  «         | j        rdS dS )a  
        Fired when a WebSocket protocol violation/error occurs.

        :param reason: Protocol violation that was encountered (human readable).
        :type reason: str

        :returns: True, when any further processing should be discontinued.
        zProtocol violation: {reason}©r  TF)rä   rå   ra  r"   Ú CLOSE_STATUS_CODE_PROTOCOL_ERRORr½   ©rS   r  s     r9   r+  z%WebSocketProtocol._protocol_violation­  sN   € ð 	Œ�ŠÐ5¸fˆÑEÔEÐEà×ÒÕ/ÔPÐRXÑYÔYÐYàŒ?ð 	Ø�4ð �5rL   c                 ó�   — | j                              d|¬¦  «         |                      t          j        |¦  «         | j        rdS dS )aƒ  
        Fired when invalid payload is encountered. Currently, this only happens
        for text message when payload is invalid UTF-8 or close frames with
        close reason that is invalid UTF-8.

        :param reason: What was invalid for the payload (human readable).
        :type reason: str

        :returns: True, when any further processing should be discontinued.
        zInvalid payload: {reason}rg  TF)rä   rå   ra  r"   Ú!CLOSE_STATUS_CODE_INVALID_PAYLOADr½   ri  s     r9   r.  z"WebSocketProtocol._invalid_payloadÁ  sN   € ð 	Œ�ŠÐ2¸6ˆÑBÔBÐBà×ÒÕ/ÔQÐSYÑZÔZÐZàŒ?ð 	Ø�4ð �5rL   c                 ó”   — t          | d¦  «        r| j        |k    r,|| _        | j        rt          ¦   «         | _        dS d| _        dS dS )zŒ
        Enable/disable tracking of detailed timings.

        :param enable: Turn time tracking on/off.
        :type enable: bool
        r·   N)Úhasattrr·   rŽ   r
  )rS   Úenables     r9   ÚsetTrackTimingsz!WebSocketProtocol.setTrackTimings×  s_   € õ �t˜^Ñ,Ô,ð 	+°Ô0AÀVÒ0KÐ0KØ &ˆDÔØÔ ð +Ý&-¡i¤i�Ô#Ð#Ð#à&*�Ô#Ð#Ð#ð 1LÐ0KrL   c           	      ó¨  — g }| j         D ]z}t          | |¦  «        s6t          | |t          | j        |¦  «        ¦  «         | j        j        j        }n| j        j        }|                     |t          | |¦  «        |f¦  «         Œ{| j         	                    dt          |¦  «        ¬¦  «         d| _        d| _        |                      | j        ¦  «         t          ¦   «         | _        | j        j        s| j        j        �t&          j        | _        nt&          j        | _        t&          j        | _        d| _        t5          ¦   «         | _        d| _        t;          ¦   «         | _        d| _        d| _         d| _!        d| _"        d| _#        d| _$        d| _%        d| _&        d| _'        d| _(        d| _)        d| _*        d| _+        d| _,        d| _-        | j        j        sd| _.        d| _/        d| _0        d| _1        d| _2        d| _3        d| _4        d| _5        | j6        dk    r1| j        j7         8                    | j6        | j9        ¦  «        | _/        dS dS )z°
        This is called by network framework when a new TCP connection has been established
        and handed over to a Protocol instance (an instance of this class).
        z
{attrs})ÚattrsNrL   Fr   ):ÚCONFIG_ATTRSrm  ÚsetattrÚgetattrr2  Ú	__class__rn   r÷   rä   rå   r   Ú_perMessageCompressr
  ro  r·   rN   ÚtrafficStatsr3  Úproxyr"   rE  r  rD  ÚSEND_STATE_GROUNDÚ
send_staterƒ   r   Ú
send_queueÚ	triggeredr   Úutf8validatorró   rñ   Ú
closedByMerð   r]  r  r@  rA  rF  rI  ÚwasServingFlashSocketPolicyFileÚlocalCloseCodeÚlocalCloseReasonr(  r)  r7  rC  r0  rW  ÚautoPingPendingÚautoPingPendingCallÚautoPingPendingSeqÚautoPingPendingSentr¿   Ú_batched_timerr5  rG  )rS   ÚconfigAttrLogÚ
configAttrÚconfigAttrSources       r9   Ú_connectionMadez!WebSocketProtocol._connectionMadeå  st  € ð ˆØÔ+ð 	\ð 	\ˆJÝ˜4 Ñ,Ô,ð ;Ý˜˜j­'°$´,À
Ñ*KÔ*KÑLÔLÐLØ#'¤<Ô#9Ô#BÐ Ð à#'¤>Ô#:Ð Ø× Ò  *­g°d¸JÑ.GÔ.GÐIYÐ!ZÑ[Ô[Ð[Ð[àŒ�Š�{­'°-Ñ*@Ô*@ˆÑAÔAÐAð $(ˆÔ ð #ˆÔØ×Ò˜TÔ.Ñ/Ô/Ð/õ )™NœNˆÔð Œ|Ô$ð 	<¨¬Ô);Ð)GÝ*ÔAˆDŒJˆJå*Ô;ˆDŒJÝ+Ô=ˆŒØˆŒ	õ
  ™'œ'ˆŒØˆŒõ +™_œ_ˆÔð /4ˆÔ+Ø05ˆÔ-ð
  ˆŒð
  ˆŒð !ˆÔð ˆŒð "&ˆÔð /4ˆÔ+ð (-ˆÔ$ð ).ˆÔ%ð 05ˆÔ,ð #ˆÔð !%ˆÔð  $ˆÔð "&ˆÔð Œ|Ô$ð 	8Ø37ˆDÔ0Ø(,ˆÔ%Ø)-ˆÔ&à#'ˆÔ Ø#ˆÔØ#'ˆÔ Ø"#ˆÔØ#'ˆÔ ð Ô$ qÒ(Ð(Ø,0¬LÔ,G×,RÒ,RØÔ)ØÔ+ñ-ô -ˆDÔ)Ð)Ð)ð )Ð(rL   c                 óP  — | j                              d|¬¦  «         | j        j        sA| j        �:| j                              d¦  «         | j                             ¦   «          d| _        | j        r:| j                              d¦  «         | j                             ¦   «          d| _        | j        r:| j                              d¦  «         | j                             ¦   «          d| _        | j        � | j                             ¦   «          d| _        | j	        t          j        k    r+t          j        | _	        t          j        | j        | ¦  «         | j        r| j                              d¦  «         dS | j        sƒ| j        s<| j        €5t'          |dd¦  «        }|sdnt)          |¦  «        }|r|| _        nd	| _        |                      | j        t          j        d
                     | j        ¦  «        ¦  «         dS |                      | j        | j        | j        ¦  «         dS )zc
        This is called by network framework when a transport connection was
        lost.
        z_connectionLost: {reason}rg  Nz&serverConnectionDropTimeoutCall.cancelzBAuto ping/pong: canceling autoPingPendingCall upon lost connectionzBAuto ping/pong: canceling autoPingTimeoutCall upon lost connectionz9connection dropped after serving Flash Socket Policy Filer‹   zLpeer dropped the TCP connection without previous WebSocket closing handshakez&connection was closed uncleanly ("{}"))rä   rå   r2  r3  r7  r1  rƒ  rW  rC  r  r"   r9  rÙ   r^  rÛ   r  r  r]  r@  rt  r!   Ú_onCloseÚ CLOSE_STATUS_CODE_ABNORMAL_CLOSEr5   r(  r)  )rS   r  Úreason_valueÚreason_strings       r9   Ú_connectionLostz!WebSocketProtocol._connectionLost[  sH  € ð 	Œ�ŠÐ2¸6ˆÑBÔBÐBàŒ|Ô$ð 	8¨Ô)MÐ)YØŒH�NŠNÐCÑDÔDÐDØÔ0×7Ò7Ñ9Ô9Ð9Ø37ˆDÔ0ð Ô#ð 	,ØŒH�NŠNÐ_Ñ`Ô`Ð`ØÔ$×+Ò+Ñ-Ô-Ð-Ø'+ˆDÔ$àÔ#ð 	,ØŒH�NŠNÐ_Ñ`Ô`Ð`ØÔ$×+Ò+Ñ-Ô-Ð-Ø'+ˆDÔ$ð Ô(Ð4ØÔ)×0Ò0Ñ2Ô2Ð2Ø,0ˆDÔ)ð Œ:Õ*Ô7Ò7Ð7Ý*Ô7ˆDŒJÝŒM˜$œ.¨$Ñ/Ô/Ð/àÔ/ð 	[ØŒH�NŠNÐVÑWÔWÐWÐWÐWà”=ð 
[ØÔ'ð @¨DÔ,BÐ,JÝ#*¨6°7¸DÑ#AÔ#A�LØ0<Ð$a D DÕBSÐT`ÑBaÔBa�MØ$ð @Ø1>˜Ô.Ð.à1˜Ô.Ø—’˜dœmÕ->Ô-_ð  bJ÷  bQò  bQð  RVô  Rhñ  biô  biñ  jô  jð  jð  jð  jà—’˜dœm¨TÔ-AÀ4ÔCYÑZÔZÐZÐZÐZrL   c                 ód   — | j                              d| j        t          |¦  «        ¬¦  «         dS )zu
        Hook fired right after raw octets have been received, but only when
        self.logOctets == True.
        z)RX Octets from {peer} : octets = {octets})rZ  ÚoctetsN©rä   rå   rZ  r   ©rS   rƒ   s     r9   ÚlogRxOctetszWebSocketProtocol.logRxOctets�  s>   € ð
 	Œ�ŠØ7Ø”Ý$ TÑ*Ô*ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rL   c                 óf   — | j                              d| j        |t          |¦  «        ¬¦  «         dS )zq
        Hook fired right after raw octets have been sent, but only when
        self.logOctets == True.
        z6TX Octets to {peer} : sync = {sync}, octets = {octets})rZ  Úsyncr’  Nr“  )rS   rƒ   r—  s      r9   ÚlogTxOctetszWebSocketProtocol.logTxOctets›  sA   € ð
 	Œ�ŠØDØ”ØÝ$ TÑ*Ô*ð	 	ñ 	
ô 	
ð 	
ð 	
ð 	
rL   c                 ó4  — d                      |¦  «        }| j                             d| j        |j        |j        |j        |j        rt          j	        |j        ¦  «        nd|j
        |j        dk    rt          |¦  «        nt          |¦  «        ¬¦  «         dS )z…
        Hook fired right after WebSocket frame has been received and decoded,
        but only when self.logFrames == True.
        rL   zyRX Frame from {peer} : fin = {fin}, rsv = {rsv}, opcode = {opcode}, mask = {mask}, length = {length}, payload = {payload}ú-r}   )rZ  rv   rw   ru   ry   rx   rù   N)r	  rä   rå   rZ  rv   rw   ru   ry   ÚbinasciiÚb2a_hexrx   Úreprr   )rS   ÚframeHeaderrù   rƒ   s       r9   Ú
logRxFramezWebSocketProtocol.logRxFrame§  sŸ   € ð
 �xŠx˜Ñ Ô ˆØŒ�ŠðFà”Ø”Ø”ØÔ%Ø7BÔ7GÐP•Ô! +Ô"2Ñ3Ô3Ð3ÈSØÔ%Ø"-Ô"4¸Ò"9Ð"9•D˜‘J”J�JÕ?PÐQUÑ?VÔ?Vð 	ñ 
	
ô 
	
ð 
	
ð 
	
ð 
	
rL   c                 ó  — | j                              d| j        |j        |j        |j        |j        rt          j        |j        ¦  «        nd|j	        ||||j        dk    rt          |¦  «        nt          |¦  «        ¬¦  «         dS )z�
        Hook fired right after WebSocket frame has been encoded and sent, but
        only when self.logFrames == True.
        z¾TX Frame to {peer} : fin = {fin}, rsv = {rsv}, opcode = {opcode}, mask = {mask}, length = {length}, repeat_length = {repeat_length}, chopsize = {chopsize}, sync = {sync}, payload = {payload}rš  r}   )
rZ  rv   rw   ru   ry   rx   Úrepeat_lengthÚchopsizer—  rù   N)rä   rå   rZ  rv   rw   ru   ry   r›  rœ  rx   r�  r   )rS   rž  rù   ÚrepeatLengthr¢  r—  s         r9   Ú
logTxFramezWebSocketProtocol.logTxFrame¹  s™   € ð
 	Œ�ŠðIð ”Ø”Ø”ØÔ%Ø7BÔ7GÐP•Ô! +Ô"2Ñ3Ô3Ð3ÈSØÔ%Ø&ØØØ%0Ô%7¸1Ò%<Ð%<•D˜‘M”M�MÕBSÐT[ÑB\ÔB\ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
rL   c                 óŽ  — | j         t          j        k    r#| j        xj        t          |¦  «        z  c_        nL| j         t          j        k    s| j         t          j        k    r"| j        xj        t          |¦  «        z  c_        | j	        r|  
                    |¦  «         | xj        |z  c_        |                      ¦   «          dS )zj
        This is called by network framework upon receiving data on transport
        connection.
        N)r  r"   r  rw  r\   r?   rD  rE  rb   rµ   r•  rƒ   ÚconsumeDatar”  s     r9   Ú_dataReceivedzWebSocketProtocol._dataReceivedÎ  s¹   € ð
 Œ:Õ*Ô5Ò5Ð5ØÔÐ5Ô5½¸T¹¼ÑBÐ5Ô5Ð5ØŒZÕ,Ô=Ò=Ð=ÀÄÕO`ÔOwÒAwÐAwØÔÐ<Ô<ÅÀDÁ	Ä	ÑIÐ<Ô<àŒ>ð 	#Ø×Ò˜TÑ"Ô"Ð"Øˆ	Œ	�TÑˆ	Œ	Ø×ÒÑÔÐÐÐrL   c                 ó8  — | j         t          j        k    s| j         t          j        k    r[|                      ¦   «         rA| j         t          j        k    r0	 |                      ¦   «         r| j         t          j        k    °*dS dS dS dS | j         t          j        k    r|                      ¦   «          dS | j         t          j        k    r|  	                    ¦   «          dS | j         t          j        k    r| j
                             d¦  «         dS t          d¦  «        ‚)z3
        Consume buffered (incoming) data.
        zreceived data in STATE_CLOSEDzinvalid stateN)r  r"   r  r/  ÚprocessDatar9  rE  ÚprocessProxyConnectrD  ÚprocessHandshakerä   rå   r:  rR   s    r9   r¦  zWebSocketProtocol.consumeDataÝ  s,  € ð Œ:Õ*Ô5Ò5Ð5¸¼ÕGXÔGfÒ9fÐ9fð ×"Ò"Ñ$Ô$ð ¨¬Õ7HÔ7UÒ)UÐ)UØð ×"Ò"Ñ$Ô$ð ¨¬Õ7HÔ7UÒ)UÐ)UÐ)UÐ)Uð ð ð ð Ð)UÐ)Uð
 ŒZÕ,ÔCÒCÐCà×$Ò$Ñ&Ô&Ð&Ð&Ð&ð ŒZÕ,Ô=Ò=Ð=ð ×!Ò!Ñ#Ô#Ð#Ð#Ð#ð ŒZÕ,Ô9Ò9Ð9ð ŒH�NŠNÐ:Ñ;Ô;Ð;Ð;Ð;õ
 ˜OÑ,Ô,Ð,rL   c                 ó    — t          d¦  «        ‚)z(
        Process proxy connect.
        z@must implement proxy connect (client or server) in derived class©r:  rR   s    r9   rª  z%WebSocketProtocol.processProxyConnect  s   € õ ÐZÑ[Ô[Ð[rL   c                 ó    — t          d¦  «        ‚)z.
        Process WebSocket handshake.
        z<must implement handshake (client or server) in derived classr­  rR   s    r9   r«  z"WebSocketProtocol.processHandshake  s   € õ ÐVÑWÔWÐWrL   c                 óN   — | j         sd| _         |                      ¦   «          dS dS )zp
        Trigger sending stuff from send queue (which is only used for
        chopped/synched writes).
        TN)r|  Ú_sendrR   s    r9   Ú_triggerzWebSocketProtocol._trigger  s0   € ð
 Œ~ð 	Ø!ˆDŒNØ�JŠJ‰LŒLˆLˆLˆLð	ð 	rL   c                 óÖ  — t          | j        ¦  «        dk    �rH| j                             ¦   «         }| j        t          j        k    rÚ| j                             |d         ¦  «         | j        t          j        k    r)| j	        xj
        t          |d         ¦  «        z  c_
        nR| j        t          j        k    s| j        t          j        k    r(| j	        xj        t          |d         ¦  «        z  c_        | j        r"|                      |d         |d         ¦  «         n| j                             d¦  «         t%          j        t          j        | j        ¦  «         dS d| _        dS )zu
        Send out stuff from send queue. For details how this works, see
        test/trickling in the repo.
        r   r}   z1skipped delayed write, since connection is closedFN)r?   r{  Úpopleftr  r"   r9  Ú	transportÚwriter  rw  rW   rD  rE  ra   rµ   r˜  rä   rå   rÙ   r5  Ú_QUEUED_WRITE_DELAYr°  r|  )rS   Úes     r9   r°  zWebSocketProtocol._send  s8  € õ
 ˆtŒÑÔ !Ò#Ñ#Ø”×'Ò'Ñ)Ô)ˆAàŒzÕ.Ô;Ò;Ð;à”×$Ò$ Q q¤TÑ*Ô*Ð*à”:Õ!2Ô!=Ò=Ð=ØÔ%Ð=Ô=ÅÀQÀqÄTÁÄÑJÐ=Ô=Ð=Ø”ZÕ#4Ô#EÒEÐEÈÌÕWhÔWÒIÐIØÔ%ÐDÔDÍÈAÈaÌDÉ	Ì	ÑQÐDÔDà”>ð 1Ø×$Ò$ Q q¤T¨1¨Q¬4Ñ0Ô0Ð0øà”—’ÐRÑSÔSÐSõ ÔÕ.ÔBÀDÄJÑOÔOÐOÐOÐOà"ˆDŒNˆNˆNrL   Nc           
      óª  — |rk|dk    red}t          |¦  «        }d}|s:||z   }||k    rd}|}| j                             |||…         df¦  «         ||z  }|¯:|                      ¦   «          dS |st          | j        ¦  «        dk    r2| j                             ||f¦  «         |                      ¦   «          dS | j                             |¦  «         | j                             dt          | j	        ¦  «        t          | j        ¦  «        t          t          |¦  «        ¦  «        ¬¦  «         | j        t          j        k    r#| j        xj        t          |¦  «        z  c_        nL| j        t          j        k    s| j        t          j        k    r"| j        xj        t          |¦  «        z  c_        | j        r|                      |d¦  «         dS dS )aæ  
        Wrapper for self.transport.write which allows to give a chopsize.
        When asked to chop up writing to TCP stream, we write only chopsize
        octets and then give up control to select() in underlying reactor so
        that bytes get onto wire immediately. Note that this is different from
        and unrelated to WebSocket data message fragmentation. Note that this
        is also different from the TcpNoDelay option which can be set on the
        socket.
        r   FTz,{func} sent {data_len} bytes for peer {peer})ÚfuncrZ  Údata_lenN)r?   r{  r÷   r±  r´  rµ  rä   rå   r   ÚsendDatar   rZ  r  r"   r  rw  rW   rD  rE  ra   rµ   r˜  )rS   rƒ   r—  r¢  r‰   ÚnÚdoneÚjs           r9   r»  zWebSocketProtocol.sendData;  sß  € ð ð 	2˜ 1š˜ØˆAÝ�D‘	”	ˆAØˆDØð Ø˜‘L�Ø˜’6�6Ø�DØ�AØ”×&Ò&¨¨Q¨q¨S¬	°4Ð'8Ñ9Ô9Ð9Ø�X‘�ð ð ð �MŠM‰OŒOˆOˆOˆOàð 2•s˜4œ?Ñ+Ô+¨aÒ/Ð/Ø”×&Ò&¨¨d |Ñ4Ô4Ð4Ø—’‘”���à”×$Ò$ TÑ*Ô*Ð*Ø”—’ÐMÝ$*¨4¬=Ñ$9Ô$9Ý$)¨$¬)Ñ$4Ô$4Ý(-­c°$©i¬iÑ(8Ô(8ð ñ :ô :ð :ð
 ”:Õ!2Ô!=Ò=Ð=ØÔ%Ð=Ô=ÅÀTÁÄÑJÐ=Ô=Ð=Ø”ZÕ#4Ô#EÒEÐEÈÌÕWhÔWÒIÐIØÔ%ÐDÔDÍÈDÉ	Ì	ÑQÐDÔDà”>ð 2Ø×$Ò$ T¨5Ñ1Ô1Ð1Ð1Ð1ð2ð 2rL   c                 óš   — | j         �|j        r|                      |j        ¦  «         dS |                      |j        |j        ¦  «         dS )zh
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendPreparedMessage`
        N)rv  ÚdoNotCompressr»  ÚpayloadHybiÚsendMessagerù   Úbinary)rS   ÚpreparedMsgs     r9   ÚsendPreparedMessagez%WebSocketProtocol.sendPreparedMessaged  sR   € ð Ô#Ð+¨{Ô/HÐ+Ø�MŠM˜+Ô1Ñ2Ô2Ð2Ð2Ð2à×Ò˜[Ô0°+Ô2DÑEÔEÐEÐEÐErL   c                 óz
  — t          | j        ¦  «        }| j        �€'|dk    �r| j        d         }|dz  dk    }|dz  dz	  }|dz  }| j        d         }|dz  dk    }|d	z  }|dk    r8| j        �|dk    rn*|                      d
                     |¦  «        ¦  «        rdS | j        j        r | j        r|s|                      d¦  «        rdS | j        j        s | j	        s|r|                      d¦  «        rdS |dk    rÉ|s|                      d¦  «        rdS |dk    r|                      d¦  «        rdS |dvr*|                      d                     |¦  «        ¦  «        rdS |dk    r|dk    r|                      d¦  «        rdS | j        �:|dk    r4|                      d                     | j        j
        ¦  «        ¦  «        rdS n¾|dvr*|                      d                     |¦  «        ¦  «        rdS | j        s|dk    r|                      d¦  «        rdS | j        r|dk    r|                      d¦  «        rdS | j        �A|dk    r;| j        r4|                      d                     | j        j
        ¦  «        ¦  «        rdS |rd}nd}|dk     rd|z   }	n'|dk    rd|z   }	n|d	k    rd|z   }	nt          d¦  «        ‚||	k    �rzd}
|dk    rNt          j        d| j        |
|
dz   …         ¦  «        d         }|dk     r|                      d ¦  «        rdS |
dz  }
ns|d	k    rkt          j        d!| j        |
|
dz   …         ¦  «        d         }|d"k    r|                      d#¦  «        rdS |d$k     r|                      d ¦  «        rdS |
dz  }
n|}d}|r| j        |
|
dz   …         }|
dz  }
|r#|dk    r| j        rt!          ||¦  «        | _        nt%          ¦   «         | _        | j        |
d…         | _        t'          |||||¦  «        | _        |                      ¦   «          |dk    pt          | j        ¦  «        dk    S dS dS | j        j        | j                             ¦   «         z
  }||k    r&| j        d|…         }|}| j        |d…         | _        n| j        }|}d%| _        |dk    r| j                             |¦  «        }nd%}|                      |¦  «        }|du rdS | j                             ¦   «         | j        j        k    r|                      ¦   «         }|du rdS t          | j        ¦  «        dk    S )&z‹
        After WebSocket handshake has been completed, this procedure will do
        all subsequent processing of incoming bytes.
        Nr²   r   é€   ép   r³   r®   r}   é   z$RSV = {} and no extension negotiatedFzunmasked client-to-server framezmasked server-to-client frameé   zfragmented control frameé}   z.control frame with payload length > 125 octets)r™   é	   r˜   z&control frame using reserved opcode {}r™   z/received close control frame with payload len 1z&received compressed control frame [{}]©r   r}   r²   z#data frame using reserved opcode {}z;received continuation data frame outside fragmented messagezDreceived non-continuation data frame while inside fragmented messagez;received continuation data frame with compress bit set [{}]é~   r˜   r'  ú!Hz=invalid data frame length (not using minimal length encoding)ú!Qì   ÿÿÿÿ z!invalid data frame length (>2^63)i   rL   )r?   rƒ   Úcurrent_framerv  r+  r5   r2  r3  rÈ   rÓ   ÚEXTENSION_NAMEÚinside_messager:  ÚstructÚunpackr¹   r   Úcurrent_frame_maskerr   rs   ÚonFrameBeginrx   ÚpointerÚprocessÚonFrameDataÚ
onFrameEnd)rS   Úbuffered_lenÚbÚ	frame_finÚ	frame_rsvÚframe_opcodeÚframe_maskedÚframe_payload_len1Úmask_lenÚframe_header_lenr‰   Úframe_payload_lenÚ
frame_maskÚrestrƒ   rx   rù   Úfrs                     r9   r©  zWebSocketProtocol.processDatam  sÁ  € õ
 ˜4œ9‘~”~ˆð ÔÑ%ð ˜qÒ Ñ ð ”I˜a”L�Ø ™X¨!šO�	Ø ™X¨!™O�	Ø  4™x�ð ”I˜a”L�Ø ! D¡¨Qš�Ø%&¨¡XÐ"ð
  ’>�>ØÔ/Ð;À	ÈQÂÀØà×3Ò3Ð4Z×4aÒ4aÐbkÑ4lÔ4lÑmÔmð )Ø#( 5ð ”<Ô(ð %¨TÔ-Kð %ÐT`ð %Ø×/Ò/Ð0QÑRÔRð %Ø$˜uð ”|Ô,ð %°TÔ5Rð %ÐWcð %Ø×/Ò/Ð0OÑPÔPð %Ø$˜uð   !Ò#Ð#ð %ð )Ø×3Ò3Ð4NÑOÔOð )Ø#( 5ð *¨CÒ/Ð/Ø×3Ò3Ð4dÑeÔeð )Ø#( 5ð $¨:Ð5Ð5Ø×3Ò3Ð4\×4cÒ4cÐdpÑ4qÔ4qÑrÔrð )Ø#( 5ð
 $ qÒ(Ð(Ð-?À1Ò-DÐ-DØ×3Ò3Ð4eÑfÔfð )Ø#( 5ð Ô/Ð;À	ÈQÂÀØ×3Ò3Ð4\×4cÒ4cÐdhÔd|ô  eLñ  5Mô  5Mñ  Nô  Nð )Ø#( 5øð $¨9Ð4Ð4Ø×3Ò3Ð4Y×4`Ò4`ÐamÑ4nÔ4nÑoÔoð )Ø#( 5ð  Ô.ð )°<À1Ò3DÐ3DØ×3Ò3Ð4qÑrÔrð )Ø#( 5ð Ô*ð )¨|¸qÒ/@Ð/@Ø×3Ò3Ð4zÑ{Ô{ð )Ø#( 5ð Ô/Ð;À	ÈQÂÀÐSWÔSfÀØ×3Ò3Ð4q×4xÒ4xÐy}ô  zRô  zañ  5bô  5bñ  cô  cð )Ø#( 5ð  ð !Ø �H�Hà �Hà%¨Ò+Ð+Ø'(¨8¡|Ð$Ð$Ø'¨3Ò.Ð.Ø',¨xÑ'7Ð$Ð$Ø'¨3Ò.Ð.Ø',¨xÑ'7Ð$Ð$å# MÑ2Ô2Ð2ð
  Ð#3Ò3Ñ3ð �Að *¨SÒ0Ð0Ý,2¬M¸$ÀÄ	È!ÈAÐPQÉEÈ'Ô@RÑ,SÔ,SÐTUÔ,VÐ)Ø,¨sÒ2Ð2Ø#×7Ò7Ð8wÑxÔxð -Ø', uØ˜Q™˜˜Ø+¨sÒ2Ð2Ý,2¬M¸$ÀÄ	È!ÈAÐPQÉEÈ'Ô@RÑ,SÔ,SÐTUÔ,VÐ)Ø,Ð/AÒAÐAØ#×7Ò7Ð8[Ñ\Ô\ð -Ø', uØ,¨uÒ4Ð4Ø#×7Ò7Ð8wÑxÔxð -Ø', uØ˜Q™˜˜à,>Ð)ð "&�JØ#ð Ø%)¤Y¨q°°Q±¨wÔ%7˜
Ø˜Q™˜à#ð DÐ(9¸AÒ(=Ð(=À$Ä.Ð(=Ý4EÀjÐRcÑ4dÔ4d˜Ô1Ð1å4A±O´O˜Ô1ð !%¤	¨!¨"¨"¤�D”Iõ *5°\Ø5>Ø5>Ø5FØ5?ñ	*Aô *A�DÔ&ð ×%Ò%Ñ'Ô'Ð'ð -°Ò1ÐGµS¸¼±^´^ÀaÒ5GÐGð !˜5à�uð Ô%Ô,¨tÔ/H×/PÒ/PÑ/RÔ/RÑRˆDØ˜tÒ#Ð#Ø”y  $ Ô'�Ø�Ø œI d e eÔ,�”	�	à”y�Ø%�Ø�”	à˜Šzˆzð Ô3×;Ò;¸DÑAÔA��ð �ð ×!Ò! 'Ñ*Ô*ˆBà�Uˆ{ˆ{Ø�uð Ô(×0Ò0Ñ2Ô2°dÔ6HÔ6OÒOÐOØ—_’_Ñ&Ô&�à˜�;�;Ø ˜5õ �t”y‘>”> AÒ%Ð%rL   c                 óL  — | j         j        dk    r	g | _        dS | j        säd| _        | j        �1| j         j        dk    r!d| _        | j                             ¦   «          nd| _        | j         j        t          j	        k    r/| j
        r(| j                             ¦   «          d| _        d| _        nd| _        | j        r| j                             d¦  «         |                      | j         j        t          j        k    ¦  «         |                      | j         j        ¦  «         dS )z-
        Begin of receive new frame.
        rÊ  TNr³   F)TTr   r   rì   )rÒ  ru   Úcontrol_frame_datarÔ  rv  rw   Ú_isMessageCompressedÚstart_decompress_messager"   ÚMESSAGE_TYPE_TEXTr¸   r}  rQ   Ú"utf8validateIncomingCurrentMessageÚutf8validateLastr
  r•   Ú_onMessageBeginÚMESSAGE_TYPE_BINARYÚ_onMessageFrameBeginrx   rR   s    r9   rØ  zWebSocketProtocol.onFrameBegin\  s8  € ð ÔÔ$ qÒ(Ð(Ø&(ˆDÔ#Ð#Ð#ð Ô&ð ià&*�Ô#ð Ô+Ð7¸DÔ<NÔ<RÐVWÒ<WÐ<WØ04�DÔ-ØÔ,×EÒEÑGÔGÐGÐGà05�DÔ-ð Ô%Ô,Õ0AÔ0SÒSÐSÐX\ÔXqÐSØÔ&×,Ò,Ñ.Ô.Ð.Ø>B�DÔ;Ø,>�DÔ)Ð)à>C�DÔ;ð Ô&ð @ØÔ'×-Ò-Ð.>Ñ?Ô?Ð?ð ×$Ò$ TÔ%7Ô%>ÕBSÔBgÒ%gÑhÔhÐhà×%Ò% dÔ&8Ô&?Ñ@Ô@Ð@Ð@Ð@rL   c                 óÐ  — | j         j        dk    r| j                             |¦  «         dS | j        rct          |¦  «        }| j                             d|t          |¦  «        ¬¦  «         | j	         
                    |¦  «        }t          |¦  «        }nt          |¦  «        }|}|}| j        t          j        k    r*| j        xj        |z  c_        | j        xj        |z  c_        | j        ra| j                             |¦  «        | _        | j        d         s5|                      d                     | j        d         ¦  «        ¦  «        rdS |                      |¦  «         dS )	z1
        New data received within frame.
        rÊ  zRX compressed [length]: octets)Úlegnthr’  r   zQencountered invalid UTF-8 while processing text message at payload octet index {}r<   FN)rÒ  ru   rë  r÷   rì  r?   rä   rå   r   rv  Údecompress_message_datar  r"   r  rw  r]   r^   rï  r}  r-  rð  r.  r5   Ú_onMessageFrameData)rS   rù   ÚcompressedLenÚuncompressedLenÚls        r9   rÛ  zWebSocketProtocol.onFrameData…  sš  € ð ÔÔ$ qÒ(Ð(ØÔ#×*Ò*¨7Ñ3Ô3Ð3Ð3Ð3ð Ô(ð $Ý # G¡¤�Ø”—’Ø4Ø(Ý,¨WÑ5Ô5ð ñ ô ð ð Ô2×JÒJÈ7ÑSÔS�Ý"% g¡,¤,��å˜‘L”L�Ø !�Ø"#�àŒzÕ.Ô9Ò9Ð9ØÔ!Ð>Ô>À-ÑOÐ>Ô>ØÔ!Ð8Ô8¸OÑKÐ8Ô8ð Ô6ð %Ø(,Ô(:×(CÒ(CÀGÑ(LÔ(L�Ô%ØÔ,¨QÔ/ð %Ø×,Ò,ð  .A÷  .Hò  .Hð  IMô  I^ð  _`ô  Iañ  .bô  .bñ  cô  cð %Ø$˜uà×$Ò$ WÑ-Ô-Ð-Ð-Ð-rL   c                 ó0  — | j         j        dk    r=| j        r |                      | j         | j        ¦  «         |                      ¦   «          �nA| j        t          j        k    r| j	        xj
        dz  c_
        | j        r |                      | j         | j        ¦  «         |                      ¦   «          | j        r| j        r|                      ¦   «          | j         j        r®| j        r| j                             ¦   «          | j        rB| j        d         s5|                      d                     | j        d         ¦  «        ¦  «        rdS | j        t          j        k    r| j	        xj        dz  c_        |                      ¦   «          d| _        d| _         dS )z(
        End of frame received.
        rÊ  r}   zTUTF-8 text message payload ended within Unicode code point at payload octet index {}r<   FN)rÒ  ru   r¶   rŸ  rë  ÚprocessControlFramer  r"   r  rw  r_   rï   Ú_onMessageFrameEndrW  rÅ   Ú_cancelAutoPingTimeoutCallrv   rì  rv  Úend_decompress_messagerï  rð  r.  r5   r`   Ú_onMessageEndrÔ  rR   s    r9   rÜ  zWebSocketProtocol.onFrameEnd¬  sÍ  € ð ÔÔ$ qÒ(Ð(ØŒ~ð MØ—’ Ô 2°DÔ4KÑLÔLÐLØ×$Ò$Ñ&Ô&Ð&Ñ&àŒzÕ.Ô9Ò9Ð9ØÔ!Ð9Ô9¸QÑ>Ð9Ô9ØŒ~ð EØ—’ Ô 2°D´OÑDÔDÐDà×#Ò#Ñ%Ô%Ð%àÔ'ð 2¨DÔ,Lð 2ð ×/Ò/Ñ1Ô1Ð1àÔ!Ô%ð ,ð Ô,ð FØÔ,×CÒCÑEÔEÐEð Ô:ð )ØÔ0°Ô3ð )Ø×0Ò0ð  2H÷  2Oò  2Oð  PTô  Peð  fgô  Phñ  2iô  2iñ  jô  jð )Ø#( 5à”:Õ!2Ô!=Ò=Ð=ØÔ%Ð?Ô?À1ÑDÐ?Ô?à×"Ò"Ñ$Ô$Ð$Ø&+�Ô#à!ˆÔÐÐrL   c                 óX  — d                      | j        ¦  «        }d| _        | j        j        dk    rfd}d}t	          |¦  «        }|dk    r3t          j        d|dd…         ¦  «        d         }|dk    r
|dd…         }|                      ||¦  «        rdS �n’| j        j        d	k    r|                      |¦  «         �nk| j        j        d
k    �rY| j	        �r;	 || j	        k    rót          j        d|dd…         ¦  «        d         }t          j        d|dd…         ¦  «        d         }t          j        ¦   «         }t          ||z
  dz  ¦  «        }|                      |||||¦  «         | j        r| j                             ¦   «          d| _	        d| _        d| _        | j        r/| j        j                             | j        | j        ¦  «        | _        n| j                             d¦  «         n!#  | j                             d¦  «         Y nxY w|                      |¦  «         n	 dS )z>
        Process a completely received control frame.
        rL   Nr™   r}   rÏ  r   r²   FrÌ  r˜   ú>Qú>Lr«   i@B z)Auto ping/pong: received non-pending pongT)r	  rë  rÒ  ru   r?   rÕ  rÖ  r>  Ú_onPingr‚  ÚtimeÚtime_nsÚintrU  rW  r1  r…  rÂ   r2  r†  r5  Ú_sendAutoPingrƒ  rä   r\  Ú_onPong)	rS   rù   r  r;  ÚllrQ  rR  rS  rT  s	            r9   rü  z%WebSocketProtocol.processControlFrameØ  sJ  € ð —(’(˜4Ô2Ñ3Ô3ˆØ"&ˆÔð ÔÔ$¨Ò)Ð)àˆDØˆIÝ�W‘”ˆBØ�AŠvˆvÝ”} T¨7°1°Q°3¬<Ñ8Ô8¸Ô;�Ø˜’6�6Ø '¨¨¨¤�Ià× Ò   yÑ1Ô1ð Ø�uñð
 ÔÔ&¨!Ò+Ð+Ø�LŠL˜Ñ!Ô!Ð!Ñ!ð ÔÔ&¨"Ò,Ñ,ð Ô#ñ OðOØ $Ô"6Ò6Ð6å$*¤M°$¸ÀÀÀ¼Ñ$DÔ$DÀQÔ$G˜	õ $*¤=°°w¸qÀ¸t´}Ñ#EÔ#EÀaÔ#H˜å(,¬©¬˜Ý#&¨¸	Ñ(AÀUÑ'JÑ#KÔ#K˜àŸš¨	°8¸]ÈHÐV]Ñ^Ô^Ð^àÔ3ð >Ø Ô4×;Ò;Ñ=Ô=Ð=à/3˜Ô,Ø37˜Ô0Ø37˜Ô0àÔ0ð Ø7;´|Ô7R×7]Ò7]Ø $Ô 5Ø $Ô 2ñ8ô 8˜DÔ4øð
 œŸšÐ&QÑRÔRÐRøøðOØ”H—M’MÐ"MÑNÔNÐNÐNÐNøøøð �LŠL˜Ñ!Ô!Ð!Ð!ð
 àˆts   ÃDG2 Ç2HrL   Tc	           	      óÚ  ‡— |�Ÿt          ‰¦  «        dk     r0t          d                     |t          ‰¦  «        ¦  «        ¦  «        ‚|}	d                     ˆfd„t	          |t          ‰¦  «        z  ¦  «        D ¦   «         ¦  «        ‰d|t          ‰¦  «        z  …         z   }
nt          ‰¦  «        }	‰}
d}|r|dz  }||dz  d	z  z  }||dz  z  }d}|s&| j        j        s| j        s| j        j        rp| j        ri|dz  }|s*t          j
        d
t          j        d¦  «        ¦  «        }|}nd}|	dk    r-| j        r&t          ||	¦  «        }|                     |
¦  «        }n|
}nd}|
}d}|	dk    r||	z  }nQ|	dk    r|dz  }t          j
        d|	¦  «        }n0|	dk    r|dz  }t          j
        d|	¦  «        }nt          d¦  «        ‚d                     |                     dd¦  «        |                     dd¦  «        |||g¦  «        }|dv r| j        xj        dz  c_        | j        r,t)          ||||	|¦  «        }|                      |‰|||¦  «         |                      |||¦  «         dS )aO  
        Send out frame. Normally only used internally via sendMessage(),
        sendPing(), sendPong() and sendClose().

        This method deliberately allows to send invalid frames (that is frames
        invalid per-se, or frames invalid because of protocol state). Other
        than in fuzzing servers, calling methods will ensure that no invalid
        frames are sent.

        In addition, this method supports explicit specification of payload
        length. When payload_len is given, it will always write that many
        octets to the stream. It'll wrap within payload, resending parts of
        that when more octets were requested The use case is again for fuzzing
        server which want to sent increasing amounts of payload data to peers
        without having to construct potentially large messages themselves.
        Nr}   zJcannot construct repeated payload with length {} from payload of length {}rL   c                 ó   •— g | ]}‰‘ŒS rq   rq   )Ú.0Ú_rù   s     €r9   ú
<listcomp>z/WebSocketProtocol.sendFrame.<locals>.<listcomp>@  s   ø€ ÐOÐOÐO q˜7ÐOÐOÐOrL   r   rÇ  r™   r³   ú!Ié    rË  éÿÿ  rÎ  rÏ  rÑ  rÉ  rÐ  úinvalid payload lengthÚbigrÍ  )r?   r:  r5   r	  Úranger2  r3  rÔ   rÉ   rÕ  ÚpackÚrandomÚgetrandbitsr¹   r   rÚ  Úto_bytesrw  rZ   r¶   rs   r¤  r»  )rS   ru   rù   rv   rw   ry   r  r¢  r—  rú  ÚplÚb0Úb1ÚmvÚmaskerÚplmÚelr„   rž  s     `                r9   Ú	sendFramezWebSocketProtocol.sendFrame#  sò  ø€ ð2 Ð"Ý�7‰|Œ|˜aÒÐÝÐ l× sÒ sÐtõ  BEð  FMñ  BNô  BNñ  !Oô  !Oñ  Pô  Pð  PØˆAØ—’ÐOÐOÐOÐO­E°+ÅÀWÁÄÑ2MÑ,NÔ,NÐOÑOÔOÑPÔPÐSZÐ[vÐ\gÕjmÐnuÑjvÔjvÑ\vÐ[vÔSwÑwˆBˆBå�G‘”ˆAØˆBð ˆØð 	Ø�6‰NˆBØ
ˆs�Q‰w˜1‰nÑˆØ
ˆf�s‰lÑˆð ˆØð 	˜œÔ-ð 	°$Ô2Gð 	ÈTÌ\ÔMbð 	ÐgkÔg|ð 	Ø�&‰LˆBØð 
õ ”{ 4­Ô);¸BÑ)?Ô)?Ñ@Ô@�Ø��à�ð �1Šuˆu˜œˆuÝ*¨4°Ñ3Ô3�Ø—n’n RÑ(Ô(��à��ð ˆBØˆCàˆØ�Š8ˆ8Ø�!‰GˆBˆBØ�&Š[ˆ[Ø�#‰IˆBÝ”˜T 1Ñ%Ô%ˆBˆBØÐ$Ò$Ð$Ø�#‰IˆBÝ”˜T 1Ñ%Ô%ˆBˆBåÐ4Ñ5Ô5Ð5à�hŠh˜Ÿš A uÑ-Ô-¨r¯{ª{¸1¸eÑ/DÔ/DÀbÈ"ÈcÐRÑSÔSˆØ�YÐÐØÔÐ5Ô5¸Ñ:Ð5Ô5àŒ>ð 	OÝ% f¨c°3¸¸4Ñ@Ô@ˆKØ�OŠO˜K¨°+¸xÈÑNÔNÐNð 	�Š�c˜4 Ñ*Ô*Ð*Ð*Ð*rL   c                 ó  — | j         t          j        k    rdS |rPt          |¦  «        }|dk    r"t	          d                     |¦  «        ¦  «        ‚|                      d|¬¦  «         dS |                      d¬¦  «         dS )z]
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendPing`
        NrË  z@invalid payload for PING (payload length must be <= 125, was {})rÌ  ©ru   rù   ©ru   ©r  r"   r  r?   r:  r5   r!  ©rS   rù   rú  s      r9   ÚsendPingzWebSocketProtocol.sendPing‚  sŠ   € ð Œ:Õ*Ô5Ò5Ð5ØˆFØð 	%Ý�G‘”ˆAØ�3ŠwˆwÝÐ b× iÒ iÐjkÑ lÔ lÑmÔmÐmØ�NŠN !¨WˆNÑ5Ô5Ð5Ð5Ð5à�NŠN !ˆNÑ$Ô$Ð$Ð$Ð$rL   c                 ór  — | j                              d¦  «         d | _        t          j        ¦   «         | _        | xj        dz  c_        d                     t          j	        d| j        ¦  «        t          j	        d| j        ¦  «        t          j        | j        dz
  ¦  «        g¦  «        | _        |                      | j        ¦  «         | j        re| j                              d| j        t!          | j        ¦  «        ¬¦  «         | j        j                             | j        | j        ¦  «        | _        d S d S )	Nz+Auto ping/pong: sending ping auto-ping/pongr}   rL   r  r  r«   z@Expecting pong in {seconds} seconds for auto-ping ({size} bytes))ÚsecondsrL  )rä   rå   rƒ  r  r  r…  r„  r	  rÕ  r  ÚosÚurandomrÄ   r‚  r'  rÃ   r?   r2  r†  r5  rX  rW  rR   s    r9   r  zWebSocketProtocol._sendAutoPing�  s(  € àŒ�ŠÐDÑEÔEÐEà#'ˆÔ å#'¤<¡>¤>ˆÔ ØÐÔ 1Ñ$ÐÔØ"Ÿxšx­¬°T¸4Ô;SÑ)TÔ)TÝ)/¬°T¸4Ô;RÑ)SÔ)SÝ)+¬°DÔ4EÈÑ4JÑ)KÔ)Kð)Mñ  Nô  NˆÔð 	�Š�dÔ*Ñ+Ô+Ð+àÔð 		ØŒH�NŠNØRØÔ,Ý˜Ô-Ñ.Ô.ð ñ ô ð ð
 (,¤|Ô'B×'MÒ'MØÔ$ØÔ&ñ(ô (ˆDÔ$Ð$Ð$ð		ð 		rL   c                 óz  — | j                              d¦  «         | j                             ¦   «          d| _        d| _        | j        r | j                             ¦   «          d| _        | j        rK| j                              d¦  «         | j        j         	                    | j        | j
        ¦  «        | _        dS dS )zÙ
        When data is received from client, use it in leu of timely PONG response - cancel pending timeout call
        that will drop connection. See https://github.com/crossbario/autobahn-python/issues/1327
        z3Cancelling autoPingTimeoutCall due to incoming dataNzScheduling auto-ping/pong)rä   rå   rW  r1  r‚  rƒ  rÂ   r2  r†  r5  r  rR   s    r9   rþ  z,WebSocketProtocol._cancelAutoPingTimeoutCall©  sÁ   € ð
 	Œ�ŠÐLÑMÔMÐMØÔ ×'Ò'Ñ)Ô)Ð)Ø#'ˆÔ à#ˆÔàÔ#ð 	,ØÔ$×+Ò+Ñ-Ô-Ð-Ø'+ˆDÔ$ð Ô ð 	ØŒH�NŠNÐ6Ñ7Ô7Ð7Ø'+¤|Ô'B×'MÒ'MØÔ%ØÔ"ñ(ô (ˆDÔ$Ð$Ð$ð	ð 	rL   c                 ó  — | j         t          j        k    rdS |rPt          |¦  «        }|dk    r"t	          d                     |¦  «        ¦  «        ‚|                      d|¬¦  «         dS |                      d¬¦  «         dS )z]
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendPong`
        NrË  z@invalid payload for PONG (payload length must be <= 125, was {})r˜   r#  r$  r%  r&  s      r9   r  zWebSocketProtocol.sendPongÀ  sŠ   € ð Œ:Õ*Ô5Ò5Ð5ØˆFØð 	&Ý�G‘”ˆAØ�3ŠwˆwÝÐ b× iÒ iÐjkÑ lÔ lÑmÔmÐmØ�NŠN "¨gˆNÑ6Ô6Ð6Ð6Ð6à�NŠN "ˆNÑ%Ô%Ð%Ð%Ð%rL   c                 óº  — | j         t          j        k    r| j                             d¦  «         dS | j         t          j        k    r| j                             d¦  «         dS | j         t          j        t          j        fv rt          d¦  «        ‚| j         t          j	        k    r¨d}|�|t          j        d|¦  «        z  }|�||z  }|                      d|¬¦  «         t          j        | _         | | _        || _        || _        | j        r<| j        d	k    r3| j        j                             | j        | j        ¦  «        | _        dS dS dS t          d
¦  «        ‚)zº
        Send a close frame and update protocol state. Note, that this is
        an internal method which deliberately allows not send close
        frame with invalid payload.
        z3ignoring sendCloseFrame since connection is closingz7ignoring sendCloseFrame since connection already closedz+cannot close a connection not yet connectedrL   NrÏ  r™   r#  r   r'  )r  r"   r/  rä   rå   r9  rE  rD  r:  r  rÕ  r  r!  r~  r€  r�  rÀ   r2  r†  r5  rJ  r0  )rS   r  r&  r#  rù   s        r9   r8  z WebSocketProtocol.sendCloseFrameÎ  sn  € ð Œ:Õ*Ô8Ò8Ð8ØŒH�NŠNÐPÑQÔQÐQÐQÐQàŒZÕ,Ô9Ò9Ð9ØŒH�NŠNÐTÑUÔUÐUÐUÐUàŒZÕ-ÔDÕFWÔFhÐiÐiÐiÝÐIÑJÔJÐJàŒZÕ,Ô7Ò7Ð7ð ˆGØÐØ�6œ; t¨TÑ2Ô2Ñ2�ØÐ%Ø˜:Ñ%�Ø�NŠN !¨WˆNÑ5Ô5Ð5õ +Ô8ˆDŒJØ")˜kˆDŒOð #'ˆDÔØ$.ˆDÔ!ð Œð  4Ô#=ÀÒ#AÐ#AØ15´Ô1L×1WÒ1WØÔ.ØÔ0ñ2ô 2�Ô.Ð.Ð.ðð Ð#AÐ#Aõ ˜MÑ*Ô*Ð*rL   c                 ó  — |�~t          |¦  «        t          k    r/t          d                     t          |¦  «        ¦  «        ¦  «        ‚|dk    r1d|cxk    rdk    s$n t          d                     |¦  «        ¦  «        ‚|�i|€t          d¦  «        ‚t          |¦  «        t          k    r/t          d                     t          |¦  «        ¦  «        ¦  «        ‚t          |d	¦  «        }nd}|                      ||d
¬¦  «         dS )z^
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendClose`
        Nz5invalid type '{}' for close code (must be an integer)r´   i¸  i‡  z9invalid close code {} (must be 1000 or from [3000, 4999])zclose reason without close codez)reason must be of type unicode (was '{}')r$  Fr%  )Útyper  r:  r5   Ústrr   r8  )rS   r  r  r&  s       r9   Ú	sendClosezWebSocketProtocol.sendCloseù  s  € ð ÐÝ�D‰zŒz�SÒ Ð ÝÐ W× ^Ò ^Õ_cÐdhÑ_iÔ_iÑ jÔ jÑkÔkÐkð �tŠ|ˆ| T¨TÐ%9Ð%9Ò%9Ð%9°TÒ%9Ð%9Ð%9Ð%9ÝÐ [× bÒ bÐcgÑ hÔ hÑiÔiÐiàÐØˆ|ÝÐ AÑBÔBÐBå�F‰|Œ|�sÒ"Ð"ÝÐ K× RÒ RÕSWÐX^ÑS_ÔS_Ñ `Ô `ÑaÔaÐaå(¨°Ñ5Ô5ˆJˆJàˆJà×Ò °*ÀeÐÑLÔLÐLÐLÐLrL   c                 óh  — | j         t          j        k    rdS | j        t          j        k    rt          d¦  «        ‚|rt          j        nt          j        | _        t          j	        | _        | j
        �#|s!d| _        | j
                             ¦   «          nd| _        | j        xj        dz  c_        dS )za
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.beginMessage`
        Nz?WebSocketProtocol.beginMessage invalid in current sending stateTFr}   )r  r"   r  rz  ry  r:  rò  rî  Úsend_message_opcodeÚSEND_STATE_MESSAGE_BEGINrv  Úsend_compressedÚstart_compress_messagerw  r[   )rS   rë   rÀ  s      r9   ÚbeginMessagezWebSocketProtocol.beginMessage  sµ   € ð Œ:Õ*Ô5Ò5Ð5ØˆFð Œ?Õ/ÔAÒAÐAÝÐ]Ñ^Ô^Ð^àLTÐ#}Õ#4Ô#HÐ#HÕZkÔZ}ˆÔ Ý+ÔDˆŒð Ô#Ð/¸Ð/Ø#'ˆDÔ ØÔ$×;Ò;Ñ=Ô=Ð=Ð=à#(ˆDÔ àÔÐ3Ô3°qÑ8Ð3Ô3Ð3Ð3rL   c                 óØ  — | j         t          j        k    rdS | j        t          j        t          j        fvr't          d                     | j        ¦  «        ¦  «        ‚t          |¦  «        t          k    s|dk     s|dk    rt          d¦  «        ‚|| _
        | j        xj        dz  c_        | j        j        s| j        s| j        j        r4| j        r-t#          j        dt'          j        d¦  «        ¦  «        | _        nd| _        | j        r(|dk    r"| j        rt/          | j        |¦  «        | _        nt3          ¦   «         | _        d}| j        t          j        k    r+|| j        d	z  z  }| j        r|d
z  }t          j        | _        n	 d}| j        r|d	z  }| j        }nd}d}|dk    r||z  }nQ|dk    r|dz  }t#          j        d|¦  «        }n0|dk    r|dz  }t#          j        d|¦  «        }nt          d¦  «        ‚d                     |                     dd¦  «        |                     dd¦  «        ||g¦  «        }|                      |¦  «         t          j        | _        dS )zf
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.beginMessageFrame`
        NzIWebSocketProtocol.beginMessageFrame invalid in current sending state [{}]r   rÑ  z&invalid value for message frame lengthr}   r  r  rÇ  é@   rL   rË  r  rÎ  rÏ  rÉ  rÐ  r  r  ) r  r"   r  rz  r5  ÚSEND_STATE_INSIDE_MESSAGEr:  r5   r0  r  Úsend_message_frame_lengthrw  rZ   r2  r3  rÔ   rÉ   rÕ  r  r  r  Úsend_message_frame_maskr¹   r   Úsend_message_frame_maskerr   r4  r6  r	  r  r»  ÚSEND_STATE_INSIDE_MESSAGE_FRAME)rS   rx   r  r  r  r   Úheaders          r9   ÚbeginMessageFramez#WebSocketProtocol.beginMessageFrame/  s˜  € ð Œ:Õ*Ô5Ò5Ð5ØˆFð Œ?Õ#4Ô#MÕO`ÔOzÐ"{Ð{Ð{ÝÐg×nÒnÐosÔo~ÑÔñ  Aô  Að  Aå�‰<Œ<�3ÒÐ &¨1¢* *°Ð9KÒ0KÐ0KÝÐDÑEÔEÐEà)/ˆÔ&àÔÐ1Ô1°QÑ6Ð1Ô1à”Ô%ð 	0¨$Ô*?ð 	0ÀTÄ\ÔEZð 	0Ð_cÔ_tð 	0õ ,2¬;°t½VÔ=OÐPRÑ=SÔ=SÑ+TÔ+TˆDÔ(Ð(ð
 ,0ˆDÔ(ð Ô'ð 	=¨F°QªJ¨J¸4¼>¨JÝ->¸tÔ?[Ð]cÑ-dÔ-dˆDÔ*Ð*å-:©_¬_ˆDÔ*ð
 ˆØŒ?Õ/ÔHÒHÐHà�$Ô*¨SÑ0Ñ0ˆBàÔ#ð #Ø�lÑ"�å/ÔIˆDŒOˆOàð ˆØÔ'ð 	Ø�&‰LˆBØÔ-ˆBˆBàˆBàˆØ�SŠ=ˆ=Ø�&‰LˆBˆBØ�vÒÐØ�#‰IˆBÝ”˜T 6Ñ*Ô*ˆBˆBØÐ)Ò)Ð)Ø�#‰IˆBÝ”˜T 6Ñ*Ô*ˆBˆBåÐ4Ñ5Ô5Ð5ð —’˜2Ÿ;š; q¨%Ñ0Ô0°"·+²+¸aÀÑ2GÔ2GÈÈRÐPÑQÔQˆà�Š�fÑÔÐõ ,ÔKˆŒˆˆrL   c                 óö  — | j         t          j        k    rdS | j        s"| j        xj        t          |¦  «        z  c_        | j        xj        t          |¦  «        z  c_        | j        t          j	        k    rt          d¦  «        ‚t          |¦  «        }| j                             ¦   «         |z   | j        k    r2| j        | j                             ¦   «         z
  }||z
   }|d|…         }n(|}| j        | j                             ¦   «         z
  |z
  }|}| j                             |¦  «        }|                      ||¬¦  «         | j                             ¦   «         | j        k    rt          j        | _        |S )zi
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendMessageFrameData`
        NzGWebSocketProtocol.sendMessageFrameData invalid in current sending state)r—  )r  r"   r  r6  rw  rY   r?   rX   rz  r?  r:  r>  rÙ  r<  rÚ  r»  r;  )rS   rù   r—  Úrlrú  rè  r  r  s           r9   ÚsendMessageFrameDataz&WebSocketProtocol.sendMessageFrameData„  so  € ð Œ:Õ*Ô5Ò5Ð5ØˆFàÔ#ð 	EØÔÐ4Ô4½¸G¹¼ÑDÐ4Ô4ØÔÐ6Ô6½#¸g¹,¼,ÑFÐ6Ô6àŒ?Õ/ÔOÒOÐOÝÐeÑfÔfÐfå�‰\Œ\ˆØÔ)×1Ò1Ñ3Ô3°bÑ8¸4Ô;YÒYÐYØÔ.°Ô1O×1WÒ1WÑ1YÔ1YÑYˆAØ˜!‘V�9ˆDØ˜˜!˜”ˆBˆBàˆAØÔ1°DÔ4R×4ZÒ4ZÑ4\Ô4\Ñ\Ð_`Ñ`ˆDØˆBð Ô,×4Ò4°RÑ8Ô8ˆð 	�Š�c ˆÑ%Ô%Ð%ð Ô)×1Ò1Ñ3Ô3°tÔ7UÒUÐUÝ/ÔIˆDŒOð ˆrL   c                 ó  — | j         t          j        k    rdS | j        r<| j                             ¦   «         }| j        xj        t          |¦  «        z  c_        nd}|  	                    d|d¬¦  «         t          j
        | _        dS )z_
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.endMessage`
        NrL   r   T)ru   rù   rv   )r  r"   r  r6  rv  Úend_compress_messagerw  rX   r?   r!  ry  rz  rø   s     r9   Ú
endMessagezWebSocketProtocol.endMessage¯  sˆ   € ð Œ:Õ*Ô5Ò5Ð5ØˆFð Ôð 	ØÔ.×CÒCÑEÔEˆGØÔÐ:Ô:½cÀ'¹l¼lÑJÐ:Ô:Ð:ð ˆGØ�Š˜a¨°dˆÑ;Ô;Ð;å+Ô=ˆŒˆˆrL   c                 ó*  — | j         t          j        k    rdS | j        r<| j        xj        t          |¦  «        z  c_        | j                             |¦  «        }|  	                    t          |¦  «        ¦  «         |  
                    ||¦  «         dS )ze
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendMessageFrame`
        N)r  r"   r  r6  rw  rY   r?   rv  Úcompress_message_datarA  rD  )rS   rù   r—  s      r9   ÚsendMessageFramez"WebSocketProtocol.sendMessageFrameÅ  s�   € ð Œ:Õ*Ô5Ò5Ð5ØˆFàÔð 	NØÔÐ4Ô4½¸G¹¼ÑDÐ4Ô4ØÔ.×DÒDÀWÑMÔMˆGà×Ò�s 7™|œ|Ñ,Ô,Ð,Ø×!Ò! '¨4Ñ0Ô0Ð0Ð0Ð0rL   c                 óâ  — t          |¦  «        t          k    s*J d                     t          |¦  «        ¦  «        ¦   «         ‚t          |¦  «        t          k    s*J d                     t          |¦  «        ¦  «        ¦   «         ‚|�Bt          |¦  «        t          k    s*J d                     t          |¦  «        ¦  «        ¦   «         ‚t          |¦  «        t          k    s*J d                     t          |¦  «        ¦  «        ¦   «         ‚t          |¦  «        t          k    s*J d                     t          |¦  «        ¦  «        ¦   «         ‚| j        t          j        k    rt          d¦  «        ‚| j	        r| j	         
                    d¦  «         |rd	}nd
}| j        xj        d
z  c_        | j        �®|s¬d}| j                             ¦   «          | j        xj        t!          |¦  «        z  c_        | j                             |¦  «        }| j                             ¦   «         }	d                     ||	g¦  «        }t!          |¦  «        }
| j        xj        |
z  c_        n;d}t!          |¦  «        }
| j        xj        |
z  c_        | j        xj        |
z  c_        d| j        cxk     r|
k     rNn nKd| _        d                     |
| j        ¦  «        }| j                             |¦  «         t3          |¦  «        ‚|�|}n| j        dk    r| j        }nd}|�t!          |¦  «        |k    r|                      ||||rdnd¬¦  «         dS |d
k     r"t9          d                     |¦  «        ¦  «        ‚t!          |¦  «        }d}d}d}|sd||z   }||k    rd}|}|r)|                      ||||…         |||rdnd¬¦  «         d}n!|                      d|||…         ||¬¦  «         ||z  }|¯bdS dS )z`
        Implements :func:`autobahn.websocket.interfaces.IWebSocketChannel.sendMessage`
        z,"payload" must have type bytes, but was "{}"z,"isBinary" must have type bool, but was "{}"Nz/"fragmentSize" must have type int, but was "{}"z("sync" must have type bool, but was "{}"z1"doNotCompress" must have type bool, but was "{}"z$Attempt to send on a closed protocolrÂ  r²   r}   TrL   Fr   zQtried to send WebSocket message with size {} exceeding payload limit of {} octetsr³   )ru   rù   r—  rw   z1payload fragment size must be at least 1 (was {}))ru   rù   rv   r—  rw   )ru   rù   rv   r—  )r0  Úbytesr5   Úboolr  r  r"   r  r    r
  r•   rw  r[   rv  r7  rY   r?   rI  rF  r	  rX   r»   rñ   rä   r\  r   r¼   r!  r:  )rS   rù   rë   ÚfragmentSizer—  rÀ  ru   ÚsendCompressedÚpayload1Úpayload2r  ÚemsgÚpfsr¼  r‰   r½  Úfirstr¾  s                     r9   rÂ  zWebSocketProtocol.sendMessageÓ  sg  € õ �G‰}Œ}¥Ò%Ð%Ð%Ð'U×'\Ò'\Õ]aÐbiÑ]jÔ]jÑ'kÔ'kÑ%Ô%Ð%Ý�H‰~Œ~¥Ò%Ð%Ð%Ð'U×'\Ò'\Õ]aÐbjÑ]kÔ]kÑ'lÔ'lÑ%Ô%Ð%ØÐ#¥t¨LÑ'9Ô'9½SÒ'@Ð'@Ð'@ÐBs×BzÒBzÕ{ð  AMñ  |Nô  |Nñ  COô  COÑ'@Ô'@Ð'@Ý�D‰zŒz�TÒ!Ð!Ð!Ð#M×#TÒ#TÕUYÐZ^ÑU_ÔU_Ñ#`Ô#`Ñ!Ô!Ð!Ý�MÑ"Ô"¥dÒ*Ð*Ð*Ð,_×,fÒ,fÕgkÐlyÑgzÔgzÑ,{Ô,{Ñ*Ô*Ð*àŒ:Õ*Ô5Ò5Ð5ÝÐEÑFÔFÐFàÔð 	5ØÔ×%Ò% mÑ4Ô4Ð4ð ð 	ØˆFˆFàˆFàÔÐ3Ô3°qÑ8Ð3Ô3ð Ô#Ð/¸Ð/Ø!ˆNàÔ$×;Ò;Ñ=Ô=Ð=àÔÐ4Ô4½¸G¹¼ÑDÐ4Ô4àÔ/×EÒEÀgÑNÔNˆHØÔ/×DÒDÑFÔFˆHØ—h’h ¨(Ð3Ñ4Ô4ˆGå˜g™,œ,ˆKàÔÐ:Ô:¸kÑIÐ:Ô:Ð:ð #ˆNÝ˜g™,œ,ˆKØÔÐ4Ô4¸ÑCÐ4Ô4ØÔÐ:Ô:¸kÑIÐ:Ô:àˆtÔ)Ð7Ð7Ò7Ð7¨KÒ7Ð7Ð7Ð7Ð7Ø48ˆDÔ1Øf×mÒmÐnyÐ{ô  |Vñ  Wô  WˆDØŒH�MŠM˜$ÑÔÐÝ& tÑ,Ô,Ð,ð Ð#ØˆCˆCàÔ$ qÒ(Ð(ØÔ+��à�ð ˆ;�#˜g™,œ,¨#Ò-Ð-Ø�NŠN &°'ÀÈ~ÐJdÈ!È!ÐcdˆNÑeÔeÐeÐeÐeð
 �QŠwˆwÝÐ S× ZÒ ZÐ[^Ñ _Ô _Ñ`Ô`Ð`Ý�G‘”ˆAØˆAØˆDØˆEØð 
Ø˜‘G�Ø�q’5�5Ø�DØ�AØð XØ—N’N¨&¸'À!ÀAÀ#¼,ÈDÐW[ÐftÐa{ÐabÐabÐz{�NÑ|Ô|Ð|Ø!�E�Eà—N’N¨!°W¸Q¸q¸S´\ÀtÐRV�NÑWÔWÐWØ�S‘�ð ð 
ð 
ð 
ð 
ð 
rL   c                 ó  — g }d„ |                      d¦  «        D ¦   «         }|D �]d}|dk    �rZd„ |                      d¦  «        D ¦   «         }t          |¦  «        dk    �r&|d                              ¦   «         }i }|dd…         D ]æ}	d	„ |	                      d
¦  «        D ¦   «         }	|	d                              ¦   «         }
t          |	¦  «        dk    rrd
                     |	dd…         ¦  «        }|rRt          |¦  «        dk    r|d         dk    r
|dd…         }t          |¦  «        dk    r|d         dk    r
|dd…         }nd}|
|vrg ||
<   ||
                              |¦  «         Œç|                     ||f¦  «         �Œc	 �Œf|S )z<
        Parse the Sec-WebSocket-Extensions header.
        c                 óP   — g | ]#}t          |                     ¦   «         ¦  «        ‘Œ$S rq   ©r1  r�   ©r  Úxs     r9   r  z<WebSocketProtocol._parseExtensionsHeader.<locals>.<listcomp>7	  s&   € Ð:Ð:Ð: 1•�A—G’G‘I”I‘”Ð:Ð:Ð:rL   ú,Ú c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rq   ©r�   rX  s     r9   r  z<WebSocketProtocol._parseExtensionsHeader.<locals>.<listcomp>:	  s    € Ð7Ð7Ð7 Q�q—w’w‘y”yÐ7Ð7Ð7rL   ú;r   r}   Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rq   r]  rX  s     r9   r  z<WebSocketProtocol._parseExtensionsHeader.<locals>.<listcomp>?	  s    € Ð=Ð=Ð=¨1˜QŸWšW™YœYÐ=Ð=Ð=rL   ú=ú"éÿÿÿÿT)Úsplitr?   r.   r	  r÷   )rS   r@  ÚremoveQuotesÚ
extensionsÚextsr·  ÚextÚ	extensionÚparamsÚprŠ   r‹   s               r9   Ú_parseExtensionsHeaderz(WebSocketProtocol._parseExtensionsHeader2	  s¢  € ð ˆ
Ø:Ð:¨¯ª°SÑ(9Ô(9Ð:Ñ:Ô:ˆØð 	ñ 	ˆAØ�BŠw‰wØ7Ð7¨!¯'ª'°#©,¬,Ð7Ñ7Ô7�Ý�s‘8”8˜a’<‘<Ø # A¤§¢¡¤�IØ�FØ    œWð 2ð 2˜Ø=Ð=°·²¸±´Ð=Ñ=Ô=˜Ø œdŸjšj™lœl˜Ý˜q™6œ6 Aš:˜:Ø$'§H¢H¨Q¨q¨r¨r¬U¡O¤O˜EØ+ð 7Ý#& u¡:¤:°¢> >°e¸A´hÀ#²o°oØ,1°!°"°"¬I EÝ#& u¡:¤:°¢> >°e¸B´iÀ3Ò6FÐ6FØ,1°#°2°#¬J Eøà$(˜EØ fÐ,Ð,Ø*,˜F 3™KØ˜sœ×*Ò*¨5Ñ1Ô1Ð1Ð1Ø×%Ò% y°&Ð&9Ñ:Ô:Ð:Ñ:àùØÐrL   )F)FN)rL   Tr   NNNFrP   )NNF)NN©FF)FNFFr¨   )hrn   ro   rp   r{   rZ  ÚSUPPORTED_SPEC_VERSIONSÚSUPPORTED_PROTOCOL_VERSIONSÚSPEC_TO_PROTOCOL_VERSIONÚPROTOCOL_TO_SPEC_VERSIONÚDEFAULT_SPEC_VERSIONÚ	_WS_MAGICr¶  rî  rò  r9  rD  r/  r  rE  ry  r5  r;  r?  r,  ÚCLOSE_STATUS_CODE_GOING_AWAYrh  Ú"CLOSE_STATUS_CODE_UNSUPPORTED_DATAÚCLOSE_STATUS_CODE_RESERVED1ÚCLOSE_STATUS_CODE_NULLr�  rk  Ú"CLOSE_STATUS_CODE_POLICY_VIOLATIONrb  Ú%CLOSE_STATUS_CODE_MANDATORY_EXTENSIONÚ CLOSE_STATUS_CODE_INTERNAL_ERRORÚ!CLOSE_STATUS_CODE_SERVICE_RESTARTÚ!CLOSE_STATUS_CODE_TRY_AGAIN_LATERÚCLOSE_STATUS_CODE_UNASSIGNED1Ú&CLOSE_STATUS_CODE_TLS_HANDSHAKE_FAILEDr*  ÚCONFIG_ATTRS_COMMONÚCONFIG_ATTRS_SERVERÚCONFIG_ATTRS_CLIENTrT   Úpropertyr   r   rá   ræ   rì   rô   rú   rý   r   r  r  r  r  r  r>  r6  rG  rJ  rU  rX  r4  rò   ra  r+  r.  ro  rŠ  r�  r•  r˜  rŸ  r¤  r§  r¦  rª  r«  r±  r°  r»  rÅ  r©  rØ  rÛ  rÜ  rü  r!  r'  r  rþ  r  r8  r2  r8  rA  rD  rG  rJ  rÂ  rk  rq   rL   r9   r"   r"   j  sE  € € € € € ðð ð €DàBÐBÐBÐðð $% b 'Ððð %&¨1°!¸ÀÈÐQSÐY[ÐacÐdÐdÐðð $&¨2˜˜Ððð
 Ððð
 8€Iðð
 "Ððð Ððð Ððð €LØÐØ€MØ€JØÐð ÐØ ÐØ !ÐØ&'Ð#ð
  $ÐØ%à#'Ð Øà'+Ð$Øà)-Ð&Øà"&ÐØà!ÐØUà'+Ð$Ø_à(,Ð%Ø%à)-Ð&Øà(,Ð%Øà,0Ð)Øà'+Ð$ØIà(,Ð%Øà(,Ð%Øà$(Ð!Øà-1Ð*ð Gà":Ø">Ø"BØ"DØ"CØ"DØ"CØ"GØ"BØ"CØ"Cð
"EÐð 1ð:ð :ð :Ðð"ð1ð 1ð 1Ððð:ð :ð :ÐððQð Qð Qð ð' 8Ð,<Ô#=ð 'ð 'ð 'ñ „Xð'ð3ð 3ð 3ð+ð +ð +ð`ð `ð `ð&0ð 0ð 0ð ð ð ð.ð .ð .ð!ð !ð !ð0
ð 
ð 
ð	#ð 	#ð 	#ð
ð 
ð 
ð	
ð 	
ð 	
ða+ð a+ð a+ðFpð pð pð +ð +ð +ð.ið ið ið cð cð cð(ð (ð (ðuð uð uð uð0/ð /ð /ð %AÈð \ð \ð \ð \ð6ð ð ð(ð ð ð,+ð +ð +ðtð tð tðl2[ð 2[ð 2[ðj	
ð 	
ð 	
ð

ð 

ð 

ð
ð 
ð 
ð$
ð 
ð 
ð*ð ð ð(-ð (-ð (-ðT\ð \ð \ðXð Xð Xðð ð ð#ð #ð #ð>'2ð '2ð '2ð '2ðRFð Fð Fðm&ð m&ð m&ð^'Að 'Að 'AðR%.ð %.ð %.ðN*"ð *"ð *"ðXIð Ið IðZ ØØØØ"ØØð]+ð ]+ð ]+ð ]+ð~%ð %ð %ð %ðð ð ð2ð ð ð.&ð &ð &ð &ð)+ð )+ð )+ð )+ðVMð Mð Mð Mð:9ð 9ð 9ð 9ð2SLð SLð SLðj)ð )ð )ð )ðV>ð >ð >ð,1ð 1ð 1ð 1ð  #Ø!%ØØ"'ð]ð ]ð ]ð ]ð~ð ð ð ð ð rL   r"   c                   ó   — e Zd ZdZd„ ZdS )ÚPreparedMessagez±
    Encapsulates a prepared message to be sent later once or multiple
    times on one or more WebSocket connections.
    This can be used for optimizing Broadcast/PubSub.
    c                 óf  — |s|| _         || _        || _        t          |¦  «        }|rdnd}|rVd}t	          j        dt          j        d¦  «        ¦  «        }|dk    r|}	n*t          ||¦  «         	                    |¦  «        }	nd}d}|}	d}
|dk    r||z  }nQ|d	k    r|d
z  }t	          j        d|¦  «        }
n0|dk    r|dz  }t	          j        d|¦  «        }
nt          d¦  «        ‚d                     |                     dd¦  «        |                     dd¦  «        |
||	g¦  «        | _        dS )a°  
        Ctor for a prepared message.

        :param payload: The message payload.
        :type payload: str
        :param isBinary: Provide `True` for binary payload.
        :type isBinary: bool
        :param applyMask: Provide `True` if WebSocket message is to be masked (required for client to server WebSocket messages).
        :type applyMask: bool
        :param doNotCompress: Iff `True`, never compress this message. This
            only applies when WebSocket compression has been negotiated on the
            WebSocket connection. Use when you know the payload incompressible
            (e.g. encrypted or already compressed).
        :type doNotCompress: bool
        é‚   é�   rÇ  r  r  r   rL   rË  r  rÎ  rÏ  rÑ  rÉ  rÐ  r  r}   r  N)rù   rÃ  rÀ  r?   rÕ  r  r  r  r   rÚ  r:  r	  r  rÁ  )rS   rù   rë   r¹   rÀ  rú  r  r  ry   r  r   s              r9   rT   zPreparedMessage.__init___	  se  € ð  ð 	#ð #ˆDŒLØ"ˆDŒKØ*ˆÔå�‰LŒLˆð  (Ð;ˆlˆl¨lˆð ð 	ØˆBå”;˜t¥VÔ%7¸Ñ%;Ô%;Ñ<Ô<ˆDØ�AŠvˆvØ��å'¨¨aÑ0Ô0×8Ò8¸ÑAÔA��àˆBØˆDØˆCð ˆØ�Š8ˆ8Ø�!‰GˆBˆBØ�&Š[ˆ[Ø�#‰IˆBÝ”˜T 1Ñ%Ô%ˆBˆBØÐ$Ò$Ð$Ø�#‰IˆBÝ”˜T 1Ñ%Ô%ˆBˆBåÐ4Ñ5Ô5Ð5ð Ÿ8š8 R§[¢[°°EÑ%:Ô%:¸B¿KºKÈÈ5Ñ<QÔ<QÐSUÐW[Ð]`Ð$aÑbÔbˆÔÐÐrL   Nrz   rq   rL   r9   rƒ  rƒ  X	  s2   € € € € € ðð ð=cð =cð =cð =cð =crL   rƒ  c                   ó   — e Zd ZdZdd„ZdS )r#   z˜
    Mixin for
    :class:`autobahn.websocket.protocol.WebSocketClientFactory` and
    :class:`autobahn.websocket.protocol.WebSocketServerFactory`.
    Fc                 ó6   — | j          }t          ||||¦  «        S )a$  
        Prepare a WebSocket message. This can be later sent on multiple
        instances of :class:`autobahn.websocket.WebSocketProtocol` using
        :meth:`autobahn.websocket.WebSocketProtocol.sendPreparedMessage`.

        By doing so, you can avoid the (small) overhead of framing the
        *same* payload into WebSocket messages multiple times when that
        same payload is to be sent out on multiple connections.

        :param payload: The message payload.
        :type payload: bytes
        :param isBinary: `True` iff payload is binary, else the payload must be
            UTF-8 encoded text.
        :type isBinary: bool
        :param doNotCompress: Iff `True`, never compress this message. This
            only applies when WebSocket compression has been negotiated on the
            WebSocket connection. Use when you know the payload incompressible
            (e.g. encrypted or already compressed).
        :type doNotCompress: bool

        :returns: An instance of :class:`autobahn.websocket.protocol.PreparedMessage`.
        )r3  rƒ  )rS   rù   rë   rÀ  r¹   s        r9   ÚprepareMessagezWebSocketFactory.prepareMessage¦	  s"   € ð. œÐ%ˆ	Ý˜w¨°)¸]ÑKÔKÐKrL   Nrl  )rn   ro   rp   r{   r‰  rq   rL   r9   r#   r#   Ÿ	  s8   € € € € € ðð ðLð Lð Lð Lð Lð LrL   r#   a1  <!DOCTYPE html>
<html>
   <head>
      {}
      <style>
         body {{
            color: #fff;
            background-color: #027eae;
            font-family: "Segoe UI", "Lucida Grande", "Helvetica Neue", Helvetica, Arial, sans-serif;
            font-size: 16px;
         }}

         a, a:visited, a:hover {{
            color: #fff;
         }}
      </style>
   </head>
   <body>
      <h1>AutobahnPython {}</h1>
      <p>
         I am not Web server, but a <b>WebSocket Endpoint</b>.
      </p>
      <p>
         You can talk to me using the <a href="http://tools.ietf.org/html/rfc6455">WebSocket</a> protocol.
      </p>
      <p>
         For more information, please see:
         <ul>
            <li><a href="http://crossbar.io/autobahn">Autobahn</a></li>
         </ul>
      </p>
   </body>
</html>
c            
       óÊ   — e Zd ZdZej        ej        z   Zdede	e
e         ee
e         eeef         f         f         fd„Zd„ Zd„ Zd„ Zd„ Zd	„ Zdd„Zdd„Zd„ Zd„ Zdd„ZdS )r$   z4
    Protocol base class for WebSocket servers.
    Úrequestrß   c                 ód   — | j                              dt          | j        ¦  «        |¬¦  «         dS )am  
        Callback fired during WebSocket opening handshake when new WebSocket client
        connection is about to be established.

        When you want to accept the connection, return the accepted protocol
        from list of WebSocket (sub)protocols provided by client or `None` to
        speak no specific one or when the client protocol list was empty.

        You may also return a pair of `(protocol, headers)` to send additional
        HTTP headers, with `headers` being a dictionary of key-values.

        Throw :class:`autobahn.websocket.types.ConnectionDeny` when you don't want
        to accept the WebSocket connection request.

        :param request: WebSocket connection request information.

        :returns: You may return one of: ``None``: the connection is accepted with no specific WebSocket subprotocol,
            ``str``: the connection is accepted with the returned name as the WebSocket subprotocol, or
            ``(str, dict)``: a pair of subprotocol accepted and HTTP headers to send to the client.
            You can also return a Deferred/Future that resolves/rejects to the above.
        z{func}: request={request})r¹  r‹  N)rä   rå   r   Ú	onConnect©rS   r‹  s     r9   r�  z!WebSocketServerProtocol.onConnectì	  s/   € ð, 	Œ�ŠÐ2½ÀÄÑ9OÔ9OÐY`ˆÑaÔaÐaØˆtrL   c                 óÌ   — | j                              dt          | j        ¦  «        | j        ¬¦  «         t
                               | ¦  «         | j        xj        dz  c_        dS )a1  
        Called by network framework when new transport connection from client was
        accepted. Default implementation will prepare for initial WebSocket opening
        handshake. When overriding in derived class, make sure to call this base class
        implementation *before* your code.
        ú,{func}: connection accepted from peer {peer}©r¹  rZ  r}   N)rä   rå   r   rŠ  rZ  r"   r2  ÚcountConnectionsrR   s    r9   rŠ  z'WebSocketServerProtocol._connectionMade
  si   € ð 	Œ�ŠÐEÝ" 4Ô#7Ñ8Ô8¸t¼yð 	ñ 	Jô 	Jð 	Jå×)Ò)¨$Ñ/Ô/Ð/ØŒÐ%Ô%¨Ñ*Ð%Ô%Ð%Ð%rL   c                 óê   — | j                              dt          | j        ¦  «        | j        t          |¦  «        ¬¦  «         t                               | |¦  «         | j        xj        dz  c_        dS )a!  
        Called by network framework when established transport connection from client
        was lost. Default implementation will tear down all state properly.
        When overriding in derived class, make sure to call this base class
        implementation *after* your code.
        ú7{func}: connection lost to peer {peer}: reason={reason}©r¹  rZ  r  r}   N)	rä   rå   r   r�  rZ  r   r"   r2  r’  ri  s     r9   r�  z'WebSocketServerProtocol._connectionLost
  sw   € ð 	Œ�ŠÐPÝ" 4Ô#7Ñ8Ô8¸t¼yÕQVÐW]ÑQ^ÔQ^ð 	ñ 	`ô 	`ð 	`å×)Ò)¨$°Ñ7Ô7Ð7ØŒÐ%Ô%¨Ñ*Ð%Ô%Ð%Ð%rL   c                 ó    — t          d¦  «        ‚)NzAutobahn isn't a proxy serverr­  rR   s    r9   rª  z+WebSocketServerProtocol.processProxyConnect
  s   € ÝÐ7Ñ8Ô8Ð8rL   c                 óä  ‡ — ‰ j                              d¦  «        }|dk    �r|‰ j                             dt	          ‰ j        ¦  «        t          |¦  «        ¬¦  «         ‰ j         d|dz   …         ‰ _        ‰ j                             d‰ j        ¬¦  «         	 t          ‰ j        ¦  «        \  ‰ _	        ‰ _
        }n?# t          $ r2}‰                      d	                     |¦  «        ¦  «        cY d}~S d}~ww xY wd
‰ j
        v rN‰ j        rGd„ ‰ j
        d
                              d¦  «        D ¦   «         }|‰ j         d…         }|d         ‰ _        ‰ j                             d‰ j	        ¬¦  «         ‰ j                             d‰ j
        ¬¦  «         ‰ j	                             ¦   «         }t#          |¦  «        dk    r-‰                      d                     ‰ j	        ¦  «        ¦  «        S |d                              ¦   «         dk    r/‰                      d                     |d         ¦  «        d¦  «        S |d                              ¦   «                              d¦  «        }t#          |¦  «        dk    s|d         dk    s
|d         dvr/‰                      d                     |d         ¦  «        d¦  «        S |d                              ¦   «         ‰ _        	 t)          j        ‰ j        ¦  «        \  }}	}
}}}|dk    s|	dk    r	 |dk    r(‰                      d                     |¦  «        ¦  «        S |
‰ _        t)          j        |¦  «        ‰ _        nG#  ‰                      d                     |d                              ¦   «         ¦  «        ¦  «        cY S xY wd ‰ j
        vr‰                      d!¦  «        S |d          dk    r‰                      d"¦  «        S ‰ j
        d                               ¦   «         ‰ _        ‰ j                             d#¦  «        dk    �rW‰ j                             d$¦  «        �s<‰ j                             d#d¦  «        \  }}	 t9          t;          |                     ¦   «         ¦  «        ¦  «        }nj# t<          $ r] ‰                      d%                     t;          |                     ¦   «         ¦  «        t;          ‰ j        ¦  «        ¦  «        ¦  «        cY S w xY w‰ j        j         rW|‰ j        j         k    rF‰                      d&                     |t;          ‰ j        ¦  «        ‰ j        j         ¦  «        ¦  «        S n‰ j                             d'¦  «         |‰ _        d(‰ j
        v�r¢‰ j!        �r„d)‰ j        v �r4t#          ‰ j        d)         ¦  «        dk    �rtD          j#         $                    ‰ j        d)         d         ¦  «        }| %                    ¦   «          &                    ¦   «          '                    ¦   «         }d*‰ j        v rrt#          ‰ j        d*         ¦  «        dk    rTt9          ‰ j        d*         d         ¦  «        }‰ j                             d+||¬,¦  «         ‰  (                    ||¦  «         n`‰ j                             d-|¬.¦  «         ‰  )                    |¦  «         n.‰ j                             d/¦  «         ‰  (                    ¦   «          ‰  *                    d0¬1¦  «         dS ‰                      d2d3¦  «        S d0}‰ j
        d(                              d¦  «        D ]0}|                     ¦   «          +                    ¦   «         d4k    rd5} nŒ1|s3‰                      d6                     ‰ j
        d(         ¦  «        ¦  «        S d7‰ j
        vr‰                      d8¦  «        S d0}‰ j
        d7                              d¦  «        D ]0}|                     ¦   «          +                    ¦   «         d(k    rd5} nŒ1|s3‰                      d9                     ‰ j
        d7         ¦  «        ¦  «        S d:‰ j
        vr/‰ j                             d;¦  «         ‰                      d<¦  «        S ‰ j                             d=¦  «         |d:         dk    r‰                      d>¦  «        S 	 t9          ‰ j
        d:         ¦  «        }nC# t<          $ r6 ‰                      d?                     ‰ j
        d:         ¦  «        ¦  «        cY S w xY w|‰ j,        vrut[          ‰ j,        ¦  «        }| .                    ¦   «          d /                    d@„ |D ¦   «         ¦  «        }‰                      dA                     ||¦  «        dBdC|fg¦  «        S |‰ _0        dD‰ j
        v rldE„ ‰ j
        dD                              d¦  «        D ¦   «         }i }|D ]5}||v r*‰                      dF                     |¦  «        ¦  «        c S d||<   Œ6|‰ _1        ng ‰ _1        ‰ j0        dGk     rdH}ndI}d‰ _2        |‰ j
        v r�||         dk    r‰                      dJ¦  «        S ‰ j
        |                              ¦   «         ‰ _2        	 tg          ‰ j2        ¦  «        }n?# t<          $ r2}‰                      dK                     |¦  «        ¦  «        cY d}~S d}~ww xY wd5}nd0}|r|dLk    r‰ j        j4        rd5}n;tk          |‰ j        j6        rdMndN‰ j        j         p‰ j        j7        ‰ j8        ¦  «        }|s-‰                      dO                     ‰ j2        ¦  «        ¦  «        S dP‰ j
        vr‰                      dQ¦  «        S |dP         dk    r‰                      dR¦  «        S ‰ j
        dP                              ¦   «         } t#          | ¦  «        dSk    r(‰                      dT                     | ¦  «        ¦  «        S | dUd…         dVk    r(‰                      dW                     | ¦  «        ¦  «        S | ddU…         D ]1}|dXvr+‰                      dY                     || ¦  «        ¦  «        c S Œ2g ‰ _9        dZ‰ j
        v rF|dZ         dk    r‰                      d[¦  «        S ‰  :                    ‰ j
        dZ         ¦  «        ‰ _9        ‰ j         |dz   d…         ‰ _         | ‰ _;        ‰ j<        dk    r.‰ j        j=        ‰ j<        k    r‰                      d\d]¬^¦  «         dS t}          ‰ j        ‰ j
        ‰ j        ‰ j        ‰ j        ‰ j0        ‰ j2        ‰ j1        ‰ j9        ¦	  «	        }!t          j@        ‰ jA        |!¦  «        }"ˆ fd_„}#t          jB        |"‰ jC        |#¦  «         dS ‰ jD        rÈ‰ j                              d`¦  «        }$|$dk    rª‰ j                             da¦  «         ‰ jD        rk‰ j                             db‰ jE        ¬c¦  «         ‰  F                    ‰ jE         G                    dd¦  «        ¦  «         d5‰ _H        ‰  *                    ¦   «          dS ‰ j                             de¦  «         dS dS dS )fzJ
        Process WebSocket opening handshake request from client.
        ó   

r   z?{func} found end of HTTP request header at byte {end_of_header})r¹  Úend_of_headerNr³   z received HTTP request:

{data}

)rƒ   z@Error during parsing of HTTP status line / request headers : {0}zx-forwarded-forc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rq   r]  rX  s     r9   r  z<WebSocketServerProtocol.processHandshake.<locals>.<listcomp>;
  s    € Ð`Ð`Ð`¨1˜QŸWšW™YœYÐ`Ð`Ð`rL   rZ  ú9received HTTP status line in opening handshake : {status}©Ústatusú6received HTTP headers in opening handshake : {headers}©Úheadersr<   z!Bad HTTP request status line "{}"ÚGETzHTTP method "{}" not allowedi•  r²   ú/ÚHTTPr}   )z1.1úUnsupported HTTP version "{}"iù  r[  z;HTTP requested resource contains a fragment identifier "{}"z0Bad HTTP request resource - could not parse "{}"r8   z5HTTP Host header missing in opening handshake requestzDHTTP Host header appears more than once in opening handshake requestr~   ú]z*invalid port "{}" in HTTP Host header "{}"zHport {} in HTTP Host header "{}" does not match server listening port {}zOskipping opening handshake port checking - neither WS URL nor external port setÚupgradeÚredirectÚafterzvHTTP Upgrade header missing : render server status page and meta-refresh-redirecting to {url} after {duration} seconds)r6   Údurationz6HTTP Upgrade header missing : 303-redirecting to {url})r6   z7HTTP Upgrade header missing : render server status pageFr!  úHTTP Upgrade header missingiª  Ú	websocketTzNHTTP Upgrade headers do not include "websocket" value (case-insensitive): "{}"Ú
connectionúHTTP Connection header missingzOHTTP Connection headers do not include "upgrade" value (case-insensitive): "{}"zsec-websocket-versionzHixie76 protocol detectedz=WebSocket connection denied - Hixie76 protocol not supported.zHybi protocol detectedzUHTTP Sec-WebSocket-Version header appears more than once in opening handshake requestzScould not parse HTTP Sec-WebSocket-Version header "{}" in opening handshake requestc                 ó,   — g | ]}t          |¦  «        ‘ŒS rq   )r1  rX  s     r9   r  z<WebSocketServerProtocol.processHandshake.<locals>.<listcomp>Ý
  s   € Ð3Ð3Ð3¨1¥ A¡¤Ð3Ð3Ð3rL   z;WebSocket version {} not supported (supported versions: {})é�  zSec-WebSocket-Versionúsec-websocket-protocolc                 óP   — g | ]#}t          |                     ¦   «         ¦  «        ‘Œ$S rq   rW  rX  s     r9   r  z<WebSocketServerProtocol.processHandshake.<locals>.<listcomp>è
  s&   € ÐlÐlÐl°�S §¢¡¤™^œ^ÐlÐlÐlrL   zGduplicate protocol "{}" specified in HTTP Sec-WebSocket-Protocol headerr¬   zsec-websocket-originÚoriginzFHTTP Origin header appears more than once in opening handshake requestzHTTP Origin header invalid: {}r)   r,   r-   z5WebSocket connection denied: origin '{0}' not allowedzsec-websocket-keyz%HTTP Sec-WebSocket-Key header missingzQHTTP Sec-WebSocket-Key header appears more than once in opening handshake requesté   z:bad Sec-WebSocket-Key (length must be 24 ASCII chars) "{}"éþÿÿÿz==z4bad Sec-WebSocket-Key (invalid base64 encoding) "{}"z@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/zFbad character "{}" in Sec-WebSocket-Key (invalid base64 encoding) "{}"úsec-websocket-extensionszXHTTP Sec-WebSocket-Extensions header appears more than once in opening handshake requestz%maximum number of connections reachedi÷  )r  c                 ó”  •— t          | j        t          ¦  «        r,‰                     | j        j        | j        j        ¦  «         d S ‰j                             d| ¬¦  «         ‰j                             dt          j	        | ¦  «        ¬¦  «         ‰                     d 
                    | j        ¦  «        t          j        ¦  «        S )Nz1Unexpected exception in onConnect ['{err.value}'])Úerrz{tb})ÚtbzInternal server error: {})r=   r‹   r   ÚfailHandshaker  r  rä   r\  rÙ   Úfailure_format_tracebackr5   ÚINTERNAL_SERVER_ERROR)r·  rS   s    €r9   Úforward_errorz?WebSocketServerProtocol.processHandshake.<locals>.forward_error_  s·   ø€ Ý! #¤)­^Ñ<Ô<ð Gà×*Ò*¨3¬9Ô+;¸S¼Y¼^ÑLÔLÐLÐLÐLð œŸšÐ&YÐ_b˜ÑcÔcÐcØœŸš fµÔ1OÐPSÑ1TÔ1T˜ÑUÔUÐUØ#×1Ò1Ð2M×2TÒ2TÐUXÔU^Ñ2_Ô2_Õaoô  bFñ   Gô   Gð  GrL   s   <policy-file-request/> z)received Flash Socket Policy File requestz+sending Flash Socket Policy File :
{policy})Úpolicyr   zëNo Flash Policy File served. You might want to serve a Flask Socket Policy file on the destination port since you received a request for it. See WebSocketServerFactory.serveFlashSocketPolicy and WebSocketServerFactory.flashSocketPolicy)Irƒ   r‚   rä   rå   r   r«  r   Úhttp_request_datarŒ   r…   r†   r:  r¹  r5   rÑ   rc  rZ  r?   r�   Úhttp_request_urir	   ÚurlparseÚhttp_request_pathÚparse_qsÚhttp_request_paramsÚhttp_request_hostÚendswithÚrsplitr  r1  r4   r2  ÚexternalPortrÇ   Ú	hyperlinkÚURLÚ	from_textÚto_uriÚ	normalizeÚto_textÚsendServerStatusÚsendRedirectr4  r.   rÆ   ÚsortedÚreverser	  rö   Úwebsocket_protocolsrA   r:   rÏ   rK   ÚisSecurer2   rÎ   Úwebsocket_extensionsrk  Ú_wskeyrÐ   r’  r   rÙ   Ú	as_futurer�  r  ÚsucceedHandshakerË   rÌ   r»  Úencoder  )%rS   r™  r‡   r·  Ú	addressesÚtrusted_addressesrC  Úvsr0   ÚnetlocÚpathri  ÚqueryÚfragmentrˆ   rj  r2   r6   r¨  ÚupgradeWebSocketr<  ÚconnectionUpgradeÚcrÒ   ÚsvÚsvsÚ	protocolsÚppÚwebsocket_origin_header_keyÚorigin_tupleÚhave_originÚorigin_is_allowedrŠ   r‹  r  r¼  Úflash_policy_file_requests%   `                                    r9   r«  z(WebSocketServerProtocol.processHandshake 
  s¼  ø€ ð œ	ŸšÐ':Ñ;Ô;ˆØ˜AÒÑØŒH�NŠNÐ\Ý & tÔ'<Ñ =Ô =ÍUÐS`ÑMaÔMað ñ cô cð cð &*¤YÐ/A°ÀÑ0AÐ/AÔ%BˆDÔ"ØŒH�NŠNØ6ØÔ+ð ñ ô ð ðxÝM\Ð]aÔ]sÑMtÔMtÑJ�Ô% tÔ'8Ð:JÐ:JøÝð xð xð xØ×)Ò)Ð*l×*sÒ*sÐtuÑ*vÔ*vÑwÔwÐwÐwÐwÐwÐwÐwøøøøðxøøøð
 ! DÔ$5Ð5Ð5¸$Ô:QÐ5Ø`Ð`°Ô0AÐBSÔ0T×0ZÒ0ZÐ[^Ñ0_Ô0_Ð`Ñ`Ô`�	Ø$-¨tÔ/FÐ.FÐ.GÐ.GÔ$HÐ!Ø-¨aÔ0�”	ð ŒH�NŠNØKØÔ,ð ñ ô ð ð ŒH�NŠNØHØÔ)ð ñ ô ð ð Ô&×,Ò,Ñ.Ô.ˆBÝ�2‰wŒw˜!Š|ˆ|Ø×)Ò)Ð*M×*TÒ*TÐUYÔUjÑ*kÔ*kÑlÔlÐlØ�!Œu�{Š{‰}Œ} Ò%Ð%Ø×)Ò)Ð*H×*OÒ*OÐPRÐSTÔPUÑ*VÔ*VÐX[Ñ\Ô\Ð\Ø�A”—’‘”×$Ò$ SÑ)Ô)ˆBÝ�2‰wŒw˜!Š|ˆ|˜r !œu¨š˜°"°Q´%¸wÐ2FÐ2FØ×)Ò)Ð*I×*PÒ*PÐQSÐTUÔQVÑ*WÔ*WÐY\Ñ]Ô]Ð]ð %' q¤E§K¢K¡M¤MˆDÔ!ðtÝBGÄ.ÐQUÔQfÑBgÔBgÑ?�˜  v¨u°hð ˜R’<�< 6¨R¢< <Øð ˜r’>�>Ø×-Ò-Ð.k×.rÒ.rÐs{Ñ.|Ô.|Ñ}Ô}Ð}ð *.�Ô&Ý+0¬>¸%Ñ+@Ô+@�Ô(Ð(øðtØ×)Ò)Ð*\×*cÒ*cÐdfÐghÔdi×doÒdoÑdqÔdqÑ*rÔ*rÑsÔsÐsÐsÐsøøøð ˜TÔ.Ð.Ð.Ø×)Ò)Ð*aÑbÔbÐbà Ô'¨!Ò+Ð+Ø×)Ò)Ð*pÑqÔqÐqà%)Ô%6°vÔ%>×%DÒ%DÑ%FÔ%FˆDÔ"àÔ%×*Ò*¨3Ñ/Ô/°1Ò4Ñ4¸TÔ=S×=\Ò=\Ð]`Ñ=aÔ=aÑ4ØÔ/×6Ò6°s¸AÑ>Ô>‘��Að@Ý�s 1§7¢7¡9¤9™~œ~Ñ.Ô.�D�DøÝ!ð @ð @ð @Ø×-Ò-Ð.Z×.aÒ.aÕbeÐfg×fmÒfmÑfoÔfoÑbpÔbpÝbeÐfjÔf|Ñb}Ôb}ñ/ô /ñ @ô @ð @ð @ð @ð@øøøð
 ”<Ô,ð vØ˜tœ|Ô8Ò8Ð8Ø#×1Ò1Ð2|÷  3Dò  3Dð  EIõ  KNð  OSô  Oeñ  Kfô  Kfð  hlô  htô  hAñ  3Bô  3Bñ   Cô   Cð  Cð 9ð ”H—N’NÐ#tÑuÔuÐuà)*�Ô&ð  Ô 1Ð1Ñ1ð ”>ñ (RØ! TÔ%=Ð=Ñ=Å#ÀdÔF^Ð_iÔFjÑBkÔBkÐnoÒBoÑBoõ  (œm×5Ò5°dÔ6NÈzÔ6ZÐ[\Ô6]Ñ^Ô^˜Ø!Ÿjšj™lœl×4Ò4Ñ6Ô6×>Ò>Ñ@Ô@˜Ø" dÔ&>Ð>Ð>Å3ÀtÔG_Ð`gÔGhÑCiÔCiÐlmÒCmÐCmÝ$'¨Ô(@ÀÔ(IÈ!Ô(LÑ$MÔ$M˜EØ œHŸNšNð!]à$'Ø).ð	 +ñ ô ð ð !×1Ò1°#°uÑ=Ô=Ð=Ð=à œHŸNšNØ XØ$'ð +ñ ô ð ð !×-Ò-¨cÑ2Ô2Ð2Ð2àœŸšÐ'`ÑaÔaÐaØ×-Ò-Ñ/Ô/Ð/Ø×'Ò'¨eÐ'Ñ4Ô4Ð4Ø�Fà×-Ò-Ð.KÈSÑQÔQÐQØ$ÐØÔ& yÔ1×7Ò7¸Ñ<Ô<ð ð �Ø—7’7‘9”9—?’?Ñ$Ô$¨Ò3Ð3Ø'+Ð$Ø�Eð 4ð $ð aØ×)Ò)Ð*z÷  +Bò  +Bð  CGô  CTð  U^ô  C_ñ  +`ô  +`ñ  aô  að  að  4Ô#4Ð4Ð4Ø×)Ò)Ð*JÑKÔKÐKØ %ÐØÔ& |Ô4×:Ò:¸3Ñ?Ô?ð ð �Ø—7’7‘9”9—?’?Ñ$Ô$¨	Ò1Ð1Ø(,Ð%Ø�Eð 2ð %ð eØ×)Ò)Ð*{÷  +Cò  +Cð  DHô  DUð  Vbô  Dcñ  +dô  +dñ  eô  eð  eð '¨dÔ.?Ð?Ð?Ø”—’Ð:Ñ;Ô;Ð;Ø×)Ò)Ð*iÑjÔjÐjà”—’Ð7Ñ8Ô8Ð8Ø#Ð$;Ô<¸qÒ@Ð@Ø×-Ò-ð  /Fñ  Gô  Gð  GðxÝ! $Ô"3Ð4KÔ"LÑMÔM�G�GøÝ!ð xð xð xØ×-Ò-ð  /D÷  /Kò  /Kð  LPô  L]ð  ^uô  Lvñ  /wô  /wñ  xô  xð  xð  xð  xðxøøøð ˜dœmÐ+Ð+õ ˜DœMÑ*Ô*�Ø—
’
‘”�Ø—h’hÐ3Ð3°Ð3Ñ3Ô3Ñ4Ô4�Ø×)Ò)Ð*g×*nÒ*nÐovÐx{Ñ*|Ô*|Ø*-Ø,CÀSÐ+IÐ*JñLô Lð Lð
 *1�Ô&ð (¨4Ô+<Ð<Ð<ØlÐl°TÔ5FÐG_Ô5`×5fÒ5fÐgjÑ5kÔ5kÐlÑlÔl�	à�Ø"ð "ð "�AØ˜B�w�wØ#×1Ò1Ð2{÷  3Cò  3Cð  DEñ  3Fô  3Fñ   Gô   Gð  Gð  Gð  Gà !˜˜1™˜à+4�Ô(Ð(à+-�Ô(ð
 Ô%¨Ò*Ð*à.DÐ+Ð+ð /7Ð+à$&ˆDÔ!Ø*¨dÔ.?Ð?Ð?Ø#Ð$?Ô@À1ÒDÐDØ×-Ò-Ð.vÑwÔwÐwØ(,Ô(9Ð:UÔ(V×(\Ò(\Ñ(^Ô(^�Ô%ðÝ#1°$Ô2GÑ#HÔ#H�L�LøÝ!ð ð ð Ø×-Ò-Ø8×?Ò?ÀÑBÔBñô ð ð ð ð ð ð øøøøðøøøð #��ð $�àð Ø 6Ò)Ð)¨d¬lÔ.JÐ)Ø(,Ð%Ð%å(7Ø$Ø#'¤<Ô#8ÐD˜˜¸fØœÔ1ÐF°T´\Ô5FØÔ3ñ	)ô )Ð%ð )ð Ø×-Ò-ð&ß&,¢f¨TÔ-BÑ&CÔ&Cñô ð ð #¨$Ô*;Ð;Ð;Ø×)Ò)Ð*QÑRÔRÐRØÐ 3Ô4°qÒ8Ð8Ø×)Ò)Ð*}Ñ~Ô~Ð~ØÔ#Ð$7Ô8×>Ò>Ñ@Ô@ˆCÝ�3‰xŒx˜2Š~ˆ~Ø×)Ò)Ð*f×*mÒ*mÐnqÑ*rÔ*rÑsÔsÐsØ�2�3�3Œx˜4ÒÐØ×)Ò)Ð*`×*gÒ*gÐhkÑ*lÔ*lÑmÔmÐmØ˜˜"˜”Xð Gð G�ØÐ^Ð^Ð^Ø×-Ò-Ð.v×.}Ò.}Ð~ð  BEñ  /Fô  /Fñ  Gô  Gð  Gð  Gð  Gð _ð
 )+ˆDÔ%Ø)¨TÔ->Ð>Ð>Ø#Ð$>Ô?À!ÒCÐCØ×-Ò-ð  /Iñ  Jô  Jð  Jð 15×0KÒ0KÈDÔL]Ð^xÔLyÑ0zÔ0z�DÔ-ð œ	 -°!Ñ"3Ð"4Ð"4Ô5ˆDŒIð
 ˆDŒKð Ô" QÒ&Ð&¨4¬<Ô+HÈ4ÔK^Ò+^Ð+^ð ×"Ò"Ð#JÐQTÐ"ÑUÔUÐUÐUÐUõ
 ,¨D¬IØ,0Ô,=Ø,0Ô,BØ,0Ô,BØ,0Ô,DØ,0Ô,BØ,0Ô,AØ,0Ô,DØ,0Ô,EñGô G�õ  ”O D¤N°GÑ<Ô<�ðGð Gð Gð Gð Gõ Ô# A tÔ'<¸mÑLÔLÐLÐLÐLàÔ(ð 	Ø(,¬	¯ªÐ7TÑ(UÔ(UÐ%Ø(¨AÒ-Ð-Ø”—’ÐJÑKÔKÐKàÔ.ð Ø”H—N’NØFØ#Ô5ð #ñ ô ð ð
 —M’M $Ô"8×"?Ò"?ÀÑ"GÔ"GÑHÔHÐHà;?�DÔ8à×'Ò'Ñ)Ô)Ð)Ð)Ð)à”H—N’NðCñô ð ð ð ð#	ð 	à-Ð-su   Â"B; Â;
C7Ã'C2Ã,C7Ã2C7ËAM Ì9 M ÍANÑ.R ÒA$S3Ó2S3ãc# ã#=d#ä"d#êj" ê"
kê,'këkëkc                 óV  — d}i }t          |¦  «        t          k    r7t          |¦  «        dk    r|d         }t          |¦  «        dk    r|d         }n|}|�|| j        vrt	          d¦  «        ‚|| _        | j        }g | _        g }g }| j        D ]Á\  }}| j	         
                    d||¬¦  «         |t          v rzt          |         }		 |	d                              |¦  «        }
|                     |
¦  «         Œj# t          $ r.}|                      t          |¦  «        ¦  «        cY d}~c S d}~ww xY w| j	         
                    d|¬	¦  «         ŒÂt          |¦  «        dk    r·|                      |¦  «        }|�„t          |j                 }	|	d
                              | j        j        |¦  «        | _        | j                             | j        ¦  «         |                     |                     ¦   «         ¦  «         n| j	         
                    d|¬¦  «         d}| j        j        r"|d                     | j        j        ¦  «        z  }|dz  }|dz  }| j        j                             ¦   «         |                     ¦   «         fD ]�}|D ]|}t7          |d         t          f¦  «        r
|d         g}n0	 t9          |d         ¦  «        }n# t:          $ r |d         g}Y nw xY w|D ]!}|d                     |d         |¦  «        z  }Œ"Œ}Œ‚| j        �|d                     | j        ¦  «        z  }t=          j        ¦   «         }|                      | !                    d¦  «        tD          j#        z   ¦  «         tI          j%        | &                    ¦   «         ¦  «        }|d                     | '                    ¦   «         ¦  «        z  }t          |¦  «        dk    r+|d                     d (                    |¦  «        ¦  «        z  }|dz  }d}| j	         
                    d|¬¦  «         |  )                    | !                    d¦  «        ¦  «         |r>| j	         
                    dtU          |¦  «        ¬¦  «         |  )                    |¦  «         || _+        tD          j,        | _-        | j.        �:| j	         
                    d¦  «         | j.         /                    ¦   «          d| _.        d| _0        d| _1        | j2        r/| j        j3         4                    | j2        | j5        ¦  «        | _6        | j7        r| j7         8                    d¦  «         |  9                    ¦   «          tu          j;        | j<        d¦  «         t          | j=        ¦  «        dk    r|  >                    ¦   «          dS dS )zl
        Callback after onConnect() returns successfully. Generates the response for the handshake.
        Nr   r}   z;protocol accepted must be from the list client sent or Noneú?parsed WebSocket extension '{extension}' with params '{params}'©rh  ri  ÚOfferzSclient requested '{extension}' extension we don't support or which is not activated)rh  ÚPMCEzXclient request permessage-compress extension, but we did not accept any offer [{offers}])Úoffersz"HTTP/1.1 101 Switching Protocols
úServer: {}
úUpgrade: WebSocket
úConnection: Upgrade
ú{}: {}
úSec-WebSocket-Protocol: {}
r   zSec-WebSocket-Accept: {}
úSec-WebSocket-Extensions: {}
rZ  ú
z"sending HTTP response:

{response}©Úresponsez%sending HTTP response body:

{octets})r’  úopenHandshakeTimeoutCall.cancelFræ   )?r0  r>   r?   rÒ  r:  Úwebsocket_protocol_in_userÕ  Úwebsocket_extensions_in_userÔ  rä   rå   r   r	   r÷   r¹  r1  rÊ   rÓ  Úcreate_from_offer_acceptr2  r3  rv  Úget_extension_stringÚserverr5   r   Úitemsr=   ÚiterÚ	TypeErrorÚhashlibÚsha1ÚupdaterØ  r"   rr  Úbase64Ú	b64encodeÚdigestr   r	  r»  r   Úhttp_response_datar  r  rC  r1  rÔ  rÒ  rÂ   r†  r5  r  rƒ  r
  r•   Ú_onOpenrÙ   r^  rÜ   rƒ   r¦  )rS   r7   Úprotocolr   rŠ   ÚextensionResponseÚ
pmceOffersrh  ri  rð  Úofferr·  Úacceptrú  Úheaders_sourceÚuhÚheader_valuesÚheader_valuer  Úsec_websocket_acceptÚresponse_bodys                        r9   r×  z(WebSocketServerProtocol.succeedHandshake„  s  € ð ˆØˆÝ�‰9Œ9�ÒÐÝ�3‰xŒx˜!Š|ˆ|Ø˜qœ6�Ý�3‰xŒx˜!Š|ˆ|Ø˜aœ&�øàˆHàÐ¨°TÔ5MÐ)MÐ)MÝÐYÑZÔZÐZà)1ˆÔ&ØŒkˆð ,.ˆÔ(àÐð ˆ
ð $(Ô#<ð 	ð 	ÑˆY˜àŒH�NŠNØQØ#Øð ñ ô ð ð Õ<Ð<Ð<å7¸	ÔB�ð6Ø  œM×/Ò/°Ñ7Ô7�EØ×%Ò% eÑ,Ô,Ð,Ð,øÝ ð 6ð 6ð 6Ø×-Ò-­c°!©f¬fÑ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5øøøøð6øøøð ”—’ð0à'ð ñ ô ð ð õ ˆz‰?Œ?˜QÒÐØ×5Ò5°jÑAÔAˆFØÐ!Ý7¸Ô8MÔN�Ø+/°¬<×+PÒ+PÐQUÔQ]ÔQfÐhnÑ+oÔ+o�Ô(ØÔ0×7Ò7¸Ô8PÑQÔQÐQØ!×(Ò(¨×)DÒ)DÑ)FÔ)FÑGÔGÐGÐGà”—’ð6à%ð ñ ô ð ð >ˆàŒ<Ôð 	IØÐ,×3Ò3°D´LÔ4GÑHÔHÑHˆHàÐ0Ñ0ˆØÐ1Ñ1ˆð
  $œ|Ô3×9Ò9Ñ;Ô;¸W¿]º]¹_¼_ÐMð 	Mð 	MˆNØ$ð 
Mð 
M�Ý˜b œe¥c WÑ-Ô-ð 0Ø%'¨¤U G�M�Mð0Ý(,¨R°¬U©¬˜˜øÝ$ð 0ð 0ð 0Ø)+¨A¬¨˜˜˜ð0øøøð %2ð Mð M�LØÐ 0× 7Ò 7¸¸1¼¸|Ñ LÔ LÑL�H�HðMð
Mð Ô)Ð5ØÐ<×CÒCÀDÔDbÑcÔcÑcˆHõ Œ|‰~Œ~ˆà�Š�C—J’J˜vÑ&Ô&Õ):Ô)DÑDÑEÔEÐEÝ%Ô/°·²±´Ñ>Ô>ÐàÐ6×=Ò=Ð>R×>YÒ>YÑ>[Ô>[Ñ\Ô\Ñ\ˆõ Ð Ñ!Ô! AÒ%Ð%ØÐ>×EÒEÀcÇhÂhÐO`ÑFaÔFaÑbÔbÑbˆHð 	�JÑˆØˆð 	Œ�ŠÐ=ÈˆÑQÔQÐQØ�Š�h—o’o fÑ-Ô-Ñ.Ô.Ð.àð 	)ØŒH�NŠNØ9Ý(¨Ñ7Ô7ð ñ ô ð ð �MŠM˜-Ñ(Ô(Ð(ð #+ˆÔõ 'Ô1ˆŒ
ð Ô(Ð4ØŒH�NŠNÐ<Ñ=Ô=Ð=ØÔ)×0Ò0Ñ2Ô2Ð2Ø,0ˆDÔ)ð $ˆÔØ!ˆÔð Ô ð 	Ø'+¤|Ô'B×'MÒ'MØÔ%ØÔ"ñ(ô (ˆDÔ$ð Ôð 	0ØÔ×%Ò% hÑ/Ô/Ð/Ø�Š‰ŒˆåŒ�d”l DÑ)Ô)Ð)õ ˆtŒy‰>Œ>˜AÒÐØ×ÒÑÔÐÐÐð Ðs0   Ã	0C:Ã:
D2Ä!D-Ä%D2Ä-D2Ê5KËK!Ë K!r¯  Nc                 ó¦   — || _         | j                             d|¬¦  «         |                      |||¦  «         |                      d¬¦  «         dS )zŽ
        During opening handshake the client request was invalid, we send a HTTP
        error response and then drop the connection.
        ú0failing WebSocket opening handshake ('{reason}')rg  Fr!  N)r@  rä   ÚinfoÚsendHttpErrorResponser4  )rS   r  r  ÚresponseHeaderss       r9   r¹  z%WebSocketServerProtocol.failHandshake3  s[   € ð
 "(ˆÔØŒ�ŠÐHÐQWˆÑXÔXÐXØ×"Ò" 4¨°ÑAÔAÐAØ×Ò %ÐÑ(Ô(Ð(Ð(Ð(rL   c                 óä   — d                      ||¦  «        }|r*|D ]'}|d                      |d         |d         ¦  «        z  }Œ(|dz  }|                      |                     d¦  «        ¦  «         dS )z/
        Send out HTTP error response.
        zHTTP/1.1 {0} {1}
z
{0}: {1}
r   r}   rø  r   N)r5   r»  rØ  )rS   r  r  r  rú  rˆ   s         r9   r  z-WebSocketServerProtocol.sendHttpErrorResponse=  s†   € ð .×4Ò4°T¸6ÑBÔBˆØð 	BØ$ð Bð B�ØÐ.×5Ò5°a¸´d¸A¸a¼DÑAÔAÑA��Ø�JÑˆØ�Š�h—o’o fÑ-Ô-Ñ.Ô.Ð.Ð.Ð.rL   c                 óˆ  — |                      d¦  «        }d}| j        j        �2| j        j        dk    r"|d                     | j        j        ¦  «        z  }|dz  }|d                     t	          |¦  «        ¦  «        z  }|dz  }|                      |                      d¦  «        ¦  «         |                      |¦  «         dS )	z/
        Send HTML page HTTP response.
        r   zHTTP/1.1 200 OK
Nr[  rò  z(Content-Type: text/html; charset=UTF-8
zContent-Length: {}
rø  )rØ  r2  r   r5   r?   r»  )rS   ÚhtmlÚresponseBodyrú  s       r9   ÚsendHtmlz WebSocketServerProtocol.sendHtmlH  s¾   € ð —{’{ 6Ñ*Ô*ˆØ,ˆØŒ<ÔÐ*¨t¬|Ô/BÀbÒ/HÐ/HØÐ,×3Ò3°D´LÔ4GÑHÔHÑHˆHØÐDÑDˆØÐ0×7Ò7½¸LÑ8IÔ8IÑJÔJÑJˆØ�JÑˆØ�Š�h—o’o fÑ-Ô-Ñ.Ô.Ð.Ø�Š�lÑ#Ô#Ð#Ð#Ð#rL   c                 ó  — d}| j         j        �2| j         j        dk    r"|d                     | j         j        ¦  «        z  }|d                     |¦  «        z  }|dz  }|                      |                     d¦  «        ¦  «         dS )z4
        Send HTTP Redirect (303) response.
        zHTTP/1.1 303
Nr[  rò  zLocation: {}
rø  r   )r2  r   r5   r»  rØ  )rS   r6   rú  s      r9   rÏ  z$WebSocketServerProtocol.sendRedirectV  sˆ   € ð *ˆØŒ<ÔÐ*¨t¬|Ô/BÀbÒ/HÐ/HØÐ,×3Ò3°D´LÔ4GÑHÔHÑHˆHØÐ*×1Ò1°#Ñ6Ô6Ñ6ˆØ�JÑˆØ�Š�h—o’o fÑ-Ô-Ñ.Ô.Ð.Ð.Ð.rL   r   c                 ó¢   — |rd                      ||¦  «        }nd}|                      t                                |t          ¦  «        ¦  «         dS )z¡
        Used to send out server status/version upon receiving a HTTP/GET without
        upgrade to WebSocket header (and option serverStatus is True).
        z1<meta http-equiv="refresh" content="{};URL='{}'">r[  N)r5   r   Ú_SERVER_STATUS_TEMPLATEr
   )rS   ÚredirectUrlÚredirectAfterr§  s       r9   rÎ  z(WebSocketServerProtocol.sendServerStatusa  sS   € ð
 ð 	ØN×UÒUÐVcÐepÑqÔqˆHˆHàˆHØ�ŠÕ-×4Ò4°X½{ÑKÔKÑLÔLÐLÐLÐLrL   )r¯  NrP   rV   )rn   ro   rp   r{   r"   r~  r  rr  r   r   r   r1  r   r   r�  rŠ  r�  rª  r«  r×  r¹  r  r   rÏ  rÎ  rq   rL   r9   r$   r$   å	  s3  € € € € € ðð ð %Ô8Ð;LÔ;`Ñ`€LðÐ!2ð °u¸XÀc¼]ÈEÐRZÐ[^ÔR_ÐaeÐfiÐknÐfnÔaoÐRoÔLpÐ=pÔ7qð ð ð ð ð2
+ð 
+ð 
+ð
+ð 
+ð 
+ð9ð 9ð 9ðbð bð bðHmð mð mð^)ð )ð )ð )ð	/ð 	/ð 	/ð 	/ð$ð $ð $ð	/ð 	/ð 	/ð	Mð 	Mð 	Mð 	Mð 	Mð 	MrL   r$   c                   ó®   — e Zd ZdZeZ	 dZ	 ddd                     e¦  «        ddfd„Z		 	 	 	 	 dd„Z
d„ Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	„Zd
„ ZdS )r%   zˆ
    A protocol factory for WebSocket servers.

    Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory`
    TNúAutobahnPython/{}c                 óô   — d| _         d| _        d| _        t          j        dd¬¦  «        | _        t          j        ¦   «          |                      |||||¦  «         |  	                    ¦   «          d| _
        dS )zj
        Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.__init__`
        Fçš™™™™™É?r´   ©Úbucket_secondsÚ
chunk_sizer   N)rµ   r¶   r·   rÙ   Úmake_batched_timerr†  r  ÚseedÚsetSessionParametersÚresetProtocolOptionsr’  )rS   r6   rå  r   r   rÇ  s         r9   rT   zWebSocketServerFactory.__init__~  s‹   € ð ˆŒØˆŒØ!ˆÔõ $Ô6Ø Øð
ñ 
ô 
ˆÔõ 	Œ‰Œˆð 	×!Ò! # y°&¸'À<ÑPÔPÐPð 	×!Ò!Ñ#Ô#Ð#ð !"ˆÔÐÐrL   c                 ó  — t          |pd¦  «        \  }}}}	}
}t          |¦  «        dk    rt          d¦  «        ‚|| _        || _        || _        || _        |	| _        |
| _        || _	        |pg | _
        || _        |pi | _        || _        dS )zv
        Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.setSessionParameters`
        úws://localhostr   z3query parameters specified for server WebSocket URLN)r   r?   r:  r6   rÓ  r8   r2   ÚresourcerÝ  ri  rå  r   r   rÇ  )rS   r6   rå  r   r   rÇ  rÓ  r8   r2   r3  rÝ  ri  s               r9   r/  z+WebSocketServerFactory.setSessionParameters   sŸ   € õ :CÀ3ÐCZÐJZÑ9[Ô9[Ñ6ˆ�4˜˜x¨¨vÝˆv‰;Œ;˜Š?ˆ?ÝÐQÑRÔRÐRØˆŒØ ˆŒØˆŒ	ØˆŒ	Ø ˆŒØˆŒ	ØˆŒà"˜ bˆŒØˆŒØ�} "ˆŒà(ˆÔÐÐrL   c                 ó®  — t           j        | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d„ | _        d| _        d| _        d| _        d| _        d	g| _        t1          | j        ¦  «        | _        d| _        d| _        d| _        d
S )zv
        Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.resetProtocolOptions`
        TFr   é   r}   z`<cross-domain-policy>
     <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy> c                 ó   — d S rP   rq   ©r  s    r9   ú<lambda>z=WebSocketServerFactory.resetProtocolOptions.<locals>.<lambda>Õ  ó   € °T€ rL   r«   Ú*N)r"   rn  rÆ   rÇ   r¸   rÈ   rÉ   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rË   rÌ   rÊ   rÂ   rÃ   rÄ   rÅ   rÍ   r   rÎ   rÏ   rÐ   rÑ   rR   s    r9   r0  z+WebSocketServerFactory.resetProtocolOptions¼  sõ   € õ *ÔEˆŒØˆŒØ$(ˆÔ!Ø)-ˆÔ&Ø %ˆÔØˆŒØ#$ˆÔ Ø%&ˆÔ"Ø !ˆÔØˆŒØ#(ˆÔ Ø$%ˆÔ!Ø%&ˆÔ"ØˆŒØ&+ˆÔ#ð"ˆÔð ,:¨>ˆÔ(ð !"ˆÔØ ˆÔØˆÔð ,0ˆÔ(ð  #˜eˆÔÝ&8¸Ô9LÑ&MÔ&MˆÔ#Ø#ˆÔð  ˆÔð #$ˆÔÐÐrL   Fc                 ó*  — |�l|D ]=}|t           j        vr-t          d                     |t           j        ¦  «        ¦  «        ‚Œ>t	          |¦  «        t	          | j        ¦  «        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j	        k    r|| _	        |�|| j
        k    r|| _
        |�|| j        k    r|| _        |�|| j        k    r|| _        |	�|	| j        k    r|	| _        |
�|
| j        k    r|
| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�U|| j        k    rJt/          |¦  «        t0          k    st/          |¦  «        t2          k    sJ ‚d|cxk    rdk    sn J ‚|| _        |�,|| j        k    r!t/          |¦  «        t6          k    sJ ‚|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�+|| j        k    r || _        t?          | j        ¦  «        | _         |dvrtC          d¦  «        ‚|| _"        |�4|| j#        k    r)t/          |¦  «        t2          k    sJ ‚|dk    sJ ‚|| _#        |�6|| j$        k    r-t/          |¦  «        t2          k    sJ ‚|dk    sJ ‚|| _$        dS dS dS )zt
        Implements :func:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory.setProtocolOptions`
        Nz:invalid WebSocket protocol version {} (allowed values: {})r«   rË  )TFzallowNullOrigin must be a boolr   )%r"   rn  r:  r5   ÚsetrÆ   rÇ   r¸   rÈ   rÉ   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÊ   rÂ   rÃ   rÄ   r0  rh   r  rÅ   rM  rË   rÌ   rÍ   r   rÎ   r4   rÏ   rÐ   rÑ   )rS   rÆ   rÇ   r¸   rÉ   rÈ   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÊ   rÂ   rÃ   rÄ   rÅ   rË   rÌ   rÍ   rÏ   rÐ   rÑ   Úvs                              r9   ÚsetProtocolOptionsz)WebSocketServerFactory.setProtocolOptionsë  s  € ð: ÐØð [ð [�ØÕ-ÔIÐIÐIÝ#Ð$`×$gÒ$gÐhiÕk|ô  lYñ  %Zô  %Zñ  [ô  [ð  [ð Jå�8‰}Œ}¥ D¤MÑ 2Ô 2Ò2Ð2Ø (�”àÐ  Y°$´.Ò%@Ð%@Ø&ˆDŒNàÐ+Ð0DÈÔHaÒ0aÐ0aØ(<ˆDÔ%à$Ð0Ð5NÐRVÔRpÒ5pÐ5pØ-FˆDÔ*àÐ'Ð,<ÀÔ@UÒ,UÐ,UØ$4ˆDÔ!àÐ  Y°$´.Ò%@Ð%@Ø&ˆDŒNàÐ*Ð/BÀdÔF^Ò/^Ð/^Ø':ˆDÔ$à Ð,Ð1FÈ$ÔJdÒ1dÐ1dØ)>ˆDÔ&àÐ'Ð,<ÀÔ@UÒ,UÐ,UØ$4ˆDÔ!àÐ! j°D´OÒ&CÐ&CØ(ˆDŒOàÐ*Ð/BÀdÔF^Ò/^Ð/^Ø':ˆDÔ$àÐ+Ð0DÈÔHaÒ0aÐ0aØ(<ˆDÔ%à Ð,Ð1FÈ$ÔJdÒ1dÐ1dØ)>ˆDÔ&àÐ! j°D´OÒ&CÐ&CØ(ˆDŒOà&Ð2Ð7RÐVZÔVvÒ7vÐ7vØ/JˆDÔ,àÐ'Ð,<ÀÔ@UÒ,UÐ,UØ$4ˆDÔ!àÐ&¨?¸dÔ>RÒ+RÐ+RØ#2ˆDÔ àÐ#¨¸Ô8IÒ(IÐ(IÝ˜Ñ%Ô%­Ò.Ð.µ$°|Ñ2DÔ2DÍÒ2KÐ2KÐ2KÐ2KØ˜Ð,Ð,Ò,Ð,¨Ò,Ð,Ð,Ð,Ð,Ð,Ø ,ˆDÔà&Ð2Ð7RÐVZÔVvÒ7vÐ7vÝÐ3Ñ4Ô4½Ò<Ð<Ð<Ð<Ø/JˆDÔ,à!Ð-Ð2HÈDÔLgÒ2gÐ2gØ*@ˆDÔ'àÐ(Ð->À$ÔBXÒ-XÐ-XØ%6ˆDÔ"àÐ%¨.¸DÔ<OÒ*OÐ*OØ"0ˆDÔÝ*<¸TÔ=PÑ*QÔ*QˆDÔ'à -Ð/Ð/ÝÐ=Ñ>Ô>Ð>Ø.ˆÔàÐ%¨.¸DÔ<OÒ*OÐ*OÝ˜Ñ'Ô'­3Ò.Ð.Ð.Ð.Ø! QÒ&Ð&Ð&Ð&Ø"0ˆDÔàÐ)Ð.@ÀDÔD[Ò.[Ð.[ÝÐ*Ñ+Ô+­sÒ2Ð2Ð2Ð2Ø%¨Ò*Ð*Ð*Ð*Ø&8ˆDÔ#Ð#Ð#ð *Ð)Ð.[Ð.[rL   c                 ó   — | j         S )zv
        Get number of currently connected clients.

        :returns: Number of currently connected clients.
        )r’  rR   s    r9   ÚgetConnectionCountz)WebSocketServerFactory.getConnectionCount`  s   € ð Ô$Ð$rL   )NNNNN)NNNNNNNNNNNNNNNNNNNNNNFNN)rn   ro   rp   r{   r$   r  r3  r5   r
   rT   r/  r0  r>  r@  rq   rL   r9   r%   r%   m  s  € € € € € ðð ð '€Hðð €Hðð
 ØØ+×2Ò2°;Ñ?Ô?ØØ"ð "ð  "ð  "ð  "ðF "&Ø'+Ø$(Ø%)Ø*.ð)ð )ð )ð )ð8-$ð -$ð -$ð` %)Ø%)Ø04Ø,0Ø59Ø%)Ø/3Ø15Ø,0Ø&*Ø/3Ø04Ø15Ø&*Ø7;Ø,0Ø+/Ø(,Ø7;Ø26Ø-1Ø*.Ø+0Ø*.Ø.2ð3s9ð s9ð s9ð s9ðj%ð %ð %ð %ð %rL   r%   c                   ó’   — e Zd ZdZej        ej        z   Zdede	e
         fd„Zdedefd„Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r&   z4
    Protocol base class for WebSocket clients.
    rá   rß   c                 ó   — dS )aÅ  
        Callback fired after the connection is established, but before the
        handshake has started. This may return a
        :class:`autobahn.websocket.types.ConnectingRequest` instance
        (or a future which resolves to one) to control aspects of the
        handshake (or None for defaults)

        :param transport_details: Details of the transport underlying the WebSocket connection being established.

        :returns: A :class:`autobahn.websocket.types.ConnectingRequest`
            instance is returned to indicate which options should be
            used for this connection. If you wish to use the default
            behavior, ``None`` may be returned (this is the default).
        Nrq   )rS   rá   s     r9   ÚonConnectingz$WebSocketClientProtocol.onConnectingp  ó   € € € rL   rú  c                 ó   — dS )zò
        Callback fired directly after WebSocket opening handshake when new WebSocket
        connection was established from the client to a server.

        :param response: WebSocket connection response information sent by server.
        Nrq   )rS   rú  s     r9   r�  z!WebSocketClientProtocol.onConnect€  rD  rL   c                 ó&  — | j                              dt          | j        ¦  «        | j        ¬¦  «         t
                               | ¦  «         | j        j        s"| j        j        �|  	                    ¦   «          dS |  
                    ¦   «          dS )aC  
        Called by network framework when new transport connection to server was established. Default
        implementation will start the initial WebSocket opening handshake (or proxy connect).
        When overriding in derived class, make sure to call this base class
        implementation _before_ your code.
        r�  r‘  N)rä   rå   r   rŠ  rZ  r"   r2  r3  rx  ÚstartProxyConnectÚstartHandshakerR   s    r9   rŠ  z'WebSocketClientProtocol._connectionMadeˆ  s–   € ð 	Œ�ŠÐEÝ" 4Ô#7Ñ8Ô8¸t¼yð 	ñ 	Jô 	Jð 	Jå×)Ò)¨$Ñ/Ô/Ð/àŒ|Ô$ð 	"¨¬Ô);Ð)Gà×"Ò"Ñ$Ô$Ð$Ð$Ð$ð ×ÒÑ!Ô!Ð!Ð!Ð!rL   c                 óÀ   — | j                              dt          | j        ¦  «        | j        t          |¦  «        ¬¦  «         t                               | |¦  «         dS )a  
        Called by network framework when established transport connection to server was lost. Default
        implementation will tear down all state properly.
        When overriding in derived class, make sure to call this base class
        implementation _after_ your code.
        r”  r•  N)rä   rå   r   r�  rZ  r   r"   ri  s     r9   r�  z'WebSocketClientProtocol._connectionLostš  sa   € ð 	Œ�ŠÐPÝ" 4Ô#7Ñ8Ô8¸t¼yÕQVÐW]ÑQ^ÔQ^ð 	ñ 	`ô 	`ð 	`å×)Ò)¨$°Ñ7Ô7Ð7Ð7Ð7rL   c                 óF  — d                      | j        j        | j        j        ¦  «        }|d                      | j        j        | j        j        ¦  «        z  }|dz  }| j                             d|¬¦  «         |                      |                     d¦  «        ¦  «         dS )z,
        Connect to explicit proxy.
        zCONNECT {}:{} HTTP/1.1
úHost: {}:{}
rø  z	{request})r‹  r   N)r5   r2  r8   r2   rä   rå   r»  rØ  rŽ  s     r9   rG  z)WebSocketClientProtocol.startProxyConnect¥  sŽ   € ð 3×9Ò9¸$¼,Ô:KÈTÌ\ÔM^Ñ_Ô_ˆØÐ(×/Ò/°´Ô0AÀ4Ä<ÔCTÑUÔUÑUˆØ�:ÑˆàŒ�Š�{¨GˆÑ4Ô4Ð4à�Š�g—n’n VÑ,Ô,Ñ-Ô-Ð-Ð-Ð-rL   c                 ó@  — | j                              d¦  «        }|dk    �r|| j         d|dz   …         }| j                             d|¬¦  «         t	          |¦  «        \  }}}| j                             d|¬¦  «         | j                             d	|¬
¦  «         |                     ¦   «         }t          |¦  «        dk     r(|                      d                     |¦  «        ¦  «        S |d          	                    ¦   «         }|dvr(|                      d                     |¦  «        ¦  «        S 	 t          |d          	                    ¦   «         ¦  «        }nP# t          $ rC |                      d                     |d          	                    ¦   «         ¦  «        ¦  «        cY S w xY wd|cxk    rdk     s^n t          |¦  «        dk    rd                     |dd…         ¦  «        }	nd}	|                      d                     ||	¦  «        ¦  «        S | j         |dz   d…         | _         t          j        | _        t          | j         ¦  «        dk    r|                      ¦   «          | j        j        r|                      ¦   «          |                      ¦   «          dS dS )z<
        Process HTTP/CONNECT response from server.
        r˜  r   Nr³   z%received HTTP response:

{response}

rù  z>received HTTP status line for proxy connect request : {status}rœ  z;received HTTP headers for proxy connect request : {headers}rŸ  r²   ú"Bad HTTP response status line "{}")úHTTP/1.1zHTTP/1.0r¤  r}   úBad HTTP status code "{}"éÈ   i,  ú r[  z$HTTP proxy connect failed ({}): "{}")rƒ   r‚   rä   rå   rŒ   rc  r?   ÚfailProxyConnectr5   r�   r  r4   r	  r"   rD  r  r¦  r2  rÓ  ÚstartTLSrH  )
rS   r™  r
  r…   r†   r‡   ÚslÚhttp_versionÚstatus_coder  s
             r9   rª  z+WebSocketClientProtocol.processProxyConnect³  sÌ  € ð œ	ŸšÐ':Ñ;Ô;ˆØ˜AÒÑà!%¤Ð+=¨M¸AÑ,=Ð+=Ô!>ÐØŒH�NŠNØ;Ø+ð ñ ô ð õ BQÐQcÑAdÔAdÑ>Ð˜|Ð-=ð ŒH�NŠNØPØ'ð ñ ô ð ð ŒH�NŠNØMØ$ð ñ ô ð ð "×'Ò'Ñ)Ô)ˆBÝ�2‰wŒw˜Š{ˆ{Ø×,Ò,Ð-Q×-XÒ-XÐYiÑ-jÔ-jÑkÔkÐkð ˜aœ5Ÿ;š;™=œ=ˆLØÐ#;Ð;Ð;Ø×,Ò,Ð-L×-SÒ-SÐT`Ñ-aÔ-aÑbÔbÐbð`Ý! " Q¤%§+¢+¡-¤-Ñ0Ô0��øÝð `ð `ð `Ø×,Ò,Ð-H×-OÒ-OÐPRÐSTÔPU×P[ÒP[ÑP]ÔP]Ñ-^Ô-^Ñ_Ô_Ð_Ð_Ð_ð`øøøð ˜;Ð,Ð,Ò,Ð,¨Ò,Ð,Ð,Ð,õ
 �r‘7”7˜Q’;�;Ø ŸXšX b¨¨¨¤fÑ-Ô-�F�Fà�FØ×,Ò,Ð-S×-ZÒ-ZÐ[fÐhnÑ-oÔ-oÑpÔpÐpð œ	 -°!Ñ"3Ð"4Ð"4Ô5ˆDŒIõ +Ô;ˆDŒJõ �4”9‰~Œ~ Ò!Ð!Ø× Ò Ñ"Ô"Ð"ð Œ|Ô$ð  Ø—’‘”�Ø×ÒÑ!Ô!Ð!Ð!Ð!ðM Ðs   Ä1'E ÅA
F&Æ%F&c                 ój   — | j                              d|¬¦  «         |                      d¬¦  «         dS )z‡
        During initial explicit proxy connect, the server response indicates some failure and we drop the
        connection.
        z"failing proxy connect ('{reason}')rg  Tr!  N)rä   rå   r4  ri  s     r9   rR  z(WebSocketClientProtocol.failProxyConnect  s:   € ð
 	Œ�ŠÐ;ÀFˆÑKÔKÐKØ×Ò $ÐÑ'Ô'Ð'Ð'Ð'rL   c                 ó,  ‡ — ‰ j                              dt          ‰ j        ¦  «        t	          ‰ j                             ¦   «         ¦  «        ¬¦  «         t          j        ‰ j	        ‰ j        ¦  «        }ˆ fd„}ˆ fd„}t          j
        |||¦  «         |S )z4
        Start WebSocket opening handshake.
        zF{meth}: starting handshake with transport_details=
{transport_details})Úmethrá   c           	      óî   •— | €\t          ‰j        j        ‰j        j        ‰j        j        ‰j        j        ‰j        j        ‰j        j        ‰j        j        ¬¦  «        } ‰ 	                    | ¦  «         | S )zE
            onConnecting succeeded and returned options
            N)r8   r2   r3  r   Ú	useragentr²  rå  )
r   r2  r8   r2   r3  r   r[  r²  rå  Ú_actuallyStartHandshake)Úrequest_optionsrS   s    €r9   Úgot_optionsz;WebSocketClientProtocol.startHandshake.<locals>.got_options  su   ø€ ð Ð&õ #4àœÔ*ØœÔ*Ø!œ\Ô2à œLÔ0Ø"œlÔ4Øœ<Ô.Ø"œlÔ4ð
#ñ 
#ô 
#�ð ×(Ò(¨Ñ9Ô9Ð9Ø"Ð"rL   c                 ó’   •— ‰j                              d| t          ‰j        ¦  «        ¬¦  «         ‰                     d¬¦  «         d S )Nz"{meth} onConnecting failed: {fail})r  rY  Fr!  )rä   r  r   rH  r4  ©r  rS   s    €r9   Úoptions_failedz>WebSocketClientProtocol.startHandshake.<locals>.options_failed,  sR   ø€ ØŒH�NŠNØ4ØÝ˜DÔ/Ñ0Ô0ð ñ ô ð ð
 ×Ò eÐÑ,Ô,Ð,à�4rL   )rä   rå   r   rH  r   rÞ   ÚmarshalrÙ   rÖ  rC  r  )rS   Ú	options_dr^  ra  s   `   r9   rH  z&WebSocketClientProtocol.startHandshake
  s¸   ø€ ð 	Œ�ŠÐ`Ý" 4Ô#6Ñ7Ô7Ý)0°Ô1H×1PÒ1PÑ1RÔ1RÑ)SÔ)Sð 	ñ 	Uô 	Uð 	Uõ ”O DÔ$5°tÔ7NÑOÔOˆ	ð	#ð 	#ð 	#ð 	#ð 	#ð,	ð 	ð 	ð 	ð 	õ 	Ô˜I {°NÑCÔCÐCØÐrL   c                 ór  — d                      |j        ¦  «        }|j        �(|j        dk    r|d                      |j        ¦  «        z  }|d                      |j        |j        ¦  «        z  }|dz  }|dz  }|dz  }|d	z  }|j                             ¦   «         D ]'}|d
                      |d         |d         ¦  «        z  }Œ(t          j        t          j
        d¦  «        ¦  «        | _        |d                      | j                             ¦   «         ¦  «        z  }|j        rF| j        dk    r|d                      |j        ¦  «        z  }n|d                      |j        ¦  «        z  }t          |j        ¦  «        dk    r0|d                      d                     |j        ¦  «        ¦  «        z  }g }| j        D ])}|                     |                     ¦   «         ¦  «         Œ*t          |¦  «        dk    r+|d                      d                     |¦  «        ¦  «        z  }|d                      t*          j        | j                 ¦  «        z  }|dz  }|                     d¦  «        | _        |                      | j        ¦  «         | j                             dt9          | j        ¦  «        |¬¦  «         dS )zˆ
        Internal helper.

        Actually send the WebSocket opening handshake after receiving
        valid request options.
        zGET {} HTTP/1.1
Nr[  zUser-Agent: {}
rK  ró  rô  zPragma: no-cache
zCache-Control: no-cache
rõ  r   r}   r¯   zSec-WebSocket-Key: {}
r˜   zOrigin: {}
zSec-WebSocket-Origin: {}
rö  rZ  r÷  zSec-WebSocket-Version: {}
rø  r   z${meth}: sent HTTP request:
{request})rY  r‹  )r5   r3  r[  r8   r2   r   r  r  r  r*  r+  Úwebsocket_keyr   r²  rÒ   r?   rå  r	  rÖ   r÷   rÿ  r"   ro  rØ  r¾  r»  rä   rå   r   r\  )rS   r]  r‹  r  re  r  s         r9   r\  z/WebSocketClientProtocol._actuallyStartHandshake8  sÄ  € ð ,×2Ò2°?Ô3KÑLÔLˆàÔ$Ð0°_Ô5NÐRTÒ5TÐ5TØÐ/×6Ò6°Ô7PÑQÔQÑQˆGàÐ(×/Ò/°Ô0DÀoÔFZÑ[Ô[Ñ[ˆØÐ/Ñ/ˆØÐ0Ñ0ˆð 	Ð-Ñ-ˆØÐ4Ñ4ˆð "Ô)×/Ò/Ñ1Ô1ð 	=ð 	=ˆBØÐ'×.Ò.¨r°!¬u°b¸´eÑ<Ô<Ñ<ˆGˆGõ $Ô-­b¬j¸©n¬nÑ=Ô=ˆÔØÐ2×9Ò9¸$Ô:L×:SÒ:SÑ:UÔ:UÑVÔVÑVˆð Ô!ð 	]ØŒ|˜bÒ Ð ØÐ/×6Ò6°Ô7MÑNÔNÑN��àÐ=×DÒDÀ_ÔE[Ñ\Ô\Ñ\�õ ˆÔ(Ñ)Ô)¨AÒ-Ð-ØÐ;×BÒBÀ3Ç8Â8ÈOÔLeÑCfÔCfÑgÔgÑgˆGð ˆ
ð Ô5ð 	<ð 	<ˆEØ×Ò˜e×8Ò8Ñ:Ô:Ñ;Ô;Ð;Ð;åˆz‰?Œ?˜QÒÐØÐ=×DÒDÀSÇXÂXÈjÑEYÔEYÑZÔZÑZˆGð 	Ð6×=Ò=Õ>OÔ>hÐimÔiuÔ>vÑwÔwÑwˆà�:Ñˆà!(§¢°Ñ!7Ô!7ˆÔØ�Š�dÔ,Ñ-Ô-Ð-àŒ�ŠÐ>ÅVÈDÔLhÑEiÔEiØ&ð 	ñ 	(ô 	(ð 	(ð 	(ð 	(rL   c                 ó  ‡ — ‰ j                              d¦  «        }|dk    �rÜ‰ j         d|dz   …         ‰ _        ‰ j                             dt          ‰ j        ¦  «        ‰ j                             d¦  «        ¬¦  «         t          ‰ j        ¦  «        \  ‰ _	        ‰ _
        }‰ j                             d‰ j	        ¬	¦  «         ‰ j                             d
‰ j
        ¬¦  «         ‰ j	                             ¦   «         }t          |¦  «        dk     r-‰                      d                     ‰ j	        ¦  «        ¦  «        S |d                              ¦   «         }|dk    r(‰                      d                     |¦  «        ¦  «        S 	 t!          |d                              ¦   «         ¦  «        }nP# t"          $ rC ‰                      d                     |d                              ¦   «         ¦  «        ¦  «        cY S w xY w|dk    r\t          |¦  «        dk    rd                     |dd…         ¦  «        }nd}‰                      d                     ||¦  «        ¦  «        S d‰ j
        vr‰                      d¦  «        S ‰ j
        d                              ¦   «                              ¦   «         dk    r3‰                      d                     ‰ j
        d         ¦  «        ¦  «        S d‰ j
        vr‰                      d¦  «        S d}‰ j
        d                              d¦  «        D ]0}|                     ¦   «                              ¦   «         dk    rd} nŒ1|s3‰                      d                     ‰ j
        d         ¦  «        ¦  «        S d ‰ j
        vr‰                      d!¦  «        S |d          dk    r‰                      d"¦  «        S ‰ j
        d                               ¦   «         }	t)          j        ¦   «         }
|
                     ‰ j        t0          j        z   ¦  «         t5          j        |
                     ¦   «         ¦  «                             ¦   «         }|	|k    r)‰                      d#                     ||	¦  «        ¦  «        S g ‰ _        d$‰ j
        v �r–|d$         dk    r‰                      d%¦  «        S ‰                      ‰ j
        d$         ¦  «        }|D �]Q\  }}‰ j                             d&||¬'¦  «         |t>          v rý‰ j         �‰                      d(¦  «        c S t>          |         }	 |d)          !                    |¦  «        }n;# tD          $ r.}‰                      tG          |¦  «        ¦  «        cY d}~c S d}~ww xY w‰  $                    |¦  «        }|€‰                      d*¦  «        c S |d+          %                    ‰ j&        j'        |¦  «        ‰ _         ‰ j         (                    ‰ j         ¦  «         �Œ)‰                      d,                     |¦  «        ¦  «        c S d‰ _)        d-‰ j
        v r›|d-         dk    r‰                      d.¦  «        S tG          ‰ j
        d-                              ¦   «         ¦  «        }|dk    rH|‰ j&        j*        vr3‰                      d/                     |‰ j&        j*        ¦  «        ¦  «        S |‰ _)        ‰ j         |dz   d…         ‰ _         t0          j+        ‰ _,        ‰ j-        �:‰ j                             d0¦  «         ‰ j-         .                    ¦   «          d‰ _-        d‰ _/        d‰ _0        ‰ j1        ‰ _2        ‰ j3        r/‰ j&        j4         5                    ‰ j3        ‰ j6        ¦  «        ‰ _7        tq          ‰ j9        ‰ j
        ‰ j2        ‰ j)        ‰ j        ¦  «        }tu          j;        ‰ j<        |¦  «        }ˆ fd1„}ˆ fd2„}tu          j=        |||¦  «         |S dS )3zK
        Process WebSocket opening handshake response from server.
        r˜  r   Nr³   z*{meth}: received HTTP response:
{response}r   )rY  rú  r›  rœ  rž  rŸ  r²   rM  rN  r¤  r}   rO  ée   rQ  r[  z,WebSocket connection upgrade failed [{}]: {}r¦  rª  r«  zGHTTP Upgrade header different from "websocket" (case-insensitive): "{}"r¬  r­  FrZ  TzPHTTP Connection header does not include "upgrade" value (case-insensitive): "{}"zsec-websocket-acceptzCHTTP Sec-WebSocket-Accept header missing in opening handshake replyzRHTTP Sec-WebSocket-Accept header appears more than once in opening handshake replyz<HTTP Sec-WebSocket-Accept bogus value : expected {} / got {}rµ  zVHTTP Sec-WebSocket-Extensions header appears more than once in opening handshake replyrí  rî  z6multiple occurrence of a permessage-compress extensionÚResponsezMWebSocket permessage-compress extension response from server denied by clientrð  z]server wants to use extension "{}" we did not request, have not implemented or did not enabler°  zTHTTP Sec-WebSocket-Protocol header appears more than once in opening handshake replyzTsubprotocol selected by server "{}" not in subprotocol list requested by client "{}"rû  c                 ó:  •— ‰j                              d| ¬¦  «         ‰j        r‰j                             d¦  «         ‰                     ¦   «          t          j        ‰j        d ¦  «         t          ‰j	        ¦  «        dk    r‰ 
                    ¦   «          d S d S )Nz;onConnect callback completed successfully with result={res})r7   ræ   r   )rä   rå   r
  r•   r  rÙ   r^  rÜ   r?   rƒ   r¦  )r7   rS   s    €r9   Úon_connect_successzDWebSocketClientProtocol.processHandshake.<locals>.on_connect_successK  s“   ø€ Ø”—’Ð\Ðbe�ÑfÔfÐfØÔ&ð 8ØÔ'×-Ò-¨hÑ7Ô7Ð7Ø—’‘”�Ý”˜dœl¨DÑ1Ô1Ð1Ý�t”y‘>”> AÒ%Ð%Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&ð &Ð%rL   c                 ó’   •— ‰j                              d| ¬¦  «         ‰                     dd                     | ¦  «        ¦  «         d S )NzonConnect failed with {fail}r  r´   z{})rä   r  ra  r5   r`  s    €r9   Úon_connect_failedzCWebSocketClientProtocol.processHandshake.<locals>.on_connect_failedT  sP   ø€ Ø”—’Ø2Øð ñ ô ð ð ×%Ò% d¨D¯KªK¸Ñ,=Ô,=Ñ>Ô>Ð>Ð>Ð>rL   )>rƒ   r‚   r
  rä   rå   r   r«  r   rŒ   r…   r†   rc  r?   r¹  r5   r�   r  r4   r	  r.   r  r  r  re  r"   rr  r  r  r	  rý  rk  r   rv  r	   r:  r1  rÊ   Úcreate_from_response_acceptr2  r3  r÷   rü  rå  r  r  rC  r1  rÔ  rÒ  rÒ   rö   rÂ   r†  r5  r  rƒ  r   rZ  rÙ   rÖ  Ú
_onConnectr  )rS   r™  r‡   rT  rU  rV  r  rá  râ  Úsec_websocket_accept_gotr  r  rÔ  rh  ri  rð  ÚpmceResponser·  r  Úsprú  rŸ   rj  rl  s   `                       r9   r«  z(WebSocketClientProtocol.processHandshake‚  s9	  ø€ ð œ	ŸšÐ':Ñ;Ô;ˆØ˜AÒÑà-1¬YÐ7I¸ÈÑ8IÐ7IÔ-JˆDÔ#ØŒH�NŠNÐHÍvÐVZÔVkÑOlÔOlØ$(Ô$;×$BÒ$BÀ6Ñ$JÔ$Jð ñ Lô Lð Lõ
 L[Ð[_Ô[rÑKsÔKsÑHˆTÔ" DÔ$5Ð7Gð ŒH�NŠNØKØÔ,ð ñ ô ð ð ŒH�NŠNØHØÔ)ð ñ ô ð ð Ô&×,Ò,Ñ.Ô.ˆBÝ�2‰wŒw˜Š{ˆ{Ø×)Ò)Ð*N×*UÒ*UÐVZÔVkÑ*lÔ*lÑmÔmÐmð ˜aœ5Ÿ;š;™=œ=ˆLØ˜zÒ)Ð)Ø×)Ò)Ð*I×*PÒ*PÐQ]Ñ*^Ô*^Ñ_Ô_Ð_ð]Ý! " Q¤%§+¢+¡-¤-Ñ0Ô0��øÝð ]ð ]ð ]Ø×)Ò)Ð*E×*LÒ*LÈRÐPQÌUÏ[Ê[É]Ì]Ñ*[Ô*[Ñ\Ô\Ð\Ð\Ð\ð]øøøà˜cÒ!Ð!õ
 �r‘7”7˜Q’;�;Ø ŸXšX b¨¨¨¤fÑ-Ô-�F�Fà�FØ×)Ò)Ð*X×*_Ò*_Ð`kÐmsÑ*tÔ*tÑuÔuÐuð  Ô 1Ð1Ð1Ø×)Ò)Ð*GÑHÔHÐHØÔ  Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;¸{ÒJÐJØ×)Ò)Ð*s×*zÒ*zÐ{ô  |Mð  NWô  |Xñ  +Yô  +Yñ  Zô  Zð  Zð  4Ô#4Ð4Ð4Ø×)Ò)Ð*JÑKÔKÐKØ %ÐØÔ& |Ô4×:Ò:¸3Ñ?Ô?ð ð �Ø—7’7‘9”9—?’?Ñ$Ô$¨	Ò1Ð1Ø(,Ð%Ø�Eð 2ð %ð fØ×)Ò)Ð*|÷  +Dò  +Dð  EIô  EVð  Wcô  Edñ  +eô  +eñ  fô  fð  fð &¨TÔ->Ð>Ð>Ø×)Ò)Ð*oÑpÔpÐpà#Ð$:Ô;¸aÒ?Ð?Ø×-Ò-ð  /Cñ  Dô  Dð  DØ+/Ô+<Ð=SÔ+T×+ZÒ+ZÑ+\Ô+\Ð(å”|‘~”~�Ø—’˜DÔ.Õ1BÔ1LÑLÑMÔMÐMÝ'-Ô'7¸¿º¹¼Ñ'FÔ'F×'MÒ'MÑ'OÔ'OÐ$à+Ð/CÒCÐCØ×-Ò-Ð.l×.sÒ.sð  uIð  Kcñ  /dô  /dñ  eô  eð  eð 02ˆDÔ,à)¨TÔ->Ð>Ñ>à#Ð$>Ô?À!ÒCÐCØ×-Ò-ð  /Gñ  Hô  Hð  Hð ,0×+FÒ+FÀtÔGXÐYsÔGtÑ+uÔ+uÐ(ð ,@ð "eñ "eÑ'�Y à”H—N’NØYØ"+Ø%ð #ñ ô ð ð !Õ$DÐDÐDð  Ô3Ð?Ø#'×#5Ò#5Ð6nÑ#oÔ#oÐoÐoÐoå?À	ÔJ˜ð>Ø+/°
Ô+;×+AÒ+AÀ&Ñ+IÔ+I˜L˜LøÝ(ð >ð >ð >Ø#'×#5Ò#5µc¸!±f´fÑ#=Ô#=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð>øøøð "&×!AÒ!AÀ,Ñ!OÔ!O˜à!˜>Ø#'×#5Ò#5ð  7Fñ  $Gô  $Gð  Gð  Gð  Gà37¸´<×3[Ò3[Ð\`Ô\hÔ\qÐsyÑ3zÔ3z˜Ô0àÔ8×?Ò?ÀÔ@XÑYÔYÐYÑYð  $×1Ò1ð  3R÷  3Yò  3Yð  Zcñ  3dô  3dñ   eô   eð  eð  eð  eð .2ˆDÔ*Ø'¨4Ô+<Ð<Ð<Ø#Ð$<Ô=ÀÒAÐAØ×-Ò-ð  /Eñ  Fô  Fð  FÝ˜Ô*Ð+CÔD×JÒJÑLÔLÑMÔM�Ø˜’8�8Ø ¤Ô!7Ð7Ð7Ø#×1Ò1ð  3I÷  3Pò  3Pð  QSð  UYô  Uaô  Ukñ  3lô  3lñ   mô   mð  mð :<˜Ô6ð œ	 -°!Ñ"3Ð"4Ð"4Ô5ˆDŒIõ +Ô5ˆDŒJð Ô,Ð8Ø”—’Ð@ÑAÔAÐAØÔ-×4Ò4Ñ6Ô6Ð6Ø04�Ô-ð #(ˆDÔØ!%ˆDÔØ%)¤\ˆDÔ"ð Ô$ð Ø+/¬<Ô+F×+QÒ+QØÔ)ØÔ&ñ,ô ,�Ô(õ *¨$¬)Ø*.Ô*;Ø*.Ô*@Ø*.Ô*HØ*.Ô*Jñ	Lô LˆHõ ” ¤°Ñ:Ô:ˆAð'ð 'ð 'ð 'ð 'ð?ð ?ð ?ð ?ð ?õ Ô Ð#5Ð7HÑIÔIÐIØˆHðg Ðs1   Æ'F/ Æ/A
G<Ç;G<Ô8UÕ
VÕ!VÕ?VÖVc                 óx   — || _         | j                             d|¬¦  «         |                      d¬¦  «         dS )zm
        During opening handshake the server response is invalid and we drop the
        connection.
        r  rg  Tr!  N)r@  rä   r  r4  ri  s     r9   r¹  z%WebSocketClientProtocol.failHandshake^  sN   € ð
 "(ˆÔØŒ�ŠØ>Øð 	ñ 	
ô 	
ð 	
ð 	×Ò $ÐÑ'Ô'Ð'Ð'Ð'rL   N)rn   ro   rp   r{   r"   r~  r€  rr  r   r   r   rC  r   ÚNoneTyper�  rŠ  r�  rG  rª  rR  rH  r\  r«  r¹  rq   rL   r9   r&   r&   i  s  € € € € € ðð ð %Ô8Ð;LÔ;`Ñ`€LðÐ.>ð À8ÐL]ÔC^ð ð ð ð ð Ð"4ð ¸ð ð ð ð ð"ð "ð "ð$	8ð 	8ð 	8ð.ð .ð .ðM"ð M"ð M"ð^(ð (ð (ð,ð ,ð ,ð\H(ð H(ð H(ðTZð Zð Zðx
(ð 
(ð 
(ð 
(ð 
(rL   r&   c                   ó¢   — e Zd ZdZeZ	 dZ	 dddd                     e¦  «        ddfd„Z		 	 	 	 	 	 d	d„Z
d„ Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
d„ZdS )r'   zˆ
    A protocol factory for WebSocket clients.

    Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory`
    FNr'  c                 óè   — d| _         d| _        d| _        t          j        dd¬¦  «        | _        t          j        ¦   «          |                      ||||||¦  «         |  	                    ¦   «          dS )zj
        Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.__init__`
        Fr)  r´   r*  N)
rµ   r¶   r·   rÙ   r-  r†  r  r.  r/  r0  )rS   r6   r²  rå  r[  r   rx  s          r9   rT   zWebSocketClientFactory.__init__|  sƒ   € ð ˆŒØˆŒØ!ˆÔõ $Ô6Ø Øð
ñ 
ô 
ˆÔõ 	Œ‰Œˆð 	×!Ò! # v¨y¸)ÀWÈeÑTÔTÐTð 	×!Ò!Ñ#Ô#Ð#Ð#Ð#rL   c                 óæ   — t          |pd¦  «        \  }}}	}
}}|| _        || _        || _        |	| _        |
| _        || _        || _        || _        |pg | _	        || _
        |pi | _        || _        dS )zv
        Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.setSessionParameters`
        r2  N)r   r6   rÓ  r8   r2   r3  rÝ  ri  r²  rå  r[  r   rx  )rS   r6   r²  rå  r[  r   rx  rÓ  r8   r2   r3  rÝ  ri  s                r9   r/  z+WebSocketClientFactory.setSessionParameters›  s…   € õ :CÀ3ÐCZÐJZÑ9[Ô9[Ñ6ˆ�4˜˜x¨¨vØˆŒØ ˆŒØˆŒ	ØˆŒ	Ø ˆŒØˆŒ	ØˆŒàˆŒØ"˜ bˆŒØ"ˆŒØ�} "ˆŒàˆŒ
ˆ
ˆ
rL   c                 ó4  — t           j        | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        g | _        d„ | _        d| _        d| _        d| _        d| _        dS )	zv
        Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.resetProtocolOptions`
        TFr   r}   r5  c                 ó   — d S rP   rq   r7  s    r9   r8  z=WebSocketClientFactory.resetProtocolOptions.<locals>.<lambda>Ì  r9  rL   r«   N)r"   rq  rÒ   r¸   rÓ   rÔ   r¹   rº   r»   r¼   r½   r¾   rÕ   r¿   rÀ   rÁ   rÖ   rÊ   rÂ   rÃ   rÄ   rÅ   rR   s    r9   r0  z+WebSocketClientFactory.resetProtocolOptions¶  s±   € õ )Ô=ˆŒØ$(ˆÔ!Ø(-ˆÔ%Ø $ˆÔØˆŒØ#$ˆÔ Ø%&ˆÔ"Ø !ˆÔØˆŒØ#(ˆÔ Ø+,ˆÔ(Ø$%ˆÔ!Ø%&ˆÔ"ØˆŒð ,.ˆÔ(Ø+9¨>ˆÔ(ð !"ˆÔØ ˆÔØˆÔð ,0ˆÔ(Ð(Ð(rL   c                 óZ  — |�M|t           j        vr-t          d                     |t           j        ¦  «        ¦  «        ‚|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j	        k    r|| _	        |�|| j
        k    r|| _
        |�|| j        k    r|| _        |	�|	| j        k    r|	| _        |
�|
| j        k    r|
| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |��t%          j        |¦  «        t%          j        | j        ¦  «        k    rat+          |¦  «        t,          k    rt/          j        |¦  «        | _        n/t          d                     t+          |¦  «        ¦  «        ¦  «        ‚|�|| j        k    r|| _        |�|| j        k    r|| _        |�|| j        k    r|| _        |�U|| j        k    rJt+          |¦  «        t:          k    st+          |¦  «        t<          k    sJ ‚d|cxk    rdk    sn J ‚|| _        |�.|| j        k    r%t+          |¦  «        t@          k    sJ ‚|| _        dS dS dS )zt
        Implements :func:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory.setProtocolOptions`
        Nz7invalid WebSocket draft version {} (allowed values: {})z?invalid type {} for perMessageCompressionOffers - expected listr«   rË  )!r"   rm  r:  r5   rÒ   r¸   rÓ   rÔ   r¹   rº   r»   r¼   r½   r¾   rÕ   r¿   rÀ   rÁ   Úpicklerl   rÖ   r0  ÚlistÚcopyÚdeepcopyrÊ   rÂ   rÃ   rÄ   rh   r  rÅ   rM  )rS   rÒ   r¸   rÓ   rÔ   r¹   rº   r»   r¼   r½   r¾   rÕ   r¿   rÀ   rÁ   rÖ   rÊ   rÂ   rÃ   rÄ   rÅ   s                        r9   r>  z)WebSocketClientFactory.setProtocolOptions×  s~  € ð0 ÐØÕ/ÔGÐGÐGÝÐ Y× `Ò `ÐahÕj{ô  kTñ  !Uô  !Uñ  Vô  Vð  VØ˜$œ,Ò&Ð&Ø&�”àÐ+Ð0DÈÔHaÒ0aÐ0aØ(<ˆDÔ%à#Ð/Ð4LÐPTÔPmÒ4mÐ4mØ,DˆDÔ)àÐ'Ð,<ÀÔ@UÒ,UÐ,UØ$4ˆDÔ!àÐ  Y°$´.Ò%@Ð%@Ø&ˆDŒNàÐ*Ð/BÀdÔF^Ò/^Ð/^Ø':ˆDÔ$à Ð,Ð1FÈ$ÔJdÒ1dÐ1dØ)>ˆDÔ&àÐ'Ð,<ÀÔ@UÒ,UÐ,UØ$4ˆDÔ!àÐ! j°D´OÒ&CÐ&CØ(ˆDŒOàÐ*Ð/BÀdÔF^Ò/^Ð/^Ø':ˆDÔ$à&Ð2Ð7RÐVZÔVvÒ7vÐ7vØ/JˆDÔ,àÐ+Ð0DÈÔHaÒ0aÐ0aØ(<ˆDÔ%à Ð,Ð1FÈ$ÔJdÒ1dÐ1dØ)>ˆDÔ&àÐ! j°D´OÒ&CÐ&CØ(ˆDŒOà&Ð2µv´|ÐD_Ñ7`Ô7`ÕdjÔdpÐquô  rRñ  eSô  eSò  8Sð  8SÝÐ/Ñ0Ô0µDÒ8Ð8õ 48´=ÐA\Ñ3]Ô3]�Ô0Ð0åÐ a× hÒ hÕimð  oJñ  jKô  jKñ  !Lô  !Lñ  Mô  Mð  Mà&Ð2Ð7RÐVZÔVvÒ7vÐ7vØ/JˆDÔ,àÐ'Ð,<ÀÔ@UÒ,UÐ,UØ$4ˆDÔ!àÐ&¨?¸dÔ>RÒ+RÐ+RØ#2ˆDÔ àÐ#¨¸Ô8IÒ(IÐ(IÝ˜Ñ%Ô%­Ò.Ð.µ$°|Ñ2DÔ2DÍÒ2KÐ2KÐ2KÐ2KØ˜Ð,Ð,Ò,Ð,¨Ò,Ð,Ð,Ð,Ð,Ð,Ø ,ˆDÔà&Ð2Ð7RÐVZÔVvÒ7vÐ7vÝÐ3Ñ4Ô4½Ò<Ð<Ð<Ð<Ø/JˆDÔ,Ð,Ð,ð 3Ð2Ð7vÐ7vrL   )NNNNNN)NNNNNNNNNNNNNNNNNNNN)rn   ro   rp   r{   r&   r  r3  r5   r
   rT   r/  r0  r>  rq   rL   r9   r'   r'   k  s  € € € € € ðð ð '€Hðð €Hðð
 ØØØ.×5Ò5°kÑBÔBØØð$ð $ð $ð $ð@ "&Ø$(Ø'+Ø'+Ø%)Ø#'ðð ð ð ð60ð 0ð 0ðD $(Ø04Ø48Ø,0Ø%)Ø/3Ø15Ø,0Ø&*Ø/3Ø7;Ø04Ø15Ø&*Ø7;Ø7;Ø,0Ø+/Ø(,Ø7;ð)^Kð ^Kð ^Kð ^Kð ^Kð ^KrL   r'   )Lr›  r  r  rÕ  r  r*  rz  r|  rk   r  Útypingr   r   r   r   Úpprintr   Úcollectionsr   Úurllibr	   Úautobahnr
   Úautobahn.websocket.interfacesr   r   r   Úautobahn.websocket.typesr   r   r   r   Úautobahn.wamp.typesr   Úautobahn.utilr   r   r   r   r   r   r   Ú autobahn.websocket.utf8validatorr   Úautobahn.websocket.xormaskerr   r   Úautobahn.websocket.compressr   Úautobahn.websocket.utilr   Úautobahn.exceptionr   r    r!   rÙ   rÈ  r0  rs  Ú__all__r:   rK   ÚobjectrN   rs   rŒ   rŽ   r"   Úregisterrƒ  r#   r#  r$   r%   r&   r'   rq   rL   r9   ú<module>r�     s¸  ðð6 €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø €€€Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à  Ð  Ð  Ð  Ð  Ð  ð"ð "ð "ð "ð "ð "ð "ð "ð "ð "ð nÐ mÐ mÐ mÐ mÐ mÐ mÐ mÐ mÐ mÐ mÐ mØ 0Ð 0Ð 0Ð 0Ð 0Ð 0à WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ +Ð +Ð +Ð +Ð +Ð +Ø )Ð )Ð )Ð )Ð )Ð )Ø :Ð :Ð :Ð :Ð :Ð :Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ HÐ HÐ HÐ HÐ HÐ HØ -Ð -Ð -Ð -Ð -Ð -Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ +Ð +Ð +Ð +Ð +Ð +à €€€Ø Ð Ð Ð ð ˆ4�‰:Œ:€ð%€ðð ð ð:-ð -ð -ð`E+ð E+ð E+ð E+ð E+�6ñ E+ô E+ð E+ðPð ð ð ð �&ñ ô ð ð:*<ð *<ð *<ðZ;&ð ;&ð ;&ð ;&ð ;&ˆfñ ;&ô ;&ð ;&ð|fð fð fð fð f˜ñ fô fð fðR? Ð Ô Ð,Ñ -Ô -Ð -Ø "Ð Ô "Ð#4Ñ 5Ô 5Ð 5Ø &Ð Ô &Ð'8Ñ 9Ô 9Ð 9ðDcð Dcð Dcð Dcð Dc�fñ Dcô Dcð DcðNLð Lð Lð Lð L�vñ Lô Lð LðD!Ð ðHE
Mð E
Mð E
Mð E
Mð E
MÐ/ñ E
Mô E
Mð E
MðPy%ð y%ð y%ð y%ð y%Ð-ñ y%ô y%ð y%ðx(ð (ð (ð (ð (Ð/ñ (ô (ð (ðDJKð JKð JKð JKð JKÐ-ñ JKô JKð JKð JKð JKrL   