
    2Bfp                        d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
	 d dlZ	 d dlZddlmZ ddlmZ ddlmZ  ej$                  d      Zg Zd	 Zda G d
 de      Zy# e$ r dZY Ew xY w# e$ r dZY Mw xY w)    )	b64encode)JSONDecodeErrorN   )
exceptions)packet)payloadzengineio.clientc                     t         dd D ]#  }|j                         r|j                          % t        t              rt	        | |      S t        j                  | |      S )zdSIGINT handler.

    Disconnect all active clients and then invoke the original signal handler.
    N)connected_clientsis_asyncio_based
disconnectcallableoriginal_signal_handlersignaldefault_int_handler)sigframeclients      O/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/engineio/client.pysignal_handlerr      s]    
 $A&  &&(  '(&sE22 ))#u55    c                       e Zd ZdZg dZ	 	 	 	 	 ddZd ZddZ	 	 ddZd Z	d	 Z
dd
Zd Zd Zd dZd Zd Zd Zd Zd Zd Zd Z	 	 d!dZd Zd Zd Zd Zd Zd Zy)"Clienta\  An Engine.IO client.

    This class implements a fully compliant Engine.IO web client with support
    for websocket and long-polling transports.

    :param logger: To enable logging set to ``True`` or pass a logger object to
                   use. To disable logging set to ``False``. The default is
                   ``False``. Note that fatal errors are logged even when
                   ``logger`` is ``False``.
    :param json: An alternative json module to use for encoding and decoding
                 packets. Custom json modules must have ``dumps`` and ``loads``
                 functions that are compatible with the standard library
                 versions.
    :param request_timeout: A timeout in seconds for requests. The default is
                            5 seconds.
    :param http_session: an initialized ``requests.Session`` object to be used
                         when sending requests to the server. Use it if you
                         need to add special client options such as proxy
                         servers, SSL certificates, custom CA bundle, etc.
    :param ssl_verify: ``True`` to verify SSL certificates, or ``False`` to
                       skip SSL certificate verification, allowing
                       connections to servers with self signed certificates.
                       The default is ``True``.
    )connectr   messageNc                 f   t         Qt        j                         t        j                         k(  r(t	        j                  t        j
                  t              a i | _        d | _        d | _	        d | _
        d | _        d | _        d | _        d | _        || _        d | _        d | _        d | _        d | _        d| _        || _        ||t,        j.                  _        t3        |t4              s|| _        || _%        y t8        | _        | j6                  j:                  t<        j>                  k(  r|r*| j6                  jA                  t<        jB                         n)| j6                  jA                  t<        jD                         | j6                  jG                  t=        jH                                || _%        y Ndisconnected)&r   	threadingcurrent_threadmain_threadr   SIGINTr   handlersbase_url
transportscurrent_transportsidupgradesping_intervalping_timeouthttpwsread_loop_taskwrite_loop_taskqueuestate
ssl_verifyr   Packetjson
isinstanceboolloggerdefault_loggerlevelloggingNOTSETsetLevelINFOERROR
addHandlerStreamHandlerrequest_timeout)selfr5   r2   r?   http_sessionr0   s         r   __init__zClient.__init__H   sI    #*((*i.C.C.EE&,mmFMM4B'D#!%!  	"#
#
$!%FMM&$' DK  / )DK{{  GNN2KK((6KK((7&&w'<'<'>?.r   c                      y)NF r@   s    r   r   zClient.is_asyncio_basedr   s    r   c                 ^      j                   vrt        d       fd}||S  ||       y)a  Register an event handler.

        :param event: The event name. Can be ``'connect'``, ``'message'`` or
                      ``'disconnect'``.
        :param handler: The function that should be invoked to handle the
                        event. When this parameter is not given, the method
                        acts as a decorator for the handler function.

        Example usage::

            # as a decorator:
            @eio.on('connect')
            def connect_handler():
                print('Connection request')

            # as a method:
            def message_handler(msg):
                print('Received message: ', msg)
                eio.send('response')
            eio.on('message', message_handler)
        zInvalid eventc                 &    | j                   <   | S N)r"   )handlereventr@   s    r   set_handlerzClient.on.<locals>.set_handler   s    #*DMM% Nr   N)event_names
ValueError)r@   rJ   rI   rK   s   ``  r   onz	Client.onu   s8    , (((_--	 ?Gr   c                 B   | j                   dk7  rt        d      ddg}|3t        |t              r|g}|D cg c]  }||v r|
 }}|st        d      |xs || _        | j                         | _         t        | d| j                  d   z         ||xs i |      S c c}w )a  Connect to an Engine.IO server.

        :param url: The URL of the Engine.IO server. It can include custom
                    query string parameters if required by the server.
        :param headers: A dictionary with custom headers to send with the
                        connection request.
        :param transports: The list of allowed transports. Valid transports
                           are ``'polling'`` and ``'websocket'``. If not
                           given, the polling transport is connected first,
                           then an upgrade to websocket is attempted.
        :param engineio_path: The endpoint where the Engine.IO server is
                              installed. The default value is appropriate for
                              most cases.

        Example usage::

            eio = engineio.Client()
            eio.connect('http://localhost:5000')
        r   z%Client is not in a disconnected statepolling	websocketzNo valid transports provided	_connect_r   )r/   rM   r3   strr$   create_queuer.   getattr)r@   urlheadersr$   engineio_pathvalid_transports	transports          r   r   zClient.connect   s    * ::'DEE%{3!*c*(\
5? <	&*:: $ <J < !?@@$8(8&&(
>wt[4??1+==>B/ 	/<s   Bc                 R    | j                   r| j                   j                          yy)zWait until the connection with the server ends.

        Client applications can use this function to block the main thread
        during the life of the connection.
        N)r,   joinrE   s    r   waitzClient.wait   s$     $$& r   c                 l    | j                  t        j                  t        j                  |             y)a  Send a message to a client.

        :param data: The data to send to the client. Data can be of type
                     ``str``, ``bytes``, ``list`` or ``dict``. If a ``list``
                     or ``dict``, the data will be serialized as JSON.
        dataN)_send_packetr   r1   MESSAGE)r@   r`   s     r   sendzClient.send   s!     	&--TBCr   c                    | j                   dk(  r| j                  t        j                  t        j                               | j
                  j                  d       d| _         | j                  dd       | j                  dk(  r| j                  j                          |s| j                  j                          d| _         	 t        j                  |        | j!                          y# t        $ r Y w xY w)	zDisconnect from the server.

        :param abort: If set to ``True``, do not wait for background tasks
                      associated with the connection to end.
        	connectedNdisconnectingr   F	run_asyncrQ   r   )r/   ra   r   r1   CLOSEr.   put_trigger_eventr%   r+   closer,   r\   r
   removerM   _reset)r@   aborts     r   r   zClient.disconnect   s     ::$fmmFLL9:JJNN4 (DJ>%%4##((*'DJ!((. 	  s   C* *	C65C6c                     | j                   S )zReturn the name of the transport currently in use.

        The possible values returned by this function are ``'polling'`` and
        ``'websocket'``.
        )r%   rE   s    r   rZ   zClient.transport   s     %%%r   c                 V    t        j                  |||      }|j                          |S )a  Start a background task.

        This is a utility function that applications can use to start a
        background task.

        :param target: the target function to execute.
        :param args: arguments to pass to the function.
        :param kwargs: keyword arguments to pass to the function.

        This function returns an object compatible with the `Thread` class in
        the Python standard library. The `start()` method on this object is
        already called by this function.
        )targetargskwargs)r   Threadstart)r@   rr   rs   rt   ths        r   start_background_taskzClient.start_background_task   s&     V$vF

	r   c                 ,    t        j                  |      S )z'Sleep for the requested amount of time.)timesleep)r@   secondss     r   r{   zClient.sleep   s    zz'""r   c                 Z    t        j                  |i |}t         j                  |_        |S )zCreate a queue object.)r.   QueueEmpty)r@   rs   rt   qs       r   rT   zClient.create_queue   s%    KK((++r   c                 ,    t        j                  |i |S )zCreate an event object.)r   Event)r@   rs   rt   s      r   create_eventzClient.create_event  s    ///r   c                      d| _         d | _        y r   )r/   r&   rE   s    r   rn   zClient._reset
  s    #
r   c                    t         | j                  j                  d       y| j                  ||d      | _        | j                  j                  d| j                  z          | j                  d| j                  | j                         z   || j                        }|%| j                          t        j                  d      |j                  dk  s|j                  d	k\  rP| j                          	 |j                         }t        j                  d
j                  |j                        |      	 t!        j"                  |j$                  j'                  d            }|j*                  d   }|j,                  t.        j0                  k7  rt        j                  d      | j                  j                  dt3        |j4                        z          |j4                  d   | _        |j4                  d   | _        t;        |j4                  d         dz  | _        t;        |j4                  d         dz  | _        d| _         | xj                  d| j6                  z   z  c_        d| _!        tD        jG                  |        | jI                  dd       |j*                  dd D ]  }| jK                  |        d| j8                  v r"d| jL                  v r| jO                  |||      ry| jQ                  | jR                        | _*        | jQ                  | jV                        | _,        y# t        $ r d}Y 5w xY w# t(        $ r t        j                  d      dw xY w)z<Establish a long-polling connection to the Engine.IO server.Nz?requests package is not installed -- cannot send HTTP requests!rP   z!Attempting polling connection to GET)rW   timeoutz Connection refused by the server   ,  z,Unexpected status code {} in server responseutf-8encoded_payloadzUnexpected response from serverr   z"OPEN packet not returned by serverz!Polling connection accepted with r&   r'   pingInterval     @@pingTimeout&sid=re   r   Frg   r   rQ   )-requestsr5   error_get_engineio_urlr#   info_send_request_get_url_timestampr?   rn   r   ConnectionErrorstatus_coder2   r   formatr   PayloadcontentdecoderM   packetspacket_typer   OPENrS   r`   r&   r'   intr(   r)   r%   r/   r
   appendrk   _receive_packetr$   _connect_websocketrx   _write_loopr-   _read_loop_pollingr,   )	r@   rV   rW   rX   rargpopen_packetpkts	            r   _connect_pollingzClient._connect_polling  s   KK 4 5..sM9M<t}}LM4==4#:#:#<<g((  * 9KKM,,24 4==3!--3"6KKMffh ,,>EEMM#$') )	=		0@0@0IJA iil""fkk1,,46 6/#k6F6F2GG	I##E*#((4 !1!1.!ABVK 0 0 ?@6I!*488++ 
  &I799QR= 	&C  %	& $--'K4??,J&&sG]C  $99$:J:JK"88##%M #   	=,,138<=	=s   3L* 3/L< *L98L9< Mc           	         t         | j                  j                  d       y| j                  ||d      }| j                  r3| j                  j                  d|z          d}|d| j                  z   z  }n'd}|| _        | j                  j                  d|z          d}i }| j                  rd	j                  | j                  j                  D cg c](  }d
j                  |j                  |j                        * c}      }|j                         D ])  \  }	}
|	j                         dk(  s|r|d	z  }||
z  }||	=  n d|vr| j                  j                  t!        | j                  j                  t"              st%        d      dj                  | j                  j                  d   | j                  j                  d         j'                  d      }t)        |      j+                  d      }d|z   |d<   t!        | j                  j,                  t"              r7| j                  j,                  d   | j                  j,                  d   d|d<   n1| j                  j,                  rd| j                  j,                  i|d<   | j                  j.                  r#d}|j1                  d      rJ| j                  j.                  j3                  d| j                  j.                  j3                  d            }nI| j                  j.                  j3                  d| j                  j.                  j3                  d            }|r{t4        j6                  j9                  d|v r|nd|z         }|j:                  |d<   |j<                  |d<   |j>                  s|j@                  r|j>                  |j@                  fnd|d<   t!        | j                  jB                  tD              r=d|v r| j                  jB                  |d   d <   n9d | j                  jB                  i|d<   n| j                  jB                  sd| _#        | jF                  sd!tH        jJ                  i|d<   	 t        jL                  || jO                         z   f||dd"|}|rt[        j\                  tZ        j^                  d%&      j'                         }	 |ja                  |       	 |je                         }t[        j\                  |)      }|jf                  tZ        jh                  k7  s|jj                  d%k7  r| j                  jW                  d*       yt[        j\                  tZ        jl                        j'                         }	 |ja                  |       d| _7        | j                  j                  d+       n(	 |je                         }t[        j\                  |)      }|jf                  tZ        jp                  k7  rtY        jP                  d-      | j                  j                  d.tE        |jj                        z          |jj                  d/   | _        |jj                  d0   | _9        tu        |jj                  d1         d2z  | _;        tu        |jj                  d3         d2z  | _<        d| _7        d4| _=        t|        j                  |        | j                  d5d6       || _A        | j                  j                  | jv                  | jx                  z          | j                  | j                        | _E        | j                  | j                        | _G        yc c}w # tP        tR        t         jT                  f$ r5 |r| j                  jW                  d#       Y ytY        jP                  d$      w xY w# tb        $ r/}| j                  jW                  d'tE        |             Y d}~yd}~ww xY w# tb        $ r/}| j                  jW                  d(tE        |             Y d}~yd}~ww xY w# tb        $ r/}| j                  jW                  d'tE        |             Y d}~yd}~ww xY w# tb        $ r&}tY        jP                  d,tE        |      z         d}~ww xY w)7z?Establish or upgrade to a WebSocket connection with the server.NzKwebsocket-client package not installed, only polling transport is availableFrQ   z Attempting WebSocket upgrade to Tr   z#Attempting WebSocket connection to z; z{}={}cookieAuthorizationz&Only basic authentication is supportedz{}:{}r   r   r   zBasic )certfilekeyfilessloptr   zws://r+   r*   wsshttpsz://z	scheme://http_proxy_hosthttp_proxy_porthttp_proxy_authca_certs	cert_reqs)headerr   enable_multithreadz*WebSocket upgrade failed: connection errorzConnection errorprober_   z7WebSocket upgrade failed: unexpected send exception: %sz7WebSocket upgrade failed: unexpected recv exception: %sencoded_packetz(WebSocket upgrade failed: no PONG packetz WebSocket upgrade was successfulzUnexpected recv exception: zno OPEN packetz#WebSocket connection accepted with r&   r'   r   r   r   re   r   rg   )HrQ   r5   r   r   r&   r   r#   r*   r\   cookiesr   namevalueitemslowerauthr3   tuplerM   encoder   r   certproxies
startswithgeturllibparseurlparsehostnameportusernamepasswordverifyrS   r0   ssl	CERT_NONEcreate_connectionr   r   IOErrorWebSocketExceptionwarningr   r   r1   PINGrc   	Exceptionrecvr   PONGr`   UPGRADEr%   r   r'   r   r(   r)   r/   r
   r   rk   r+   
settimeoutrx   r   r-   _read_loop_websocketr,   )r@   rV   rW   rX   websocket_urlupgrader   extra_optionsr   r   r   
basic_auth	proxy_url
parsed_urlr+   r   er   r   s                      r   r   zClient._connect_websocketK  s>   KK ? @..sM;O88KK2]BDGWtxx//MG)DMKK5EG
 99ii/3yy/@/@!B%+ ")V\\!J !B CG!( <<>X-4u$G g-$))..2L!$))..%8$%MNN$^^IINN1%tyy~~a'8::@&/ &z299'B
+3j+@( $))..%0 $		q 1#yy~~a0+2h' +5tyy~~*Fh' yy   	 ++G4 $		 1 1 5 5dii//33F;!=I !%		 1 1 5 5tyy0044W=!?I!'!6!6%*i%7	(94"6J 8B7J7JM"347AM"34 &..*2E2E $,,j.A.AB! ""34 $))**C0},:>)):J:JM(+J7/9499;K;K.LM(+YY%%"''2CMM&BM(#
	E,, 7 7 99JBI4J;HJB fkk8??AA
GGI --q1C&++-W1D##>@fnn-446A
 &1D"KK?@<GGI !--q9K&&&++5 001ABBKK5K<L<L8MMO"''.DH',,Z8DM!$[%5%5n%E!F!OD #K$4$4]$C Dv MD%0D"$DJ$$T*	U;4--0A0AAB  $99$:J:JK"88%%'A!B~  )*F*FG 	E##@B 001CDD	E  ##MF 	  ##MF 	  ##MF 	  < 001CF:< <<sx   -] +] ^& _! 4` *a ;^#^#&	_/%__!	`*%``	a%%aa	b !bbc                 *   |j                   t        t        j                        k  rt        j                  |j                      nd}| j                  j                  d|t        |j                  t              s|j                  nd       |j                   t        j                  k(  r| j                  d|j                  d       y	|j                   t        j                  k(  r>| j                  t        j                  t        j                  |j                               y	|j                   t        j                  k(  r| j!                  d       y	|j                   t        j"                  k(  ry	| j                  j%                  d|j                          y	)
z(Handle incoming packets from the server.UNKNOWNzReceived packet %s data %s<binary>r   Trg   )ro   z%Received unexpected packet of type %sN)r   lenr   packet_namesr5   r   r3   r`   bytesrb   rk   r   ra   r1   r   ri   r   NOOPr   )r@   r   packet_names      r   r   zClient._receive_packet  s    V%8%8!99 ))#//:?H 	(+&sxx7CHHZ	I ??fnn,	388tD__+fmmFKKBC__,OO$O'__+KKE!oo/r   c                     | j                   dk7  ry| j                  j                  |       | j                  j	                  dt
        j                  |j                     t        |j                  t              s|j                         yd       y)z(Queue a packet to be sent to the server.re   NzSending packet %s data %sr   )r/   r.   rj   r5   r   r   r   r   r3   r`   r   )r@   r   s     r   ra   zClient._send_packet  si    ::$

s'0&sxx7CHH	I >H	Ir   c                 X   | j                   t        j                         | _         | j                  sd| j                   _        	 | j                   j                  |||||      S # t        j                  j                  $ r(}| j                  j                  d|||       Y d }~y d }~ww xY w)NF)rW   r`   r   z+HTTP %s request to %s failed with error %s.)
r*   r   Sessionr0   r   requestr   RequestExceptionr5   r   )r@   methodrV   rW   bodyr   excs          r   r   zClient._send_request  s     99 ((*DI$DII	/99$$VS'-4 % 6 6""33 	/KKJ#S#/ /	/s   A$ $B)B$$B)c                     |j                  dd      }|| j                  v r5|r  | j                  | j                  |   g| S 	  | j                  |   | S y#  | j                  j	                  |dz          Y yxY w)zInvoke an event handler.rh   Fz handler errorN)popr"   rx   r5   	exception)r@   rJ   rs   rt   rh   s        r   rk   zClient._trigger_event  s    JJ{E2	DMM!1t11$--2FNNND/4==/66 "DKK))%2B*BCs   A  A9c                 <   |j                  d      }t        j                  j                  |      }|dk(  rd}n|dk(  rd}nt	        d      |j
                  dv r|dz  }d	j                  ||j                  ||j                  |j                  rd
|      S d|      S )z&Generate the Engine.IO connection URL./rP   r*   rQ   r+   zinvalid transport)r   r   szC{scheme}://{netloc}/{path}/?{query}{sep}transport={transport}&EIO=4& )schemenetlocpathqueryseprZ   )	stripr   r   r   rM   r   r   r   r  )r@   rV   rX   rZ   r   r   s         r   r   zClient._get_engineio_url  s    %++C0\\**3/
	!F+%F011 00cMF34:F!**;*;&j.>.>)//'	 5; 5)	) 68'	 5; 5)	)r   c                 B    dt        t        j                               z   S )z.Generate the Engine.IO query string timestamp.z&t=)rS   rz   rE   s    r   r   zClient._get_url_timestamp2  s    s499;'''r   c                    | j                   dk(  rt| j                  j                  d| j                  z          | j	                  d| j                  | j                         z   t        | j                  | j                        dz         }|7| j                  j                  d       | j                  j                  d       n|j                  dk  s|j                  d	k\  rB| j                  j                  d
|j                         | j                  j                  d       nc	 t        j                  |j                  j!                  d            }|j$                  D ]  }| j'                  |        | j                   dk(  rt| j                  j                  d       | j(                  j+                          | j                   dk(  r9| j-                  dd       	 t.        j1                  |        | j3                          | j                  j                  d       y# t"        $ r9 | j                  j                  d       | j                  j                  d       Y w xY w# t"        $ r Y |w xY w)z-Read packets by polling the Engine.IO server.re   zSending polling GET request to r      r   N*Connection refused by the server, abortingr   r   6Unexpected status code %s in server response, abortingr   r   z'Unexpected packet from server, aborting"Waiting for write loop task to endr   Frg   Exiting read loop task)r/   r5   r   r#   r   r   maxr(   r)   r   r.   rj   r   r   r   r   r   rM   r   r   r-   r\   rk   r
   rm   rn   )r@   r   r   r   s       r   r   zClient._read_loop_polling6  s   jjK'KK1DMMAC""t}}t'>'>'@@D..0A0ABQF # HA y##@B

t$}}s"amms&:## %9:;--I

t$OOAII4D4DW4MN yy *$$S)*/ jjK'4 	=>!!#::$>!((. KKM12#  ##=?

t$	  s$   #/H I# ?I I #	I/.I/c                    | j                   dk(  rUd}	 | j                  j                         }	 t        j                  |      }| j                  |       | j                   dk(  rU| j
                  j                  d       | j                   j#                          | j                   dk(  r9| j%                  d	d
       	 t&        j)                  |        | j-                          | j
                  j                  d       y# t        j                  $ r9 | j
                  j                  d       | j                  j                  d       Y t        j                  $ r: | j
                  j                  d       | j                  j                  d       Y /t        $ rK}| j
                  j                  dt        |             | j                  j                  d       Y d}~}d}~ww xY w# t        $ rK}| j
                  j                  dt        |             | j                  j                  d       Y d}~d}~ww xY w# t*        $ r Y {w xY w)z5Read packets from the Engine.IO WebSocket connection.re   Nz*Server has stopped communicating, aborting)WebSocket connection was closed, abortingz1Unexpected error receiving packet: "%s", abortingr   z0Unexpected error decoding packet: "%s", abortingr
  r   Frg   r  )r/   r+   r   rQ   WebSocketTimeoutExceptionr5   r   r.   rj   "WebSocketConnectionClosedExceptionr   r   rS   r   r1   r   r-   r\   rk   r
   rm   rM   rn   )r@   r   r   r   s       r   r   zClient._read_loop_websocket]  s   jjK'AGGLLN"mm15   %7 jjK': 	=>!!#::$>!((. KKM12E 66 ##@B

t$?? ##?A

t$   GF 

t$    FAP

t$	  sP   C> G* =I >A	G'	AG'G'A G""G'*	H>3A H99H>	IIc                    | j                   dk(  r7t        | j                  | j                        dz   }d}	 | j                  j                  |      g}|dgk(  r| j                  j                          g }nS	 	 |j                  | j                  j                  d             |d    |dd }| j                  j                          nR|snz| j                  d	k(  rt        j                  |
      }| j                  d| j                  |j!                         ddi| j"                        }|D ]  }| j                  j                           || j                  j%                  d       n|j&                  dk  s|j&                  dk\  r| j                  j%                  d|j&                         | j)                          n	 |D ]o  }|j!                         }|j*                  r| j,                  j/                  |       n| j,                  j1                  |       | j                  j                          q 	 | j                   dk(  r7| j                  j;                  d       y# | j                  j                  $ r | j                  j                  d       Y Rw xY w# | j                  j                  $ r Y w xY w# t2        j4                  t6        t8        f$ r | j                  j%                  d       Y w xY w)zhThis background task sends packages to the server as they are
        pushed to the send queue.
        re   r  Nr  zpacket queue is empty, abortingF)blockrP   )r   POSTzContent-Typezapplication/octet-stream)r   rW   r   r  r   r   r	  r  zExiting write loop task)r/   r  r(   r)   r.   r   r   r5   r   	task_doner   r%   r   r   r   r#   r   r?   r   r   rn   binaryr+   send_binaryrc   rQ   r  BrokenPipeErrorOSErrorr   )r@   r   r   r   r   r   r   s          r   r   zClient._write_loop  s    jjK' $,,d.?.?@1DGG::>>'>:; 4& 

$$&tzz~~E~'BC r{*")#2,

,,.  %%2OOG4&&DMM
+-GH 00 ' 2 # +CJJ((*+9KK''DF==3&!--3*>KK'' )=>?mmMKKM& /),:: GG//? GGLL8

,,./_ jjK'v 	23g ::## !!"CD  ::++ H "DD'2 KK''CE	s6   I$ 9+J A4J> $4JJJ;:J;>9K:9K:)FNr  NTrH   )NNz	engine.io)F)r   )NNN)__name__
__module____qualname____doc__rL   rB   r   rN   r   r]   rc   r   rZ   rx   r{   rT   r   rn   r   r   r   ra   r   rk   r   r   r   r   r   rD   r   r   r   r   -   s    0 7K !"" (/TB 59)"/H'D,&$#0;%zYv/&I 37/
D)*(%3N(3T?4r   r   )base64r   engineio.jsonr   r8   r.   r   r   r   rz   r   r   ImportErrorrQ   r   r   r   r   	getLoggerr6   r
   r   r   objectr   rD   r   r   <module>r#     s     )    
      """#45 6  Y
4V Y
4A  H  Is"   A* A7 *A43A47B B