+
    UBiX                     (   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t
Ht ^ RIHt ^ RIHt ^ RIHtHtHtH	t	HtHtHtHtHtHtHtHtHtHtHt ^RIHt ]P@                  R28  d   ]]!]]!,          3,          t"M]]!]3,          t"]! R]"R7      t# ]PH                  ]PJ                  3 U u. uF"  p V '       g   K  V ]PH                  8w  g   K   V NK$  	  up t& / t' R	 R
 lt(R R lt)R3R R llt*R R lt+R R lt,R4R R llt-R R lt.R4R R llt/R4R lt0R R lt1R R lt2R R lt3R3R  R! llt4R3R" R# llt5R3R$ R% llt6 ! R& R']74      t8 ! R( R)]74      t9]! R*R+7       ! R, R-]]#,          4      4       t: ! R. R/];4      t< ! R0 R1];4      t=R# u up i )5zC
This module provides utility methods for dealing with path-specs.
N)
CollectionIterable)	dataclass)PathLike)AnyAnyStrCallabler   DictGenericr   IteratorListOptionalSequenceSetTupleTypeVarUnion)PatternTStrPath)boundc                D    V ^8  d   QhR\         P                  R\        /# )   pathreturn)pathlibPathstr)formats   "2/usr/lib/python3.14/site-packages/pathspec/util.py__annotate__r   D   s       #     c                v    \        V 4      pV P                  4       '       d   V\        P                  ,          pV# )a.  
Appends the path separator to the path if the path is a directory.
This can be used to aid in distinguishing between directories and
files on the file-system by relying on the presence of a trailing path
separator.

*path* (:class:`pathlib.Path`) is the path to use.

Returns the path (:class:`str`).
)r   is_dirossep)r   str_paths   & r   append_dir_sepr&   D   s+     IKKMM
bff(r    c          	          V ^8  d   QhR\         \        \        \        3,          ,          R\        R\        \
        \        ,          \
        \        ,          3,          /# r   patternsfiler   )r   r   intr   r   r   bool)r   s   "r   r   r   V   sF      E#w,'(
 8D>8C=()r    c                    RpRpV  F8  w  rEVP                   f   K  VP                  V4      f   K*  VP                   pTpK:  	  W#3# )a  
Check the file against the patterns.

*patterns* (:class:`~collections.abc.Iterable`) yields each indexed pattern
(:class:`tuple`) which contains the pattern index (:class:`int`) and actual
pattern (:class:`~pathspec.pattern.Pattern`).

*file* (:class:`str`) is the normalized file path to be matched
against *patterns*.

Returns a :class:`tuple` containing whether to include *file* (:class:`bool`
or :data:`None`), and the index of the last matched pattern (:class:`int` or
:data:`None`).
Ninclude
match_file)r)   r*   out_include	out_indexindexpatterns   &&    r   check_match_filer5   V   sM    $  $ ^U__ W%7%7%=%I;9  
 	r    c          
          V ^8  d   QhR\         \        ,          R\         \        ,          R\        \        ,          R\
        \        R3,          /# )r   r)   filesall_matchesr   MatchDetail)r   r   r   r   r,   r	   )r   s   "r   r   r   r   sG     + +G++ tn+ 
#}
	+r    c                   \        V\        4      '       d   TM
\        V4      p/ pV  F  pVP                  f   K  VP	                  V4      pVP                  '       db   V FY  pWt9   dC   V'       d$   WG,          P
                  P                  V4       K4  WTV,          P
                  ^ &   KK  \        V.4      WG&   K[  	  K  V F  pWH K  	  K  	  V# )a  
Matches the files to the patterns, and returns which patterns matched
the files.

*patterns* (:class:`~collections.abc.Iterable` of :class:`~pathspec.pattern.Pattern`)
contains the patterns to use.

*files* (:class:`~collections.abc.Iterable` of :class:`str`) contains
the normalized file paths to be matched against *patterns*.

*all_matches* (:class:`bool` or :data:`None`) is whether to return all
matches patterns (:data:`True`), or only the last matched pattern
(:data:`False`). Default is :data:`None` for :data:`False`.

Returns the matched files (:class:`dict`) which maps each matched file
(:class:`str`) to the patterns that matched in order (:class:`.MatchDetail`).
)
isinstanceCollectionTypelistr/   matchr)   appendr9   )	r)   r7   r8   	all_filesreturn_filesr4   result_filesresult_filer*   s	   &&&      r   detailed_match_filesrD   r   s    , !77UT%[W__ --	*<ooo##	 ))009/6K ))!,"-wi"8l $ 		 ! & 	r    c                ~    V ^8  d   QhR\         \        ,          R\        \        \        \        3,          ,          /# )r   r)   r   )r   r   r   r   r+   )r   s   "r   r   r      s/      G	%W
r    c                n    \        V 4       UUu. uF  w  rVP                  f   K  W3NK  	  upp# u uppi )a  
Filters out null-patterns.

*patterns* (:class:`Iterable` of :class:`.Pattern`) contains the
patterns.

Returns a :class:`list` containing each indexed pattern (:class:`tuple`) which
contains the pattern index (:class:`int`) and the actual pattern
(:class:`~pathspec.pattern.Pattern`).
)	enumerater/   )r)   __index__pats   &  r   _filter_check_patternsrJ      s<     "(+	+ng
]] 7+	  	s   11c                0    V ^8  d   QhR\         R\        /# )r   valuer   )r   r,   )r   s   "r   r   r      s     P P P Pr    c                h    \        V \        4      ;'       d    \        V \        \        34      '       * # )z
Check whether the value is an iterable (excludes strings).

*value* is the value to check,

Returns whether *value* is a iterable (:class:`bool`).
)r;   IterableTyper   bytes)rL   s   &r   _is_iterablerP      s'     	5,'OO
53,0O,OOr    c          	          V ^8  d   QhR\         R\        \        \        .R3,          ,          R\        \        ,          R\
        R,          /# )r   rooton_errorNfollow_linksr   	TreeEntry)StrPathr   r   OSErrorr,   r   )r   s   "r   r   r      sO      [  [ [HgY_-. [ ~ [ k	 [r    c              #     "   Ve"   \        V4      '       g   \        RV: R24      hVf   Rp\        \        P                  P                  V 4      R/ W4       Rj  xL
  R#  L5i)a   
Walks the specified directory for all files and directories.

*root* (:class:`str` or :class:`os.PathLike`) is the root directory to
search.

*on_error* (:class:`~collections.abc.Callable` or :data:`None`)
optionally is the error handler for file-system exceptions. It will be
called with the exception (:exc:`OSError`). Reraise the exception to
abort the walk. Default is :data:`None` to ignore file-system
exceptions.

*follow_links* (:class:`bool` or :data:`None`) optionally is whether
to walk symbolic links that resolve to directories. Default is
:data:`None` for :data:`True`.

Raises :exc:`RecursionError` if recursion is detected.

Returns an :class:`~collections.abc.Iterator` yielding each file or
directory entry (:class:`.TreeEntry`) relative to *root*.
Nz	on_error: is not callable.T )callable	TypeError_iter_tree_entries_nextr#   r   abspathrR   rS   rT   s   &&&r   iter_tree_entriesr`      sX     4 (!3!3Ih\):;<<,#BGGOOD$92r8ZZZs   AA%A#A%c                    V ^8  d   QhR\         R\         R\        \         \         3,          R\        \        .R3,          R\        R\
        R,          /# )	r   	root_fulldir_relmemorS   NrT   r   rU   )r   r	   r   rW   r,   r   )r   s   "r   r   r      sd     N NN
N CH~N WItO$	N
 N kNr    c           
   #    "   \         P                  P                  W4      p\         P                  P                  V4      pWb9  d   WV&   M\	        WbV,          VR7      h\         P
                  ! V4      ;_uu_ 4       pV F  p\         P                  P                  WP                  4      p	 VP                  RR7      p
TP                  4       '       d    TP                  4       pMT
pTP                  TR7      '       d1   \        TP                  YT4      x  \        Y	Y#T4       Rj  xL
  K  TP                  4       '       g   TP                  4       '       g   K  \        TP                  YT4      x  K  	  RRR4       W& R#   \         d   pTe	   T! T4        Rp?EK&  Rp?ii ; i  \         d   pTe	   T! T4        Rp?EKL  Rp?ii ; i L  + '       g   i     Lb; i5i)ad  
Scan the directory for all descendant files.

*root_full* (:class:`str`) the absolute path to the root directory.

*dir_rel* (:class:`str`) the path to the directory to scan relative to
*root_full*.

*memo* (:class:`dict`) keeps track of ancestor directories
encountered. Maps each ancestor real path (:class:`str`) to relative
path (:class:`str`).

*on_error* (:class:`~collections.abc.Callable` or :data:`None`)
optionally is the error handler for file-system exceptions.

*follow_links* (:class:`bool`) is whether to walk symbolic links that
resolve to directories.

Yields each entry (:class:`.TreeEntry`).
)	real_path
first_pathsecond_pathF)follow_symlinksN)r#   r   joinrealpathRecursionErrorscandirnamestatrW   
is_symlinkr"   rU   r]   is_file)rb   rc   rd   rS   rT   dir_fulldir_real	scan_iternode_entnode_rel
node_lstate	node_stats   &&&&&        r   r]   r]      s    6 GGLL,GGX&
 x.8nRYZZjjihggll7MM28u5J Y Ioolo33 HMM8
CC&yDLYYYh1133
HMM8
CC?  P 
^A  a[  qk Z; s   A<G*>/G.F	 GF/'G)G+G
,GG G=G*	F,	F'	 G'F,	,G/G	:G	GG	GG'	"G*c          	          V ^8  d   QhR\         R\        \        \        .R3,          ,          R\        \        ,          R\
        \        ,          /# )r   rR   rS   NrT   r   )rV   r   r   rW   r,   r   r   )r   s   "r   r   r   3  sH      HgY_-. ~ c]	r    c              #     "   \        WVR7       F*  pVP                  V4      '       d   K  VP                  x  K,  	  R# 5i)a  
Walks the specified directory for all files.

*root* (:class:`str` or :class:`os.PathLike`) is the root directory to
search for files.

*on_error* (:class:`~collections.abc.Callable` or :data:`None`)
optionally is the error handler for file-system exceptions. It will be
called with the exception (:exc:`OSError`). Reraise the exception to
abort the walk. Default is :data:`None` to ignore file-system
exceptions.

*follow_links* (:class:`bool` or :data:`None`) optionally is whether
to walk symbolic links that resolve to directories. Default is
:data:`None` for :data:`True`.

Raises :exc:`RecursionError` if recursion is detected.

Returns an :class:`~collections.abc.Iterator` yielding the path to
each file (:class:`str`) relative to *root*.
rS   rT   N)r`   r"   r   )rR   rS   rT   entrys   &&& r   iter_tree_filesr~   3  s2     4  lSU	l	#	#	 Ts
   %A A c                V    \         P                  ! R\        ^R7       \        WVR7      # )zd
DEPRECATED: The :func:`.iter_tree` function is an alias for the
:func:`.iter_tree_files` function.
zCutil.iter_tree() is deprecated. Use util.iter_tree_files() instead.
stacklevelr|   )warningswarnDeprecationWarningr~   r_   s   &&&r   	iter_treer   R  s'    
 
G1& 	lKKr    c                T    V ^8  d   QhR\         R\        \        .\        3,          /# )r   rn   r   r   r   r   r   )r   s   "r   r   r   ]  s&     	# 	# 	#6(G*;!< 	#r    c                    \         V ,          # )z
Lookups a registered pattern factory by name.

*name* (:class:`str`) is the name of the pattern factory.

Returns the registered pattern factory (:class:`~collections.abc.Callable`).
If no pattern factory is registered, raises :exc:`KeyError`.
)_registered_patterns)rn   s   &r   lookup_patternr   ]  s     	T""r    c                R    V ^8  d   QhR\         \        ,          R\        R\        /# r(   )r   r   r   r,   )r   s   "r   r   r   i  s&      '* # $ r    c                ~    RpV  F4  pVP                   f   K  VP                  V4      f   K(  VP                   pK6  	  V# )a0  
Matches the file to the patterns.

*patterns* (:class:`~collections.abc.Iterable` of :class:`~pathspec.pattern.Pattern`)
contains the patterns to use.

*file* (:class:`str`) is the normalized file path to be matched
against *patterns*.

Returns :data:`True` if *file* matched; otherwise, :data:`False`.
Fr.   )r)   r*   matchedr4   s   &&  r   r0   r0   i  s=     W__ W%7%7%=%I__7  	r    c                ~    V ^8  d   QhR\         \        ,          R\         \        ,          R\        \        ,          /# )r   r)   r7   r   )r   r   r   r   )r   s   "r   r   r   }  s3      G 	Xr    c                   \         P                  ! \         R\         R2\        ^R7       V  Uu. uF  q"P                  f   K  VNK  	  pp\        4       pV F'  p\        W54      '       g   K  VP                  V4       K)  	  V# u upi )a  
DEPRECATED: This is an old function no longer used. Use the
:func:`~pathspec.util.match_file` function with a loop for better results.

Matches the files to the patterns.

*patterns* (:class:`~collections.abc.Iterable` of :class:`~pathspec.pattern.Pattern`)
contains the patterns to use.

*files* (:class:`~collections.abc.Iterable` of :class:`str`) contains
the normalized file paths to be matched against *patterns*.

Returns the matched files (:class:`set` of :class:`str`).
z".match_files() is deprecated. Use z-.match_file() with a loop for better results.r   )r   r   __name__r   r/   setr0   add)r)   r7   rI   use_patternsrA   r*   s   &&    r   match_filesr   }  s    $ 
J0
 ;  1&
 %-JH5HJT##D  	 Ks   BBc                h    V ^8  d   QhR\         R\        \        \        ,          ,          R\        /# )r   r*   
separatorsr   )rV   r   r   r   )r   s   "r   r   r     s/     % %%jo&% 	%r    c                   Vf   \         p\        P                  ! V 4      pV F#  pVP                  V\        P
                  4      pK%  	  VP                  R4      '       d   VR,          pV# VP                  R4      '       d
   VR,          pV# )an  
Normalizes the file path to use the POSIX path separator (i.e.,
``"/"``), and make the paths relative (remove leading ``"/"``).

*file* (:class:`str` or :class:`os.PathLike`) is the file path.

*separators* (:class:`~collections.abc.Collection` of :class:`str`; or
``None``) optionally contains the path separators to normalize.
This does not need to include the POSIX path separator (``"/"``),
but including it will not affect the results. Default is ``None``
for ``NORMALIZE_PATH_SEPS``. To prevent normalization, pass an
empty container (e.g., an empty tuple ``()``).

Returns the normalized file path (:class:`str`).
/:   NNz./:r   NN)NORMALIZE_PATH_SEPSr#   fspathreplace	posixpathr$   
startswith)r*   r   	norm_filer$   s   &&  r   normalize_filer     s    ( "* ))D/SY]]3)  m) 		 4  m)r    c          	          V ^8  d   QhR\         \        ,          R\        \        \        ,          ,          R\
        \        \        \        ,          3,          /# )r   r7   r   r   )r   rV   r   r   r   r	   r   )r   s   "r   r   r     sB     " ""jo&" 
#tG}
"r    c                    \         P                  ! R\        ^R7       / pV  F3  p\        W1R7      pWB9   d   W$,          P	                  V4       K.  V.W$&   K5  	  V# )a  
DEPRECATED: This function is no longer used. Use the :func:`.normalize_file`
function with a loop for better results.

Normalizes the file paths to use the POSIX path separator.

*files* (:class:`~collections.abc.Iterable` of :class:`str` or
:class:`os.PathLike`) contains the file paths to be normalized.

*separators* (:class:`~collections.abc.Collection` of :class:`str`; or
:data:`None`) optionally contains the path separators to normalize.
See :func:`normalize_file` for more information.

Returns a :class:`dict` mapping each normalized file path (:class:`str`)
to the original file paths (:class:`list` of :class:`str` or
:class:`os.PathLike`).
z_util.normalize_files() is deprecated. Use util.normalize_file() with a loop for better results.r   )r   )r   r   r   r   r?   )r7   r   
norm_filesr   r   s   &&   r   normalize_filesr     s^    * 
$1&
 TT9)% 6:  	r    c                z    V ^8  d   QhR\         R\        \        .\        3,          R\        \
        ,          RR/# )r   rn   pattern_factoryoverrider   N)r   r   r   r   r   r,   )r   s   "r   r   r     s@     . .
.F8W,-. D>. 
	.r    c                    \        V \        4      '       g   \        RV : R24      h\        V4      '       g   \        RV: R24      hV \        9   d    V'       g   \        V \        V ,          4      hV\        V &   R# )a:  
Registers the specified pattern factory.

*name* (:class:`str`) is the name to register the pattern factory
under.

*pattern_factory* (:class:`~collections.abc.Callable`) is used to
compile patterns. It must accept an uncompiled pattern (:class:`str`)
and return the compiled pattern (:class:`.Pattern`).

*override* (:class:`bool` or :data:`None`) optionally is whether to
allow overriding an already registered pattern under the same name
(:data:`True`), instead of raising an :exc:`AlreadyRegisteredError`
(:data:`False`). Default is :data:`None` for :data:`False`.
zname:z is not a string.zpattern_factory:rY   N)r;   r   r\   r[   r   AlreadyRegisteredError)rn   r   r   s   &&&r   register_patternr     sq    ( 	4E$!2344!!$_$77HIJJ  t%9$%?@@-dr    c                      a a ] tR tRt oRtV3R lV 3R llt]V3R lR l4       t]V3R lR l4       t]V3R	 lR
 l4       t	Rt
VtV ;t# )r   i  zy
The :exc:`AlreadyRegisteredError` exception is raised when a pattern
factory is registered under a name already in use.
c                B   < V ^8  d   QhRS[ RS[S[.S[3,          RR/# )r   rn   r   r   Nr   )r   __classdict__s   "r   r   #AlreadyRegisteredError.__annotate__  s:     F FF VHg-.F 	Fr    c                .   < \         \        V `  W4       R# )z
Initializes the :exc:`AlreadyRegisteredError` instance.

*name* (:class:`str`) is the name of the registered pattern.

*pattern_factory* (:class:`~collections.abc.Callable`) is the
registered pattern factory.
N)superr   __init__)selfrn   r   	__class__s   &&&r   r   AlreadyRegisteredError.__init__  s     .tEr    c                    < V ^8  d   QhRS[ /# r   r   r   )r   r   s   "r   r   r   !  s      c r    c                P    RP                  V P                  V P                  R7      # )0
*message* (:class:`str`) is the error message.
zG{name!r} is already registered for pattern factory:{pattern_factory!r}.)rn   r   )r   rn   r   r   s   &r   messageAlreadyRegisteredError.message   s.    
 
S	Y	Y		'' 
Z 
 r    c                    < V ^8  d   QhRS[ /# r   r   )r   r   s   "r   r   r   +  s      3 r    c                (    V P                   ^ ,          # )z>
*name* (:class:`str`) is the name of the registered pattern.
argsr   s   &r   rn   AlreadyRegisteredError.name*  s    
 
1r    c                8   < V ^8  d   QhRS[ S[.S[3,          /# r   )r   r   r   )r   r   s   "r   r   r   2  s       hx'89 r    c                (    V P                   ^,          # )z[
*pattern_factory* (:class:`~collections.abc.Callable`) is the
registered pattern factory.
r   r   s   &r   r   &AlreadyRegisteredError.pattern_factory1       
1r     )r   
__module____qualname____firstlineno____doc__r   propertyr   rn   r   __static_attributes____classdictcell____classcell__r   r   s   @@r   r   r     sW     
F F       r    r   c                      a a ] tR tRt oRtV3R lV 3R llt]V3R lR l4       t]V3R lR l4       t]V3R	 lR
 l4       t	]V3R lR l4       t
RtVtV ;t# )rl   i:  zK
The :exc:`RecursionError` exception is raised when recursion is
detected.
c                0   < V ^8  d   QhRS[ RS[ RS[ RR/# )r   rf   rg   rh   r   Nr   )r   r   s   "r   r   RecursionError.__annotate__@  s9     K KK K 	K
 Kr    c                0   < \         \        V `  WV4       R# )a  
Initializes the :exc:`RecursionError` instance.

*real_path* (:class:`str`) is the real path that recursion was
encountered on.

*first_path* (:class:`str`) is the first path encountered for
*real_path*.

*second_path* (:class:`str`) is the second path encountered for
*real_path*.
N)r   rl   r   )r   rf   rg   rh   r   s   &&&&r   r   RecursionError.__init__@  s    $ &ykJr    c                    < V ^8  d   QhRS[ /# r   r   )r   r   s   "r   r   r   U  s       r    c                (    V P                   ^,          # )zr
*first_path* (:class:`str`) is the first path encountered for
:attr:`self.real_path <RecursionError.real_path>`.
r   r   s   &r   rg   RecursionError.first_pathT  r   r    c                    < V ^8  d   QhRS[ /# r   r   )r   r   s   "r   r   r   ]  s      c r    c                f    RP                  V P                  V P                  V P                  R7      # )r   zDReal path {real!r} was encountered at {first!r} and then {second!r}.)realfirstsecond)r   rf   rg   rh   r   s   &r   r   RecursionError.message\  s5    
 
P	V	V	


 
W 
 r    c                    < V ^8  d   QhRS[ /# r   r   )r   r   s   "r   r   r   h  s       r    c                (    V P                   ^ ,          # )zP
*real_path* (:class:`str`) is the real path that recursion was
encountered on.
r   r   s   &r   rf   RecursionError.real_pathg  r   r    c                    < V ^8  d   QhRS[ /# r   r   )r   r   s   "r   r   r   p  s      # r    c                (    V P                   ^,          # )zt
*second_path* (:class:`str`) is the second path encountered for
:attr:`self.real_path <RecursionError.real_path>`.
r   r   s   &r   rh   RecursionError.second_patho  r   r    r   )r   r   r   r   r   r   r   rg   r   rf   rh   r   r   r   r   s   @@r   rl   rl   :  sk     
K K(         r    rl   T)frozenc                   :   a  ] tR tRt o RtRt   V 3R ltRtV tR# )CheckResultix  zb
The :class:`CheckResult` class contains information about the file and which
pattern matched it.
c                ^   < V ^8  d   Qh/ S[ ;R&   S[S[,          ;R&   S[S[,          ;R&   # )r   r*   r/   r3   )r   r   r,   r+   )r   r   s   "r   r   CheckResult.__annotate__x  s3       & 4.' 2 	3 r    r   N)r*   r/   r3   )	r   r   r   r   r   	__slots____annotate_func__r   r   r   s   @r   r   r   x  s'     
5  r    r   c                   :   a  ] tR tRt o RtRtV 3R lR ltRtV tR# )r9   i  z<
The :class:`.MatchDetail` class contains information about
c                4   < V ^8  d   QhRS[ S[,          RR/# )r   r)   r   N)r   r   )r   r   s   "r   r   MatchDetail.__annotate__  s       hw/ D r    c                    Wn         R# )z
Initialize the :class:`.MatchDetail` instance.

*patterns* (:class:`~collections.abc.Sequence` of :class:`~pathspec.pattern.Pattern`)
contains the patterns that matched the file in the order they were
encountered.
Nr)   )r   r)   s   &&r   r   MatchDetail.__init__  s     -r    r   N)	r   r   r   r   r   r   r   r   r   r   s   @r   r9   r9     s     
  r    r9   c                      a  ] tR tRt o RtRtV 3R lR ltRV 3R lR lltRV 3R lR	 lltV 3R
 lR lt	RV 3R lR llt
RtV tR# )rU   i  zO
The :class:`.TreeEntry` class contains information about a file-system
entry.
c          
      ^   < V ^8  d   QhRS[ RS[ RS[P                  RS[P                  RR/# )r   rn   r   lstatro   r   N)r   r#   stat_result)r   r   s   "r   r   TreeEntry.__annotate__  sE     ) )) 	) 
	)
 	) )r    c                <    W0n          Wn         W n         W@n        R# )a@  
Initialize the :class:`.TreeEntry` instance.

*name* (:class:`str`) is the base name of the entry.

*path* (:class:`str`) is the relative path of the entry.

*lstat* (:class:`os.stat_result`) is the stat result of the direct
entry.

*stat* (:class:`os.stat_result`) is the stat result of the entry,
potentially linked.
N_lstatrn   r   _stat)r   rn   r   r   ro   s   &&&&&r   r   TreeEntry.__init__  s2    * !&+
 ) )  $*r    Nc                6   < V ^8  d   QhRS[ S[,          RS[/# r   rT   r   r   r,   )r   r   s   "r   r   r     s     ) ) )$ )r    c                    Vf   RpV'       d   V P                   MV P                  p\        P                  ! VP                  4      # )a0  
Get whether the entry is a directory.

*follow_links* (:class:`bool` or :data:`None`) is whether to follow
symbolic links. If this is :data:`True`, a symlink to a directory
will result in :data:`True`. Default is :data:`None` for :data:`True`.

Returns whether the entry is a directory (:class:`bool`).
T)r   r   ro   S_ISDIRst_moder   rT   ry   s   && r   r"   TreeEntry.is_dir  5     <(djjdkk)	i''	((r    c                6   < V ^8  d   QhRS[ S[,          RS[/# r   r   )r   r   s   "r   r   r     s     ) )$ )4 )r    c                    Vf   RpV'       d   V P                   MV P                  p\        P                  ! VP                  4      # )a9  
Get whether the entry is a regular file.

*follow_links* (:class:`bool` or :data:`None`) is whether to follow
symbolic links. If this is :data:`True`, a symlink to a regular file
will result in :data:`True`. Default is :data:`None` for :data:`True`.

Returns whether the entry is a regular file (:class:`bool`).
T)r   r   ro   S_ISREGr  r  s   && r   rq   TreeEntry.is_file  r  r    c                    < V ^8  d   QhRS[ /# r   )r,   )r   r   s   "r   r   r     s     + + +r    c                V    \         P                  ! V P                  P                  4      # )z?
Returns whether the entry is a symbolic link (:class:`bool`).
)ro   S_ISLNKr   r  r   s   &r   rp   TreeEntry.is_symlink  s     
dkk))	**r    c                J   < V ^8  d   QhRS[ S[,          RS[P                  /# r   )r   r,   r#   r   )r   r   s   "r   r   r     s#     5 5htn 5 5r    c                N    Vf   RpV'       d   V P                   # V P                  # )a-  
Get the cached stat result for the entry.

*follow_links* (:class:`bool` or :data:`None`) is whether to follow
symbolic links. If this is :data:`True`, the stat result of the
linked file will be returned. Default is :data:`None` for :data:`True`.

Returns that stat result (:class:`os.stat_result`).
T)r   r   )r   rT   s   &&r   ro   TreeEntry.stat  s$     <#44r    )r   r   rn   r   r   N)r   r   r   r   r   r   r   r"   rq   rp   ro   r   r   r   s   @r   rU   rU     sI      1) )V) ) ) ) + +5 5 5r    rU   )   	   r  )NN)>r   r#   os.pathr   r   ro   sysr   collections.abcr   r<   r   rN   dataclassesr   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r4   r   version_infor   rV   r   r$   altsepr   r   r&   r5   rD   rJ   rP   r`   r]   r~   r   r   r0   r   r   r   r   	Exceptionr   rl   r   objectr9   rU   )__seps   0r   <module>r     s   
     
     "
 vhsm#$h:W- vvryy!!U	 y}}$ ! 
  $8+\(P [FNb>L	#(B%P"J.@,Y ,^;Y ;| $'(#  >& 2g5 g5As   /
F>FF