
    DW                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
rS SKrS SKrS SKrS SKJr  S SKJr  S SKJr  S SKJrJr  S SKJr  SSKJr  SS	KJrJrJ r    S SK!r!\RF                  " S
S9r$\RJ                  RM                  SS5      r'\RP                  " 5       S:X  a  SOSr)0 q*S r+S r,S r- " S S\.5      r/ " S S\.5      r0 " S S\.5      r1 " S S5      r2 S S jr3S!S jr4    S"S jr5S#S jr6g! \" a     Nf = f)$    N)yaml)OAuth2Session)PY3)	ApiClientConfiguration)ExecProvider   )ConfigException)UTCformat_rfc3339parse_rfc3339   )minutes
KUBECONFIGz~/.kube/configWindows;:c                      [         R                  5        H  n  [        R                  " U 5        M     0 q g ! [         a     M.  f = fN)_temp_filesvaluesosremoveOSError)	temp_files    0lib/third_party/kubernetes/config/kube_config.py_cleanup_temp_filesr   5   sA    %%'iii	 (
 +  
s   6
AAc                    [        [        5      S:X  a  [        R                  " [        5        [        U 5      nU[        ;   a	  [        U   $ [        R                  " 5       u  p#U[        U'   [        US5       nUR                  [        U [
        5      (       a  U R                  5       OU 5        S S S 5        U$ ! , (       d  f       U$ = f)Nr   wb)lenr   atexitregisterr   strtempfilemkstempopenwrite
isinstanceencode)contentcontent_key_namefds        r   _create_temp_file_with_contentr/   ?   s    
OO'( G+K{##'!!+kD$2HHGS!9!9W^^wG 	+ 	+s   87B99
Cc                     [        U 5      [        -
  [        R                  R                  5       R	                  [
        S9:*  $ )N)tzinfo)r   EXPIRY_SKEW_PREVENTION_DELAYdatetimeutcnowreplacer   )expirys    r   _is_expiredr7   N   s:     #??



"
"
$
,
,C
,
89 :    c                   4    \ rS rSrSr   SS jrS rS rSrg)	
FileOrDataS   a"  Utility class to read content of obj[%data_key_name] or file's

content of obj[%file_key_name] and represent it as file or data.
Note that the data is preferred. The obj[%file_key_name] will be used iff
obj['%data_key_name'] is not set or empty. Assumption is file content is
raw data and data field is base64 string. The assumption can be changed
with base64_file_content flag. If set to False, the content of the file
will assumed to be base64 and read as is. The default True value will
result in base64 encode of the file content after read.
Nc                     U(       d  US-   nS U l         S U l        XPl        X1;   a
  X   U l        g X!;   aE  [        R                  R                  [        R                  R                  XAU   5      5      U l         g g )Nz-data)_file_data_base64_file_contentr   pathnormpathjoin)selfobjfile_key_namedata_key_namefile_base_pathbase64_file_contents         r   __init__FileOrData.__init___   sk     #g-mDJDJ 3%dj		77##
'',,~='9
:<dj 
r8   c                 J   U R                   (       + =(       a    U R                  nU(       a  U R                  (       ak  [        U R                  [        5      (       a  U R                  R                  5       nOU R                  n[        [        R                  " U5      5      U l         O[        U R                  5      U l         U R                   (       aF  [        R                  R                  U R                   5      (       d  [        SU R                   -  5      eU R                   $ )zIf obj[%data_key_name] exists, return name of a file with base64

decoded obj[%data_key_name] content otherwise obj[%file_key_name].
zFile does not exists: %s)r=   r>   r?   r(   r#   r)   r/   base64standard_b64decoder   r@   isfiler
   )rC   use_data_if_no_filer*   s      r   as_fileFileOrData.as_filep   s    
 #jj.7TZZ		"	"djj#&&JJ%%''JJ'3%%g.0
 4DJJ?
zz"''..446CDD::r8   c           	         U R                   (       + =(       a    U R                  nU(       a  [        U R                  5       nU R                  (       aP  [        R                  [        R                  " [        R                  UR                  5       5      5      5      U l         OUR                  5       U l         SSS5        U R                   $ U R                   $ ! , (       d  f       U R                   $ = f)zIf obj[%data_key_name] exists, Return obj[%data_key_name] otherwise

base64 encoded string of obj[%file_key_name] file content.
N)r>   r=   r&   r?   bytesdecoderL   standard_b64encoder#   r)   read)rC   use_file_if_no_datafs      r   as_dataFileOrData.as_data   s    
 #jj.7TZZ

q$$||''

1668(<=?$* vvx$*  ::4::  ::s   A7C
C1)r?   r>   r=   )N T)	__name__
__module____qualname____firstlineno____doc__rI   rP   rY   __static_attributes__ r8   r   r:   r:   S   s!    	 " #'<"(r8   r:   c                       \ rS rSr    SS jrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS r\S 5       rSrg)KubeConfigLoader   Nc                     [        U[        5      (       a  Xl        O[        SU5      U l        S U l        S U l        S U l        U R                  U5        X@l        XPl        S nU(       a  X0l	        g X`l	        g )Nzkube-configc                      [         R                  R                  SS/S9u  p[         R                  R                  R                  R                  5       nU R                  U5        U $ )Nz.https://www.googleapis.com/auth/cloud-platformz.https://www.googleapis.com/auth/userinfo.email)scopes)googleauthdefault	transportrequestsRequestrefresh)credentials
project_idrequests      r   _refresh_credentials7KubeConfigLoader.__init__.<locals>._refresh_credentials   s[     & 3 3
:
:< 3 !	k %%..668g'"r8   )
r(   
ConfigNode_config_current_context_user_clusterset_active_context_config_base_path_config_persister_get_google_credentials)rC   config_dictactive_contextget_google_credentialsconfig_base_pathconfig_persisterrs   s          r   rI   KubeConfigLoader.__init__   sj     +z** l{;dl DDJDMN+-- %;"%9"r8   c                    Uc  U R                   S   nU R                   S   R                  U5      U l        U R                  S   R                  S5      (       ag  U R                   R                  S5      (       aG  U R                   S   R                  U R                  S   S   SS9nU(       a  US   U l        OS U l        OS U l        U R                   S   R                  U R                  S   S	   5      S	   U l        g )
Nzcurrent-contextcontextscontextuserusersT)safeclusterscluster)rv   get_with_namerw   safe_getrx   ry   )rC   context_namer   s      r   rz   #KubeConfigLoader.set_active_context   s    \\"34l LL4BB<PDi(11&99g&&\\'"00


	
*6
2 1 ?d	&\

djLL,::i(355>@DMr8   c                     U R                   (       d  gU R                  5       (       a  gU R                  5       (       a  gU R                  5       (       a  gU R	                  5         g)a}  Read authentication from kube-config user section if exists.

This function goes through various authentication methods in user
section of kube-config and stops if it finds a valid authentication
method. The order of authentication methods is:

    1. auth-provider (gcp, azure, oidc)
    2. token field (point to a token file)
    3. exec provided plugin
    4. username/password
N)rx   _load_auth_provider_token_load_user_token_load_from_exec_plugin_load_user_pass_tokenrC   s    r   _load_authentication%KubeConfigLoader._load_authentication   sP     ::%%''""$$ r8   c                     SU R                   ;  a  g U R                   S   nSU;  a  g US   S:X  a  U R                  U5      $ US   S:X  a  U R                  U5      $ US   S:X  a  U R                  U5      $ g )Nauth-providerr-   gcpazureoidc)rx   _load_gcp_token_load_azure_token_load_oid_tokenrC   providers     r   r   *KubeConfigLoader._load_auth_provider_token   s    djj(zz/*HX5 !!(++7"##H--6!!!(++ "r8   c                     SU;  a  g SUS   ;  a  g SUS   ;   a<  [        US   S   5      [        R                  " 5       :  a  U R                  US   5        SUS   S   -  U l        U R                  $ )Nconfigaccess-token
expires-on	Bearer %s)inttimegmtime_refresh_azure_tokentokenr   s     r   r   "KubeConfigLoader._load_azure_token   sz    xXh//x))	Xh-	.	>!!(8"45x1.AADJ::r8   c                    S[        5       ;  a  [        S5      eUS   nSR                  U5      n[        R                  " USS9nUS   nUS   nUR                  XVS	5      nU R                  S
   S   nUS   UR                  S'   US   UR                  S'   U R                  (       a&  U R                  U R                  R                  5        g g )Nadalz.refresh token error, adal library not importedz	tenant-idz$https://login.microsoftonline.com/{}T)validate_authorityrefresh-token	client-idz$00000002-0000-0000-c000-000000000000r   r   accessTokenr   	expiresOnr   )
globalsImportErrorformatr   AuthenticationContext acquire_token_with_refresh_tokenrx   valuer|   rv   )	rC   r   tenant	authorityr   refresh_token	client_idtoken_responser   s	            r   r   %KubeConfigLoader._refresh_azure_token   s    WYHIIK F6==fEI((G ?+M{#I=="HJN zz/*84H%3M%BHNN>"#1+#>HNN< 
T\\//0 r8   c                     SU;  d(  SUS   ;  d  SUS   ;   a&  [        US   S   5      (       a  U R                  5         SUS   S   -  U l        U R                  $ )Nr   r   r6   r   )r7   _refresh_gcp_tokenr   r   s     r   r    KubeConfigLoader._load_gcp_token  se    		!	x1	1	Xh'	'	Xh'1	2	2
x1.AADJ::r8   c                    SU R                   S   ;  a  0 U R                   S   R                  S'   U R                   S   S   nU R                  5       nUR                  UR                  S'   [	        UR
                  5      UR                  S'   U R                  (       a&  U R                  U R                  R                  5        g g )Nr   r   r   r6   )rx   r   r}   r   r   r6   r|   rv   )rC   r   rp   s      r   r   #KubeConfigLoader._refresh_gcp_token  s    tzz/2246djj!''1zz/*84H..0K%0%6%6HNN>"-k.@.@AHNN8
T\\//0 r8   c                 F  ^ SU;  a  g [        / SQ5      nUS   S   m[        U4S jU 5       5      (       a  g TR                  S5      n[        U5      S:w  a  g S[        US   5      S-  -
  S	-  n[        U5      S:X  a  g [        (       a@  [
        R                  " [        R                  " US   U-   5      R                  S
5      5      nO0[
        R                  " [        R                  " US   U-   5      5      nUR                  S5      nUbw  [        [        R                  R                  U[        S95      (       aG  U R                  U5        U R                   (       a%  U R!                  U R"                  R$                  5        SUS   S   -  U l        U R&                  $ )Nr   )=+/id-tokenc              3   ,   >#    U  H	  oT;   v   M     g 7fr   rb   ).0charr   s     r   	<genexpr>3KubeConfigLoader._load_oid_token.<locals>.<genexpr>'  s     
9%8T5=%8s   .      r	   r   utf-8exp)tzr   )	frozensetanysplitr    r   jsonloadsrL   	b64decoderT   getr7   r3   fromtimestampr   _refresh_oidcr|   rv   r   r   )rC   r   reserved_characterspartspaddingjwt_attributesexpirer   s          @r   r    KubeConfigLoader._load_oid_token   sf   x#O4Xz*E

9%8
999KKE
5zQ3uQx=1$$+G
7|q 
szz


58g-
.
5
5g
>@n zz&"2"258g3E"FGn&F			X&&44V4D	E	E
"			t||112x1*==DJ::r8   c                     [        5       nSUS   ;   a  [        R                  " SS9n[        (       a,  [        R
                  " US   S   5      R                  S5      nO[        R
                  " US   S   S-   5      n[        UR                  S5       nUR                  U5        S S S 5        UR                  Ul
        OSUl        [        US	9nUR                  S
SUS   S   -  S9nUR                  S:w  a  g [        R                   " UR"                  5      n[%        US   S   US   S   US   S   US   S   S.US   S9n UR'                  US   US   S   US   S   US   S   4UR                  (       a  UR                  OS S9n	U	S   US   R2                  S'   U	S   US   R2                  S'   g ! , (       d  f       GN= f! [(        R*                  R,                  R.                  R0                   a     g f = f)Nzidp-certificate-authority-datar   T)deleter   z==wFconfigurationGETz#%s/.well-known/openid-configurationzidp-issuer-url)methodurl   r   r   zclient-secret)r   client_secrettoken_endpoint)r   r   auto_refresh_kwargsauto_refresh_url)	token_urlr   rj   verifyid_tokenr   r   )r   r$   NamedTemporaryFiler   rL   r   rT   r&   r-   r'   ssl_ca_cert
verify_sslr   rr   statusr   r   datar   r   oauthliboauth2rfc6749errorsInvalidClientIdErrorr   )
rC   r   r   ca_certcertfhclientresponserr   ro   s
             r   r   KubeConfigLoader._refresh_oidcI  s/   _F'8H+==++48g	X?@BBH&C 	 X?@4GI c"b
 # #<<f  fV,F~~1+,-  .H
 #zz(--(H8$[1x 1!(+K8%h/@
 ""235G%%-. *?;";/"?35'-'8'8##d & Dg ,3:+>HXZ(070HHX_-Q #"H ??""))>> s   F6AG 6
G2G=<G=c                 4   SU R                   ;  a  g  [        U R                   S   5      R                  5       nSU;  a  [        R                  " S5        g SUS   -  U l        g! [         a)  n[        R                  " [        U5      5         S nAg S nAff = f)Nexecr   z*exec: missing token field in plugin outputr   T)rx   r   runloggingerrorr   	Exceptionr#   )rC   r   es      r   r   'KubeConfigLoader._load_from_exec_plugin  s    TZZDJJv./335f		BC0dj mmCFs   AA$ A$ $
B.BBc                     U R                  U R                  R                  5      n[        U R                  SSUSS9R	                  5       nU(       a  SU-  U l        gg )N	tokenFiler   F)rG   rH   r   T)_get_base_pathrx   r@   r:   rY   r   )rC   	base_pathr   s      r   r   !KubeConfigLoader._load_user_token  s\    ##DJJOO4I

 !#
 $+79 
 &dj r8   c                     SU R                   ;   ac  SU R                   ;   aR  [        R                  R                  U R                   S   S-   U R                   S   -   S9R	                  S5      U l        gg g )Nusernamepasswordr   )
basic_authauthorizationT)rx   urllib3utilmake_headersr   r   r   s    r   r   &KubeConfigLoader._load_user_pass_token  sp    TZZJ$**$<<<,,jj,s2jj,- - //2s?/C j 	 %=r8   c                     U R                   b  U R                   $ Ub<  [        R                  R                  [        R                  R	                  U5      5      $ g)Nr[   )r{   r   r@   abspathdirname)rC   config_paths     r   r  KubeConfigLoader._get_base_path  sC    )###WW__RWW__[9::r8   c                 8   SU R                   ;   a  U R                   S   R                  S5      U l        U R                  R                  S5      (       a  U R	                  U R                   R
                  5      n[        U R                   SUS9R                  5       U l        [        U R                  SUS9R                  5       U l
        [        U R                  SUS9R                  5       U l        SU R                   ;   a  U R                   S   (       + U l        g g )	Nserverr   httpszcertificate-authority)rG   zclient-certificatez
client-keyzinsecure-skip-tls-verify)ry   rstriphost
startswithr  r@   r:   rP   r   rx   	cert_filekey_filer   )rC   r  s     r   _load_cluster_info#KubeConfigLoader._load_cluster_info  s    4== --)005di			g	&	&''(:(:;	%MM2$&&-gi 	 $JJ,$&&-gi 	 #JJY@@G	 	!T]]2 MM*DEEdo 3r8   c                     U R                   =(       aD    SU R                   ;   =(       a.    SU R                   S   ;   =(       a    U R                   S   S   S:H  $ )Nr   r-   r   )rx   r   s    r   _using_gcp_auth_provider)KubeConfigLoader._using_gcp_auth_provider  sR    :: 54::%5$**_--5 	

?#F+u45r8   c           	        ^  T R                  5       (       a  U 4S jnX!l        ST R                  ;   a  T R                  UR                  S'   / SQnU H+  nUT R                  ;   d  M  [        X[        T U5      5        M-     g )Nc                  @   > TR                  TR                  S   5      $ )Nr   )r   rx   )argsrC   s    r   _gcp_get_api_key6KubeConfigLoader._set_config.<locals>._gcp_get_api_key  s    ##DJJ$?@@r8   r   r  )r$  r   r&  r'  r   )r+  get_api_key_with_prefix__dict__r   api_keysetattrgetattr)rC   client_configurationr0  keyskeys   `    r   _set_configKubeConfigLoader._set_config  sq    $$&&
A 6F2$-- 7;jj""?3ID		$74+=> r8   c                 f    U R                  5         U R                  5         U R                  U5        g r   )r   r(  r:  )rC   r7  s     r   load_and_setKubeConfigLoader.load_and_set  s)    )*r8   c                 ^    U R                   S    Vs/ s H  oR                  PM     sn$ s  snf )Nr   )rv   r   )rC   r   s     r   list_contextsKubeConfigLoader.list_contexts  s'    )-j)AB)AgMM)ABBBs   *c                 .    U R                   R                  $ r   )rw   r   r   s    r   current_context KubeConfigLoader.current_context  s      &&&r8   )ry   rv   r{   r|   rw   r}   rx   r&  r$  r'  r   r   r   )NNr[   Nr   )r\   r]   r^   r_   rI   rz   r   r   r   r   r   r   r   r   r   r   r   r  r(  r+  r:  r=  r@  propertyrC  ra   rb   r8   r   rd   rd      s     #&* " $:B@"!,,	1*	1'R6Ip
F 5?(+
C ' 'r8   rd   c                   D    \ rS rSrSrSS jrS rS rS rS r	SS	 jr
S
rg)ru   i  zRemembers each config key's path and construct a relevant exception

message in case of missing keys. The assumption is all access keys are
present in a well-formed kube-config.
Nc                 (    Xl         X l        X0l        g r   )r-   r   r@   )rC   r-   r   r@   s       r   rI   ConfigNode.__init__  s    IJIr8   c                     XR                   ;   $ r   )r   rC   r9  s     r   __contains__ConfigNode.__contains__  s    **r8   c                 ,    [        U R                  5      $ r   )r    r   r   s    r   __len__ConfigNode.__len__  s    tzz?r8   c                     [        U R                  [        5      (       a  [        U[        5      (       d  XR                  ;   a  U R                  U   $ g r   )r(   r   listr   rJ  s     r   r   ConfigNode.safe_get  s<    4::t$$C)=)=zzZZ_ 	r8   c                    U R                  U5      nU(       d  [        SU< SU R                  < 35      e[        U[        5      (       d  [        U[
        5      (       a'  [        U R                  < SU< 3X R                  5      $ U$ )Nz'Invalid kube-config file. Expected key  in r   )r   r
   r-   r(   dictrQ  ru   r@   )rC   r9  vs      r   __getitem__ConfigNode.__getitem__  sf    cA $))- . .!TjD11499c2AyyAAhr8   c                    [        U R                  [        5      (       d  [        SU R                  -  5      eS nU R                   HO  nSU;  a  [        SU R                  -  5      eUS   U:X  d  M,  Uc  UnM3  [        SU< SU R                  < S35      e   Ub?  [        U[
        5      (       a  U$ [        U R                  < SU< S3X0R                  5      $ U(       a  g [        S	U< SU R                  < S35      e)
Nz2Invalid kube-config file. Expected %s to be a listr-   zKInvalid kube-config file. Expected all values in %s list to have 'name' keyz=Invalid kube-config file. Expected only one object with name rT  z listz[name=]z4Invalid kube-config file. Expected object with name )r(   r   rQ  r
   r-   ru   r@   )rC   r-   r   resultrV  s        r   r   ConfigNode.get_with_name   s    djj$''
>
JL LFZZ	qBDHIINO 	O 
6d	>& TYY ! !  	FJ	'	'499d;VYYOO
, - -r8   )r-   r@   r   r   F)r\   r]   r^   r_   r`   rI   rK  rN  r   rW  r   ra   rb   r8   r   ru   ru     s%    

-r8   ru   c                   F    \ rS rSrSrS r\S 5       rS rS r	S r
S rS	rg
)KubeConfigMergeri  ap  Reads and merges configuration from one or more kube-config's.

The propery `config` can be passed to the KubeConfigLoader as config_dict.

It uses a path attribute from ConfigNode to store the path to kubeconfig.
This path is required to load certs from relative paths.

A method `save_changes` updates changed kubeconfig's (it compares current
state of dicts with).
c                    / U l         0 U l        S U l        UR                  [        5       H}  nU(       d  M  [
        R                  R                  U5      n[
        R                  R                  U5      (       d  MQ  U R                   R                  U5        U R                  U5        M     [        R                  " U R                  5      U l        g r   )pathsconfig_filesconfig_mergedr   ENV_KUBECONFIG_PATH_SEPARATORr   r@   
expanduserexistsappendload_configcopydeepcopyconfig_saved)rC   ra  r@   s      r   rI   KubeConfigMerger.__init__*  s    DJDD9:	ww!!$'77>>$
**

D
!


4
  ; d&7&78Dr8   c                     U R                   $ r   )rc  r   s    r   r   KubeConfigMerger.config7  s    r8   c                 X   [        U5       n[        R                  " U5      nS S S 5        U R                  c4  [        R
                  " W5      nS H  n/ XE'   M	     [        XU5      U l        S H  nU R                  UWU   U5        M     WU R                  U'   g ! , (       d  f       N~= f)N)r   r   r   )	r&   r   	safe_loadrc  ri  rj  ru   _mergerb  )rC   r@   rX   r   rc  items         r   rh  KubeConfigMerger.load_config;  s    	dq~~a f 
 !mmF+m3$  4%d4@d1
kk$td+ 2$Dd 
s   B
B)c           	          U Hs  nU R                   R                  U    H  nUS   US   :X  d  M    M0     U R                   R                  U   R                  [        SR	                  X45      XC5      5        Mu     g )Nr-   z{}/{})rc  r   rg  ru   r   )rC   rr  add_cfgr@   new_itemrf  s         r   rq  KubeConfigMerger._mergeI  sp    &&,,T2&&>Xf--
 3 	  &--w~~d5xF	H r8   c                     U R                    H6  nU R                  U   U R                  U   :w  d  M%  U R                  U5        M8     [        R
                  " U R                  5      U l        g r   )ra  rk  rb  save_configri  rj  )rC   r@   s     r   save_changesKubeConfigMerger.save_changesR  sU    

			4	 D$5$5d$;	;  d&7&78Dr8   c                     [        US5       n[        R                  " U R                  U   USS9  S S S 5        g ! , (       d  f       g = f)Nr   F)default_flow_style)r&   r   	safe_dumprb  )rC   r@   rX   s      r   ry  KubeConfigMerger.save_configX  s2    	dCA
nnT&&t,aEJ 
s	   $:
A)rb  rc  rk  ra  N)r\   r]   r^   r_   r`   rI   rE  r   rh  rq  rz  ry  ra   rb   r8   r   r_  r_    s6    	9  %H9Kr8   r_  c                     [        U 5      nU(       a  SU;  a  UR                  5       US'   [        SUR                  S S.UD6$ )Nr   )r~   r   rb   )r_  rz  rd   r   )filenamepersist_configkwargskcfgs       r   %_get_kube_config_loader_for_yaml_filer  ]  sT     
(	#$*&8!%!2!2!4F	 
@++
@8>
@ @r8   c                 b    U c  [         n [        U 5      nUR                  5       UR                  4$ r   )KUBE_CONFIG_DEFAULT_LOCATIONr  r@  rC  )config_fileloaders     r   list_kube_config_contextsr  i  s1    .K0=&				!7!7	77r8   c                     U c  [         n [        XUS9nUcA  [        R                  [        5      nUR                  U5        [        R                  " U5        gUR                  U5        g)a  Loads authentication and cluster information from kube-config file

and stores them in kubernetes.client.configuration.

:param config_file: Name of the kube-config file.
:param context: set the active context. If is set to None, current_context
    from config file will be used.
:param client_configuration: The kubernetes.client.Configuration to
    set configs to.
:param persist_config: If True, config file will be updated when changed
    (e.g GCP token refresh).
N)r   r  )r  r  type__call__r   r=  set_default)r  r   r7  r  r  r   s         r   load_kube_configr  r  s`    " .K0.J& !]]=)F
f%
,-r8   c                 ^    [         R                  [        5      n[        U UUUS9  [	        US9$ )z
Loads configuration the same as load_kube_config but returns an ApiClient
to be used with any API object. This will allow the caller to concurrently
talk with multiple clusters.
)r  r   r7  r  r   )r  r  r   r  r   )r  r   r  client_configs       r   new_client_from_configr    s3     --.-(#	%
 
	//r8   r]  r   )NNNT)NNT)7r!   rL   ri  r3   r   r  r   platformr$   r   google.authri   google.auth.transport.requestsoauthlib.oauth2r   r  ruamelr   requests_oauthlibr   sixr   kubernetes.clientr   r   kubernetes.config.exec_providerr   config_exceptionr
   dateutilr   r   r   r   r   	timedeltar2   environr   r  systemrd  r   r   r/   r7   objectr:   rd   ru   r_  r  r  r  r  rb   r8   r   <module>r     s  "       	     %    +  6 8 - 8 8  (11!< !zz~~l<LM '/'8I'E3 :
> >BH'v H'V
<- <-~<K <K@ :?	@8 "&!*.$(.>0K  s   *D DD