
    lc              
      <   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 d&dZd'dZ G d de          Zd(dZ ej                    d)d            Zd*dZedk    rddlZ ej                    Ze                    d          s
J d             ede            ed ee
j                              edd            e ej        d d!e                    d"d#          d$                             D ]Z eed%           dS dS )+zPEP 656 support.

This module implements logic to detect if the currently running Python is
linked against musl, and what musl version is used.
    )annotationsN)IOIterator
NamedTuplef	IO[bytes]fmtstrreturntuple[int, ...]c                v    t          j        ||                     t          j        |                              S N)structunpackreadcalcsize)r   r	   s     E/usr/lib/python3/dist-packages/wheel/vendored/packaging/_musllinux.py_read_unpackedr      s*    =affV_S%9%9::;;;    
str | Nonec                b   |                      d           	 t          | d          }n# t          j        $ r Y dS w xY w|dd         t	          d          k    rdS |                      t          j        d          d           	 dd	d
|d                  \  }}}t          j        | }n# t          $ r Y dS w xY w	 t          | |          \  }}}}}}}	n# t          j        $ r Y dS w xY wt          |	dz             D ]}
|                      |||
z  z              	  |t          | |                    \  }}}n# t          j        $ r Y  dS w xY w|dk    rZ|                      |           t          j        |                     |                                        d          }d|vr dS |c S dS )zDetect musl libc location by parsing the Python executable.

    Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
    ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
    r   16BN   s   ELFHHI   )IIIIHHHIIIIIIII)r   r   r   )QQQIHHHIIQQQQQQ)r         )r   r        musl)seekr   r   errortupler   operator
itemgetterKeyErrorrangeosfsdecoder   strip)r   idente_fmtp_fmtp_idxp_get_e_phoffe_phentsizee_phnumip_typep_offsetp_fileszinterpreters                  r   _parse_ld_musl_from_elfr=      s$    FF1IIIq%((<   ttRaRyE*%%%%tFF6?5!!1%%%,
 21
 
 (ue #U+    tt4B1e4L4L17Aq![''<   tt7Q;  	wq()))	).~a/G/G)H)H&FHhh| 	 	 	444	Q;;	xk!&&"2"23399$??$$444sB   ( ;;B( (
B65B6:C C&%C&D77E
Ec                  $    e Zd ZU ded<   ded<   dS )_MuslVersionintmajorminorN)__name__
__module____qualname____annotations__ r   r   r?   r?   I   s"         JJJJJJJJr   r?   output_MuslVersion | Nonec                   d d |                                  D             D             }t          |          dk     s|d         d d         dk    rd S t          j        d|d                   }|sd S t	          t          |                    d                    t          |                    d                    	          S )
Nc                    g | ]}||S rG   rG   .0ns     r   
<listcomp>z'_parse_musl_version.<locals>.<listcomp>O   s    FFF1AFQFFFr   c              3  >   K   | ]}|                                 V  d S r   )r.   rL   s     r   	<genexpr>z&_parse_musl_version.<locals>.<genexpr>O   s*      @@q@@@@@@r   r    r   r   r$   zVersion (\d+)\.(\d+)r   )rA   rB   )
splitlineslenrematchr?   r@   group)rH   linesms      r   _parse_musl_versionrY   N   s    FF@@F,=,=,?,?@@@FFFE
5zzA~~q"1"//t
(%(33A tc!''!**ooS__EEEEr   
executablec                l   t          j                    5 }	 |                    t          | d                    }n# t          $ r Y ddd           dS w xY wt          |          }ddd           n# 1 swxY w Y   |sdS t          j        |gt          j        d          }t          |j
                  S )a`  Detect currently-running musl runtime version.

    This is done by checking the specified executable's dynamic linking
    information, and invoking the loader to parse its output for a version
    string. If the loader is musl, the output would be something like::

        musl libc (x86_64)
        Version 1.2.2
        Dynamic Program Loader
    rbNT)stderrtext)
contextlib	ExitStackenter_contextopenOSErrorr=   
subprocessrunPIPErY   r]   )rZ   stackr   ldprocs        r   _get_musl_versionrj   X   s    
			 (5	##DT$:$:;;AA 	 	 		( ( ( ( ( ( ( (	$Q''( ( ( ( ( ( ( ( ( ( ( ( ( ( (  t>2$zTBBBDt{+++s1   A1#:A1
AA1AA11A58A5archIterator[str]c              #     K   t          t          j                  }|dS t          |j        dd          D ]}d|j         d| d|  V  dS )aT  Generate musllinux tags compatible to the current platform.

    :param arch: Should be the part of platform tag after the ``linux_``
        prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a
        prerequisite for the current platform to be musllinux-compatible.

    :returns: An iterator of compatible musllinux tags.
    N
musllinux_r4   )rj   sysrZ   r+   rB   rA   )rk   sys_muslrB   s      r   platform_tagsrr   p   sr       !00Hx~r2.. ; ;:8>::E::D::::::; ;r   __main__zlinux-z	not linuxzplat:zmusl:ztags: )endz[.-]r4   -r   rn   z
      )r   r   r	   r
   r   r   )r   r   r   r   )rH   r
   r   rI   )rZ   r
   r   rI   )rk   r
   r   rl   ) __doc__
__future__r   r_   	functoolsr(   r,   rT   r   rd   rp   typingr   r   r   r   r=   r?   rY   	lru_cacherj   rr   rC   	sysconfigget_platformplat
startswithprintrZ   subsplittrG   r   r   <module>r      s3    # " " " " "          				 				      



 + + + + + + + + + +< < < <. . . .b    :   
F F F F , , , ,.; ; ; ;  z!9!##D??8$$11k111	E'4	E'$$S^44555	E's]626'3

30B0B20FGGHH ! !aZ      ! !r   