Ë
    ž…ÅjO ã                  óR  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ ddlmZ ddl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 ddlmZmZmZmZm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl.m5Z5m6Z6m7Z7 er†ddl8m9Z9 ddl%m:Z: ddl+m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZCmDZDmEZE ddlFmGZGmHZH  ed«      ZIe
d eJe;gdf   ZKe
d eJeLz  gdf   ZMe
d e-gdf   ZNe
d gdf   ZOe
d ePeLgdf   ZQeReJePf   ZSeReJeTz  eUz  e*ePz  f   ZVe G d!„ d"«      «       ZW G d#„ d$e«      ZX G d%„ d&e-«      ZY G d'„ d(eYe1«      ZZ G d)„ d*eYe2«      Z[d4d+„Z\ G d,„ d-«      Z]ed.   Z^e! G d/„ d e]«      «       Z_e! G d0„ d1e]«      «       Z`e! G d2„ d3«      «       Zay)5z0
The Curl CFFI WebSocket client implementation.
é    )ÚannotationsN)ÚInvalidStateError)Ú	AwaitableÚCallableÚ	Generator)Úsuppress)Ú	dataclassÚfield)ÚIntEnum©Údumps©Úloads)Úuniform)Úselect)ÚTYPE_CHECKINGÚFinalÚLiteralÚTypeVarÚcastÚfinalé   )ÚCURL_SOCKET_BADÚget_selector)Ú	CurlECodeÚ
CurlFollowÚCurlInfoÚCurlOptÚ
CurlWsFlag)ÚCurlÚ	CurlError)ÚCurlCffiWarningé   )ÚSessionClosedÚTimeout)ÚResponse)ÚNOT_SETÚ
NotSetTypeÚset_curl_options)ÚSelf)ÚCurlHttpVersion)ÚCurlWsFrame)ÚFingerprint)ÚCookieTypes)ÚHeaderTypes)ÚBrowserTypeLiteralÚExtraFingerprintsÚExtraFpDict)ÚAsyncSessionÚ	ProxySpecÚTÚ	WebSocketc                  óZ   — e Zd ZU dZdZded<   dZded<   dZd	ed
<    ed„ ¬«      Z	ded<   y)ÚWebSocketRetryStrategyuQ  Configurable WebSocket policy for retrying failed message receives.

    When enabled, each failed receive attempt will use exponential backoff with
    jitter.

    Calculation: ``delay * 2^(count - 1) Â± 10%``

    Args:
        retry: Enable or disable WebSocket message receive retry policy.
        delay: The base value (seconds) to compute the retry delay from.
        count: How many times to retry a receive operation before giving up.
        codes: Set of ``CurlECode`` values for which the receive operation
            should be retried. Default is ``CurlECode.RECV_ERROR``.
    FÚboolÚretryg333333Ó?ÚfloatÚdelayé   ÚintÚcountc                 ó$   — t         j                  hS ©N)r   Ú
RECV_ERROR© ó    úS/opt/euro-skaner/venv/lib/python3.12/site-packages/curl_cffi/requests/websockets.pyú<lambda>zWebSocketRetryStrategy.<lambda>H   s   € ¼9×;OÑ;OÐ:P€ rD   )Údefault_factoryzset[CurlECode]ÚcodesN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r:   Ú__annotations__r<   r?   r
   rH   rC   rD   rE   r8   r8   4   s6   … ñð €Eˆ4ÓØ€Eˆ5ÓØ€Eˆ3ƒNÙ!Ñ2PÔQ€Eˆ>ÔQrD   r8   c                  óX   — e 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y)ÚWsCloseCodez?See: https://www.iana.org/assignments/websocket/websocket.xhtmléè  ié  iê  ië  ií  iî  iï  ið  iñ  iò  ió  iô  iõ  iö  i÷  i¸  i»  iÀ  N)rI   rJ   rK   rL   ÚOKÚ
GOING_AWAYÚPROTOCOL_ERRORÚUNSUPPORTED_DATAÚUNKNOWNÚABNORMAL_CLOSUREÚINVALID_DATAÚPOLICY_VIOLATIONÚMESSAGE_TOO_BIGÚMANDATORY_EXTENSIONÚINTERNAL_ERRORÚSERVICE_RESTARTÚTRY_AGAIN_LATERÚBAD_GATEWAYÚTLS_HANDSHAKEÚUNAUTHORIZEDÚ	FORBIDDENÚTIMEOUTrC   rD   rE   rO   rO   K   sc   „ ÙIà	€BØ€JØ€NØÐØ€GØÐØ€LØÐØ€OØÐØ€NØ€OØ€OØ€KØ€MØ€LØ€IØ�GrD   rO   c                  ó2   ‡ — e Zd ZdZ	 d	 	 	 	 	 dˆ fd„Zˆ xZS )ÚWebSocketErrorzWebSocket-specific error.c                ó&   •— t         ‰| �  ||«       y rA   )ÚsuperÚ__init__)ÚselfÚmessageÚcodeÚ	__class__s      €rE   rg   zWebSocketError.__init__e   s   ø€ ô 	‰Ñ˜ $Õ'rD   )r   )ri   Ústrrj   z$WsCloseCode | CurlECode | Literal[0]ÚreturnÚNone)rI   rJ   rK   rL   rg   Ú__classcell__©rk   s   @rE   rd   rd   b   s/   ø„ Ù#ð JKð(Øð(Ø"Fð(à	÷(ñ (rD   rd   c                  ó   — e Zd ZdZy)ÚWebSocketClosedzWebSocket is already closed.N©rI   rJ   rK   rL   rC   rD   rE   rr   rr   k   s   „ ò 'rD   rr   c                  ó   — e Zd ZdZy)ÚWebSocketTimeoutzWebSocket operation timed out.Nrs   rC   rD   rE   ru   ru   q   s   „ ò )rD   ru   c                óF   — 	 | j                  d«       y# t        $ r Y yw xY w)as  
    Called by the event loop when fd becomes readable/writable.

    We try to set_result() and silently ignore InvalidStateError which is
    raised if the future was already finished/cancelled concurrently.
    This avoids spurious 'Exception in callback' traces in uvloop/asyncio.

    Intentionally using try/except, cheaper than checking if the future is done.
    N)Ú
set_resultr   )Úfuts    rE   Ú_safe_set_resultry   w   s%   € ðØ�‰�tÕøÜò Ùðús   ‚ ”	 Ÿ c                  óœ   — e Zd ZU dZded<   dddœ	 	 	 	 	 	 	 dd„Zedd„«       Zedd	„«       Zedd
„«       Z	e
dd„«       Ze
dd„«       Zdd„Zy)ÚBaseWebSocket©Ú_curlÚ	autocloseÚ_close_codeÚ_close_reasonÚdebugÚclosedztuple[str, ...]Ú	__slots__TF)r~   r�   c               óX   — || _         || _        d | _        d | _        || _        d| _        y )NFr|   )rh   Úcurlr~   r�   s       rE   rg   zBaseWebSocket.__init__‘   s0   € ð )-ˆŒ
Ø(ˆŒØ'+ˆÔØ)-ˆÔØ ˆŒ
Ø!ˆ�rD   c                ó„   — t        | j                  t        «      rt        | j                  ¬«      | _        | j                  S )z;Return reference to Curl associated with current WebSocket.)r�   )Ú
isinstancer}   r(   r    r�   ©rh   s    rE   r…   zBaseWebSocket.curl›   s,   € ô �d—j‘j¤*Ô-Ü D§J¡JÔ/ˆDŒJØ�z‰zÐrD   c                ó   — | j                   S )z<The WebSocket close code, if the connection has been closed.)r   rˆ   s    rE   Ú
close_codezBaseWebSocket.close_code¢   s   € ð ×ÑÐrD   c                ó   — | j                   S )z>The WebSocket close reason, if the connection has been closed.)r€   rˆ   s    rE   Úclose_reasonzBaseWebSocket.close_reason§   s   € ð ×!Ñ!Ð!rD   c                ó4   — t        j                  d| «      |z   S )Nú!H)ÚstructÚpack)rj   Úreasons     rE   Ú_pack_close_framezBaseWebSocket._pack_close_frame¬   s   € ä�{‰{˜4 Ó&¨Ñ/Ð/rD   c                óÆ  — t        | «      dk  rt        j                  }d}||fS 	 t        j                  d| «      d   }| dd  j                  «       }|t        j                  k(  s
|dk  s|dk\  rt        d	|› �t        j                  «      ‚||fS # t        $ r }t        dt        j                  «      |‚d }~wt        $ r }t        dt        j                  «      |‚d }~ww xY w)
Nr   Ú rŽ   r   zInvalid close messagezInvalid close framerP   iˆ  zInvalid close code: )ÚlenrO   rU   r�   Úunpack_fromÚdecodeÚUnicodeDecodeErrorrd   rW   Ú	ExceptionrS   )Úframerj   r‘   Úes       rE   Ú_unpack_close_framez!BaseWebSocket._unpack_close_frame°   só   € äˆu‹:˜Š>Ü#×+Ñ+ˆDØˆFð& �Vˆ|Ðð#
Ü×)Ñ)¨$°Ó6°qÑ9�Ø˜q˜r˜×)Ñ)Ó+�ð ”{×*Ñ*Ò*¨d°Tªk¸TÀTº\Ü$Ø*¨4¨&Ð1´;×3MÑ3Móð ð �Vˆ|Ðøô &ò Ü$Ø+¬[×-EÑ-Eóàðûô ò Ü$Ø)¬;×+EÑ+Eóàðûðús#   ¦,B Â	C ÂB4Â4C Ã CÃC c                óF   — d| _         | j                  j                  «        y)z$Terminate the underlying connection.TN)r‚   r…   Úcloserˆ   s    rE   Ú	terminatezBaseWebSocket.terminateÉ   s   € àˆŒØ�	‰	�‰ÕrD   N)r…   úCurl | NotSetTyper~   r9   r�   r9   rm   rn   )rm   r    )rm   z
int | None)rm   ú
str | None)rj   r>   r‘   Úbytesrm   r¢   )rš   r¢   rm   ztuple[int, str]©rm   rn   )rI   rJ   rK   rƒ   rM   rg   Úpropertyr…   rŠ   rŒ   Ústaticmethodr’   rœ   rŸ   rC   rD   rE   r{   r{   ‡   s§   … ð"€Iˆó ð =AÐPUñ"Ø%ð"Ø59ð"ØIMð"à	ó"ð òó ðð ò ó ð ð ò"ó ð"ð ò0ó ð0ð òó ðô0rD   r{   )Úopenrž   Údatari   Úerrorc                  óä  ‡ — e Zd ZdZdZefdddddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd d„Zd!d	„Z	 	 	 	 	 	 d"d
„Z	ddddeddddddddddddddddddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#d„Z
d$d„Zd%d„Zd&d„Zedœd'd„Zej"                  f	 	 	 	 	 d(d„Zd)d„Zd*d„Zd+d„Zedœ	 	 	 	 	 d,d„Zd-d„Zd.d/d„Zej6                  dfd0d„Zˆ xZS )1r6   z)A WebSocket implementation using libcurl.)Úskip_utf8_validationÚ	_emittersÚkeep_runningTFN)r~   rª   r�   Úon_openÚon_closeÚon_dataÚ
on_messageÚon_errorc               ó   •— t         ‰
| �  |||¬«       || _        d| _        i | _        |r|| j                  d<   |r|| j                  d<   |r|| j                  d<   |r|| j                  d<   |	r|	| j                  d<   yy)	a|  
        Args:
            autoclose: whether to close the WebSocket after receiving a close frame.
            skip_utf8_validation: whether to skip UTF-8 validation for text frames in
                run_forever().
            debug: print extra curl debug info.

            on_open: open callback, ``def on_open(ws)``
            on_close: close callback, ``def on_close(ws, code, reason)``
            on_data: raw data receive callback, ``def on_data(ws, data, frame)``
            on_message: message receive callback, ``def on_message(ws, message)``
            on_error: error callback, ``def on_error(ws, exception)``
        ©r…   r~   r�   Fr¦   rž   r§   ri   r¨   N)rf   rg   rª   r¬   r«   )rh   r…   r~   rª   r�   r­   r®   r¯   r°   r±   rk   s             €rE   rg   zWebSocket.__init__Ü   sŠ   ø€ ô4 	‰Ñ˜d¨i¸uÐÔEØ*>ˆÔ!Ø"'ˆÔàHJˆŒÙØ%,ˆD�N‰N˜6Ñ"ÙØ&.ˆD�N‰N˜7Ñ#ÙØ%,ˆD�N‰N˜6Ñ"ÙØ(2ˆD�N‰N˜9Ñ%ÙØ&.ˆD�N‰N˜7Ò#ð rD   c                ó4   — | j                   rt        d«      ‚| S )NúWebSocket is closed©r‚   rr   rˆ   s    rE   Ú__iter__zWebSocket.__iter__  s   € Ø�;Š;Ü!Ð"7Ó8Ð8ØˆrD   c                ó^   — | j                  «       \  }}|t        j                  z  rt        ‚|S rA   )Úrecvr   ÚCLOSEÚStopIteration©rh   ÚmsgÚflagss      rE   Ú__next__zWebSocket.__next__  s*   € Ø—Y‘Y“[‰
ˆˆUØ”:×#Ñ#Ò#ÜÐØˆ
rD   c                ó  — | j                   j                  |«      }|r	  || g|¢­Ž }y y # t        $ rV}| j                   j                  d«      }|r
 || |«      }n%t        j                  d|› d�t
        d¬«       Y d }~y Y d }~y d }~ww xY w)Nr¨   zWebSocket callback 'z' failedr   )Ú
stacklevel)r«   Úgetr™   ÚwarningsÚwarnr"   )rh   Ú
event_typeÚargsÚcallbackÚ_r›   Úerror_callbacks          rE   Ú_emitzWebSocket._emit  s—   € ð
 26·±×1CÑ1CÀJÓ1OˆÙðÙ˜TÐ) DÒ)‘ð øô
 ò Ø?C¿~¹~×?QÑ?QØó@�ñ "Ù& t¨QÓ/‘Aä—M‘MØ.¨z¨l¸(ÐCÜ'Ø#$÷ò ô ûðús   Ÿ	* ª	B	³ABÂB	é   zgzip, deflate, brr”   r   c                óL  — | j                   }t        d i d|“dd“d|“dd|g“dd|g“dd|g“d	|“d
|“d|“d|“dd|	g“d|
“d|“dd|g“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“d|“Ž}|j                  t        j                  d«      }|j                  «        | S )!a€	  Connect to the WebSocket.

        libcurl automatically handles pings and pongs.
        ref: https://curl.se/libcurl/c/libcurl-ws.html

        Args:
            url: url for the requests.
            params: query string for the requests.
            headers: headers to send.
            cookies: cookies to use.
            auth: HTTP basic auth, a tuple of (username, password), only basic auth is
                supported.
            timeout: how many seconds to wait before giving up.
            allow_redirects: whether to allow redirection. Can be a bool, a
                ``CurlFollow`` value, or the string ``"safe"``.
            max_redirects: max redirect counts, default 30, use -1 for unlimited.
            proxies: dict of proxies to use, prefer to use ``proxy`` if they are the
                same. format: ``{"http": proxy_url, "https": proxy_url}``.
            proxy: proxy to use, format: "http://user@pass:proxy_url".
                Can't be used with `proxies` parameter.
            proxy_auth: HTTP basic auth for proxy, a tuple of (username, password).
            verify: whether to verify https certs.
            referer: shortcut for setting referer header.
            accept_encoding: shortcut for setting accept-encoding header.
            impersonate: which browser version or fingerprint to impersonate.
            ja3: ja3 string to impersonate.
            akamai: akamai string to impersonate.
            perk: perk string to impersonate.
            extra_fp: extra fingerprints options, in complement to ja3 and akamai str.
            default_headers: whether to set default browser headers.
            default_encoding: Encoding for decoding content if charset is not found.
                Defaults to "utf-8".
            quote: Set characters to be quoted (percent-encoded). Default safe
                string is ``!#$%&'()*+,/:;=?@[]~``. If set to a string, the characters
                will be removed from the safe string. If set to ``False``, the URL
                is used as-is (you must encode it yourself).
            http_version: Limiting http version, defaults to http2.
            interface: interface name or local IP to bind to (bare IP = source address).
            cert: a tuple of (cert, key) filenames for client cert.
            max_recv_speed: maximum receive speed, bytes per second.
            curl_options: extra curl options to use.
        r…   ÚmethodÚGETÚurlÚparams_listNÚheaders_listÚcookies_listÚauthÚtimeoutÚallow_redirectsÚmax_redirectsÚproxies_listÚproxyÚ
proxy_authÚverify_listÚrefererÚaccept_encodingÚimpersonateÚja3ÚakamaiÚperkÚextra_fpÚdefault_headersÚquoteÚhttp_versionÚ	interfaceÚmax_recv_speedÚcertÚcurl_optionsr   rC   )r…   r)   Úsetoptr   ÚCONNECT_ONLYÚperform)rh   rÏ   ÚparamsÚheadersÚcookiesrÓ   rÔ   rÕ   rÖ   ÚproxiesrØ   rÙ   ÚverifyrÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rã   rä   rå   rç   ræ   rè   r…   rÈ   s                                rE   ÚconnectzWebSocket.connect)  sg  € ðZ —Y‘YˆÜò 
Ùð
áð
ñ ð
ð ˜v™ð	
ð
  ™ð
ð  ™ð
ñ ð
ñ ð
ñ ,ð
ñ (ð
ð  ™ð
ñ ð
ñ "ð
ð ˜v™ð
ñ ð
ñ  ,ð!
ñ" $ð#
ñ$ ð%
ñ& ð'
ñ( ð)
ñ* ð+
ñ, ,ð-
ñ. ð/
ñ0 &ð1
ñ2  ð3
ñ4 *ð5
ñ6 ð7
ñ8 &ð9
ˆð@ �K‰Kœ×,Ñ,¨aÓ0ˆØ�‰ŒØˆrD   c                óž  — | j                   rt        d«      ‚| j                  j                  «       \  }}|j                  t
        j                  z  r;	 | j                  |«      \  | _        | _	        | j                  r| j                  «        ||fS # t        $ r2}|j                  | _        | j                  |j                  «       ‚ d}~ww xY w)z2Receive a single curl websocket fragment as bytes.úWebSocket is already closedN)r‚   rr   r…   Úws_recvr¾   r   rº   rœ   r   r€   rd   rj   rž   r~   )rh   Úchunkrš   r›   s       rE   Úrecv_fragmentzWebSocket.recv_fragment›  s¯   € ð �;Š;Ü!Ð"?Ó@Ð@à—y‘y×(Ñ(Ó*‰ˆˆuà�;‰;œ×)Ñ)Ò)ðØ7;×7OÑ7OÐPUÓ7VÑ4�Ô  $Ô"4ð �~Š~Ø—
‘
”à�eˆ|Ðøô "ò ð $%§6¡6�Ô Ø—
‘
˜1Ÿ6™6Ô"Øûðús   ÁB Â	CÂ-CÃCc                óh  — g }d}| j                   j                  t        j                  «      }|t        k(  rt        dt        j                  «      ‚	 	 | j                  «       \  }}|j                  t        j                  t        j                  z  z  rŒD|j                  }|j                  |«       |j                  dk(  r|t        j                  z  dk(  rnŒ‡dj)                  |«      |fS # t         $ r<}|j"                  t        j$                  k(  rt'        |gg g d«      \  }}}n‚ Y d}~ŒTd}~ww xY w)z‹
        Receive a frame as bytes. libcurl splits frames into fragments, so we have to
        collect all the chunks for a frame.
        r   úInvalid active socketç      à?NrD   )r…   Úgetinfor   ÚACTIVESOCKETr   rd   r   ÚNO_CONNECTION_AVAILABLErö   r¾   r   ÚPINGÚPONGÚappendÚ	bytesleftÚCONTr!   rj   ÚAGAINr   Újoin)rh   Úchunksr¾   Úsock_fdrõ   rš   r›   rÈ   s           rE   r¹   zWebSocket.recv±  s  € ð
 !ˆØˆà—)‘)×#Ñ#¤H×$9Ñ$9Ó:ˆØ”oÒ%Ü Ø'¬×)JÑ)Jóð ð ðà#×1Ñ1Ó3‘��uð —;‘;¤*§/¡/´J·O±OÑ"CÒDØàŸ™�Ø—‘˜eÔ$Ø—?‘? aÒ'¨E´J·O±OÑ,CÀqÒ,HØð ð* �x‰x˜Ó Ð&Ð&øô ò Ø—6‘6œYŸ_™_Ò,ô % g Y°°B¸Ó<‘G�A�q™!àô ûð	ús    ÁAC, ÂAC, Ã,	D1Ã52D,Ä,D1c                ó¤   — | j                  «       \  }}|t        j                  z  st        dt        j
                  «      ‚|j                  d«      S )zReceive a text frame.zNot valid text frameúutf-8)r¹   r   ÚTEXTrd   rO   rW   r—   )rh   r§   r¾   s      rE   Úrecv_strzWebSocket.recv_strÖ  s@   € à—i‘i“k‰ˆˆeØœ
Ÿ™Ò'Ü Ð!7¼×9QÑ9QÓRÐRØ�{‰{˜7Ó#Ð#rD   r   c               ó2   — | j                  «       } ||«      S )zeReceive a JSON frame.

        Args:
            loads: JSON decoder, default is json.loads.
        )r	  )rh   r   r§   s      rE   Ú	recv_jsonzWebSocket.recv_jsonÝ  s   € ð �}‰}‹ˆÙ�T‹{ÐrD   c                óv  — |t         j                  z  rd| _        | j                  rt	        d«      ‚t        |t        «      r|j                  «       }| j                  j                  t        j                  «      }|t        k(  rt        dt        j                  «      ‚d}|t!        |«      k  r6||d }	 | j                  j#                  ||«      }||z  }|t!        |«      k  rŒ6|S # t$        $ rI}|j&                  t        j(                  k(  r&t+        g |gg d«      \  }}	}|	st        d«      |‚Y d}~Œ’‚ d}~ww xY w)zuSend a data frame.

        Args:
            payload: data to send.
            flags: flags for the frame.
        Fró   rø   r   Nrù   zSocket write timeout)r   rº   r¬   r‚   rr   r‡   rl   Úencoder…   rú   r   rû   r   rd   r   rü   r•   Úws_sendr!   rj   r  r   )
rh   Úpayloadr¾   r  ÚoffsetÚcurrent_bufferÚn_sentr›   rÈ   Ú	writeables
             rE   ÚsendzWebSocket.sendæ  s0  € ð ”:×#Ñ#Ò#Ø %ˆDÔà�;Š;Ü!Ð"?Ó@Ð@ô �gœsÔ#Ø—n‘nÓ&ˆGà9=¿¹×9JÑ9JÜ×!Ñ!ó:
ˆð ”oÒ%Ü Ø'¬×)JÑ)Jóð ð ˆØ”s˜7“|Ò#Ø$ V WÐ-ˆNðØŸ™×*Ñ*¨>¸5ÓA�ð �fÑˆFð ”s˜7“|Ó#ð ˆøô ò Ø—6‘6œYŸ_™_Ò,Ü&,¨R°'°¸BÀÓ&D‘O�A�y !Ù$Ü,Ð-CÓDÈ!ÐKÜØûðús   Â4C& Ã&	D8Ã/>D3Ä2D3Ä3D8c                óB   — | j                  |t        j                  «      S )zVSend a binary frame.

        Args:
            payload: binary data to send.
        ©r  r   ÚBINARY©rh   r  s     rE   Úsend_binaryzWebSocket.send_binary  ó   € ð �y‰y˜¤*×"3Ñ"3Ó4Ð4rD   c                óB   — | j                  |t        j                  «      S )ztSend a binary frame, alias of :meth:`send_binary`.

        Args:
            payload: binary data to send.
        r  r  s     rE   Ú
send_byteszWebSocket.send_bytes  r  rD   c                óB   — | j                  |t        j                  «      S )zRSend a text frame.

        Args:
            payload: text data to send.
        ©r  r   r  r  s     rE   Úsend_strzWebSocket.send_str'  ó   € ð �y‰y˜¤*§/¡/Ó2Ð2rD   r   c               óx   — |t         u r| j                  t        |d¬«      «      S | j                   ||«      «      S )z…Send a JSON frame.

        Args:
            payload: data to send.
            dumps: JSON encoder, default is json.dumps.
        ©ú,ú:©Ú
separators©Ú
json_dumpsr  ©rh   r  r   s      rE   Ú	send_jsonzWebSocket.send_json/  s5   € ð ”JÑØ—=‘=¤¨GÀ
Ô!KÓLÐLØ�}‰}™U 7›^Ó,Ð,rD   c                óB   — | j                  |t        j                  «      S )zMSend a ping frame.

        Args:
            payload: data to send.
        )r  r   rý   r  s     rE   ÚpingzWebSocket.ping<  r   rD   c                ó¸  — |r | j                   |fi |¤Ž}| j                  j                  t        j                  «      }|t
        k(  rt        dt        j                  «      ‚| j                  d«       g }d| _
        | j                  �rN	 | j                  «       \  }}|j                  }| j                  d||«       |j                  |«       |j                  dk(  r|t        j                   z  dk(  sŒwd| j"                  v r|dj%                  |«      }	|t        j&                  z  r| j(                  s	 |	j+                  «       }
n|	}
|t        j6                  z  s|t        j&                  z  r| j                  d|
«       g }|t        j8                  z  r6d
| _
        | j                  d| j2                  xs d| j:                  xs d«       | j                  r�ŒMy	y	# t,        $ rT}t.        j0                  | _        | j5                  t.        j0                  «       t        dt.        j0                  «      |‚d	}~ww xY w# t<        $ r˜}|j>                  t        j@                  k(  rtC        |gg g d«      \  }}}n\| j                  d|«       | jD                  s=t.        jF                  }tI        |t        «      r|j>                  }| j5                  |«       ‚ Y d	}~�Œd	}~ww xY w)zÁRun the WebSocket forever. See :meth:`connect` for details on parameters.

        libcurl automatically handles pings and pongs.
        ref: https://curl.se/libcurl/c/libcurl-ws.html
        rø   r¦   Tr§   r   ri   rD   zInvalid UTF-8NFrž   r”   rù   r¨   )%rñ   r…   rú   r   rû   r   rd   r   rü   rÊ   r¬   rö   r¾   rÿ   r   r   r  r«   r  r  rª   r—   r˜   rO   rW   r   rž   r  rº   r€   r!   rj   r  r   r‚   rU   r‡   )rh   rÏ   ÚkwargsrÈ   r  r  rõ   rš   r¾   r½   Úemit_msgr›   rj   s                rE   Úrun_foreverzWebSocket.run_foreverD  s`  € ñ Ø�—‘˜SÑ+ FÑ+ˆAà—)‘)×#Ñ#¤H×$9Ñ$9Ó:ˆØ”oÒ%Ü Ø'¬×)JÑ)Jóð ð 	�
‰
�6Ôð !ˆØ ˆÔØ×Óð.Ø#×1Ñ1Ó3‘��uØŸ™�Ø—
‘
˜6 5¨%Ô0à—‘˜eÔ$ØŸ™¨1Ò,°¼¿¹Ñ1HÈAÒ1MØð  §¡Ñ.àŸ(™( 6Ó*�Cà¤
§¡Ò/¸×9RÒ9Rð%Ø47·J±J³L™Hð $'˜à¤
× 1Ñ 1Ò1°u¼z¿¹Ò7NØŸ
™
 9¨hÔ7à�àœ:×+Ñ+Ò+Ø(-�DÔ%Ø—J‘J˜w¨×(8Ñ(8Ò(=¸A¸t×?QÑ?QÒ?WÐUWÔXðG ×Öøô$  2ò %Ü/:×/GÑ/G˜DÔ,Ø ŸJ™J¤{×'?Ñ'?Ô@Ü"0Ø /´×1IÑ1Ió#à#$ð%ûð%ûô& ò 
Ø—6‘6œYŸ_™_Ò,Ü$ g Y°°B¸Ó<‘G�A�q™!à—J‘J˜w¨Ô*ØŸ;š;Ü$/×$7Ñ$7˜Ü% a¬Ô8Ø#$§6¡6˜DØŸ
™
 4Ô(Øõ ûð
úsF   Â
A(H8 Ã3>H8 Ä2G ÅBH8 Ç	H5Ç!AH0È0H5È5H8 È8	KÉBKËKrD   c                óˆ   — | j                  ||«      }| j                  |t        j                  «      }| j	                  «        y)znClose the connection.

        Args:
            code: close code.
            message: close reason.
        N)r’   r  r   rº   rŸ   )rh   rj   ri   r½   rÈ   s        rE   rž   zWebSocket.close‹  s6   € ð ×$Ñ$ T¨7Ó3ˆØ�I‰I�cœ:×+Ñ+Ó,ˆà�‰ÕrD   )r…   r    r~   r9   rª   r9   r�   r9   r­   zON_OPEN_T | Noner®   zON_CLOSE_T | Noner¯   zON_DATA_T | Noner°   zON_MESSAGE_T | Noner±   zON_ERROR_T | Nonerm   rn   )rm   r6   ©rm   r¢   )rÅ   ÚEventTypeLiteralrÆ   z+str | bytes | int | CurlWsFrame | CurlErrorrm   rn   )6rÏ   rl   rì   z\dict[str, object] | list[object] | tuple[str, int | list[str] | dict[str, str | int]] | Nonerí   zHeaderTypes | Nonerî   zCookieTypes | NonerÓ   útuple[str, str] | NonerÔ   z+float | tuple[float, float] | object | NonerÕ   zbool | CurlFollow | strrÖ   r>   rï   zProxySpec | NonerØ   r¡   rÙ   r4  rð   zbool | NonerÛ   r¡   rÜ   r¡   rÝ   z-BrowserTypeLiteral | str | Fingerprint | NonerÞ   r¡   rß   r¡   rà   r¡   rá   z&ExtraFingerprints | ExtraFpDict | Nonerâ   r9   rã   zstr | Literal[False]rä   zCurlHttpVersion | Nonerå   r¡   rç   zstr | tuple[str, str] | Noneræ   r>   rè   zdict[CurlOpt, str] | Nonerm   r*   )rm   ztuple[bytes, CurlWsFrame])rm   útuple[bytes, int])rm   rl   )r   úCallable[[str], T]rm   r5   )r  ústr | bytesr¾   r   rm   r>   )r  r¢   rm   r>   )r  r¢   )r  rl   rm   r>   )r  Úobjectr   úCallable[..., str]rm   r>   )r  r7  rm   r>   )r”   )rÏ   rl   rm   rn   )rj   r>   ri   r¢   )rI   rJ   rK   rL   rƒ   r'   rg   r·   r¿   rÊ   rñ   rö   r¹   r	  Ú
json_loadsr  r   r  r  r  r  r  r(  r*  r,  r0  rO   rQ   rž   ro   rp   s   @rE   r6   r6   Ò   sá  ø„ á3ð€Ið #*ð(/ð Ø%*ØØ$(Ø&*Ø$(Ø*.Ø&*ñ(/àð(/ð ð	(/ð
 #ð(/ð ð(/ð "ð(/ð $ð(/ð "ð(/ð (ð(/ð $ð(/ð 
õ(/óTó
ðà$ðð ;ðð 
ó	ð@ Ø&*Ø&*Ø'+Ø?FØ37ØØ$(Ø Ø-1Ø"Ø"Ø&9ØEIØØ!ØØ;?Ø $Ø&(Ø/3Ø $Ø-1ØØ26ðApàðpðð	pð $ðpð $ðpð %ðpð =ðpð 1ðpð ðpð "ðpð  ð!pð" +ð#pð$ ð%pð& ð'pð( $ð)pð* Cð+pð, ð-pð. ð/pð0 ð1pð2 9ð3pð4 ð5pð6 $ð7pð8 -ð9pð: ð;pð< +ð=pð> ð?pð@ 0ðApðB 
óCpódó,#'óJ$ð 8Bõ ð '×-Ñ-ð/àð/ð ð/ð 
ó	/ób5ó5ó3ð ?Iñ-Øð-Ø);ð-à	ó-ó3ôEðN !,§¡À÷ ð rD   c                  ó  ‡ — e Zd ZU dZdZdZded<   ddddd	dd
ddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d/ˆ fd„Zed0d„«       Z	ed1d„«       Z
d2d„Zd3d„Z	 	 	 	 	 	 	 	 d4d„Zd3d„Zd5d„Zd6d„Zd7d„Zd
dœd8d„Zd
dœd9d„Zed
dœ	 	 	 	 	 d:d„Zej.                  d
f	 	 	 	 	 	 	 d;d„Zd<d„Zd<d „Zd=d!„Zed"œ	 	 	 	 	 d>d#„Zd?d$„Zej@                  d%d&f	 	 	 	 	 	 	 d@d'„Z!d7ˆ fd(„Z"d7d)„Z#d7d*„Z$	 	 	 	 	 	 dAd+„Z%dBdCd,„Z&d7ˆ fd-„Z'dDd.„Z(ˆ xZ)S )EÚAsyncWebSocketz<
    An asyncio WebSocket implementation using libcurl.
    )ÚsessionÚ_loopÚ_sock_fdÚ_close_lockÚ_terminate_lockÚ
_read_taskÚ_write_taskÚ_receive_queueÚ_send_queueÚ_max_send_batch_sizeÚ_coalesce_framesÚ_recv_time_sliceÚ_send_time_sliceÚ_terminatedÚ_terminated_eventÚws_retryÚ_transport_exceptionÚ_max_message_sizeÚdrain_on_errorÚ_block_on_recv_queue_fulli   z
Final[int]Ú_MAX_CURL_FRAME_SIZETFé€   é@   Ng{®Gáz„?g{®Gázt?i  @ )r~   r�   Úrecv_queue_sizeÚsend_queue_sizeÚmax_send_batch_sizeÚcoalesce_framesrL  Úrecv_time_sliceÚsend_time_sliceÚmax_message_sizerO  Úblock_on_recv_queue_fullc               ó  •— t         ‰| �  |||¬«       || _        d| _        d| _        d| _        t        j                  «       | _        t        j                  «       | _
        t        j                  «       | _        d| _        d| _        t        j                  |¬«      | _        t        j                  |¬«      | _        || _        || _        |	xs
 t)        «       | _        |
| _        || _        d| _        || _        || _        || _        y)aõ  Initializes an Async WebSocket session.

        Do not instantiate this class directly. Use ``AsyncSession.ws_connect``.

        This class implements an async context manager, closing the connection
        automatically on exit:

        ::

            async with AsyncSession() as session:
                async with session.ws_connect("wss://api.example.com") as ws:
                    await ws.send("Hello")
                    msg = await ws.recv()

        Args:
            session (AsyncSession): The parent session object.
            curl (Curl): The underlying Curl handle.
            autoclose (bool): Automatically close on receiving a close frame.
            debug (bool): Enable verbose debug logging.
            recv_queue_size (int): Max number of incoming messages to buffer.
            send_queue_size (int): Max number of outgoing messages to buffer.
            max_send_batch_size (int): Max frames to coalesce per transmission.
            coalesce_frames (bool): Combine small frame payloads to improve throughput.
            ws_retry (WebSocketRetryStrategy): Retry configuration for failed receives.
            recv_time_slice (float): Max seconds to read messages before yielding.
            send_time_slice (float): Max seconds to write messages before yielding.
            max_message_size (int): Max size (bytes) of a single received message.
            drain_on_error (bool): Yield buffered messages before raising errors.
            block_on_recv_queue_full (bool): Behavior when the receive queue is full.
                If True (default), the reader blocks (may cause timeouts).
                If False, the connection fails immediately to prevent data loss.

        Note:
            Architecture: This uses a background I/O model. Network operations run in
            background tasks. Errors are raised in subsequent calls to send() or recv().

            Performance: The time_slice defaults (5ms read / 1ms write) favor reading
            to compensate for libcurl's overhead. Increase these values to allocate more
            CPU time to I/O operations at the cost of event loop latency.

        See also:
            - https://curl.se/libcurl/c/curl_ws_recv.html
            - https://curl.se/libcurl/c/curl_ws_send.html
        r³   NéÿÿÿÿF)Úmaxsize)rf   rg   r=  r>  r?  rJ  ÚasyncioÚLockr@  Ú	threadingrA  ÚEventrK  rB  rC  ÚQueuerD  rE  rF  rG  r8   rL  rH  rI  rM  rN  rO  rP  )rh   r=  r…   r~   r�   rT  rU  rV  rW  rL  rX  rY  rZ  rO  r[  rk   s                  €rE   rg   zAsyncWebSocket.__init__º  sî   ø€ ô| 	‰Ñ˜d¨i¸uÐÔEØ/6ˆŒØ7;ˆŒ
ØˆŒØ!&ˆÔÜ)0¯©«ˆÔÜ/8¯~©~Ó/?ˆÔÜ07·±³ˆÔØ59ˆŒØ6:ˆÔÜ>E¿m¹mØ#ô?
ˆÔô <C¿=¹=Ø#ô<
ˆÔð *=ˆÔ!Ø&5ˆÔØ08Ò0TÔ<RÓ<TˆŒØ'6ˆÔØ'6ˆÔØ6:ˆÔ!Ø&6ˆÔØ$2ˆÔØ/GˆÕ&rD   c                óv   — | j                   €"t        t        j                  «       «      | _         | j                   S )z)Get a reference to the running event loop)r>  r   r_  Úget_running_looprˆ   s    rE   ÚloopzAsyncWebSocket.loop  s-   € ð �:‰:ÐÜ%¤g×&>Ñ&>Ó&@ÓAˆDŒJØ�z‰zÐrD   c                ó6   — | j                   j                  «       S )z6Returns the current number of items in the send queue.)rE  Úqsizerˆ   s    rE   rU  zAsyncWebSocket.send_queue_size  s   € ð ×Ñ×%Ñ%Ó'Ð'rD   c                óÔ   — | j                   s| j                  ry| j                  r| j                  j                  «       ry| j                  xr | j                  j                  «        S )aš  
        Checks if the background I/O tasks are still running.

        Returns ``False`` if either the read or write task has terminated due
        to an error or a clean shutdown.

        Note: This is a snapshot in time. A return value of ``True`` does not
        guarantee the next network operation will succeed, but ``False``
        definitively indicates the connection is no longer active.
        F)r‚   rJ  rB  ÚdonerC  rˆ   s    rE   Úis_alivezAsyncWebSocket.is_alive  sR   € ð �;Š;˜$×*Ò*Øà�?Š?˜tŸ™×3Ñ3Ô5Øà×$Ñ$Ò@¨×)9Ñ)9×)>Ñ)>Ó)@ÐAÐArD   c              ƒ  ó   K  — | S ­w)a@  Enable context manager usage for automatic session management and closure.
        This cannot be used to initiate a WebSocket connection, that must be done
        beforehand using the :meth:`AsyncSession.ws_connect()` factory method.

        Returns:
            Self: The instantiated AsyncWebSocket object.
        rC   rˆ   s    rE   Ú
__aenter__zAsyncWebSocket.__aenter__1  s   è ø€ ð ˆùs   ‚c              ƒ  óÂ   K  — |€| j                  «       ƒ d{  –—†  yt        t        «      5  | j                  «       ƒ d{  –—†  ddd«       y7 Œ67 Œ# 1 sw Y   yxY w­w)zQ
        On exiting the context manager, close the WebSocket connection.
        N)rž   r   r!   )rh   Úexc_typeÚexc_valÚexc_tbs       rE   Ú	__aexit__zAsyncWebSocket.__aexit__;  s[   è ø€ ð ÐØ—*‘*“,×Ñô œ)Ó$ñ #Ø—j‘j“l×"Ð"÷#ð #ð øð #ø÷#ð #üs8   ‚A˜A™A­AÁAÁAÁ
AÁAÁAÁAc                ó4   — | j                   rt        d«      ‚| S )NzWebSocket has been closedr¶   rˆ   s    rE   Ú	__aiter__zAsyncWebSocket.__aiter__K  s   € Ø�;Š;Ü!Ð"=Ó>Ð>ØˆrD   c              ƒ  ó¤   K  — 	 | j                  «       ƒ d {  –—† \  }}|t        j                  z  rt        ‚|S 7 Œ"# t        $ r t        d ‚w xY w­wrA   )r¹   rr   ÚStopAsyncIterationr   rº   r¼   s      rE   Ú	__anext__zAsyncWebSocket.__anext__P  sS   è ø€ ð	/Ø#Ÿy™y›{×*‰JˆC�ð ”:×#Ñ#Ò#Ü$Ð$Øˆ
ð +ùÜò 	/Ü$¨$Ð.ð	/üs%   ‚A„< —:˜< ŸAº< ¼AÁAc                ód   — | j                   s| j                  �y|| _        | j                  «        y)al  Finalize the connection into a terminal state.

        This method is called for all terminal conditions, including:
        - normal WebSocket closure
        - protocol errors
        - transport errors

        After this method is called, no further messages will be delivered
        and all ``recv()`` calls will fail. ``_finalize_connection()`` is intended
        for event-loop context, but ``terminate()`` is thread-safe.

        Args:
            exc (Exception): The exception object that gets raised. This does not
            have to be an error, enqueuing ``WebSocketClosed`` indicates closure.
        N)r‚   rM  rŸ   )rh   Úexcs     rE   Ú_finalize_connectionz#AsyncWebSocket._finalize_connectionZ  s+   € ð" �;Š;˜$×3Ñ3Ð?Øà$'ˆÔ!Ø�‰ÕrD   c                ó
  — | j                   �y| j                  rt        d«      ‚t        t        | j
                  j                  t        j                  «      «      | _	        | j                  t        k(  rt        dt        j                  ¬«      ‚dt        | «      d›�}| j                  j!                  | j#                  «       |› d�¬«      | _         | j                  j!                  | j%                  «       |› d	�¬«      | _        y)
a  Start the read/write I/O loop tasks.

        NOTE: This should be called only once after object creation by the factory.
        Once started, the tasks cannot be restarted again, this is a one-shot.

        Raises:
            WebSocketError: The WebSocket FD was invalid.
        NzWebSocket already terminatedzInvalid active socket.)rj   z
WebSocket-z#xz-reader)Únamez-writer)rB  rJ  rr   r   r>   r…   rú   r   rû   r?  r   rd   r   rü   Úidrf  Úcreate_taskÚ
_read_loopÚ_write_looprC  )rh   Úws_ids     rE   Ú_start_io_taskszAsyncWebSocket._start_io_tasksq  sè   € ð �?‰?Ð&Øð ×ÒÜ!Ð"@ÓAÐAô œS $§)¡)×"3Ñ"3´H×4IÑ4IÓ"JÓKˆŒØ�=‰=œOÒ+Ü Ø(¬y×/PÑ/Pôð ð
 "¤" T£(¨2 Ð/ˆð Ÿ)™)×/Ñ/Ø�O‰OÓ u g¨WÐ$5ð 0ó 
ˆŒð  Ÿ9™9×0Ñ0Ø×ÑÓ¨ w¨gÐ%6ð 1ó 
ˆÕrD   ©rÔ   c             ƒ  ó~  K  — | j                   �| j                  s| j                   ‚	 | j                  j                  «       S # t        j
                  $ r Y nw xY w| j                   �| j                   ‚| j                  �| j                  j                  «       rt        d«      ‚t	        j                  | j                  j                  «       «      }	 t	        j                  || j                  ft        j                  |¬«      ƒ d{  –—†7  \  }}nr# t        j                  $ r\ |j                  «       sJ|j                  «       }t        t        j                  «      5  |ƒ d{  –—†7   ddd«       ‚ # 1 sw Y   ‚ xY w‚ w xY w|sg|j                  «       }	 |ƒ d{  –—†7  S # t        j                  $ r Y nw xY w| j                   �| j                   ‚t!        dt"        j$                  «      ‚||v r|ƒ d{  –—†7  S |j                  «       }t        t        j                  «      5  |ƒ d{  –—†7   ddd«       n# 1 sw Y   nxY w| j                  rIt        t        j
                  «      5  | j                  j                  «       cddd«       S # 1 sw Y   nxY w| j                   �| j                   ‚t        d«      ‚­w)a[  Receive a WebSocket message.

        This method waits for and returns the next complete WebSocket message.

        Args:
            timeout: How many seconds to wait for a message before raising
            a timeout error.

        Returns:
            tuple[bytes, int]: A tuple with the received payload and flags.

        Raises:
            WebSocketTimeout: If the timeout expires.
            WebSocketClosed: If the connection is closed.
            WebSocketError: If a network-level transport error occurs.

        Notes:
            Message fragmentation and reassembly are handled automatically by the
            implementation, so callers will always receive complete messages.

            ``WebSocketError`` exceptions may have originated from prior
            ``send()`` or ``recv()`` operations, since all operations
            share the same transport state once a failure occurs.

            This method does not wait for additional messages after a transport
            error is detected. If ``drain_on_error=True``, subsequent calls to
            ``recv()`` will return any messages that were buffered in the receive
            queue at the time the reader failed, before the connection error is raised.

            Concurrent calls to ``recv()`` are supported and safe; each caller
            awaits the next available message and will receive distinct messages
            in FIFO order.

            If this coroutine is cancelled while a message is being received,
            that message may be dropped. Cancellation is treated as abandoning
            the receive operation.
        Nrµ   ©Úreturn_whenrÔ   zWebSocket recv() timed outzConnection closed)rM  rO  rD  Ú
get_nowaitr_  Ú
QueueEmptyrB  rj  rr   r~  rÂ   ÚwaitÚFIRST_COMPLETEDÚCancelledErrorÚcancelr   ru   r   ÚOPERATION_TIMEDOUT)rh   rÔ   Úqueue_waiterrj  rÈ   s        rE   r¹   zAsyncWebSocket.recv•  s}  è ø€ ðN ×$Ñ$Ð0¸×9LÒ9LØ×+Ñ+Ð+ð	Ø×&Ñ&×1Ñ1Ó3Ð3øÜ×!Ñ!ò 	Ùð	úð ×$Ñ$Ð0Ø×+Ñ+Ð+à�?‰?Ð" d§o¡o×&:Ñ&:Ô&<Ü!Ð"7Ó8Ð8ô 7>×6IÑ6IØ×Ñ×#Ñ#Ó%ó7
ˆð	ä#ŸL™LØ˜tŸ™Ð/Ü#×3Ñ3Øô÷ ð ‰GˆD‘!øô ×%Ñ%ò 	Ø×$Ñ$Ô&Ø ×'Ñ'Ó)�Üœg×4Ñ4Ó5ñ 'Ø&×&Ñ&÷'à÷'àúˆEð	úñ Ø×#Ñ#Ó%ˆAðØ)×)Ð)Ð)øÜ×)Ñ)ò Ùðúð ×(Ñ(Ð4Ø×/Ñ/Ð/ä"Ø,¬i×.JÑ.Jóð ð
 ˜4ÑØ%×%Ð%Ð%ð ×ÑÓ!ˆÜ”g×,Ñ,Ó-ñ 	Ø×Ñ÷	÷ 	ñ 	úð ×ÒÜœ'×,Ñ,Ó-ñ 8Ø×*Ñ*×5Ñ5Ó7÷8÷ 8ò 8úð ×$Ñ$Ð0Ø×+Ñ+Ð+äÐ1Ó2Ð2ùsê   ‚%J=¨A ÁJ=ÁAÁJ=ÁAÁA9J=Ã5D ÄD
ÄD ÄJ=ÄAF ÅE2Å#E&Å$E2Å)	F Å2E;	Å7	F Æ J=ÆF! ÆFÆF! Æ J=Æ!F7Æ4J=Æ6F7Æ7>J=Ç5G8Ç6.J=È$H9È*H-È+H9È0	J=È9IÈ>,J=É*JÊ
J=ÊJÊ*J=c             ƒ  ó  K  — | j                  |¬«      ƒ d{  –—† \  }}|t        j                  z  st        dt        j
                  «      ‚	 |j                  d«      S 7 ŒF# t        $ r }t        dt        j
                  «      |‚d}~ww xY w­w)zmReceive a text frame.

        Args:
            timeout: how many seconds to wait before giving up.
        rƒ  NzNot a valid text framer  zInvalid UTF-8 in text frame)r¹   r   r  rd   rO   rW   r—   r˜   )rh   rÔ   r§   r¾   r›   s        rE   r	  zAsyncWebSocket.recv_str  s„   è ø€ ð !ŸI™I¨g˜IÓ6×6‰ˆˆeØœ
Ÿ™Ò'Ü Ð!9¼;×;SÑ;SÓTÐTð	Ø—;‘;˜wÓ'Ð'ð	 7ùô
 "ò 	Ü Ø-¬{×/GÑ/Góàðûð	üs3   ‚B˜A™4BÁA! ÁBÁ!	B
Á*BÂB
Â
B)r   rÔ   c             ƒ  ó8  K  — | j                  |¬«      ƒ d{  –—† }|st        dt        j                  «      ‚	  ||«      S 7 Œ)# t        $ r }t        dt        j                  «      |‚d}~wt
        $ r#}t        d|› �t        j                  «      |‚d}~ww xY w­w)a  Receive a JSON frame.

        Args:
            loads: JSON decoder, default is :meth:`json.loads`.
            timeout: how many seconds to wait before giving up.

        Raises:
            WebSocketError: Received frame is invalid or failed to decode JSON.
        rƒ  Nz(Received empty frame, cannot decode JSONz Invalid UTF-8 in JSON text framezInvalid JSON payload: )r	  rd   rO   rW   r˜   r™   )rh   r   rÔ   r§   r›   s        rE   r  zAsyncWebSocket.recv_json  s£   è ø€ ð Ÿ-™-°˜-Ó8×8ˆÙÜ Ø:¼K×<TÑ<Tóð ð		Ù˜“;Ðð 9ùô "ò 	Ü Ø2´K×4LÑ4Lóàðûô ò 	Ü Ø(¨¨Ð,¬k×.FÑ.Fóàðûð	üs>   ‚B˜A™ BºA ÁBÁ	BÁA(Á(BÁ4BÂBÂBc              ƒ  ó~  K  — | j                   �| j                   ‚| j                  rt        d«      ‚| j                  �%| j                  j	                  «       rt        d«      ‚t        |t        «      r|j                  d«      }	 | j                  j                  ||f«       y# t        j                  $ �r}| j                  rt        d«      |‚| j                   �| j                   |‚|�c	 t        j                  | j                  j                  ||f«      |«      ƒ d{  –—†7   nM# t        j                  $ r}t!        d«      |‚d}~ww xY w| j                  j                  ||f«      ƒ d{  –—†7   | j                   �| j                   |‚| j                  s| j                  rt        d«      |‚Y d}~yd}~ww xY w­w)a÷  Send a WebSocket message.

        Args:
            payload: Data to send (``str``/``bytes``/``bytearray``/``memoryview``).
            flags: Frame type flags (e.g., ``CurlWsFlag.TEXT`` / ``CurlWsFlag.BINARY``).
            timeout: Max seconds to wait if the send queue is full.

        Raises:
            CurlError: Network related exception occured.
            WebSocketClosed: The WebSocket has been closed.
            WebSocketTimeout: The send operation timed out.

        Note:
            There are no limits on the size of the message that can be sent.
            Large outbound messages are seamlessly broken down into optimal
            fragments using the ``CURLWS_CONT`` flag, arriving as a single
            logical message to the server.

        Warning:
            This method is non-blocking. It queues the message for immediate
            transmission. Use ``await ws.flush()`` after sending if you need
            to guarantee that the data has actually reached the socket.
        Nrµ   z(WebSocket writer terminated; cannot sendr  z"WebSocket connection is terminatedz>Send queue full (network slow) - hit timeout enqueuing messagez/Connection was terminated while waiting to send)rM  r‚   rr   rC  rj  r‡   rl   r  rE  Ú
put_nowaitr_  Ú	QueueFullrJ  Úwait_forÚputÚTimeoutErrorru   )rh   r  r¾   rÔ   ry  r›   s         rE   r  zAsyncWebSocket.send5  s¬  è ø€ ð< ×$Ñ$Ð0Ø×+Ñ+Ð+à�;Š;Ü!Ð"7Ó8Ð8ð ×ÑÐ'¨D×,<Ñ,<×,AÑ,AÔ,CÜ!Ð"LÓMÐMô �gœsÔ#Ø—n‘n WÓ-ˆGð	Ø×Ñ×'Ñ'¨°%Ð(8Õ9øÜ× Ñ ó 	Ø×ÒÜ%Ð&JÓKÐQTÐTð ×(Ñ(Ð4Ø×/Ñ/°SÐ8àÐ"ðÜ!×*Ñ*Ø×(Ñ(×,Ñ,¨g°uÐ-=Ó>Àó÷ ò øô ×+Ñ+ò Ü*ØXóàðûðúð
 ×&Ñ&×*Ñ*¨G°UÐ+;Ó<×<Ñ<ð ×(Ñ(Ð4Ø×/Ñ/°SÐ8à�{Š{˜d×.Ò.Ü%ØEóàðô /ûð1	üsm   ‚BF=ÂB# Â"F=Â#F:Â73F5Ã+4D&ÄD"Ä D&Ä%F5Ä&E
Ä9EÅE
Å
#F5Å-E0Å.AF5Æ0F=Æ5F:Æ:F=c              ƒ  ó^   K  — | j                  |t        j                  «      ƒ d{  –—† S 7 Œ­w)z“Send a binary frame.

        Args:
            payload: binary data to send.

        For more info, see the docstring for :meth:`send()`
        Nr  r  s     rE   r  zAsyncWebSocket.send_binary€  ó%   è ø€ ð —Y‘Y˜w¬
×(9Ñ(9Ó:×:Ð:Ð:úó   ‚$-¦+§-c              ƒ  ó^   K  — | j                  |t        j                  «      ƒ d{  –—† S 7 Œ­w)z±Send a binary frame, alias of :meth:`send_binary`.

        Args:
            payload: binary data to send.

        For more info, see the docstring for :meth:`send()`
        Nr  r  s     rE   r  zAsyncWebSocket.send_bytesŠ  r˜  r™  c              ƒ  ó^   K  — | j                  |t        j                  «      ƒ d{  –—† S 7 Œ­w)z�Send a text frame.

        Args:
            payload: text data to send.

        For more info, see the docstring for :meth:`send()`
        Nr  r  s     rE   r  zAsyncWebSocket.send_str”  s#   è ø€ ð —Y‘Y˜w¬
¯©Ó8×8Ð8Ð8úr™  r   c             ƒ  ó¨   K  — |t         u r$| j                  t        |d¬«      «      ƒ d{  –—† S | j                   ||«      «      ƒ d{  –—† S 7 Œ#7 Œ­w)zÌSend a JSON frame.

        Args:
            payload: data to send.
            dumps: JSON encoder, default is :meth:`json.dumps()`.

        For more info, see the docstring for :meth:`send()`
        r"  r%  Nr'  r)  s      rE   r*  zAsyncWebSocket.send_jsonž  sI   è ø€ ð ”JÑØŸ™¤z°'ÀjÔ'QÓR×RÐRØ—]‘]¡5¨£>Ó2×2Ð2ð SøØ2ús!   ‚(AªA«AÁ	AÁ
AÁAc              ƒ  ó   K  — t        |t        «      r|j                  d«      }nt        |«      }t	        |«      dkD  r&t        dt	        |«      › �t        j                  «      ‚| j                  |t        j                  «      ƒ d{  –—† S 7 Œ­w)zäSend a ping frame.

        Args:
            payload: data to send.

        Raises:
            WebSocketError: The payload length is outside specification.

        For more info, see the docstring for :meth:`send()`
        r  é}   zPing frame has invalid length: N)r‡   rl   r  r¢   r•   rd   r   Ú	TOO_LARGEr  r   rý   )rh   r  Úpayload_bytess      rE   r,  zAsyncWebSocket.ping­  sy   è ø€ ô �gœsÔ#Ø#*§>¡>°'Ó#:‰Mä! '›NˆMäˆ}Ó Ò#Ü Ø1´#°mÓ2DÐ1EÐFÜ×#Ñ#óð ð
 —Y‘Y˜}¬j¯o©oÓ>×>Ð>Ð>ús   ‚BBÂBÂBrD   g      @c              ƒ  óØ  K  — | j                   4 ƒd{  –—†  | j                  r	 ddd«      ƒd{  –—†  yd| _        | j                  j                  «       }	 | j                  rõ| j                  j                  «       sÛ| j                  €Ït        |t        «      r|j                  d«      }t        |«      dkD  r|dd }| j                  ||«      }t        j                  | j                  j                  |t         j"                  f«      |¬«      ƒ d{  –—†  | j%                  t'        d|| j                  j                  «       |z
  z
  «      «      ƒ d{  –—†  | j-                  «        t/        t        j(                  «      5  t        j                  | j0                  j3                  «       t'        d|| j                  j                  «       |z
  z
  «      «      ƒ d{  –—† }ddd«       ddd«      ƒd{  –—†  y7 �Œç7 �ŒÍ7 Œì7 Œ­# t        j(                  t*        f$ r Y ŒÆw xY w7 ŒF# 1 sw Y   ŒExY w# | j-                  «        t/        t        j(                  «      5  t        j                  | j0                  j3                  «       t'        d|| j                  j                  «       |z
  z
  «      «      ƒ d{  –—†7  }ddd«       w # 1 sw Y   w xY wxY w7 ŒÞ# 1 ƒd{  –—†7  sw Y   yxY w­w)a  
        Performs a graceful WebSocket closing handshake and terminates the connection.

        This method sends a WebSocket close frame to the peer, waits for queued
        outgoing messages to be sent, and then shuts down the connection.

        Args:
            code (int): Close code. Defaults to ``WsCloseCode.OK``.
            message (bytes): Close reason. Defaults to ``b""``.
            timeout (float): How long (in seconds) to wait for the connection to close
                gracefully before force-terminating.
        NTr  é{   rƒ  ç        )r@  r‚   rf  ÚtimerC  rj  rM  r‡   rl   r  r•   r’   r_  r”  rE  r•  r   rº   ÚflushÚmaxr–  rd   rŸ   r   rK  r‰  )rh   rj   ri   rÔ   Úclose_startÚclose_framerÈ   s          rE   rž   zAsyncWebSocket.closeÆ  s{  è ø€ ð$ ×#Ñ#÷ )	ñ )	Ø�{Š{Ø÷)	÷ )	ð )	ð ˆDŒKØ!%§¡§¡Ó!1ˆKð"à×$Ò$Ø ×,Ñ,×1Ñ1Ô3Ø×1Ñ1Ð9ä! '¬3Ô/Ø")§.¡.°Ó"9˜ô ˜7“| cÒ)Ø")¨$¨3 -˜ð *.×)?Ñ)?ÀÀgÓ)N�KÜ!×*Ñ*Ø×(Ñ(×,Ñ,¨k¼:×;KÑ;KÐ-LÓMØ 'ô÷ ð ð
 Ÿ*™*Ü˜C ¨D¯I©I¯N©NÓ,<¸{Ñ,JÑ!KÓLó÷ ð ð —‘Ô Üœg×2Ñ2Ó3ñ Ü%×.Ñ.Ø×.Ñ.×3Ñ3Ó5Ü˜C ¨D¯I©I¯N©NÓ,<¸{Ñ,JÑ!KÓLó÷ �A÷÷K)	÷ )	ñ )	ùð )	ùð,øð
ùô ×(Ñ(¬.Ð9ò Ùðúðø÷ð ûð —‘Ô Üœg×2Ñ2Ó3ñ Ü%×.Ñ.Ø×.Ñ.×3Ñ3Ó5Ü˜C ¨D¯I©I¯N©NÓ,<¸{Ñ,JÑ!KÓLó÷ ð �A÷÷ ñ ýðK)	ø÷ )	÷ )	ñ )	üs  ‚K*“G:”K*—K¥K*°G=±K*¶!KÁB;HÄH ÄA HÅHÅHÅ)KÆAH%ÇH#ÇH%Ç!KÇ)K*Ç4KÇ5K*Ç=K*È HÈHÈH ÈH1ÈH È H1È#H%È%H.	È*KÈ1*KÉAK	Ê5J8Ê6K	Ê;	KËKË	KËKËK*ËK'ËKËK'Ë#K*c                óF  •— | j                   5  | j                  r
	 ddd«       yd| _        | j                  }	 t        j                  «       }	 |€t        d«      ‚|�$||u r |j                  | j                  «       «      }n$t        j                  | j                  «       |«      }ddd«       y# t
        $ r d}Y Œnw xY w# t        $ rL 	 t        ‰| �-  «        | j                  j                  «        n# | j                  j                  «        w xY wY Œnw xY w# 1 sw Y   yxY w)a5  
        Immediately terminates the connection without a graceful handshake.

        This method is a forceful shutdown that cancels all background I/O tasks
        and cleans up resources. It should be used for final cleanup or after an
        unrecoverable error. Unlike ``close()``, it does not attempt to send a close
        frame or wait for pending messages. It schedules the cleanup to run on the
        event loop and returns immediately. It does not wait for cleanup completion.

        This method is thread-safe, task-safe, and idempotent.
        NTzEvent loop not available)rA  rJ  r>  r_  re  ÚRuntimeErrorr~  Ú_terminate_helperÚrun_coroutine_threadsafer™   rf   rŸ   rK  Úset)rh   rf  Úcurrent_looprÈ   rk   s       €rE   rŸ   zAsyncWebSocket.terminate  s  ø€ ð ×!Ñ!ñ 	1Ø×ÒØ÷	1ð 	1ð  $ˆDÔà59·Z±ZˆDð$ä×,Ñ,Ó.ð ð1Ø�<Ü&Ð'AÓBÐBð  Ð+°ÀÑ0DØ×(Ñ(¨×)?Ñ)?Ó)AÓB‘Aä×8Ñ8¸×9OÑ9OÓ9QÐSWÓX�A÷/	1ð 	1øô  ò $Ø#’ð$ûô ò 1ð1Ü‘GÑ%Ô'à×*Ñ*×.Ñ.Õ0ø�D×*Ñ*×.Ñ.Õ0úÑ0ð	1ú÷5	1ð 	1úsd   ŽD¥D¹B.ÁAB?Â.B<Â9DÂ;B<Â<DÂ?	DÃ	C2ÃDÃ2DÄDÄDÄDÄDÄD c           	   ƒ  óž  K  — | j                   j                  }| j                  j                  }| j                  j                  }| j
                  }|j                  }|j                  }|j                  }|j                  }| j                  }	 |«       |	z   }
| j                  j                  }| j                  j                  }| j                  j                  }t        | j                  j                   «      }t#        t$        j&                  «      }t#        t$        j(                  «      }t#        t$        j*                  «      }t#        t,        j.                  «      }t#        t,        j0                  «      }t,        j2                  t,        j4                  z  |z  }| j6                  }| j8                  }d}t:        }d}g }d}|j<                  }|j>                  }	 | j@                  �s1	  |«       \  }}|jf                  })|dkD  rd}|)|z  rÎ|ti        |«      z  }||kD  r8 |«        | jU                  t[        d|› d|› d�t$        jj                  «      «       y ||«       |)|z  sD|jl                  s8ti        |«      dk(  r|d   ndjo                  |«      }* |«        d}	  ||*|)f«        |«       |
k\  r'ta        jb                  d«      ƒ d{  –—†   |«       |	z   }
Œþ|)|z  r, |«        	  |||)f«       | ju                  |«      ƒ d{  –—†  y| j@                  s�Œ0yy# tB        $ �r4} d}!| jD                  |k(  rd}!n€| jD                  |k(  r$tG        | «      jI                  «       }"d|"v sd|"v rPd}!nM| jD                  |k(  r>tK        dtL        jN                  «      }#| |#_(        d|#_)        | jU                  |#«       Y d} ~ y|!�r |«       }$	  || jV                  ||$«       |$ƒ d{  –—†7   n‚# tX        $ rv}%| jU                  t[        d	|%› �t$        j\                  «      «       Y d}%~%| jV                  d
k7  r-	  || jV                  «      }&n# tX        $ r Y nw xY wY d} ~ yY d} ~ yY d} ~ yd}%~%ww xY w	 | jV                  d
k7  rZ	  || jV                  «      }&nF# tX        $ r Y n;w xY w# | jV                  d
k7  r#	  || jV                  «      }&w # tX        $ r Y w w xY ww xY wY d} ~ �Œú|rf| jD                  |v rX||k  rS|dz  }|d|dz
  z  z  }'|'dz  }(|'t_        |( |(«      z  }'ta        jb                  te        d|'«      «      ƒ d{  –—†7   Y d} ~ �Œb| jU                  | «       Y d} ~ yd} ~ ww xY w# t`        jp                  $ rD |s+| jU                  t[        |t$        jr                  «      «       Y y ||*|)f«      ƒ d{  –—†7   Y �Œ
w xY w7 �Œì# t`        jp                  $ rD |s+| jU                  t[        |t$        jr                  «      «       Y y |||)f«      ƒ d{  –—†7   Y �Œw xY w7 �Œ# t`        jv                  $ r Y ytX        $ r} | jU                  | «       Y d} ~ yd} ~ ww xY w­w)a©  
        The main asynchronous task for reading incoming WebSocket frames.

        Attempts to read immediately and only registers an event loop reader if
        the socket returns EAGAIN (empty). It waits for the underlying socket to
        become readable, and upon being woken by the event loop, it drains all
        buffered data from libcurl until it receives an EAGAIN error. This error
        signals that the buffer is empty, and the loop returns to an idle state,
        waiting for the next readability event. This is "optimistic reading".

        To ensure cooperative multitasking during high-volume message streams,
        the loop yields control to the asyncio event loop periodically which
        is tracked using an operation counter.

        If the receive queue becomes full, ``await self._receive_queue.put()`` will
        block the reader loop and stall the socket read task. Thus, appropriate queue
        sizes should be set by the user, to match the speed at which they are expected
        to be consumed. If latency is a factor, a smaller queue size should be used.
        Conversely, a larger queue size provides burst message handling capacity.
        zDReceive queue full; failing connection to preserve message integrityr   FTzerrno 11z resource temporarily unavailablez.Connection closed unexpectedly by server (EOF)NzSocket closed unexpectedly: r]  r#   r   gš™™™™™¹?r£  zMessage too large: z bytes (limit zF bytes). Consider increasing max_message_size or chunking the message.rD   )<r…   rô   rD  r’  r•  rf  r¤  Úcreate_futureÚ
add_readerÚremove_readerrH  rL  r:   rH   r?   r;   r<   r>   r   r  rB   ÚGOT_NOTHINGr   rº   r  r  r  rN  rP  ry   rÿ   Úclearr‚   r!   rj   rl   Úlowerrr   rO   rV   Ú	__cause__Ú__suppress_context__rz  r?  r™   rd   rü   r   r_  Úsleepr¦  r¾   r•   rŸ  r   r  r“  ÚOUT_OF_MEMORYÚ_handle_close_framer‹  )+rh   Úcurl_ws_recvÚqueue_put_nowaitÚ	queue_putrf  Ú	loop_timer°  r±  r²  Ú
time_sliceÚ
next_yieldÚretry_on_errorÚretry_codesÚmax_retriesÚ
retry_baseÚe_againÚ
e_recv_errÚ	e_nothingÚ
close_flagÚ	cont_flagÚ	data_maskÚmax_msg_sizeÚblock_on_recvÚqueue_full_errÚset_fut_resultÚrecv_error_retriesr  Úmsg_sizeÚchunks_appendÚchunks_clearrõ   rš   r›   Úshould_retryÚerr_msgÚ	final_excÚread_futurery  rÈ   Úretry_delayÚjitterr¾   ri   s+                                              rE   r  zAsyncWebSocket._read_loop0  s  è ø€ ð. AEÇ	Á	×@QÑ@Qˆà×Ñ×*Ñ*ð 	ð ×Ñ×#Ñ#ð 	ð +/¯)©)ˆØ)-¯©ˆ	Ø<@×<NÑ<NˆØ*.¯/©/ˆ
Ø-1×-?Ñ-?ˆØ ×1Ñ1ˆ
Ù%›K¨*Ñ4ˆ
Ø#Ÿ}™}×2Ñ2ˆØ&*§m¡m×&9Ñ&9ˆØŸ=™=×.Ñ.ˆÜ! $§-¡-×"5Ñ"5Ó6ˆ
Üœ9Ÿ?™?Ó+ˆÜœi×2Ñ2Ó3ˆ
ÜœY×2Ñ2Ó3ˆ	Üœj×.Ñ.Ó/ˆ
ÜœZŸ_™_Ó-ˆ	Ü#×*Ñ*¬Z¯_©_Ñ<¸yÑHˆ	Ø ×2Ñ2ˆØ"×<Ñ<ˆàRð 	ô BRˆð #$ÐØ ˆØˆØ17·±ˆØ+1¯<©<ˆðY	)Ø—k“kðLÙ#/£>‘L�E˜5ðZ #Ÿ[™[�Ø%¨Ò)Ø)*Ð&ð ˜9Ò$à¤ E£
Ñ*�HØ ,Ò.Ù$œØ×1Ñ1Ü*à&9¸(¸ð D.Ø.:¨^ð <<ð%<ô
 !*× 3Ñ 3óô
ð ñ " %Ô(ð " IÒ-°·²ä),¨V«¸Ò)9˜F 1šI¸s¿x¹xÈÓ?Oð  ñ %œØ#$˜ð
>Ù,¨g°uÐ-=Ô>ñ !“{ jÒ0Ü%Ÿm™m¨AÓ.×.Ð.Ù%.£[°:Ñ%=˜
àð ˜:Ò%Ù ”Nð	8Ù(¨%°¨Ô8ð ×2Ñ2°5Ó9×9Ð9Øðc —k–køô !ó IØ).�Lð —v‘v Ò(Ø'+™ð Ÿ™ :Ò-Ü'*¨1£v§|¡|£~˜à&¨'Ñ1ØAÀWÑLà+/™Lð Ÿ™ 9Ò,Ü5DØLÜ'×8Ñ8ó6˜	ð /0˜	Ô+Ø9=˜	Ô6Ø×1Ñ1°)Ô<Üâ#Ù<I»O˜ð)Ù& t§}¡}°nÀkÔRØ"-×-Ò-øô  )ò #Ø ×5Ñ5Ü .Ø&BÀ3À%Ð$HÜ$-×$EÑ$Eó!"ôó #ð  $Ÿ}™}°Ò2ð!)Ù(5°d·m±mÓ(D¡Aøä'0ò !)Ù$(ð!)úÜ$(ô %&ô  3ûð#úð .ð  $Ÿ}™}°Ò2ð!)Ù(5°d·m±mÓ(D¡Aøä'0ò !)Ù$(ð!)ûð	  $Ÿ}™}°Ò2ð!)Ù(5°d·m±mÓ(D¡Aøä'0ò !)Ù$(ð!)úð	  3úõ !ñ 'ØŸF™F kÑ1Ø.°Ò<à*¨aÑ/Ð*ð '¨!Ð0BÀQÑ0FÑ*GÑHð $ð )4°cÑ(9˜Ø#¤w°¨w¸Ó'?Ñ?˜Ü%Ÿm™m¬C°°[Ó,AÓB×BÑBÝ ð ×-Ñ-¨aÔ0ÜûðSIûô^  '×0Ñ0ò >Ù#0Ø $× 9Ñ 9Ü$2Ø(6¼	×8OÑ8Oó%&ô!"ñ
 !'Ù"+¨W°eÐ,<Ó"=×=Ô=ð>úð /úô #×,Ñ,ò 8Ù,Ø ×5Ñ5Ü .¨~¼y×?VÑ?VÓ Wôñ #á'¨°¨Ó7×7Ô7ð8úð :úô ×%Ñ%ò 	Ùô ò 	)Ø×%Ñ% a×(Ñ(ûð	)üs8  ‚GYÇX Ç&
L Ç0A"X ÉYÉAX Ê
U Ê$"X ËV2ËX Ë#
V5 Ë-X ÌXÌX ÌYÌX ÌYÌ
UÌ!BUÎ0X Î4YÎ5
UÏ O ÏOÏO ÏRÏ 	QÏ),QÐRÐUÐ)P<Ð;UÐ<	QÑUÑQÑUÑX ÑYÑX ÑYÑX ÑYÑQÑRÑ#UÑ3RÒUÒ	RÒUÒRÒUÒS	Ò&R9Ò8S	Ò9	S	ÓS	ÓS	ÓS	Ó	UÓX ÓAUÔ.T1Ô/UÔ4X Ô:UÕX ÕYÕUÕX Õ>V/ÖX ÖYÖV/Ö%V(Ö&V/Ö+X Ö.V/Ö/X Ö5>X×3X ×4Y×5XØXØXØX ØXØX ØY
Ø%YØ'Y
Ø/YÙ YÙY
Ù
Yc              ƒ  óÂ  K  — t         j                  t         j                  z  t         j                  z  }t	        t         j                  «      }| j
                  }| j                  j                  }| j                  j                  }| j                  j                  }| j                  }|j                  }| j                  }	 |«       |	z   }
	 | j                  s“	  |«       ƒ d{  –—† \  }}	  |||«      ƒ d{  –—† s&	  |«        | j                  s| j                  «        yy||z  r
	  |«        �nØ |«       |
k\  r't!        j"                  d«      ƒ d{  –—†   |«       |	z   }
 |«        Œ’	  |«       ƒ d{  –—† \  }}||fg}||z  sVt%        |«      | j&                  k  r>	  |«       \  }}|j)                  ||f«       ||z  rn	 t%        |«      | j&                  k  rŒ>	 g }|D ]X  \  }}||z  r|j)                  |g|f«       Œ |r#|d   d   |k(  r|d   d   j)                  |«       ŒE|j)                  |g|f«       ŒZ |D ]—  \  }} |dj-                  |«      |«      ƒ d{  –—† s@ t/        t%        |«      «      D ]	  } |«        Œ 	 | j                  s| j                  «        yy |«       |
k\  sŒqt!        j"                  d«      ƒ d{  –—†   |«       |	z   }
Œ™ 	 t/        t%        |«      «      D ]	  } |«        Œ 	 |d   d   |z  rn�Œž| j                  s| j                  «        yy7 �ŒE7 �Œ37 �ŒÚ#  |«        w xY w7 �ŒÇ# t         j*                  $ r Y �Œxw xY w7 Œø7 Œ’# t/        t%        |«      «      D ]	  } |«        Œ w xY w# t         j0                  $ r Y ŒŽt2        $ r}| j5                  |«       Y d}~Œ¬d}~ww xY w# | j                  s| j                  «        w w xY w­w)aÏ  
        The background task responsible for consuming the send queue
        and transmitting frames.

        To maximize performance, this loop hoists the configuration
        check and enters one of two distinct processing strategies:

        1. Standard Mode (No Coalescing):
            The default, low-latency path. Messages are consumed one-by-one
            from the queue and transmitted immediately. This guarantees that one
            ``send()`` call results in exactly one WebSocket message, preserving
            logical message boundaries.

        2. Coalescing Mode:
            An optimized throughput path for chatty streams. The loop greedily gathers
            multiple pending messages from the queue (up to ``max_send_batch_size``
            and merges their payloads into a single transmission if they share the
            same flags (e.g., multiple text frames). This reduces system call
            overhead but does not preserve individual message boundaries.

        Features:
        - Cooperative Multitasking: Yields to the event loop periodically to prevent
            the writer from starving the reader task during high-volume transmission.
        - Control Frame Priority: PING and CLOSE frames are never coalesced; they
            trigger an immediate flush of any pending batched data before being sent.
        - Lifecycle Management: Automatically terminates the connection cleanly upon
            transmitting a CLOSE frame.
        Nr   r]  r#   rD   )r   rº   rý   rþ   r>   Ú_send_payloadrE  rÂ   r‡  Ú	task_donerf  r¤  rI  rG  r‚   rŸ   r_  r¸  r•   rF  rÿ   rˆ  r  Úranger‹  r™   rz  )rh   Úcontrol_frame_flagsrÈ  Úsend_payloadÚ	queue_getÚqueue_get_nowaitÚ
queue_donerf  r¾  r¿  rÀ  r  r¾   Úbatchrš   Ú	coalescedÚpayloadsÚframe_grouprÈ   r›   s                       rE   r€  zAsyncWebSocket._write_loop  sã  è ø€ ô: $.×#3Ñ#3´j·o±oÑ#EÌ
ÏÉÑ#WÐÜœj×.Ñ.Ó/ˆ
Ø7;×7IÑ7IˆØ>B×>NÑ>N×>RÑ>Rˆ	Ø:>×:JÑ:J×:UÑ:UÐØ)-×)9Ñ)9×)CÑ)Cˆ
Ø*.¯)©)ˆØ)-¯©ˆ	Ø ×1Ñ1ˆ
Ù%›K¨*Ñ4ˆ
ðT	!à×(Ò(àÙ+4«;×%6‘N�G˜Uð%Ù%1°'¸5Ó%A×AÐAØ"ñ #œð~ —;’;Ø—‘Õ ð ðQ ! :Ò-Ø!ñ #žñ %›;¨*Ò4Ü")§-¡-°Ó"2×2Ð2Ù)2«°zÑ)A˜Jñ #œð! ð( Ù+4«;×%6‘N�G˜Uð 6=¸eÐ4DÐ3E�EØ! JÒ.Ü! %›j¨4×+DÑ+DÒDð&Ù1AÓ1C¡ ¨Ø %§¡¨g°uÐ-=Ô >Ø#(¨:Ò#5Ø$)ð $6ô	 " %›j¨4×+DÑ+DÓDð)ð
 ð "ð /4ò I™N˜G UØ$Ð':Ò:Ø )× 0Ñ 0°7°)¸UÐ1CÕ Dá#,°¸2±¸qÑ1AÀUÒ1JØ$-¨b¡M°!Ñ$4×$;Ñ$;¸GÕ$Dà$-×$4Ñ$4°w°iÀÐ5GÕ$HðIð 6?ò FÑ1˜H kÙ)5°c·h±h¸xÓ6HÈ+Ó)V×#VÐ#VØ &ô "'¤s¨5£zÓ!2ò )˜AÙ&�Lñ)ð  —;’;Ø—‘Õ ð ñ-  )›{¨jÓ8Ü&-§m¡m°AÓ&6× 6Ð 6Ù-6«[¸:Ñ-E¡
ñFô "'¤s¨5£zÓ!2ò )˜AÙ&�Lñ)ð ˜R‘y ‘| jÒ0Øña ðv —;’;Ø—‘Õ ð ð] &7ùð  Bùð 3úñ #�úð
 &7úô $+×#5Ñ#5ò &Ú %ð&úð( $Wøð
 !7ùô
 "'¤s¨5£zÓ!2ò )˜AÙ&�Lñ)ûô ×%Ñ%ò 	Ùô ò 	)Ø×%Ñ% a×(Ñ(ûð	)ûð
 —;’;Ø—‘Õ ð üs9  ‚COÃN Ã"L'Ã#N Ã+L0 Ã7L*Ã8L0 Ã=N ÄOÄ"L0 Ä(	N Ä1"L0 ÅL-ÅL0 Å"N Å5L<Å6)N Æ "L? ÇN ÇBM É MÉ!M É& N ÊOÊ%
M Ê0M ËMË	M Ë/N Ì	OÌ'N Ì*L0 Ì-L0 Ì0	L9Ì9N Ì?MÍN ÍMÍN ÍM ÍM Í"M?Í?N ÎN:ÎN= ÎN:ÎN5Î0N= Î5N:Î:N= Î=OÏOc              ƒ  óŒ  K  — | j                   j                  }| j                  }|j                  }|j                  }|j
                  }|j                  }t        }	| j                  }
| j                  } |«       |z   }| j                  }t        t        j                  «      }t        t        j                  «      }d}|| z  }t!        |«      }|j"                  }d}d}d}|}||k  s
|dk(  rË|dk(  rÆ||k(  r||z
  |kD  r||z   }||z  }n|}|}	  |||| |«      }|dk(  rM||z
  dk(  ry|dz  }||k\  r.| j%                  t'        d|› d�t        j(                  «      «       yt+        d|«      ‚|rd}||z  } |«       |k\  r't-        j.                  d«      ƒ d	{  –—†   |«       |z   }||k  rŒ»|dk(  r|dk(  rŒÆy7 Œ # t*        $ rþ}|j0                  |k(  rÔ |«       }	  ||
|	|«       |ƒ d	{  –—†7   nn# t2        $ rb}| j%                  t'        d
|› �t        j4                  «      «       Y d	}~|
dk7  r#	  ||
«      }n# t2        $ r Y nw xY wY d	}~yY d	}~yY d	}~yd	}~ww xY w	 |
dk7  r<	  ||
«      }n2# t2        $ r Y n'w xY w# |
dk7  r	  ||
«      }w # t2        $ r Y w w xY ww xY wY d	}~�ŒÄ| j%                  |«       Y d	}~yd	}~ww xY w­w)zF
        Optimized low-level sender with fragmentation logic.
        r=   r   Tr#   zWriter stalled (z attempts).Fz0 bytes sentNz)Socket closed unexpectedly during write: r]  )r…   r  rf  r¤  r°  Ú
add_writerÚremove_writerry   r?  rI  rQ  r>   r   r  r   r  Ú
memoryviewÚnbytesrz  rd   ÚWRITE_ERRORr!   r_  r¸  rj   r™   rü   )rh   r  r¾   Úcurl_ws_sendrf  r¾  r°  rç  rè  rÎ  r  r¿  rÀ  Úmax_frame_sizerÅ  rÉ  Úmax_zero_writesÚ
base_flagsÚviewÚtotal_bytesr  Úwrite_retriesÚ	frame_endÚcurrent_flagsr  r›   Úwrite_futurery  rÈ   s                                rE   rÚ  zAsyncWebSocket._send_payload†  s&  è ø€ ð GKÇiÁi×FWÑFWˆØ*.¯)©)ˆØ)-¯©ˆ	Ø<@×<NÑ<NˆØ*.¯/©/ˆ
Ø-1×-?Ñ-?ˆÜAQˆØ—}‘}ˆØ ×1Ñ1ˆ
Ù%›K¨*Ñ4ˆ
Ø"×7Ñ7ˆÜœ9Ÿ?™?Ó+ˆÜœZŸ_™_Ó-ˆ	Ø ˆð   9 *Ñ,ˆ
Ü% gÓ.ˆØŸ;™;ˆØˆØˆØˆ	Ø*/ˆð �{Ò" v°¢{°{ÀaÒ7Gà˜Ò"Ø Ñ'¨.Ò8Ø &¨Ñ 7�IØ$.°Ñ$:‘Mà +�IØ$)�Mð?á*¨4°°yÐ+AÀ=ÓQ�à˜Q’;à  6Ñ)¨QÒ.Ø#ð " QÑ&�MØ$¨Ò7Ø×1Ñ1Ü*Ø"2°=°/ÀÐ MÜ )× 5Ñ 5óôð  %ä# N°GÓ<Ð<á Ø$%�Mà˜&Ñ �ñ “; *Ò,Ü!Ÿ-™-¨Ó*×*Ð*Ù!*£¨zÑ!9�JðQ �{Ó" v°¢{°{ÀaÓ7GðV ðI +ùô ò Ø—6‘6˜WÒ$á9F»�Lð%Ù" 7¨N¸LÔIØ*×*Ò*øô %ò %Ø×1Ñ1Ü*Ø"KÈCÈ5Ð QÜ )× AÑ Aóôó  %ð # bš=ð%Ù$1°'Ó$:¡øä#,ò %Ù $ð%úÜ $ô !"ô )ûð%úð +ð # bš=ð%Ù$1°'Ó$:¡øä#,ò %Ù $ð%ûð	 # bš=ð%Ù$1°'Ó$:¡øä#,ò %Ù $ð%úð	 )úõ ð ×)Ñ)¨!Ô,Üûð?üs2  ‚DKÄF: Ä'KÄ(7F: ÅKÅ 7F: ÆF8ÆF: Æ&KÆ,
KÆ7KÆ8F: Æ:	KÇJ<ÇG0Ç)G,Ç*G0Ç/I=Ç0	IÇ9,IÈ%I=È)J<È/H8È7J<È8	IÉJ<ÉIÉJ<ÉKÉIÉI=ÉJ<É%I.É-J<É.	I:É7J<É9I:É:J<É=JÊJÊJÊ	J	ÊJÊJ	ÊJÊJ<Ê KÊ&J<Ê7KÊ<KËKc              ƒ  óä  K  — | j                   €yt        j                  | j                  j	                  «       «      }	 t        j
                  || j                   ht        j                  |¬«      ƒ d{  –—† \  }}|st        d«      ‚||v rO	 |j                  «       s=|j                  «       }t        t        j                  «      5  |ƒ d{  –—†  ddd«       yy| j                   |v r�	 | j                   j                  «        | j                  j                  «       rO	 |j                  «       s=|j                  «       }t        t        j                  «      5  |ƒ d{  –—†  ddd«       yyt        d«      ‚	 |j                  «       s=|j                  «       }t        t        j                  «      5  |ƒ d{  –—†  ddd«       yy7 �ŒT7 Œý# 1 sw Y   yxY w# t        $ r}t        d«      |‚d}~ww xY w7 Œ–# 1 sw Y   yxY w7 ŒJ# 1 sw Y   yxY w# |j                  «       sJ|j                  «       }t        t        j                  «      5  |ƒ d{  –—†7   ddd«       w # 1 sw Y   w xY ww xY w­w)a¬  Waits until all items in the send queue have been processed.

        This ensures that all messages passed to `send()` have been handed off to the
        underlying socket for transmission. It does not guarantee that the data has
        been received by the remote peer.

        Args:
            timeout (float | None, optional): The maximum number of seconds to wait
            for the queue to drain.

        Raises:
            WebSocketTimeout:  If the send queue is not fully processed within the
            specified ``timeout`` period.
            WebSocketError: If the writer task has already terminated while unsent
            messages remain in the queue.
        Nr…  z*Timed out waiting for send queue to flush.z#Writer task crashed while flushing.z0Writer task stopped unexpectedly while flushing.)rC  r_  r~  rE  r  r‰  rŠ  ru   rj  rŒ  r   r‹  Úresultr™   rd   Úempty)rh   rÔ   Ú	join_taskrj  rÈ   ry  s         rE   r¥  zAsyncWebSocket.flushó  sI  è ø€ ð" ×ÑÐ#Øô )0×(;Ñ(;¸D×<LÑ<L×<QÑ<QÓ<SÓ(Tˆ	ð 	$Ü#ŸL™LØ˜D×,Ñ,Ð-Ü#×3Ñ3Øô÷ ‰GˆD�!ñ Ü&Ð'SÓTÐTð ˜DÑ Øð" —>‘>Ô#Ø×$Ñ$Ó&�Üœg×4Ñ4Ó5ñ $Ø#—O�O÷$ð $ð $ð ×Ñ 4Ñ'ðYØ×$Ñ$×+Ñ+Ô-ð
 ×#Ñ#×)Ñ)Ô+Øð —>‘>Ô#Ø×$Ñ$Ó&�Üœg×4Ñ4Ó5ñ $Ø#—O�O÷$ð $ð $ô	 %Ð%WÓXÐXð (ð —>‘>Ô#Ø×$Ñ$Ó&�Üœg×4Ñ4Ó5ñ $Ø#—O�O÷$ð $ð $ð9ùð> $ø÷$ð $ûô !ò YÜ(Ð)NÓOÐUXÐXûðYúð $ø÷$ð $úØ#ø÷$ð $ûð —>‘>Ô#Ø×$Ñ$Ó&�Üœg×4Ñ4Ó5ñ $Ø#—O‘O÷$÷ $ñ $úð $üs  ‚;I0¾5H Á3GÁ4H Â9I0ÃGÃG
ÃGÃ
I0ÃH Ã*G ÄH Ä9I0ÅG7ÅG5ÅG7Å#
I0Å-H Å99I0Æ2HÆ8HÆ9HÆ=
I0ÇH Ç
GÇGÇI0Ç	G2Ç!G-Ç-G2Ç2H Ç5G7Ç7H Ç<I0ÈHÈHÈ
I0È:I-ÉI ÉI
ÉI É	I-É I)É%I-É-I0c              ƒ  óÀ  •K  — | j                   | j                  fD �ch c]  }|�|j                  «       s|’Œ }}d}	 |D ]  }|j                  «       }Œ |rHt	        j
                  ||t        j                  ¬«      ƒ d{  –—† \  }}|D ]  }|j                  «       }Œ | j                  j                  «       sP	 | j                  j                  «       }| j                  j                  «        | j                  j                  «       sŒP| j                  dk7  rzt        t        «      5  | j                   j#                  | j                  «      }ddd«       t        t        «      5  | j                   j%                  | j                  «      }ddd«       d| _        t&        ‰| �Q  «        | j*                  r1| j*                  j,                  s| j*                  j/                  d«       | j0                  j3                  «        yc c}w 7 �Œ„# t        j                  t        f$ r Y �Œw xY w# 1 sw Y   ŒÛxY w# 1 sw Y   ŒªxY w# | j0                  j3                  «        w xY w­w)z)Utility method for connection terminationNr   )rÔ   r†  r]  )rB  rC  rj  rŒ  r_  r‰  ÚALL_COMPLETEDrE  rø  r‡  rÛ  rˆ  Ú
ValueErrorr?  r   r™   rf  r²  rè  rf   rŸ   r=  Ú_closedÚ	push_curlrK  r­  )	rh   ÚtÚtasks_to_cancelÚmax_timeoutÚio_taskrÈ   ÚpendingÚprk   s	           €rE   r«  z AsyncWebSocket._terminate_helper,  s  øè ø€ ð —o‘o t×'7Ñ'7Ð8ö4
àØˆ} Q§V¡V¤Xò ð4
ˆð 4
ð
 ˆð(	)à*ò %�Ø—N‘NÓ$‘ð%ñ Ü#*§<¡<Ø#Ø'Ü '× 5Ñ 5ô$÷ ‘
��7ð !ò #�AØŸ™›
‘Að#ð ×&Ñ&×,Ñ,Ô.ðØ×(Ñ(×3Ñ3Ó5�AØ×$Ñ$×.Ñ.Ô0ð ×&Ñ&×,Ñ,Õ.ð �}‰} Ò"ÜœiÓ(ñ ?ØŸ	™	×/Ñ/°·±Ó>�A÷?äœiÓ(ñ ?ØŸ	™	×/Ñ/°·±Ó>�A÷?ð ˆDŒMô ‰GÑÔØ�|Š| D§L¡L×$8Ò$8à—‘×&Ñ& tÔ,ð ×"Ñ"×&Ñ&Õ(ùò_4
ðúô  ×*Ñ*¬JÐ7ò Úðú÷
?ð ?ú÷?ð ?ûð ×"Ñ"×&Ñ&Õ(üs”   ƒIžG?¹I¾AH? Â HÂ8H? Â:4H Ã.H? Ä	H? Ä'&H'ÅH? Å$&H3Æ
AH? Ç$ IÈH? ÈH$È H? È#H$È$H? È'H0È,H? È3H<È8H? È?IÉIc              ƒ  ó¶  K  — 	 | j                  |«      \  | _        | _        | j
                  rq| j                  se| j                  t        j                  k(  rt        j                  n| j                  xs t        j                  }| j                  |«      ƒ d{  –—†  y| j                  «        y# t        $ r}|j                  | _        Y d}~Œ­d}~ww xY w7 Œ=­w)z<Unpack and handle the closing frame, then initiate shutdown.N)rœ   r   r€   rd   rj   r~   r‚   rO   rU   rQ   rž   rŸ   )rh   ri   r›   rŠ   s       rE   rº  z"AsyncWebSocket._handle_close_frame_  s±   è ø€ ð	&Ø37×3KÑ3KÈGÓ3TÑ0ˆDÔ˜dÔ0ð �>Š> $§+¢+ð ×#Ñ#¤{×':Ñ':Ò:ô —’à×&Ñ&Ò8¬+¯.©.ð ð
 —*‘*˜ZÓ(×(Ñ(ð �N‰NÕøô ò 	&Ø Ÿv™vˆD×Ñûð	&úð )ús:   ‚C„B0 ¢A7CÂCÂCÂ0	CÂ9CÃ
CÃCÃC)r=  r3   r…   r    r~   r9   r�   r9   rT  r>   rU  r>   rV  r>   rW  r9   rL  zWebSocketRetryStrategy | NonerX  r;   rY  r;   rZ  r>   rO  r9   r[  r9   rm   rn   )rm   zasyncio.AbstractEventLoop)rm   r>   )rm   r9   )rm   r*   )ro  útype[BaseException] | Nonerp  úBaseException | Nonerq  úobject | Nonerm   rn   r2  )ry  r™   rm   rn   r£   )rÔ   úfloat | Nonerm   r5  )rÔ   r	  rm   rl   )r   r6  rÔ   r	  rm   r5   )r  z$str | bytes | bytearray | memoryviewr¾   úCurlWsFlag | intrÔ   r	  rm   rn   )r  r¢   rm   rn   )r  rl   rm   rn   )r  r8  r   r9  rm   rn   )r  r7  rm   rn   )rj   r>   ri   r7  rÔ   r;   rm   rn   )r  zbytes | memoryview | bytearrayr¾   r
  rm   r9   rA   )rÔ   r	  rm   rn   )ri   r¢   rm   rn   )*rI   rJ   rK   rL   rƒ   rQ  rM   rg   r¤   rf  rU  rk  rm  rr  rt  rw  rz  r‚  r¹   r	  r:  r  r   r  r  r  r  r  r(  r*  r,  rO   rQ   rž   rŸ   r  r€  rÚ  r¥  r«  rº  ro   rp   s   @rE   r<  r<  ›  s©  ø… ñð€Ið. (-Ð˜*Ó,ð ØØ"Ø"Ø#%Ø %Ø26Ø!%Ø!&Ø /Ø$Ø)-ñ!VHàðVHð ðVHð
 ðVHð ðVHð ðVHð ðVHð !ðVHð ðVHð 0ðVHð ðVHð ðVHð ðVHð ðVHð  #'ð!VHð" 
õ#VHðp òó ðð ò(ó ð(óBó&ð#à,ð#ð &ð#ð ð	#ð
 
ó#ó ó
óó."
ðH 59õ n3ð` 9=õ ð& %/Ø $ñ	ð "ðð ð	ð
 
óðF #-×"3Ñ"3Ø $ð	Ià5ðIð  ðIð ð	Ið
 
óIóV;ó;ó9ð ?Iñ3Øð3Ø);ð3à	ó3ó?ð6  —N‘NØ"Øð	;àð;ð ð;ð ð	;ð
 
ó;õz+1óZV)óp|!ð|kØ5ðkØ>Nðkà	ókôZ7$õr1)÷frD   r<  c                  óD   — e Zd ZdZdZdd„Zd	d„Zd
d„Z	 	 	 	 	 	 	 	 dd„Zy)ÚAsyncWebSocketContextz.Helper to enable simpler context manager usage©Ú_coroÚ_objc                ó    — || _         d | _        y rA   r  )rh   Úcoros     rE   rg   zAsyncWebSocketContext.__init__x  s   € Ø04ˆŒ
Ø+/ˆ�	rD   c                ó6   — | j                   j                  «       S rA   )r  Ú	__await__rˆ   s    rE   r  zAsyncWebSocketContext.__await__|  s   € Ø�z‰z×#Ñ#Ó%Ð%rD   c              ƒ  óX   K  — | j                   ƒ d {  –—† | _        | j                  S 7 Œ­wrA   r  rˆ   s    rE   rm  z AsyncWebSocketContext.__aenter__  s#   è ø€ ØŸ*™*×$ˆŒ	Ø�y‰yÐð %ús   ‚*’(“*c              ƒ  ó  K  — | j                   r`|€#| j                   j                  «       ƒ d {  –—†  y t        t        «      5  | j                   j                  «       ƒ d {  –—†  d d d «       y y 7 ŒA7 Œ# 1 sw Y   y xY w­wrA   )r  rž   r   r!   )rh   ro  ry  Útbs       rE   rr  zAsyncWebSocketContext.__aexit__ƒ  sm   è ø€ ð �9Š9ØÐØ—i‘i—o‘oÓ'×'Ñ'äœiÓ(ñ ,ØŸ)™)Ÿ/™/Ó+×+Ð+÷,ð ,ð	 à'øð ,ø÷,ð ,üs9   ‚,B ®A0¯B ÁA4Á!A2Á"A4Á&B Á2A4Á4A=Á9B N)r  zAwaitable[AsyncWebSocket]rm   rn   )rm   z)Generator[object, object, AsyncWebSocket])rm   r<  )ro  r  ry  r  r  r  rm   rn   )	rI   rJ   rK   rL   rƒ   rg   r  rm  rr  rC   rD   rE   r  r  r  sD   „ á8à!€Ió0ó&óð,à,ð,ð "ð,ð ð	,ð
 
ô,rD   r  )rx   zasyncio.Future[None]rm   rn   )brL   Ú
__future__r   r_  r�   ra  rÃ   r   Úcollections.abcr   r   r   Ú
contextlibr   Údataclassesr	   r
   Úenumr   Újsonr   r(  r   r:  Úrandomr   r   Útypingr   r   r   r   r   r   Úaior   r   Úconstr   r   r   r   r   r…   r    r!   Úutilsr"   Ú
exceptionsr$   r%   Úmodelsr&   r'   r(   r)   Útyping_extensionsr*   r+   r,   Úfingerprintsr-   rî   r.   rí   r/   rÝ   r0   r1   r2   r=  r3   r4   r5   r¢   Ú	ON_DATA_Trl   ÚON_MESSAGE_TÚ
ON_ERROR_TÚ	ON_OPEN_Tr>   Ú
ON_CLOSE_TÚtupleÚRECV_QUEUE_ITEMÚ	bytearrayré  ÚSEND_QUEUE_ITEMr8   rO   rd   rr   ru   ry   r{   r3  r6   r<  r  rC   rD   rE   ú<module>r/     sß  ðñõ #ã Û Û Û Ý %ß :Ñ :Ý ß (Ý Ý $Ý $Ý Ý ß F× Fç /ß HÕ Hß "Ý #ß .Ý ß 8Ñ 8áÝ&å'Ý"Ý*Ý$Ý$ßOÑOß0á�‹€Aà˜+ u¨kÐ:¸DÐ@ÑA€IØ˜[¨%°#©+Ð6¸Ð<Ñ=€LØ˜;¨	Ð2°DÐ8Ñ9€JØ˜+˜¨Ð,Ñ-€IØ˜;¨¨SÐ1°4Ð7Ñ8€JØ˜E 3˜JÑ'€OØ˜E IÑ-°
Ñ:¸JÈÑ<LÐLÑM€Oð ÷Rð Ró ðRô,�'ô ô.(�Yô (ô'Ø�Mô'ô)Ø�Gô)ó÷ Eñ EðP ÐFÑGÐ ð ôE�ó Eó ðEðP ôS�]ó Só ðSðl& ÷,ð ,ó ñ,rD   