
    t              	          S r SSKJr  SSKJr  SSKJ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"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K0J1r1  SSK2J3r3  \Rh                  " S5      r5SSS S S S S S S!.r6S" r7S# r8S$ r9S% r:S& r;S' r<S( r=S) r>S* r?S+ r@S, rAS- rBS. rCS/ rDS0 rES1 rFS3S2 jrGg)4zHThis file provides the implementation of the `functions deploy` command.    )absolute_import)division)unicode_literalsN)encoding)utils)api_enablement)	cmek_util)secrets)env_vars)
exceptions)util)client)base)ArgumentTypeError)flags)secrets_config)service_account_util)	enum_util)labels_util)source_util)trigger_util)	arg_utils)map_util)log)
properties)
console_io)urllibz_projects\/(?P<projectnumber>[^\/]+)\/locations\/(?P<region>[^\/]+)\/builds\/(?P<buildid>[^\/]+)zBinary authorizationz
Direct VPC)binary_authorizationclear_binary_authorizationnetworksubnetclear_networknetwork_tagsclear_network_tagsdirect_vpc_egressc                 Z   / n[         R                  " U R                  5      n[        R                  " SU5      n[        R
                  " U40 UD6nX5:w  aU  [        R                  " 5       R                  R                  n[         R                  " Xe5      U l        UR                  S5        U$ )a  Determines if build environment variables have to be updated.

It compares the cli args with the existing build environment variables to
compute the resulting build environment variables.

Args:
  function: CloudFunction message to be checked and filled with build env vars
    based on the flags
  args: all cli args

Returns:
  updated_fields: update mask containing the list of fields that are
  considered for updating based on the cli args and existing variables
zbuild-env-varsbuildEnvironmentVariables)env_vars_api_utilGetEnvVarsAsDictr'   r   GetMapFlagsFromArgsApplyMapFlagsapi_utilGetApiMessagesModuleCloudFunctionBuildEnvironmentVariablesValueDictToEnvVarsPropertyappend)functionargsupdated_fieldsold_build_env_varsbuild_env_var_flagsnew_build_env_varsbuild_env_vars_type_classs          =lib/googlecloudsdk/command_lib/functions/v1/deploy/command.py _ApplyBuildEnvVarsArgsToFunctionr:   F   s      .(99(( !445EtL--/ -%%'55TT  	//%	
 &
 56	    c                 Z   / n[         R                  " U R                  5      n[        R                  " SU5      n[        R
                  " U40 UD6nX5:w  aU  [        R                  " 5       R                  R                  n[         R                  " Xe5      U l        UR                  S5        U$ )a  Determines if environment variables have to be updated.

It compares the cli args with the existing environment variables to compute
the resulting build environment variables.

Args:
  function: CloudFunction message to be checked and filled with env vars based
    on the flags
  args: all cli args

Returns:
  updated_fields: update mask containing the list of fields that are
  considered for updating based on the cli args and existing variables
zenv-varsenvironmentVariables)r(   r)   r=   r   r*   r+   r,   r-   r.   EnvironmentVariablesValuer0   r1   )r2   r3   r4   old_env_varsenv_var_flagsnew_env_varsenv_vars_type_classs          r9   _ApplyEnvVarsArgsToFunctionrC   k   s      ."33##, ..z4@-''FF,!%%'55OO  %6$K$K%H! 01	r;   c                     U(       d  SR                  U S9nSnSn[        R                  " X#-   R                  XS95        g)zLogs a warning message asking the user to grant access to secrets.

This will be removed once access checker is added.

Args:
  project: Project id.
  service_account_email: Runtime service account email.
z%{project}@appspot.gserviceaccount.com)projectzThis deployment uses secrets. Ensure that the runtime service account '{sa}' has access to the secrets. You can do that by granting the permission 'roles/secretmanager.secretAccessor' to the runtime service account on the project or secrets.
zE.g. gcloud projects add-iam-policy-binding {project} --member='serviceAccount:{sa}' --role='roles/secretmanager.secretAccessor')rE   saN)formatr   warning)rE   service_account_emailmessagecommands       r9   _LogSecretsPermissionMessagerL      sY     
CJJ K A 
J 

 ++   Kr;   c           	      \   [         R                  " U5      (       d  / $ [        R                  " U R                  U R
                  5      n0 n [         R                  " UU[        5       [        R                  " [        5       5      5      nU(       a  [        [        5       U R                   5        [         R"                  " U5      u  pV[         R"                  " U5      u  px/ n	XW:w  a@  [        R$                  " U[&        R(                  " 5       5      U l        U	R+                  S5        Xh:w  a@  [        R,                  " U[&        R(                  " 5       5      U l        U	R+                  S5        U	$ ! [         a5  n[        R                  " [        R                  " U5      5         SnAGNSnAff = f)an  Populates cloud function message with secrets payload if applicable.

It compares the CLI args with the existing secrets configuration to compute
the effective secrets configuration.

Args:
  function: Cloud function message to be checked and populated.
  args: All CLI arguments.

Returns:
  updated_fields: update mask containing the list of fields to be updated.
NsecretEnvironmentVariablessecretVolumes)r   IsArgsSpecifiedsecrets_utilGetSecretsAsDictrN   rO   
ApplyFlags_GetProjectproject_utilGetProjectNumberr   r   reraisefunction_exceptionsFunctionsErrorrL   serviceAccountEmailSplitSecretsDictSecretEnvVarsToMessagesr,   r-   r1   SecretVolumesToMessages)
r2   r3   old_secretsnew_secretserrorold_secret_env_varsold_secret_volumesnew_secret_env_varsnew_secret_volumesr4   s
             r9   _ApplySecretsArgsToFunctionre      sg    
	'	'	-	-I--))8+A+A+ +B ++%%km4	K  0L0LM,:,K,K-) -;,K,K-) ./*6*N*NX::<+H' 67-)AAH99;H /*	1 
 B*99%@AABs   =E, ,
F+6*F&&F+c                 l   / nUR                  S5      (       d  UR                  S5      (       a  UR                  nUR                  (       a  SOUR                  Ul        UR                  U:w  aC  UR                  (       a!  [        R
                  " UR                  U 5        UR                  S5        UR                  S5      (       d  UR                  S5      (       a  UR                  nUR                  S5      (       a  SO[        R                  " UR                  5      nXal        UR                  U:w  aC  UR                  (       a!  [        R                  " UR                  U 5        UR                  S5        UR                  (       a(  UR                  (       d  [        R                  " SS	5      eU$ )
a=  Configures CMEK related fields for the Cloud Function.

It sets or clears the kms_key_name and docker_repository fields based on the
CLI args.

Args:
  function_ref: Function resource.
  function: Cloud function message to be configured.
  args: All CLI arguments.

Returns:
  updated_fields: update mask containing the list of fields to be updated.

Raises:
  InvalidArgumentException: If the specified KMS key or Docker repository is
    not compatible with the function.
  RequiredArgumentException: If Docker repository is not specified when KMS
    key is configured.
kms_keyclear_kms_keyN
kmsKeyNamedocker_repositoryclear_docker_repositorydockerRepositoryz--docker-repositoryzTA Docker repository must be specified when a KMS key is configured for the function.)IsSpecifiedri   rh   rg   r	   ValidateKMSKeyForFunctionr1   rl   NormalizeDockerRepositoryFormatrj   #ValidateDockerRepositoryForFunctioncalliope_exceptionsRequiredArgumentException)function_refr2   r3   r4   old_kms_keyold_docker_repositorynew_docker_repositorys          r9   _ApplyCMEKArgsToFunctionrw      sk   ( .	i  D$4$4_$E$E%%K"&"4"4$$,,Hk)			++H,?,?NL)	)**d.>.>/ / %55 566 	66t7M7MN 
 !6  $99		"	"55%%|	
 ./!:!:

7
7!  
r;   c                    / nUR                  S5      (       a  U R                  nUR                  S5      (       d  UR                  S5      (       a  UR                  (       a  SOUR                  nUb'  UR                  S:X  a  [
        R                  " SS5      e[        R                  " UR                  5      U l	        UR                  S5        U$ )	a  Populates the `docker_registry` field of a Cloud Function message.

Args:
  function: Cloud function message to be checked and populated.
  args: All CLI arguments.

Returns:
  updated_fields: update mask containing the list of fields to be updated.

Raises:
  InvalidArgumentException: If Container Registry is specified for a CMEK
  deployment (CMEK is only supported by Artifact Registry).
docker_registryrg   rh   Ncontainer-registryz--docker-registryzCMEK deployments are not supported by Container Registry.Please either use Artifact Registry or do not specify a KMS key for the function (you may need to clear it).dockerRegistry)rm   ri   rh   rg   ry   rq   InvalidArgumentExceptionr   ParseDockerRegistryr{   r1   )r2   r3   r4   rg   s       r9   "_ApplyDockerRegistryArgsToFunctionr~     s     .	'((!!G	""d&6&6&G&G**gt337KK88
=  (;;H *+	r;   c                 |    / nU(       a2  SU;  a,  [         R                  " S5      U l        UR                  S5        U$ )aI  Sets the default for `docker_registry` field of a Cloud Function message.

Args:
  function: Cloud function message to be checked and populated.
  all_updated_fields: List of all fields that are being updated within the
    deployment request.

Returns:
  updated_fields: update mask containing the list of fields to be updated.
r{   zartifact-registry)r   r}   r{   r1   )r2   all_updated_fieldsr4   s      r9   #_DefaultDockerRegistryIfUnspecifiedr   :  s>     .,4FF';;<OPH*+	r;   c                 |    U R                  S5      (       a  U R                  S:X  a  g[        R                  " SSS9  g)zChecks if the deployment needs Artifact Registry and prompts to enable it.

Args:
  cli_args: CLI arguments passed to the deployment request.
ry   rz   Nzartifactregistry.googleapis.comT)enable_by_default)rm   ry   r   PromptToEnableApiIfDisabled)cli_argss    r9   )_PromptToEnableArtifactRegistryIfRequiredr   N  s;     ,--

"
"&:
:
,,'4r;   c                     U R                   nUR                  S5      (       d  UR                  S5      (       a  UR                  (       a  SOUR                  nU$ )a  Retrieves the KMS key for the function.

This is either the KMS key provided via the kms-key flag or the KMS key
configured for the existing function if any.

Args:
  function: existing cloud function if any.
  args: CLI arguments.

Returns:
  kms_key: KMS key if any.
rg   rh   N)ri   rm   rh   rg   )r2   r3   rg   s      r9   _GetActiveKMSKeyr   _  sH     '	i  D$4$4_$E$E((ddllG	.r;   c                     U[         R                  R                  La  / $ / nUR                  S5      (       a"  UR                  U l        UR                  S5        U$ )a  Populates the `buildpack_stack` field of a Cloud Function message.

Args:
  function: Cloud function message to be populated.
  args: All CLI arguments.
  track: release track.

Returns:
  updated_fields: update mask containing the list of fields to be updated.
buildpack_stack)r   ReleaseTrackALPHArm   r   buildpackStackr1   )r2   r3   trackr4   s       r9   "_ApplyBuildpackStackArgsToFunctionr   r  sW     $##)))I.	'(("22H+,	r;   c                     / nUR                  S5      (       d  UR                  S5      (       a"  UR                  U l        UR                  S5        U$ )zPopulates the `build_service_account` field of a Cloud Function message.

Args:
  function: Cloud function message to be populated.
  args: All CLI arguments.

Returns:
  updated_fields: update mask containing the list of fields to be updated.
build_service_accountclear_build_service_account)rm   r   buildServiceAccountr1   )r2   r3   r4   s      r9   #_ApplyBuildServiceAccountToFunctionr     sU     .	-..$2B2B#3 3 $(#=#=H 12	r;   c                 B    SnXR                  5       U R                  4-  $ )Nzlgcloud functions add-iam-policy-binding %s --region=%s --member=allUsers --role=roles/cloudfunctions.invoker)NamelocationsId)rs   templates     r9   _CreateBindPolicyCommandr     s+    >  
&&(,*B*BC	CCr;   c                 d    SU < SU< S3nSU< S[         R                  R                  USS9< 3$ )Nz-resource.type=build
resource.labels.build_id=z
logName=projects/z/logs/cloudbuildz5https://console.cloud.google.com/logs/viewer?project=z&advancedFilter= )safe)r   parsequote)build_id
project_idquery_params      r9   !_CreateStackdriverURLforBuildLogsr     s9     08E  
V\\''"'=?r;   c                  f    [         R                  R                  R                  R	                  5       $ N)r   VALUEScorerE   	GetOrFail r;   r9   rT   rT     s#    						'	'	1	1	33r;   c                 v    [         R                  U 5      R                  5       nSUS   < SUS   < SUS   < 3$ )Nz;https://console.cloud.google.com/cloud-build/builds;region=region/buildidz	?project=projectnumber)_BUILD_NAME_REGEXmatch	groupdict)
build_namematched_groupss     r9   _CreateCloudBuildLogURLr     s?    $**:6@@B.
 
"

#

)r;   c                     [         R                  5        HT  u  pU R                  U5      (       d  M  [        R                  " SUR                  SS5      -   SR                  U5      5      e   g)z0Validate flags that are only supported in GCFv2.z--_-z0{} is not supported for 1st gen Cloud Functions.N)_GEN2_ONLY_FLAGSitemsIsKnownAndSpecifiedrq   r|   replacerG   )r3   flagfeatures      r9   _ValidateGen2OnlyFlagr     s\    '--/md%%88
c3'
'
<
C
CG
L  0r;   c           
        ^^^^^^^ [         R                  " U 5        [        U 5        [        R                  " SU R
                  5        [        R                  " SU R                  5        [        R                  " U R                  U R                  U R                  S5      U R                  S5      5        [        R                  " U R                  U R                  U R                  U R                  U R                  5      nU R                   R"                  R%                  5       mTR'                  5       n[(        R*                  " U5      m[(        R,                  " U5      mTSL nU(       d  [/        TR0                  5      OSnU(       d  [/        TR2                  5      OSnU(       a.  [        R4                  " U 5        TR7                  5       mUTl        O+U(       a$  [        R8                  " TR:                  US   5        / nU R<                  (       a"  U R<                  Tl        URA                  S5        U RB                  (       a1  S	RE                  U RB                  5      Tl!        URA                  S
5        U RF                  (       a[  [         RH                  " U RF                  5      U l#        [J        RL                  " U RF                  5      Tl'        URA                  S5        U RP                  (       a"  U RP                  Tl)        URA                  S5        U R                  S5      (       d  U R                  S5      (       a7  U RT                  (       a  SOU RV                  nUTl,        URA                  S5        U R                  S5      (       d  U R                  S5      (       a7  U RZ                  (       a  SOU R\                  n	U	Tl/        URA                  S5        U R                  S5      (       a#  U R`                  Tl0        URA                  S5        OU(       a  [b        Rd                  " SS5      eU R                  S5      (       ak  U Rf                  S:X  a  TRi                  5       Tl5        STl6        U Rf                  S:X  a  TRo                  5       Tl6        STl5        URq                  SS/5        [(        Rr                  " [t        Rv                  " [x        Rz                  R|                  5      TR`                  TR~                  5      n
U
(       a  [        R                  " U
5        U R                   R                  R%                  5       nU R                  (       a0  STl        STlD        URA                  S5        URA                  S5        U(       a&  UR'                  5       Tl        URA                  S5        U R                  S5      (       a  U=(       a    U R                  (       + =(       d    UnU(       d  [b        Rd                  " SS 5      e[        R                  " STR                  [         R                  S!9R                  U R                  5      nUTlD        URA                  S5        U R                  S"5      (       a_  [        R                  " S"TR                  [         R                  S!9R                  U R                  5      nUTlN        URA                  S#5        U R                  (       d  U R                  (       a5  U R                  (       a  SOU R                  TlQ        URA                  S$5        U R                  (       a/  TR                  5       Tl        STl        URq                  S%S&/5        U(       a5  [        R                  " S60 UD6Tl        STl        URq                  S%S&/5        U R                  S5      (       a}  URA                  S'5        U R                  (       aI  TR                  5       TR:                  lV        TR                  5       TR:                  R                  lT        O4STR:                  lV        O"TR:                  (       a  STR:                  lV        U=(       d    U R                  nU R                  S(5      (       d  U(       a  U(       a  U(       d  [b        Rd                  " S)S*5      e[        R                  " S(TR2                  R                  [         R                  S!9R                  U R                  5      nUTR2                  l[        URA                  S+5        [        TU 5      nU R                  (       d)  U R                  (       d  U(       d  TR                  (       aH  URq                  [        R                  " TTU R                  U R                  U R                  U5      5        [        R                  " TU R                  U R
                  U R                  5      (       a  URA                  S,5        URq                  [        TU 5      5        URq                  [        TU 5      5        [         R                  " U 5      m[         R                  " U 5      mURq                  [        TU 5      5        URq                  [        TTU 5      5        URq                  [        TU 5      5        URq                  [        TX5      5        URq                  [        TU 5      5        URq                  [        TU5      5        [        R                  " S-5        [        U 5        U(       Gaa  TR2                  (       a_  T(       dX  T(       dQ  [(        R                  " [        5       5      (       a.  [        R                  " S.RE                  U R                  5      SS/9m[        R                  " [        5       TR~                  TR                  5        [(        R                  " TTR                  5       R'                  5       5      n[(        R                  " T5      (       a)  [(        R                  " TR~                  [        5       5        TR2                  (       a4  T(       d-  T(       d&  S0n[        R                  " U[        T5      -  5        S1mOU(       a  [        R                  " [        5       TR~                  TR                  5        [(        R                  " TU5      n[(        R                  " T5      (       a)  [(        R                  " TR~                  [        5       5        O2SnT(       d)  T(       d"  [        GR                   GR                  S25        gS/mUUUUU4S3 jnS1/mUU4S4 jnU(       a-  SnTR2                  (       a  Un[(        GR                  " UUU/S59  [(        R,                  " TR"                  5      $ )7z.Run a function deployment with the given args.z--remove-labelsz--update-labelsretrytrigger_httpNFtrigger_event
entryPointz{}stimeoutavailableMemoryMbrZ   max_instancesclear_max_instancesr   maxInstancesmin_instancesclear_min_instancesminInstancesruntimez/Flag `--runtime` is required for new functions.runtime_update_policy	automaticz	on-deployautomaticUpdatePolicyonDeployUpdatePolicyr   vpcConnectorvpcConnectorEgressSettingsegress_settingszvpc-connectorzAFlag `--vpc-connector` is required for setting `egress-settings`.)arg_namemessage_enumcustom_mappingsingress_settingsingressSettingsbuildWorkerPooleventTriggerhttpsTriggerzeventTrigger.failurePolicysecurity_levelztrigger-httpz?Flag `--trigger-http` is required for setting `security-level`.zhttpsTrigger.securityLevellabelszcloudbuild.googleapis.comz7Allow unauthenticated invocations of new function [{}]?)prompt_stringdefaultz\Function created with limited-access IAM policy. To enable unauthorized access consider `%s`TzNothing to update.c                  P  > TS   (       a  g T(       a&  [         R                  " TR                  5        STS'   gT (       a$  [         R                  " TR                  5      TS'   gg! [        R
                   a*    STS'   [        R                  " S[        T5      -  5         gf = f)zTry to make the invoker permission be what we said it should.

This is for executing in the polling loop, and will stop trying as soon as
it succeeds at making a change.
r   NTz#Setting IAM policy failed, try `%s`)	r,   AddFunctionIamPolicyBindingname%RemoveFunctionIamPolicyBindingIfFoundrq   HttpExceptionr   rH   r   )deny_all_users_invokeensure_all_users_invoker2   rs   stop_trying_perm_sets   r9   TryToSetInvokerPermission&Run.<locals>.TryToSetInvokerPermission  s     A	 ,,X]];"&Q ::8==I 	Q ! ,,  $1	kk
/$\23s   ,A' *A' ';B%$B%c                 P  > TS   (       Ga  U R                   (       Ga  [        R                  " TR                  [        R                  " U R                   5      5      nUR
                  (       a_  [        R                  UR
                  5      (       a;  [        R                  R                  S[        UR
                  5      -  5        STS'   gUR                  (       aF  Sn[        R                  R                  U[        UR                  [        5       5      -  5        STS'   gggg)zLogs stackdriver URL.

This is for executing in the polling loop, and will stop trying as soon as
it succeeds at making a change.

Args:
  op: the operation
r   z 
For Cloud Build Logs, visit: %sFz,
For Cloud Build Stackdriver Logs, visit: %sN)metadatar   PyValueToMessageOperationMetadataV1MessageToPyValue	buildNamer   r   r   statusPrintr   buildIdr   rT   )opr   sd_info_templatelog_stackdriver_urlmessagess      r9   TryToLogStackdriverURL#Run.<locals>.TryToLogStackdriverURL  s     1"+++**

&
&(A(A"++(Nh 
		 1 7 78J8J K K

/%h&8&89:	
 "'AJ

/0@0@+-PQ	
 "'A  #.r;   )try_set_invokeron_every_pollr   )r   ValidateV1TimeoutFlagr   r   CheckNoDeploymentLabelsremove_labelsupdate_labelsr   ValidateTriggerArgsr   trigger_resourcerm   GetTriggerEventParamsr   trigger_buckettrigger_topicCONCEPTSr   ParseRelativeNamer,   r-   GetFunctionboolr   r   CheckTriggerSpecifiedr.   CheckLegacyTriggerUpdater   entry_pointr   r1   r   rG   memoryParseMemoryStrToNumBytesr   	BytesToMbr   service_accountrZ   r   r   r   r   r   r   r   rq   rr   r   AutomaticUpdatePolicyr   r   OnDeployUpdatePolicyextendValidateRuntimeOrRaise	v2_clientFunctionsClientr   r   GAr   r   rH   vpc_connectorclear_vpc_connectorr   r   ChoiceEnumMapper)VpcConnectorEgressSettingsValueValuesEnumEGRESS_SETTINGS_MAPPINGGetEnumForChoicer   IngressSettingsValueValuesEnumINGRESS_SETTINGS_MAPPINGr   r   build_worker_poolclear_build_worker_poolr   HttpsTriggerCreateEventTriggerr   FailurePolicyfailurePolicyRetrySecurityLevelValueValuesEnumSECURITY_LEVEL_MAPPINGr   securityLevelr   sourcestage_bucketsourceUploadUrlr   SetFunctionSourcePropsignore_fileSetFunctionLabelsclear_labelsr:   rC   ShouldEnsureAllUsersInvokeShouldDenyAllUsersInvokere   rw   r~   r   r   r   r   r   r   CanAddFunctionIamPolicyBindingrT   r   PromptContinueNAMEr   2ValidateDefaultBuildServiceAccountAndPromptWarningr   CreateFunctionParentIsGcrRepository#ValidateSecureImageRepositoryOrWarnr   PatchFunctionr   r   WaitForFunctionUpdateOperation)r3   r   trigger_paramsfunction_urlis_new_functionhad_vpc_connectorhad_http_triggerr4   r   r   rH   vpc_connector_refwill_have_vpc_connectoregress_settings_enumingress_settings_enumwill_have_http_triggersecurity_level_enumrg   r   r   r   r   r   r   r   r2   rs   r   r   r   s                          @@@@@@@r9   RunrF    s
   d# %%&79K9KL%%&79K9KL ""


w
~&	  55




. ##))+,**,,**51( !!,/($/)8d8  !e  *9d8  !e  &&t,%%'H HM ))~o>
 . 
**H,'	\\||DLL1H)$	[[00=DK!&!=H-.	#'#7#7H /0	o&&$*:*:+ + 11At7I7IM)H.)	o&&$*:*:+ + 11At7I7IM)H.)	i  ||H)$

7
7D  
-..!![0'/'E'E'Gh$&*h#!![0&.&C&C&Eh#'+h$24JKL++ 1 1 4 45'
 KKmm11779	H*.H'.)67-::<H.)	'((:$":"::	  #99

M  %55"GG55 t++,	 
 +?H'67	())%66#<<66 t,,-	 
  5H+,	t;;**0F0F  +,	$113H H>>:;(;;MnMH H>>:;	g67zz,4,B,B,Dh)2:..2Bh))/,0h)*.H'+@t/@/@	&''!99

K  $44!**GG44 t**+	 
 +>H'67Xt,' kk						!	!**KK	
	 """"D$6$68I8I  (# 84HI 3HdCD!<<TB88> 3HdCD 0xNO :8TJK (4? ;HdKL )(NC ,,-HI+D1'%33KMBB * 9 9GNN)) ! KK|//1M1M 
	 	 <+>+>+@+M+M+O	PB))22

"
"KM 	'%8  
kk(5lCCD"KK|//1M1M 
		.	9B))22

"
"KM 
B"+@	jj+, . '6 O1o++
'-.
 
		hmm	,,r;   r   )H__doc__
__future__r   r   r   reapitools.base.pyr   googlecloudsdk.api_lib.computer    googlecloudsdk.api_lib.functionsr   r	   r
   rQ   #googlecloudsdk.api_lib.functions.v1r   r(   r   rX   r   r,   #googlecloudsdk.api_lib.functions.v2r   r  googlecloudsdk.callioper   rq   #googlecloudsdk.calliope.arg_parsersr   $googlecloudsdk.command_lib.functionsr   r   r   .googlecloudsdk.command_lib.functions.v1.deployr   r   r   r   #googlecloudsdk.command_lib.projectsrU   $googlecloudsdk.command_lib.util.apisr   $googlecloudsdk.command_lib.util.argsr   googlecloudsdk.corer   r   googlecloudsdk.core.consoler   	six.movesr   compiler   r   r:   rC   rL   re   rw   r~   r   r   r   r   r   r   r   rT   r   r   rF  r   r;   r9   <module>rZ     s    O &  ' 	 % 0 ; 6 D M Q @ C ( E A 6 ? E D F F G D : 9 * # * 2  JJ9  3"8! &%
 "JB:3l4n!H("&,(D	4
u-r;   