
                  	          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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%r%Sr&Sr'Sr(Sr) S=S jr*S=S  jr+ S>S! jr,S" r-S# r.S$ r/S?S% jr0S& r1  S@S' jr2 " S( S)\Rf                  5      r4S*\5S+\54S, jr6      SAS- jr7S. r8      SBS/ jr9S0 r:S1 r;S2 r<S3 r=S4 r>S5 r?S6 r@    SCS7\5S8\5S9\5S*\54S: jjrA      SBS; jrB        SDS< jrCg)EzUtils for the rsync command.    )absolute_import)division)unicode_literalsN)	cloud_api)errors)fast_crc32c_util)	hash_util)	path_util)plurality_checkable_iterator)
posix_util)progress_callbacks)storage_url)tracker_file_util)wildcard_iterator)resource_reference)resource_util)patch_file_posix_task)copy_task_factory)	copy_util)patch_object_task)delete_task)log)
properties)files,
   z&Did not find existing container at: {}managed_foldersc                    [         R                  " U [        R                  R                  SUS9n[
        R                  " U5      nUR                  5       (       aq  [         R                  " U 5      (       a,  [        R                  " S[        R                  U 5      -   5      e[        R                  " [        R                   " U 5      5      $ UR#                  5       (       a/  [        R                  " SR                  U [%        U5      5      5      e[%        U5      S   nUR'                  5       (       a  U$ [        R                  " SR                  X5      5      e)z>Returns existing valid container or UnknownResource or raises.T)fields_scopeget_bucket_metadataignore_symlinksz"Wildcard pattern matched nothing. z {} matched more than one URL: {}r   z {} matched non-container URL: {})r   get_wildcard_iteratorr   FieldsScopeSHORTr   PluralityCheckableIteratoris_emptycontains_wildcardr   InvalidUrlError_NO_MATCHES_MESSAGEformatr   UnknownResourcer   storage_url_from_string	is_plurallistis_container)pathr!   resource_iterator%plurality_checkable_resource_iteratorresources        <lib/googlecloudsdk/command_lib/storage/rsync_command_util.py0get_existing_or_placeholder_destination_resourcer5   :   s5    (==
((..%	 #==>OP ( +3355**400""
.&&t,-  --++D1  +4466

 
 *11$<=	
  78;(O(//?	     c                     [        X5      n[        U[        R                  5      (       a)  [        R
                  " [        R                  U 5      5      eU$ )z>Gets existing container resource at path and errors otherwise.)r5   
isinstancer   r+   r   r(   r)   r*   )r0   r!   r3   s      r4   get_existing_container_resourcer9   a   sG    =
( ,<<==

 
 !4!;!;D!A
BB	/r6   c                    [         R                  " U 5      nU(       a  [        OSn[         R                  " XC-   5      nUc  SR	                  U5      nOSR	                  XQ5      n[         R
                  " U5        [        R                  R                  [        R                  R                  R                  R                  5       U5      $ )a  Hashes and returns a list file path.

Args:
  list_file_name (str): The list file name prior to it being hashed.
  chunk_number (int|None): The number of the chunk fetched if file represents
    chunk of total list.
  is_managed_folder_list (bool): If True, the file will contain managed folder
    resources instead of object resources, and should have a different name.

Returns:
  str: Final (hashed) list file path.

Raises:
  Error: Hashed file path is too long.
 zFULL_{}zCHUNK_{}_{})r   get_delimiterless_file_path_MANAGED_FOLDER_PREFIXget_hashed_file_namer*   raise_exceeds_max_length_errorosr0   joinr   VALUESstoragersync_files_directoryGet)list_file_namechunk_numberis_managed_folder_listdelimiterless_file_namemanaged_folder_prefixhashed_file_namehashed_file_name_with_types          r4   get_hashed_list_file_pathrM   k   s    $ .II !7B  ';;5 !*!1!12B!C!.!5!5" 223MN	5599; 
 r6   c                      [         R                  " U 5        g! [         a/  n[        R                  " SR                  X5      5         SnAgSnAff = f)z@Tries to delete file and debug logs instead of failing on error.zFailed to delete file {}: {}N)r@   remove	Exceptionr   debugr*   )r0   es     r4   try_to_delete_filerS      s=    >IIdO	 >II,33D<==>s    
A%AAc                    U R                   R                  n[        U [        R                  5      (       a  U$ [        U [        R
                  5      (       a  SnSnSnSnSnSnSnSn	Sn
SnOU R                  nU R                  nU R                  n[        R                  " U 5      u  p\pxnUb  UnO [        R                  " U R                  5      nU(       a  UR                  OSn	U R                  [        R                   :X  a  Sn
OU R                  n
U R"                  nUUUUUUUUU	U
U/n[$        R'                  U Vs/ s H  oc  SO[(        R*                  " U5      PM     sn5      $ s  snf )a  Builds a line for files listing the contents of the source and destination.

Args:
  resource (FileObjectResource|ObjectResource|ManagedFolderResource): Contains
    item URL and metadata, which can be generated from the local file in the
    case of FileObjectResource.

Returns:
  String formatted as "URL,etag,size,atime,mtime,uid,gid,mode,crc32c,md5".
    A missing field is represented as an empty string.
    "mtime" means "modification time", a Unix timestamp in UTC.
    "mode" is in base-eight (octal) form, e.g. "440".
Nr;   )r   
url_stringr8   r   ManagedFolderResourceFileObjectResourceetagsizestorage_classr   (get_posix_attributes_from_cloud_resourcer   get_unix_timestamp_in_utccreation_timebase_eight_strcrc32c_hashNOT_SUPPORTED_DO_NOT_DISPLAYmd5_hashCSV_FIELD_SEPARATORrA   six	text_type)r3   urlrX   rY   rZ   atimemtimeuidgidmode_base_eightcrc32cmd5custom_metadata_mtimemodeline_valuesxs                   r4   get_csv_line_from_resourcerq      st    	''#,BBCC J,??@@DDMEE
C
COF
C==D==D**M;;HE 1E#D (#e
 55h6L6LMe-1d))tO1NNNf##f


C 


			+ 
	!	!6ABkYrCMM!,,kB
 Bs   >$E)c                 R    U R                  5       R                  [        [        5      $ )z.Splits and returns the fields from a CSV line.)rstriprsplitrb   _CSV_COLUMNS_COUNT)lines    r4   get_fields_from_csv_linerw      s     
		13E	FFr6   c                 X   U (       d  g[        U 5      nUS   n[        R                  " U5      n[        U[        R                  5      (       a  [
        R                  " U5      $ U(       a  [
        R                  " U5      $ U R                  5       R                  [        [        5      u  nnnnn	n
nnnnn[
        R                  " UU(       a  UOSU(       a  [        U5      OSU(       a  UOSU(       a  UOSU(       a  UOS0 S9n[        R                  " UR                   [        R"                  " U	(       a  [        U	5      OSU
(       a  [        U
5      OSU(       a  [        U5      OSU(       a  [        U5      OSU(       a  [        R$                  R'                  U5      OSS95        U$ )a  Parses a line from files listing of rsync source and destination.

Args:
  line (str|None): CSV line. See `get_csv_line_from_resource` docstring.
  is_managed_folder (bool): If True, returns a managed folder resource for
    cloud URLs. Otherwise, returns an object URL.

Returns:
  FileObjectResource|ManagedFolderResource|ObjectResource|None: Resource
    containing data needed for rsync if data line given.
Nr   )rX   rY   rZ   r_   ra   custom_fields)rf   rg   rh   ri   rn   )rw   r   r,   r8   FileUrlr   rW   rV   rs   rt   rb   ru   ObjectResourceintr   1update_custom_metadata_dict_with_posix_attributesry   PosixAttributes	PosixModefrom_base_eight_str)rv   is_managed_folderline_informationrU   
url_object_etag_stringsize_stringstorage_class_stringatime_stringmtime_string
uid_string
gid_stringmode_base_eight_stringcrc32c_string
md5_stringcloud_objects                    r4   parse_csv_line_to_resourcer      sb    
-d3"*22:>*
K//0000<<33J?? kkm.0BC $22%;4*3{,@(d#0-d'zT, >>    %1L!t%1L!t!+c*o!+c*o# ##778NO 
r6   c           
      V   U R                   UR                   :w  a  g[        R                  R                  R                  R                  5       nU[        R                  R                  R                  :X  a  gX4 H  n[        U[        R                  5      (       d  M$  UR                  UR                  s=L a  b  MC  O  MG  [        R                  " SR!                  UR"                  R$                  5      5          g   [        U [        R                  5      (       a  [        U[        R                  5      (       a  U R                  nUR                  nU R                  nUR                  n[        R&                  " SR!                  U R"                  R$                  UUUR"                  R$                  UU5      5        Ub  Ub  XE:H  $ Ub  Ub  Xg:H  $ g[        U [        R(                  5      nU(       a  Un	U n
OU n	Un
U	R                  bf  U	R                  cY  [*        R,                  " US9  [*        R.                  " SS9(       d)  U[        R                  R0                  R                  :X  a  gSnO$U	R                  b  [*        R.                  " SS9nOSnU(       a'  [2        R4                  R6                  nU	R                  nO&[2        R4                  R8                  nU	R                  n[2        R:                  " [2        R<                  " U
R"                  R>                  U5      5      nX:H  $ )z;Does minimal computation to compare checksums of resources.FTzbFound no hashes to validate on {}. Will not copy unless file modification time or size difference.zComparing hashes for two cloud objects. CRC32C checked first. If no comparable hash pairs, will not copy.
{}:
  CRC32C: {}
  MD5: {}
{}:
  CRC32C: {}
  MD5: {}
)warn_for_always)install_if_missing) rY   r   rB   rC   check_hashesrE   CheckHashesNEVERvaluer8   r   r{   r_   ra   r   warningr*   r   versionless_url_stringrQ   rW   r   log_or_raise_crc32c_issuescheck_if_will_use_fast_crc32cIF_FAST_ELSE_SKIPr	   HashAlgorithmCRC32CMD5get_base64_hash_digest_stringget_hash_from_fileresource_name)source_resourcedestination_resourcer   r3   source_crc32cdestination_crc32c
source_md5destination_md5	is_uploadcloud_resourcelocal_resourcecompare_crc32chash_algorithm
cloud_hash
local_hashs                  r4    _compute_hashes_and_return_matchr   ,  s   1666 ""**77;;=,Z++11777"9h(.==>> 1 199	kk3396""994  : )88 ');)J)JKK#//M-99 ))J*33OII	 f''>> ,,CC
"  %7%C00/"=** *<*O*OP))N$N$N)N+0G0G0O //	J::#
 J22DDJJJN!!- &CC N N,,33N++J,,00N((J66""

$
$
2
2N*
 
	!!r6   c                     U=(       d    UnU(       d/  Ub,  Ub)  X#:H  =(       a    U R                   UR                   :H  (       + $ [        X5      (       + $ )zHCompares metadata and returns if source should be copied to destination.)rY   r   )r   r   source_mtimedestination_mtimecompare_only_hashesis_cloud_source_and_destinationskip_mtime_comparisons          r4   (_compare_metadata_and_return_copy_neededr     sb     .P1P


"

' 	) 	>  $8$=$==  . 
 r6   c                   $    \ rS rSrSrSrSrSrSrg)_IterateResourcei  z)Indicates what resources to compare next.sourcedestinationboth N)	__name__
__module____qualname____firstlineno____doc__SOURCEDESTINATIONBOTH__static_attributes__r   r6   r4   r   r     s    1&+	$r6   r   skip_unsupportedreturnc                     U(       ad  [         R                  " U 5      nU(       aG  [        R                  R	                  [         R
                  R                  XR                  5      5        gg)a  Checks if object type is unsupported and logs warning if so.

Args:
  resource: The resource to check.
  skip_unsupported: Whether to skip unsupported object types.

Returns:
  True if the object type is unsupported and needs to be skipped
  False otherwise.
TF)r   get_unsupported_object_typer   statusPrint!UNSUPPORTED_OBJECT_WARNING_FORMATr*   r   )r3   r   unsupported_types      r4   $_should_skip_unsupported_object_typer     sR     $@@J	jj

9
9
@
@..
 	r6   c           
         [        X5      (       a  gU(       a  UnO[        XU5      nU(       a  [        U[        R                  5      (       a5   [
        R                  " UR                  R                  5          SSS5        [        R                  R                  SR                  X5      5        g[        U[        R                  5      (       a  [        UR                  [        R                  5      (       ab  U R                   (       a6  U R                   R"                  (       a  [$        R&                  R(                  n	O[$        R&                  R*                  n	OSn	[,        R.                  " UUSU	UU SS9$ ! , (       d  f       GN= f!   [        R                  " SR                  UR                  R                  5      5        e = f)z5Generates copy tasks with generic settings and logic.NzCould not open {}zWould copy {} to {}T)do_not_decompressfetch_source_fields_scopeposix_to_setuser_request_argsverbose)r   _get_copy_destination_resourcer8   r   rW   r   BinaryFileReaderr   r   r   errorr*   r   r   CloudResourceCloudUrlresource_argspreserve_aclr   r#   FULLNO_ACLr   get_copy_task)
r   r   r   source_containerr   destination_containerdry_runr   copy_destinationr   s
             r4   _get_copy_taskr     sm    */LL
+ 6+@ /#5#H#HII	##O$?$?$M$MN
 O JJ$$_G  "4"B"BCC
%11;3G3G
H
H 	''++88**//l**11lL		(	( ,)
 ; ON		&&++99	

 	s*   *F
 9E8;F
 8
FF
 F
 
<Gc                 b    [         R                  nU (       a  U(       a  [         R                  nU$ )zEReturns the iterator instruction for no clobber and new mtimes flags.)r   r   r   )$delete_unmatched_destination_objects%use_gsutil_delete_unmatched_behaviouriteration_instructions      r4   7_get_iterator_instruction_for_no_clobber_and_new_mtimesr     s(     +11*
/,11	r6   c
           
         [         R                  " U5      n
U(       aD  UR                  b7  U
R                  b*  UR                  U
R                  :  a  [        UU	5      nSU4$ [	        U[
        R                  5      =(       a    [	        U[
        R                  5      n[        UUUR                  U
R                  UUS9(       a  [        U UUU
UUUS9[        R                  4$ U R                  =(       a    X::g  nU(       + =(       a.    UR                  SL=(       a    UR                  U
R                  :g  nU(       d  U(       d  S[        R                  4$ U(       av  U(       a/  [        R                  R                  SR                  U5      5        O.[        R                  R                  SR                  U5      5        S[        R                  4$ [	        U[
        R                  5      (       a&  [         R"                  " UUU S9[        R                  4$ [$        R&                  " [         R(                  " 5       UUUU
5      [        R                  4$ )zDSimilar to get_task_and_iteration_instruction except for equal URLs.N)r   r   )r   r   r   z!Would set POSIX attributes for {}zWould set mtime for {})r   r   )r   "get_posix_attributes_from_resourcerg   r   r8   r   r{   r   r   r   r   preserve_posixr   r   r   r*   r   PatchObjectTaskr   PatchFilePosixTaskget_system_posix_data)r   source_objectdestination_objectr   r   r   /skip_if_destination_has_later_modification_timer   r   r   destination_posixr   r   need_full_posix_updateneed_mtime_updates                  r4   @_compare_equal_object_urls_to_get_task_and_iteration_instructionr   "  s?    !CC 6



(

!
!
-


066
6
 	@01	
  '(($.'66% %J%'9'H'HI " .-&E 	!3-	
 	  &&L<+L  *) 8


D
(8


 1 7 7
7 
 !$5"''((	jj
-
4
45G
H 
jj/667IJK"''(("$6$E$EFF))%/	

 	  ..

*
*
,



 	
 	r6   c                    UR                   nUR                  S5      R                  nU R                   R                  nUR                  U5      (       d%  [        R
                  " SR                  X45      5      eU[        U5      S $ )z-Removes container URL prefix from object URL.r;   z6Received container {} that does not contain object {}.N)r   rA   r   
startswithr   Errorr*   len)object_resourcecontainer_resourcecontainer_url,container_url_string_with_trailing_delimiterobject_url_strings        r4   $_get_url_string_minus_base_containerr     s    $00-1>1C1C2 / &11HH		%	%2
 
 ,,@GG8	
 
 
3KLN	OOr6   c                     [        X5      nUR                  UR                  R                  [        R                  5      $ )z8Gets URL to compare to decide if resources are the same.)r   replacer   	delimiterCLOUD_URL_DELIMITER)r   r   containerless_object_url_strings      r4   _get_comparison_urlr    s<    $H%! 
)	0	0$$..0O0O
 r6   c                    [        X5      nUR                  U R                  R                  UR                  R                  5      nUR                  R	                  U5      n[
        R                  " U5      n[        R                  " U5      $ )z0Gets destination resource needed for copy tasks.)	r   r  r   r  rA   r   r+   r
   "sanitize_file_resource_for_windows)r   r   r   containerless_source_string1destination_delimited_containerless_source_stringnew_destination_object_urlnew_destination_resources          r4   r   r     s     !E! "))

%
%
/
/

+
+
5
5 4  5@@EE7  0??  
	5	56N	OOr6   c                 N    [         R                  " SR                  U 5      5        g )NzSkipping symlink {})r   r   r*   r3   s    r4   _log_skipping_symlinkr    s    ++#**845r6   c                 `    [         R                  R                  SR                  U 5      5        g )NzWould remove {})r   r   r   r*   r  s    r4   _print_would_remover    s     **$++H56r6   c                     U R                   n[        U[         R                  5      (       a  [        R                  " UUS9$ [        R
                  " UUS9$ )N)r   )r   r8   rz   r   DeleteFileTaskDeleteObjectTask)r3   r   re   s      r4   _get_delete_taskr    sT    #[(())%%+ 
 ''+ r6   c                 B    U(       d  gU(       a  [        X5      (       + $ g)zCReturns True if the unmatched destination object should be deleted.FT)r   )r   r   r   r   s       r4   +_should_delete_unmatched_destination_objectr    s)     
. +3   
r6   r   r   r   c                 0   [        U[        R                  5      (       a  S[        R                  4$ [        UUUU5      nU(       d  S[        R                  4$ U(       a  [        U5        S[        R                  4$ [        X5      [        R                  4$ )a}  Gets task and iteration instruction for deleting/preserving an unmatched destination while used with delete_unmatched_destination_objects.

Args:
  user_request_args: User flags.
  destination_resource: Destination resource to check for deletion.
  delete_unmatched_destination_objects: Clear objects at the destination that
    are not present at the source.
  use_gsutil_delete_unmatched_behaviour: Preserves objects at the destination
    that are not present at the source if delete_unmatched_destination_objects
    is set, if they would normally be preserved by other flags just as gsutil.
  dry_run: Print what operations rsync would perform without actually
    executing them.
  skip_unsupported: Skip copying unsupported object types.

Returns:
  A pair of task and iteration instruction.
    - A delete task if applicable, or None.
    - An iteration instruction for the next step.
N)r8   r   rV   r   r   r  r  r  )r   r   r   r   r   r   *should_delete_unmatched_destination_objects          r4   1_get_task_and_iteration_for_unmatched_destinationr    s    8 $&8&N&NOO"..// 2

.
/
	 - 
4"..//,-"..// +?""
 r6   c                 ^   U(       d  U(       d  [         R                  " S5      e[        R                  R                  R
                  R                  5       nU(       d  [        U UUUUU
5      $ U(       a.  UR                  (       a  [        U5        S[        R                  4$ [        U[        R                  5      (       dO  [        R                   " U5      nU R"                  (       a  UnO'[        R$                  " SUR&                  SSS5      nOSnU(       d  [)        U UUUUUU
S9[        R                  4$ U(       a.  UR                  (       a  [        U5        S[        R*                  4$ [-        X5      n[-        X45      nX:  a  [)        U UUUUUU
S9[        R                  4$ X:  a  [        U UUUUU
5      $ U R.                  (       a  [1        UU5      nSU4$ [        U[        R                  5      (       a   [)        U UUUUUSU
S9[        R2                  4$ [5        U UUUUUU	U
UUS9
$ )aG  Compares resources and returns next rsync step.

Args:
  user_request_args (UserRequestArgs): User flags.
  source_resource: Source resource for comparison, a FileObjectResource,
    ManagedFolderResource, ObjectResource, or None. `None` indicates no
    sources left to copy.
  source_container (FileDirectoryResource|PrefixResource|BucketResource):
    Stripped from beginning of source_resource to get comparison URL.
  destination_resource: Destination resource for comparison, a
    FileObjectResource, ManagedFolderResource, ObjectResource, or None. `None`
    indicates all remaining source resources are new.
  destination_container (FileDirectoryResource|PrefixResource|BucketResource):
    If a copy task is generated for a source item with no equivalent existing
    destination item, it will copy to this general container. Also used to get
    comparison URL.
  compare_only_hashes (bool): Skip modification time comparison.
  delete_unmatched_destination_objects (bool): Clear objects at the
    destination that are not present at the source.
  dry_run (bool): Print what operations rsync would perform without actually
    executing them.
  ignore_symlinks (bool): Skip operations involving symlinks.
  skip_if_destination_has_later_modification_time (bool): Don't act if mtime
    metadata indicates we'd be overwriting with an older version of an object.
  skip_unsupported (bool): Skip copying unsupported object types.

Returns:
  A pair of with a task and iteration instruction.

  First entry:
  None: Don't do anything for these resources.
  DeleteTask: Remove an extra resource from the destination.
  FileDownloadTask|FileUploadTask|IntraCloudCopyTask|ManagedFolderCopyTask:
    Update the destination with a copy of the source object.
  PatchFilePosixTask: Update the file destination POSIX data with the source's
    POSIX data.
  PatchObjectTask: Update the cloud destination's POSIX data with the source's
    POSIX data.

  Second entry:
  _IterateResource: Enum value indicating what to compare next.

Raises:
  errors.Error: Missing a resource (does not account for subfunction errors).
z7Comparison requires at least a source or a destination.N)r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   rB   rC   >use_gsutil_rsync_delete_unmatched_destination_objects_behaviorGetBoolr  
is_symlinkr  r   r   r8   r   rV   r   r   r   r~   rg   r   r   r  
no_clobberr   r   r   )r   r   r   r   r   r   r   r   r!   r   r   r   source_posixr   
source_urldestination_urlr   s                    r4   #_get_task_and_iteration_instructionr#    si   t 1
,,A 
 ^^ffh ( 
<,-  33/*"))**	O%7%M%M	N	N@@L ''!l//
""D$l L	%-"7-	
 	  -88./"..//"?E*'/ !%-"7-	
 	  !<,-  !!?01	
  '((!3!I!IJJ 	-!5"7-		
 	  
J-
9'+O
/
 r6   c              #   T  #    S=p[         R                  " U5       n[         R                  " U5       n[        [        US5      U	S9n[        [        US5      U	S9nU(       d  U(       a  [	        U UUUUUUUUU
US9u  nnU(       a@  US-  n[        U[        R                  5      (       a  UUR                  =(       d    S-  nUv   U[        R                  [        R                  4;   a  [        [        US5      U	S9nU[        R                  [        R                  4;   a  [        [        US5      U	S9nU(       a  M  U(       a  M  SSS5        SSS5        U(       a%  U(       d  U(       a  [        R                  " XUS9  ggg! , (       d  f       NC= f! , (       d  f       NL= f7f)zBReturns task with next rsync operation (patch, delete, copy, etc).r   N)r   )r   r   r   r!   r   r      )
item_countrY   )r   
FileReaderr   nextr#  r8   r   ObjectCopyTaskrY   r   r   r   r   r   workload_estimator_callback)r   source_list_filer   destination_list_filer   r   r   r   r!   yield_managed_folder_operationsr   r   task_status_queueoperation_countbytes_operated_onsource_readerdestination_readerr   r   taskr   s                        r4   get_operation_iteratorr4    s      )*)/()]E<L<L=0]D!9O 6&9
 1$G




12)=+%!d!" 
1dI4455
338q
8

	

!
!


# 
 5%=
 


&
&


# 
  :#T*= 
G /11=)h O/@22<M 0Ai= =))s:   F(FDF F	F5F(
F	F
F%!F()T)NF)F)FF)NNNNFF)FFFFFF)FFFF)FFFFFFFN)Dr   
__future__r   r   r   enumr@   googlecloudsdk.api_lib.storager   "googlecloudsdk.command_lib.storager   r   r	   r
   r   r   r   r   r   r   ,googlecloudsdk.command_lib.storage.resourcesr   r   (googlecloudsdk.command_lib.storage.tasksr   +googlecloudsdk.command_lib.storage.tasks.cpr   r   0googlecloudsdk.command_lib.storage.tasks.objectsr   +googlecloudsdk.command_lib.storage.tasks.rmr   googlecloudsdk.corer   r   googlecloudsdk.core.utilr   rc   rb   ru   r)   r=   r5   r9   rM   rS   rq   rw   r   r   r   Enumr   boolr   r   r   r   r   r  r   r  r  r  r  r  r#  r4  r   r6   r4   <module>rB     s   # &  '  	 4 5 ? 8 8 K 9 A : @ @ K F J I A N C # * * 
   > 
 +  $N ?D*Z>DNG<~`"P $)<tyy  $	8 =@2 49).*/dNP$P0672 2727"2 +/2 ,0	2
 2 2v ).49u| ).$)49Hr6   