
    Pi                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ dZ0dZ1dZ2d	Z3d
Z4dZ5dZ6dddddddZ7dee8ef         fdZ9dee8         fdZ:de8de8de8de8fdZ;	 ddee8e8f         de8dee<         de(fdZ=d e(d!ee8e8f         de(fd"Z>d#ee8e8f         d$e8dee8e?f         fd%Z@d&e8dee8e8e8f         fd'ZAd&e8dee8e8e8f         fd(ZBd&e8dee8e8e8f         fd)ZCde8d*e8d+e8de8fd,ZDde8d*e8d+e8de8fd-ZEd.e$de8d*e8d+e8de8f
d/ZFd.e$d&e8ddfd0ZGd e(d#e8de8fd1ZHd2ee8ef         dee8         fd3ZId4d5d6d7d8d9d:d;d<d=d>d?d@ZJdAe8de?fdBZKdCee8e8f         de*fdDZLd.e$de8d*e8d!ee8e8f         dEee)         deMfdFZNd.e$dGe8de8d!ee8e8f         dee8         f
dHZOd.e$d!ee8e8f         dee8         fdIZPd.e$de8d*e8dee8ef         dEee)         deeee?f                  fdJZQd.e$d#edeee?f         fdKZRd.e$d#edeee?f         fdLZSd.e$d e(ddMfdNZTdOe<dPe<de8fdQZUd.e$d$e8d2ee8e8f         dedM         fdRZVd.e$d&e8d$e8dSee8         dTeeW         dUee8         ddMfdVZXd.e$d&e8deMfdWZY	 	 dd.e$d$e8dXe8deee8e8f                  dYeee8e8f                  deee8ef                  fdZZZ G d[ d\e!          Z[ G d] d^e"          Z\d.e$d&e8d_e<d`e<d$e8dae8ddfdbZ]d.e$dcej^        j_        dde8dee8dfeMdgee8         dee8         fdhZ`ddid.e$d&e8dUee8         dee*         fdjZad.e$d&e8deMfdkZbd.e$d&e8dle8dme8deMf
dnZcdd.e$d&e8doee8         dee%         fdpZdd&e8de%fdqZed&e8dre*de%fdsZfd.e$de8d*e8dtee8ef         dee%         f
duZgd.e$d&e8dee8ee?         f         fdvZhdd.e$d&e8dwe?dUee8         deMf
dxZid.e$d&e8de8fdyZjd.e$dde8dee8dfeMdee8         f
dzZkd.e$d$e8d{e8de8fd|Zld.e$dde8d_e<d`e<dee8dae8ddfd}Zmd.e$dcej^        j_        dde8dee8dfeMdgee8         dee8         fd~Zn e+eRd          Zo e+eSd          ZpdS )    N)AnyDictIteratorListMappingOptionalSequenceTuple)_common)_xml)DEFAULT_RETRY_CODESINVALID_HOSTNAME_STATUSBaseStreamingReadFileBaseStreamingWriteFileConcurrentWriteFailureConfigDirEntryErrorFileBodyRequestRequestFailureStatTokenManagerVersionMismatch	path_joinrngstrip_slashes
shared_keyoauth_token	anonymousi  iQ i iP  zx-ms-blob-cache-controlzx-ms-blob-content-typex-ms-blob-content-md5zx-ms-blob-content-encodingzx-ms-blob-content-languagezx-ms-blob-content-disposition)zCache-ControlContent-TypeContent-MD5Content-EncodingContent-LanguagezContent-Dispositionreturnc                     t          j        dd          dk    rddiS dD ]N} | t           j        v r>i }dt           j        v rt           j        d         |d<   d	t           j        |          d
|c S Odt           j        v rli }t           j        d                             d          D ]2}|                    d          \  }}}|||                                <   3d	|d         |d         dS dt           j        v rt           j        d         }t           j                            |          st          d| d          t          |          5 }t          j        |          }	d|	d         |	d         |	d         dcd d d            S # 1 swxY w Y   dt           j        v r7dt           j        d         t           j        d         t           j        d         dS t           j                            d          }
t           j                            |
          rt          |
          5 }t          j        |          }|                    di                                           D ]'}|d         dk    rd|d          d!c cd d d            S 	 d d d            n# 1 swxY w Y   t           j                            d"          }t           j                            |          rt          |          5 }t          j        |          }d }|D ]G}d#|vrd|d#         d!}	||	}|                    d$d%          |                    d$d%          k    r|	}H||cd d d            S 	 d d d            n# 1 swxY w Y   i S )&NAZURE_USE_IDENTITY01_azure_authazure-identity)AZURE_STORAGE_KEYAZURE_STORAGE_ACCOUNT_KEYAZURE_STORAGE_ACCOUNTaccountsakey)r+   storage_account_keyAZURE_STORAGE_CONNECTION_STRING;=accountname
accountkey)r+   r0   r2   AZURE_APPLICATION_CREDENTIALSzCredentials not found at 'zC' specified by environment variable 'AZURE_APPLICATION_CREDENTIALS'svcactappIdpasswordtenant)r+   	client_idclient_secret	tenant_idAZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_IDz~/.azure/msal_token_cache.jsonRefreshTokencredential_typerefreshsecret)r+   refresh_tokenz~/.azure/accessTokens.jsonrefreshToken	expiresOn )osgetenvenvironsplit	partitionlowerpathexistsr   openjsonload
expandusergetvalues)varnamer0   connection_datapartkey_val
creds_pathfcredsmsal_tokens_pathtokenstokenaccess_tokens_path
best_tokens                  c/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/blobfile/_azure.py_load_credentialsrh   B   s   	y%s++s22/00
 F c cbj  G&"*44%'Z0G%H	"#*2:gCVbbZabbbb	 ! )BJ66 J@AGGLL 	/ 	/D..--KCC+.OCIIKK(("&}5#2<#@
 
 	
 '"*44Z ?@
w~~j)) 	|Z|||   * 	IaLLE'"7^!&z!2"8_	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 BJ&&#$56Z(=>$56	
 
 	
 w))*JKK	w~~&'' T"## 	TqYq\\FNB77>>@@ T T*+~=='05?SSSS	T 	T 	T 	T 	T 	T 	T 	TT	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T ++,HII	w~~()) "$%% 	"Yq\\FJ 	+ 	+!..(1E.DYZZ%!&JJ yyb11JNN;PR4S4SSS%*
%!	" 	" 	" 	" 	" 	" 	" 	" &	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"  Is8   
-FFF!AJJJ+A$M))M-0M-c                     t           j                            d          } t           j                            |           sg S t	          | d          5 }t          j        |                                                    d                    }ddd           n# 1 swxY w Y   |	                    dg           }dt          t          t          f         dt          fd}|                    |d	
           d |D             S )z
    Return a list of subscription ids from the local azure profile
    the default subscription will appear first in the list
    z~/.azure/azureProfile.jsonrbz	utf-8-sigNsubscriptionsxr&   c                     | d         S )N	isDefault )rl   s    rg   key_fnz%load_subscription_ids.<locals>.key_fn   s    ~    T)r\   reversec                     g | ]
}|d          S )idro   ).0subs     rg   
<listcomp>z)load_subscription_ids.<locals>.<listcomp>   s    ///#CI///rq   )rK   rQ   rV   rR   rS   rT   loadsreaddecoderW   r   strr   boolsort)default_profile_pathr`   profilerk   rp   s        rg   load_subscription_idsr      s,   
 7--.JKK7>>.// 		"D	)	) ;Q*QVVXX__[99::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; KK44M'#s(#      64000//////s   :BBBr0   templatedatac                 0    t          j        d|  d|fi |S )Nhttps://.blob.core.windows.net)common	build_url)r0   r   r   s      rg   r   r      s*    FwFFFYYTXYYYrq      ra   scopesuccess_codesc                 *   | d         dk    rd| d         |d}d}n/| d         dk    rd| d         | d	         |d
}| d         }nt           t          d| ddddit          j                            |                              d          |          S )Nr+   rE   rG   )
grant_typerG   r   r   r9   client_credentialsr=   r>   )r   r=   r>   r   r?   z"https://login.microsoftonline.com/z/oauth2/v2.0/tokenPOSTr"   z!application/x-www-form-urlencodedutf8)urlmethodheadersr   r   )AssertionErrorr   urllibparse	urlencodeencode)ra   r   r   r   r?   s        rg   _create_access_token_requestr      s     ]y(( *"?3
 

 			}		)	) /{+"?3	
 
 +&		NNNN!DE\##D))0088#   rq   reqauthc                    | j         i }n&t          | j                                                   }| j        i }n&t          | j                                                  }d|d<   t          j                            t          j        j                                      d          |d<   | j	        }|)t          |t                    rt          j        |          }t          | j        | j        |||| j        t#          | j                  t#          | j                            }|\  }}|t(          k    rt+          ||          |d<   n |t,          k    r	d| |d<   n|t.          k    r	 |S )	Nz
2019-02-02zx-ms-versiontzz%a, %d %b %Y %H:%M:%S GMTz	x-ms-date)r   r   paramsr   r   preload_contentr   retry_codesAuthorizationzBearer )r   dictcopyr   datetimenowtimezoneutcstrftimer   
isinstancexmlunparser   r   r   r   tupler   r   
SHARED_KEYsign_with_shared_keyOAUTH_TOKEN	ANONYMOUS)r   r   r   r   r   resultkindrd   s           rg   create_api_requestr      sn   
{s{##((**
zcj!!&&(( +GN#,00H4E4I0JJSS# GK 8DJtT22{4  zG+C-..#/**	 	 	F KD%z#7#F#F  			#4U#4#4  			Mrq   r\   r   c                    i d| d         d| d         d| d         d| d         d| d         d	| d
         d| d         d| d         ddddddddddddddddddddd}t           j                            |          }|j                            d          d         }t           j                            d | d!|j        d"d                     }|d         |d         |d         ||d         |d	         |d         |d         |d         |d         |d         |d         |d         |d         |d         |d         |d         |d#         |d$         |d         f}d%                    |          }t          j	        t          j        t          j        | d&                   |                    d'          d(                                        d'          |d)<   t           j                            d* |                                D                       }t#          j        | d                             d+d,          d-          }	t)          j        |	          }
|d.z   |z   |
fS )/NstSignedStartseSignedExpirysksSignedServicesktskesktid	SignedTidskoid	SignedOidskvSignedVersionsvz
2018-11-09srbsprsiprJ   sisprz
https,httprsccrscdrsce)rsclrsct.r   z/blob//   r   r   
Valuer   sha256sigc                 &    i | ]\  }}|d k    ||S )rJ   ro   ru   kvs      rg   
<dictcomp>z'generate_signed_url.<locals>.<dictcomp>6  s#    #O#O#OTQqBwwAqwwwrq   ZGMTz%Y-%m-%dT%H:%M:%S%Z?)r   r   urlparsenetlocrN   unquoterQ   joinbase64	b64encodehmacdigest	b64decoder   rz   r   itemstimestrptimereplacecalendartimegm)r\   r   r   ustorage_accountcanonicalized_resourceparts_to_signstring_to_signquerytsts              rg   generate_signed_urlr      s   c- c.! 	s?# 	s=!	
 	s>" 	[! 	[! 	s?# 	l 	c 	c 	r 	b 	|  	!" 	#$ 	%& )  F, 	c""AhnnS))!,O#\112Y?2Y2YQVTUTVTVZ2Y2YZZtttwwuuuuuuttvvvvv 	t-M0 YY}--N$F$S\22N4I4I&4Q4QS[\\ fVnn 5M L""#O#OV\\^^#O#O#OPPE	s>*223>>@U	V	VBA9uarq   rQ   c                     |                      d          rt          |           S |                      d          rt          |           S t          d|  d          )Naz://r   Invalid path: '')
startswithsplit_az_pathsplit_https_pathr   )rQ   s    rg   
split_pathr   =  s`    w /T"""		$	$ /%%%-d---...rq   c                 8   | t          d          d                              d          }t          |          dk     rt          d|  d          |d         }|d         }|dk    rt          d|  d          d                    |dd                    }|||fS )	Nr   r      r   r   r   r   rJ   )lenrN   r   r   )rQ   partsr0   	containerobjs        rg   r   r   F  s    W &&s++E
5zzA~~-d---...AhGaIB-d---...
((59

CIs""rq   c                    | t          d          d                              d          }t          |          dk     rt          d|  d          |d         }|d         }|                    d          r|d	k    rt          d|  d          d                    |dd                    }|                    d
          d         }|||fS )Nr   r   r  r   r   r   r   r   rJ   r   )r  rN   r   endswithr   )rQ   r  hostnamer  r  r0   s         rg   r   r   R  s    Z""#))#..E
5zzA~~-d---...QxHaI566 /)r//-d---...
((59

CnnS!!!$GIs""rq   r  r  c                     d|  d| d| S )Nr   .blob.core.windows.net/r   ro   r0   r  r  s      rg   combine_https_pathr  _  s     GgGGiGG#GGGrq   c                     d|  d| d| S )Nr   r   ro   r  s      rg   combine_az_pathr  c  s     .7..Y.....rq   confc                 T    | j         rt          |||          S t          |||          S N)output_az_pathsr  r  )r  r0   r  r  s       rg   combine_pathr  g  s1     ;w	3777!'9c:::rq   c                    |                     d          s|dz  }t          |          \  }}}t          t          |d||          dddid          }t	          | |          }|j        d	k    rt          d
| d          d S )Nr   /{container}/{blob}r  blobPUTx-ms-blob-type	BlockBlob)     r   r   r   r   r  z?Unable to create directory, account/container does not exist: 'r   )r  r   r   r   execute_api_requeststatusr   r  rQ   r0   r  r  r   resps          rg   	mkdirfiler"  n  s    == )$//GY
g4	PTUUU!;/ 	  C tS))D{c]VZ]]]^^^ rq   c                    g }| j         M| j                                         D ]3\  }}|                                }|                    | d|            4t          j                            | j                  }|j        	                    d          d         }d| d|j
        dd           }d                    |gt          t          |                    z             }	| j        i }
nt          | j                  }
g }|
                                D ]p\  }}|                                }t!          j        dd|                                          }|                    d	          r|                    | d|            qd                    t          |                    }|
                    d
d          }| j        !t-          t/          | j                            }| j        |
                    dd          |
                    dd          ||
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          |
                    dd          ||	g}d                    |          }t3          j        t7          j        t3          j        |          |                    d          d                                        d          }d| d| S )N:r   r   r   r   r   z\s+ zx-ms-Content-LengthrJ   r$   r%   r#   r"   DatezIf-Modified-SinceIf-MatchzIf-None-MatchzIf-Unmodified-SinceRanger   r   z
SharedKey ) r   r   rP   appendr   r   r   r   r   rN   rQ   r   listsortedr   r   rerv   stripr   rW   r   r{   r  r   r   r   r   r   r   r   rz   )r   r\   params_to_signnamevaluecanonical_namer   r   canonical_urlr   r   headers_to_signcanonical_valuecanonicalized_headerscontent_lengthr   r   	signatures                     rg   r   r   }  s   N
z:++-- 	? 	?KD%!ZZ\\N!!^"="=e"="=>>>>cg&&AhnnS))!,O666!&*66M!YYf^>T>T9U9U'UVV
{s{##O}} J Je&e44::<<$$W-- 	J""n#H#H#H#HIII IIf_&=&=>>[[!1266N
xS]]++ 	
&++&++M2&&NB''FB',,J##OR(()2..GR  M  YY}--N F$S))>+@+@+H+H(SS fVnn  655)555rq   metadatac                 r    d| v r2| d         }|d S t          j        |                                          S d S )Nr#   )r   r   hex)r9  b64_encodeds     rg   _get_md5r=    sD      }-4,,00222trq   010203040506070809101112)JanFebMarAprMayJunJulAugSepOctNovDectextc                     |                                  }|d          dt          |d                   d|d          d|d          d}t          j                            |          }|                                S )N   -r  r   T   z+00:00)rN   _MONTH_NAME_TO_INDEXr   fromisoformat	timestamp)rV  pdate_stringdts       rg   _parse_timestamprb    sq     	

AqTLL016LL1LL!LLLK			(	(	5	5B<<>>rq   itemc                    d| v r	| d         }n| d         }d| v rt          | d                   }nt          | d                   }t          t          | d                   |t          |          t	          |           | d                   S )NzCreation-Timezx-ms-creation-timex-ms-meta-blobfilemtimezLast-Modifiedr&  Etag)sizemtimectimemd5version)floatrb  r   intr=  )rc  	raw_ctimerh  s      rg   	make_statro    s    $)		-.	 D((d4566 o!677&'((y))TNNV   rq   out_failuresc                    | j         rdS dddt          gd         t          k    r                    d           dt          ffd}t          j        | |          }|j        t          k    rdS |j        dk    rDd         t          k    r3|                    t          j	        d	 |            |                     d
S |j        dv rdS |                    t          j	        d	 |            |                     d
S )NTr       r     r&   c                  t    t          dt          d          dddd          } t          | 	          S )
NGET/{container}r  r  r+  r*   )restypecomp
maxresultsr   r   r   r   r   )r   r   r   )r   r0   r   r  r   s    rg   	build_reqz(_can_access_container.<locals>.build_req  sQ    '>YGGG*F#NN'	
 
 
 "#D1111rq   zCould not access containerFr   rs  )
use_blind_writesr   r   r*  r   r   execute_requestr  r   create_from_request_response)r  r0   r  r   rp  r~  r!  r   s    ```   @rg   _can_access_containerr    sN     t#s$;<MAw)S!!!2w 2 2 2 2 2 2 2 2 2 !$	22D {---t {cd1g227,iikk4 	
 	
 	

 u{j  t7,iikk4 	
 	
 	

 urq   subscription_idc                   	 d| d	ddi	 dt           f	fd}t          j        | |          }|j        dv rd S t	          j        |j                  }|d	         D ]}|d
         |k    r
|d         c S d|vrd S |d         	d z)Nz+https://management.azure.com/subscriptions/z,/providers/Microsoft.Storage/storageAccountsapi-version
2019-04-01Tr&   c                  L    t          dd          } t          |           S )Nrv  )r     rr  r|  r}  r   r   r   r   r   r   s    rg   r~  z*_get_storage_account_id.<locals>.build_req&  s,    Co^^^C%c5555rq   )r  rr  r1  r0  rt   nextLink)r   r   r  r  rT   rx   r   )
r  r  r0   r   r~  r!  outr  r   r   s
      `    @@rg   _get_storage_account_idr    s     v
u
u
uC\*F	67 	6 	6 	6 	6 	6 	6 	6 	6 %dI66;*$$4j##w< 	! 	!C6{g%%4y    & S  4*o+rq   c                     dddig }	 dt           ffd}t          j        | |          }t          j        |j                  }|                    d |d         D                        d	|vr|S |d	         d s)
Nz*https://management.azure.com/subscriptionsr  z
2020-01-01Tr&   c                  J    t          d          } t          |           S )Nrv  r   r   r   r}  r  r  s    rg   r~  z(_get_subscription_ids.<locals>.build_reqB  s*    C???C%c5555rq   c                     g | ]
}|d          S )subscriptionIdro   )ru   rc  s     rg   rw   z)_get_subscription_ids.<locals>.<listcomp>H  s    HHH$t,-HHHrq   r1  r  )r   r   r  rT   rx   r   extend)r  r   r   r~  r!  r   r   r   s    `    @@rg   _get_subscription_idsr  <  s    
6C\*FF	67 	6 	6 	6 	6 	6 	6 	6 	6 %dI66z$)$$HH$w-HHHIIIT!!M:rq   c                    dt           ffd}t          j        | |          }t          j        |j                  }t          |d         ft                      d D ]}t          | ||           n<t          |           }	fd|	D             }
|
D ]}t          | ||           nd S dt           ffd}t          j        | |          }t          j        |j                  }|d         D ]K}|d         dk    r=t          |d	         f}t          | ||||
          r|c S t          d| d| d          Lt          d| d          )Nr&   c                  &    t           d          S )Nz%https://management.azure.com/.defaultra   r   r   ra   s   rg   build_req_access_tokenz8_get_storage_account_key.<locals>.build_req_access_token^  s     +F
 
 
 	
rq   access_tokenc                     g | ]}|v|	S ro   ro   )ru   rt   stored_subscription_idss     rg   rw   z,_get_storage_account_key.<locals>.<listcomp>s  s+     &
 &
 &
R7N-N-NB-N-N-Nrq   c                  V    t          dd dddi          } t          |           S )Nr   zhttps://management.azure.comz	/listKeysr  r  r  r}  r  )r   r   storage_account_ids    rg   build_req_list_keysz5_get_storage_account_key.<locals>.build_req_list_keys  sF    L/ALLL!<0
 
 

 "#D1111rq   keyspermissionsFULLr1  rp  zIFound storage account key, but it was unable to access storage account: '' and container: 'r   zCStorage account was found, but storage account keys were missing: ')r   r   r  rT   rx   r   r   r   r  r  r   r  r   )r  r0   r  ra   rp  r  r!  r   r  subscription_idsunchecked_subscription_idsr  r\   storage_key_authr   r  r  s      `          @@@rg   _get_storage_account_keyr  O  s6   
G 
 
 
 
 
 

 !$(>??DZ	""F/0D 4552  4T?GUYZZ)E *
 1t<<&
 &
 &
 &
)&
 &
 &
"  : 	 	O!8PWY]!^!^!- . 42 2 2 2 2 2 2 2 !$(;<<DZ	""Ff~ 
 
}'' *CL9$gy*:    (''' H`g  H  H  |E  H  H  H   ( `V]```
a
aarq   c                 P   |\  }t          j                     }t                                          d          }g }|dk    r]dv r(d         k    rt          dd          d d          t          d         f}t          | |||          r||t          z   fS n|d	k    r"d
t          ffd}t          j	        | |          }t          j        |j                  }	|j        dk    rs|	d         dk    r
d|	d         v s,|	d         dk    r
d|	d         v s|	d         dk    rd|	d         v rt          d          t          d|	d          d|	d          d          t          |	d         f}t          | |||          r||t          |	d                   z   fS | j        r"t#          | ||          }
|
|
|t          z   fS n^|dk    rd
t          ffd}t          j	        | |          }t          j        |j                  }	t          |	d         f}t          | |||          r||t          |	d                   z   fS | j        r"t#          | ||          }
|
|
|t          z   fS n|dk    r	 ddlm} n# t(          $ r t+          d           w xY w |            5 }|                    d!          }d d d            n# 1 swxY w Y   t          |j        f}t          | |||          r	||j        fS | j        r"t#          | ||          }
|
|
|t          z   fS t2          d"f}t          | |||          r|t          d#          fS d$ d%| d}t5          |          dk    r|D ]
}|d&| z  }t5                    dk    r|d'z  }t          |          )(Nr+   r1   r0   z*Provided storage account key for account 'zA' via environment variables, but needed credentials for account 'r   r2   r  rE   r&   c                  0    t          d  dd          S )Nr   z.blob.core.windows.net/.default)r   r  )ra   r   r   r  )r0   ra   s   rg   r~  z$_get_access_token.<locals>.build_req  s.    /IIII(   rq   r  errorinvalid_grantAADSTS700082error_descriptioninteraction_requiredAADSTS50078AADSTS50076zMYour refresh token is no longer valid, please run `az login` to get a new onez7Encountered an error when requesting an access token: `z: z9`.  You can attempt to fix this by re-running `az login`.r  
expires_in)r  r0   r  ra   rp  r9   c                  &    t           d          S )N"https://storage.azure.com/.defaultr  r  r  s   rg   r~  z$_get_access_token.<locals>.build_req  s     /#G   rq   r,   r   )DefaultAzureCredentialzSWhen setting AZURE_USE_IDENTITY=1, you must also install the azure-identity packager  rJ   infzFCould not find any credentials that grant access to storage account: 'r  z
    Access Failure: a  

No Azure credentials were found.  If the container is not marked as public, please do one of the following:

* Log in with 'az login', blobfile will use your default credentials to lookup your storage account key
* Set the environment variable 'AZURE_STORAGE_KEY' to your storage account key which you can find by following this guide: https://docs.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage
* Create an account with 'az ad sp create-for-rbac --name <name>' and set the 'AZURE_APPLICATION_CREDENTIALS' environment variable to the path of the output from that command or individually set the 'AZURE_CLIENT_ID', 'AZURE_CLIENT_SECRET', and 'AZURE_TENANT_ID' environment variables)r   rh   rW   r   r   r  SHARED_KEY_EXPIRATION_SECONDSr   r   r  rT   rx   r   r  r   rl  &use_azure_storage_account_key_fallbackr  azure.identityr  ImportErrorRuntimeError	get_tokenrd   
expires_onr   r  )r  r\   r  r   
azure_authaccess_failuresr   r~  r!  r   storage_account_key_authr  credrd   anonymous_authmsgresp_failurer0   ra   s                    @@rg   _get_access_tokenr    s   GY
)++CE=))J,.OWY7**FyAQ F F;BF F F   E"789 w	4o^^^ 	?# ==>>	?	y	 	 	7 	 	 	 	 	 	 	 %dI66DI&&;# 7O66&&1D*EEE 7O'===%0C)DDD 7O'===%0C)DDD c    xfU\o  x  xagh{a|  x  x  x   VN34 !w	4o^^^ 	=#f\&: ; ;;<<6 
	W'?#,( ( ($ (30#8U2UVV	x			7 	 	 	 	 	 	
 %dI66DI&&VN34 w	4o^^^ 	=#f\&: ; ;;<<6 
	W'?#,( ( ($ (30#8U2UVV 
'	'	'	======= 	 	 	e  	
 $#%% 	INN#GHHE	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	IU[) w	4o^^^ 	,%*++6 
	W'?#,( ( ($ (30#8U2UVV  _Ngy.   . e--
zSZ
z
znw
z
z
zC
?a+ 	; 	;L:L:::CC
5zzQ ` 	` **s   ;J J)KKKc                     t                                          }|d         t          k    rd t          j                    t          z   fS \  dt
          f fd}t          j         |          }|j        dk    rt          d d          t          j        |j                  }t          j                    t          z   }|d         |fS )	Nr\   r   r&   c            	         t           j                             t           j        j                  } | t          j        d          z                       d          }| t          j        d          z                       d          }t          d dd	t          d
d          d||did          }t          	                              }|d         t          k    rt          d d d          t          ||          S )Nr   )hoursz%Y-%m-%dT%H:%M:%SZ   )daysr   r
  r   serviceuserdelegationkey)ry  rz  KeyInfo)StartExpiry)r   rr  r   r   r   r   r   r  r   zOnly OAuth tokens can be used to get SAS tokens. You should set the Storage Blob Data Reader or Storage Blob Data Contributor IAM role. You can run `az storage blob list --auth-mode login --account-name z --container z0` to confirm that the missing role is the issue.r}  )r   r   r   r   	timedeltar   r   r   access_token_managerr  r   r   r   )	r   startexpiryr   r   r0   r  r  r\   s	        rg   r~  z!_get_sas_token.<locals>.build_req/  s3   ##x'8'<#==x)3333==>RSS*2222<<=QRR;7;;;	0CDDDu??@$
 
 
 $--d-<<7k!!AJQA A`iA A A   "#D1111rq   rr  z@You do not have permission to generate an SAS token for account zh. Try setting the Storage Blob Delegator or Storage Blob Data Contributor IAM role at the account level.UserDelegationKey)r  r  r   r   SAS_TOKEN_EXPIRATION_SECONDSr   r   r  r  r   r   r   r   )	r  r\   r   r~  r!  r  r   r0   r  s	   ``     @@rg   _get_sas_tokenr  &  s   ))$C)88DAw) dikk$@@AAGY2w 2 2 2 2 2 2 2 2 2, !$	22D{c$w $ $ $
 
 	

 )DI

C	22A"#Q&&rq   urllib3.BaseHTTPResponsec                     t           j                            j                  }|j                            d          d         |j                            d          }t          |          dk     rt          d          |j                            d          d         dt          f fd}t          j         |          S )	Nr   r   r   r  zmissing container from pathr   r&   c                  ^    t          t                               f                    S )Nr  r}  )r   r  r  )r0   r  r  r   s   rg   r~  z&execute_api_request.<locals>.build_reqY  s8    !*44T?S4TT
 
 
 	
rq   )r   r   r   r   r   rN   rQ   r  r   r   r   r  )r  r   r   
path_partsr~  r0   r  s   ``   @@rg   r  r  Q  s    cg&&AhnnS!!!$Gc""J
:1222S!!!$I
w 
 
 
 
 
 
 
 
 

 !$	222rq   index	upload_idc                     | dk     sJ |dz  | z   }|dk     sJ t          j        |                    dd                                        d          S )Ni      l               big)	byteorderr   )r   r   to_bytesrz   )r  r  id_plus_indexs      rg   _block_index_to_block_idr  a  s`    5===="_-M5    M2212FFGGNNvVVVrq   c           	      4   t          |t          d          dd          }t          | |          }|j        dk    rd S t	          j        |j        dh          }|d	         d
         d S |d	         d
         d         }d	dd |D             ii}d |                                D             }t                                          D ]\  }	}
|	|v r||	         ||
<   t          |dt          d          i |d|d         i|d          }t          | |          S )N	blocklistrz  rv  r  )r   r   r   r   r   Blockrepeated_tags	BlockListCommittedBlocksLatestc                     g | ]
}|d          S )Namero   )ru   r   s     rg   rw   z-_clear_uncommitted_blocks.<locals>.<listcomp>x  s    $?$?$?1QvY$?$?$?rq   c                 D    i | ]\  }}|                     d           ||S z
x-ms-meta-r   r   s      rg   r   z-_clear_uncommitted_blocks.<locals>.<dictcomp>z  s0    ___1ALLQ]D^D^_q!___rq   r  r(  etag)r  rs    r   r   r   r   r   r   )	r   r   r  r  r   r   r   r   !RESPONSE_HEADER_TO_REQUEST_HEADER)r  r   r9  r   r!  r   blocksbodyr   srcdsts              rg   _clear_uncommitted_blocksr   h  sR    c$K"8"8"8V`
a
a
aCtS))D{cYty	:::Fk,-5K !23G<F($?$?$?$?$?@AD__0@0@___G5;;== ) )S(??#C=GCL
%%%979J(899%  C tS)))rq   	block_ids
md5_digestrk  c                    dd|ii}i }|*t          j        |                              d          |d<   |||d<   t          |d|t	          d          |d	d
ddt
          f          }t          | |          }	|	j        d
k    ret          j	        |	j
                  }
|
d         d         dk    rt          j        d| d||	          t          j        d|	j         ||	          |	j        dk    s|	j        t
          k    rt          d| d          |	j        dk    rG|	j        d         dk    rt          j        d|	j         ||	          t!          j        d||	          |	S )Nr  r  r   r!   r(  r  r  r  r  r  rs  r  )r   r   r   r   r   r   r   CodeInvalidBlockListzMInvalid block list, most likely a concurrent writer wrote to the same path: ``)requestresponseunexpected status messager  r  No such file or directory: 'r   x-ms-error-codeConditionNotMetetag mismatch)r   r   rz   r   r   r   r  r  r   r   r   r   r  r   FileNotFoundErrorr   r   )r  rQ   r   r  r  rk  r  r   r   r!  r   s              rg   _finalize_blobr    s    (I./DG ,2+;J+G+G+N+Nv+V+V'(%

%%%Cc+BC  C tS))D{c49%%'?6"&888
 )Eg`dggg    !=:T[::CRV    
		t{.EEE Ft F F FGGG			<)*.??? =:T[::CRV    ">'t    Krq   c                    |                     d          s|dz  }t          |          \  }}}|dk    rUt          t          |d||          dt	          d          dd	t
          f
          }t          | |          }|j        dk    S t          | t          |d|          dt	          dd|dd                    }|D ] }|d         d|d         v p	d|d         v c S !dS )z8
    Return true if a path is an existing directory
    r   rJ   rw  r  rv  r  )ry  r   rs  )r   r   r   r   rx  r+  r*   )rz  ry  prefix	delimiterr{  r   r   r   BlobsN
BlobPrefixBlobF)	r  r   r   r   r   r   r  r  create_page_iterator)	r  rQ   r0   r  r  r   r!  itr   s	            rg   isdirr    s6    == )$//GYrzz'>YTRRR,,,%<=	
 
 
 #4--{c!! "'>YGGG[Y\  	
 
 
  	T 	TFg*#vg6S&F7O:SSSS +urq   r   r   c           	   #     K   |i }n!t          |                                          }|d }n!t          |                                          }	 t          ||||ddt          f          }t	          | |          }|j        dt          fv rd S t          j        |j        ddh          d         }	|	V  |	d	         d S |	d	         |d
<   {)NTr   rs  r  r  r  r  EnumerationResults
NextMarkermarker)	r   r   r   r   r  r  r   r   r   )
r  r   r   r   r   r_  dr   r!  r   s
             rg   r  r    s       ~LL|JJOO+%<=
 
 
 #4--;3 7888F49\64JKKKL`a,'E\*(+rq   c            
       t     e Zd Zdededee         dee         ddf
 fdZ	 dded	ed
ee         ddfdZ	 xZ
S )StreamingReadFiler  rQ   rg  rk  r&   Nc                     || _         |:t          |||          }|t          d| d          |j        }|j        | _         t                                          |||           d S )Nrk  r  r   )r  rQ   rg  )_version
maybe_statr  rg  rk  super__init__)selfr  rQ   rg  rk  r   	__class__s         rg   r(  zStreamingReadFile.__init__  sy     (/<D$888Bz'(Nt(N(N(NOOO7DJDMdD99999rq   	streamingr  endr  c                 J   t          | j                  \  }}}dt          j        ||          i}| j        
| j        |d<   t          t          |d||          d|d|           }t          | j        |          }	| j        p|	j	        
                    d	          | _        |	S )
Nr)  r  r,  r(  r  r  rv  )   i  )r   r   r   r   r   ETag)r   _pathr   
calc_ranger%  r   r   r  _confr   rW   )
r)  r+  r  r,  r0   r  r  r   r   r!  s
             rg   _request_chunkz StreamingReadFile._request_chunk  s     $.dj#9#9 DF-EsCCCD=$"&-GJ'#8ITXYYY$ !*M
 
 
 #4:s33A)9)9&)A)Arq   r  )__name__
__module____qualname__r   r{   r   rm  r(  r|   r4  __classcell__r*  s   @rg   r"  r"    s        
:
:"%
:-5c]
:EMc]
:	
: 
: 
: 
: 
: 
: AE &)08	#       rq   r"  c                   X     e Zd Zdededee         ddf fdZddZded	e	ddfd
Z
 xZS )StreamingWriteFiler  rQ   rk  r&   Nc                 v   || _         t          |          \  }}}t          |d||          | _        t	          j        dd          | _        d| _        || _        t          j
                    | _        t                                          ||j                   |j        s|                                  d S d S )Nr  r  r       )r  
chunk_size)r1  r   r   _urlr   randint
_upload_id_block_indexr%  hashlibrj  _md5r'  r(  azure_write_chunk_sizer  _prepare_write)r)  r  rQ   rk  r0   r  r  r*  s          rg   r(  zStreamingWriteFile.__init__(  s    
#-d#3#3 Dg'<	X\]]]	+a33'.KMM	dt/JKKK$ 	"!!!!!	" 	"rq   c           
         t          | j        d| j        r	d| j        ini ddddt          f          }t	          | j        |          }|j        dk    re|j        d         d	k    r8t          | j        | j        |j                  }|r|j        d
         | _        d S d S t          | j        | j
                   d S |j        dt          fv s|j        dk    r)|j        d         dk    rt          d| j
         d          |j        dk    rG|j        d         dk    rt          j        d|j         ||          t          j        d||          d S )NHEADr(  r   r  rs  r  r  r  r  r0  r  ContainerNotFoundz3No such file or container/account does not exist: 'r   r  r	  r
  r  )r   r?  r%  r   r  r3  r  r   r   remover1  r  r   r  r   )r)  r   r!  s      rg   rF  z!StreamingWriteFile._prepare_write4  s   T 	37=HZ//bS#/FG	
 
 
 #4:s33;#|,-<< 1TYUU 9$(L$8DMMM9 9 tz4:.....[S"9:::K34<0A#BFY#Y#Y#SdjSSS   [C|-.2CCC$A>>>VZ    &B+S4     rq   chunkfinalizec                     d}|t          |          k     rK| j        j        z   }|||         } j                            |           t          j        |          }t           j        ddt          j
        |                                                              d          it          dt           j         j                            |ddt"          z   	          }	 t%           j        |           n# t&          $ r ~~|`~ w xY w xj        d
z  c_         j        t*          k    r t-          dt*           dt*           d          |}|t          |          k     K|r fdt/           j                  D             }t1           j         j         j        | j                                         j                  }	|	j                            d          p j         _        d S d S )Nr   r  r#   r   blockrz  blockid)r  )r  )r   r   r   r   r   r   r   r   zExceeded block count limit of z? for Azure Storage.  Increase `azure_write_chunk_size` so that zI * `azure_write_chunk_size` exceeds the size of the file you are writing.c                 :    g | ]}t          |j                  S ro   )r  rA  )ru   ir)  s     rg   rw   z4StreamingWriteFile._upload_chunk.<locals>.<listcomp>  s3       AB(DO<<  rq   r  rQ   r   r  r  rk  r0  )r  r3  rE  rD  updaterC  rj  r   r?  r   r   r   rz   r   r  rB  rA  r   r  	Exceptionr   BLOCK_COUNT_LIMITr   ranger  r1  r%  r   rW   )
r)  rK  rL  r  r,  r   	block_md5r   r  r!  s
   `         rg   _upload_chunkz StreamingWriteFile._upload_chunk  sQ   c%jj  
 $*;;Cs#DIT"""D))II&(89I9I9K9K(L(L(S(STZ([([\ 4T5FXX   $ #%88  C#DJ4444   43 " $555 d5F  d  d  HY  d  d  d   EG c%jj  J  	F   FKDL]F^F^  I "ZZI#9++--  D !L,,V44EDMMM	F 	Fs   #C9 9D
)r&   N)r5  r6  r7  r   r{   r   r(  rF  
memoryviewr|   rY  r8  r9  s   @rg   r;  r;  '  s        
"V 
"3 
"# 
"4 
" 
" 
" 
" 
" 
"n n n n`5F: 5F 5F$ 5F 5F 5F 5F 5F 5F 5F 5Frq   r;  r  rg  block_idc                    t          |dt          d|          dt          |          it          ||||z             ddt          f          }t          | |          }|j        dk    s|j        t          k    rt          d	| d
          d S )Nr  rN  rO  r&  r.  r  rs  r  r  r   )r   r   r{   r   r   r  r  r  )r  rQ   r  rg  r   r[  r   r!  s           rg   rY  rY    s    
(333!3t99-d%UT\:::C!89  C tS))D{cT[,CCC Es E E EFFF DCrq   executorr  r  
return_md5dst_versionc                    t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          |          \  }}	}
t	          |d|	|
          }t          j        dd          }t          j        |          }g }t          |dt          j
                    pd          }t          t          t          j        |j        |z            t          j                  t"                    }d}d}g }||j        k     rt%          ||          }|                    t(          | ||t          ||j        |z
            ||          }|                    |           |                    |           |dz  }||z  }||j        k     |D ]}|                                 t/          | |||||           |r't1          j        |                              d	          nd S )
Nrj   r  r  r   r=  _max_workersr   rS  r   )rS   r   rX  r   r   r   r@  rK   statgetattr	cpu_countminmaxmathceilst_sizePARALLEL_COPY_MINIMUM_PART_SIZEMAX_BLOCK_SIZEr  submitrY  r*  r   r  binasciihexlifyrz   )r  r]  r  r  r^  r_  r`   r  r0   r  r  dst_urlr  sr  max_workers	part_sizerR  r  futuresr[  futures                         rg   parallel_uploadru    s3    
c4 )A%a((
) ) ) ) ) ) ) ) ) ) ) ) ) ) )  *#GY!6)RVWWWGAy))I
AI(NBLNN4GaHHKDIai+-..0VWW I 	
AEG
!)

+Ay994eSAI<M-N-NPWYa
 
 	v"""	Q !)

       ;EN8J''..v666$Ns   266r$  c                <   t          |          \  }}}|dk    rd S t          t          |d||          dddt          f          }t	          | |          }|j        dk    rd S t          |j                  }|"|j        |k    rt          j
        d||	          |S )
NrJ   r  r  rH  r   rs  r   r   r   r  r
  )r   r   r   r   r  r  ro  r   rk  r   r  )	r  rQ   rk  r0   r  r  r   r!  rb  s	            rg   r&  r&    s    )$//GYrzzt
g4	PTUUUC!89  C
 tS))D{ctT\""Dt|w66:#S4
 
 
 	
 Krq   c                     t          |          \  }}}|dk    rt          d| d          t          t          |d||          dddt          f	          }t          | |          }|j        dk    S )
NrJ   ,The system cannot find the path specified: 'r   r  r  DELETE   rs  rw  )r   r  r   r   r   r  r  r   s          rg   rJ  rJ  0  s    )$//GYrzz Vt V V VWWW
g4	PTUUUC!89  C
 tS))D;#rq   r  	hexdigestc                 >   t          |          \  }}}t          t          |d||          dd|id          }t          | |          }|j        dv rdS i }	t
                                          D ]\  }
}|
|j        v r|j        |
         |	|<   t          j	        t          j        |                                        d	          |	d
<   t          t          |d||          dt          d          i |	d|id          }t          | |          }|j        dk    S )Nr  r  rH  r(  r   rs  r  r  )rs  r  Fr   r!   r  
propertiesr  )r   rr  rs  r  r   r   r   r   r   r   )r   r   r   r  r  r  r   r   r   r   rm  	unhexlifyrz   r   )r  rQ   r  r|  r0   r  r  r   r!  r   r  r  s               rg   maybe_update_md5r  =  sg   )$//GY
g4	PTUUUT"%	  C tS))D{j  u !G5;;== - -S$,<,GCL'-'78J98U8U'V'V']']( (G#$ g4	PTUUU&&&

 
 
 +  C tS))D;#rq   r  c              #      K   i }|||d<   t          |          \  }}}t          | t          |d|          dt          d	dd|d|          }|D ]}t	          | |||          E d {V  d S )
Nr  rw  rx  rv  r+  r  )rz  ry  r  r  ro   )r   r  r   r   _get_entries)	r  rQ   r  r   r0   r  r  r  r   s	            rg   
list_blobsr  f  s      F'{!+D!1!1GY	g~CCCNVNNvNN	
 
 
B  B Bgy&AAAAAAAAAAB Brq   c                     |                      d          r
| d d         } t          |           \  }}}|                    d          d         }t          || ddd           S )Nr   r  TFr0  rQ   is_diris_filerb  r  r   rN   r   )rQ   r]   r  r0  s       rg   entry_from_dirpathr  v  sc    }}S CRCy4  IAq#99S>>"DDu4PPPPrq   rb  c                     |                      d          rJ t          |           \  }}}|                    d          d         }t          || dd|          S )Nr   r  FTr  r  )rQ   rb  r]   r  r0  s        rg   entry_from_path_statr  ~  sZ    }}S!!!!!4  IAq#99S>>"DD4PPPPrq   r   c              #     K   |d         }|d S d|v r4|d         D ]+}t          | |||d                   }t          |          V  ,d|v rw|d         D ]p}t          | |||d                   }|d                             d          rt          |          V  G|d         }t          |t	          |                    V  od S d S )Nr  r  r  r  r   
Properties)r  r  r  r  ro  )	r  r0   r  r   blobsbprQ   r   propss	            rg   r  r    s      7OE}u% 	+ 	+Bgy"V*EED$T******v 	C 	CAgy!F)DDDy!!#&& C(......,*451A1ABBBBBB 	C 	Crq   c                     t          |          \  }}}t          |d||          }t                              | ||f          }||t	          d          fS t          ||          S )Nr  r  r  r\   r  r\   r   )r   r   sas_token_managerr  rl  r   )r  rQ   r0   r  r  r   rd   s          rg   get_urlr    ss    )$//GY
G2id
S
S
SC''T7K'LLE}E%LL  5c2222rq   rh  c                 f   t          |          \  }}}i }|||d<   t          t          |d||          dt          d          |d          }t	          | |          }	|	j        d	k    rt          d
| d          |	j        dk    rdS d |	j                                        D             }t          |          |d<   |||d<   t          t          |d||          dt          d          |d          }t	          | |          }	|	j        d	k    rt          d
| d          |	j        dk    S )Nr(  r  r  rH  r9  r  r~  r  rs  zNo such file: 'r   r  Fc                 D    i | ]\  }}|                     d           ||S r  r  r   s      rg   r   zset_mtime.<locals>.<dictcomp>  s/    SSS1\8R8RSq!SSSrq   re  r  r   )
r   r   r   r   r  r  r  r   r   r{   )
r  rQ   rh  rk  r0   r  r  r   r   r!  s
             rg   	set_mtimer    s~   )$//GYG%

g4	PTUUU$$$%  C tS))D{c 9$ 9 9 9:::{cuSS 2 2 4 4SSSG),UG%&%

g4	PTUUU$$$%  C tS))D{c 9$ 9 9 9:::;#rq   c                    t          |          \  }}}t          |          }d|v rBd                    |                    d          d d                   }t	          | |||          S t	          | ||d          d d         S )Nr   r  rJ   )r   r   r   rN   r  )r  rQ   r0   r  r  s        rg   dirnamer    s    (..GY


C
czzhhsyy~~crc*++D'9c:::D'9b99#2#>>rq   c                     t          |          \  t          |          \  dt          f fd}d }d }d }t          j                    }|D ]@}	t          j         |          }
|
j        dk    r)|
j        d         }|
j        d         }|
j        d         } n|
j        t          k    rt          d| d| d	          |
j        d
k    r:|
j        d         dk    rt          d| d| d	          t          d| d	          |
j        dk    rSt          j
        |
j                  }|d         d         dk    r't          j        d|
j          |            |
          nt          d|
j                   t          j        |	           Bt          j                    }|dk    rt          j        t#          |                     t          t%          d          d          }t'           |          }
|
j        d         |k    rt          d          |
j        d         }|
j        d         }|dk    |dk    rt          d| d	          |r$t)           |          }||j        |k    r|j        S d S )Nr&   c            	      V   t          d
	          } k    r4t                              
f          }|t          ||           \  } }t	          t          d          dd| iddd	t
          f
          }t          |t                              f                    S )Nr  r  r  r  r  x-ms-copy-sourcer{  rs  rt  r  r}  )r   r  r  r   r   r   r   r  )src_url	sas_tokenr]   r   r  dst_accountdst_blobdst_containersrc_accountsrc_blobsrc_containers       rg   r~  zremote_copy.<locals>.build_req  s    .-h
 
 
 +%% *33KQ^C_3``I $0YGLLL
2mRZ   '1S*AB
 
 
 "*44$[R_D`4aa
 
 
 	
rq   r{  zx-ms-copy-idzx-ms-copy-statusr  :Source container or destination container not found: src='' dst='r   rs  r  rI  zSource file not found: 'rt  r   r  PendingCopyOperationr	  r
  zunhandled status pendingr  r  rv  )r   r   zCopy id mismatchsuccesszInvalid copy status: ')r   r   r   exponential_sleep_generatorr  r  r   r   r  r   r   r   r   r  r   r   sleepnextr   r  r&  rk  rj  )r  r  r  r^  r~  copy_idcopy_statusr  backoff_generatorbackoffr!  r   r   r   r  r  r  r  r  r  s   `             @@@@@@rg   remote_copyr    sA   +5c??(K+5c??(K
w 
 
 
 
 
 
 
 
 
 
 
 
2 GKD :<<$  %dI66;#l>2G,'9:K<'DE[333#_S__Y\___   [C|-.2EEE'cQTcc]`ccc   $$Es$E$E$EFFF[CYty))Fgv&*@@@$A>>>		^b    A 9DK99:::
7
 :<<

"
"
4)**+++2mRZ   	
 
 
 #4--<'722*+++|F#l#56 
"
" i;[;;;<<< c"">bjD006M
Frq   relpathc                    t           j                            |          }|j        dk    r<|j                            dd          \  }}|dk    rt          d| d| d          n&|j        d	k    r|j        }nt          d| d
          |st          d| d          |                    dd          }t          |          dk    r|d         nd}t          |          dk    r|d         nd}|s.|rt          d| d          |                    d          \  }}	}|	                    d          s|dz  }t          ||          }|                    d          r
|dd          }t          | |||          S )Nhttpsr   r   )maxsplitzblob.core.windows.netzInvalid URL 'z'; unexpected host 'r   azz"'; expected 'https' or 'az' schemez'; expected account namer   r[  rX  rJ      z'; expected container name)r   r   r   schemer   rN   r   r  rO   r  r   r   r  )
r  r   r  
parsed_urlr0   hostr  r  r  r]   s
             rg   
join_pathsr  ,  s   &&s++JG##")//a/@@***HHHHHHIII +		d	"	"#KCKKKLLL CACAAABBB IIcAI&&EJJ!OOaI5zzQ588BD 7 	IGGGGHHH ' 1 1# 6 6	1g== T7##Ds ABBxgy$777rq   c                    
 t          |          \  }t          |          \  
}t          d|          t          
d|          dt          f 
f
d}t          j         |          }	|	j        dk    rt          d| d| d          |	j        t          k    rt          d	| d| d          d S )
Nr  r  r&   c                  X  
 t                               
f          } | }nt          |           \  }}t          dt	          d          d|t          j        	z             dd	d
t          f          }t          |t                              f                    S )Nr  r  r  rN  rO  r)   r.  )r&  r  zx-ms-source-ranger  rs  r  r}  )
r  r  r   r   r   r   r2  r   r   r  )r  copy_src_urlr]   r   r[  r  r  r  ro  rg  r  r  r  r  s       rg   r~  z&_put_block_from_url.<locals>.build_reqV  s     &//T]?[/\\	 "LL1iWMMMOL!Wh777"%$0%+%6UPT%U%U%U 
 %<=

 

 

 "*44$[R_D`4aa
 
 
 	
rq   rs  z?Source file/container or destination container not found: src='r  r   r  )r   r   r   r   r  r  r  r   )r  r  r  rg  r  r[  r  r  r~  r!  r  r  ro  r  r  r  s   ` `` `    @@@@@@rg   _put_block_from_urlr  L  s?    ,6c??(K+5c??(K%:mZbcccG%:mZbcccG
w 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4 !$	22D{c`c``Z]```
 
 	
 
/	/	/[[[UX[[[
 
 	
 
0	/rq   c                 N   t          | |          }|t          d| d          d }|j        t          j        |j                  }t          j        dd          }g }	|j        t          z  }
|
t          k    sJ t          | j        |
          }d}d}g }||j        k     rt          ||          }|                    t          | ||t          ||j        |z
            ||          }|                    |           |	                    |           |dz  }||z  }||j        k     |D ]}|                                 t%          |          \  }}}t'          |d||          }t)          | |||	||           |r)|'t          j        |                              d	          nd S )
Nry  r   r   r=  r   r  r  rS  r   )r&  r  rj  rm  r  r   r@  rg  rV  rk  rf  rE  r  rl  r  re  r*  r   r   r   r  rn  rz   )r  r]  r  r  r^  r_  r   r  r  r  min_block_sizerr  rR  r  rs  r[  rt  r  r  r  ro  s                        rg   parallel_remote_copyr  {  s    
D#		B	z Us U U UVVVJ	v'//
Ay))IIW 11N^++++D/@@I	AEG
"'//+Ay99sE3y"'E/3R3RTWYa
 
 	v"""	Q "'//   +5c??(K%:mZbcccG    	%1 	$$++F333rq   azure_access	azure_sas)r   )NNr  )qr   rm  r   concurrent.futures
concurrentr   rC  r   rT   rg  rK   r-  r   urllib.parser   typingr   r   r   r   r   r   r	   r
   urllib3blobfiler   r   r   r   blobfile._commonr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rk  rV  r  r{   rh   r   r   rm  r   r   rl  r   r   r   r   r  r  r  r"  r   r=  r\  rb  ro  r|   r  r  r  r  r  r  r  r  r   bytesr  r  r  r"  r;  rY  rs  Executorru  r&  rJ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ro   rq   rg   <module>r     s               				 				      P P P P P P P P P P P P P P P P P P P P  & & & & & &                                                 ( 
	  '  ,    /,*44:% % !P4S> P P P Pf0tCy 0 0 0 0,Zs Zc Z3 Z3 Z Z Z Z
 JP! !38!%(!9A#!! ! ! !H'G '5c? 'w ' ' ' 'T= WS#X. = S = U3:=N =  =  =  = @/S /U3S=1 / / / /	# 	#c3m 4 	# 	# 	# 	#
#3 
#5c3#7 
# 
# 
# 
#H H H# H# H H H H/S /S /s /s / / / /;v ; ; ;# ;# ; ; ; ;_F _# _$ _ _ _ _46g 46C 46C 46 46 46 46nwsCx( Xc]        3 5    GCH% $    $1
11 1 S/	1
 ~&1 
1 1 1 1h
#&14<A#s(Oc]   < eCHo $s)    &Eb
EbEb Eb 38	Eb
 ~&Eb eCJ Eb Eb Eb EbPLF L LsEz1B L L L L^(' ('c ('eCJ.? (' (' (' ('V3f 37 37Q 3 3 3 3 WC WC WC W W W W*
**&-c3h&7*()* * * *D6
6
6 
6 Cy	6
 6 c]6  6 6 6 6r c d    J )-*.+ +
+	+ + 738$
%	+
 WS#X&'+ d38n+ + + +B    -   DrF rF rF rF rF/ rF rF rFjG Gc G# GS Gs GVY G^b G G G G -O
-O )-O 
-O 
	-O
 -O #-O c]-O -O -O -O` EI   V 3 HSM XVZ^    (
 
s 
t 
 
 
 
&6 & &C &C &D & & & &RB BV B3 B8C= BHU]L^ B B B B QS QX Q Q Q QQs Q$ Q8 Q Q Q QC
CC+.C8?S8IChC C C C(3& 3 3c8E?.B(C 3 3 3 3   F  #  e  hsm  W[        F?& ? ? ? ? ? ?Yf Y3 YS Yd YxPS} Y Y Y Yx8V 8# 8 8 8 8 8 8@,

,
,
#&,
.1,
8;,
GJ,
	,
 ,
 ,
 ,
^5
5 )5 
5 
	5
 5 #5 c]5 5 5 5p $|$5~FF  L==   rq   