JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrB :a@sddlmZddlZddlZddlZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlmZmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.m/Z/e 0e1Z2da3e4ed r8d Z5n*ej67d rLdZ5nej6dkr^dZ5ndZ5e8dZ9e9sdej:ddZ9de9Z;e5e9Ze8dZ?e?re?7dre?=dd@ddZ?nddZAeAZ?[Ae Bde jCe jDBZEe Bde jCe jDBZFe BdZGe Bd ZHd!ZId"ZJe jKd#krHd$d%ZLnd&d%ZLGd'd(d(eMZNeNZOGd)d*d*eMZPd+d,ZQd-d.ZReRZS[Rd1d/d0ZTdS)2)unicode_literalsN)message_from_file) __version__DistlibException) sysconfigZipFilefsdecode text_typefilter)InstalledDistribution)MetadataMETADATA_FILENAMEWHEEL_METADATA_FILENAMELEGACY_METADATA_FILENAME) FileOperator convert_path CSVReader CSVWriterCachecached_propertyget_cache_base read_exportstempdir get_platform)NormalizedVersionUnsupportedVersionErrorZpypy_version_infoppjavaZjyZcliZipcppy_version_nodotz%s%spy-_.SOABIzcpython-cCsRdtg}tdr|dtdr0|dtddkrH|dd |S) NrPy_DEBUGd WITH_PYMALLOCmZPy_UNICODE_SIZEu) VER_SUFFIXrget_config_varappendjoin)partsr3>/opt/alt/python37/lib/python3.7/site-packages/distlib/wheel.py _derive_abi<s     r5zz (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))? -(?P\w+\d+(\.\w+\d+)*) -(?P\w+) -(?P\w+(\.\w+)*) \.whl$ z7 (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))?$ s \s*#![^\r\n]*s^(\s*#!("[^"]+"|\S+))\s+(.*)$s#!pythons #!pythonw/cCs|S)Nr3)or3r3r4^r8cCs|tjdS)Nr6)replaceossep)r7r3r3r4r8`r9c@s6eZdZddZddZddZd dd Zd d ZdS) MountercCsi|_i|_dS)N) impure_wheelslibs)selfr3r3r4__init__dszMounter.__init__cCs||j|<|j|dS)N)r>r?update)r@pathname extensionsr3r3r4addhs z Mounter.addcCs4|j|}x"|D]\}}||jkr|j|=qWdS)N)r>popr?)r@rCrDkvr3r3r4removels  zMounter.removeNcCs||jkr|}nd}|S)N)r?)r@fullnamepathresultr3r3r4 find_modulers zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|t||j|}||_|dd}t|dkrf|d|_ |S)Nzunable to find extension for %sr%rr) sysmodulesr? ImportErrorimpZ load_dynamic __loader__rsplitlen __package__)r@rJrLr2r3r3r4 load_moduleys       zMounter.load_module)N)__name__ __module__ __qualname__rArErIrMrVr3r3r3r4r=cs  r=c@seZdZdZdZdZd4ddZedd Zed d Z ed d Z e ddZ ddZ e ddZddZd5ddZddZddZddZd6ddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd7d,d-Zd.d/Zd0d1Zd8d2d3ZdS)9Wheelz@ Class to build and install from Wheel files (PEP 427). )rrZsha256NFcCs8||_||_d|_tg|_dg|_dg|_t|_ |dkrRd|_ d|_ |j |_ nt|}|r|d}|d|_ |dd d |_ |d |_|j |_ ntj|\}}t|}|std ||rtj||_ ||_ |d}|d|_ |d|_ |d |_|d d|_|dd|_|dd|_dS)zB Initialise an instance using a (valid) filename. r-noneanyNZdummyz0.1nmZvnr$r#ZbnzInvalid name or filename: %rr"r%Zbiar)signZ should_verifybuildverPYVERpyverabiarchr;getcwddirnamenameversionfilenameZ _filenameNAME_VERSION_REmatch groupdictr:rKsplit FILENAME_RErabspath)r@rir_verifyr*inforfr3r3r4rAsB            zWheel.__init__cCs^|jrd|j}nd}d|j}d|j}d|j}|jdd}d|j|||||fS)zJ Build and return a filename from the various components. r#r-r%r$z%s-%s%s-%s-%s-%s.whl)r`r1rbrcrdrhr:rg)r@r`rbrcrdrhr3r3r4ris     zWheel.filenamecCstj|j|j}tj|S)N)r;rKr1rfriisfile)r@rKr3r3r4existssz Wheel.existsccs@x:|jD]0}x*|jD] }x|jD]}|||fVq WqWqWdS)N)rbrcrd)r@rbrcrdr3r3r4tagss   z Wheel.tagsc Cstj|j|j}d|j|jf}d|}td}t |d}| |}|d dd}t dd |D}t tg} d} x`| D]X} y>t|| } || } || }t|d } | rPWdQRXWq~tk rYq~Xq~W| std d | WdQRX| S) Nz%s-%sz %s.dist-infozutf-8rz Wheel-Versionr%rcSsg|] }t|qSr3)int).0ir3r3r4 sz"Wheel.metadata..)fileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r;rKr1rfrirgrhcodecs getreaderrget_wheel_metadatarmtuplerr posixpathopenr KeyError ValueError)r@rCname_verinfo_dirwrapperzfwheel_metadatawv file_versionZfnsrLfnmetadata_filenamebfwfr3r3r4metadatas0        zWheel.metadatac CsXd|j|jf}d|}t|d}||}td|}t|}WdQRXt|S)Nz%s-%sz %s.dist-infoWHEELzutf-8) rgrhrr1rr{r|rdict)r@rrrrrrmessager3r3r4r}s  zWheel.get_wheel_metadatac Cs6tj|j|j}t|d}||}WdQRX|S)Nru)r;rKr1rfrirr})r@rCrrLr3r3r4rqs z Wheel.infoc Cst|}|r||}|d|||d}}d|krBt}nt}t|}|rfd|d}nd}||}||}nT|d}|d} |dks|| krd} n|||dd krd } nd} t| |}|S) Nspythonw r9  rr!s ) SHEBANG_RErkendlowerSHEBANG_PYTHONWSHEBANG_PYTHONSHEBANG_DETAIL_REgroupsfind) r@datar*rZshebangZdata_after_shebangZshebang_pythonargsZcrZlfZtermr3r3r4process_shebangs,       zWheel.process_shebangcCsh|dkr|j}ytt|}Wn tk r<td|YnX||}t|d d}||fS)NzUnsupported hash algorithm: %r=ascii) hash_kindgetattrhashlibAttributeErrorrdigestbase64Zurlsafe_b64encoderstripdecode)r@rrhasherrLr3r3r4get_hash%s zWheel.get_hashc CsZt|}ttj||}||ddft|}x|D]}||q:WWdQRXdS)Nr-)listto_posixr;rKrelpathr0rZwriterow)r@recordsZ record_pathbasepwriterrowr3r3r4 write_record0s   zWheel.write_recordc Csg}|\}}tt|j}xX|D]P\}} t| d} | } WdQRXd|| } tj| } | || | fqWtj |d} | || |t tj |d}| || fdS)Nrbz%s=%sRECORD) rrrrreadrr;rKgetsizer0r1rr)r@rqlibdir archive_pathsrdistinforraprfrrsizer3r3r4 write_records8s   zWheel.write_recordsc CsJt|dtj2}x*|D]"\}}td|||||qWWdQRXdS)NwzWrote %s to %s in wheel)rzipfile ZIP_DEFLATEDloggerdebugwrite)r@rCrrrrr3r3r4 build_zipHszWheel.build_zipc" s|dkr i}ttfdddd}|dkrFd}tg}tg}tg}nd}tg}d g}d g}|d ||_|d ||_|d ||_ |} d|j |j f} d| } d| } g} xdD]}|krq|}t j |rxt |D]\}}}x|D]}tt j ||}t j ||}tt j | ||}| ||f|dkr|dst|d}|}WdQRX||}t|d}||WdQRXqWqWqW| }d}xt |D]\}}}||krx@t|D]4\}}t|}|drt j ||}||=PqW|stdxP|D]H}t|dr8q t j ||}tt j ||}| ||fq WqWt |}xJ|D]B}|dkrtt j ||}tt j | |}| ||fqWd|p|jdtd|g}x*|jD] \}}}|d|||fqWt j |d}t|d}|d |WdQRXtt j | d}| ||fd!d"} t | | d#} |!|| f| | t j |j"|j#}!|$|!| |!S)$z Build a wheel from files in specified paths, and use any specified tags when determining the name of the wheel. Ncs|kS)Nr3)r7)pathsr3r4r8Vr9zWheel.build..)purelibplatlibrrfalsetruer[r\rbrcrdz%s-%sz%s.dataz %s.dist-info)rheadersscriptsrz.exerwbz .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)rZ INSTALLERZSHAREDrzWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%srr cSs*|d}|d}d|kr"|d7}||fS)Nrr6z .dist-infoi')count)trnr3r3r4sorters  zWheel.build..sorter)key)%rr IMPVERABIARCHragetrbrcrdrgrhr;rKisdirwalkr r1rrr0endswithrrrr enumerateAssertionErrorlistdir wheel_versionrrtsortedrrfrir)"r@rrtrZlibkeyis_pureZ default_pyverZ default_abiZ default_archrrdata_dirrrrrKrootdirsfilesrrrprrrrrxdnrrbrcrdrrCr3)rr4buildNs                 z Wheel.buildcCs |dS)zl Determine whether an archive entry should be skipped when verifying or installing. )r6z /RECORD.jws)r)r@arcnamer3r3r4 skip_entryszWheel.skip_entrycC Ks|j}|d}|dd}|dd}tj|j|j}d|j|jf} d| } d| } t | t } t | d} t | d }t d }t |d }|| }||}t|}Wd QRX|d dd}tdd|D}||jkr|r||j||ddkr|d}n|d}i}||<}t|d&}x|D]}|d}|||<q:WWd QRXWd QRXt | d}t | d}t | dd}t|d}d|_tj } g}!t}"|"|_d |_zyx|D]}#|#j}$t|$tr|$}%n |$d }%| |%r q||%}|dr|6d:i}?|>sB|?r|dd}@tj>|@sdt?d;|@|_x6|>@D]*\}:}<|5C||}|r8|!.||5D|!|d?||5St0k rvt'Ed@|FYnXWd tGH|"XWd QRXd S)Aa~ Install a wheel to the specified paths. If kwarg ``warner`` is specified, it should be a callable, which will be called with two tuples indicating the wheel version of this software and the wheel version in the file, if there is a discrepancy in the versions. This can be used to issue any warnings to raise any exceptions. If kwarg ``lib_only`` is True, only the purelib/platlib files are installed, and the headers, scripts, data and dist-info metadata are not written. If kwarg ``bytecode_hashed_invalidation`` is True, written bytecode will try to use file-hash based invalidation (PEP-552) on supported interpreter versions (CPython 2.7+). The return value is a :class:`InstalledDistribution` instance unless ``options.lib_only`` is True, in which case the return value is ``None``. warnerlib_onlyFZbytecode_hashed_invalidationz%s-%sz%s.dataz %s.dist-inforrzutf-8ruNz Wheel-Versionr%rcSsg|] }t|qSr3)rv)rwrxr3r3r4rysz!Wheel.install..zRoot-Is-Purelibrrr)streamrr-r)dry_runTr!zsize mismatch for %s=zdigest mismatch for %szlib_only: skipping %sz.exer6posixirzdigest mismatch on write for %sz.py)Zhashed_invalidationzByte-compilation failed)exc_infozlib_only: returning Nonez1.0zentry_points.txt)Zconsoleguiz %s_scriptszwrap_%sz%s:%sz [%s],zAUnable to read legacy script metadata, so cannot generate scriptsrDzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srlibprefixzinstallation failed.)Irrr;rKr1rfrirgrhrrr{r|rrrrmr~rrrrecordrNdont_write_bytecodetempfileZmkdtempZ source_dirZ target_dirinfolist isinstancer rrstr file_sizerrr startswithrrrrZ copy_streamchmod external_attrr0 byte_compile ExceptionwarningbasenameZmakeZset_executable_modeextendrqrvaluesrsuffixflagsjsonloadrritemsr rZwrite_shared_locationsZwrite_installed_files exceptionZrollbackshutilrmtree)Cr@rZmakerkwargsrrrZbc_hashed_invalidationrCrrr metadata_namewheel_metadata_name record_namerrbwfrrrrrrrreaderrrZdata_pfxZinfo_pfxZ script_pfxZfileopZbcoutfilesworkdirzinfor u_arcnamekindvaluerr$rZ is_scriptwhereroutfileZ newdigestZpycrZworknamer filenamesdistcommandsZepZepdatarrGr(rHsZconsole_scriptsZ gui_scriptsZ script_dirscriptoptionsr3r3r4installsJ             "                                          z Wheel.installcCs8tdkr4tjttddtjdd}t|atS)Nz dylib-cachez%s.%sr!) cacher;rKr1rrrN version_infor)r@rr3r3r4_get_dylib_caches zWheel._get_dylib_cachec Csltj|j|j}d|j|jf}d|}t|d}t d}g}t |d}y| |}||} t | } |} | |} tj| j| } tj| st| x| D]\}}tj| t|}tj|sd}n6t|j}tj|}||}tj|j}||k}|r(||| |||fqWWdQRXWntk r\YnXWdQRX|S)Nz%s-%sz %s.dist-infoZ EXTENSIONSzutf-8ruT)r;rKr1rfrirgrhrr{r|rrr r r'Z prefix_to_dirrrmakedirsr rrsstatst_mtimedatetimeZ fromtimestampgetinfo date_timeextractr0r)r@rCrrrrrLrrrrDr%rZ cache_basergrdestr.Z file_timerqZ wheel_timer3r3r4_get_extensionss>              zWheel._get_extensionscCst|S)zM Determine if a wheel is compatible with the running system. ) is_compatible)r@r3r3r4r1szWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr3)r@r3r3r4 is_mountableszWheel.is_mountablecCstjtj|j|j}|s2d|}t||sJd|}t||t jkrbt d|nN|rtt j |nt j d||}|rtt jkrt j tt||dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r;rKror1rfrir1rr2rNrrr0insertr0_hook meta_pathrE)r@r0rCmsgrDr3r3r4mounts"   z Wheel.mountcCsrtjtj|j|j}|tjkr2td|nr5)r@rCr3r3r4unmount s     z Wheel.unmountc Cs tj|j|j}d|j|jf}d|}d|}t|t}t|d}t|d}t d}t |d} | |} || } t | } WdQRX| dd d } td d | D}i}| |:}t|d $}x|D]}|d}|||<qWWdQRXWdQRXx| D]}|j}t|tr*|}n |d}|d}d|krTtd|||rdq||}|drt|j|dkrtd||d r|d dd \}}| |}|}WdQRX|||\}}||krtd|qWWdQRXdS)Nz%s-%sz%s.dataz %s.dist-inforrzutf-8ruz Wheel-Versionr%rcSsg|] }t|qSr3)rv)rwrxr3r3r4ry(sz Wheel.verify..)rrr6z..zinvalid entry in wheel: %rr!zsize mismatch for %srzdigest mismatch for %s)r;rKr1rfrirgrhrrr{r|rrrrmr~rrrr rrrrrrr)r@rCrrrrrrrrrrrrrrrrrrrrrrrrr$rr3r3r4rpsV                 z Wheel.verifyc Ksdd}dd}tj|j|j}d|j|jf}d|}t|d} t} t |d} i} xt| D]h} | j}t |t r|}n | d }|| krqjd |krtd || | | tj| t|}|| |<qjWWd QRX|| |\}}|| f|}|r|| |\}}|r(||kr(||||d krRtjd d| d\}}t|n*tj|sltd|tj||j}t| }tj| |}||f}||| |||||d krt||Wd QRX|S)a Update the contents of a wheel in a generic way. The modifier should be a callable which expects a dictionary argument: its keys are archive-entry paths, and its values are absolute filesystem paths where the contents the corresponding archive entries can be found. The modifier is free to change the contents of the files pointed to, add new entries and remove entries, before returning. This method will extract the entire contents of the wheel to a temporary location, call the modifier, and then use the passed (and possibly updated) dictionary to write a new wheel. If ``dest_dir`` is specified, the new wheel is written there -- otherwise, the original wheel is overwritten. The modifier should return True if it updated the wheel, else False. This method returns the same value the modifier returns. cSsHd}}d|tf}||kr$d|}||kr@||}t|dj}||fS)Nz%s/%sz %s/PKG-INFO)rK)rr rh)path_maprrhrKrr3r3r4 get_version`s  z!Wheel.update..get_versioncSsd}y|t|}|d}|dkr*d|}nTdd||dddD}|dd7<d |d|dd d |Df}Wn tk rtd |YnX|rt|d }||_| t }|j ||dtd||dS)Nr#rz%s+1cSsg|] }t|qSr3)rv)rwr!r3r3r4ryrsz8Wheel.update..update_version..rr%rz%s+%scss|]}t|VqdS)N)r)rwrxr3r3r4 usz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %r)rK)rKlegacyzVersion updated from %r to %r) rrrmr1rrrr rhrrr)rhrKupdatedrHrxr2Zmdr<r3r3r4update_versionjs(       z$Wheel.update..update_versionz%s-%sz %s.dist-inforruzutf-8z..zinvalid entry in wheel: %rNz.whlz wheel-update-)rrdirzNot a directory: %r)r;rKr1rfrirgrhrrrrrr rrr.rrmkstempcloserrr rrrcopyfile)r@modifierZdest_dirrr:r>rCrrrrrr9rrrrKZoriginal_versionr$modifiedZcurrent_versionfdnewpathrrrqr3r3r4rBOsX                z Wheel.update)NFF)N)NN)F)N)rWrXrY__doc__rrrApropertyrirsrtrrr}rqrrrrrrrr$r'r0r1r2r7r8rprBr3r3r3r4rZs6 )       tn "  8rZcCs^ddl}|}g}|ddkrZx0|ddD]}||rHt|ndq0Wt|}|S)NrZglibcrr%)platformZlibc_verrmr0isdigitrvr~)rIverrLr!r3r3r4_get_glibc_versions rLc Cstg}td}x6ttjddddD]}|d|t|gq&Wg}x6tD]*\}}}| drT|| dddqTW| t dkr| dt |dg}tg}tjd krtd t}|r|\} }}} t|}| g} | d kr| d | d kr| d| dkr*| d| dkr>| d| dkrR| dxL|dkrx2| D]*} d| ||| f} | tkrd|| qdW|d8}qTWx.|D]$}x|D]} |dt|df|| f|dkrtj dr| dd} t}t|dkr|dkr>|dt|df|d| f|dkrj|dt|df|d| f|dkr|dt|df|d| f|dt|df|d|d|d| ffqWqWxXt|D]L\}}|dt|fddf|dkr|dt|dfddfqWxXt|D]L\}}|dd |fddf|dkr6|dd |dfddfq6Wt|S)!zG Return (pyver, abi, arch) tuples compatible with this Python. rrrr-z.abir%r!r[darwinz(\w+)_(\d+)_(\d+)_(\w+)$)i386ppcZfat)rNrOx86_64Zfat3)ppc64rPZfat64)rNrPintel)rNrPrRrOrQ universalz %s_%s_%s_%slinuxZlinux_)r!z manylinux1_%s)r! zmanylinux2010_%s)r!zmanylinux2014_%szmanylinux_%s_%s_%sr\r")r.rangerNr&r0r1rrQZ get_suffixesrrmsortrr3rrIrerkrrv IMP_PREFIXr:rLrTrset)ZversionsmajorminorZabisrr$rLZarchesr*rgrdZmatchesrkr!rcr2rxrhr3r3r4compatible_tagss                          $ $r_cCs^t|tst|}d}|dkr"t}x6|D].\}}}||jkr(||jkr(||jkr(d}Pq(W|S)NFT)rrZCOMPATIBLE_TAGSrbrcrd)ZwheelrtrLrKrcrdr3r3r4r1s r1)N)UZ __future__rrr{r+emailrrrQr loggingr;rrZrrNrrr-rrcompatrrr r r Zdatabaser rr rrrutilrrrrrrrrrrrhrr getLoggerrWrr%hasattrr[rIrr/r.r&rarr:rrrmr5compile IGNORECASEVERBOSErnrjrrrrr<robjectr=r4rZrLr_r`r1r3r3r3r4s   0          #1 P