
    )k                     8   S r SSKJr  SSKJr  SSKJ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  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&r&Sr'Sr(\
RR                  " S5      r*Sr+Sr,Sr-Sr.0 r/ " S S\R`                  " SS5      5      r10 S\1" SSS 9_S!\1" SSS 9_S"\1" SS#S 9_S$\1" S%S&\1" S%S&S 9\1" S'S&S 9S(.S)9_S*\1" SSS 9_S+\1" S,S#S 9_S-\1" S.SS 9_S/\1" SS#S 9_S0\1" S1S#S 9_S2\1" S3SS 9_S4\1" SSS 9_S5\1" SS&S 9_S6\1" SSS 9_S7\1" S3SS 9_S8\1" SSS 9_S9\1" SSS 9_S:\1" S,S#S 9_\1" SSS 9\1" SS#S 9\1" SSS 9\1" S,S#S 9\1" S3SS 9\1" SSS 9\1" SSS 9\1" S,S#S 9\1" SSS 9\1" SSS 9\1" SSS 9\1" S;SS 9\1" S,S#S 9\1" SS#S 9\1" SS#S 9S<.Er2\2Rg                  \/5        S=r4S>r5S?r6S@r7\R`                  " SASB5      r8 " SC SD\Rr                  5      r9 " SE SF\95      r: " SG SH\95      r; " SI SJ\95      r< " SK SL\95      r= " SM SN\95      r> " SO SP\95      r?SQ r@\R                  SaSR j5       rBSS rCSbST jrDSU rEScSV jrFSW rGSX rHSY rISZ rJS[ rKS\ rLS] rMS^ rN\R                  R                  4S_ jrQS` rRg)dz'Common utilities for Composer commands.    )absolute_import)division)unicode_literalsN)util)api_adapter)storage_api)storage_util)base)parsers)config)
exceptions)execution_utils)log)
console_io)resource_printer)encoding)filesv1
KUBECONFIGz#^[a-z](?:[-0-9a-z]{0,62}[0-9a-z])?$gcloudkubectlz!Unable to find [gcloud] on path!
zAccessing a Cloud Composer environment requires the kubernetes commandline
client [kubectl]. To install, run
  $ gcloud components install kubectl
c                   4   ^  \ rS rSrSr  SU 4S jjrSrU =r$ )SupportedAirflowVersionL    c                 ,   > [         [        U ]  XX#5      $ N)superr   __new__)clsfrom_version
to_versionallowed_nested_subcommands	__class__s       /lib/googlecloudsdk/command_lib/composer/util.pyr   SupportedAirflowVersion.__new__R   s    (#6:C C    )N3.0.0N)__name__
__module____qualname____firstlineno__	__slots__r   __static_attributes____classcell__r$   s   @r%   r   r   L   s     )18)-C Cr'   r   z2from_version to_version allowed_nested_subcommandsbackfillz2.0.0)r!   r"   clearconnectionsz3.2.0dbz2.3.0r(   z2.6.3)checktrim)r!   r"   r#   	dag_statedagsz1.10.14
delete_dagz1.10.1kerberos
kubernetesz2.1.4list_dag_runsz1.10.2	list_dagszlist-import-errors
list_tasksnext_executionpausepoolpoolsz1.10.15)renderrolesrunz	sync-perm	sync_permtask_failed_deps
task_statetaskstesttrigger_dagunpauseupgrade_checkusers	variablesversiondefaultz--namespacez-nactiveGkePodStatuszname phase isReadyc                       \ rS rSrSrSrg)Error   z-Class for errors raised by Composer commands.r   Nr)   r*   r+   r,   __doc__r.   r   r'   r%   rU   rU      s    5r'   rU   c                       \ rS rSrSrSrg)KubectlError   z5Class for errors raised when shelling out to kubectl.r   NrW   r   r'   r%   rZ   rZ          =r'   rZ   c                       \ rS rSrSrSrg)GsutilError   z4Class for errors raised when shelling out to gsutil.r   NrW   r   r'   r%   r^   r^      s    <r'   r^   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )OperationError   zHClass for errors raised when a polled operation completes with an error.c                 J   > [         [        U ]  SR                  X5      5        g )NzOperation [{}] failed: {})r   ra   __init__format)selfoperation_namedescriptionr$   s      r%   rd   OperationError.__init__   s#    	.$()D)K)K*% &r'   r   )r)   r*   r+   r,   rX   rd   r.   r/   r0   s   @r%   ra   ra      s    P& &r'   ra   c                       \ rS rSrSrSrg)EnvironmentCreateError   z5Class for errors raised when creating an environment.r   NrW   r   r'   r%   rk   rk      r\   r'   rk   c                       \ rS rSrSrSrg)EnvironmentDeleteError   z5Class for errors raised when deleting an environment.r   NrW   r   r'   r%   rn   rn      r\   r'   rn   c                       \ rS rSrSrSrg)InvalidUserInputError   zGClass for errors raised when a user input fails client-side validation.r   NrW   r   r'   r%   rq   rq      s    Or'   rq   c                     [         R                  " 5       n[        R                  " USR	                  U 5      US9  UR                  5       $ )zConstructs text output listing the elements of items and a title.

Args:
  title: string, the listing title
  items: iterable, the iterable whose elements to list

Returns:
  string, text representing list title and elements.
zlist[title="{0}"])out)ioStringIOr   Printre   getvalue)titleitemsbufs      r%   ConstructListr|      s9     	# 3 : :5 AsK	r'   c              #     #    [         R                  " 5         [        R                  " 5        n[        R
                  R                  US5      n[        R                  " [        R                  [        5      n [        R                  " [        R                  [        U5        [        R                  " [        5      nUR                  X5      nUR!                  U5      nUR"                  n	U	=(       a    U	R$                  =(       a    U	R&                  (       + n
U
(       aG  [         R(                  R+                  5       (       d$  [-        SR/                  UR0                  5      5      e[         R(                  R3                  UUR0                  US9  Uv   [        R                  " [        R                  [        U5         SSS5        g! [        R                  " [        R                  [        U5        f = f! , (       d  f       g= f7f)aS  Context manager that manages a temporary kubeconfig file for a GKE cluster.

The kubeconfig file will be automatically created and destroyed and will
contain only the credentials for the specified GKE cluster. The 'KUBECONFIG'
value in `os.environ` will be temporarily updated with the temporary
kubeconfig's path. Consequently, subprocesses started with
googlecloudsdk.core.execution_utils.Exec while in this context manager will
see the temporary KUBECONFIG environment variable.

Args:
  location_id: string, the id of the location to which the cluster belongs
  cluster_id: string, the id of the cluster
  kubecontext_override: string, the kubecontext override

Raises:
  Error: If unable to get credentials for kubernetes cluster.

Returns:
  the path to the temporary kubeconfig file

Yields:
  Due to b/73533917, linter crashes without yields.

kubeconfigzGUnable to get cluster credentials. User must have edit permission on {})kubecontext_overrideN)gke_utilCheckKubectlInstalledr   TemporaryDirectoryospathjoinr   GetEncodedValueenvironKUBECONFIG_ENV_VAR_NAMESetEncodedValuegke_api_adapterNewAPIAdapterGKE_API_VERSIONParseCluster
GetCluster
masterAuthclientCertificate	clientKeyClusterConfigUseGCPAuthProviderrU   re   	projectIdPersist)location_id
cluster_idr   tempdirr~   old_kubeconfiggke_apicluster_refclusterauthmissing_credss              r%   TemporaryKubeconfigr      su    2   "!Wg|4J--bjj.EGN/rzz+BJO--o>g((Ak"";/gdMD$:$:Mt~~Nm	x55HHJJ ''-vk.C.C'DF 	F$$



3 % 
 rzz+B-/+ "!* rzz+B-/+ "!s6   +HA
G58DG*G5=	H,G22G55
H?Hc           	         U R                   R                  R                  (       aS  U R                   R                  R                  U R                   R                  R                  R                  S5      S-   S $ U R                   R                  U R                   R                  R                  S5      S-   S n[
        R                  " [        5      nUR                  [        R                  " 5       5      R                   Vs/ s HS  nUR                  U:X  d  M  UR                  UR                  R                  S5      S-   S =(       d    UR                  PMU     nnU(       d  [        S5      e[        U5      S:X  a  US   $ U[         R"                  " U Vs/ s H  nSR%                  U5      PM     snSSS9   $ s  snf s  snf )	aj  Finds the location ID of the GKE cluster running the provided environment.

Args:
  env_object: Environment, the environment, likely returned by an API call,
    whose cluster location to extract

Raises:
  Error: if Kubernetes cluster is not found.

Returns:
  str, the location ID (a short name like us-central1-b) of the GKE cluster
  running the environment
/   Nz$Kubernetes Engine cluster not found.r   z[{}]zLCluster found in more than one location. Please select the desired location:)rQ   message)r   
nodeConfiglocationrfind
gkeClusterr   r   r   ListClustersr   
GetProjectclustersnamezonerU   lenr   PromptChoicere   )
env_objectgke_clusterr   ccluster_zoneszs         r%   ExtractGkeClusterLocationIdr     s    !!**''001B1B1M1M2:(55:2J 2K L L !!,,Z->->-I-I.3eCj1.= .> ?+ ))/:'
 ##G$6$6$89BBB!	
;	 7ajj!!#&*+,66B  
 
 6
77
=Q	z..!./Av}}Q/ 
  0s   F=AF=G
c                   ^  [         R                  " 5       n/ SQn [        UUR                  [        R
                  R                  US9  UR                  5       R                  S5       Vs/ s H#  nU(       d  M  [        UR                  S5      6 PM%     nnUR                  S S9  U Vs/ s H/  nUR                  R                  5       S	:X  d  M#  UR                  PM1     nnU(       d  [        S
5      eT c  US   $  [        U 4S jU 5       5      $ ! [         a  n[        SU-  5      eSnAff = fs  snf s  snf ! [          a    [        S5      ef = f)aj  Returns the name of a running pod in a GKE cluster.

Retrieves pods in the GKE cluster pointed to by the current kubeconfig
context. To target a specific cluster, this command should be called within
the context of a TemporaryKubeconfig context manager.

If pod_substr is not None, the name of an arbitrary running pod
whose name contains pod_substr is returned; if no pod's name contains
pod_substr, an Error is raised. If pod_substr is None, an arbitrary running
pod is returned.

Pods with 'Ready: true' condition state are preferred. If there are no such
pods, any running pod will be returned.

Args:
  pod_substr: string, a filter to apply to pods. The returned pod name must
    contain pod_substr (if it is not None).
  kubectl_namespace: string or None, namespace to query for gke pods

Raises:
  Error: if GKE pods cannot be retrieved or desired pod is not found.
)getpods--outputzyjsonpath={range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\t"}{.status.conditions[?(.type=="Ready")].status}{"\n"})out_funcerr_func	namespacezError retrieving GKE pods: %sN
	c                 <    U R                   R                  5       S:g  $ )Ntrue)isReadylower)xs    r%   <lambda>GetGkePod.<locals>.<lambda>o  s    !))//"3v"=r'   )keyrunningzZNo running GKE pods found. If the environment was recently started, please wait and retry.r   c              3   8   >#    U  H  nTU;   d  M  Uv   M     g 7fr   r   ).0pod
pod_substrs     r%   	<genexpr>GetGkePod.<locals>.<genexpr>  s     A|zS/@|s   
	zZDesired GKE pod not found. If the environment was recently started, please wait and retry.)ru   rv   RunKubectlCommandwriter   errrZ   rU   rx   splitrS   sortphaser   r   nextStopIteration)r   kubectl_namespacepod_outargse
pod_statuscluster_podsrunning_podss   `       r%   	GetGkePodr   ?  so   . KKM'
$5#	%  ((*0066*	 ,lJ$$T*+6   => %$*						!Y	. joo$   

 ? @ @ ?@A|AAA9 
 5
/!3
445 
 @
 ? @ @@s;   .D +D3:D3+"D8D8>D= 
D0D++D0=Ec                 0    [         R                  U 5      SL$ )z>Returns True if the provided name is a valid environment name.N)ENVIRONMENT_NAME_PATTERNmatch)r   s    r%   IsValidEnvironmentNamer     s    	!	'	'	-T	99r'   c                 
  ^ [         R                  " [        [        R                  " 5       R
                  5      nUc  [         R                  " [        5      nUc  [        [        5      e[        U[        R                  " U/U Q76 5      n [        R                  " USUU4S jSS9nU(       a  [        S5      eg! [        R                  [        R                  4 a$  n[        [        R                   " U5      5      eSnAff = f)a  Shells out a command to kubectl.

This command should be called within the context of a TemporaryKubeconfig
context manager in order for kubectl to be configured to access the correct
cluster.

Args:
  args: list of strings, command line arguments to pass to the kubectl
    command. Should omit the kubectl command itself. For example, to execute
    'kubectl get pods', provide ['get', 'pods'].
  out_func: str->None, a function to call with the stdout of the kubectl
    command
  err_func: str->None, a function to call with the stderr of the kubectl
    command
  namespace: str or None, the kubectl namespace to apply to the command

Raises:
  Error: if kubectl could not be called
  KubectlError: if the invocation of kubectl was unsuccessful
NTc                    > [        TU 5      $ r   )HandleKubectlErrorStream)r   r   s    r%   r   #RunKubectlCommand.<locals>.<lambda>  s    5hDr'   )no_exitr   r   universal_newlinesz&kubectl returned non-zero status code.)r   FindExecutableOnPath_KUBECTL_COMPONENT_NAMEr   Pathssdk_bin_pathrU   MISSING_KUBECTL_MSGAddKubectlNamespacer   ArgsForExecutableToolExecPermissionErrorInvalidCommandErrorrZ   six	text_type)r   r   r   r   kubectl_path	exec_argsretvalr   s     `     r%   r   r     s    . ++,C,2LLN,G,GI,--.EFL
#
$$!66|KdKM)) !!D!F 
?
@@  
)
)

-
-
/ )
s}}Q'
(()s   B: :$DC==Dc                     U =(       d    [         R                  R                  nSU;   a  U" U5        U" S5        g U" U5        g )NzUnable to connect to the serverz>
Please, check if you have connectivity to GKE control plane.
)r   statusrw   )r   r   err_handler_funcs      r%   r   r     s=    1!1!1&#-SJL Sr'   c                 &    U R                  SS5      $ )zBConverts an image version string to a kubernetes namespace string..-)replace)image_versions    r%   $ConvertImageVersionToNamespacePrefixr     s    			sC	((r'   c                    [        U 5      n/ SQn[        R                  " 5       n[        X#R                  [
        R                  R                  5        [        UR                  5       R                  S5      5      nU Hq  nUR                  5       (       a  UR                  S5      OSnU(       d  M4  US   R                  5       [        :X  d  MQ  US   R                  U5      (       d  Ml  US   s  $    [        $ )a^  Checks environment for valid namespace options.

First checks for the existence of a kubectl namespace based on the env image
version. If namespace does not exist, then return the 'default' namespace.

Args:
  env_image_version: str, the environment image version string.

Returns:
  The namespace string to apply to any `environments run` commands.
)r   r   z--all-namespacesz%--sort-by=.metadata.creationTimestampr   zEjsonpath={range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\n"}z--ignore-not-found=truer   r   Nr   r   )r   ru   rv   r   r   r   r   reversedrx   r   stripr   NAMESPACE_STATUS_ACTIVE
startswithDEFAULT_NAMESPACE)env_image_versionimage_version_ns_prefixr   	ns_output
namespacesns_entryns_partss          r%   FetchKubectlNamespacer    s     A
$ kkm)D//377==9 	**,22489*h'/~~'7'7x~~d#THXa[&&(,CC677a[  
r'   c                     U c  U$ [         [        1R                  [        U5      5      (       a8  SnU(       a  [        US   ;   a  SnU [         4 H  nUR                  X#5        M     U$ )aZ  Adds namespace arguments to the provided list of kubectl args.

If a namespace arg is not already present, insert `--namespace <namespace>`
after the `kubectl` command and before all other arg elements.

Resulting in this general format:
  ['kubectl', '--namespace', 'namespace_foo', ... <remaining args> ... ]

Args:
  namespace: name of the namespace scope
  kubectl_args: list of kubectl command arguments. Expects that the first
    element will be the `kubectl` command, followed by all additional
    arguments.

Returns:
  list of kubectl args with the additional namespace args (if necessary).
r   r   )NAMESPACE_ARG_NAMENAMESPACE_ARG_ALIAS
isdisjointsetr   insert)r   kubectl_argsidxnew_args       r%   r   r     so    $  -.99#l:KLL
C/<?Bc 12#' 3 
r'   c                     U R                  S5      nU(       aF  [        R                  " 5       n[        R                  R                  U 5      nUR                  U5      nO[        R                  " U 5      n0 nU nU Hb  nUR                  5       nU(       a  UR                  S5      (       a  M2  [        U5      u  pX;   a  [        SR                  U5      5      eXU'   Md     UsSSS5        $ ! , (       d  f       g= f! [        R                  [        R                  [        R                  4 a1    [        R                  " [        SR                  U 5      5      5         gf = f)a  Parses the given requirements file into a requirements dictionary.

If the file path is GCS file path, use GCS file parser to parse requirements
file. Otherwise, use local file parser.

Args:
  requirements_file_path: Filepath to the requirements file.

Returns:
  {string: string}, dict mapping from PyPI package name to extras and version
  specifier, if provided.

Raises:
  Error: if requirements file cannot be read.
zgs://#z+Duplicate package in requirements file: {0}Nz$Unable to read requirements file {0})r  r   StorageClientr	   ObjectReferenceFromUrl
ReadObjectr   
FileReaderr  SplitRequirementSpecifierrU   re   core_exceptionsreraise)
requirements_file_pathis_gcs_file_pathstorage_client
object_reffile_contentrequirementsrequirements_filerequirement_specifierpackagerP   s
             r%   ParseRequirementsFiler(    s3    &-88A"002n//778NOj#..z:l%%&<=lL	*#4
 5 ; ; =$(=(H(H(M(M
45JK";BB7KM M 'W $5  
 ++{((,*<*<	= &4;;"$ 	%&&s2   A8C? :A*C.$	C? .
C<8C? <C? ?A!E#"E#c                 .   U R                  5       nSn[        R                  " X 5      nSnU(       aA  U SUR                  5        R                  5       nXR                  5       S R                  5       nU(       d  [	        SR                  U 5      5      eX4$ )a1  Splits the package name from the other components of a requirement spec.

Only supports PEP 508 `name_req` requirement specifiers. Does not support
requirement specifiers containing environment markers.

Args:
  requirement_specifier: str, a PEP 508 requirement specifier that does not
    contain an environment marker.

Returns:
  (string, string), a 2-tuple of the extracted package name and the tail of
  the requirement specifier which could contain extras and/or a version
  specifier.

Raises:
  Error: No package name was found in the requirement spec.
z(\[|\(|==|>=|!=|<=|<|>|~=|===) Nz5Missing package name in requirement specifier: \'{}\')r  researchstartrU   re   )r&  r'  tail_start_regex
tail_matchtails        r%   r  r  @  s    $ "'')'6yy)A*	$#$7Z%5%5%78>>@G !1!1!3!45;;=D	
HOO    	r'   c           	         [        S U=(       d    /  5       5      n[        R                  " S [        [        R
                  " U=(       d    0 5      5       5       5      nU (       a7  [        R
                  " U5       VVs/ s H  u  pgU" XgS9PM     nnnX5" U5      4$ / n	[        5       n
U H4  nU	R                  SR                  X65      5        U
R                  U5        M6     / n[        R
                  " U5       HA  u  pgUR                  U" XgS95        Xj;  d  M!  U	R                  SR                  X65      5        MC     U	R                  5         SR                  U	5      U" U5      4$ s  snnf )a  Builds the field mask and patch environment for an environment update.

Follows the environments update semantic which applies operations
in an effective order of clear -> remove -> set.

Leading and trailing whitespace is stripped from elements in remove_keys
and the keys of set_entries.

Args:
  clear: bool, If true, the patch removes existing keys.
  remove_keys: iterable(string), Iterable of keys to remove.
  set_entries: {string: string}, Dict containing entries to set.
  field_mask_prefix: string, The prefix defining the path to the base of the
    proto map to be patched.
  entry_cls: AdditionalProperty, The AdditionalProperty class for the type of
    entry being updated.
  env_builder: [AdditionalProperty] -> Environment, A function which produces
    a patch Environment with the given list of entry_cls properties.

Returns:
  (string, Environment), a 2-tuple of the field mask defined by the arguments
  and a patch environment produced by env_builder.
c              3   @   #    U  H  oR                  5       v   M     g 7fr   r  r   ks     r%   r   %BuildPartialUpdate.<locals>.<genexpr>x       9'8!GGII'8   c              3   J   #    U  H  u  pUR                  5       U4v   M     g 7fr   r3  r   r5  vs      r%   r   r6  {  !      (K!Iqwwy!n!I   !#r   valuez{}.{},)r  collectionsOrderedDictsortedr   	iteritemsappendre   addr   r   )r2   remove_keysset_entriesfield_mask_prefix	entry_clsenv_builderr   r?  entriesfield_mask_entries	seen_keyss              r%   BuildPartialUpdaterO  _  sK   2 9{'8b'899+ '' (K!'k6GR(H!I(K K+
 --44JC 	c'4   k'222e)cgnn->DEMM#  'MM+.jcNN923
/@ FG / 	$	%{7';	;;'s   ?E)c                    [         R                  " S U 5       5      nU (       a  [         R                  " 5       n[        S U=(       d    /  5       5      nU H  nXv;   d  M
  Xg	 M     [         R                  " S [        [        R
                  " U=(       d    0 5      5       5       5      nUR                  U5        U" [        R
                  " U5       VVs/ s H  u  pxU" XxS9PM     snn5      $ s  snnf )a  Builds the patch environment for an environment update.

To be used when BuildPartialUpdate cannot be used due to lack of support for
field masks containing map keys.

Follows the environments update semantic which applies operations
in an effective order of clear -> remove -> set.

Leading and trailing whitespace is stripped from elements in remove_keys
and the keys of set_entries.

Args:
  clear: bool, If true, the patch removes existing keys.
  remove_keys: iterable(string), Iterable of keys to remove.
  set_entries: {string: string}, Dict containing entries to set.
  initial_entries: [AdditionalProperty], list of AdditionalProperty class with
    key and value fields, representing starting dict to update from.
  entry_cls: AdditionalProperty, The AdditionalProperty class for the type of
    entry being updated.
  env_builder: [AdditionalProperty] -> Environment, A function which produces
    a patch Environment with the given list of entry_cls properties.

Returns:
  Environment, a patch environment produced by env_builder.
c              3   P   #    U  H  oR                   UR                  4v   M     g 7fr   r>  )r   entrys     r%   r   %BuildFullMapUpdate.<locals>.<genexpr>  s      )=,;5yy%++Os   $&c              3   @   #    U  H  oR                  5       v   M     g 7fr   r3  r4  s     r%   r   rS    r7  r8  c              3   J   #    U  H  u  pUR                  5       U4v   M     g 7fr   r3  r:  s      r%   r   rS    r<  r=  r>  )rA  rB  r  rC  r   rD  update)	r2   rG  rH  initial_entriesrJ  rK  entries_dictr   r?  s	            r%   BuildFullMapUpdaterY    s    8 (( )=,;)= =, **,L9{'8b'899+c


  '' (K!'k6GR(H!I(K K+k"	l33*# C%3 
  s   C0
c                     [         R                  " US9R                  R                  R                  nU R
                  U:H  $ )a1  Returns whether an environment currently is in the RUNNING state.

Args:
  environment: Environment, an object returned by an API call representing the
    environment to check.
  release_track: base.ReleaseTrack, the release track of command. Will dictate
    which Composer client library will be used.
)release_track)api_utilGetMessagesModuleEnvironmentStateValueValuesEnumRUNNINGstate)environmentr[  running_states      r%   IsInRunningStaterd    s<       %''2{3G3G  
		m	++r'   c                     U c  gU  H  n [         R                  " U5        M     g! [         a  n[        SR	                  U5      5      eSnAff = f)z|Validates given master authorized networks.

Args:
  networks: Iterable(string) or None. List of networks in CIDR notation.
Nz%Invalid master authorized network: {})	ipaddressIPv4Network	Exceptionrq   re   )networksnetworkr   s      r%    ValidateMasterAuthorizedNetworksrk    sW     
g=G$   =!
1
8
8
;= ==s   &
AA

Ar   )NN)NNN)SrX   
__future__r   r   r   rA  
contextlibru   rf  r   r+  googlecloudsdk.api_lib.composerr   r\   googlecloudsdk.api_lib.containerr   r   r   googlecloudsdk.api_lib.storager   r	   googlecloudsdk.callioper
   #googlecloudsdk.command_lib.composerr   googlecloudsdk.corer   r   r  r   r   googlecloudsdk.core.consoler   googlecloudsdk.core.resourcer   googlecloudsdk.core.utilr   r   r   r   r   compiler   _GCLOUD_COMPONENT_NAMEr   MISSING_GCLOUD_MSGr   SUBCOMMAND_DEPRECATION
namedtupler   SUBCOMMAND_ALLOWLISTrV  r  r  r  r  rS   rU   rZ   r^   ra   rk   rn   rq   r|   contextmanagerr   r   r   r   r   r   r   r  r   r(  r  rO  rY  ReleaseTrackGArd  rk  r   r'   r%   <module>r     s   . &  '   	  	 	 < K = 6 7 ( 7 & = / # 2 9 - * 
& ::&KL ! #    	Ck448: 	CKTgFK TgF	K
 TgFK 	  ,%,B ,%,B(
	K& TgF)K* Y7K-K. X'J1K2 TgF5K6 WI9K: X'J=K> TgFAKB TgFEKF TgFIKJ X'JMKN TgFQKR TgFUKV Y7KYK\ 	 TgFWITgFY7KX'JTgFTgFY7KTgFTgFTgFY7KY7KTgFTgFUK ^   2 3 "  " %%n6JK6O!! 6>5 >=% =&U &>U >>U >PE P  // //d(VC@L:
/Ad)
"J F*&Z>2<j/d 150A0A0D0D , =r'   