3

Q'íc
}ã@s$dZddlmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z	ddlZddlZddl
Z
ddlZddlZddlZddlmZddlmZddlmZddlZddlmZddlmZmZdd	lmZmZm Z dd
l!m"Z"m#Z#ddlm$Z$ddl%m&Z&m'Z'm(Z(m)Z)m*Z*dd
l+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6ddl7m8Z8dZ9d9Z:ej;e<ƒZ=Gdd„de>ƒZ?dd„Z@dd„ZAd;dd„ZBd d!„ZCd"d#„ZDejEd$ejFƒZGd%d&„ZHd'd(„ZId<d+d,„ZJd-d.„ZKeKd/d0„ƒZLd1d2„ZMd3d4„ZNGd5d6„d6e>ƒZOGd7d8„d8e>ƒZPdS)=zH
Support for installing and building the "wheel" binary package format.
é)Úabsolute_importN)Úurlsafe_b64encode)ÚParser)ÚStringIO)Ú
expanduser)Úpath_to_urlÚ
unpack_url)ÚInstallationErrorÚInvalidWheelFilenameÚUnsupportedWheel)Údistutils_schemeÚPIP_DELETE_MARKER_FILENAME)Ú
pep425tags)Úcall_subprocessÚ
ensure_dirÚcaptured_stdoutÚrmtreeÚread_chunks)Úopen_spinner)Ú
indent_log)ÚSETUPTOOLS_SHIM)ÚScriptMaker)Ú
pkg_resources)Úcanonicalize_name)Úconfigparserz.whléc@s eZdZdZdd„Zdd„ZdS)Ú
WheelCachez&A cache of wheels for future installs.cCs|rt|ƒnd|_||_dS)zÉCreate a wheel cache.

        :param cache_dir: The root of the cache.
        :param format_control: A pip.index.FormatControl object to limit
            binaries being read from the cache.
        N)rÚ
_cache_dirÚ_format_control)ÚselfÚ	cache_dirÚformat_control©r"ú(/tmp/pip-build-l_bcah40/pip/pip/wheel.pyÚ__init__8szWheelCache.__init__cCst|j||j|ƒS)N)Úcached_wheelrr)rÚlinkÚpackage_namer"r"r#r%BszWheelCache.cached_wheelN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$r%r"r"r"r#r5s
rcCs|jg}|jdk	r4|jdk	r4|jdj|j|jgƒƒdj|ƒ}tj|jƒƒjƒ}|dd…|dd…|dd…|dd…g}t	j
j|df|žŽS)aË
    Return a directory to store cached wheels in for link.

    Because there are M wheels for any one sdist, we provide a directory
    to cache them in, and then consult that directory when looking up
    cache hits.

    We only insert things into the cache if they have plausible version
    numbers, so that we don't contaminate the cache with things that were not
    unique. E.g. ./package might have dozens of installs done for it and build
    a version of 0.0...and if we built and cached a wheel, we'd end up using
    the same wheel even if the source has been edited.

    :param cache_dir: The cache_dir being used by pip.
    :param link: The link of the sdist for which this will cache wheels.
    Nú=ú#éééÚwheels)Úurl_without_fragmentÚ	hash_nameÚhashÚappendÚjoinÚhashlibÚsha224ÚencodeÚ	hexdigestÚosÚpath)r r&Ú	key_partsÚkey_urlÚhashedÚpartsr"r"r#Ú_cache_for_linkGs
,rAc
Cs,|s|S|s|S|jr|S|js$|S|s,|St|ƒ}tjj||ƒ}d|krN|St||ƒ}ytj|ƒ}Wn:t	k
r }z|j
t
jt
jfkrŽ|S‚WYdd}~XnXg}	xL|D]D}
yt
|
ƒ}Wntk
rÒw¬YnX|jƒsÞq¬|	j|jƒ|
fƒq¬W|	sþ|S|	jƒtjj||	ddƒ}tjjt|ƒƒS)NÚbinaryrr)Úis_wheelÚis_artifactrÚpipÚindexÚfmt_ctl_formatsrAr;ÚlistdirÚOSErrorÚerrnoÚENOENTÚENOTDIRÚWheelr
Ú	supportedr5Úsupport_index_minÚsortr<r6ÚLinkr)
r r&r!r'Úcanonical_nameÚformatsÚrootÚwheel_namesÚeÚ
candidatesÚ
wheel_nameÚwheelr<r"r"r#r%psF

r%Úsha256écCsttj|ƒ}d}t|dƒ2}x*t||dD]}|t|ƒ7}|j|ƒq(WWdQRXdt|jƒƒjdƒj	dƒ}||fS)z6Return (hash, length) for path using hashlib.new(algo)rÚrb)ÚsizeNzsha256=Úlatin1r,)
r7ÚnewÚopenrÚlenÚupdaterÚdigestÚdecodeÚrstrip)r<ÚalgoÚ	blocksizeÚhÚlengthÚfÚblockrcr"r"r#Úrehash—s

rlcCs6tjddkri}d}nddi}d}t|||f|ŽS)NréÚbÚnewlineÚ)ÚsysÚversion_infor`)ÚnameÚmodeÚnlÚbinr"r"r#Úopen_for_csv¥srwcCs–tjj|ƒr’t|dƒH}|jƒ}|jdƒs.dStjjtj	ƒƒ}d|tj
jdƒ}|jƒ}WdQRXt|dƒ}|j|ƒ|j|ƒWdQRXdSdS)	zLReplace #!python with #!/path/to/python
    Return True if file was changed.r\s#!pythonFs#!ÚasciiNÚwbT)
r;r<Úisfiler`ÚreadlineÚ
startswithrqÚ
executabler9ÚgetfilesystemencodingÚlinesepÚreadÚwrite)r<ÚscriptÚ	firstlineÚexenameÚrestr"r"r#Ú
fix_script¯s

r†zZ^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?)
                                \.dist-info$cCs†|jddƒ}xttj|ƒD]f}tj|ƒ}|r|jdƒ|krttjj||dƒƒ,}x$|D]}|j	ƒj
ƒ}|dkrTdSqTWWdQRXqWdS)	zP
    Return True if the extracted wheel in wheeldir should go into purelib.
    ú-Ú_rsÚWHEELzroot-is-purelib: trueTNF)Úreplacer;rHÚdist_info_reÚmatchÚgroupr`r<r6Úlowerre)rsÚwheeldirÚname_foldedÚitemrŒrYÚliner"r"r#Úroot_is_purelibÄs

r“c
Csºtjj|ƒsiifSt|ƒ<}tƒ}x$|D]}|j|jƒƒ|jdƒq*W|jdƒWdQRXtj	ƒ}dd„|_
|j|ƒi}i}|jdƒršt
|jdƒƒ}|jdƒr²t
|jdƒƒ}||fS)NÚ
rcSs|S)Nr")Úoptionr"r"r#Ú<lambda>äsz!get_entrypoints.<locals>.<lambda>Úconsole_scriptsÚgui_scripts)r;r<Úexistsr`rrÚstripÚseekrÚRawConfigParserÚoptionxformÚreadfpÚhas_sectionÚdictÚitems)ÚfilenameÚfpÚdatar’ÚcpÚconsoleÚguir"r"r#Úget_entrypointsÔs$





r¨FTc
)(sø|st||||||	d}t|ˆƒr,|d‰n|d‰g‰g‰ˆjtjjƒtjj}
i‰tƒ‰g}|r²tƒ4}tj	ƒ tj
dƒtj|
dddWdQRXWdQRXt
j|jƒƒdd	„‰d3‡‡‡‡‡fdd„	‰	d4‡‡‡	‡
fd
d„	}
|
|
ˆdƒˆstdˆ
ƒ‚tjjˆddƒ}t|ƒ\‰‰‡‡fdd„}xvˆD]n}d}d}x^tjtjjˆ|ƒƒD]F}d}|dkrpt}|}tjjˆ||ƒ}
||}|
|
|d
||dqVWq4Wtd|dƒ‰dˆ_td5ƒˆ_dˆ_‡‡
fdd„}|ˆ_dˆ_ˆjddƒ}|rždtjkrd|}|jˆj|ƒƒtjjddƒdkrTdt j!dd…|f}|jˆj|ƒƒdt j!dd …|f}|jˆj|ƒƒd!d"„ˆDƒ}x|D]}ˆ|=qŽWˆjd#dƒ}|rdtjkrÔd$|}|jˆj|ƒƒd%t j!dd …|f}|jˆj|ƒƒd&d"„ˆDƒ}x|D]}ˆ|=qWt"ˆƒdkrJ|jˆj#d'd"„ˆj$ƒDƒƒƒt"ˆƒdkr||jˆj#d(d"„ˆj$ƒDƒd)diƒƒtjjˆdd*ƒ}tjjˆdd+ƒ}t%|d,ƒ}|j&d-ƒWdQRXt'j(||ƒ|j)|ƒtjjˆdd.ƒ}tjjˆdd/ƒ} t*|d0ƒÞ}!t*| d1ƒÈ}"t+j,|!ƒ}#t+j-|"ƒ}$xV|#D]N}%ˆj|%d|%dƒ|%d<|%dˆkrnt.|%dƒ\|%d<|%d2<|$j/|%ƒq,Wx0|D](}&t.|&ƒ\}'}(|$j/ˆ|&ˆƒ|'|(fƒq„Wx"ˆD]}&|$j/ˆ|&ddfƒq¶WWdQRXWdQRXt'j(| |ƒdS)6zInstall a wheel)ÚuserÚhomerTÚisolatedÚprefixÚpurelibÚplatlibÚignoreT)ÚforceÚquietNcSstjj||ƒjtjjdƒS)Nú/)r;r<ÚrelpathrŠÚsep)ÚsrcÚpr"r"r#Únormpathsz"move_wheel_files.<locals>.normpathFcs.ˆ|ˆƒ}ˆ|ˆƒ}|ˆ|<|r*ˆj|ƒdS)z6Map archive RECORD paths to installation RECORD paths.N)Úadd)ÚsrcfileÚdestfileÚmodifiedÚoldpathÚnewpath)ÚchangedÚ	installedÚlib_dirr·rr"r#Úrecord_installeds


z*move_wheel_files.<locals>.record_installedcsØt|ƒxÈtj|ƒD]¸\}}}|t|ƒd…jtjjƒ}tjj||ƒ}	|rj|jtjjdƒdj	dƒrjqxŒ|D]„}
tjj|||
ƒ}|r¨|dkr¨|j	dƒr¨ˆj
|
ƒqpqp|rp|
j	dƒrpt|
ƒjtˆj
ƒƒrpˆsêtd|ddjˆƒƒ‚ˆj
|ƒqpWxÖ|D]Î}|r||ƒrqþtjj||ƒ}
tjj|||ƒ}t|	ƒtj|
|ƒtj|
ƒ}ttdƒrptj||j|jfƒtj|
tjƒr®tj|
ƒ}|jtjBtjBtjB}tj||ƒd	}|rÀ||ƒ}ˆ|
||ƒqþWqWdS)
Nrrz.datarpz
.dist-infoz!Multiple .dist-info directories: z, ÚutimeF)rr;ÚwalkraÚlstripr<r´r6ÚsplitÚendswithr5rr|rsÚAssertionErrorÚshutilÚcopyfileÚstatÚhasattrrÂÚst_atimeÚst_mtimeÚaccessÚX_OKÚst_modeÚS_IXUSRÚS_IXGRPÚS_IXOTHÚchmod)ÚsourceÚdestÚis_baseÚfixerÚfilterÚdirÚsubdirsÚfilesÚbasedirÚdestdirÚsÚ
destsubdirrjr¹rºÚstÚpermissionsr¾)Ú	data_dirsÚinfo_dirrÁÚreqr"r#ÚclobbersJ






z!move_wheel_files.<locals>.clobberz!%s .dist-info directory not foundrzentry_points.txtcsh|jƒjdƒr|dd…}n<|jƒjdƒr8|dd…}n |jƒjdƒrT|dd…}n|}|ˆkpf|ˆkS)	Nz.exer/z
-script.pyé
z.pyaéüÿÿÿiöÿÿÿrè)rŽrÆ)rsÚ	matchname)r¦r§r"r#Úis_entrypoint_wrapperasz/move_wheel_files.<locals>.is_entrypoint_wrapperÚscripts)rØrÙrpcs<|jdkrtd|ˆfƒ‚ˆj|j|jjdƒd|jdœS)Nz­Invalid script entry point: %s for req: %s - A callable suffix is required. Cf https://packaging.python.org/en/latest/distributing.html#console-scripts for more information.Ú.r)ÚmoduleÚimport_nameÚfunc)Úsuffixr	Úscript_templater¬rÅ)Úentry)Úmakerrår"r#Ú_get_script_texts
z*move_wheel_files.<locals>._get_script_textzÐ# -*- coding: utf-8 -*-
import re
import sys

from %(module)s import %(import_name)s

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(%(func)s())
rEÚENSUREPIP_OPTIONSzpip = Ú
altinstallz
pip%s = %srrmcSsg|]}tjd|ƒr|‘qS)zpip(\d(\.\d)?)?$)ÚrerŒ)Ú.0Úkr"r"r#ú
<listcomp>×sz$move_wheel_files.<locals>.<listcomp>Úeasy_installzeasy_install = zeasy_install-%s = %scSsg|]}tjd|ƒr|‘qS)zeasy_install(-\d\.\d)?$)r÷rŒ)rørùr"r"r#rúäscSsg|]}d|‘qS)z%s = %sr")røÚkvr"r"r#rúìscSsg|]}d|‘qS)z%s = %sr")rørür"r"r#rúñsr§Ú	INSTALLERz
INSTALLER.pipryspip
ÚRECORDz
RECORD.pipÚrzw+r.)F)NN)rp)0rr“rer;r<r´ÚsetrÚwarningsÚcatch_warningsÚfilterwarningsÚ
compileallÚcompile_dirÚloggerÚdebugÚgetvaluerÇr6r¨rHr†rræÚvariantsÚset_moderôrñÚpopÚenvironÚextendÚmakeÚgetrqÚversionraÚ
make_multipler¡r`rrÈÚmover5rwÚcsvÚreaderÚwriterrlÚwriterow))rsrårr©rªrTÚ	pycompileÚschemer«r¬rÕÚ	generatedÚstdoutræÚep_filerêÚdatadirrØrÙÚsubdirrÖrôÚ
pip_scriptÚspecÚpip_eprùÚeasy_install_scriptÚeasy_install_epÚ	installerÚtemp_installerÚinstaller_fileÚrecordÚtemp_recordÚ	record_inÚ
record_outrrÚrowrjrhÚlr")r¾r¦rãr§rär¿rÀrór·rÁrårr#Úmove_wheel_filesðsÆ




$;



#







.r,cstjˆƒ‡fdd„ƒ}|S)Nc?s6tƒ}x*ˆ||ŽD]}||kr|j|ƒ|VqWdS)N)rr¸)ÚargsÚkwÚseenr‘)Úfnr"r#Úuniques

z_unique.<locals>.unique)Ú	functoolsÚwraps)r0r1r")r0r#Ú_uniquesr4ccsŠddlm}tj||jdƒƒƒ}xd|D]\}tjj|j|dƒ}|V|j	dƒr&tjj
|ƒ\}}|dd…}tjj||dƒ}|Vq&WdS)	a
    Yield all the uninstallation paths for dist based on RECORD-without-.pyc

    Yield paths to all the files in RECORD. For each .py file in RECORD, add
    the .pyc in the same directory.

    UninstallPathSet.add() takes care of the __pycache__ .pyc.
    r)ÚFakeFilerþz.pyNrmz.pycéýÿÿÿ)Ú	pip.utilsr5rrÚget_metadata_linesr;r<r6ÚlocationrÆrÅ)Údistr5rÿr*r<Údnr0Úbaser"r"r#Úuninstallation_pathss


r=cCsdyTdd„tjd|ƒDƒd}|jdƒ}tƒj|ƒ}|djƒ}ttt|j	dƒƒƒ}|SdSdS)	z†
    Return the Wheel-Version of an extracted wheel, if possible.

    Otherwise, return False if we couldn't parse / extract it.
    cSsg|]}|‘qSr"r")røÚdr"r"r#rú;sz!wheel_version.<locals>.<listcomp>Nrr‰z
Wheel-VersionrìF)
rÚfind_on_pathÚget_metadatarÚparsestrršÚtupleÚmapÚintrÅ)Ú
source_dirr:Ú
wheel_datarr"r"r#Ú
wheel_version4s
rGcCsb|std|ƒ‚|dtdkr>td|djtt|ƒƒfƒ‚n |tkr^tjddjtt|ƒƒƒdS)aê
    Raises errors or warns if called with an incompatible Wheel-Version.

    Pip should refuse to install a Wheel-Version that's a major series
    ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when
    installing a version only minor version ahead (e.g 1.2 > 1.1).

    version: a 2-tuple representing a Wheel-Version (Major, Minor)
    name: name of wheel or package to raise exception about

    :raises UnsupportedWheel: when an incompatible Wheel-Version is given
    z(%s is in an unsupported or invalid wheelrzB%s's Wheel-Version (%s) is not compatible with this version of piprìz*Installing from a newer Wheel-Version (%s)N)rÚVERSION_COMPATIBLEr6rCÚstrrÚwarning)rrsr"r"r#Úcheck_compatibilityGs

rKc@s:eZdZdZejdejƒZdd„Zd
dd„Z	ddd	„Z
dS)rMzA wheel filezŽ^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))
        ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
        \.whl|\.dist-info)$csžˆjj|ƒ}|std|ƒ‚|ˆ_|jdƒjddƒˆ_|jdƒjddƒˆ_|jdƒjdƒˆ_	|jdƒjdƒˆ_
|jd	ƒjdƒˆ_t‡fd
d„ˆj	Dƒƒˆ_
dS)
zX
        :raises InvalidWheelFilename: when the filename is invalid for a wheel
        z!%s is not a valid wheel filename.rsrˆr‡ÚverÚpyverrìÚabiÚplatc3s0|](}ˆjD]}ˆjD]}|||fVqqqdS)N)ÚabisÚplats)røÚxÚyÚz)rr"r#ú	<genexpr>„sz!Wheel.__init__.<locals>.<genexpr>N)Ú
wheel_file_rerŒr
r¢rrŠrsrrÅÚ
pyversionsrPrQrÚ	file_tags)rr¢Ú
wheel_infor")rr#r$ps
zWheel.__init__Ncs2ˆdkrtj‰‡fdd„|jDƒ}|r.t|ƒSdS)a"
        Return the lowest index that one of the wheel's file_tag combinations
        achieves in the supported_tags list e.g. if there are 8 supported tags,
        and one of the file tags is first in the list, then return 0.  Returns
        None is the wheel is not supported.
        Ncsg|]}|ˆkrˆj|ƒ‘qSr")rF)røÚc)Útagsr"r#rú‘sz+Wheel.support_index_min.<locals>.<listcomp>)rÚsupported_tagsrXÚmin)rr[Úindexesr")r[r#rOˆszWheel.support_index_mincCs"|dkrtj}tt|ƒj|jƒƒS)z'Is this wheel supported on this system?N)rr\ÚboolrÚintersectionrX)rr[r"r"r#rN”szWheel.supported)N)N)r(r)r*r+r÷ÚcompileÚVERBOSErVr$rOrNr"r"r"r#rMds
rMc@sHeZdZdZddd„Zddd„Zdd„Zdd	d
„Zdd„Zddd„Z	dS)ÚWheelBuilderz#Build wheels from a RequirementSet.NcCs6||_||_|jj|_|j|_|p$g|_|p.g|_dS)N)	Úrequirement_setÚfinderÚ_wheel_cacherÚ_cache_rootÚwheel_download_dirÚ
_wheel_dirÚ
build_optionsÚglobal_options)rrdrerjrkr"r"r#r$žs

zWheelBuilder.__init__cCsˆtjdƒ}zn|j|||drlyBtj|ƒd}tjj||ƒ}tjtjj||ƒ|ƒt	j
d|ƒ|SYnX|j|ƒdSt|ƒXdS)ziBuild one wheel.

        :return: The filename of the built wheel, or None if the build failed.
        z
pip-wheel-)Ú
python_tagrzStored in directory: %sN)
ÚtempfileÚmkdtempÚ_WheelBuilder__build_oner;rHr<r6rÈrrÚinfoÚ
_clean_oner)rråÚ
output_dirrlÚtempdrXÚ
wheel_pathr"r"r#Ú
_build_one§s

zWheelBuilder._build_onecCstjddt|jgt|jƒS)Nz-uz-c)rqr}rÚsetup_pyÚlistrk)rrår"r"r#Ú_base_setup_args½s
zWheelBuilder._base_setup_argscCsœ|j|ƒ}d|jf}t|ƒt}tjd|ƒ|dd|g|j}|dk	rT|d|g7}yt||jd|ddS|jd	ƒtj	d
|jƒdSWdQRXdS)Nz#Running setup.py bdist_wheel for %szDestination directory: %sÚbdist_wheelz-dz--python-tagF)ÚcwdÚshow_stdoutÚspinnerTÚerrorzFailed building wheel for %s)
rxrsrrrrjrÚsetup_py_dirÚfinishr})rrårsrlÚ	base_argsÚspin_messager|Ú
wheel_argsr"r"r#Ú__build_oneÃs



zWheelBuilder.__build_onecCsV|j|ƒ}tjd|jƒ|ddg}yt||jdddStjd|jƒdSdS)NzRunning setup.py clean for %sÚcleanz--allF)rzr{Tz Failed cleaning build dir for %s)rxrrprsrrEr})rrår€Ú
clean_argsr"r"r#rqØs
zWheelBuilder._clean_oneFcCsÂ|js|r|jst‚|jj|jƒ|jjjƒ}g}xÀ|D]¸}|jrDq8|j	r^|sðt
jd|jƒq8|rj|j
rjq8|r€|jr€|jjr€q8|rŽ|jrŽq8|ræ|j}|jƒ\}}tjj|d|ƒdkrºq8dtjj|jjt|jƒƒkræt
jd|jƒq8|j|ƒq8W|sþdSt
jddjdd	„|DƒƒƒtƒJgg}}	x6|D],}d}
|r¬tj}
t|j|jƒ}yt|ƒWnBtk
r¨}z$t
j d
|j|ƒ|	j|ƒw6WYdd}~XnXn|j}|j!|||
d}
|
rX|j|ƒ|rb|jrt"j#j$t"j#j|jt%ƒƒrtdƒ‚|j&ƒ|j'|jj(ƒ|_tjj)t*|
ƒƒ|_|jj	s<t‚t+|j|jdd
|jj,dn
|	j|ƒq6WWdQRX|r”t
jddjdd	„|Dƒƒƒ|	r¶t
jddjdd	„|	Dƒƒƒt-|	ƒdkS)zÙBuild wheels.

        :param unpack: If True, replace the sdist we built from with the
            newly built wheel, in preparation for installation.
        :return: True if all the wheels built correctly.
        z(Skipping %s, due to already being wheel.NrBzCSkipping bdist_wheel for %s, due to binaries being disabled for it.Tz*Building wheels for collected packages: %sz, cSsg|]
}|j‘qSr")rs)rørår"r"r#rúsz&WheelBuilder.build.<locals>.<listcomp>z Building wheel for %s failed: %s)rlzbad source dir - missing markerF)ÚsessionzSuccessfully built %sú cSsg|]
}|j‘qSr")rs)rørår"r"r#rúMszFailed to build %scSsg|]
}|j‘qSr")rs)rørår"r"r#rúRsr).rirgrÇrdÚ
prepare_filesreÚrequirementsÚvaluesÚ
constraintrCrrprsÚeditabler&rDrEÚsplitextrErFÚegg_info_matchesrGr!rr5r6rrÚimplementation_tagrArrIrJrur;r<r™r
Úremove_temporary_sourceÚbuild_locationÚ	build_dirrQrrr†ra)rÚautobuildingÚreqsetÚbuildsetrår&r<ÚextÚ
build_successÚ
build_failurerlrrrVÚ
wheel_filer"r"r#Úbuildäsž






zWheelBuilder.build)NN)N)N)F)
r(r)r*r+r$rurxrorqršr"r"r"r#rc›s


rc)rré)rZr›)FNNTNFN)Qr+Ú
__future__rrrrJr2r7Úloggingr;Úos.pathr÷rÈrÊrqrmrÚbase64rÚemail.parserrZpip._vendor.sixrrEÚ
pip.compatrÚpip.downloadrrÚpip.exceptionsr	r
rÚ
pip.locationsrr
rr7rrrrrÚpip.utils.uirÚpip.utils.loggingrÚpip.utils.setuptools_buildrÚpip._vendor.distlib.scriptsrÚpip._vendorrÚpip._vendor.packaging.utilsrZpip._vendor.six.movesrÚ	wheel_extrHÚ	getLoggerr(rÚobjectrrAr%rlrwr†rarbr‹r“r¨r,r4r=rGrKrMrcr"r"r"r#Ú<module>sn
)'



#7