AlkantarClanX12

Your IP : 13.58.188.166


Current Path : /opt/cloudlinux/venv/lib64/python3.11/site-packages/clconfig/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/clconfig/__pycache__/config.cpython-311.pyc

�

".g�^��n�ddlZddlZddlZddlZddlmZmZddlmZddl	m
Z
ddlmZddl
mZmZddlmZddlmZmZdd	lmZdd
lmZddlmZmZdd
lmZmZddlm Z ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)ddl*m+Z+Gd�de
��Z,Gd�de��Z-Gd�de-��Z.Gd�de-��Z/dS)�N)�ABC�abstractmethod)�cpapi)�FormattedException)�Feature)�is_admin�is_panel_feature_supported)�is_litespeed_running)�print_dictionary�replace_params)�CloudlinuxLicenseLib)�
ClQuotaLib)�is_active_reseller_limits�lve�)�db_governor_lib�
ui_config_lib)�parse_cloudlinux_config_opts)�boolean_to_0_1�boolean_to_on_off�boolean_to_yes_no�is_int�is_positive_int�	is_string�is_string_or_none�time_unit_to_letter)�	MysqlInfoc��eZdZdS)�ValidateDataExceptionN)�__name__�
__module__�__qualname__���py/clconfig/config.pyrr)s�������Dr$rc�B�eZdZd�Zed���Zd
d�Zdd�Zdd	�ZdS)
�
ClConfingBasec�"�d|_i|_dS)NF)�_is_json�_opts��selfs r%�__init__zClConfingBase.__init__/s����
���
�
�
r$c��dS)zM
        Return list of pairs (input_dict_keys, validator_function).
        Nr#r+s r%�_get_data_listzClConfingBase._get_data_list3s	��
	
�r$F�successc��t|t��r)|�|tj��d���t	||jp|��dS)z�
        Output data wrapper
        :param: `dict` data - data for output to stdout
        :param: `bool` force_json - always output json format
        ��result�	timestampN)�
isinstance�dict�update�timerr))r,�data�
force_jsonr3s    r%�_print_datazClConfingBase._print_data:sT���d�D�!�!�	F��K�K�6��	���D�D�E�E�E���t�}�:�
�;�;�;�;�;r$rc�~�|jr9|�dtj��i��t|d��nh	t	t|d��|�di��z��n-#t$r }t	d|�d|�d���Yd}~nd}~wwxYwtj	|��dS)	z�
        Print error and exit
        :param message: Dictionary with keys "result" as string and optional "context" as dict
        r4Tr3�context�Error: z [�]N)
r)r7r8r�print�str�get�KeyError�sys�exit)r,�message�
error_code�es    r%�_error_and_exitzClConfingBase._error_and_exitDs���
�=�	1��N�N�K�����5�6�6�6��W�d�+�+�+�+�
1��c�'�(�+�,�,�w�{�{�9�b�/I�/I�I�J�J�J�J���
1�
1�
1��/��/�/�W�/�/�/�0�0�0�0�0�0�0�0�����
1�����������s�9A<�<
B&�B!�!B&Nc�h�|���}|D]�}	|\}}|�dd���dd���dd���d��}td|����}||���t	dd	|id
������#t
$rY��wxYwdS)z4
        Validate config single parameters.
        �[��'r?�/�	data_dictNz*Value error in JSON key(s) options/%(key)s�key)rFr=)r/�replace�rstrip�evalrrC)	r,rO�reseller�control_data_list�control_data_item�input_dict_keys�validator_function�key_name_for_exception�input_values	         r%�_validate_parameters_singlez)ClConfingBase._validate_parameters_singleSs���!�/�/�1�1��!2�	�	��
�6G�3��!3�*9��W�S�"�%�%��W�T�2�&�&��W�S�#�&�&��V�C�[�[�	'�
#�#@��#@�#@�A�A��%�%�k�2�2�:�/�<h�=B�DZ�<[�1]�1]�^�^�^�;���
�
�
���
����	�	s�BB"�"
B/�.B/)Fr0)r�N)	r r!r"r-rr/r;rIr[r#r$r%r'r'-sz����������
�
��^�
�<�<�<�<�
�
�
�
������r$r'c�6�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	dS)	�ClConfigWithoutLvezC
    Perform cloudlinux-config utility for CloudLinux OS Solo.
    c�z�t��}|���sd|_|�ddi��Sd|v|_|�|��}t|��|_|j�d��dkr|���dS|�	��dS)NTr3�Cloudlinux license isn't valid�--json�command�set)
r
�get_license_statusr)rI�_parse_args�varsr*rB�_set_run�_get_run)r,�args�licence�optss    r%�runzClConfigWithoutLve.runqs���&�(�(���)�)�+�+�	V� �D�M��'�'��3S�(T�U�U�U� �D�(��
�����%�%���$�Z�Z��
��:�>�>�)�$�$��-�-��M�M�O�O�O�O�O��M�M�O�O�O�O�Or$c���i}	tj|jd��d}n.#ttf$r|�ddi��YnwxYw	|�|��n1#t$r$}|�dd|��i��Yd}~nd}~wwxYwdtj��id�}i}d	|vr|d	|d	<	tj
|��nT#tj$rB}|dxx|jd
zz
cc<|d�
|j��Yd}~nd}~wwxYw|dsd|d<t|d��d
kr|d=t!|d��dS)�A
        Set parameters from self._opts
        :return:
        r9�optionsr3�/ERROR: Invalid JSON string passed in --data keyr>NrL�r3r4r=�
uiSettings�; r=r0rT)�json�loadsr*�
ValueErrorrCrI�_validate_input_dictionaryrr8r�
set_ui_config�UIConfigExceptionrFr7r=�lenr)r,rOrHr3�
ui_parameterss     r%rgzClConfigWithoutLve._set_runs���
�	�	`��
�4�:�f�#5�6�6�y�A�I�I���H�%�	`�	`�	`�� � �(�,]�!^�_�_�_�_�_�	`����	<��+�+�I�6�6�6�6��$�	<�	<�	<�� � �(�M�a�M�M�!:�;�;�;�;�;�;�;�;�����	<�����T�Y�[�[�R�H�H���
��9�$�$�*3�L�*A�M�,�'�	0��'�
�6�6�6�6���.�	0�	0�	0��8�����	�D� 0�0�����9��$�$�Q�Y�/�/�/�/�/�/�/�/�����	0����
�h��	)�(�F�8���v�i� �!�!�Q�&�&��y�!����&�&�&�&�&s?�%*�(A�A�A/�/
B�9B�B�	C�D/�-8D*�*D/c��dtj��d�}i}|�tj����||d<d�t	j�����D��|d<|d}t��r-tj	|vr|�
tj	��t||j��dS)�#
        Run 'get' command
        r0r2roc��g|]	\}}|�|��
Sr#r#��.0�	component�is_supporteds   r%�
<listcomp>z/ClConfigWithoutLve._get_run.<locals>.<listcomp>��2��+�+�+�1�)�\��+��+�+�+r$�supported_cl_featuresN)
r8r7r�
get_ui_configr�get_supported_cl_features�itemsr
r�LSAPI�removerr))r,r3�full_config�supported_cl_features_lists    r%rhzClConfigWithoutLve._get_run�s���&�D�I�K�K�@�@�������=�6�8�8�9�9�9�'��y��+�+��+�-�-�3�3�5�5�+�+�+��&�'�&,�,C�%D�"��!�!�	=�g�m�7Q�&Q�&Q�&�-�-�g�m�<�<�<�����/�/�/�/�/r$c��tjdd���}|�dd���}|�dd�	��|�d
d�	��}|�dd
d���|�|��\}}|S)�%
        Parse CLI arguments
        zcloudlinux-configz'Utility to get/set Cloudlinux UI config)�prog�description�commandsrb)�title�destrBz
get UI config)�helprcz
set UI config�--dataTzdata to set)�requiredr�)�argparse�ArgumentParser�add_subparsers�
add_parser�add_argument�parse_known_args)r,�argv�parser�
subparsers�
set_subparserrk�_s       r%rezClConfigWithoutLve._parse_args�s����(�$�A�
�
�
���*�*��9�+�.�.�
�	���e�/��:�:�:�"�-�-�e�/�-�J�J�
��"�"�8�d��"�O�O�O��)�)�$�/�/���a��r$c�0�|�|��dS)z�
        Check data validity in data_dict.
        For CL OS Solo we check only single parameters.
        :param data_dict: Dictionary with input data
        :return: None, throws ValidateDataException if any error detected
        N)r[)r,rOs  r%rwz-ClConfigWithoutLve._validate_input_dictionary�s��	
�(�(��3�3�3�3�3r$c�v�dtfdtfdtfdtfdtfdtfdtfgS)N�['uiSettings']['hideRubyApp']�['uiSettings']['hidePythonApp']�['uiSettings']['hideNodeJsApp']�#['uiSettings']['hidePHPextensions']�!['uiSettings']['hideLVEUserStat']�['uiSettings']['hideXrayApp']�%['uiSettings']['hideAccelerateWPApp'])rr+s r%r/z!ClConfigWithoutLve._get_data_list�sF��-�n�=�
.��?�
.��?�
2�N�C�
0�.�A�
,�n�=�
4�n�E�
�	
r$N)
r r!r"�__doc__rlrgrhrerwr/r#r$r%r^r^lsy�����������"'�"'�"'�H0�0�0�&���$4�4�4�

�

�

�

�

r$r^c�>�eZdZdZd�Zd�Zd�Zd�Zd
d�Zd�Z	d	�Z
dS)�ClConfigzT
    Perform cloudlinux-config utility for CloudLinux OS Shared and Shared Pro.
    c��t��}|���sd|_|�ddi��Sd|v|_|�|��|_|jdr*t
j��s|�ddi��|jdr|���dS|�	��dS)NTr3r`ra�--for-resellerzLERROR: reseller limits are not supported, can not use --for-reseller option.rB)
r
rdr)rIrer*r�reseller_limit_supportedrhrg)r,rirjs   r%rlzClConfig.run�s���&�(�(���)�)�+�+�	V� �D�M��'�'��3S�(T�U�U�U� �D�(��
��%�%�d�+�+��
��:�&�'�	��0L�0N�0N�	�� � ��h�"�
�
�
��:�e��	��M�M�O�O�O�O�O�
�M�M�O�O�O�O�Or$c��|j�dd��}|�8t|��s)t|��s|�dd|id���|jdrz|�|�ddi��t��}|���sd	}nd
}|���t|tj	��d�d��dS|jd
s|�ddi��i}	tj|jd
��d}n'#t$r|�ddi��YnwxYw	|�
||���n1#t$r$}|�dd|��i��Yd}~nd}~wwxYwdtj	��id�}d\}}}}	|�Zddlm}
|||	h}t#|�t'|������dkr|�dd|�d�i��nddlm}
i}||vr||||<||vr||||<	t+j|��nT#t*j$rB}|dxx|jdzz
cc<|d�|j��Yd}~nd}~wwxYw||vrn	|
�|||���nO#|
j$rB}|dxx|jdzz
cc<|d�|j��Yd}~nd}~wwxYw|	|vrp	t;j||	��nT#t:j$rB}|dxx|jdzz
cc<|d�|j��Yd}~nd}~wwxYw|dsd
|d<t#|d��dkr|d=t|d��dS)rnr�Nz5ERROR: reseller limits for %(reseller)s are disabled.rT)r3r=z--reset-inodes-limitr3z2ERROR: cannot reset inode limits for reseller userzERROR: quota isn't activatedr0r2Tr�z)ERROR: You must provide parameters to setrorp)rTr>rLrq)�inodeLimitsrr�faultsNotification�mySQLGovSettingsr��lve_stats2_reseller_librzError: can only configure z
 for reseller��lve_stats2_librsr=) r*rBrrrIr�is_clquota_activated�reset_inodes_limitsrr8rtru�	ExceptionrwrrLr�rz�intersectionrcr�rrxryrFr7r=�set_notification�LveStats2Exceptionr�set_db_gov_config�DBGovernorException)
r,rT�cl_quotar3rOrH�inode_limits�ui_settings�faults_notification�	mysql_gov�lve_stats2_notif�admin_only_settingsr{s
             r%rgzClConfig._set_run�s#��
�:�>�>�"2�D�9�9������!�!� �(��2�2� �
� � �Q�&��1�"�"�
�
�
�
�:�,�-�	��#��$�$��R�&����
"�|�|�H��0�0�2�2�
/�7���"���,�,�.�.�.���T�Y�[�[�I�I�4�P�P�P��F��z�(�#�	Z�� � �(�,W�!X�Y�Y�Y��	�	`��
�4�:�h�#7�8�8��C�I�I���	`�	`�	`�� � �(�,]�!^�_�_�_�_�_�	`����	<��+�+�I��+�I�I�I�I��$�	<�	<�	<�� � �(�M�a�M�M�!:�;�;�;�;�;�;�;�;�����	<�����T�Y�[�[�R�H�H��G
�C��{�$7��
��E�E�E�E�E�E�#/��i�"H���&�3�3�C�	�N�N�C�C�D�D��I�I��$�$��]�;N�]�]�]�&�����
=�<�<�<�<�<��
��9�$�$�*3�L�*A�M�,�'��)�#�#�)2�;�)?�M�+�&�	0��'�
�6�6�6�6���.�	0�	0�	0��8�����	�D� 0�0�����9��$�$�Q�Y�/�/�/�/�/�/�/�/�����	0����
�)�+�+�
4� �1�1�)�<O�2P�;C�2�E�E�E�E��#�6�
4�
4�
4��x� � � �A�I��$4�4� � � ��y�!�(�(���3�3�3�3�3�3�3�3�����
4����
�	�!�!�
4��1�)�I�2F�G�G�G�G��"�6�
4�
4�
4��x� � � �A�I��$4�4� � � ��y�!�(�(���3�3�3�3�3�3�3�3�����
4�����h��	)�(�F�8���v�i� �!�!�Q�&�&��y�!����&�&�&�&�&sr�%D*�*!E�
E�E*�*
F�4F�F�<I�J"� 8J�J"�*K�
L�8L�L�L7�7N�8N�Nc�6�dtj��d�}i}d}|jdr|jd}ddlm}nddlm}|��ttj��r'|�|�	����|�tj����	|�tj
����n>#tj$r,}d|d	<i|d
<t|��|d
d	<Yd}~nd}~wwxYw|�dt!�����i��nCttj��r*|�|�	|d�
����||d<d�t%j�����D��|d<|d}t+��r-tj|vr|�tj��t1||j��dS)r}r0r2Nr�rr�r��error�mySqlGov�errors�dbInfoT)rT�defaultsroc��g|]	\}}|�|��
Sr#r#rs   r%r�z%ClConfig._get_run.<locals>.<listcomp>{r�r$r�)r8r*rLr�r�r	r�LVEr7�get_notificationrr�r�get_db_gov_configr�rArrBrr�r�r
r�r�rr))r,r3r�rTr�rHr�s       r%rhzClConfig._get_runXs?��&�D�I�K�K�@�@�������:�&�'�	=��z�"2�3�H�E�E�E�E�E�E�E�<�<�<�<�<�<���)�'�+�6�6�
H��"�"�#3�#D�#D�#F�#F�G�G�G����}�:�<�<�=�=�=�
6��"�"�?�#D�#F�#F�G�G�G�G��"�6�
6�
6�
6�%,��z�"�#%��x� �/2�1�v�v��x� ��,�,�,�,�,�,�����
6����

����)�+�+�/�/�*;�*;�<�=�=�=�=�)�'�+�6�6�
h��"�"�#3�#D�#D�h�ae�#D�#f�#f�g�g�g�'��y��+�+��+�-�-�3�3�5�5�+�+�+��&�'�&,�,C�%D�"��!�!�	=�g�m�7Q�&Q�&Q�&�-�-�g�m�<�<�<�����/�/�/�/�/s�,&C�D�""D	�	Dc�~�t||j��\}}|s"|�t|����|S)r�)rr)rIr)r,r��statusr9s    r%rezClConfig._parse_args�sB��4�D�$�-�H�H�����	7�� � ���!5�!5�6�6�6��r$Nc�\�|�||��|�|��dS)z�
        Checks data validity in data_dict
        :param data_dict: Dictionary with input data
        :param str reseller: Reseller name to validate to config reseller
        :return: None, throws ValidateDataException if any error detected
        N)r[�_validate_parameters_pairs)r,rOrTs   r%rwz#ClConfig._validate_input_dictionary�s4��	
�(�(��H�=�=�=��'�'�	�2�2�2�2�2r$c���gdtf�dtf�dtf�dtf�dtf�dtf�dtf�dtf�d	tf�d
tf�dtf�dtf�d
tf�dtf�dtf�dtf�dtf�dtf�dtf�dtf�dtf�dtf�dtf�dtf�dt
f�dt
f�dt
f�dt
f�d	tf�d
tf�dtf�dtf�d
tf�dtf�dtf�dtf�dtf�d tf�d!tf�d"tf�d#tf�d$tf�dtf�dtf�d%tf�d&tf�d'tf�d(tf�d)tf�d*tf�d+tf�d,tf�d-tf�d.tf�d/tf�d0tf�d1tf�d2tf�d3tf�d4tf�d5tf�d6tf�d7tf�d8tf�d9tf�d:tf�d;tf�d<tf�d=tf�S)>Nz&['inodeLimits']['showUserInodesUsage']r�r�r�r�r�r�r�z0['faultsNotification']['faultsToInclude']['cpu']z2['faultsNotification']['faultsToInclude']['nproc']z/['faultsNotification']['faultsToInclude']['io']z0['faultsNotification']['faultsToInclude']['mem']zB['faultsNotification']['faultsToInclude']['concurrentConnections']z1['faultsNotification']['faultsToInclude']['iops']�3['faultsNotification']['notify']['admin']['period']�7['faultsNotification']['notify']['admin']['unitOfTime']�2['faultsNotification']['notify']['user']['period']�6['faultsNotification']['notify']['user']['unitOfTime']z%['faultsNotification']['notifyAdmin']z@['faultsNotification']['minimumNumberOfFaultsToNotify']['admin']z?['faultsNotification']['minimumNumberOfFaultsToNotify']['user']z)['faultsNotification']['notifyCustomers']z)['faultsNotification']['notifyResellers']z1['faultsNotification']['notifyResellerCustomers']z2['faultsNotification']['email']['notifyFromEmail']z0['faultsNotification']['email']['notifySubject']z2['faultsNotification']['email']['reportAdminMail']z0['faultsNotification']['email']['notifyCharset']z6['faultsNotification']['notify']['reseller']['period']z:['faultsNotification']['notify']['reseller']['unitOfTime']z6['faultsNotification']['notify']['customer']['period']z:['faultsNotification']['notify']['customer']['unitOfTime']z3['faultsNotification']['notifyResellerOnCustomers']zC['faultsNotification']['minimumNumberOfFaultsToNotify']['reseller']zC['faultsNotification']['minimumNumberOfFaultsToNotify']['customer']z(['faultsNotification']['notifyReseller']z'['mySQLGovSettings']['modeOfOperation']z"['mySQLGovSettings']['scriptPath']z*['mySQLGovSettings']['userMaxConnections']z1['mySQLGovSettings']['logRestrictedUsersQueries']z2['mySQLGovSettings']['gatherDataForDetailedStats']z.['mySQLGovSettings']['restrictLog']['logPath']z-['mySQLGovSettings']['restrictLog']['format']z+['mySQLGovSettings']['errorLog']['logPath']z)['mySQLGovSettings']['errorLog']['level']z.['mySQLGovSettings']['slowQueries']['logPath']z+['mySQLGovSettings']['slowQueries']['kill']z.['mySQLGovSettings']['slowQueries']['timeout']z,['mySQLGovSettings']['restrictType']['mode']z-['mySQLGovSettings']['unlimit']['unitOfTime']z)['mySQLGovSettings']['unlimit']['period']�E['mySQLGovSettings']['restrictedTimePeriods']['level1']['unitOfTime']�A['mySQLGovSettings']['restrictedTimePeriods']['level1']['period']�E['mySQLGovSettings']['restrictedTimePeriods']['level2']['unitOfTime']�A['mySQLGovSettings']['restrictedTimePeriods']['level2']['period']�E['mySQLGovSettings']['restrictedTimePeriods']['level3']['unitOfTime']�A['mySQLGovSettings']['restrictedTimePeriods']['level3']['period']�E['mySQLGovSettings']['restrictedTimePeriods']['level4']['unitOfTime']�A['mySQLGovSettings']['restrictedTimePeriods']['level4']['period']�F['mySQLGovSettings']['restrictedTimePeriods']['timeout']['unitOfTime']�B['mySQLGovSettings']['restrictedTimePeriods']['timeout']['period'])rrrrrrrrr+s r%r/zClConfig._get_data_list�s��Q
�6�~�F�Q
�-�n�=�	Q
�
/��?�Q
�/��?�
Q
�3�N�C�Q
�1�.�A�Q
�-�n�=�Q
�5�n�E�Q
�@�AR�S�Q
�B�CT�U�Q
�?�@Q�R�Q
� @�AR�S�!Q
�"R�Sd�e�#Q
�$A�BS�T�%Q
�&C�O�T�'Q
�(G�H[�\�)Q
�*B�?�S�+Q
�,F�GZ�[�-Q
�.5�6G�H�/Q
�0P�QW�X�1Q
�2O�PV�W�3Q
�49�:K�L�5Q
�69�:K�L�7Q
�8A�BS�T�9Q
�>B�CT�U�?Q
�@@�AR�S�AQ
�BB�CT�U�CQ
�D@�AR�S�EQ
�L@�AR�S�MQ
�NB�CT�U�OQ
�P?�@Q�R�QQ
�R@�AR�S�SQ
�TR�Sd�e�UQ
�VA�BS�T�WQ
�XF��W�YQ
�ZJ�K^�_�[Q
�\F��W�]Q
�^J�K^�_�_Q
�`C�DU�V�aQ
�bS�TZ�[�cQ
�dS�TZ�[�eQ
�f8�9J�K�gQ
�h9�:K�L�iQ
�j9�:K�L�kQ
�p7�	�B�qQ
�r2�9�=�sQ
�t:�6�B�uQ
�vA�BS�T�wQ
�xB�CT�U�yQ
�z>�y�I�{Q
�|=�i�H�}Q
�~;�I�F�Q
�@9�)�D�AQ
�B>�y�I�CQ
�D;�<M�N�EQ
�F>�v�F�GQ
�H<�Y�G�IQ
�J=�i�H�KQ
�L9�&�A�MQ
�NU�V_�`�OQ
�PQ�RX�Y�QQ
�RU�V_�`�SQ
�TQ�RX�Y�UQ
�VU�V_�`�WQ
�XQ�RX�Y�YQ
�ZU�V_�`�[Q
�\Q�RX�Y�]Q
�^V�W`�a�_Q
�`R�SY�Z�aQ
�Q	
r$c���gd�}|D]m}|\}}d\}}	td|����}n#t$rYnwxYw	td|����}n#t$rYnwxYw|�|�|�|�tddi����ndS)zK
        Validate config pairs parameters (period and unitOfTime).
        ))r�r�)r�r�)z=['mySQLGovSettings']['restrictType']['unlimit']['unitOfTime']z9['mySQLGovSettings']['restrictType']['unlimit']['period'])r�r�)r�r�)r�r�)r�r�)r�r�)NNrONrFz4Keys 'period' and 'unitOfTime' should be passed both)rSrCr)r,rO�pairs_data_list�pairs_data_item�keys1�keys2�val1�val2s        r%r�z#ClConfig._validate_parameters_pairs�s���
�
�
��$ /�
	q�
	q�O�*�L�E�5�#�J�D�$�
��/��/�/�0�0�����
�
�
���
����
��/��/�/�0�0�����
�
�
���
�������!1��#���+�Y�8n�,o�p�p�p��
	q�
	qs�'�
4�4�A�
A�Ar\)r r!r"r�rlrgrhrerwr/r�r#r$r%r�r��s������������&`'�`'�`'�D+0�+0�+0�Z���3�3�3�3�R
�R
�R
�h#q�#q�#q�#q�#qr$r�)0r�rtrDr8�abcrr�clcommonr�clcommon.clexceptionr�clcommon.constr�clcommon.cpapirr	�clcommon.utilsr
�	cli_utilsrr�	cllicenser
�cllimits.clquota_libr�	lvectllibrrrLrr�cl_config_arg_parser�clconfig_utilsrrrrrrrr�db_info_librrr'r^r�r#r$r%�<module>r�sj����������
�
�
�
�����#�#�#�#�#�#�#�#�������3�3�3�3�3�3�"�"�"�"�"�"�?�?�?�?�?�?�?�?�/�/�/�/�/�/�6�6�6�6�6�6�6�6�*�*�*�*�*�*�+�+�+�+�+�+�4�4�4�4�4�4�4�4�,�,�,�,�,�,�,�,�=�=�=�=�=�=�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�	�#�"�"�"�"�"�	�	�	�	�	�.�	�	�	�<�<�<�<�<�C�<�<�<�~o
�o
�o
�o
�o
��o
�o
�o
�drq�rq�rq�rq�rq�}�rq�rq�rq�rq�rqr$