§
    �’jÀB  ã                  óþ  — d Z ddlm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 ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lm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' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z:m;Z;  e	j<        e=¦  «        Z>ee?e?f         Z@dMd„ZA G d„ deB¦  «        ZCdNd!„ZD G d"„ d#eB¦  «        ZEdOd&„ZF	 dPdQd*„ZGdRd-„ZH G d.„ d/¦  «        ZI G d0„ d1e¦  «        ZJdSd3„ZKeKdTd7„¦   «         ZL ed8¬9¦  «         G d:„ d5¦  «        ¦   «         ZM G d;„ d<e¦  «        ZN	 dUdVdC„ZO	 dWdXdE„ZPd'dFœdYdH„ZQ G dI„ dJe¦  «        ZR G dK„ dL¦  «        ZSdS )ZzO
The main purpose of this module is to expose LinkCollector.collect_sources().
é    )ÚannotationsN)ÚCallableÚIterableÚMutableMappingÚSequence)Ú	dataclass)Ú
HTMLParser)ÚValues)Ú
NamedTupleÚProtocol)Úcanonicalize_name)ÚResponse)Ú
RetryError)ÚConnectionFailedErrorÚConnectionTimeoutErrorÚNetworkConnectionErrorÚProxyConnectionErrorÚSSLMissingErrorÚSSLVerificationError)ÚLink)ÚSearchScope)Ú
PipSession)Úraise_for_status)Úis_archive_file©Úredact_auth_from_url)Úurl_to_path)Úvcsé   )ÚCandidatesFromPageÚ
LinkSourceÚbuild_sourceÚurlÚstrÚreturnú
str | Nonec                ó¨   — t           j        D ]D}|                      ¦   «                              |¦  «        r| t	          |¦  «                 dv r|c S ŒEdS )zgLook for VCS schemes in the URL.

    Returns the matched VCS scheme, or None if there's no match.
    z+:N)r   ÚschemesÚlowerÚ
startswithÚlen)r#   Úschemes     úKC:\Projects\DSCons\.venv\Lib\site-packages\pip\_internal\index\collector.pyÚ_match_vcs_schemer.   4   sW   € õ
 ”+ð ð ˆØ�9Š9‰;Œ;×!Ò! &Ñ)Ô)ð 	¨cµ#°f±+´+Ô.>À$Ð.FÐ.FØˆMˆMˆMøØˆ4ó    c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )Ú_NotAPIContentÚcontent_typer$   Úrequest_descr%   ÚNonec                óh   •— t          ¦   «                              ||¦  «         || _        || _        d S ©N)ÚsuperÚ__init__r2   r3   )Úselfr2   r3   Ú	__class__s      €r-   r8   z_NotAPIContent.__init__@   s3   ø€ Ý‰Œ×Ò˜ |Ñ4Ô4Ð4Ø(ˆÔØ(ˆÔÐÐr/   )r2   r$   r3   r$   r%   r4   )Ú__name__Ú
__module__Ú__qualname__r8   Ú__classcell__©r:   s   @r-   r1   r1   ?   s=   ø€ € € € € ð)ð )ð )ð )ð )ð )ð )ð )ð )ð )r/   r1   Úresponser   r4   c                óÂ   — | j                              dd¦  «        }|                     ¦   «         }|                     d¦  «        rdS t	          || j        j        ¦  «        ‚)z°
    Check the Content-Type header to ensure the response contains a Simple
    API Response.

    Raises `_NotAPIContent` if the content type is not a valid content-type.
    úContent-TypeÚUnknown)z	text/htmlz#application/vnd.pypi.simple.v1+htmlú#application/vnd.pypi.simple.v1+jsonN)ÚheadersÚgetr)   r*   r1   ÚrequestÚmethod)r@   r2   Úcontent_type_ls      r-   Ú_ensure_api_headerrJ   F   sg   € ð Ô#×'Ò'¨¸	ÑBÔB€Là!×'Ò'Ñ)Ô)€NØ× Ò ð	
ñô ð ð 	ˆå
˜ xÔ'7Ô'>Ñ
?Ô
?Ð?r/   c                  ó   — e Zd ZdS )Ú_NotHTTPN)r;   r<   r=   © r/   r-   rL   rL   \   s   € € € € € Ø€Dr/   rL   Úsessionr   c                óÞ   — t           j                             | ¦  «        \  }}}}}|dvrt          ¦   «         ‚|                     | d¬¦  «        }t          |¦  «         t          |¦  «         dS )zõ
    Send a HEAD request to the URL, and ensure the response contains a simple
    API Response.

    Raises `_NotHTTP` if the URL is not available for a HEAD request, or
    `_NotAPIContent` if the content type is not a valid content type.
    >   ÚhttpÚhttpsT)Úallow_redirectsN)ÚurllibÚparseÚurlsplitrL   Úheadr   rJ   )r#   rN   r,   ÚnetlocÚpathÚqueryÚfragmentÚresps           r-   Ú_ensure_api_responser\   `   sq   € õ -3¬L×,AÒ,AÀ#Ñ,FÔ,FÑ)€FˆF�D˜% ØÐ&Ð&Ð&Ý‰jŒjÐà�<Š<˜¨Tˆ<Ñ2Ô2€DÝ�TÑÔÐå�tÑÔÐÐÐr/   FÚforce_revalidateÚboolc                ó  — t          t          | ¦  «        j        ¦  «        rt          | |¬¦  «         t                               dt          | ¦  «        ¦  «         dd                     g d¢¦  «        i}|rt                               d¦  «         d|d<   |                     | |¬	¦  «        }t          |¦  «         t          |¦  «         t                               d
t          | ¦  «        |j                             dd¦  «        ¦  «         |S )aY  Access an Simple API response with GET, and return the response.

    This consists of three parts:

    1. If the URL looks suspiciously like an archive, send a HEAD first to
       check the Content-Type is HTML or Simple API, to avoid downloading a
       large file. Raise `_NotHTTP` if the content type cannot be determined, or
       `_NotAPIContent` if it is not HTML or a Simple API.
    2. Actually perform the request. Raise HTTP exceptions on network failures.
    3. Check the Content-Type header to make sure we got a Simple API response,
       and raise `_NotAPIContent` otherwise.
    )rN   zGetting page %sÚAcceptz, )rD   z*application/vnd.pypi.simple.v1+html; q=0.1ztext/html; q=0.01z"Refreshing package index response.z	max-age=0zCache-Control)rE   zFetched page %s as %srB   rC   )r   r   Úfilenamer\   ÚloggerÚdebugr   ÚjoinrF   r   rJ   rE   )r#   rN   r]   rE   r[   s        r-   Ú_get_simple_responsere   r   s  € õ" •t˜C‘y”yÔ)Ñ*Ô*ð 3Ý˜S¨'Ð2Ñ2Ô2Ð2å
‡L‚LÐ"Õ$8¸Ñ$=Ô$=Ñ>Ô>Ð>ð 	�$—)’)ðð ð ñ
ô 
ð€Gð ð /õ 	�ŠÐ9Ñ:Ô:Ð:Ø#.ˆ�Ñ à�;Š;�s Gˆ;Ñ,Ô,€DÝ�TÑÔÐõ �tÑÔÐå
‡L‚LØÝ˜SÑ!Ô!ØŒ×Ò˜¨Ñ3Ô3ñô ð ð €Kr/   rE   ÚResponseHeadersc                ó°   — | rSd| v rOt           j                             ¦   «         }| d         |d<   |                     d¦  «        }|rt	          |¦  «        S dS )z=Determine if we have any encoding information in our headers.rB   zcontent-typeÚcharsetN)ÚemailÚmessageÚMessageÚ	get_paramr$   )rE   Úmrh   s      r-   Ú_get_encoding_from_headersrn   ­   s`   € àð  �> WÐ,Ð,ÝŒM×!Ò!Ñ#Ô#ˆØ# NÔ3ˆˆ.ÑØ—+’+˜iÑ(Ô(ˆØð 	 Ý�w‘<”<ÐØˆ4r/   c                  ó&   — e Zd Zdd„Zdd	„Zdd„ZdS )ÚCacheablePageContentÚpageÚIndexContentr%   r4   c                ó&   — |j         sJ ‚|| _        d S r6   )Úcache_link_parsingrq   ©r9   rq   s     r-   r8   zCacheablePageContent.__init__¹   s   € ØÔ&Ð&Ð&Ð&ØˆŒ	ˆ	ˆ	r/   ÚotherÚobjectr^   c                óp   — t          |t          | ¦  «        ¦  «        o| j        j        |j        j        k    S r6   )Ú
isinstanceÚtyperq   r#   )r9   rv   s     r-   Ú__eq__zCacheablePageContent.__eq__½   s*   € Ý˜%¥ d¡¤Ñ,Ô,ÐP°´´À%Ä*Ä.Ò1PÐPr/   Úintc                ó4   — t          | j        j        ¦  «        S r6   )Úhashrq   r#   ©r9   s    r-   Ú__hash__zCacheablePageContent.__hash__À   s   € Ý�D”I”MÑ"Ô"Ð"r/   N)rq   rr   r%   r4   )rv   rw   r%   r^   )r%   r|   )r;   r<   r=   r8   r{   r€   rM   r/   r-   rp   rp   ¸   sT   € € € € € ðð ð ð ðQð Qð Qð Qð#ð #ð #ð #ð #ð #r/   rp   c                  ó   — e Zd Zdd„ZdS )Ú
ParseLinksrq   rr   r%   úIterable[Link]c                ó   — d S r6   rM   ru   s     r-   Ú__call__zParseLinks.__call__Å   s   € € € r/   N©rq   rr   r%   rƒ   )r;   r<   r=   r…   rM   r/   r-   r‚   r‚   Ä   s   € € € € € ØAÐAÐAÐAÐAÐAr/   r‚   Úfnc                ó|   ‡ ‡— t           j        d	ˆ fd„¦   «         Št          j        ‰ ¦  «        d
ˆ ˆfd„¦   «         }|S )zÚ
    Given a function that parses an Iterable[Link] from an IndexContent, cache the
    function's result (keyed by CacheablePageContent), unless the IndexContent
    `page` has `page.cache_link_parsing == False`.
    Úcacheable_pagerp   r%   ú
list[Link]c                ó>   •— t           ‰| j        ¦  «        ¦  «        S r6   )Úlistrq   )r‰   r‡   s    €r-   Úwrapperz*with_cached_index_content.<locals>.wrapperÏ   s   ø€ å�B�B�~Ô*Ñ+Ô+Ñ,Ô,Ð,r/   rq   rr   c                ór   •— | j         r ‰t          | ¦  «        ¦  «        S t           ‰| ¦  «        ¦  «        S r6   )rt   rp   rŒ   )rq   r‡   r�   s    €€r-   Úwrapper_wrapperz2with_cached_index_content.<locals>.wrapper_wrapperÓ   s;   ø€ àÔ"ð 	7Ø�7Õ/°Ñ5Ô5Ñ6Ô6Ð6Ý�B�B�t‘H”H‰~Œ~Ðr/   )r‰   rp   r%   rŠ   )rq   rr   r%   rŠ   )Ú	functoolsÚcacheÚwraps)r‡   r�   r�   s   ` @r-   Úwith_cached_index_contentr“   È   sr   øø€ õ „_ð-ð -ð -ð -ð -ñ „_ð-õ „_�RÑÔðð ð ð ð ð ñ Ôðð
 Ðr/   rq   rr   rƒ   c              #  ó  K  — | j                              ¦   «         }|                     d¦  «        rUt          j        | j        ¦  «        }|                     dg ¦  «        D ]#}t          j        || j	        ¦  «        }|€Œ|V — Œ$dS t          | j	        ¦  «        }| j        pd}|                     | j                             |¦  «        ¦  «         | j	        }|j        p|}|j        D ] }	t          j        |	||¬¦  «        }|€Œ|V — Œ!dS )z\
    Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
    rD   ÚfilesNzutf-8)Úpage_urlÚbase_url)r2   r)   r*   ÚjsonÚloadsÚcontentrF   r   Ú	from_jsonr#   ÚHTMLLinkParserÚencodingÚfeedÚdecoder—   ÚanchorsÚfrom_element)
rq   rI   ÚdataÚfileÚlinkÚparserr�   r#   r—   Úanchors
             r-   Úparse_linksr§   Ü   s!  è è € ð Ô&×,Ò,Ñ.Ô.€NØ× Ò Ð!FÑGÔGð ÝŒz˜$œ,Ñ'Ô'ˆØ—H’H˜W bÑ)Ô)ð 	ð 	ˆDÝ”> $¨¬Ñ1Ô1ˆDØˆ|ØØˆJˆJˆJˆJØˆå˜DœHÑ%Ô%€FØŒ}Ð' €HØ
‡K‚K�”×#Ò# HÑ-Ô-Ñ.Ô.Ð.à
Œ(€CØŒÐ% #€HØ”.ð ð ˆÝÔ  °#ÀÐIÑIÔIˆØˆ<ØØˆ
ˆ
ˆ
ˆ
ð	ð r/   T)Úfrozenc                  óR   — e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   dd„ZdS )rr   aŒ  Represents one response (or page), along with its URL.

    :param encoding: the encoding to decode the given content.
    :param url: the URL from which the HTML was downloaded.
    :param cache_link_parsing: whether links parsed from this page's url
                               should be cached. PyPI index urls should
                               have this set to False, for example.
    Úbytesrš   r$   r2   r&   r�   r#   Tr^   rt   r%   c                ó*   — t          | j        ¦  «        S r6   )r   r#   r   s    r-   Ú__str__zIndexContent.__str__
  s   € Ý# D¤HÑ-Ô-Ð-r/   N)r%   r$   )r;   r<   r=   Ú__doc__Ú__annotations__rt   r¬   rM   r/   r-   rr   rr   ù   sr   € € € € € € ðð ð €N€N�NØÐÐÑØÐÐÑØ€H€H�HØ#ÐÐ#Ð#Ð#Ñ#ð.ð .ð .ð .ð .ð .r/   c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd
„Zdd„Zˆ xZS )rœ   zf
    HTMLParser that keeps the first base HREF and a list of all anchor
    elements' attributes.
    r#   r$   r%   r4   c                óv   •— t          ¦   «                              d¬¦  «         || _        d | _        g | _        d S )NT)Úconvert_charrefs)r7   r8   r#   r—   r    )r9   r#   r:   s     €r-   r8   zHTMLLinkParser.__init__  s7   ø€ Ý‰Œ×Ò¨$ÐÑ/Ô/Ð/àˆŒØ$(ˆŒØ46ˆŒˆˆr/   ÚtagÚattrsúlist[tuple[str, str | None]]c                óÂ   — |dk    r)| j         €"|                      |¦  «        }|�	|| _         d S d S |dk    r)| j                             t	          |¦  «        ¦  «         d S d S )NÚbaseÚa)r—   Úget_hrefr    ÚappendÚdict)r9   r²   r³   Úhrefs       r-   Úhandle_starttagzHTMLLinkParser.handle_starttag  sn   € Ø�&Š=ˆ=˜Tœ]Ð2Ø—=’= Ñ'Ô'ˆDØÐØ $�”��ð  Ðà�CŠZˆZØŒL×Ò¥ U¡¤Ñ,Ô,Ð,Ð,Ð,ð ˆZr/   r&   c                ó*   — |D ]\  }}|dk    r|c S Œd S )Nr»   rM   )r9   r³   ÚnameÚvalues       r-   r¸   zHTMLLinkParser.get_href#  s1   € Ø ð 	ð 	‰KˆD�%Ø�vŠ~ˆ~Ø���ð àˆtr/   )r#   r$   r%   r4   )r²   r$   r³   r´   r%   r4   )r³   r´   r%   r&   )r;   r<   r=   r­   r8   r¼   r¸   r>   r?   s   @r-   rœ   rœ     so   ø€ € € € € ðð ð
7ð 7ð 7ð 7ð 7ð 7ð-ð -ð -ð -ðð ð ð ð ð ð ð r/   rœ   r¤   r   Úreasonústr | ExceptionÚmethúCallable[..., None] | Nonec                ó<   — |€t           j        } |d| |¦  «         d S )Nz%Could not fetch URL %s: %s - skipping)rb   rc   )r¤   rÀ   rÂ   s      r-   Ú_handle_get_simple_failrÅ   *  s+   € ð
 €|ÝŒ|ˆØ€DÐ	0°$¸Ñ?Ô?Ð?Ð?Ð?r/   rt   c                ó|   — t          | j        ¦  «        }t          | j        | j        d         || j        |¬¦  «        S )NrB   )r�   r#   rt   )rn   rE   rr   rš   r#   )r@   rt   r�   s      r-   Ú_make_index_contentrÇ   4  sG   € õ *¨(Ô*:Ñ;Ô;€HÝØÔØÔ˜Ô(ØØŒLØ-ðñ ô ð r/   )r]   úIndexContent | Nonec               óÎ  — | j                              dd¦  «        d         }t          |¦  «        }|rt                               d|| ¦  «         d S |                     d¦  «        r�t          j                             t          |¦  «        ¦  «        rU| 
                    d¦  «        s|dz  }t          j                             |d¦  «        }t                               d|¦  «         	 t          |||¬	¦  «        }t!          || j        ¬
¦  «        S # t$          $ r t                               d| ¦  «         Y �n-t&          $ r1}t                               d| |j        |j        ¦  «         Y d }~nød }~wt,          t.          f$ r}t1          | |¦  «         Y d }~nÏd }~wt2          t4          f$ r0}d|j        › �}t1          | |t          j        ¬¦  «         Y d }~n�d }~wt:          $ r"}t1          | d|j        › �¦  «         Y d }~nfd }~wt<          $ r"}t1          | d|j        › �¦  «         Y d }~n<d }~wt>          $ r,}t1          | tA          |j        ¦  «        ¦  «         Y d }~nd }~ww xY wd S )Nú#r   r   zICannot look at %s URL %s because it does not support lookup as web pages.zfile:ú/z
index.htmlz# file: URL is directory, getting %s©rN   r]   )rt   z`Skipping page %s because it looks like an archive, and cannot be checked by a HTTP HEAD request.zºSkipping page %s because the %s request got Content-Type: %s. The only supported Content-Types are application/vnd.pypi.simple.v1+json, application/vnd.pypi.simple.v1+html, and text/htmlz4There was a problem confirming the ssl certificate: )rÂ   zconnection error: zproxy connection error: )!r#   Úsplitr.   rb   Úwarningr*   ÚosrX   Úisdirr   ÚendswithrS   rT   Úurljoinrc   re   rÇ   rt   rL   r1   r3   r2   r   r   rÅ   r   r   ÚcontextÚinfor   r   r   r$   )r¤   rN   r]   r#   Ú
vcs_schemer[   ÚexcrÀ   s           r-   Ú_get_index_contentr×   A  s  € ð Œ(�.Š.˜˜aÑ
 Ô
  Ô
#€Cõ # 3Ñ'Ô'€JØð Ý�ŠØWØØñ	
ô 	
ð 	
ð
 ˆtð ‡~‚~�gÑÔð 
A¥2¤7§=¢=µ¸SÑ1AÔ1AÑ#BÔ#Bð 
Að �|Š|˜CÑ Ô ð 	Ø�3‰JˆCõ
 Œl×"Ò" 3¨Ñ5Ô5ˆÝ�ŠÐ:¸CÑ@Ô@Ð@ðUÝ#Ø˜Ð3Cð
ñ 
ô 
ˆõ< # 4¸DÔ<SÐTÑTÔTÐTøõ7 ð 
ð 
ð 
Ý�Šð1àñ	
ô 	
ð 	
ð 	
ñ 	
õ
 ð 
ð 
ð 
Ý�ŠðAð ØÔØÔñ	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøõ Õ.Ð/ð +ð +ð +Ý  cÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*øøøøÝ ¥/Ð2ð @ð @ð @ØUÈÌÐUÐUˆÝ  fµ6´;Ð?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøÝ ð Jð Jð JÝ Ð&H¸3¼;Ð&HÐ&HÑIÔIÐIÐIÐIÐIÐIÐIøøøøÝð Pð Pð PÝ Ð&NÀÄÐ&NÐ&NÑOÔOÐOÐOÐOÐOÐOÐOøøøøÝ!ð 8ð 8ð 8Ý ¥c¨#¬+Ñ&6Ô&6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð8øøøð ˆ4sZ   Ã(D Ä%I"Ä8	I"Å'E-Å-I"ÆFÆI"Æ*&GÇI"Ç"G?Ç?I"ÈH)È)I"È6"IÉI"c                  ó$   — e Zd ZU ded<   ded<   dS )ÚCollectedSourceszSequence[LinkSource | None]Ú
find_linksÚ
index_urlsN)r;   r<   r=   r®   rM   r/   r-   rÙ   rÙ   ƒ  s*   € € € € € € Ø+Ð+Ð+Ñ+Ø+Ð+Ð+Ñ+Ð+Ð+r/   rÙ   c                  ób   — e Zd ZdZdd„Ze	 dd d„¦   «         Zed!d„¦   «         Z	 d"d#d„Z	d$d„Z
dS )%ÚLinkCollectorzµ
    Responsible for collecting Link objects from all configured locations,
    making network requests as needed.

    The class's main method is its collect_sources() method.
    rN   r   Úsearch_scoper   r%   r4   c                ó"   — || _         || _        d S r6   )rÞ   rN   )r9   rN   rÞ   s      r-   r8   zLinkCollector.__init__�  s   € ð
 )ˆÔØˆŒˆˆr/   FÚoptionsr
   Úsuppress_no_indexr^   c                ó  — |j         g|j        z   }|j        r<|s:t                               dd                     d„ |D ¦   «         ¦  «        ¦  «         g }|j        pg }t          j        |||j        ¬¦  «        }t          ||¬¦  «        }|S )zÆ
        :param session: The Session to use to make requests.
        :param suppress_no_index: Whether to ignore the --no-index option
            when constructing the SearchScope object.
        zIgnoring indexes: %sú,c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r6   r   )Ú.0r#   s     r-   ú	<genexpr>z'LinkCollector.create.<locals>.<genexpr>¨  s+   è è € ÐIÐI°sÕ-¨cÑ2Ô2ÐIÐIÐIÐIÐIÐIr/   )rÚ   rÛ   Úno_index)rN   rÞ   )
Ú	index_urlÚextra_index_urlsrç   rb   rc   rd   rÚ   r   ÚcreaterÝ   )ÚclsrN   rà   rá   rÛ   rÚ   rÞ   Úlink_collectors           r-   rê   zLinkCollector.create˜  s¾   € ð Ô'Ð(¨7Ô+CÑCˆ
ØÔð 	Ð$5ð 	Ý�LŠLØ&Ø—’ÐIÐI¸jÐIÑIÔIÑIÔIñô ð ð ˆJð Ô'Ð-¨2ˆ
å"Ô)Ø!Ø!ØÔ%ð
ñ 
ô 
ˆõ
 'ØØ%ð
ñ 
ô 
ˆð Ðr/   ú	list[str]c                ó   — | j         j        S r6   )rÞ   rÚ   r   s    r-   rÚ   zLinkCollector.find_linksº  s   € àÔ Ô+Ð+r/   NÚlocationr   Úpackage_namer&   rÈ   c                óz   — | j         j        }d|v p|duot          |¦  «        |v }t          || j         |¬¦  «        S )z>
        Fetch an HTML page containing package links.
        z:all:NrÌ   )rN   Úrefresh_packager   r×   )r9   rï   rð   r]   Úshould_force_revalidates        r-   Úfetch_responsezLinkCollector.fetch_response¾  se   € ð  œ<Ô7ÐØ")Ð-=Ð"=ð #
Ø Ð$ð DÝ! ,Ñ/Ô/Ð3CÐCð 	 õ "ØØ”LØ4ð
ñ 
ô 
ð 	
r/   Úproject_namer$   Úcandidates_from_pager    rÙ   c                óz  ‡ ‡‡— t          j        ˆˆˆ fd„‰ j                             ‰¦  «        D ¦   «         ¦  «                             ¦   «         }t          j        ˆˆˆ fd„‰ j        D ¦   «         ¦  «                             ¦   «         }t                               t          j	        ¦  «        red„ t          j        ||¦  «        D ¦   «         }t          |¦  «        › d‰› d�g|z   }t                               d                     |¦  «        ¦  «         t          t!          |¦  «        t!          |¦  «        ¬¦  «        S )Nc           	   3  óV   •K  — | ]#}t          |‰‰j        j        d d ‰¬¦  «        V — Œ$dS )F©rö   Úpage_validatorÚ
expand_dirrt   rõ   N©r"   rN   Úis_secure_origin©rå   Úlocrö   rõ   r9   s     €€€r-   ræ   z0LinkCollector.collect_sources.<locals>.<genexpr>Ø  s_   øè è € ð 
4
ð 
4
ð õ ØØ%9Ø#œ|Ô<Ø Ø#(Ø)ðñ ô ð
4
ð 
4
ð 
4
ð 
4
ð 
4
ð 
4
r/   c           	   3  óV   •K  — | ]#}t          |‰‰j        j        d d ‰¬¦  «        V — Œ$dS )Trù   Nrü   rþ   s     €€€r-   ræ   z0LinkCollector.collect_sources.<locals>.<genexpr>ã  s_   øè è € ð 
5
ð 
5
ð õ ØØ%9Ø#œ|Ô<ØØ#'Ø)ðñ ô ð
5
ð 
5
ð 
5
ð 
5
ð 
5
ð 
5
r/   c                ó4   — g | ]}|®|j         ®d|j         › �‘ŒS )Nz* )r¤   )rå   Úss     r-   ú
<listcomp>z1LinkCollector.collect_sources.<locals>.<listcomp>ð  s6   € ð ð ð àØ�= Q¤VÐ%7ð �Q”V��à%7Ð%7Ð%7r/   z' location(s) to search for versions of ú:ú
)rÚ   rÛ   )ÚcollectionsÚOrderedDictrÞ   Úget_index_urls_locationsÚvaluesrÚ   rb   ÚisEnabledForÚloggingÚDEBUGÚ	itertoolsÚchainr+   rc   rd   rÙ   rŒ   )r9   rõ   rö   Úindex_url_sourcesÚfind_links_sourcesÚliness   ```   r-   Úcollect_sourceszLinkCollector.collect_sourcesÒ  s�  øøø€ õ (Ô3ð 
4
ð 
4
ð 
4
ð 
4
ð 
4
ð 
4
ð Ô(×AÒAÀ,ÑOÔOð
4
ñ 
4
ô 
4
ñ 

ô 

÷ Š&‰(Œ(ð 	õ )Ô4ð 
5
ð 
5
ð 
5
ð 
5
ð 
5
ð 
5
ð ”ð
5
ñ 
5
ô 
5
ñ 

ô 

÷ Š&‰(Œ(ð 	õ ×Ò�wœ}Ñ-Ô-ð 
	+ðð å"œÐ);Ð=NÑOÔOðñ ô ˆEõ �u‘:”:ð 3ð 3Ø#/ð3ð 3ð 3ðð ñˆEõ �LŠL˜Ÿš 5Ñ)Ô)Ñ*Ô*Ð*åÝÐ.Ñ/Ô/ÝÐ-Ñ.Ô.ð
ñ 
ô 
ð 	
r/   )rN   r   rÞ   r   r%   r4   ©F)rN   r   rà   r
   rá   r^   r%   rÝ   )r%   rí   r6   )rï   r   rð   r&   r%   rÈ   )rõ   r$   rö   r    r%   rÙ   )r;   r<   r=   r­   r8   Úclassmethodrê   ÚpropertyrÚ   rô   r  rM   r/   r-   rÝ   rÝ   ˆ  s¯   € € € € € ðð ðð ð ð ð ð
 #(ð	ð ð ð ñ „[ððB ð,ð ,ð ,ñ „Xð,ð :>ð
ð 
ð 
ð 
ð 
ð(,
ð ,
ð ,
ð ,
ð ,
ð ,
r/   rÝ   )r#   r$   r%   r&   )r@   r   r%   r4   )r#   r$   rN   r   r%   r4   r  )r#   r$   rN   r   r]   r^   r%   r   )rE   rf   r%   r&   )r‡   r‚   r%   r‚   r†   r6   )r¤   r   rÀ   rÁ   rÂ   rÃ   r%   r4   )T)r@   r   rt   r^   r%   rr   )r¤   r   rN   r   r]   r^   r%   rÈ   )Tr­   Ú
__future__r   r  Úemail.messageri   r�   r  r˜   r  rÏ   Úurllib.parserS   Úcollections.abcr   r   r   r   Údataclassesr   Úhtml.parserr	   Úoptparser
   Útypingr   r   Úpip._vendor.packaging.utilsr   Úpip._vendor.requestsr   Úpip._vendor.requests.exceptionsr   Úpip._internal.exceptionsr   r   r   r   r   r   Úpip._internal.models.linkr   Ú!pip._internal.models.search_scoper   Úpip._internal.network.sessionr   Úpip._internal.network.utilsr   Úpip._internal.utils.filetypesr   Úpip._internal.utils.miscr   Úpip._internal.utils.urlsr   Úpip._internal.vcsr   Úsourcesr    r!   r"   Ú	getLoggerr;   rb   r$   rf   r.   Ú	Exceptionr1   rJ   rL   r\   re   rn   rp   r‚   r“   r§   rr   rœ   rÅ   rÇ   r×   rÙ   rÝ   rM   r/   r-   ú<module>r-     sá  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ !Ð !Ð !Ð !Ð !Ð !Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð
 :Ð 9Ð 9Ð 9Ð 9Ð 9Ø )Ð )Ð )Ð )Ð )Ð )Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð +Ð *Ð *Ð *Ð *Ð *Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø !Ð !Ð !Ð !Ð !Ð !à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aà	ˆÔ	˜8Ñ	$Ô	$€à   c Ô*€ðð ð ð ð)ð )ð )ð )ð )�Yñ )ô )ð )ð@ð @ð @ð @ð,	ð 	ð 	ð 	ð 	ˆyñ 	ô 	ð 	ðð ð ð ð* #ð8ð 8ð 8ð 8ð 8ðvð ð ð ð	#ð 	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ðBð Bð Bð Bð B�ñ Bô Bð Bðð ð ð ð( ðð ð ñ Ôðð8 €�$ÐÑÔð.ð .ð .ð .ð .ñ .ô .ñ Ôð.ð(ð ð ð ð �Zñ ô ð ð> (,ð@ð @ð @ð @ð @ð 48ð
ð 
ð 
ð 
ð 
ð" #ð	?ð ?ð ?ð ?ð ?ð ?ðD,ð ,ð ,ð ,ð ,�zñ ,ô ,ð ,ð
v
ð v
ð v
ð v
ð v
ñ v
ô v
ð v
ð v
ð v
r/   