
    "ez                        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 g dZd Z	 ddlmZmZmZ d Zd Zd Zd Zd Zd Zd Zej<                  j                   e_         d Zd Z  e!e	jD                  d      rd Z#nd Z#d Z$	 ddl%m&Z& d Z'd Z(d Z)	 dd l%m*Z* d! Z+d# Z,	 dd$l%m-Z- d% Z.	 dd&l%m/Z/m0Z1 d' Z2d( Z3d)d*d+Z4d,Z5d6d-Z6d. Z7	 dd/l%m8Z9 dd0l%m:Z; dd1l%m<Z= dd2l%m>Z? 	 dd3l%m@Z@ d4 ZAy	# e$ r d ZY w xY w# e$ r d	Z&Y yw xY w# e$ r d" Z+Y tw xY w# e$ r e,Z.Y tw xY w# e$ r e.Z4Y lw xY w# e$ r Y Uw xY w# e$ r d5 ZAY y	w xY w)7zCommon pathname manipulations, WindowsNT/95 version.

Instead of importing this module directly, import os and refer to this
module as os.path.
...\;/z.;C:\binnul    N)*)(normcaseisabsjoin
splitdrive	splitroot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
commonpath
isjunctionc                 &    t        | t              ryy)N   \/\/)
isinstancebytespaths    lib/python3.12/ntpath.py_get_bothsepsr:   #   s    $    )LCMapStringExLOCALE_NAME_INVARIANTLCMAP_LOWERCASEc                 X   t        j                  |       } | s| S t        | t              r]t	        j
                         }| j                  |d      j                  dd      } t        t        t        |       } | j                  |d      S t        t        t        | j                  dd            S )nNormalize case of pathname.

        Makes all characters lowercase and all slashes into backslashes.
        surrogateescaper   r   )osfspathr5   r6   sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodings     r9   r
   r
   3   s    
 IIaLHa002H#45==c4HA5/4A88H&788!"8"2"#))C"68 8r;   c                    t        j                  |       } t        | t              rFt        j                  t        j
                  |       j                  dd      j                               S | j                  dd      j                         S )r@   r   r   )rB   rC   r5   r6   fsencodefsdecoderG   lower)rL   s    r9   r
   r
   F   sb    
 IIaLa;;r{{1~55c4@FFHIIyyd#))++r;   c                     t        j                  |       } t        | t              rd}d}d}nd}d}d}| dd j	                  ||      } | j                  |      s| j                  |d	      ry
y)zTest whether a path is absolute   \   /s   :\r   r   z:\N      TF)rB   rC   r5   r6   rG   
startswith)rL   r$   r'   	colon_seps       r9   r   r   W   sn    
		!A!U			"1fc"A 	||CALLA6r;   c                 8   t        j                  |       } t        | t              rd}d}d}nd}d}d}	 |s| d d |z    t	        |       \  }}}t        t         j                  |      D ]b  }t	        |      \  }	}
}|
r|	s|s|	}|
}|}|	r/|	|k7  r*|	j                         |j                         k7  r|	}|
}|}N|	}|r|d   |vr||z   }||z   }d |r|s|r|dd  ||z   vr||z   |z   S ||z   |z   S # t        t        t        f$ r t        j                  d	| g|   w xY w)
NrS   r3      :r   r4   :r   r   )rB   rC   r5   r6   r   maprQ   	TypeErrorAttributeErrorBytesWarninggenericpath_check_arg_types)r8   pathsr$   sepscolonresult_driveresult_rootresult_pathpp_drivep_rootp_paths               r9   r   r   k   sd   99T?D$!!HsN1:4.k;RYY& 	/A&/l#GVV,#*L$$W4==?l&8&8&::#*L"(K"(K&{2d:)C/%.K+	/. \"#.edlB#%33k)K77~|4 $$VT:E:s   B/C, $C, ,-Dc                 .    t        |       \  }}}|||z   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.

    )r   )ri   driveroottails       r9   r   r      s#    & "!E4$+r;   c                    t        j                  |       } t        | t              rd}d}d}d}d}n
d}d}d}d	}d
}| j	                  ||      }|dd |k(  r||dd |k(  ri|dd j                         |k(  rdnd}|j                  ||      }|dk(  r| ||fS |j                  ||dz         }	|	dk(  r| ||fS | d|	 | |	|	dz    | |	dz   d fS || dd | dd fS |dd |k(  r!|dd |k(  r| dd | dd | dd fS | dd || dd fS ||| fS )a  Split a pathname into drive, root and tail. The drive is defined
    exactly as in splitdrive(). On Windows, the root may be a single path
    separator or an empty string. The tail contains anything after the root.
    For example:

        splitroot('//server/share/') == ('//server/share', '/', '')
        splitroot('C:/Users/Barney') == ('C:', '/', 'Users/Barney')
        splitroot('C:///spam///ham') == ('C:', '/', '//spam///ham')
        splitroot('Windows/notepad') == ('', '', 'Windows/notepad')
    rS   rT   rZ      \\?\UNC\r;   r   r   r[   \\?\UNC\ NrV         r\   rU   )rB   rC   r5   r6   rG   upperfind)
ri   r$   r'   re   
unc_prefixemptynormpstartindexindex2s
             r9   r   r      s    			!A!U$
#
IIfc"ERayC1: r*j8AaEJJsE*E{%&ZZUQY/F|%&Wf:q
3Qvz{^CC !BQ%12&&	qu	1:Ra5!Aa&!AB%'' Ra5%12&& eQr;   c                     t        j                  |       } t        |       }t        |       \  }}} t	        |       }|r| |dz
     |vr|dz  }|r| |dz
     |vr| d| | |d }}||z   |j                  |      z   |fS )z~Split a pathname.

    Return tuple (head, tail) where tail is everything after the final slash.
    Either part may be empty.rV   N)rB   rC   r:   r   lenrstrip)ri   rd   driheadrp   s          r9   r   r      s    
 			!ADlGAq!AA
!A#d"	Q !A#d"2A!"$Dq54;;t$$d**r;   c                     t        j                  |       } t        | t              rt	        j
                  | ddd      S t	        j
                  | ddd      S )NrS   rT      .r   r   r   )rB   rC   r5   r6   ra   	_splitextri   s    r9   r   r     sG    
		!A!U$$QtT::$$Qc377r;   c                     t        |       d   S )z)Returns the final component of a pathnamerV   r   r   s    r9   r   r         8A;r;   c                     t        |       d   S )z-Returns the directory component of a pathnamer   r   r   s    r9   r   r     r   r;   st_reparse_tagc                     	 t        j                  |       }t        |j                  t        j                  k(        S # t        t        t        f$ r Y yw xY wz!Test whether a path is a junctionF)	rB   lstatOSError
ValueErrorr_   boolr   statIO_REPARSE_TAG_MOUNT_POINTr8   sts     r9   r1   r1     sM    	$B B%%)H)HHII ^4 		s   = AAc                 .    t        j                  |        yr   )rB   rC   r7   s    r9   r1   r1   #  s    
		$r;   c                 Z    	 t        j                  |       }y# t        t        f$ r Y yw xY w)zCTest whether a path exists.  Returns True for broken symbolic linksFT)rB   r   r   r   r   s     r9   r   r   +  s2    XXd^  Z  s    **)_getvolumepathnamec                 >   t        j                  |       } t        |       }t        |       } t	        |       \  }}}|r
|d   |v r| S |r|syt
        rL| j                  |      }t        |       j                  |      }|j                         |j                         k(  S y)zaTest whether a path is a mount point (a drive root, the root of a
    share, or a mounted volume)r   TF)rB   rC   r:   r!   r   r   r   casefold)r8   rd   rn   ro   restxys          r9   r   r   A  s     99T?DD4=D!$E4qT!xDKKd#**40zz|qzz|++r;   c                 8   t        j                  |       } t        | t              rd}nd}| j	                  |      s| S dt        |       }}||k  r+| |   t        |       vr|dz  }||k  r| |   t        |       vrdt         j                  v rt         j                  d   }nEdt         j                  vr| S 	 t         j                  d   }t        |t         j                  d         }|dk7  rs| d| }t        |t              rt        j                  |      }t         j                  j                  d      }||k7  r%|t        |      k7  r| S t        t        |      |      }t        | t              rt        j                  |      }|| |d	 z   S # t        $ r d}Y w xY w)
zLExpand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing.   ~~rV   USERPROFILEHOMEPATH	HOMEDRIVErt   USERNAMEN)rB   rC   r5   r6   rW   r   r:   environKeyErrorr   rP   getr   r   rO   )r8   tilder   nuserhomern   target_usercurrent_users           r9   r   r   ^  s{    99T?D$??5!c$iqA
a%DG=#66	Q a%DG=#66 

"::m,2::%	JJ{+E rzz*56Av1Qik5)++k2Kzz~~j1,& x11GH-{;H$;;x(d12h/  	E	s   6F FFc                    t        j                  |       } t        | t              rPd| vrd| vr| S ddl}t        |j
                  |j                  z   dz   d      }d}d}d}d	}d}t        t         d
d      }nDd| vrd| vr| S ddl}|j
                  |j                  z   dz   }d}d}d}d}d}t         j                  }| dd }	d}
t        |       }|
|k  r| |
|
dz    }||k(  r5| |
dz   d } t        |       }	 | j                  |      }
|	|| d|
dz    z   z  }	n||k(  r| |
dz   |
dz    |k(  r|	|z  }	|
dz  }
n| |
dz   d } t        |       }	 | j                  |      }
| d|
 }	 |:t        j                  t         j                  t        j                  |               }n||   }|	|z  }	n%||k(  r| |
dz   |
dz    |k(  r|	|z  }	|
dz  }
n| |
dz   |
dz    |k(  rr| |
dz   d } t        |       }	 | j                  |      }
| d|
 }	 |:t        j                  t         j                  t        j                  |               }n||   }|	|z  }	n| dd }|
dz  }
| |
|
dz    }|r||v r||z  }|
dz  }
| |
|
dz    }|r||v r	 |:t        j                  t         j                  t        j                  |               }n||   }|	|z  }	|r|
dz  }
n|	|z  }	|
dz  }
|
|k  r|	S # t        $ r |	|| z   z  }	|dz
  }
Y &w xY w# t        $ r ||z   |z   }Y jw xY w# t        $ r |	|| z   z  }	|dz
  }
Y Zw xY w# t        $ r ||z   |z   |z   }Y w xY w# t        $ r |	||z   | z   z  }	|dz
  }
Y w xY w# t        $ r ||z   }Y w xY w)zfExpand shell variables of the forms $var, ${var} and %var%.

    Unknown variables are left unchanged.   $   %r   Nz_-ascii   '   {   }environb$%'{}rV   ru   )rB   rC   r5   r6   stringascii_lettersdigitsgetattrr   r   r}   r   rO   rP   r   )r8   r   varcharsquotepercentbracerbracedollarr   resr}   pathlencvarvalues                  r9   r   r     sH    99T?D$tD 0K--=DgN"j$/d?s$K''&--7$>**
r(CE$iG
'/uQw:	
#D$iG$

1q4
+++ '\EAIeai(G3q
E!GH~d)! JJw/E
 v,C8"?$&KK

2;;s;K0L$ME$+CLE 5LC&[EAIeai(F2q
eai	*e3E!GH~d)! JJv.E
 v,C>"?$&KK

2;;s;K0L$ME$+CLE 5LC2Ah
uqy)AM1HCQJEU519-A AM) "BJJr{{37G,H I ' uQJE1HC
W '/X JI  $q4x!$, $ 8 '# 78 " (7T>)C#aKE(@ $ > & 4v => " (6E>D00C#aKE(4   )"SLE)so   3K L AK5 (M ?AL) 8AM" K21K25L
	L
L&%L&)M ?M MM"M32M3)_path_normpathc                     t        j                  |       } t        | t              r5t        j                  t        t        j                  |                   xs dS t        |       xs dS )0Normalize path, eliminating double slashes, etc.r   r   )rB   rC   r5   r6   rO   r   rP   r7   s    r9   r    r    4  sK    yydE";;~bkk$.?@AITId#*s*r;   c                    t        j                  |       } t        | t              r	d}d}d}d}nd}d}d}d}| j	                  ||      } t        |       \  }}} ||z   }| j                  |      }d	}	|	t        |      k  r_||	   r||	   |k(  r||	= n?||	   |k(  r2|	d	kD  r||	d
z
     |k7  r||	d
z
  |	d
z   = |	d
z  }	n|	d	k(  r|r||	= n|	d
z  }	n|	d
z  }	|	t        |      k  r_|s|s|j                  |       ||j                  |      z   S )r   rS   rT   r      ..r   r   r   r   r   rV   )
rB   rC   r5   r6   rG   r   r   r   appendr   )
r8   r$   r'   r"   r#   rn   ro   prefixcompsr   s
             r9   r    r      s3   yydE"CFFFCFFF||FC(%dOtT

3#e*n8uQx61!HqV#q5U1Q3Z61ac!A#gFA!VaFAQ #e*n eLL ''r;   c                     t        j                  |       } t        |       sEt        | t              rt        j
                         }nt        j                         }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.

    )	rB   rC   r   r5   r6   getcwdbgetcwdr   r    )r8   cwds     r9   _abspath_fallbackr   <  sM     99T?D;dE"**,C))+CCD>r;   )_getfullpathnamec                 l    	 t        t        |             S # t        t        f$ r t	        |       cY S w xY w)z&Return the absolute version of a path.)r   r    r   r   r   r7   s    r9   r!   r!   T  s5    	+#HTN33$ 	+$T**	+s    33)_getfinalpathnamereadlinkc                 x   d}t               }t        |       |vro|j                  t        |              	 | }t        |       } t	        |       s.t        |      s|} 	 | S t        t        t        |      |             } t        |       |vro| S # t        $ r}|j                  |v rY d }~| S  d }~wt        $ r Y | S w xY w)N)rV   ru   rU             2   C   W   i&  i(  i)  )setr
   add_nt_readlinkr   r   r    r   r   r   winerrorr   )r8   allowed_winerrorseenold_pathexs        r9   _readlink_deepr   a  s     LutnD(HHXd^$#D) T{ "(+'  $D):D$ABD tnD(,   ;;"22
 	  s)   %B B 	B9B)(B))B98B9c                 f   d}| d d }| r	 t        |       } |rt        | |      S | S |S # t        $ r{}|j                  |vr 	 t	        |       }|| k7  r|rt        ||      n|cY d }~S n# t        $ r Y nw xY wt        |       \  } }| r|s
| |z   cY d }~S |rt        ||      n|}Y d }~nd }~ww xY w| r)N)rV   ru   rU   r   r   r   r   5   A   r   r   {      i  i  r   )r   r   r   r   r   r   )r8   r   rp   r   new_pathnames         r9   _getfinalpathname_nonstrictr     s    $ X BQx:(.+/tD$'9T9* )  :;;&66	  .d3H4'7;tHd3I (  #4[
d $;&+/tD$'T':	 sN   ( ( 	B,B'A' B,&B''	A30B'2A33B'B,B''B,F)strictc                   t        |       } t        | t              rId}d}d}t        j                         }t        |       t        t        j                  t                    k(  r7yd}d}d}t        j                         }t        |       t        t              k(  ry| j                  |      }|st        |       st        ||       } 	 t        |       } d	}|sU| j                  |      rD| j                  |      r|| t%        |      d  z   }	n| t%        |      d  }		 t        |	      | k(  r|	} | S | S # t        $ r,}|rt        t        |            d t        |       } Y d }~d }~wt        $ r$}|r |j                   }t#        |       } Y d }~d }~ww xY w# t        $ r}Y d }~| S d }~wt        $ r}|j                   k(  r|	} Y d }~| S d }~ww xY w)
Ns   \\?\rr   s   \\s   \\.\NULz\\?\rs   z\\z\\.\NULr   )r    r5   r6   rB   r   r
   rO   r)   r   rW   r   r   r   r   r   strr   r   r   )
r8   r   r   ry   new_unc_prefixr   
had_prefixinitial_winerrorr   spaths
             r9   r*   r*     s   ~dE"F(J$N**,C~"++g*>!??$F'J#N))+C~'!22#__V,
%+T?D	5$T*D " doof5 z*&c*o.>)??S[\*!$U+t3 D tI  	"
 c"g&D0D>D 	5!{{.t4D		5&      ! ;;"22 D!sB   D, F ,	F5"EF(FF	GG*GGTc                 L   t        j                  |       } t        | t              rd}d}d}nd}d}d}||}| st	        d      t        j                  |      }	 t        t        |            }t        t        |             }t        |      \  }}}	t        |      \  }
}}t        |      t        |
      k7  rt	        d	|
d
|      |	j                  |      D cg c]  }|s|	 }}|j                  |      D cg c]  }|s|	 }}d}t        ||      D ]#  \  }}t        |      t        |      k7  r n|dz  }% |gt        |      |z
  z  ||d z   }|s|S t        | S c c}w c c}w # t        t        t        t        t         f$ r t#        j$                  d| |        w xY w)z#Return a relative version of a pathrS   r   r   r   r   r   Nzno path specifiedzpath is on mount z, start on mount r   rV   r,   )rB   rC   r5   r6   r   r!   r    r   r
   r   zipr   r   r^   r_   r`   DeprecationWarningra   rb   )r8   r|   r$   r"   r#   	start_abspath_absstart_drive_
start_rest
path_drive	path_restr   
start_list	path_listr   e1e2rel_lists                      r9   r,   r,     s   99T?D$},--IIeEHUO,	8D>*%.y%9"Q
#,X#6 
AyK HZ$88K) * * ",!1!1#!6<A!a<
< ) 4:1Q:	:*i0 	FB|x|+FA	
 8s:q01IabMAMX =: z><AST $$Ye<s>   BE, E"#E"'E, <E'E'AE, E, "
E, ,7F#c           
      `   | st        d      t        t        t        j                  |             } t        | d   t              rd}d}d}nd}d}d}	 | D cg c]+  }t        |j                  ||      j                               - }}|D cg c]  \  }}}|j                  |       }}}}t        |D ch c]  \  }}}|
 c}}}      d	k7  rt        d
      t        |D ch c]  \  }}}|
 c}}}      d	k7  rt        d      t        | d   j                  ||            \  }	}
}|j                  |      }|D cg c]  }|s||k7  s| }}|D cg c]  }|D cg c]  }|s||k7  s| c} }}}t        |      }t        |      }t        |      D ]  \  }}|||   k7  s|d| } n |dt        |       }|	|
z   |j                  |      z   S c c}w c c}}}w c c}}}w c c}}}w c c}w c c}w c c}}w # t         t"        f$ r t%        j&                  dg|    w xY w)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencer   rS   rT   r   r   r   r   rV   z%Can't mix absolute and relative pathszPaths don't have the same driveNr0   )r   tupler]   rB   rC   r5   r6   r   rG   rQ   r   r   minmax	enumerater   r^   r_   ra   rb   )rc   r$   r'   r"   ri   drivesplitsr   r   split_pathsrn   ro   r8   commonr   rL   s1s2r   s                     r9   r0   r0   6  s+    @AA#bii'(E%(E"JOPQy63!7!=!=!?@PP3>??1aqwws|??--gaA-.!3DEE
 --gaA-.!3>??%eAh&6&6vs&CDtTC#9qQ&[!99DOPq1:aa6k:PPbM 	&DAqBqEz	&
 HSW%Ft|chhv...5 Q?- .
 ::P ~& $$\:E:s   H 0GH G!*H 9G("H (G/5AH G6G6G6H 	H %G;-G;3G;7H <2H /,H H ;H  H 'H-)_path_isdir)_path_isfile)_path_islink)_path_exists)_path_isdevdrivec                 J    	 t        t        |             S # t        $ r Y yw xY wz@Determines whether the specified path is on a Windows Dev Drive.F)r  r!   r   r7   s    r9   
isdevdriver  |  s(    	#GDM22 		s    	""c                      yr   r7   s    r9   r  r  w  s     r;   )N)B__doc__r"   r#   r(   r$   r%   r'   r&   r)   rB   rD   r   ra   __all__r:   _winapir<   rH   r=   rI   r>   rJ   r
   ImportErrorr   r   r   r   r   r   r   r   r   hasattrstat_resultr1   r   ntr   r   r   r   r   r    r   r   r!   r   r   r   r   r   r*   r+   r,   r0   r  r   r  r   r  r   r  r   r  r  r  r;   r9   <module>r&     s   
		

	

 	 
   O!,- -
8H(+b.1r+*8 ((00 
 2>>+,J$%:-zj`.+!P+"+#+]>
(T/b "' <@ " +p.b
	 ()))#o  	,,	,t  ^  #("(#(D   G   Hd  		  s}   C6 D D +D 5D, D9 ,E 6D DDDDDD)(D),D65D69E EEE