
    si
=                       S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr  SSKJrJr  SSKJrJr  SS	KJrJrJr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 J!r!  \(       a  SSK"J#r#  SSKJ$r$  SSKJ%r%J&r&  SSKJ'r'  \" SSSS9S7S j5       r(\
S8S j5       r)Sr* \
S8S j5       r+Sr, " S S\" S\,5      5      r-\
S9S  j5       rS:S! jr.S;S" jr/S<S# jr0S<S$ jr1S<S% jr2S=S& jr3\3r4S>S' jr5S?S( jr6S?S) jr7S@S* jr8SAS+ jr9\
SBS, j5       r:SCS- jr;    SDS. jr< " S/ S0\5      r=      SES1 jr>\
SFS2 j5       r?SGS3 jr@SHSIS4 jjrAS?S5 jrBS?S6 jrCg)JzCommon URL utilities.    )annotationsN)
namedtuple)cache)getpass)abspath
expanduser)TYPE_CHECKING
NamedTuple)quote
quote_plusunquoteunquote_plus)urlparse)
urlunparse   )
deprecated   )on_win)split_filenamestrip_pkg_extension)Iterable)Pattern)AnySelf)ParseResultz25.9z26.3zUse int(..., 16) instead.)addendumc                    [        U R                  5       5      n [        S5      n[        S5      n[        S5      n[        S5      nX:  a  X::  a  X-
  nU$ X:  a  X::  a	  X-
  S-   nU$ S nU$ )N09AF
   )ordupper)hoo0o9oAoFress         0lib/python3.13/site-packages/conda/common/url.pyhex_octal_to_intr,   $   s    	RXXZB	SB	SB	SB	SB 8 	  J 8 gl  J   J    c                2   SU ;  a  U $ / n[         R                  " SU [         R                  S9 H2  nUR                  UR	                  5       UR                  5       45        M4     [        U5      (       d  U $ SnSn[        U 5       Hv  u  pVUS:  a  US-  nM  UR                  S5      nUnUS:X  a>  U H8  nXXS   :X  d  M  [        R                  " S	[        XS-   US
-    S5      5      nSn  O   U(       d  Mr  X7-  nMx     [        R                  " U5      S   $ )N%z(%[0-9A-F]{2}))flagsr-   r   r   ascii   %B      r   )refinditer
IGNORECASEappendstartendlen	enumerateencodestructpackintcodecsutf_8_decode)	pathrangesmresultskipsicemitrs	            r+   percent_decoderM   5   s    $$&F[[*DFqwwy!%%'*+ Gv;; FE$19QJEHHW9!9!;;sCUQU0CR,HIDE	 
 4NF   v&q))r-   zfile://c                4  ^ U (       d  [        SU < 35      eU R                  [        5      (       a   U R                  S5        U $ [        [        U 5      5      R                  SS5      n SmU4S jn[        S U  5       5      (       aC  U" [        U S	5      (       a  U R                  S
5      O[        U S5      R                  S
5      5      n [        U 5      S:  a  U S   S:X  a  [        S-   U -   n U $ [        U -   n U $ ! [         a    [        SU < 35      ef = f)NzNot allowed: r1   z6Non-ascii not allowed for things claiming to be URLs: \/z!'()*-._/\:c                :   > SR                  U4S jU  5       5      $ )N c              3     >#    U  H?  nS [        U5      S 3U/US:  =(       a    UR                  5       =(       d    UT;      v   MA     g7f)r/   02X{N)r#   isalnum).0rJ   percent_encode_charss     r+   	<genexpr>0path_to_url.<locals>.<lambda>.<locals>.<genexpr>~   sI      'A SVCL	1a#g5!))+R>R9RSs   AA
)join)srX   s    r+   <lambda>path_to_url.<locals>.<lambda>~   s    rww ''  r-   c              3  >   #    U  H  n[        U5      S :  v   M     g7f)   N)r#   )rW   chars     r+   rY   path_to_url.<locals>.<genexpr>   s     
-3t9s   decodezunicode-escapezutf-8r   :)
ValueError
startswithfile_schemerc   UnicodeDecodeErrorr   r   replaceanyhasattrbytesr<   )rD   percent_encoderX   s     @r+   path_to_urlrn   c   s    =122{##	KK 
 :d#$,,T37D *N 
-
---tX&& KK()tW%,,-=>
 4y1}aCS 4' K T!KI " 	HQ 	s   C= =D)schemerD   queryfragmentusernamepasswordhostnameportc                     ^  \ rS rSrSr        S               SU 4S jjjr\SS j5       r\SS j5       rSS jr	SS jr
SS jr\SS	 j5       rS
rU =r$ )Url   a  
Object used to represent a Url. The string representation of this object is a url string.

This object was inspired by the urllib3 implementation as it gives you a way to construct
URLs from various parts. The motivation behind this object was making something that is
interoperable with built the `urllib.parse.urlparse` function and has more features than
the built-in `ParseResult` object.
c	                   > U(       a  UR                  S5      (       d  SU-   nU(       a  UR                  5       nU(       a  UR                  5       n[        T	U ]  XX#XEXgU5	      $ )NrP   )rf   lowersuper__new__)
clsro   rD   rp   rq   rr   rs   rt   ru   	__class__s
            r+   r|   Url.__new__   sX     ,,:D\\^F~~'Hwh(d
 	
r-   c                    U R                   (       a,  U R                  (       a  U R                    SU R                   3$ U R                   (       a  U R                   $ g Nrd   rr   rs   selfs    r+   authUrl.auth   s>    ==T]]mm_Admm_55]]==  r-   c                r    U R                   (       a  U R                   SU R                    3$ U R                  $ r   )ru   rt   r   s    r+   netloc
Url.netloc   s,    99mm_Adii[11}}r-   c                    U u  pp4pVpxSn	U(       a  X S3-  n	U(       a  U(       a
  X SU S3-  n	U(       a  X-  n	U(       a  U	SU 3-  n	U(       a  X-  n	U(       a  U	SU 3-  n	U(       a  U	SU 3-  n	U	$ )NrR   ://rd   @?# )
r   ro   rD   rp   rq   rr   rs   rt   ru   urls
             r+   __str__Url.__str__   s    LPIex8XS>!CZq
!,,COCQtf:CKCQug;CQxj>!C
r-   c                "    U R                  5       $ )z3Provide a public interface for namedtuple's _asdict)_asdictr   s    r+   as_dictUrl.as_dict   s    ||~r-   c                &    U R                   " S0 UD6$ )z4Provide a public interface for namedtuple's _replacer   )_replace)r   kwargss     r+   ri   Url.replace   s    }}&v&&r-   c           	     \    [          Vs0 s H  o"[        XS5      _M     nnU " S0 UD6$ s  snf )NrR   r   )	url_attrsgetattr)r}   parse_resultfldvaluess       r+   from_parse_resultUrl.from_parse_result   s2    AJK#w|"55K}V} Ls   )r   )NNNNNNNN)ro   
str | NonerD   r   rp   r   rq   r   rr   r   rs   r   rt   r   ru   r   )returnr   )r   str)r   zdict[str, str | None])r   r   )r   r   r   r   )__name__
__module____qualname____firstlineno____doc__r|   propertyr   r   r   r   ri   classmethodr   __static_attributes____classcell__)r~   s   @r+   rw   rw      s     " ####

 
 	

 
 
 
 
 
 
* ! !  
*'  r-   rw   c                    [         (       a(  U R                  S5      (       a  U R                  SS5        [        U 5      (       d  SU -   n [        R                  [        U 5      5      $ )Nzfile:rO   rP   z//)r   rf   ri   
has_schemerw   r   	_urlparser   s    r+   r   r      sJ    v#..))D#c??Sj  300r-   c                    [        U 5      nUR                  S:w  a  [        SU < S35      eUR                  UR                  p2X#4$ )zConvert an s3 url to a tuple of bucket and key.

Examples:
    >>> url_to_s3_info("s3://bucket-name.bucket/here/is/the/key")
    ('bucket-name.bucket', '/here/is/the/key')
s3zYou can only use s3: urls (not ))r   ro   re   rt   rD   )r   
parsed_urlbucketkeys       r+   url_to_s3_infor      sI     #JD :3'CDD%%zC;r-   c                d    U (       d  g [        U 5      R                  S:g  $ ! [         a     gf = f)zV
Examples:
    >>> is_url(None)
    False
    >>> is_url("s3://some/bucket")
    True
FrR   )r   ro   re   r   s    r+   is_urlr     s6     }##r)) s   " 
//c                x     [         R                  " U 5        U R                  S5      S:H  $ ! [         a     gf = f)z
Examples:
    >>> [is_ipv4_address(ip) for ip in ('8.8.8.8', '192.168.10.10', '255.255.255.255')]
    [True, True, True]
    >>> [is_ipv4_address(ip) for ip in ('8.8.8', '192.168.10.10.20', '256.255.255.255', '::1')]
    [False, False, False, False]
F.r4   )socket	inet_atonOSErrorcount	string_ips    r+   is_ipv4_addressr     s?    # ??31$$  s   , 
99c                p     [         R                  " [         R                  U 5        g! [         a     gf = f)z
Examples:
    >> [is_ipv6_address(ip) for ip in ('::1', '2001:db8:85a3::370:7334', '1234:'*7+'1234')]
    [True, True, True]
    >> [is_ipv6_address(ip) for ip in ('192.168.10.10', '1234:'*8+'1234')]
    [False, False]
FT)r   	inet_ptonAF_INET6r   r   s    r+   is_ipv6_addressr   #  s4    )4   s   %( 
55c                <    [        U 5      =(       d    [        U 5      $ )z
Examples:
    >> is_ip_address('192.168.10.10')
    True
    >> is_ip_address('::1')
    True
    >> is_ip_address('www.google.com')
    False
)r   r   r   s    r+   is_ip_addressr   2  s     9%C)CCr-   c                     U S   (       a  U S   R                  S5      (       a  SOSnUSR                  S S U  5        5       5      -   $ )Nr   rP   rR   c              3  6   #    U  H  o(       d  M  Uv   M     g 7fNr   )rW   ys     r+   rY   join.<locals>.<genexpr>A  s     N'H!AAA'Hs   
	c              3  T   #    U  H  o(       d  M  UR                  S 5      v   M      g7f)rP   N)strip)rW   xs     r+   rY   r   A  s     'Hdads   
(()rf   r[   )argsr:   s     r+   r[   r[   ?  sC    Aw$q'"4"4S"9"9CrE388N'Hd'HNNNNr-   c                0    [         R                  " SU 5      $ )Nz[a-z][a-z0-9]{0,11}://)r6   match)values    r+   r   r   G  s    88-u55r-   c                ,    U R                  SS5      S   $ )z
Examples:
    >>> strip_scheme("https://www.conda.io")
    'www.conda.io'
    >>> strip_scheme("s3://some.bucket/plus/a/path.ext")
    'some.bucket/plus/a/path.ext'
r   r   )splitr   s    r+   strip_schemer   K  s     99UAr""r-   c                T    [        U 5      u  pU(       a  U R                  USS5      $ U $ )Nz<TOKEN>r   )split_anaconda_tokenri   )r   _tokens      r+   mask_anaconda_tokenr   V  s(    #C(HA/43;;ui+=#=r-   c                    [         R                  " SU 5      nU(       a  UR                  5       S   OSnUb  U R                  SU-   SS5      OU nUR	                  S5      U4$ )a  
Examples:
    >>> split_anaconda_token("https://1.2.3.4/t/tk-123-456/path")
    (u'https://1.2.3.4/path', u'tk-123-456')
    >>> split_anaconda_token("https://1.2.3.4/t//path")
    (u'https://1.2.3.4/path', u'')
    >>> split_anaconda_token("https://some.domain/api/t/tk-123-456/path")
    (u'https://some.domain/api/path', u'tk-123-456')
    >>> split_anaconda_token("https://1.2.3.4/conda/t/tk-123-456/path")
    (u'https://1.2.3.4/conda/path', u'tk-123-456')
    >>> split_anaconda_token("https://1.2.3.4/path")
    (u'https://1.2.3.4/path', None)
    >>> split_anaconda_token("https://10.2.3.4:8080/conda/t/tk-123-45")
    (u'https://10.2.3.4:8080/conda', u'tk-123-45')
z/t/([a-zA-Z0-9-]*)r   Nz/t/rR   r   rP   )r6   searchgroupsri   rstrip)r   _token_matchr   cleaned_urls       r+   r   r   [  s_      992C8L(4L!!$$E7<7H#++eemR3cKc"E))r-   c                    [        U 5      R                  U5      nU(       a  UR                  5       S   OSnUb  UR                  SU-   SS5      OUnUR	                  S5      U4$ )z

Examples:
    >>> from conda.base.constants import KNOWN_SUBDIRS
    >>> split_platform(KNOWN_SUBDIRS, "https://1.2.3.4/t/tk-123/linux-ppc64le/path")
    (u'https://1.2.3.4/t/tk-123/path', u'linux-ppc64le')

r   NrP   rR   r   )_split_platform_rer   r   ri   r   )known_subdirsr   _platform_matchplatformr   s        r+   split_platformr   q  sd     )7>>sCO.=%%'*4H8@8L#++cHnb!4RUKc"H,,r-   c                    SR                  SR                  S U  5       5      5      n[        R                  " U[        R                  5      $ )Nz/({})(?:/|$)|c              3  &   #    U  H  o v   M	     g 7fr   r   )rW   ds     r+   rY   %_split_platform_re.<locals>.<genexpr>  s     1=aS'=s   )formatr[   r6   compiler8   )r   _platform_match_regexs     r+   r   r     s=    +22		1=11 ::+R]];;r-   c                    [        U 5      u  p#U(       d  g UR                  SS5      S   nXA;   =(       a    U=(       d    S $ )NrP   r   r   )r   rsplit)r   r   url_no_package_namer   maybe_a_platforms        r+   has_platformr     sB    +C0*11#q9"=,A1AITIr-   c                    U (       d  g[        U 5      u  p[        U5      n[        UR                  UR                  UR
                  UR                  S9n[        U5      UR                  UR                  U4$ )z
Examples:
    >>> split_scheme_auth_token("https://u:p@conda.io/t/x1029384756/more/path")
    ('conda.io/more/path', 'https', 'u:p', 'x1029384756')
    >>> split_scheme_auth_token(None)
    (None, None, None, None)
)NNNN)rt   ru   rD   rp   )
r   r   rw   rt   ru   rD   rp   r   ro   r   )r   r   r   	url_partsremainder_urls        r+   split_scheme_auth_tokenr     si     %-c2K%I##^^^^oo	M }y//FFr-   c                  p    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   S\S'   Srg)_SplitUrlPartsi  r   ro   r   r   r   package_filenamert   ru   rD   rp   r   N)r   r   r   r   __annotations__r   r   r-   r+   r   r     s8    
  

r-   r   c                N   [        U5      u  p#[        X5      u  p$[        U5      u  pVU(       a  SU;   a  UR                  SS5      OUS 4u  p'[	        U5      n[        UR                  UR                  UUUUR                  UR                  UR                  UR                  5	      $ )NrP   r   )r   r   r   r   r   r   ro   r   rt   ru   rD   rp   )	r   r   r   r   r   r   extr   r   s	            r+   split_conda_url_easy_partsr    s     .c2K*=FK -FA 3+% 	3"4  "K %I
 
r-   c                <    [        SU  S35      n[        S5      nX4$ )N
z proxy username: z
Password: )inputr   )ro   rr   passwds      r+   get_proxy_username_and_passr    s)    r&!234H\"Fr-   c                ^    [        U 5      n U R                  U[        USS9S9n[        U5      $ )z
Inserts `username` and `password` into provided `url`

>>> add_username_and_password('https://anaconda.org', 'TestUser', 'Password')
'https://TestUser:Password@anaconda.org'
rR   )safer   )r   ri   r   r   )r   rr   rs   url_with_auths       r+   add_username_and_passwordr    s2     3-CKKE(QS<TKUM}r-   c                   U(       d  U $ [        U 5      nUR                  (       a  UR                  (       a	  U(       d  U $ UR                  S5      n[	        U5      S:  a  UR                  US   US   S9n[        U5      $ )a^  Add auth if the url doesn't currently have it.

By default, does not replace auth if it already exists.  Setting ``force`` to ``True``
overrides this behavior.

Examples:
    >>> maybe_add_auth("https://www.conda.io", "user:passwd")
    'https://user:passwd@www.conda.io'
    >>> maybe_add_auth("https://www.conda.io", "")
    'https://www.conda.io'
rd   r   r   r   )r   rr   rs   r   r<   ri   r   )r   r   forcer   
auth_partss        r+   maybe_add_authr    sn     
Ii00
CJ
:%%z!}zRS}%U	y>r-   c                <    U (       a  [        [        U 5      5      $ U $ r   )r   remove_authr   s    r+   maybe_unquoter    s    -0<C()9c9r-   c                N    [        U 5      n U R                  SSS9n[        U5      $ )zRemove embedded authentication from URL.

.. code-block:: pycon

   >>> remove_auth("https://user:password@anaconda.com")
   'https://anaconda.com'
rR   r   )r   ri   r   )r   url_no_auths     r+   r  r    s*     3-C++rB+7K{r-   )r%   r   r   rA   )rD   r   r   r   )r   r   r   rw   )r   r   r   tuple[str, str])r   r   r   bool)r   r   r   r  )r   r   )r   r   r   r  )r   r   r   r   )r   r   )r   Iterable[str]r   r   r   r  )r   r  r   zPattern[str])r   r   r   r  r   zbool | None)r   r   r   z5tuple[str | None, str | None, str | None, str | None])r   r  r   r   r   r   )ro   r   r   r  )r   r   rr   r   rs   r   r   r   )F)r   r   r   r   r  r  r   r   )Dr   
__future__r   rB   r6   r   r?   collectionsr   	functoolsr   r   os.pathr   r   typingr	   r
   urllib.parser   r   r   r   r   r   r   _urlunparsedeprecationsr   compatr   rD   r   r   collections.abcr   r   r   r   r   r,   rM   rg   rn   r   rw   r   r   r   r   r   r[   join_urlr   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r-   r+   <module>r$     s    "  	   "   ' ,  / 2 %  5( ( FF%@A B  * *>  * *Z		L*UI
& L^ 1 1 %
DO
 6#>
*,- < <JG	G:G0	Z 	 '*:  	4:r-   