
    Kxh              
          d 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mZ de
e         dedeedf         fdZde
e         dee         fd	Z G d
 de          Zdedee         fdZ ej                    dedee         fd            Zdedee         f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.
    N)IOIterator
NamedTupleOptionalTupleffmtreturn.c                 v    t          j        ||                     t          j        |                              S N)structunpackreadcalcsize)r   r	   s     S/var/www/html/what/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py_read_unpackedr      s*    =affV_S%9%9::;;;    c                 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 eed<   eed<   dS )_MuslVersionmajorminorN)__name__
__module____qualname__int__annotations__ r   r   r<   r<   G   s"         JJJJJJJJr   r<   outputc                    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 rD   rD   .0ns     r   
<listcomp>z'_parse_musl_version.<locals>.<listcomp>M   s    FFF1AFQFFFr   c              3   >   K   | ]}|                                 V  d S r   )r+   rH   s     r   	<genexpr>z&_parse_musl_version.<locals>.<genexpr>M   s*      @@q@@@@@@r   r   r   r   r!   zVersion (\d+)\.(\d+)r   )r=   r>   )
splitlineslenrematchr<   rB   group)rE   linesms      r   _parse_musl_versionrU   L   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universal_newlines)
contextlib	ExitStackenter_contextopenOSErrorr:   
subprocessrunPIPErU   rY   )rV   stackr   ldprocs        r   _get_musl_versionrf   V   s    
			 (5	##DT$:$:;;AA 	 	 		( ( ( ( ( ( ( (	$Q''( ( ( ( ( ( ( ( ( ( ( ( ( ( (  t>2$z4PPPDt{+++s1   A1#:A1
AA1AA11A58A5archc              #      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_r1   )rf   sysrV   r(   r>   r=   )rg   sys_muslr>   s      r   platform_tagsrm   n   sr       !00Hx~r2.. ; ;:8>::E::D::::::; ;r   __main__zlinux-z	not linuxzplat:zmusl:ztags: )endz[.-]r1   -r   ri   z
      )#__doc__r[   	functoolsr%   r)   rP   r   r`   rk   typingr   r   r   r   r   bytesstrrB   r   r:   r<   rU   	lru_cacherf   rm   r?   	sysconfigget_platformplat
startswithprintrV   subsplittrD   r   r   <module>r      s             				 				      



 < < < < < < < < < < < < < <<bi <c <eCHo < < < <.r%y .Xc] . . . .b    :   
F F(> 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   