
    ǆi                     <   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSKrSSKJrJrJrJrJrJrJrJrJrJ r 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.  S
SK/J0r0J1r1  \Rd                  " S5      r3\Rd                  " S\Rh                  5      r5\Rd                  " S5      r6\Rd                  " S\Rh                  5      Rn                  r8SRs                  5       r:/ SQr;Sr<Sr=\=R}                  SR|                  " \R~                  6 \S9r@S rAS rBS rCS3S jrDS3S jrES3S jrFS\S4S jrGS rH\Rd                  " S\Rh                  5      rI \HS 5       rJ " S  S!5      rK " S" S#\K5      rL " S$ S%\5      rM\Rd                  " S&5      R                  rOS' rPS( rQS4S) jrRS* rS " S+ S,5      rT " S- S.\R                  5      rV\R                  R                  4S/ jrYS0 rZ\R" \<5      " \Y5      rYS1 r[S2 r\g)5z$PyPI and direct package downloading.    Nwraps)CHECKOUT_DISTDistributionBINARY_DISTnormalize_pathSOURCE_DISTEnvironmentfind_distributions	safe_namesafe_versionto_filenameRequirementDEVELOP_DISTEGG_DISTparse_version)log)DistutilsError)	translate)Wheelunique_everseen   )_read_utf8_with_fallback_cfg_read_utf8_with_fallbackz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz)PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_name   z<setuptools/{setuptools.__version__} Python-urllib/{py_major}z{}.{})py_major
setuptoolsc                 t     [         R                  " U 5      $ ! [         a  n[        SU < 35      UeS nAff = f)Nz/Not a URL, existing file, or requirement spec: )r   parse
ValueErrorr   )speces     h/home/dmtnaga/Documents/work/airagagent/rag_env/lib/python3.13/site-packages/setuptools/package_index.pyparse_requirement_argr)   G   s>      && CGI
	s    
727c                 f   U R                  5       nSu  p#nUR                  S5      (       a  UR                  S5      (       a  U SS nSnOeUR                  SS5      (       a  U S	S
 nU SS nSnOAUR                  S5      (       a  U SS nSnO#UR                  SS5      (       a  U S	S
 nU SS nSnX#U4$ )z=Return (base,pyversion) or (None,None) for possible .exe name)NNN.exez
.win32.exeNiwin32z	.win32-pyiiz.win-amd64.exeiz	win-amd64z.win-amd64-pyi)lowerendswith
startswith)namer.   basepy_verplats        r(   r   r   P   s     JJLE)D$~~f>>,'':DDk3//"R[F:DD^^,--:DDos33"R[F:DD    c                 b   [         R                  R                  U 5      nUu  p#pEpg[         R                  R                  UR	                  S5      S   5      nUS:X  a7  US:X  a1  [         R                  R                  UR	                  S5      S   5      nSU;   a  UR	                  SS5      u  pX4$ )N/zsourceforge.netdownload#r   )urllibr$   urlparseunquotesplit)	urlpartsschemeserverpath
parametersqueryfragmentr2   s	            r(   egg_info_for_urlrH   h   s    LL!!#&E8=5FDe<<

3 34D""tz'9||##DJJsOB$78
d{C+>r5   c              #      #    [        U 5      u  p#[        XU5       Sh  vN   U(       aD  [        R                  U5      nU(       a'  [	        XR                  S5      U[        S9 Sh  vN   ggg NP N	7f)zEYield egg or source distribution objects that might be found at a URLNr   )
precedence)rH   distros_for_locationEGG_FRAGMENTmatchr   groupr   )r@   metadatar2   rG   rM   s        r(   r   r   s   sl     %c*ND#Cx888""8,,[[^X-     9s"   A4A0AA4(A2)A42A4c                 b   UR                  S5      (       a  USS nUR                  S5      (       a  SU;   a  [        R                  " XU5      /$ UR                  S5      (       aP  SU;   aJ  [        U5      nUR	                  5       (       d  / $ [        U UR
                  UR                  [        S-   S9/$ UR                  S	5      (       a#  [        U5      u  pEnUb  [        XX%[        U5      $ [         H6  nUR                  U5      (       d  M  US[        U5      *  n[        XU5      s  $    / $ )
z:Yield egg or source distribution objects based on basename.egg.zipNr-   z.egg-z.whlr   )locationproject_nameversionrJ   r+   )r/   r   from_locationr   is_compatiblerT   rU   r   r   r   r   
EXTENSIONSlen)rS   basenamerO   wheelwin_baser3   platformexts           r(   rK   rK      s,   $$CR=  SH_**8xHII  SH_h""$$I!"//#a<
 	
   %8%B"((Hk8 
 S!!3s8),H(XFF  Ir5   c                 h    [        [        U 5      [        R                  R	                  U 5      U5      $ )zEYield possible egg or source distribution objects based on a filename)rK   r   osrD   rZ   )filenamerO   s     r(   distros_for_filenamerb      s*    x "''"2"28"<h r5   c           
   #   ^  #    UR                  S5      nU(       d  [        S USS  5       5      (       a  g[        [        U5      5       H  nXg   SS R	                  5       (       d  M    O   [        U5      n[        U USR                  USU 5      SR                  XgS 5      UUUS9v   g7f)zGenerate the interpretation of a source distro name

Note: if `location` is a filesystem filename, you should call
``pkg_resources.normalize_path()`` on it before passing it to this
routine!
rR   c              3   P   #    U  H  n[         R                  " S U5      v   M     g7f)z	py\d\.\d$N)rerM   ).0ps     r(   	<genexpr>(interpret_distro_name.<locals>.<genexpr>   s     KAbhh|Q77s   $&   Nr   )
py_versionrJ   r]   )r?   anyrangerY   isdigitr   join)rS   rZ   rO   rk   rJ   r]   rA   rg   s           r(   r   r      s      NN3E#KqrKKK 3u:8BQ<!!  J
rr s   A#B-)AB-c                 0   ^  [        T 5      U 4S j5       nU$ )zg
Wrap a function returning an iterable such that the resulting iterable
only ever yields unique items.
c                  &   > [        T" U 0 UD65      $ Nr   )argskwargsfuncs     r(   wrapperunique_values.<locals>.wrapper   s    tT4V455r5   r   )ru   rv   s   ` r(   unique_valuesrx      s"     4[6 6 Nr5   z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c           
   #     #    [         R                  U5       H  nUR                  5       u  p4[        [	        [
        R                  UR                  5       R                  S5      5      5      nSU;   d  SU;   d  Mc  [        R                  U5       H=  n[        R                  R                  U [        UR                  S5      5      5      v   M?     M     S Ht  nUR                  U5      nUS:w  d  M  [        R!                  X5      nU(       d  M:  [        R                  R                  U [        UR                  S5      5      5      v   Mv     g7f)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,homepager9   r   )z<th>Home Pagez<th>Download URLr8   N)RELfinditergroupssetmapstrstripr.   r?   HREFr<   r$   urljoin
htmldecoderN   findsearch)r@   pagerM   tagrelrelsposs          r(   find_external_linksr      s      d#<<>3syy#))+"3"3C"89:t!3s+ll**3
5;;q>0JKK ,	 $ 5iin"9KK*Eull**3
5;;q>0JKK 5s   A5E;A4E3E?Ec                   *    \ rS rSrSrS rS rS rSrg)ContentChecker   zH
A null content checker that defines the interface for checking content
c                     g)z#
Feed a block of data to the hash.
N selfblocks     r(   feedContentChecker.feed   s     	r5   c                     g)z3
Check the hash. Return False if validation fails.
Tr   r   s    r(   is_validContentChecker.is_valid   s     r5   c                     g)z]
Call reporter with information about the checker (hash name)
substituted into the template.
Nr   )r   reportertemplates      r(   reportContentChecker.report  s    
 	r5   r   N)	__name__
__module____qualname____firstlineno____doc__r   r   r   __static_attributes__r   r5   r(   r   r      s    r5   r   c                   `    \ rS rSr\R
                  " S5      rS r\S 5       r	S r
S rS rSrg	)
HashCheckeri
  zK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c                 R    Xl         [        R                  " U5      U l        X l        g rr   )	hash_namehashlibnewhashexpected)r   r   r   s      r(   __init__HashChecker.__init__  s    "KK	*	 r5   c                     [         R                  R                  U5      S   nU(       d
  [        5       $ U R                  R                  U5      nU(       d
  [        5       $ U " S0 UR                  5       D6$ )z5Construct a (possibly null) ContentChecker from a URLr8   r   )r<   r$   r=   r   patternr   	groupdict)clsr@   rG   rM   s       r(   from_urlHashChecker.from_url  s^     <<((-b1!##""8,!##'U__&''r5   c                 :    U R                   R                  U5        g rr   )r   updater   s     r(   r   HashChecker.feed   s    		r5   c                 P    U R                   R                  5       U R                  :H  $ rr   )r   	hexdigestr   r   s    r(   r   HashChecker.is_valid#  s    yy""$55r5   c                 .    X R                   -  nU" U5      $ rr   )r   )r   r   r   msgs       r(   r   HashChecker.report&  s    '}r5   )r   r   r   N)r   r   r   r   re   compiler   r   classmethodr   r   r   r   r   r   r5   r(   r   r   
  s=    jj	#G
!
 ( ( 6r5   r   c                   P  ^  \ rS rSrSr    S(U 4S jjrU 4S jrS)S jrS)S jrS)S jr	S r
S	 rS
 rS rS rS*S jrS rS*U 4S jjrS rS rS rS rS r    S+S jrS,S jrS rSrS rS rS*S jrS r\S 5       r S r!S r"S  r#S! r$S" r%\S# 5       r&S$ r'S% r(S& r)S'r*U =r+$ )-r   i+  z;A distribution index that scans web pages for download URLsc                 b  > [         TU ]  " U0 UD6  USS UR                  S5      (       +  -   U l        0 U l        0 U l        0 U l        [        R                  " SR                  [        [        U5      5      5      R                  U l        / U l        [        R                   R"                  U l        g )Nr7   |)superr   r/   	index_urlscanned_urlsfetched_urlspackage_pagesre   r   ro   r   r   rM   allowsto_scanr<   requesturlopenopener)r   r   hosts	ca_bundle
verify_sslrs   kw	__class__s          r(   r   PackageIndex.__init__.  s     	$%"%"S)Fy/A/A#/F+F%GGjj#i*?!@AGGnn,,r5   c                 n   >  [        UR                  5        [        TU ]  U5      $ ! [         a     g f = frr   )r   rU   	Exceptionr   add)r   distr   s     r(   r   PackageIndex.add@  s9    	$,,' w{4    		s   ' 
44c           	      N   XR                   ;   a  U(       d  gSU R                   U'   [        U5      (       d  U R                  U5        g[        [	        U5      5      nU(       a)  U R                  U5      (       d  gU R                  SU5        U(       d  U(       a  XR                  ;   a   [        [        U R                  U5      5        gU R                  U5      (       d  SU R                  U'   gU R                  SU5        SU R                  U'   SnU R                  XU-  5      nUc  g[        U[        R                  R                  5      (       a.  UR                   S:X  a  U R                  SUR"                  -  5        SU R                  UR$                  '   SUR&                  R)                  S	S
5      R+                  5       ;  a  UR-                  5         gUR$                  nUR/                  5       n[        U[0        5      (       db  [        U[        R                  R                  5      (       a  SnO$UR&                  R3                  S5      =(       d    SnUR5                  US5      nUR-                  5         [6        R9                  U5       HL  n	[        R:                  R=                  U[?        U	RA                  S5      5      5      n
U RC                  U
5        MN     URE                  U RF                  5      (       a$  [I        USS5      S:w  a  U RK                  X5      nggg)z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!i  zAuthentication error: %shtmlcontent-type zlatin-1charsetignorer   code  )&r   
URL_SCHEMEprocess_filenamelistr   url_okdebugr   r   r   infoopen_url
isinstancer<   error	HTTPErrorr   r   r@   headersgetr.   closereadr   	get_paramdecoder   r}   r$   r   r   rN   process_urlr0   r   getattrprocess_index)r   r@   retrievediststmplfr2   r   r   rM   links              r(   r   PackageIndex.process_urlI  s]   ###H!%##!!#&-.E{{3''

+S1C+<+<$<TXXu%&{{3%)Dc"		,$!%#MMM#cz*9a//00QVVs]II015589#'!%% ~r:@@BBGGIuuvvx$$$!V\\3344#))--i8EI;;w1D		]]4(E<<''jQ.HIDT" ) >>$..))ga.F#.M%%c0D /N)r5   c                 &   [         R                  R                  U5      (       d  U R                  SU5        g [         R                  R	                  U5      (       ar  U(       dk  [         R                  R                  U5      n[         R                  " U5       H2  nU R                  [         R                  R                  X45      S5        M4     [        U5      nU(       a2  U R                  SU5        [        [        U R                  U5      5        g g )NzNot found: %sTz	Found: %s)r`   rD   existswarnisdirrealpathlistdirr   ro   rb   r   r   r   r   )r   fnnestedrD   itemr   s         r(   r   PackageIndex.process_filename~  s    ww~~b!!IIor*77==V77##B'D

4(%%bggll4&>E ) %R(JJ{B'TXXu%& r5   c                 :   [        U5      nU=(       a"    UR                  S5      R                  5       S:H  nU(       d6  U R                  [        R
                  R                  U5      S   5      (       a  gSnU(       a  [        XQ-  5      eU R                  XQ5        g)Nr   fileTz
Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details).
F)	r   rN   r.   r   r<   r$   r=   r   r   )r   r@   fatalsis_filer   s         r(   r   PackageIndex.url_ok  s    sO4
((*f4dkk&,,"7"7"<Q"?@@W 	
  ++IIcr5   c                     [        [        R                  R                  U5      nS U 5       n[	        [
        R                  " U R                  U5      5        g )Nc              3      #    U  H>  n[         R                  " U5        H   nUR                  S 5      (       d  M  X4v   M"     M@     g7f)z	.egg-linkN)r`   r   r/   )rf   rD   entrys      r(   rh   .PackageIndex.scan_egg_links.<locals>.<genexpr>  s=      
D)~~k* TM) s
   4AA)filterr`   rD   r   r   	itertoolsstarmapscan_egg_link)r   search_pathdirs	egg_linkss       r(   scan_egg_linksPackageIndex.scan_egg_links  sB    bggmm[1

	 	Yt119=>r5   c           
         [        [        R                  R                  X5      5      n[	        [        S [        [        R                  UR                  5       5      5      5      n[        U5      S:w  a  g Uu  pV[        [        R                  R                  X5      5       HE  n[        R                  R                  " U/UQ76 Ul        [        Ul        U R                  U5        MG     g )Nrj   )r   r`   rD   ro   r   r  r   r   r   
splitlinesrY   r   rS   r	   rJ   r   )r   rD   r  contentlinesegg_path
setup_pathr   s           r(   r  PackageIndex.scan_egg_link  s    *277<<+DEVD#cii1C1C1E"FGHu:?$&rww||D'CDDGGLL66DM)DOHHTN Er5   c           	         SnUR                  U R                  5      (       d  U$ [        [        [        R
                  R                  U[        U R                  5      S  R                  S5      5      5      n[        U5      S:w  d	  SUS   ;   a  U$ [        US   5      n[        US   5      nSU R                  R                  UR                  5       0 5      U'   [        U5      [        U5      4$ )N)NNr7   rj   r;   r   r   T)r0   r   r   r   r<   r$   r>   rY   r?   r   r   r   
setdefaultr.   r   )r   r   NO_MATCH_SENTINELrA   pkgvers         r(   _scanPackageIndex._scan  s    &t~~..$$S--tC4G4I/J/P/PQT/UVWu:?cU1Xo$$ a!58$?C%%ciik26t<3S!111r5   c                 8   [         R                  U5       HK  n U R                  [        R                  R                  U[        UR                  S5      5      5      5        MM     U R                  U5      u  pEU(       d  g[        X5       Hd  n[        U5      u  pxUR                  S5      (       a-  U(       d&  U(       a  USU< SU< 3-  nOU R                  U5        U R                  U5        Mf     [        R                  S U5      $ ! [         a     GM  f = f)z#Process the contents of a PyPI pager   r   .pyz#egg=rR   c                 .    SU R                  SSS5      -  $ )Nz<a href="%s#md5=%s">%s</a>r      rj   )rN   )ms    r(   <lambda>,PackageIndex.process_index.<locals>.<lambda>  s    2QWWQ15EEr5   )r   r}   r$  r<   r$   r   r   rN   r%   r   rH   r/   need_version_infoscan_urlPYPI_MD5sub)	r   r@   r   rM   r"  r#  new_urlr2   frags	            r(   r   PackageIndex.process_index  s     ]]4(E

6<<//ZA5OPQ ) ::c? +35G)'2JD}}U##DsC88G**3/MM'" 6 ||Et
 	
%  s   AD


DDc                 (    U R                  SU5        g )NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allr   r@   s     r(   r-  PackageIndex.need_version_info  s     	
r5   c                     U R                   U R                  ;  a+  U(       a  U R                  " U/UQ76   U R                  S5        U R	                  U R                   5        g )Nz6Scanning index of all packages (this may take a while))r   r   r   r   r.  r   r   rs   s      r(   r5  PackageIndex.scan_all  sE    >>!2!22		#%%IINOdnn%r5   c                    U R                  U R                  UR                  -   S-   5        U R                  R	                  UR
                  5      (       d+  U R                  U R                  UR                  -   S-   5        U R                  R	                  UR
                  5      (       d  U R                  U5        [        U R                  R	                  UR
                  S5      5       H  nU R                  U5        M     g )Nr7   r   )	r.  r   unsafe_namer   r   keyrT   not_found_in_indexr   )r   requirementr@   s      r(   find_packagesPackageIndex.find_packages  s    dnn{'>'>>DE!!%%koo66MM$..;+C+CCcIJ!!%%koo66##K0**..{CDCMM# Er5   c                    > U R                  5         U R                  U5        XR                      H  nX1;   a  Us  $ U R                  SX5        M      [        TU ]  X5      $ )Nz%s does not match %s)prescanr@  r=  r   r   obtain)r   r?  	installerr   r   s       r(   rD  PackageIndex.obtain  sV    ;')D"JJ-{A * w~k55r5   c                 @   UR                  U R                  SU-  5        UR                  5       (       dj  UR                  5         [        R
                  " U5        [        UR                  R                  < S[        R                  R                  U5      < S35      eg)z
checker is a ContentChecker
zValidating %%s checksum for %sz validation failed for z; possible download problem?N)r   r   r   r   r`   unlinkr   r   r1   rD   rZ   )r   checkerra   tfps       r(   
check_hashPackageIndex.check_hash  sx     	tzz#Ch#NO!!IIKIIh  <<$$bgg&6&6x&@B  "r5   c                 
   U H}  nU R                   b?  [        U5      (       a/  UR                  S5      (       d  [        [	        U5      5      (       a  U R                  U5        Mb  U R                   R                  U5        M     g)z;Add `urls` to the list that will be prescanned for searchesNfile:)r   r   r0   r   r   r.  append)r   urlsr@   s      r(   add_find_linksPackageIndex.add_find_links  s`    C$!#>>'**,-- c" ##C( r5   c                     U R                   (       a)  [        [        U R                  U R                   5      5        SU l         g)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r   r   r   r.  r   s    r(   rC  PackageIndex.prescan(  s'    <<T]]DLL12r5   c                     XR                      (       a  U R                  Sp2OU R                  Sp2U" X1R                  5        U R	                  5         g )Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r=  r   r   r<  r5  )r   r?  methr   s       r(   r>  PackageIndex.not_found_in_index.  sB     		#H# 		E  	S))*r5   c                 z   [        U[        5      (       d  [        U5      nU(       aH  U R                  X5      n[	        U5      u  pVUR                  S5      (       a  U R                  XFU5      nU$ [        R                  R                  U5      (       a  U$ [        U5      n[        U R                  X5      SS5      $ )a  Locate and/or download `spec` to `tmpdir`, returning a local path

`spec` may be a ``Requirement`` object, or a string containing a URL,
an existing local filename, or a project/version requirement spec
(i.e. the string form of a ``Requirement`` object).  If it is the URL
of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one
that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is
automatically created alongside the downloaded file.

If `spec` is a ``Requirement`` object or a string containing a
project/version requirement spec, this method returns the location of
a matching distribution (possibly after downloading it to `tmpdir`).
If `spec` is a locally existing file or directory name, it is simply
returned unchanged.  If `spec` is a URL, it is downloaded to a subpath
of `tmpdir`, and the local filename is returned.  Various errors may be
raised if a problem occurs during downloading.
r'  rS   N)r   r   r   _download_urlrH   r/   	gen_setupr`   rD   r   r)   r   fetch_distribution)r   r&   tmpdirrB   foundr2   rG   s          r(   r9   PackageIndex.download9  s    $ $,,%F**48!1$!7=='' NN5FCE%%,T2t..t<j$OOr5   c                 "  ^ ^^^^	 T R                  SU5        [        5       m	SnS	UU U	UU4S jjnU(       a)  T R                  5         T R                  U5        U" U5      nU(       d  Ub  U" X5      nUc%  T R                  b  T R                  5         U" U5      nUc   U(       d  T R                  U5        U" U5      nUc&  T R                  ST=(       a    S=(       d    SU5        gT R                  SU5        UR                  UR                  S9$ )
a  Obtain a distribution suitable for fulfilling `requirement`

`requirement` must be a ``pkg_resources.Requirement`` instance.
If necessary, or if the `force_scan` flag is set, the requirement is
searched for in the (online) package index as well as the locally
installed packages.  If a distribution matching `requirement` is found,
the returned distribution's ``location`` is the value you would have
gotten from calling the ``download()`` method with the matching
distribution's URL or filename.  If no matching distribution is found,
``None`` is returned.

If the `source` flag is set, only source distributions and source
checkout links will be considered.  Unless the `develop_ok` flag is
set, development and system eggs (i.e., those using the ``.egg-info``
format) will be ignored.
zSearching for %sNc                   > Uc  TnXR                       H  nUR                  [        :X  a2  T(       d+  UT;  a#  TR                  SU5        TR	                  U5        MI  X ;   =(       a!    UR                  [
        :*  =(       d    T(       + nU(       d  M~  TR                  UR                  T	5      nXBl        [        R                  R                  UR                  5      (       d  M  Us  $    g )Nz&Skipping development or system egg: %s)r=  rJ   r   r   r   r	   r9   rS   download_locationr`   rD   r   )
reqenvr   testloc
develop_okr   skippedsourcer\  s
        r(   r   -PackageIndex.fetch_distribution.<locals>.findy  s    { GG??l2:7*		D   D){U;(F(Tf*4--v>C-0*ww~~d&<&<==# %" r5   z:No local packages or working download links found for %s%sza source distribution of r   zBest match: %s)rS   rr   )r   r   rC  r@  r   r   clonera  )
r   r?  r\  
force_scanrh  rf  local_indexr   r   rg  s
   ` ` ``   @r(   r[  PackageIndex.fetch_distribution[  s    4 			$k2%	 	0 LLN{+$D/1D<||'$D<
{+$D<IIL77=2
 II&-::t'='=:>>r5   c                 F    U R                  XX45      nUb  UR                  $ g)a  Obtain a file suitable for fulfilling `requirement`

DEPRECATED; use the ``fetch_distribution()`` method now instead.  For
backward compatibility, this routine is identical but returns the
``location`` of the downloaded distribution instead of a distribution
object.
N)r[  rS   )r   r?  r\  rk  rh  r   s         r(   fetchPackageIndex.fetch  s)     &&{JO== r5   c                     [         R                  U5      nU=(       a?    [        XR                  S5      S 5       Vs/ s H  nUR                  (       d  M  UPM     sn=(       d    / n[        U5      S:X  GaM  [        R                  R                  U5      n[        R                  R                  U5      U:w  a  [        R                  R                  X75      n[        R                  R                  U5      (       a$  [        R                  R                  X5      (       d  [        R                  " X5        Un[        [        R                  R                  US5      SSS9 n	U	R!                  SUS   R"                  < SUS   R                  < S	[        R                  R%                  U5      S   < S
35        S S S 5        U$ U(       a  ['        SU< SU< 35      e['        S5      es  snf ! , (       d  f       U$ = f)Nr   zsetup.pywzutf-8)encodingz(from setuptools import setup
setup(name=r   z
, version=z, py_modules=[z])
z9Can't unambiguously interpret project/version identifier zI; any dashes in the name or version should be escaped using underscores. zpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rL   rM   r   rN   rU   rY   r`   rD   rZ   dirnamero   r   samefileshutilcopy2openwriterT   splitextr   )
r   ra   rG   r\  rM   dr   rZ   dstr  s
             r(   rZ  PackageIndex.gen_setup  s   ""8,  /xQNNA99 N  	 u:?ww''1H wwx(F2ggll64s++0@0@0O0OLL/"Hbggll6:6gNRV

 a--a((((215 O O  &.u6  !G K$ ON Os   G)G)!AG..
G=i    c                 r   U R                  SU5        S n [        R                  U5      nU R                  U5      n[	        U[
        R                  R                  5      (       a+  [        SU< SUR                  < SUR                  < 35      eUR                  5       nSnU R                  nSnSU;   a=  UR                  S5      n	[        [        [        U	5      5      nU R!                  XXgU5        [#        US	5       n
 UR%                  U5      nU(       a;  UR'                  U5        U
R)                  U5        US
-  nU R!                  XXgU5        OOMV  U R+                  XBU
5        S S S 5        UU(       a  UR-                  5         $ $ ! , (       d  f       N(= f! U(       a  UR-                  5         f f = f)NzDownloading %szCan't download :  r   r8   zcontent-lengthzContent-Lengthwbr   )r   r   r   r   r   r<   r   r   r   r   r   dl_blocksizeget_allmaxr   int
reporthookrx  r   r   ry  rK  r   )r   r@   ra   fprI  r   blocknumbssizesizesrJ  r   s               r(   _download_toPackageIndex._download_to  sh   		"C(	!**3/Gs#B"fll4455$25rwwG  ggiGH""BD7*(893sE?+xTBh%GGBKEU+		%( AxTJ  37 & 
  &% 
 s%   C)F ?A*F)	F 
FF F6c                     g rr   r   )r   r@   ra   r  blksizer  s         r(   r  PackageIndex.reporthook  s    r5   c           	      4   UR                  S5      (       a  [        U5      $  [        XR                  5      $ ! [        [
        R                  R                  4 ap  nSR                  UR                   Vs/ s H  n[        U5      PM     Os  snf sn5      nU(       a  U R                  X%5         S nAg [        U< SU< 35      UeS nAf[        R                  R                   a  nUs S nA$ S nAf[        R                  R                    aJ  nU(       a   U R                  X#R"                  5         S nAg [        SU< SUR"                  < 35      UeS nAf[
        R                  R$                   aI  nU(       a   U R                  X#R&                  5         S nAg [        U< SUR&                  < 35      UeS nAf[
        R                  R(                  [*        4 a6  nU(       a  U R                  X#5         S nAg [        SU< SU< 35      UeS nAff = f)NrN  r  zDownload error for r  z7 returned a bad status line. The server might be down, )r0   
local_openopen_with_authr   r%   httpclient
InvalidURLro   rs   r   r   r   r<   r   r   URLErrorreasonBadStatusLinelineHTTPExceptionOSError)r   r@   warningvargr   s         r(   r   PackageIndex.open_url  s   >>'""c?"	T!#{{33DKK223 	B((7CH78C		'''$S%9:A||%% 	H||$$ 			'88,,$36A {{(( 			'66**$"%qvv/  ))73 	T		'%%$C%KLRSS		Tso   8 $HC5B

%C4C!H(C/)H/!H"E7E!H6"F:F::'H!H>HHc                 V   [        U5      u  p4U(       a1  SU;   a*  UR                  SS5      R                  SS5      nSU;   a  M*  OSnUR                  S5      (       a  US S n[        R                  R                  X#5      nU R                  X5      =(       d    U R                  X5      $ )Nz...\___downloaded__rQ   r-   )rH   replacer/   r`   rD   ro   _download_vcs_download_other)r   r@   r\  r1   rG   ra   s         r(   rY  PackageIndex._download_url4  s     *#.$,||D#.66tSA $, $D==$$9D77<<-!!#0WD4H4H4WWr5   c                     [         R                  R                  U 5      R                  nUR	                  S5      u  p#n[        SS/S/[        U5      -  -   5      n[        [        U1U-  5      S5      $ )z
>>> rvcs = PackageIndex._resolve_vcs
>>> rvcs('git+http://foo/bar')
'git'
>>> rvcs('hg+https://foo/bar')
'hg'
>>> rvcs('git:myhost')
'git'
>>> rvcs('hg:myhost')
>>> rvcs('http://foo/bar')
+svngithgN)	r<   r$   urlsplitrB   	partitionr   boolnextiter)r@   rB   preseppostalloweds         r(   _resolve_vcsPackageIndex._resolve_vcsE  sh     &&s+22))#.$uenvS	'99:D#)400r5   c                    U R                  U5      nU(       d  g US:X  a  [        SU 35      eUR                  S5      u  n  nU R                  U5      u  pU R	                  SU SU SU 35        [
        R                  " USSX/5        [        US	US
SU/USUSS	SUS/S9nUb,  U R	                  SU 35        [
        R                  " Xs   5        U$ )Nr  z/Invalid config, SVN download is not supported: r;   zDoing z clone from z to rj  z--quietz-Ccheckoutz--cwdupz-rz-q)r  r  zChecking out )r  r   r  _vcs_split_rev_from_urlr   
subprocess
check_calldict)r   r@   spec_filenamevcsra   r  revco_commandss           r(   r  PackageIndex._download_vcsX  s    $%< A#G  '005!Q//4		F3%|C5XJ?@sGYFGdHj)SAWhdD#tD
 ?IIcU+,!!+"23r5   c                 2   [         R                  R                  U5      R                  nUS:X  aF  [         R                  R                  [         R                  R                  U5      R                  5      $ U R                  US5        U R                  X5      $ )Nr  T)
r<   r$   r  rB   r   url2pathnamer=   rD   r   _attempt_download)r   r@   ra   rB   s       r(   r  PackageIndex._download_otherq  sm    &&s+22V>>..v||/D/DS/I/N/NOOC%%c44r5   c                 (    U R                  US5        g )NT)r   r6  s     r(   r.  PackageIndex.scan_urly  s    d#r5   c                     U R                  X5      nSUR                  SS5      R                  5       ;   a  U R                  XU5      $ U$ )Nr   r   r   )r  r   r.   _invalid_download_html)r   r@   ra   r   s       r(   r  PackageIndex._attempt_download|  sF    ##C2W[[4::<<..sXFFOr5   c                 J    [         R                  " U5        [        SU 35      e)NzUnexpected HTML page found at )r`   rH  r   )r   r@   r   ra   s       r(   r  #PackageIndex._invalid_download_html  s!    
		(=cUCDDr5   c                 H   [         R                  R                  U 5      nUR                  R	                  SS5      S   nUR
                  R                  S5      u  n  nUR                  S5      u  pVnU(       a  XW4OUS4u  pUR                  UUSS9R                  5       n
X4$ )	a  
Given a possible VCS URL, return a clean URL and resolved revision if any.

>>> vsrfu = PackageIndex._vcs_split_rev_from_url
>>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools')
('https://github.com/pypa/setuptools', 'v69.0.0')
>>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools')
('https://github.com/pypa/setuptools', None)
>>> vsrfu('http://foo/bar')
('http://foo/bar', None)
r  r   r8   r;   @Nr   )rB   rD   rG   )
r<   r$   r  rB   r?   rD   r  
rpartition_replacegeturl)r@   rA   clean_schemeno_fragment_pathr  r  r  r  
clean_pathr  resolveds              r(   r  $PackageIndex._vcs_split_rev_from_url  s     %%c*||))#q1"5 "'!5!5c!:!Q)44S9$),3+4,
>>	 " 

 &( 	 }r5   c                 2    [         R                  " U/UQ76   g rr   )r   r   r9  s      r(   r   PackageIndex.debug  s    		#r5   c                 2    [         R                  " U/UQ76   g rr   )r   r   r9  s      r(   r   PackageIndex.info      tr5   c                 2    [         R                  " U/UQ76   g rr   )r   r   r9  s      r(   r   PackageIndex.warn  r  r5   )r   r   r   r   r   r   r   )zhttps://pypi.org/simple/)*NT)Frr   )FFFN)FF),r   r   r   r   r   r   r   r   r   r   r  r  r$  r   r-  r5  r@  rD  rK  rQ  rC  r>  r9   r[  ro  rZ  r  r  r  r   rY  staticmethodr  r  r  r.  r  r  r  r   r   r   r   __classcell__r   s   @r(   r   r   +  s   E --$!31j'  ? 2 
:
&6)	 PL P?d,\ L"H TDX" 1 1$25$E  > r5   r   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                 P    U R                  S5      n[        R                  " U5      $ )Nr   )rN   r   unescape)rM   whats     r(   decode_entityr    s    ;;q>D==r5   c                 "    [        [        U 5      $ )z
Decode HTML entities in the given text.

>>> htmldecode(
...     'https://../package_name-0.1.2.tar.gz'
...     '?tokena=A&amp;tokenb=B">package_name-0.1.2.tar.gz')
'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz'
)
entity_subr  )texts    r(   r   r     s     mT**r5   c                    ^  U 4S jnU$ )Nc                    >^  U U4S jnU$ )Nc                     > [         R                  " 5       n[         R                  " T5         T" U 0 UD6[         R                  " U5        $ ! [         R                  " U5        f = frr   )socketgetdefaulttimeoutsetdefaulttimeout)rs   rt   old_timeoutru   timeouts      r(   _socket_timeout@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeout  sN     224K$$W-6T,V,((5((5s   A A$r   )ru   r  r  s   ` r(   r  'socket_timeout.<locals>._socket_timeout  s    	6 r5   r   )r  r  s   ` r(   socket_timeoutr    s    	 r5   c                     [         R                  R                  U 5      nUR                  5       n[        R
                  " U5      nUR                  5       nUR                  SS5      $ )a  
Encode auth from a URL suitable for an HTTP header.
>>> str(_encode_auth('username%3Apassword'))
'dXNlcm5hbWU6cGFzc3dvcmQ='

Long auth strings should not cause a newline to be inserted.
>>> long_auth = 'username:' + 'password'*10
>>> chr(10) in str(_encode_auth(long_auth))
False

r   )r<   r$   r>   encodebase64	b64encoder   r  )authauth_s
auth_bytesencoded_bytesencodeds        r(   _encode_authr    sR     \\!!$'FJ$$Z0M""$G??4$$r5   c                   *    \ rS rSrSrS rS rS rSrg)
Credentiali  z2
A username/password pair. Use like a namedtuple.
c                     Xl         X l        g rr   usernamepassword)r   r  r	  s      r(   r   Credential.__init__  s      r5   c              #   D   #    U R                   v   U R                  v   g 7frr   r  r   s    r(   __iter__Credential.__iter__  s     mmmms    c                     S[        U 5      -  $ )Nz%(username)s:%(password)s)varsr   s    r(   __str__Credential.__str__  s    *T$Z77r5   )r	  r  N)	r   r   r   r   r   r   r  r  r   r   r5   r(   r  r    s    !8r5   r  c                   D   ^  \ rS rSrU 4S jr\S 5       rS rS rSr	U =r
$ )
PyPIConfigi  c                 .  > [         R                  / SQS5      n[        TU ]  U5        [        R
                  R                  [        R
                  R                  S5      S5      n[        R
                  R                  U5      (       a  [        X5        gg)z
Load from ~/.pypirc
)r  r	  
repositoryr   ~z.pypircN)
r  fromkeysr   r   r`   rD   ro   
expanduserr   r   )r   defaultsrcr   s      r(   r   PyPIConfig.__init__  sf     ==!GL"WW\\"'',,S19=77>>"(2 r5   c                     U R                  5        Vs/ s H,  nU R                  US5      R                  5       (       d  M*  UPM.     nn[        [	        U R
                  U5      5      $ s  snf )Nr  )sectionsr   r   r  r   _get_repo_cred)r   sectionsections_with_repositoriess      r(   creds_by_repositoryPyPIConfig.creds_by_repository  sa      ==?&
*xx.446 * 	# &
 C++-GHII&
s   )A' A'c                     U R                  US5      R                  5       nU[        U R                  US5      R                  5       U R                  US5      R                  5       5      4$ )Nr  r  r	  )r   r   r  )r   r  repos      r(   r  PyPIConfig._get_repo_cred  s]    xx.446ZHHWj)//1HHWj)//1
 
 	
r5   c                 ~    U R                   R                  5        H  u  p#UR                  U5      (       d  M  Us  $    g)zt
If the URL indicated appears to be a repository defined in this
config, return the credential for that repository.
N)r!  itemsr0   )r   r@   r  creds       r(   find_credentialPyPIConfig.find_credential  s:    
 !% 8 8 > > @J~~j)) !A r5   r   )r   r   r   r   r   propertyr!  r  r)  r   r  r  s   @r(   r  r    s-    	3 J J
 r5   r  c                    [         R                  R                  U 5      nUu  p4pVpxUR                  S5      (       a  [        R
                  R                  S5      eUS;   a  [        U5      u  pOSn	U	(       dP  [        5       R                  U 5      nU(       a0  [        U5      n	UR                  U 4n[        R                  " S/UQ76   U	(       ae  S[        U	5      -   n	UW
XVXx4n[         R                  R                  U5      n[         R                   R#                  U5      nUR%                  SU	5        O[         R                   R#                  U 5      nUR%                  S[&        5        U" U5      nU	(       ah  [         R                  R                  UR(                  5      u  nnnnnnUU:X  a2  UW
:X  a,  UUUUUU4n[         R                  R                  U5      Ul        U$ )	z4Open a urllib2 request, handling HTTP authentication:znonnumeric port: '')r  httpsNz*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz
User-Agent)r<   r$   r=   r/   r  r  r  
_splituserr  r)  r   r  r   r   r  
urlunparser   Request
add_header
user_agentr@   )r@   r   parsedrB   netlocrD   paramsrF   r2  r  addressr(  r   rA   r1  r   r  s2h2path2param2query2frag2s                          r(   r  r  $  s    \\""3'F06-FD% skk$$%:;;"""6*g|++C0t9D==#%DHHAIDI,t,,u:,,))%0..((1?D1..((-|Z0	B 06||/D/DRVV/L,Bvvu<B'Mvvu<E\\,,U3BFIr5   c                 F    U R                  S5      u  pn U(       a  X4$ SU 4$ )zJsplituser('user[:passwd]@host[:port]')
--> 'user[:passwd]', 'host[:port]'.r  N)r  )hostuserdelims      r(   r0  r0  S  s,     ,DD**td**r5   c                     U $ rr   r   )r@   s    r(   
fix_sf_urlrD  ^  s    Jr5   c                 |   [         R                  R                  U 5      u  pp4pV[         R                  R	                  U5      n[
        R                  R                  U5      (       a  [         R                  R                  U 5      $ UR                  S5      (       a  [
        R                  R                  U5      (       a  / n[
        R                  " U5       H|  n	[
        R                  R                  Xy5      n
U	S:X  a  [        U
5      n  Ol[
        R                  R                  U
5      (       a  U	S-  n	UR                  SR                  U	S95        M~     SnUR                  U SR                  U5      S9nSu  pOS	u  pnS
S0n[         R"                  " U5      n[         R$                  R'                  XXU5      $ )z7Read a local path, with special support for directoriesr7   z
index.htmlz<a href="{name}">{name}</a>)r1   zB<html><head><title>{url}</title></head><body>{files}</body></html>r  )r@   files)   OK)r   zPath not foundz	Not foundr   z	text/html)r<   r$   r=   r   r  r`   rD   isfiler   r/   r   r   ro   r   rO  formatioStringIOr   r   )r@   rB   rC   rD   paramrF   r2  ra   rF  r   filepathbodyr   statusmessager   body_streams                    r(   r  r  b  sW   /5||/D/DS/I,FD~~**40H	ww~~h~~%%c**	s		h 7 7H%Aww||H0HL /9x((SLL6==1=EF & XD;;3dii.>;?D# B{+G++d#K<<!!#wMMr5   rr   )r    )]r   sysr  r`   re   rK  rv  r  r  r   r  configparserr   http.clientr  urllib.parser<   urllib.requesturllib.error	functoolsr   r"   pkg_resourcesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   	distutilsr   distutils.errorsr   fnmatchr   setuptools.wheelr    setuptools.extern.more_itertoolsr   unicode_utilsr   r   r   rL   Ir   r/  rM   r   r?   rX   __all___SOCKET_TIMEOUT_tmplrJ  version_infor4  r)   r   rH   r   rK   rb   r   rx   r|   r   r   r   r   r0  r  r  r   r  r  r  RawConfigParserr  r   r   r  r0  rD  r  r   r5   r(   <module>rg     s   * 
  	 	 	                   +  " < Q zz67	zz3RTT:::J ZZ,bdd399
.446
 F\\^^S--.:  

0	 F .2kTXD
 	jjKRTTR
 L L$ 2. BC
; C
P ZZ<=AA

	+%*8 8"%-- %P  &~~55 +^+  0@Nr5   