o
    tan                     @   s  d Z dZdZdZdZdZdZdZdZdd	l	Z	dd	l
Z
dd	lZdd	lZdd
lT g dZdd Zdd Zdd Zdd Zdd Zdd Zdd Zejj e_ dd Zdd Zdd Zd d! Zzdd"lmZ W n eyn   d	ZY nw d#d$ Zd%d& Zd'd( Zd)d* Z d+d, Z!zdd-lm"Z" W n ey   e!Z#Y nw d.d/ Z#z
dd0lm$Z$m%Z& W n ey   e#Z'Y nw d1d2 Z(d3d4 Z)d5d6d7d8Z'e*e
d9oe
+ d: d;kZ,dAd<d=Z-d>d? Z.z	dd@lm/Z0 W d	S  ey   Y d	S w )BzCommon pathname manipulations, WindowsNT/95 version.

Instead of importing this module directly, import os and refer to this
module as os.path.
...\;/z.;C:\binZnul    N)*)&normcaseisabsjoin
splitdrivesplitsplitextbasenamedirnamecommonprefixgetsizegetmtimegetatimegetctimeislinkexistslexistsisdirisfileismount
expanduser
expandvarsnormpathabspathcurdirpardirseppathsepdefpathaltsepextsepdevnullrealpathsupports_unicode_filenamesrelpathsamefilesameopenfilesamestat
commonpathc                 C   s   t | trdS dS )N   \/\/)
isinstancebytespath r4   !/root/Python-3.10.2/Lib/ntpath.py_get_bothseps"   s   
r6   c                 C   s4   t | } t| tr| dd S | dd S )zaNormalize case of pathname.

    Makes all characters lowercase and all slashes into backslashes.   /   \r   r   )osfspathr0   r1   replacelowersr4   r4   r5   r   ,   s   

r   c                 C   sj   t | } t| tr| dddrdS n| dddr!dS t| d } t| d	ko4| d	 t| v S )
zTest whether a path is absoluter7   r8      \\?\Tr   r   \\?\   r   )	r9   r:   r0   r1   r;   
startswithr   lenr6   r=   r4   r4   r5   r	   =   s   

r	   c           
   
   G   s@  t | } t| trd}d}d}nd}d}d}zs|s"| d d |  t| \}}tt j|D ]>}t|\}}	|	rG|	d |v rG|sB|sD|}|	}q.|r\||kr\| | krZ|}|	}q.|}|rh|d |vrh|| }||	 }q.|r|d |vr|r|dd  |kr|| | W S || W S  ttt	fy   t
jd	| g|R    w )
Nr8   r.      :r   r/   :r   r
   )r9   r:   r0   r1   r   mapr<   	TypeErrorAttributeErrorBytesWarninggenericpath_check_arg_types)
r3   pathsr!   sepscolonZresult_driveZresult_pathpZp_driveZp_pathr4   r4   r5   r
   M   sN   



r
   c                 C   s  t | } t| dkrt| trd}d}d}nd}d}d}| ||}|dd |d krq|dd	 |krq||d}|d
krG| dd | fS |||d }||d kr]| dd | fS |d
kret| }| d| | |d fS |dd |kr| dd | dd fS | dd | fS )a  Split a pathname into drive/UNC sharepoint and relative path specifiers.
    Returns a 2-tuple (drive_or_unc, path); either part may be empty.

    If you assign
        result = splitdrive(p)
    It is always true that:
        result[0] + result[1] == p

    If the path contained a drive letter, drive_or_unc will contain everything
    up to and including the colon.  e.g. splitdrive("c:/dir") returns ("c:", "/dir")

    If the path contained a UNC path, the drive_or_unc will contain the host name
    and share up to but not including the fourth directory separator character.
    e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir")

    Paths cannot contain both a drive letter and a UNC path.

       r8   r7   rD   r   r   rE   r      rF   NrA   )r9   r:   rC   r0   r1   r;   find)rP   r!   r$   rO   Znormpindexindex2r4   r4   r5   r   |   s.   

$r   c                 C   s   t | } t| }t| \}} t| }|r+| |d  |vr+|d8 }|r+| |d  |vs| d| | |d }}||p>|}|| |fS )z~Split a pathname.

    Return tuple (head, tail) where tail is everything after the final slash.
    Either part may be empty.rA   N)r9   r:   r6   r   rC   rstrip)rP   rN   diheadtailr4   r4   r5   r      s   
r   c                 C   s4   t | } t| trt| dddS t| dddS )Nr8   r7      .r   r   r   )r9   r:   r0   r1   rK   	_splitextrP   r4   r4   r5   r      s   

r   c                 C      t | d S )z)Returns the final component of a pathnamerA   r   r]   r4   r4   r5   r         r   c                 C   r^   )z-Returns the directory component of a pathnamer   r_   r]   r4   r4   r5   r      r`   r   c              
   C   s6   zt | }W n tttfy   Y dS w t|jS )zhTest whether a path is a symbolic link.
    This will always return false for Windows prior to 6.0.
    F)r9   lstatOSError
ValueErrorrI   statS_ISLNKst_moder3   str4   r4   r5   r      s   r   c              	   C   s*   zt | }W dS  ttfy   Y dS w )zCTest whether a path exists.  Returns True for broken symbolic linksFT)r9   ra   rb   rc   rg   r4   r4   r5   r      s   r   )_getvolumepathnamec                 C   sp   t | } t| }t| } t| \}}|r"|d |v r"| p!||v S ||v r(dS tr6| |t| |kS dS )zaTest whether a path is a mount point (a drive root, the root of a
    share, or a mounted volume)r   TF)r9   r:   r6   r   r   ri   rV   )r3   rN   rootrestr4   r4   r5   r     s   
r   c                 C   sJ  t | } t| trd}nd}| |s| S dt| }}||k r9| | t| vr9|d7 }||k r9| | t| vs)dt jv rDt jd }n"dt jvrK| S zt jd }W n ty]   d}Y nw t	|t jd }|dkr| d| }t|trzt 
|}t jd}||kr|t|kr| S t	t||}t| trt |}|| |d	  S )
zLExpand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing.   ~~rA   ZUSERPROFILEZHOMEPATHZ	HOMEDRIVE ZUSERNAMEN)r9   r:   r0   r1   rB   rC   r6   environKeyErrorr
   fsdecodegetr   r   fsencode)r3   tilderX   nuserhomedriveZtarget_userZcurrent_userr4   r4   r5   r   !  s@   








r   c                 C   s6  t | } t| tr4d| vrd| vr| S ddl}t|j|j d d}d}d}d}d	}d}tt d
d}n#d| vr>d| vr>| S ddl}|j|j d }d}d}d}d}d}t j}| dd }	d}
t	| }|
|k r| |
|
d  }||kr| |
d d } t	| }z| 
|}
|	|| d|
d   7 }	W q ty   |	||  7 }	|d }
Y qw ||kr| |
d |
d  |kr|	|7 }	|
d7 }
q| |
d d } t	| }z| 
|}
W n ty   |	||  7 }	|d }
Y qw | d|
 }z|du rt t jt | }n|| }W n ty   || | }Y nw |	|7 }	n||kr| |
d |
d  |kr;|	|7 }	|
d7 }
q| |
d |
d  |kr| |
d d } t	| }z| 
|}
W n tyr   |	|| |  7 }	|d }
Y qw | d|
 }z|du rt t jt | }n|| }W n ty   || | | }Y nw |	|7 }	q| dd }|
d7 }
| |
|
d  }|r||v r||7 }|
d7 }
| |
|
d  }|r||v sz|du rt t jt | }n|| }W n ty    || }Y nw |	|7 }	|r|
d8 }
n|	|7 }	|
d7 }
|
|k sh|	S )zfExpand shell variables of the forms $var, ${var} and %var%.

    Unknown variables are left unchanged.   $   %r   Nz_-ascii   '   {   }environb$%'{}rA   rQ   )r9   r:   r0   r1   stringascii_lettersdigitsgetattrro   rC   rT   rc   rs   rq   rp   )r3   r   ZvarcharsZquoteZpercentZbraceZrbraceZdollarro   resrT   Zpathlencvarvaluer4   r4   r5   r   ^  s   









Lr   c           	      C   sN  t | } t| trd}d}d}d}d}n
d}d}d}d	}d
}| |r&| S | ||} t| \}} | |r@||7 }| |} | |}d}|t	|k r|| rW|| |kr[||= n6|| |kr|dkr{||d  |kr{||d |d = |d8 }q|dkr|
|r||= q|d7 }n|d7 }|t	|k sM|s|s|| ||| S )z0Normalize path, eliminating double slashes, etc.r8   r7   r[      ..)s   \\.\r?   r   r   r   r   )z\\.\r@   r   rA   )r9   r:   r0   r1   rB   r;   r   lstripr   rC   endswithappendr
   )	r3   r!   r$   r   r    Zspecial_prefixesprefixcompsrX   r4   r4   r5   r     sH   








r   c                 C   s@   t | } t| st| trt  }nt  }t|| } t| S )zReturn the absolute version of a path as a fallback function in case
    `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for
    more.

    )	r9   r:   r	   r0   r1   getcwdbgetcwdr
   r   )r3   cwdr4   r4   r5   _abspath_fallback  s   



r   )_getfullpathnamec              	   C   s.   zt t| W S  ttfy   t|  Y S w )z&Return the absolute version of a path.)r   r   rb   rc   r   r2   r4   r4   r5   r     s
   r   )_getfinalpathnamereadlinkc              
   C   s   d}t  }t| |vrY|t|  z| }t| } t| s/t|s&|} W | S ttt|| } W n" t	yI } z|j
|v rDW Y d }~| S  d }~w tyR   Y | S w t| |vs| S )N)rA   rQ   rR             2   C   W   i&  i(  i)  )setr   add_nt_readlinkr	   r   r   r
   r   rb   winerrorrc   )r3   allowed_winerrorseenZold_pathexr4   r4   r5   _readlink_deep&  s4   	

r   c                 C   s   d}d}| rqzt | } |rt| |W S | W S  tyn } zM|j|vr# zt| }|| kr<|r3t||n|W W  Y d }~S W n	 tyF   Y nw t| \} }| r[|s[| | W  Y d }~S |rbt||n|}W Y d }~nd }~ww | s|S )N)rA   rQ   rR   r   r   r   r   r   r   {   i  i  rn   )r   r
   rb   r   r   r   )r3   r   rZ   r   new_pathnamer4   r4   r5   _getfinalpathname_nonstrictP  s2   
 r   F)strictc          
   
   C   sv  t | } t| tr!d}d}d}t }t| tttkr dS nd}d}d}t }t| ttkr5dS | 	|}|sEt
| sEt|| } zt| } d	}W n tyi } z|rX |j}t| } W Y d }~nd }~ww |s| 	|r| 	|r|| t|d   }	n| t|d  }	zt|	| kr|	} W | S W | S  ty } z|j|kr|	} W Y d }~| S W Y d }~| S d }~ww | S )
Nr?   s   \\?\UNC\s   \\s   \\.\NULr@   z\\?\UNC\z\\z\\.\NULr   )r   r0   r1   r9   r   r   rs   r&   r   rB   r	   r
   r   rb   r   r   rC   )
r3   r   r   Z
unc_prefixZnew_unc_prefixr   Z
had_prefixZinitial_winerrorr   Zspathr4   r4   r5   r'   ~  s^   





r'   getwindowsversionrR   rQ   c                 C   sX  t | } t| trd}d}d}nd}d}d}|du r|}| s#tdt |}zott|}tt| }t|\}}t|\}	}
t|t|	krQtd	|	|f d
d |	|D }dd |
	|D }d}t
||D ]\}}t|t|krz q|d7 }ql|gt||  ||d  }|s|W S t| W S  tttttfy   td| |  w )z#Return a relative version of a pathr8   r[   r   r   r   r   Nzno path specifiedz&path is on mount %r, start on mount %rc                 S      g | ]}|r|qS r4   r4   .0xr4   r4   r5   
<listcomp>      zrelpath.<locals>.<listcomp>c                 S   r   r4   r4   r   r4   r4   r5   r     r   r   rA   r)   )r9   r:   r0   r1   rc   r   r   r   r   r   ziprC   r
   rH   rI   rJ   DeprecationWarningrK   rL   )r3   startr!   r   r    Z	start_absZpath_absZstart_driveZ
start_restZ
path_driveZ	path_rest
start_list	path_listrX   Ze1Ze2rel_listr4   r4   r5   r)     sJ   




r)   c              	      s  | st dtttj| } t| d trdd dndd dz fd	d
| D }fdd
|D }ztfdd|D \}W n t yP   t ddw ttdd |D dkrbt dt	| d 
 \}}|}fdd
|D }fdd
|D }t|}t|}t|D ]\}	}
|
||	 kr|d|	 } qq|dt| }|r| n|}|| W S  ttfy   tjdg| R    w )zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencer   r8   r7   r[   r   r   r   c                    s    g | ]}t |  qS r4   )r   r;   r<   )r   rP   )r$   r!   r4   r5   r     s     zcommonpath.<locals>.<listcomp>c                    s   g | ]	\}}|  qS r4   r_   r   rW   rP   r!   r4   r5   r     s    c                 3   s$    | ]\}}|d d  kV  qd S )NrA   r4   r   r   r4   r5   	<genexpr>  s   " zcommonpath.<locals>.<genexpr>z%Can't mix absolute and relative pathsNc                 s   s    | ]\}}|V  qd S Nr4   r   r4   r4   r5   r   	  s    rA   zPaths don't have the same drivec                       g | ]
}|r| kr|qS r4   r4   r   r   r   r4   r5   r         c                    s   g | ]} fd d|D qS )c                    r   r4   r4   r   r   r4   r5   r     r   z)commonpath.<locals>.<listcomp>.<listcomp>r4   )r   r>   r   r4   r5   r     s    r-   )rc   tuplerG   r9   r:   r0   r1   r   rC   r   r;   r   minmax	enumerater
   rH   rI   rK   rL   )rM   Zdrivesplitssplit_pathsr	   rw   r3   commons1s2rX   r   r   r4   )r$   r   r!   r5   r-     sL   

r-   )_isdirr   )1__doc__r   r    r%   r!   r"   r$   r#   r&   r9   sysrd   rK   __all__r6   r   r	   r
   r   r   r   r\   r   r   r   r   ntri   ImportErrorr   r   r   r   r   r   r   r   r   r   r'   r   r   hasattrr   r(   r)   r-   r   r   r4   r4   r4   r5   <module>   sz   	
/8
=q2*.
4
84