
    X                         S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSK	Jr  SS	KJr  SSKJr  SS
KJr  SSKJr  SSKJr   " S S\
R(                  5      r " S S\5      rg)zKUtilities for gkeonprem API clients for bare metal admin cluster resources.    )absolute_import)division)unicode_literals)
exceptions)
list_pager)client)update_mask)arg_parsers)parser_extensions)
properties)gkeonprem_v1_messagesc                      \ rS rSrSrS\R                  4S jrS\R                  4S jrS\R                  4S jr	S\R                  4S jr
S\R                  4S jrS\R                  4S	 jrS\R                  4S
 jrS\R                  4S jrS\R                  4S jrS\R                  4S jrS\R                  4S jrS rS rS\R                  4S jrS\R                  4S jrS\R                  4S jrS rS rS\R                  4S jrS\R                  4S jrS\R                  4S jrS\R                  4S jrS\R                  4S jrS\R                  4S jrS\R                  4S jrS\R                  4S jr S\R                  4S jr!S\R                  4S jr"S\R                  4S  jr#S\R                  4S! jr$S\R                  4S" jr%S\R                  4S# jr&S$r'g%)&_BareMetalAdminClusterClient    z?Base class for GKE OnPrem Bare Metal Admin Cluster API clients.argsc                    [        US0 5      n/ nU(       d  gUR                  5        H;  u  pEUR                  [        R                  R
                  R                  XES95        M=     [        R                  R                  US9$ )z*Constructs proto message AnnotationsValue.annotationsNkeyvalueadditionalProperties)getattritemsappendmessagesBareMetalAdminClusterAnnotationsValueAdditionalProperty)selfr   r   additional_property_messagesr   r   s         Klib/googlecloudsdk/api_lib/container/gkeonprem/bare_metal_admin_clusters.py_annotations)_BareMetalAdminClusterClient._annotations#   s    $r2K#% !'')
"))

(
(
9
9
L
L M  * ))::9 ;      c                     [        US/ 5      [        US/ 5      S.n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z<Constructs proto message BareMetalAdminIslandModeCidrConfig.'island_mode_service_address_cidr_blocks#island_mode_pod_address_cidr_blocks)serviceAddressCidrBlockspodAddressCidrBlocksN )r   anyvaluesr   "BareMetalAdminIslandModeCidrConfigr    r   kwargss      r"   _island_mode_cidr_config5_BareMetalAdminClusterClient._island_mode_cidr_config5   sW     %,;R%
 !(7!
	F 6==?88B6BBr%   c                     SU R                  U5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z5Constructs proto message BareMetalAdminNetworkConfig.islandModeCidrNr+   )r1   r,   r-   r   BareMetalAdminNetworkConfigr/   s      r"   _network_config,_BareMetalAdminClusterClient._network_configE   sE     	$77=F 6==?11;F;;r%   c                     S[        USS5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z1Constructs proto message BareMetalAdminVipConfig.controlPlaneVipcontrol_plane_vipNr+   )r   r,   r-   r   BareMetalAdminVipConfigr/   s      r"   _vip_config(_BareMetalAdminClusterClient._vip_configP   sD     	74)<dCF 6==?--777r%   c                     S[        USS5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z2Constructs proto message BareMetalAdminPortConfig.controlPlaneLoadBalancerPort control_plane_load_balancer_portNr+   )r   r,   r-   r   BareMetalAdminPortConfigr/   s      r"   _port_config)_BareMetalAdminClusterClient._port_config[   sG     	'4d)
F 6==?..888r%   c                     S[        USS5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z6Constructs proto message BareMetalAdminManualLbConfig.enabledenable_manual_lbFNr+   )r   r,   r-   r   BareMetalAdminManualLbConfigr/   s      r"   _manual_lb_config._BareMetalAdminClusterClient._manual_lb_configh   sD     	74!3U;F 6==?22<V<<r%   c                     U R                  U5      U R                  U5      U R                  U5      S.n[        UR	                  5       5      (       a  [
        R                  " S0 UD6$ g)z:Constructs proto message BareMetalAdminLoadBalancerConfig.)manualLbConfig
portConfig	vipConfigNr+   )rH   rB   r<   r,   r-   r    BareMetalAdminLoadBalancerConfigr/   s      r"   _load_balancer_config2_BareMetalAdminClusterClient._load_balancer_configs   s_     006''-%%d+F 6==?66@@@r%   c                     [        USS5      [        USS5      S.n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g),Constructs proto message BareMetalLvpConfig.lvp_share_pathNlvp_share_storage_classpathstorageClassr+   r   r,   r-   r   BareMetalLvpConfigr/   s      r"   _lvp_config(_BareMetalAdminClusterClient._lvp_config   sO     .5&?FF
 6==?((2622r%   c                     U R                  U5      [        USS5      S.n[        UR                  5       5      (       a  [        R
                  " S0 UD6$ g)z1Constructs proto message BareMetalLvpShareConfig.lvp_share_path_pv_countN)	lvpConfigsharedPathPvCountr+   )rZ   r   r,   r-   r   BareMetalLvpShareConfigr/   s      r"   _lvp_share_config._BareMetalAdminClusterClient._lvp_share_config   sP     %%d+$T+DdKF
 6==?--777r%   c                     [        USS5      [        USS5      S.n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)rR   lvp_node_mounts_config_pathN$lvp_node_mounts_config_storage_classrU   r+   rX   r/   s      r"   _lvp_node_mounts_config4_BareMetalAdminClusterClient._lvp_node_mounts_config   sR     ;TB8$
F 6==?((2622r%   c                     U R                  U5      U R                  U5      S.n[        UR                  5       5      (       a  [        R
                  " S0 UD6$ g)z5Constructs proto message BareMetalAdminStorageConfig.)lvpShareConfiglvpNodeMountsConfigNr+   )ra   rf   r,   r-   r   BareMetalAdminStorageConfigr/   s      r"   _storage_config,_BareMetalAdminClusterClient._storage_config   sQ     006#;;DAF
 6==?11;F;;r%   c                     / nU(       d  gUR                  5        H;  u  p4UR                  [        R                  R                  R                  X4S95        M=     [        R                  R	                  US9nU$ )%Constructs proto message LabelsValue.Nr   r   )r   r   r   BareMetalNodeConfigLabelsValuer   )r    labelsr!   r   r   labels_value_messages         r"   _node_labels)_BareMetalAdminClusterClient._node_labels   s{    #% lln
"))

&
&
2
2
E
E F  % $77CC9 D   r%   c                     UR                  SS5      nU(       d  [        R                  " SS5      eUU R                  UR                  S0 5      5      S.n[        R
                  " S0 UD6$ )-Constructs proto message BareMetalNodeConfig.nodeIP &--control_plane_node_configs_from_filez:Missing field [nodeIP] in Control Plane Node configs file.rr   nodeIprr   r+   )getr   BadArgumentExceptionrt   r   rp   )r    control_plane_node_confignode_ipr0   s       r"   _control_plane_node_config7_BareMetalAdminClusterClient._control_plane_node_config   sp    '++Hb9G++
2
F  ##%))(B7
F ''1&11r%   c                     UR                   (       d  / $ UR                   R                  S/ 5      nU(       d  [        R                  " SS5      e/ nU H#  nUR	                  U R                  U5      5        M%     U$ ),Constructs proto message field node_configs.nodeConfigsrz   z?Missing field [nodeConfigs] in Control Plane Node configs file.)$control_plane_node_configs_from_filer}   r   r~   r   r   )r    r   control_plane_node_configs#control_plane_node_configs_messagesr   s        r"   %_control_plane_node_configs_from_fileB_BareMetalAdminClusterClient._control_plane_node_configs_from_file   s     44i!%!J!J!N!Nr" &++
2
K 
 +-'%?!)00

)
)*C
D &@
 /.r%   c                     / n[        US0 5      nU(       d  / $ UR                  5        H9  nU R                  U5      nUR                  [        R
                  " S0 UD65        M;     U$ )z#Constructs proto message NodeTaint.control_plane_node_taintsr+   )r   r   _parse_node_taintr   r   	NodeTaint)r    r   taint_messagesnode_taints
node_tainttaint_objects         r"   _control_plane_node_taints7_BareMetalAdminClusterClient._control_plane_node_taints   se    N$ ;R@Ki!'')
++J7lH..>>? * r%   c                    [        US0 5      n/ nU(       d  gUR                  5        H;  u  pEUR                  [        R                  R
                  R                  XES95        M=     [        R                  R                  US9nU$ )ro   control_plane_node_labelsNr   r   )r   r   r   r   BareMetalNodePoolConfigrq   r   )r    r   node_labelsr!   r   r   rs   s          r"   _control_plane_node_labels7_BareMetalAdminClusterClient._control_plane_node_labels   s    $ ;R@K#% !'')
"))

*
*
6
6
I
I J  * $;;GG9 H   r%   c                    UR                  S5      (       d  gUR                  SS5      R                  S5      n/ nU H  nUR                  S5      n[        U5      S:w  a%  [        R                  " SR                  U5      5      eUR                  [        R                  R                  R                  US   US	   S
95        M     [        R                  R                  US9nU$ )a8  Validates and parses a node label object.

Args:
  node_labels: str of key-val pairs separated by ';' delimiter.

Returns:
  If label is valid, returns a dict mapping message LabelsValue to its
  value, otherwise, raise ArgumentTypeError.
  For example,
  {
      'key': LABEL_KEY
      'value': LABEL_VALUE
  }
rr   Nry   ;=   z8Node Label [{}] not in correct format, expect KEY=VALUE.r      r   r   )r}   splitlenr
   ArgumentTypeErrorformatr   r   rp   rq   r   )r    r   input_node_labelsr!   labelkey_val_pairrs   s          r"   _parse_node_labels/_BareMetalAdminClusterClient._parse_node_labels  s     ??8$$#"5;;C@#% "[[%l	\	a	++FMM!
 	

 #))

&
&
2
2
E
Eq/a F  # $77CC9 D   r%   c                     UR                  SS5      U R                  U5      S.n[        UR                  5       5      (       a  [        R
                  " S0 UD6$ g)rw   znode-ipry   r{   Nr+   )r}   r   r,   r-   r   rp   )r    node_config_argsr0   s      r"   _node_config)_BareMetalAdminClusterClient._node_config:  sT     #&&y"5))*:;F
 6==?))3F33r%   c                     UR                   (       a  [        US/ 5      O/ nU Vs/ s H  o0R                  U5      PM     sn$ s  snf )r   r   )r   r   r   )r    r   node_config_flag_valuenode_configs       r"   %_control_plane_node_configs_from_flagB_BareMetalAdminClusterClient._control_plane_node_configs_from_flagF  sR     ** 	2B7  ;Q:P;+&:P  s   Ac                 "   SUR                  5       ;   a  U R                  U5      nOU R                  U5      nUU R                  U5      U R	                  U5      S.n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z1Constructs proto message BareMetalNodePoolConfig.r   )r   rr   taintsNr+   )	GetSpecifiedArgsDictr   r   r   r   r,   r-   r   r   )r    r   node_configsr0   s       r"   _node_pool_config._BareMetalAdminClusterClient._node_pool_configT  s    -1J1J1LL??El??El $11$711$7F 6==?--777r%   c                     SU R                  U5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)zBConstructs proto message BareMetalAdminControlPlaneNodePoolConfig.nodePoolConfigNr+   )r   r,   r-   r   (BareMetalAdminControlPlaneNodePoolConfigr/   s      r"   _control_plane_node_pool_config<_BareMetalAdminClusterClient._control_plane_node_pool_configf  sE     	$006F 6==?>>HHHr%   c                     / n[        USS5      nU(       a<  UR                  5        H(  u  pEUR                  [        R                  " XES95        M*     U$ )z9Constructs proto message BareMetalAdminApiServerArgument.api_server_argsN)argumentr   )r   r   r   r   BareMetalAdminApiServerArgument)r    r   r   api_server_args_flag_valuer   vals         r"   _api_server_args-_BareMetalAdminClusterClient._api_server_argsq  sS    O!(/@$!G!0668(#44cM	
 9
 r%   c                     U R                  U5      U R                  U5      S.n[        UR                  5       5      (       a  [        R
                  " S0 UD6$ g)z:Constructs proto message BareMetalAdminControlPlaneConfig.)controlPlaneNodePoolConfigapiServerArgsNr+   )r   r   r,   r-   r    BareMetalAdminControlPlaneConfigr/   s      r"   _control_plane_config2_BareMetalAdminClusterClient._control_plane_config}  sV     '+&J&J'
 ..t4	F 6==?66@@@r%   c                     [        USS5      [        US/ 5      S.n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z3Constructs proto message BareMetalAdminProxyConfig.uriNno_proxy)r   noProxyr+   )r   r,   r-   r   BareMetalAdminProxyConfigr/   s      r"   _proxy_config*_BareMetalAdminClusterClient._proxy_config  sM     tUD)4R0F
 6==?//9&99r%   c                     S[        USS5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z@Constructs proto message BareMetalAdminClusterOperationsConfig .enableApplicationLogsenable_application_logsNr+   )r   r,   r-   r   %BareMetalAdminClusterOperationsConfigr/   s      r"   _cluster_operations_config7_BareMetalAdminClusterClient._cluster_operations_config  sD     	 /H$!OF 6==?;;EfEEr%   c                     S[        US/ 5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z9Constructs proto message BareMetalAdminMaintenanceConfig.maintenanceAddressCidrBlocksmaintenance_address_cidr_blocksNr+   )r   r,   r-   r   BareMetalAdminMaintenanceConfigr/   s      r"   _maintenance_config0_BareMetalAdminClusterClient._maintenance_config  sG     	'3R)
F 6==?55???r%   c                     S[        USS5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z:Constructs proto message BareMetalAdminWorkloadNodeConfig.maxPodsPerNodemax_pods_per_nodeNr+   )r   r,   r-   r    BareMetalAdminWorkloadNodeConfigr/   s      r"   _workload_node_config2_BareMetalAdminClusterClient._workload_node_config  sD     	'$(;TBF 6==?66@@@r%   c                     S[        USS5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z8Constructs proto message BareMetalAdminNodeAccessConfig.	loginUser
login_userrootNr+   )r   r,   r-   r   BareMetalAdminNodeAccessConfigr/   s      r"   _node_access_config0_BareMetalAdminClusterClient._node_access_config  sC     	WT<8F 6==?44>v>>r%   c                 D   / n[        USS5      nU(       a%  U Vs/ s H  n[        R                  " US9PM     sn$ [        R                  R
                  R                  R                  5       nU(       a'  [        R                  " US9nUR                  U5        U$ gs  snf )z.Constructs repeated proto message ClusterUser.admin_usersN)username)	r   r   ClusterUserr   VALUEScoreaccountGetr   )r    r   cluster_user_messagesr   
admin_usergcloud_config_core_accountdefault_admin_user_messages          r"   _cluster_users+_BareMetalAdminClusterClient._cluster_users  s    $t4K ('j 



3'  ",!2!2!7!7!?!?!C!C!E!#+#7#7-$  ""#=>""s   Bc                     SU R                  U5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z'Constructs proto message Authorization.
adminUsersNr+   )r   r,   r-   r   Authorizationr/   s      r"   _authorization+_BareMetalAdminClusterClient._authorization  sE     	d))$/F 6==?##-f--r%   c                     SU R                  U5      0n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)z6Constructs proto message BareMetalAdminSecurityConfig.authorizationNr+   )r   r,   r-   r   BareMetalAdminSecurityConfigr/   s      r"   _security_config-_BareMetalAdminClusterClient._security_config  sE     	,,T2F 6==?22<V<<r%   c                 B   U R                  U5      [        USS5      U R                  U5      [        USS5      U R                  U5      U R	                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      S.n[        UR                  5       5      (       a  [         R"                  " S0 UD6$ g)/Constructs proto message BareMetalAdminCluster.descriptionNversion)namer  r   bareMetalVersionnetworkConfigcontrolPlaneloadBalancerstorageproxyclusterOperationsmaintenanceConfig
nodeConfignodeAccessConfigsecurityConfigbinaryAuthorizationr+   )_admin_cluster_namer   r#   r6   r   rO   rl   r   r   r   r   r   r  _binary_authorizationr,   r-   r   r   r/   s      r"   _bare_metal_admin_cluster6_BareMetalAdminClusterClient._bare_metal_admin_cluster  s    ((.t]D9((.#D)T:--d322482248''-##D)!<<TB!55d;006 44T://5#99$?F$ 6==?++5f55r%   r+   N)(__name__
__module____qualname____firstlineno____doc__r   	Namespacer#   r1   r6   r<   rB   rH   rO   rZ   ra   rf   rl   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  __static_attributes__r+   r%   r"   r   r       s.   G0:: $+<+F+F  	"3"="= 		/99 	0:: 	$5$?$? 	(9(C(C 
/99 

$5$?$? 
*;*E*E 
"3"="= 
 &2$/#--/2->-H-H  ->-H-H  (' R
#--$5$?$? $	2C2M2M 	
#4#>#> 
(9(C(C 
 1 ; ; 
	->-H-H 	&7&A&A 	(9(C(C 		&7&A&A 	!2!<!< *	!2!<!< 		#4#>#> 	,=,G,G r%   r   c                     ^  \ rS rSrSrU 4S jrS\R                  4S jrS\R                  4S jr	S\R                  4S jr
S\R                  4S jrS\R                  4S	 jrS\R                  4S
 jrS\R                  4S jrSrU =r$ )AdminClustersClienti  z6Client for admin clusters in gkeonprem bare metal API.c                 d   > [         [        U ]
  " S0 UD6  U R                  R                  U l        g )Nr+   )superr   __init___client)projects_locations_bareMetalAdminClusters_service)r    r0   	__class__s     r"   r#  AdminClustersClient.__init__  s'    	
t-77LLJJDMr%   r   c                     U R                  U5      U R                  U5      S.n[        R                  " U R	                  U5      [        R
                  " S0 UD6S9nU R                  R                  U5      $ )z1Enrolls an admin cluster to Anthos on bare metal.)
membershipbareMetalAdminClusterId)parent"enrollBareMetalAdminClusterRequestr+   )_admin_cluster_membership_name_admin_cluster_idr   =GkeonpremProjectsLocationsBareMetalAdminClustersEnrollRequest_admin_cluster_parent"EnrollBareMetalAdminClusterRequestr&  Enrollr    r   r0   reqs       r"   r3  AdminClustersClient.Enroll  st     99$?#'#9#9$#?F 
P
P))$/+3+V+V ,
,
C ==$$r%   c                     U R                  U5      U R                  US5      U R                  US5      U R                  US5      S.n[        R                  " S0 UD6nU R                  R                  U5      $ )z0Unenrolls an Anthos on bare metal admin cluster.allow_missingvalidate_onlyignore_errors)r  allowMissingvalidateOnlyignoreErrorsr+   )r  GetFlagr   ?GkeonpremProjectsLocationsBareMetalAdminClustersUnenrollRequestr&  Unenrollr4  s       r"   r@  AdminClustersClient.Unenroll   st     ((.T?;T?;T?;	F 
R
R 
C ==!!#&&r%   c                    UR                   (       a  UR                   O1[        R                  R                  R                   R	                  5       nSR                  USS9n[        R                  " US9n U R                  R                  U5      nSUR                  5       ;  a>  [        R                  R                  R                  R	                  5       (       d  SUl        [        R                   " U R#                  U5      S9n[$        R&                  " U R                  US[)        USS	5      [)        US
S5      SS9$ ! [        R                  [        R                  4 a     Nf = f)z7Lists admin clusters in the GKE On-Prem bare metal API.z'projects/{project}/locations/{location}zus-west1)projectlocation)r,  rD  -bareMetalAdminClusters	page_sized   limitNpageSize)field
batch_sizerI  batch_size_attribute)rC  r   r   r   r   r   r   IGkeonpremProjectsLocationsBareMetalAdminClustersQueryVersionConfigRequestr&  QueryVersionConfigapitools_exceptionsHttpUnauthorizedErrorHttpForbiddenErrorr   container_bare_metalrD  ;GkeonpremProjectsLocationsBareMetalAdminClustersListRequest_location_namer   YieldFromListr   )r    r   rC  r,  dummy_request_list_reqs          r"   ListAdminClustersClient.List-  sB   
 **;*;*@*@*H*H*L*L*N  7==* > F ffM
--
*
*=
9a 	$3355!!66??CCEEdm 	LL&&t,	
  ##&4c2dGT*' + 	11..  s   5D> >$E%$E%c                     U R                  U5      U R                  U5      R                  5       S.n[        R                  " S0 UD6nU R
                  R                  U5      $ )z7Query Anthos on bare metal admin version configuration.)upgradeConfig_clusterNamer,  r+   )r  _location_refRelativeNamer   rN  r&  rO  r4  s       r"   rO  &AdminClustersClient.QueryVersionConfig\  sa     &*%=%=d%C$$T*779F
 
\
\ 
C ==++C00r%   c                     U R                  U5      [        USS5      U R                  U5      U R                  U5      S.n[        R
                  " S0 UD6nU R                  R                  U5      $ )z1Creates an admin cluster in Anthos on bare metal.r9  F)r,  r<  bareMetalAdminClusterr+  r+   )r1  r   r  r/  r   =GkeonpremProjectsLocationsBareMetalAdminClustersCreateRequestr&  Creater4  s       r"   rd  AdminClustersClient.Createh  su     ,,T2ou=!%!?!?!E#'#9#9$#?	F 	NN 	
	
 
 ==$$r%   c                 
   U R                  U5      [        R                  " U[        R                  5      [	        USS5      U R                  U5      S.n[        R                  " S0 UD6nU R                  R                  U5      $ )z1Updates an admin cluster in Anthos on bare metal.r9  F)r  
updateMaskr<  rb  r+   )
r  r	   get_update_mask-BARE_METAL_ADMIN_CLUSTER_ARGS_TO_UPDATE_MASKSr   $_bare_metal_admin_cluster_for_updater   <GkeonpremProjectsLocationsBareMetalAdminClustersPatchRequestr&  Patchr4  s       r"   UpdateAdminClustersClient.Updatew  s     ((.!11+KK
  ou=!%!J!J"
	F 
O
O 
C ==s##r%   c                    [        USS5      [        USS5      U R                  U5      U R                  U5      U R                  U5      U R	                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      U R                  U5      S.n[        UR                  5       5      (       a  [        R                  " S0 UD6$ g)r  r  Nr  )r  r  r	  r
  r  r  r  r  r  r  r  r  r+   )r   r6   r   rO   rl   r   r   r   r   r   r  r,   r-   r   r   r/   s      r"   rj  8AdminClustersClient._bare_metal_admin_cluster_for_update  s    
 t]D9#D)T:--d322482248''-##D)!<<TB!55d;006 44T:#99$?F 6==?++5f55r%   )r&  )r  r  r  r  r  r#  r   r  r3  r@  rZ  rO  rd  rm  rj  r  __classcell__)r'  s   @r"   r   r     s    >K%*44 %',66 '-(22 -^
1%6%@%@ 
1%*44 %$*44 $"#-- r%   r   N)r  
__future__r   r   r   apitools.base.pyr   rP  r   *googlecloudsdk.api_lib.container.gkeonpremr   r	   googlecloudsdk.callioper
   r   googlecloudsdk.corer   2googlecloudsdk.generated_clients.apis.gkeonprem.v1r   r   
ClientBaser   r   r+   r%   r"   <module>ry     sS    R &  ' > ' = B / . 5 * `h6#4#4 hVQ6 Qr%   