
    8'hm                     f   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZ g dZi Zi Z G d d	e      Zd
ej*                  v Zer	 d dlZdZnd dlZer# ed       ej6                  Zej:                  ZeZnEd dl Z  G d dejB                        Z"d dlm#Z# d dl$m%Z% d Z& G d dejN                        Z(d Zd ZeZ G d de      Z) e
jT                  e)       e)ee)jV                  <    G d de      Z, ejT                  e,       e,ee,jZ                  <   dZ. ej^                         dk(  xs dej*                  v Z0e0s	 d dl1Z1dZ.d Z2d Z3e1Z4n!	 d dl5Z5dZ.e5jl                  Z2e5jn                  Z3e5Z4e.rz G d d e      Z8 e
jT                  e8       ejs                  d        e8ee8jV                  <    G d! d"e      Z: ejT                  e:       e:ee:jZ                  <   ejs                  d"       dZ;d#ej*                  v r"	 d dl<Z<dZ;e<j6                  Z=e<j:                  Z>e<Z?n!	 d dl@Z@dZ;e@j6                  Z=e@j:                  Z>e@Z?e;rz G d$ d%e      ZA e
jT                  eA       eAeeAjV                  <   ejs                  d%        G d& d'e      ZB ejT                  eB       eBeeBjZ                  <   ejs                  d'       	 d dlCZC G d( d)e      ZD e
jT                  eD       eDeeDjV                  <   ejs                  d)        G d* d+e      ZE ejT                  eE       eEeeEjZ                  <   ejs                  d+       dZF	 d dlGZGd d,lmHZH dZFeFrz G d- d.e      ZI e
jT                  eI       ejs                  d.       eIeeIjV                  <    G d/ d0e      ZJ ejT                  eJ       eJeeJjZ                  <   ejs                  d0       d1 ZKd2 ZLy# e$ r
 d dlZdZY w xY w# e$ r Y vw xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w)3    )absolute_importN)time_ns)IObjectSerializerISerializer)ProtocolError)message)
SerializerJsonObjectSerializerJsonSerializerc                   ~   e Zd ZdZdZ	 i ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                  j                  ej                  ej                   j                  ej                   ej"                  j                  ej"                  ej$                  j                  ej$                  ej&                  j                  ej&                  ej(                  j                  ej(                  ej*                  j                  ej*                  ej,                  j                  ej,                  ej.                  j                  ej.                  ej0                  j                  ej0                  ej2                  j                  ej2                  ej4                  j                  ej4                  ej6                  j                  ej6                  ej8                  j                  ej8                  ej:                  j                  ej:                  ej<                  j                  ej<                  iZ	 d Z d Z!d Z"d Z#d Z$ddZ%dd	Z&d
 Z'ddZ(y)r	   z
    Base class for WAMP serializers. A WAMP serializer is the core glue between
    parsed WAMP message objects and the bytes on wire (the transport).
    i   c                     || _         t               | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        y)z

        :param serializer: The object serializer to use for WAMP wire-level serialization.
        :type serializer: An object that implements :class:`autobahn.interfaces.IObjectSerializer`.
        r   N)_serializerr   _stats_reset_stats_cycle_serialized_bytes_serialized_messages_serialized_rated_messages_unserialized_bytes_unserialized_messages_unserialized_rated_messages_autoreset_rated_messages_autoreset_duration_autoreset_callback)self
serializers     T/var/www/html/trade_iq/venv/lib/python3.12/site-packages/autobahn/wamp/serializer.py__init__zSerializer.__init__]   sf     &#I!"$%!*+'#$ &'#,-))-&#' #'     c                     | j                   S )z
        Get serializer statistics: timestamp when statistics were last reset.

        :return: Last reset time of statistics (UTC, ns since Unix epoch)
        :rtype: int
        )r   r   s    r   stats_resetzSerializer.stats_resett   s        r   c                 4    | j                   | j                  z   S )z
        Get serializer statistics: bytes (serialized + unserialized).

        :return: Number of bytes.
        :rtype: int
        )r   r   r    s    r   stats_byteszSerializer.stats_bytes}   s     %%(@(@@@r   c                 4    | j                   | j                  z   S )z
        Get serializer statistics: messages (serialized + unserialized).

        :return: Number of messages.
        :rtype: int
        )r   r   r    s    r   stats_messageszSerializer.stats_messages   s     ((4+F+FFFr   c                 4    | j                   | j                  z   S )z
        Get serializer statistics: rated messages (serialized + unserialized).

        :return: Number of rated messages.
        :rtype: int
        )r   r   r    s    r   stats_rated_messageszSerializer.stats_rated_messages   s     ..1R1RRRr   c                    |t        |      t        k(  sJ |t        |      t        k(  sJ |s|sJ t        |      sJ || _        || _        || _        | j
                  r(|r%| j                  d      }| j                  |       |S yy)a  
        Configure a user callback invoked when accumulated stats hit specified threshold.
        When the specified number of rated messages have been processed or the specified duration
        has passed, statistics are automatically reset, and the last statistics is provided to
        the user callback.

        :param rated_messages: Number of rated messages that should trigger an auto-reset.
        :type rated_messages: int

        :param duration: Duration in ns that when passed will trigger an auto-reset.
        :type duration: int

        :param callback: User callback to be invoked when statistics are auto-reset. The function
            will be invoked with a single positional argument: the accumulated statistics before the reset.
        :type callback: callable
        NTreset)typeintcallabler   r   r   stats)r   rated_messagesdurationcallback	reset_nowr.   s         r   set_stats_autoresetzSerializer.set_stats_autoreset   s    " %n)=)DED4>S#898*)!"!)7&#+ #+  ##	JJTJ*E$$U+L )2#r   c           	          t        |      t        k(  sJ t        |      t        k(  sJ | xj                  dz  c_        |r| j                  | j                  | j                  t               | j                  z
  | j                  | j                  | j                  d| j                  | j                  | j                  dd}n| j                  | j                  | j                  t               | j                  z
  | j                  | j                  z   | j                  | j                  z   | j                  | j                  z   d}|r9d| _        d| _        d| _        d| _	        d| _
        d| _        t               | _        |S )aw  
        Get (and reset) serializer statistics.

        :param reset: If ``True``, reset the serializer statistics.
        :type reset: bool

        :param details: If ``True``, return detailed statistics split up by serialization/unserialization.
        :type details: bool

        :return: Serializer statistics, eg:

            .. code-block:: json

                {
                    "timestamp": 1574156576688704693,
                    "duration": 34000000000,
                    "bytes": 0,
                    "messages": 0,
                    "rated_messages": 0
                }

        :rtype: dict
           )bytesmessagesr/   )cycler   	timestampr0   
serializedunserialized)r8   r   r9   r0   r6   r7   r/   r   )r+   boolr   SERIALIZER_IDr   r   r   r   r   r   r   r   )r   r*   detailsdatas       r   r.   zSerializer.stats   sd   0 E{d"#"G}$%$Q**"00!..#I(9(99!33 $ 9 9&*&E&E "55 $ ; ;&*&G&G!D$ **"00!..#I(9(99//$2J2JJ 558S8SS"&"A"ADDeDe"eD %&D"()D%./D+'(D$*+D'01D- '	Dr   c                    |j                  | j                        | j                  j                  }}| xj                  t	        |      z  c_        | xj
                  dz  c_        | xj                  t        t        j                  t        t	        |            | j                  z              z  c_        | j                  r|| j                  r$t               | j                  z
  | j                  k\  s)| j                   r@| j#                         | j                   k\  r#| j%                  d      }| j                  |       ||fS )zS
        Implements :func:`autobahn.wamp.interfaces.ISerializer.serialize`
        r5   Tr)   )	serializer   BINARYr   lenr   r   r,   mathceilfloatRATED_MESSAGE_SIZEr   r   r   r   r   r'   r.   )r   msgr?   	is_binaryr.   s        r   rA   zSerializer.serialize   s3    --(8(894;K;K;R;Ri 	#d)+!!Q&!''3tyys4y9IDLcLc9c/d+ee' ##$*B*B	TXTeTeHejn  kC  kC  HC  IM  Ig  Ig  lp  lE  lE  lG  KO  Ki  Ki  liJJTJ*E$$U+Yr   Nc                    |H|| j                   j                  k7  r/t        dj                  || j                   j                              	 | j                   j	                  |      }| j                   j                  dk(  r|}ng }|D ]  }t        |      t        k7  r#t        dj                  t        |                  t        |      dk(  rt        d      |d   }t        |      t        j                  vr#t        dj                  t        |                  | j                  j                  |      }|t        d	j                  |            |j                  |      }	|j!                  |	        | xj"                  t        |      z  c_        | xj$                  t        |      z  c_        | xj&                  t)        t+        j,                  t/        t        |            | j0                  z              z  c_        | j2                  r|| j4                  r$t7               | j8                  z
  | j4                  k\  s)| j:                  r@| j=                         | j:                  k\  r#| j?                  d
      }
| j3                  |
       |S # t
        $ r3}t        dj                  t        |      j                  |            d}~ww xY w)zU
        Implements :func:`autobahn.wamp.interfaces.ISerializer.unserialize`
        NzDinvalid serialization of WAMP message (binary {0}, but expected {1})z.invalid serialization of WAMP message: {0} {1}flatbuffersz!invalid type {0} for WAMP messager   z$missing message type in WAMP messagez&invalid type {0} for WAMP message typezinvalid WAMP message type {0}Tr)   ) r   rB   r   formatunserialize	Exceptionr+   __name__NAMElistrC   sixinteger_typesMESSAGE_TYPE_MAPgetparseappendr   r   r   r,   rD   rE   rF   rG   r   r   r   r   r   r'   r.   )r   payloadisBinaryraw_msgsemsgsraw_msgmessage_typeKlassrH   r.   s              r   rM   zSerializer.unserialize  s    4++222#Zaabjbfbrbrbyby{| |	n''33G<H   N2DD# !=D('(K(R(RSWX_S`(abbw<1$'(OPP&qz%S->->> ((P(W(WX\]iXj(kll--11,?='(G(N(N|(\]] kk'*C /!4 	  CL0 ##s4y0#))S5W;NQUQhQh;h1i-jj) ##$*B*B	TXTeTeHejn  kC  kC  HC  HL  Hf  Hf  ko  kD  kD  kF  JN  Jh  Jh  khJJTJ*E$$U+U  	n P W WX\]^X_XhXhjk lmm	ns   J 	K.KKF)TFN))rO   
__module____qualname____doc__rG   r   HelloMESSAGE_TYPEWelcomeAbort	ChallengeAuthenticateGoodbyeErrorPublish	Published	Subscribe
SubscribedUnsubscribeUnsubscribedEventCallCancelResultRegister
Registered
UnregisterUnregistered
Invocation	InterruptYieldrT   r   r!   r#   r%   r'   r3   r.   rA   rM    r   r   r	   r	   3   s   
 
""GMM$$goo 	""GMM 	&&(9(9	
 	))7+?+? 	$$goo 	""GMM 	$$goo 	&&(9(9 	&&(9(9 	'');); 	(('*=*= 	))7+?+? 	""GMM 	!!7<<  	##W^^!" 	##W^^#$ 	%%w'7'7''););''););))7+?+?''););&&(9(9""GMM14(.!AGS@@D$5r   r	   AUTOBAHN_USE_UJSONTFzWARNING: Autobahn is using ujson accelerated JSON module - will run faster,
but only on CPython and will loose ability to transport binary payload transparently!c                       e Zd Zd Zy)_WAMPJsonEncoderc                     t        |t        j                        r'dt        j                  |      j                  d      z   S t        j                  j                  | |      S )N ascii)	
isinstancerR   binary_typebase64	b64encodedecodejsonJSONEncoderdefaultr   objs     r   r   z_WAMPJsonEncoder.default]  sJ    #s/!1!1#!6!=!=g!FFF''//c::r   N)rO   rb   rc   r   r~   r   r   r   r   [  s    	;r   r   )scanner)
scanstringc                  j    t        | i |\  }}|r |d   dk(  rt        j                  |dd        }||fS )Nr   r   r5   )r   r   	b64decode)argskwargssidxs       r   _parse_stringr   j  sA    T,V,31  12'A#vr   c                       e Zd Zd Zy)_WAMPJsonDecoderc                     t        j                  j                  | g|i | t        | _        t        j                  |       | _        y ra   )r   JSONDecoderr   r   parse_stringr   py_make_scanner	scan_once)r   r   r   s      r   r   z_WAMPJsonDecoder.__init__r  s<    %%d<T<V< -D %44T:DNr   N)rO   rb   rc   r   r~   r   r   r   r   p  s    	;r   r   c                 8    t        j                  | t              S )N)cls)r   loadsr   )r   s    r   _loadsr   }  s    zz!!122r   c                 >    t        j                  | dddt              S )N),:F)
separatorsensure_ascii	sort_keysr   )r   dumpsr   r   s    r   _dumpsr     s!    zz#%/',$).	0 	0r   c                   .    e Zd ZeZ	 dZdZddZd Zd Z	y)r
   r   Fc                     || _         y)z
        Ctor.

        :param batched: Flag that controls whether serializer operates in batched mode.
        :type batched: bool
        N_batchedr   batcheds     r   r   zJsonObjectSerializer.__init__  s      r   c                     t        |      }t        |t        j                        r|j	                  d      }| j
                  r|dz   S |S )zY
        Implements :func:`autobahn.wamp.interfaces.IObjectSerializer.serialize`
        utf8   )r   r   rR   	text_typeencoder   )r   r   r   s      r   rA   zJsonObjectSerializer.serialize  s?     3Ka' A==v:Hr   c                     | j                   r|j                  d      dd }n|g}t        |      dk(  rt        d      |D cg c]  }t	        |j                  d             c}S c c}w )z[
        Implements :func:`autobahn.wamp.interfaces.IObjectSerializer.unserialize`
        r   Nr   zbatch format errorr   )r   splitrC   rN   r   r   )r   rX   chunksr?   s       r   rM   z JsonObjectSerializer.unserialize  sa     ==]]6*3B/FYFv;!0118>?t{{6*+???s   !A&Nr`   )
rO   rb   rc   _jsonJSON_MODULErP   rB   r   rA   rM   r~   r   r   r
   r
     s(    K DF 

@r   r
   c                   &    e Zd ZdZ	 dZ	 dZ	 ddZy)r   r   r5   zapplication/jsonc                 X    t         j                  | t        |             |rd| _        yy)z
        Ctor.

        :param batched: Flag to control whether to put this serialized into batched mode.
        :type batched: bool
        r   zjson.batchedN)r	   r   r
   r=   r   s     r   r   zJsonSerializer.__init__  s*     	D"6w"GH!0D r   Nr`   rO   rb   rc   r=   RAWSOCKET_SERIALIZER_ID	MIME_TYPEr   r~   r   r   r   r     s*    M
  
 $I
	1r   r   PyPyAUTOBAHN_USE_UMSGPACKc                 0    t        j                  | d      S )NT)use_bin_type)msgpackpackbr   s    r   <lambda>r     s    W]]3TB r   c                 0    t        j                  | d      S )NF)raw)r   unpackb)r?   s    r   r   r     s    % @ r   c                   .    e Zd ZdZeZdZ	 ddZd Zd Z	y)MsgPackObjectSerializerr   Tc                     || _         y

            :param batched: Flag that controls whether serializer operates in batched mode.
            :type batched: bool
            Nr   r   s     r   r   z MsgPackObjectSerializer.__init__       $DMr   c                 x    t        |      }| j                  r"t        j                  dt	        |            |z   S |S a
            Implements :func:`autobahn.wamp.interfaces.IObjectSerializer.serialize`
            !L)_packbr   structpackrC   r   r   r?   s      r   rA   z!MsgPackObjectSerializer.serialize  s3     #;D}}{{4T3d::r   c                 ~   | j                   rg }t        |      }d}||k  r~|dz   |kD  rt        d      t        j                  d|||dz          d   }|dz   |z   |kD  rt        d      ||dz   |dz   |z    }|j                  t        |             |dz   |z   }||k  r~||k7  rt        d      |S t        |      }|gS c
            Implements :func:`autobahn.wamp.interfaces.IObjectSerializer.unserialize`
            r      zbatch format error [1]r   zbatch format error [2]zbatch format error [3])r   rC   rN   r   unpackrW   _unpackbr   rX   r\   Nilr?   unpackeds           r   rM   z#MsgPackObjectSerializer.unserialize  s    
 }}L!e1uqy'(@AAdGAa!e,<=a@A 1uqy1}'(@AA"1q5Q3D KK/ A	A !e" 6#$<== $G, z!r   Nr`   )
rO   rb   rc   rP   _msgpackMSGPACK_MODULErB   r   rA   rM   r~   r   r   r   r     s%    !		$	 	"r   r   c                   &    e Zd ZdZ	 dZ	 dZ	 ddZy)MsgPackSerializerr      zapplication/x-msgpackc                 X    t         j                  | t        |             |rd| _        yy)
            Ctor.

            :param batched: Flag to control whether to put this serialized into batched mode.
            :type batched: bool
            r   zmsgpack.batchedN)r	   r   r   r=   r   s     r   r   zMsgPackSerializer.__init__Z  s*     &=g&NO%7" r   Nr`   r   r~   r   r   r   r   F  s*    "	
 #$	
 -		
		8r   r   AUTOBAHN_USE_CBOR2c                   .    e Zd ZdZeZdZ	 ddZd Zd Z	y)CBORObjectSerializercborTc                     || _         y)z
            Ctor.

            :param batched: Flag that controls whether serializer operates in batched mode.
            :type batched: bool
            Nr   r   s     r   r   zCBORObjectSerializer.__init__  s     $DMr   c                 x    t        |      }| j                  r"t        j                  dt	        |            |z   S |S r   )_cbor_dumpsr   r   r   rC   r   s      r   rA   zCBORObjectSerializer.serialize  s4     s#D}}{{4T3d::r   c                 ~   | j                   rg }t        |      }d}||k  r~|dz   |kD  rt        d      t        j                  d|||dz          d   }|dz   |z   |kD  rt        d      ||dz   |dz   |z    }|j                  t        |             |dz   |z   }||k  r~||k7  rt        d      |S t        |      }|gS r   )r   rC   rN   r   r   rW   _cbor_loadsr   s           r   rM   z CBORObjectSerializer.unserialize  s    
 }}L!e1uqy'(@AAdGAa!e,<=a@A 1uqy1}'(@AA"1q5Q3D KKD 12 A	A !e" 6#$<== 'w/ z!r   Nr`   )
rO   rb   rc   rP   _cborCBOR_MODULErB   r   rA   rM   r~   r   r   r   r     s%    		$	 	"r   r   c                   &    e Zd ZdZ	 dZ	 dZ	 ddZy)CBORSerializerr      zapplication/cborc                 X    t         j                  | t        |             |rd| _        yy)r   r   zcbor.batchedN)r	   r   r   r=   r   s     r   r   zCBORSerializer.__init__  s*     &:7&KL%4" r   Nr`   r   r~   r   r   r   r     s*    	
 #$	
 (		
		5r   r   c                   .    e Zd ZdZeZdZ	 ddZd Zd Z	y)UBJSONObjectSerializerubjsonTc                     || _         yr   r   r   s     r   r   zUBJSONObjectSerializer.__init__	  r   r   c                     t        j                  |      }| j                  r"t        j                  dt        |            |z   S |S r   )r   dumpbr   r   r   rC   r   s      r   rA   z UBJSONObjectSerializer.serialize  s8     <<$D}}{{4T3d::r   c                    | j                   rg }t        |      }d}||k  r|dz   |kD  rt        d      t        j                  d|||dz          d   }|dz   |z   |kD  rt        d      ||dz   |dz   |z    }|j                  t        j                  |             |dz   |z   }||k  r||k7  rt        d      |S t        j                  |      }|gS r   )r   rC   rN   r   r   rW   r   loadbr   s           r   rM   z"UBJSONObjectSerializer.unserialize  s    
 }}L!e1uqy'(@AAdGAa!e,<=a@A 1uqy1}'(@AA"1q5Q3D KKT 23 A	A !e" 6#$<== "<<0 z!r   Nr`   )
rO   rb   rc   rP   r   UBJSON_MODULErB   r   rA   rM   r~   r   r   r   r     s%    		$	 	"r   r   c                   &    e Zd ZdZ	 dZ	 dZ	 ddZy)UBJSONSerializerr   r   zapplication/ubjsonc                 X    t         j                  | t        |             |rd| _        yy)r   r   zubjson.batchedN)r	   r   r   r=   r   s     r   r   zUBJSONSerializer.__init__V  s*     &<W&MN%6" r   Nr`   r   r~   r   r   r  r  B  s*    !	
 #$	
 *		
		7r   r  )message_fbsc                       e Zd ZdZeZdZ	 ej                  j                  ej                  ej                  fej                  j                  ej                  ej                  fiZddZd Zd Zy)FlatBuffersObjectSerializerrK   Tc                 $    |rJ d       || _         y)r   zJWAMP-FlatBuffers serialization does not support message batching currentlyNr   r   s     r   r   z$FlatBuffersObjectSerializer.__init__  s     l ll;#DMr   c                     t               )r   )NotImplementedErrorr   s     r   rA   z%FlatBuffersObjectSerializer.serialize  s     &''r   c                 |   t         j                  j                  j                  |d      }|j                         }|| j                  v r[| j                  |   \  }} |       }|j                         }|j                  |j                  |j                          ||      }|gS t        dj                  |            )r   r   )from_fbsz8message type {} not yet implemented for WAMP-FlatBuffers)r  MessageGetRootAsMessageMsgTyperT   MsgInitBytesPosr  rL   )	r   rX   	union_msgmsg_type	fbs_klass
wamp_klassfbs_msg_tabrH   s	            r   rM   z'FlatBuffersObjectSerializer.unserialize  s     $++33DDWaPI ((*H4000(,(=(=h(G%	:#+ }}TZZ2 '2u)*d*k*klt*uvvr   Nr`   )rO   rb   rc   rP   rK   FLATBUFFERS_MODULErB   r  MessageTypeEVENTrs   r   PUBLISHrm   rT   r   rA   rM   r~   r   r   r
  r
  s  sq    (	
 ##))K,=,=w}}+M##++k.A.A7??-S

	$	(	wr   r
  c                   &    e Zd ZdZ	 dZ	 dZ	 ddZy)FlatBuffersSerializerrK      zapplication/x-flatbuffersc                 X    t         j                  | t        |             |rd| _        yy)z

            :param batched: Flag to control whether to put this serialized into batched mode.
            :type batched: bool
            r   zflatbuffers.batchedN)r	   r   r
  r=   r   s     r   r   zFlatBuffersSerializer.__init__  s*     &A'&RS%;" r   Nr`   r   r~   r   r   r"  r"    s*    &	
 #$	
 1		
	<r   r"  c           	         d}d| v r.| j                  d      }|d   } t        |      dkD  r
|d   dk(  rd}| t        v rt        |    |      S t        dj	                  | t        t        j                                           )	NF.r   r5   r   Tr   z4could not create serializer for "{}" (available: {}))r   rC   SERID_TO_SERRuntimeErrorrL   sortedkeys)serializer_idr   r   s      r   create_transport_serializerr,    s    G
m$!q6A:!A$)+G$M*7;;QXXYfhno{  pA  pA  pC  iD  E  F  	Fr   c                 `    g }| j                   D ]  }|j                  t        |              |S )zK
    Create a list of serializers to use with a WAMP protocol factory.
    )serializersrW   r,  )	transportr.  r+  s      r   create_transport_serializersr0    s:     K".. G6}EFGr   )M
__future__r   osrR   r   platformrD   autobahn.utilr   autobahn.wamp.interfacesr   r   autobahn.wamp.exceptionr   autobahn.wampr   __all__SERID_TO_OBJSERr'  objectr	   environ
_USE_UJSONujsonImportErrorr   printr   r   r   r   r   r   r   r   r   json.decoderr   r   r   r   r
   registerrP   r   r=   _HAS_MSGPACKpython_implementation_USE_UMSGPACKr   r   r   r   umsgpackr   r   r   rW   r   	_HAS_CBORcbor2r   r   r   r   r   r   r   r   r  _HAS_FLATBUFFERSrK   r  r
  r"  r,  r0  r~   r   r   <module>rI     s  6 ' 	 
    ! C 1 !
 N Nd "RZZ/


  	  o  p[[F[[FE ;4++ ; ';4++ ;30 E*@6 *@Z    / 0-A$)) *1Z 1@   ^ $-;^)) * ...0G;d?VZ\ZdZd?d 	 B@ 	 ## ="& ="~ 67NN,-4KO+0018J 8> K*+4EL"001NN&' 	2::%
 	 	kkkk
 	 	jjjj >"v >"@ 341EO(--.NN)*5 5> K(1?L--.NN#$m'=" ="~ 563IO*//0NN+,7: 7> K)*3CL!//0NN%&  )  .wf .w` :;NN018SO/445<
 << K./8ML&445NN*+Fa  
|    v    v  		d  		s~   O O- O9 P .P P 
P( O*)O*-O65O69PPPPPPP%$P%(P0/P0