HEX
Server: LiteSpeed
System: Linux l24.yourwebhosting.net 5.14.0-611.54.3.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 7 16:31:24 EDT 2026 x86_64
User: turkishi (1582)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: //opt/cloudlinux/venv/lib/python3.11/site-packages/xray/agent/__pycache__/daemon.cpython-311.pyc
�

�B�i5Y���dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
mZmZmZddlmZmZmZmZddlmZddlZddlmZddlmZdd	lmZdd
lm Z m!Z!m"Z"ddl#m$Z$m%Z%ddl&m'Z'dd
l(m)Z)m*Z*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1m2Z2ej3r
ddl4m5Z5m6Z6m7Z7eGd�d����Z8ej9e:��Z;Gd�d��Z<dS)zJ
This module contains contains classes implementing X-Ray Agent behaviour
�N)�Thread�current_thread�Lock)�Any�Optional�Dict�Tuple)�	dataclass�)�BoundedThreadExecutor)�gettext)�
get_client)�local_tasks_storage�tasks_base_storage�safe_id_pattern)�	XRayError�XRayAPIError)�
FaultDetector)�open_local_storage�flush_memory_storage�get_task_ids)�Task)�
extract_creds)�dbm_storage�get_current_cpu_throttling_time)�
SendClient�SmartAdviceAPIClient�	APIClientc�$�eZdZUded<eed<dS)�APIDataContainerr�client�taskN)�__name__�
__module__�__qualname__�__annotations__r���H/opt/cloudlinux/venv/lib64/python3.11/site-packages/xray/agent/daemon.pyr r 7s%�����������
�J�J�J�J�Jr(r c
�F�eZdZdZdZdZdZej��dzej��dzej��dzdfd	�Z	d
�Z
d�Zd8d�Zd
�Z
		d9dejdedeeddfd�Zd�Z	d8dededeefd�Zdedededefd�ZdZdZdejdeddfd�Zdejded ed!eddf
d"�Zd#ejdefd$�Zd%e dd&fd'�Z!d%e de"d&e#ffd(�Z$d:d)�Z%	d8dededdfd*�Z&d+ed,e#defd-�Z'	d8d.d/d0ed1eeddfd2�Z(d3e#ddfd4�Z)d5�Z*e+d6e de fd7���Z,dS);�Agentz
    X-Ray Agent class
    ��<i�����Nc�J�||_||_||_||_|�|n|dz|_tjt
jt
jh��td��}||j���|_
td��}|��|_t��|_t��|_t��|_t#��|_t'jt*��|_t��|_d|_d|_dS)N��api_req)�	system_id�adviser)�sys_id�maxqueuesize�max_connections�max_workers�max_connections_per_uid�signal�pthread_sigmask�	SIG_BLOCK�SIGUSR2r�send_client�adviser_client�task_client_objectr�api_data_cache_lock�dict�api_data_cacher�fault_detector�collections�defaultdict�int�_uid_connections�_uid_connections_lock�signal_handler_thread�flusher_thread)�selfr4r8r9r7r:�clickhouse_client_object�adviser_client_objects        r)�__init__zAgent.__init__Is�� ���(���.���&���BY�Be�'>�'>�kz�~�k��$�	��v�/�&�.�1A�B�B�B�=G�y�<Q�<Q� �'?�'?�$�+�'V�'V�'V���CM�i�CX�CX��4I�4I�4K�4K���:D�,�,���#'�6�6�� �;?�6�6���+�o�o���0;�0G��0L�0L���%)�V�V��"�7;��"�04����r(c�x�tjtjh��}tjd|j��|���t��tjd��	tj	|jtj��dS#t$rtjd��YdSwxYw)Nz?Received SIGUSR2 from pid=%s, flushing database storage on diskz;Sending signal back to process that requested storage flushz5Process that requested storage flush no longer exists)r;�sigwaitinfor>�logging�info�si_pid�_flush_mongodb_countersr�os�kill�OSError�warning)rM�siginfos  r)�_wait_for_sigusr2zAgent._wait_for_sigusr2ns����$�f�n�%5�6�6����9�:A�.�	J�	J�	J�	
�$�$�&�&�&�������R�S�S�S�	U��G�G�N�F�N�3�3�3�3�3���	U�	U�	U��O�S�T�T�T�T�T�T�	U���s�1$B�B9�8B9c���tjtjtjh��		|���n$#t
$rt
jd��YnwxYw�;)z�
        Setup SIGUSR2 handler that starts in-memory
        storage flush when received.

        When flushed, send SIGUSR2 back to the process that send signal.
        Tz4Unable to process signal, see traceback for details.)r;r<r=r>r\�	ExceptionrS�	exception)rMs r)�_setup_signal_handlerzAgent._setup_signal_handler|s}��	��v�/�&�.�1A�B�B�B�	Z�
Z��&�&�(�(�(�(���
Z�
Z�
Z��!�"X�Y�Y�Y�Y�Y�
Z����	Zs�A�A#�"A#c��|�|gn
t��}|D]�}t�d|��	|�|��\}}n%#t$rtjd|��Y�XwxYwt|��5}|�|j	���ddd��n#1swxYwY|j
dkr|�||j����|�||j|j
����dS)Nz7Updating task requests counters in mongo for task_id=%sz Unable to get client and task %s��next_request_id�time)r�loggerrT�get_cached_or_loadrrSrZr�update_with_local_datarc�
tracing_by�
update_counts�
request_count�
tracing_count)rM�task_id�tasks_to_flush�	apiclientr"�storages      r)rVzAgent._flush_mongodb_counters�s{��&-�&9�'���|�~�~��%�	7�	7�G��K�K�Q�SZ�[�[�[�
�"&�"9�"9�'�"B�"B��	�4�4���
�
�
��� B�G�L�L�L���
����
$�G�,�,�
U���+�+�G�<S�+�T�T�T�
U�
U�
U�
U�
U�
U�
U�
U�
U�
U�
U����
U�
U�
U�
U���&�(�(��"�"�9�d�.@�A�A�A�A��"�"�9�d�.@�#'�#5�7�7�7�7�+	7�	7s#�A
�
A/�.A/�B)�)B-	�0B-	c��d}d}	tj|j��tj��|z
|jkr||���t��tj��}tj��|z
|jkr'|���tj��}ntd�����)z]
        This method flushes data from memory to
        local storage periodically.
        rTF)�remove)rd�sleep�COUNTERS_FLUSH_INTERVAL�MONGO_FLUSH_INTERVALrVr�CLEANUP_INTERVAL�cleanup_api_data_cache)rM�last_mongo_flush_time�last_api_data_cache_cleanups   r)�_flusherzAgent._flusher�s���
!"��&'�#�	3��J�t�3�4�4�4��y�{�{�2�2�T�5N�N�N��,�,�.�.�.�$�&�&�&�(,�	���%��9�;�;�!<�<�t�?T�T�T��/�/�1�1�1�26�)�+�+�/��$�E�2�2�2�2�	3r(F�sock�background_routine�loops�returnc���t�d��|rft|j���|_|j���t|j���|_|j���t|j	|j
���5}t|jd���5}|�|r�n	|���\}}	|�
|j||��nC#tj$r1t�d��|���YnwxYw|�|dz}|�|��n��ddd��n#1swxYwYddd��dS#1swxYwYdS)	z(
        Start listening socket
        zStarting daemon)�target)r9r7rNTzxRequest %s was rejected because our connections thread pool is full of tasks. Increase max_connections in configuration.r)rerTrr`rK�startryrLrr9r7r8�accept�submit�handle_incoming_connection�queue�Full�error�close)rMrzr{r|�workers_pool�connections_pool�
connection�addresss        r)r�zAgent.start�s8��	���%�&�&�&��	(�)/�t�7Q�)R�)R�)R�D�&��&�,�,�.�.�.�#)��
�">�">�">�D����%�%�'�'�'�
"� �,�!�.�0�0�0�	�3?�!� �0��
�
�
�	�"� �,�%�,�,�,�&*�k�k�m�m�#�
�G�'�$�+�+��7�"�L�2�2�2�2���z�'�'�'��L�L�"`�a�a�a��$�$�&�&�&�&�&�'����
�$��Q�J�E�!�,�%�,�,�,�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	sZ�E%�5E
�C1�0E
�1=D1�.E
�0D1�1E
�E%�
E	�E%�E	�E%�%E)�,E)c�D�|�||��\|d<|d<dS)zj
        Calculate throttling values and update given data
        with resulting throttling stat
        �hitting_limits�throttled_timeN)rE)rM�data�t_key�	cpu_values    r)�add_limit_faultszAgent.add_limit_faults�s5��
:>�9L�9L��9�:�:�6��
���%5� 6� 6� 6r(�php_pid�	cpu_usage�
caller_uidc��t�d|||��|j�||��|j���dS)z�
        Called when php request starts and sends us welcome
        request meaning that request started on the php side.
        z=Received request init trigger from php=%s uid=%s cpu_usage=%sN)rerTrE�save�flush)rMr�r�r�s    r)�_handle_request_initzAgent._handle_request_init�sZ��	���S��Z��	4�	4�	4�	
�� � ��)�4�4�4���!�!�#�#�#�#�#r(�request_datac�2�|�d���|�|||��t�dt	��j|�d��|�d����|�||��dS)Nr�z&[%s] Processing trace for task %s (%s)�tracing_task_id�url)�getr�rerTr�name�process_request_data)rMr�r�r�r�s     r)�_handle_request_endzAgent._handle_request_end�s������,�-�-�5��!�!�,���C�C�C����<�"�$�$�)� �$�$�%6�7�7� �$�$�U�+�+�	-�	-�	-�	
�!�!�,�
�;�;�;�;�;r(i@g@r�r�c�J�	t|��\}}}n?#t$r2t�d��|���YdSwxYw|j5|j�|d��|jkr=t�d|��|���	ddd��dS|j|xxdz
cc<ddd��n#1swxYwY	|�	||||��|j5|j|xxdzcc<|j|dkr|j|=ddd��dS#1swxYwYdS#|j5|j|xxdzcc<|j|dkr|j|=ddd��w#1swxYwYwxYw)a
        Handle incoming connection
        :param connection: socket object usable to
                           send and receive data on the connection
        :param workers_pool: pool where we can place
                             tasks for the futher processing
        z1Failed to extract credentials, closing connectionNrz6Too many concurrent connections from uid=%s, rejectingr)
rrYrerZr�rJrIr�r:�_process_connection)rMr�r��_pid�_uid�_gids      r)r�z Agent.handle_incoming_connections���	�,�Z�8�8��D�$�����	�	�	��N�N�N�O�O�O��������F�F�	����
�
'�	-�	-��$�(�(��q�1�1�T�5Q�Q�Q����W�Y]�^�^�^�� � �"�"�"��		-�	-�	-�	-�	-�	-�	-�	-�

�!�$�'�'�'�1�,�'�'�'�	-�	-�	-�	-�	-�	-�	-�	-�	-�	-�	-����	-�	-�	-�	-�	4��$�$�Z��t�T�J�J�J��+�
4�
4��%�d�+�+�+�q�0�+�+�+��(��.�!�3�3��-�d�3�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4����
4�
4�
4�
4�
4�
4���+�
4�
4��%�d�+�+�+�q�0�+�+�+��(��.�!�3�3��-�d�3�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4�
4����
4�
4�
4�
4�
4���sj��8A�A�AC�>C�C#�&C#�+E�
/E�E
�
E
�F"�/F�
F"�F�F"�F�F"r�r�c�`�t|��}|�|j��|�d���}	|�|��}n�#t
j$r\}t�dt|��dt��ji���Yd}~|���dSd}~wttjf$r4t�d||��Y|���dSwxYw	|���n#|���wxYw	|� |�|j|||���dS|�|j||||���dS#t(j$rt�d	��YdSwxYw)
N�ignore)�errorszJSON decode failed: %s�t_name��extraz5Connection read timed out or failed for pid=%s uid=%s)r�r�r�)r�r�r�r�z�Request %s was rejected because our workers thread pool is full of tasks. Increase queuemaxsize or max_threads in configuration.)r�
settimeout�
_READ_TIMEOUT�makefile�
read_input�json�JSONDecodeErrorrer��strrr�r�rY�socket�timeoutrZr�r�r�r�r�)	rMr�r�r�r��current_cpu�fileobj�
input_data�es	         r)r�zAgent._process_connection/s1��6�d�;�;�����d�0�1�1�1�!+�!4�!4�H�!4�!E�!E��
	�����1�1�J�J���#�	�	�	��L�L�1�!�!�f�f�X�~�7G�7G�7L�,M�
�
O�
O�
O��F�F�F�
���������������(�	�	�	��N�N�R���
'�
'�
'��
��������	����
�
��������J����������	e��!��#�#�D�$=�t�.9�d�$�L�L�L�L�L��#�#�D�$<�d�.9�
�/3�$�5�5�5�5�5���z�	e�	e�	e��L�L�d�
e�
e�
e�
e�
e�
e�	e���sT�A�D#�D
�&=B=�#D#�=5D
�2D#�	D
�
D#�#D9�= F�F�)F-�,F-�fileioc�
�|�|j��}t�d|��t	|�����dkrdSt
j|���d���S)zy
        Read input data and return decoded json
        :param fileio: a file-like object providing read method
        zI received data: %srNF)�strict)�read�_MAX_READ_SIZEre�debug�len�stripr��loads)rMr�r�s   r)r�zAgent.read_inputRsj��
�{�{�4�.�/�/�����*�D�1�1�1��t�z�z�|�|����!�!��F��z�$�*�*�,�,�u�5�5�5�5r(�fake_task_idrc���	tt��5}	||���}nA#t$r4t	td��||���d�����wxYw	ddd��n#1swxYwYn>#t$r1}t	td��t|��z���d}~wwxYw|�	|j
|���S)z<
        Initialize MongoDB client for current task
        z9Cannot resolve tracing_task_id: no match found in storage)�id�all_idsr�Nz"Cannot resolve tracing_task_id: %s)r4r�)rr�decode�KeyErrorr�_�keys�RuntimeErrorr�rAr6)rMr��task_storage�real_idr�s     r)�instantiate_mongo_clientzAgent.instantiate_mongo_client]so��

	N��0�1�1�
@�\�@�*�<�8�?�?�A�A�G�G���@�@�@�#��U�V�V�%1�*6�*;�*;�*=�*=�?�?�@�@�@�@�@�����
@�
@�
@�
@�
@�
@�
@�
@�
@�
@�
@����
@�
@�
@�
@����	N�	N�	N��A�B�C�C�c�!�f�f�L�M�M�M�����	N�����&�&���7>�'�@�@�	@sN�B
�B�3�B�>A1�1B�5B
�B�B
�B�	B
�
C�,C�Cc�\�t�d|j��|j�|��}|�|j|jfS|�|��}|���}t�d|||��t||���|j|<||fS)z�
        Returns a client and task from cache of API data or
        initialize client and GET task from MongoDB and add to cache
        zCached API data: %sNz,Adding new container in cache: %s --> %s, %s)r!r")	rer�rDr�r!r"r��get_taskr )rMr��cached_datarn�_ts     r)rfzAgent.get_cached_or_loadrs���
	���*�D�,?�@�@�@��)�-�-�l�;�;���"��%�{�'7�7�7��1�1�,�?�?�	�
�
�
�
!�
!�����C�&��I�	7�	7�	7�,<�I�BD�-F�-F�-F���L�)��"�}�r(c��	tt��5}d�|���D��}ddd��n#1swxYwYn+#t$rt�d��YdSwxYwt
|j�����D]c}|j5||jvr9||vr5t�	d|��|j�
|��ddd��n#1swxYwY�ddS)z�
        Cleanup an API data im-memory cache dict in order not store
        inactive (stopped, already completed) tasks there
        c�6�g|]}|�����Sr')r�)�.0�ks  r)�
<listcomp>z0Agent.cleanup_api_data_cache.<locals>.<listcomp>�s ��H�H�H�q����
�
�H�H�Hr(Nz,Unable to cleanup cache, storage unavailablez!Cleaning up inactive container %s)rrr�r�rerZ�listrDrBrT�pop)rMr��active_tasks�_tasks    r)rvzAgent.cleanup_api_data_cache�s���
	��0�1�1�
I�\�H�H�L�4E�4E�4G�4G�H�H�H��
I�
I�
I�
I�
I�
I�
I�
I�
I�
I�
I����
I�
I�
I�
I����	�	�	��N�N�>�
@�
@�
@��F�F�	����
�$�-�2�2�4�4�5�5�	3�	3�E��)�
3�
3��D�/�/�/�E��4M�4M��K�K� C�U�K�K�K��'�+�+�E�2�2�2�
3�
3�
3�
3�
3�
3�
3�
3�
3�
3�
3����
3�
3�
3�
3��	3�	3sF�A
�A�A
�A�A
�A�	A
�
$A5�4A5�'AC6�6C:	�=C:	c���|d}|��tj|��st�d|��dStj�tt|��|��}tj�	|��st�d||��dS|�
|��\}}t�d|j��t|d|j���5}|�|j���|jdkr(t�d	��	ddd��dS|�||��}t�d
��|�|��	t�d��|�|��n#t*$rYnwxYw|xjdz
c_|�|j���ddd��n#1swxYwY|jr|�|j��|jd
kr"|jdkr|�|��dSdSdS)aK
        Increment request ID in /usr/share/alt-php-xray/requests/{tracing_task_id} file
        Substitute request_id and tracing_task_id in request_data.
        Send request_data to ClickHouse
        :param request_data: original request data
        :param caller_uid: UID of the connecting process (from SO_PEERCRED)
        r�Nz*Rejecting request with invalid task id: %szSRejecting request from uid=%s for task %s: no matching task file in per-UID storagezProcessing task: %s)r�rbrz*Tracing count is 0, nothing should be donezSending to ClickHousezSending to SmartAdvicerrd)r�matchrerZrW�path�joinrr��isfilerfrTrlr�	is_manualrgrcrk�update_request_datar?r@rrV�fake_idrh�
complete_task)	rMr�r�r��owner_task_filer�r"ro�updated_request_datas	         r)r�zAgent.process_request_data�s���$�$5�6���!�"�(��6�6�
����K�+�-�-�-��� �g�l�l�"�C�
�O�O�\�C�C�O��7�>�>�/�2�2�
����?���.�.�.����)�)�,�7�7���4����)�4�<�8�8�8�
��->� ?�&*�n�6�6�6�	Q�9@��'�'��8O�'�P�P�P��!�Q�&�&����H�I�I�I��	Q�	Q�	Q�	Q�	Q�	Q�	Q�	Q�$(�#;�#;�L�<@�$B�$B� �
�K�K�/�0�0�0����1�2�2�2�
����4�5�5�5��#�#�$8�9�9�9�9���
�
�
���
����

�#�#�q�(�#�#��'�'��8O�'�P�P�P�1	Q�	Q�	Q�	Q�	Q�	Q�	Q�	Q�	Q�	Q�	Q����	Q�	Q�	Q�	Q�4�>�	7��(�(���6�6�6��?�f�$�$��);�q�)@�)@����t�$�$�$�$�$�%�$�)@�)@s>�AH�AH�/G�H�
G�H�G�.H�H�Hr�r"c��|jdz|d<|j|d<|dD]C}|jdz|d<|j|d<|ddkr|�|d��|d<�Dt�d|�d��|�d����t�d	|��|S)
z�
        Substitute request_id and tracing_task_id
        :param data: original input
        :param task: a Task instance
        :return: updated input
        r�
request_idr�r��type�mysql_query�queryz5Input updated: tracing_task_id = %s & request_id = %szFull updated input %s)rjrl�hide_symbolsrerTr�r�)rMr�r"�items    r)r�zAgent.update_request_data�s���"�/�!�3��\��"&�,��
����L�	A�	A�D�!%�!3�a�!7�D���&*�l�D�"�#��F�|�}�,�,� $� 1� 1�$�w�-� @� @��W�
�����K����"3�4�4�d�h�h�|�6L�6L�	N�	N�	N����,�d�3�3�3��r(r!zAPIClient instancerjrkc�4�|�||���dS)z:
        Update task counters in mongodb instance
        )rkrjN)�update_counts_only)rMr!rjrks    r)rizAgent.update_counts�s0��	�!�!�
�0=�	"�	?�	?�	?�	?�	?r(r�c��t�d|j��tjd��|�|j��dS)z_
        Stop and complete request_qty task
        :param _task: tracing task to stop
        zTask %s should be completedrN)rerTrlrdrr�_run_complete_task_cmd)rMr�s  r)r�zAgent.complete_task�sM��
	���1���	(�	(�	(�	
�
�1�
�
�
��#�#�E�M�2�2�2�2�2r(c���	tjddd|jd|gdtj���dS#tjtjf$r'}t�d||��Yd}~dSd}~wwxYw)Nzcloudlinux-xray-manager�stopz--system_idz--tracing_task_id�x)r��stderrzFailed to complete task %s: %s)�
subprocess�check_outputr6�PIPE�TimeoutExpired�CalledProcessErrorrer�)rMrlr�s   r)r�zAgent._run_complete_task_cmd�s���	G��#�)�6��t�{�#�W�%��:�?�	
4�
4�
4�
4�
4�
4��
�)�:�+H�I�	G�	G�	G��L�L�9�7�A�F�F�F�F�F�F�F�F�F�����	G���s�,0�A2�A-�-A2r�c�\�d�}tjd��}tj|||��S)zA
        Sanitize data in single quotes from MySQL query
        c���|�d��}|�d��}d�}tjd||�d����}|�|�|p|��S)zL
            Works with whole string in single or double quotes
            �quote�truncc�b�|�d��rdS|�d��rdSdS)zE
                Works with characters inside quotes
                �digit�0�symbol�xN)�group)�inner_ms r)�
inner_replz8Agent.hide_symbols.<locals>.replacer.<locals>.inner_repls@���=�=��)�)���3��]�]�8�,�,���3��r(z.((?P<digit>\d)|(?P<symbol>[^0-9_:;\-/',. \\]))�in_quote)r�re�sub)�m�q�tr�	sanitizeds     r)�replacerz$Agent.hide_symbols.<locals>.replacer
sz������ � �A����� � �A�
�
�
���P�)�1�7�7�:�+>�+>�@�@�I��,��,�A�F��,�,�,r(zH(?P<quote>['"])(?P<in_quote>.*?)((?<![\\|/])(?P=quote)|(?P<trunc>\.{3})))r�compiler	)r�r�patterns   r)r�zAgent.hide_symbolss7��
	-�	-�	-�2�*�l�m�m���v�g�x��5�5�5r()N)FN)r}N)-r#r$r%�__doc__rsrtru�psutil�	cpu_countrPr\r`rVryr��boolrrHr�r�r�rCr�r�r�rr�r��io�
TextIOBaserr�r�r�r	rrfrvr�r�rir�r��staticmethodr�r'r(r)r+r+@s���������!������"2��!1�!3�!3�a�!7�-�V�-�/�/�!�3�.�f�.�0�0�2�5�)-�
"5�"5�"5�"5�JU�U�U�Z�Z�Z�7�7�7�7�43�3�3�.*/�%)�)�)��M�)�"&�)��c�]�)�/3�)�)�)�)�V���:>�$�$�C�$�C�$�)1�#��$�$�$�$�<�3�<�3�<�*.�<�<?�<�<�<�<�(%�N��M�4�V�]�4�Rg�4�lp�4�4�4�4�<!e�f�m�!e�*?�!e�"%�!e�-0�!e�59�!e�!e�!e�!e�F	6���	6�3�	6�	6�	6�	6�@�/2�@�7B�@�@�@�@�*�s��u�[�$�=N�7O�����&3�3�3�3�(04�<%�<%��<%�),�<%�8<�<%�<%�<%�<%�|���D��T�����,6:�?�?�$8�?�%(�?�%-�c�]�?�>B�?�?�?�?�	3�4�	3�D�	3�	3�	3�	3�G�G�G��6�#�6�#�6�6�6��\�6�6�6r(r+)=rrFrr�rSrWr�rr;r�r�rd�typing�	threadingrrrrrrr	�dataclassesr
r�executorr�xrayr
r��xray.apiclientr�xray.internal.constantsrrr�xray.internal.exceptionsrrrEr�xray.internal.local_countersrrr�xray.internal.typesr�xray.internal.user_plugin_utilsr�xray.internal.utilsrr�
TYPE_CHECKING�xray.apiclient.api_clientrrrr �	getLoggerr#rer+r'r(r)�<module>r's���������	�	�	�	���������	�	�	�	�����	�	�	�	�
�
�
�
�
�
�
�
���������
�
�
�
�2�2�2�2�2�2�2�2�2�2�-�-�-�-�-�-�-�-�-�-�-�-�!�!�!�!�!�!�
�
�
�
�+�+�+�+�+�+�������%�%�%�%�%�%�\�\�\�\�\�\�\�\�\�\�<�<�<�<�<�<�<�<�)�)�)�)�)�)�����������
%�$�$�$�$�$�9�9�9�9�9�9���������

������������������������

��	�8�	$�	$��g6�g6�g6�g6�g6�g6�g6�g6�g6�g6r(