
      eHf                        d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z& e	rddl'm(Z( ddl)m*Z* ee+ej,        f         Z-ededef         f         Z.	 ede.f         Z/ eded                   Z0	 d:de-de1fdZ2ddde-ddfdZ3	 	 d;ddde-dee-         de4ded          f
d!Z5d"e0d#e+fd$Z6d%ed          de1fd&Z7	 d<d'dd(e/ded)         fd*Z8d+e+d,e+d-e9fd.Z: G d/ d0ee0                   Z; G d1 d2e;d3                   Z< G d4 d5e;d                   Z= G d6 d7e$          Z> G d8 d9e$          Z?dS )=a<  
Load setuptools configuration from ``setup.cfg`` files.

**API will be made private in the future**

To read project metadata, consider using
``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
For simple scenarios, you can also try parsing the file directly
with the help of ``configparser``.
    N)defaultdict)partialwraps)TYPE_CHECKINGCallableAnyDictGenericIterableListOptionalSetTupleTypeVarUnion   )	FileErrorOptionError)default_environment)InvalidRequirementRequirement)SpecifierSet)InvalidVersionVersion)SetuptoolsDeprecationWarning   )expand)DistributionMetadataDistributionstrTarget)r!   r   )boundFfilepathreturnc                     ddl m}  |            }|r|                                ng }t          || ||          }t	          |          S )a,  Read given configuration file and returns options from it as a dict.

    :param str|unicode filepath: Path to configuration file
        to get options from.

    :param bool find_others: Whether to search for other configuration files
        which could be on in various places.

    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.

    :rtype: dict
    r   r    )setuptools.distr!   find_config_files_applyconfiguration_to_dict)r%   find_othersignore_option_errorsr!   dist	filenameshandlerss          :lib/python3.11/site-packages/setuptools/config/setupcfg.pyread_configurationr2   8   s^    $ -,,,,,<>>D,7?&&(((RIdHi1EFFH ***    r.   r!   c                 N    t          | |           |                                  | S )z`Apply the configuration from a ``setup.cfg`` file into an existing
    distribution object.
    )r*   _finalize_requires)r.   r%   s     r1   apply_configurationr6   R   s+     4Kr3    other_filesr-   )ConfigHandler.c                 *   ddl m} t          j                            |          }t          j                            |          st          d| d          t          j                    }t          j        t          j        	                    |                     g ||}	 |
                    | |           t          | | j        |          }|                                  t          j        |           n# t          j        |           w xY w|S )zHRead configuration from ``filepath`` and applies to the ``dist`` object.r   )_DistributionzConfiguration file z does not exist.)r/   )r-   )r(   r;   ospathabspathisfiler   getcwdchdirdirnameparse_config_filesparse_configurationcommand_options_finalize_license_files)r.   r%   r8   r-   r;   current_directoryr/   r0   s           r1   r*   r*   [   s    .-----wx((H7>>(## JHhHHHIII	HRW__X&&'''(+(x(I$(((CCC&$&=Q
 
 
 	$$&&&
"####"####Os   #AC: :D
target_objkeyc                 x    d| }t          j        t          | |          }t          | ||          } |            S )z
    Given a target object and option key, get that option from
    the target object, either through a get_{key} method or
    from an attribute directly.
    get_)	functoolsr   getattr)rH   rI   getter_nameby_attributegetters        r1   _get_optionrQ   y   s?     ,,K$Wj#>>LZl;;F688Or3   r0   c                     t          t                    }| D ]1}|j        D ]'}t          |j        |          }|||j                 |<   (2|S )zReturns configuration data gathered by given handlers as a dict.

    :param list[ConfigHandler] handlers: Handlers list,
        usually from parse_configuration()

    :rtype: dict
    )r   dictset_optionsrQ   rH   section_prefix)r0   config_dicthandleroptionvalues        r1   r+   r+      sk     $D))K @ @) 	@ 	@F 2F;;E:?K./77	@ r3   distributionrE   )ConfigMetadataHandlerConfigOptionsHandlerc           	         t          j        |           5 }t          | |||          }|                                 | j        s|j        | _        t          | j        |||| j        | j                  }|                                 | j        	                    |j        |j                   ddd           n# 1 swxY w Y   ||fS )a  Performs additional parsing of configuration options
    for a distribution.

    Returns a list of used option handlers.

    :param Distribution distribution:
    :param dict command_options:
    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.
    :rtype: list
    N)
r   EnsurePackagesDiscoveredr\   parsepackage_dirr[   metadatasrc_root_referenced_filesupdate)rZ   rE   r-   ensure_discoveredoptionsmetas         r1   rD   rD      s   $ 
	(	6	6 
:K& 	
 
 	' 	;'.':L$$! $!
 
 	

&--%t'=	
 	
 	
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2 =s   BB77B;>B;label
orig_valueparsedc                    d|v st                    dk    rdS t                                                      }	 t          d                   }|j        |v r$t
                              | d                    dS dS # t          $ rX}t          fd|D                       r2t
          	                    | d                   }t          |          |Y d}~dS d}~ww xY w)am  Because users sometimes misinterpret this configuration:

    [options.extras_require]
    foo = bar;python_version<"4"

    It looks like one requirement with an environment marker
    but because there is no newline, it's parsed as two requirements
    with a semicolon as separator.

    Therefore, if:
        * input string does not contain a newline AND
        * parsed result contains two requirements AND
        * parsing of the two parts from the result ("<first>;<second>")
        leads in a valid Requirement with a valid marker
    a UserWarning is shown to inform the user about the possible problem.
    
r   Nr   )fieldreqc              3   N   K   | ]}d                               |          V   dS )r   N
startswith).0markerrj   s     r1   	<genexpr>z8_warn_accidental_env_marker_misconfig.<locals>.<genexpr>   s5      BBvay##F++BBBBBBr3   )
len
marker_envkeysr   name_AmbiguousMarkeremitr   anymessage)rh   ri   rj   markersrn   exmsgs     `    r1   %_warn_accidental_env_marker_misconfigr      s   " zS[[A--ll!!G2&)$$8w!!6!9!=====  2 2 2BBBB'BBBBB 	2"**F1I*FFC$S))r1	2 	2 	2 	2 	2 	22s   A B   
C"
ACC"c                   ^   e Zd ZU dZeed<   	 i Zeeef         ed<   	 dede	de
j        fdZede	fd            Zed	             Zd
 Zedd            Zed             Zed             Zed             ZdefdZdefdZed             Zed             Zedd            Zd Zd Zd ZdS )r9   z1Handles metadata supplied in configuration files.rU   aliasesrH   rf   re   c                     || _         || _        t          |                     |                    | _        g | _        || _        t                      | _        d S N)	r-   rH   rS   _section_optionssectionsrT   re   setrc   )selfrH   rf   r-   re   s        r1   __init__zConfigHandler.__init__   sV     %9!$T227;;<<&(!2+.55	 	r3   c              #      K   |                                 D ]?\  }}|                    | j                  \  }}}|r&|                    d          |fV  @d S )N.)items	partitionrU   lstrip)clsrf   	full_namerY   preseprx   s          r1   r   zConfigHandler._section_options  ss       ' 	* 	*Iu&001CDDNCd ++c""E)))))		* 	*r3   c                 :    t          d| j        j        z            ).Metadata item name to parser function mapping.z!%s must provide .parsers property)NotImplementedError	__class____name__)r   s    r1   parserszConfigHandler.parsers  s#     "/$.2II
 
 	
r3   c                    | j         }| j                            ||          }	 t          ||          }n# t          $ r t          |          w xY w|rd S 	  | j                            |d           |          }n# t          f| j        z  $ r Y d S w xY wt          j
        |j        |          }t          |d|z  |          } ||           | j                            |           d S )Nc                     | S r   r7   )xs    r1   <lambda>z+ConfigHandler.__setitem__.<locals>.<lambda>%  s    Q r3   zset_%s)rH   r   getrM   AttributeErrorKeyErrorr   	Exceptionr-   rL   r   __setattr__rT   append)r   option_namerY   rH   current_valuerj   simple_settersetters           r1   __setitem__zConfigHandler.__setitem__  s   _
 l&&{K@@	(#J<<MM 	( 	( 	(;'''	(  	F	?T\%%k;;??FFFF|d77 	 	 	FF	 ")**@+NNX%;]KKv,,,,,s   5 A%A= =BB,c                     t          |t                    r|S d|v r|                                }n|                    |          }d |D             S )zRepresents value as a list.

        Value is split either by separator (defaults to comma) or by lines.

        :param value:
        :param separator: List items separator character.
        :rtype: list
        rl   c                 ^    g | ]*}|                                 |                                 +S r7   strip)rr   chunks     r1   
<listcomp>z-ConfigHandler._parse_list.<locals>.<listcomp>A  s-    BBB%EKKMMBBBBr3   )
isinstancelist
splitlinessplit)r   rY   	separators      r1   _parse_listzConfigHandler._parse_list/  s\     eT"" 	L5==$$&&EEKK	**EBB5BBBBr3   c                     d}i }|                      |          D ]\}|                    |          \  }}}||k    rt          d|           |                                ||                                <   ]|S )zPRepresents value as a dict.

        :param value:
        :rtype: dict
        =z&Unable to parse option value to dict: )r   r   r   r   )r   rY   r   resultlinerI   r   vals           r1   _parse_dictzConfigHandler._parse_dictC  s     	OOE** 	. 	.D NN955MCci!"R5"R"RSSS"%))++F399;;r3   c                 2    |                                 }|dv S )zQRepresents value as boolean.

        :param value:
        :rtype: bool
        )1trueyes)lowerr   rY   s     r1   _parse_boolzConfigHandler._parse_boolT  s     ,,,r3   c                     fd}|S )zReturns a parser function to make sure field inputs
        are not files.

        Parses a value after getting the key so error messages are
        more informative.

        :param key:
        :rtype: callable
        c                 z    d}|                      |          r"t          d                                        | S )Nfile:zCOnly strings are accepted for the {0} field, files are not accepted)rq   
ValueErrorformat)rY   exclude_directiverI   s     r1   parserz3ConfigHandler._exclude_files_parser.<locals>.parserj  sI     ' 122  --3VC[[   Lr3   r7   )r   rI   r   s    ` r1   _exclude_files_parserz#ConfigHandler._exclude_files_parser^  s#    	 	 	 	 	 r3   root_dirc                 ,   d}t          |t                    s|S |                    |          s|S |t          |          d         }d |                    d          D             }| j                            |           t          j        ||          S )aO  Represents value as a string, allowing including text
        from nearest files using `file:` directive.

        Directive is sandboxed and won't reach anything outside
        directory with setup.py.

        Examples:
            file: README.rst, CHANGELOG.md, src/file.txt

        :param str value:
        :rtype: str
        r   Nc                 6    g | ]}|                                 S r7   r   )rr   r=   s     r1   r   z-ConfigHandler._parse_file.<locals>.<listcomp>  s     >>>dTZZ\\>>>r3   r   )	r   r"   rq   ru   r   rc   rd   r   
read_files)r   rY   r   include_directivespec	filepathss         r1   _parse_filezConfigHandler._parse_fileu  s     $%%% 	L 122 	LS*++--.>>djjoo>>>	%%i000 H555r3   c                     d}|                     |          s|S |                    |d          }|                    | j        j                   t          j        |||          S )zRepresents value as a module attribute.

        Examples:
            attr: package.attr
            attr: package.module.attr

        :param str value:
        :rtype: str
        zattr: )rq   replacerd   re   r`   r   	read_attr)r   rY   r`   r   attr_directive	attr_descs         r1   _parse_attrzConfigHandler._parse_attr  sh     !// 	LMM."55	 	41=>>>	;AAAr3   c                     fd}|S )zReturns parser function to represents value as a list.

        Parses a value applying given methods one after another.

        :param parse_methods:
        :rtype: callable
        c                 ,    | }D ]} ||          }|S r   r7   )rY   rj   methodparse_methodss      r1   r_   z1ConfigHandler._get_parser_compound.<locals>.parse  s+    F' ( (Mr3   r7   )r   r   r_   s    ` r1   _get_parser_compoundz"ConfigHandler._get_parser_compound  s#    	 	 	 	 	 r3   c                 b    i }|                                 D ]\  }\  }} |||          ||<   |S )a  Parses section options into a dictionary.

        Applies a given parser to each option in a section.

        :param dict section_options:
        :param callable values_parser: function with 2 args corresponding to key, value
        :rtype: dict
        )r   )r   section_optionsvalues_parserrY   rI   _r   s          r1   _parse_section_to_dict_with_keyz-ConfigHandler._parse_section_to_dict_with_key  sH     ,2244 	1 	1MC!S&sC00E#JJr3   Nc                 D    rfdnd }|                      ||          S )a   Parses section options into a dictionary.

        Optionally applies a given parser to each value.

        :param dict section_options:
        :param callable values_parser: function with 1 arg corresponding to option value
        :rtype: dict
        c                      |          S r   r7   )r   vr   s     r1   r   z6ConfigHandler._parse_section_to_dict.<locals>.<lambda>  s    }}Q// r3   c                     |S r   r7   )r   r   s     r1   r   z6ConfigHandler._parse_section_to_dict.<locals>.<lambda>  s    UV r3   r   )r   r   r   r   s     ` r1   _parse_section_to_dictz$ConfigHandler._parse_section_to_dict  s7     5BW/////22?FKKKr3   c                     |                                 D ]>\  }\  }}t          j        t                    5  || |<   ddd           n# 1 swxY w Y   ?dS )zQParses configuration file section.

        :param dict section_options:
        N)r   
contextlibsuppressr   )r   r   rx   r   rY   s        r1   parse_sectionzConfigHandler.parse_section  s    
 !0 5 5 7 7 	# 	#D*1e$X.. # #"T
# # # # # # # # # # # # # # #	# 	#s   AA	A	c                     | j                                         D ]^\  }}d}|rd|z  }t          | d|z                      dd          d          }|t	          d| j         d| d           ||           _dS )	zTParses configuration file items from one
        or more related sections.

        r   z_%szparse_section%sr   __Nz*Unsupported distribution option section: [])r   r   rM   r   r   rU   )r   section_namer   method_postfixsection_parser_methods        r1   r_   zConfigHandler.parse  s    
 .2]-@-@-B-B 	3 	3)L/N 6!&!58?"^3<<S$GG	9 9! %,!>+> >.:> > >  
 "!/2222%	3 	3r3   c                 D    t                    fd            }|S )zthis function will wrap around parameters that are deprecated

        :param msg: deprecation message
        :param func: function to be wrapped around
        c                  f                         dd           t          j        dfi   | i |S )N
stacklevelr   z Deprecated config in `setup.cfg`)
setdefault_DeprecatedConfigrz   )argskwargsfunckwr   s     r1   config_handlerz@ConfigHandler._deprecated_config_handler.<locals>.config_handler  sH    MM,***"#EsQQbQQQ4((((r3   r   )r   r   r   r   r   s    ``` r1   _deprecated_config_handlerz(ConfigHandler._deprecated_config_handler  sB     
t	) 	) 	) 	) 	) 	) 
	)
 r3   )r   r   )r   
__module____qualname____doc__r"   __annotations__r   r
   r#   AllCommandOptionsr   r^   r   classmethodr   propertyr   r   r   r   r   r   _Pathr   r   r   r   r   r   r_   r   r7   r3   r1   r9   r9      s        ;;
 !GT#s(^    #
 ":   " *'8 * * * [* 
 
 X
- - -4 C C C [C&   [  - - [-   [,65 6 6 6 64B B B B B(   [&   [ 
L 
L 
L [
L# # #3 3 32    r3   r9   c                        e Zd ZdZdddddZdZ	 dej        fd	d
dede	de
j        dee         def fdZed             Zd Z xZS )r[   ra   urldescriptionclassifiers	platforms)	home_pagesummary
classifierplatformFNrH   r   rf   r-   re   r`   r   c                 l    t                                          ||||           || _        || _        d S r   )superr   r`   r   )r   rH   rf   r-   re   r`   r   r   s          r1   r   zConfigMetadataHandler.__init__  s8     	W.BDUVVV& r3   c                 0   | j         }t          | j        | j                  }| j        }| j        }||||                     |dd          ||                     ||           |d          |                      |d          dd          |||| j        |dS )	r   r   z[The requires parameter is deprecated, please use install_requires for runtime dependencies.)i  
      )due_datelicenselicense_filezDThe license_file parameter is deprecated, use license_files instead.)r
  keywordsprovidesrequires	obsoletesr	  r  r  license_filesr  long_descriptionversionproject_urls)	r   r   r   r   r   r   r   r   _parse_version)r   
parse_list
parse_file
parse_dictexclude_files_parsers        r1   r   zConfigMetadataHandler.parsers#  s     %
T-FFF
%
#9 $""77='	 8   $44ZLL++I66 ;;$$^44-'	 <   (% **&3
 
 	
r3   c                 >   |                      || j                  }||k    rJ|                                }	 t          |           n## t          $ r t          d| d|           w xY w|S t          j        |                     || j	        | j                            S )zSParses `version` option value.

        :param value:
        :rtype: str

        zVersion loaded from z does not comply with PEP 440: )
r   r   r   r   r   r   r   r  r   r`   )r   rY   r  s      r1   r   z$ConfigMetadataHandler._parse_versionG  s     ""5$-88emmooG    !   !65 6 6,36 6   N~d..ud6FVVWWWs   A  A')r   r   r   rU   r   strict_moder<   curdirr  boolr   r^   r   rS   r  r   r  r   r   __classcell__r   s   @r1   r[   r[     s        N  #	 G K '+)! !*! #! #	!
 ":! d^! ! ! ! ! ! ! !
 !
 X!
FX X X X X X Xr3   r[   r   c                        e Zd ZdZdddededej        f fdZe	d             Z
d Zd	ed
efdZed             Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )r\   rf   rH   r!   r-   re   c                 v    t                                          ||||           |j        | _        i | _        d S r   )r  r   rb   r   r`   )r   rH   rf   r-   re   r   s        r1   r   zConfigOptionsHandler.__init__d  s=     	W.BDUVVV"++-r3   c                 0    |                      |d          S )N;)r   )r   r   s     r1   _parse_list_semicolonz*ConfigOptionsHandler._parse_list_semicolono  s    u444r3   c                 :    |                      || j                  S )Nr  )r   r   )r   rY   s     r1   _parse_file_in_rootz(ConfigOptionsHandler._parse_file_in_roots  s    >>>r3   rh   rY   c                     |                      |                     |                    }t          |||           d |D             S )Nc                 <    g | ]}|                     d           |S )#rp   )rr   r   s     r1   r   zAConfigOptionsHandler._parse_requirements_list.<locals>.<listcomp>|  s)    DDDts/C/CDDDDr3   )r/  r1  r   )r   rh   rY   rj   s       r1   _parse_requirements_listz-ConfigOptionsHandler._parse_requirements_listv  sL    ++D,D,DU,K,KLL-eUFCCC EDDDDDr3   c                     | j         }| j        }| j        }| j        }|||||||                     |d          t          | j        d          | j        | j        | j        | j	        |t          |dS )r   zeThe namespace_packages parameter is deprecated, consider using implicit namespaces instead (PEP 420).install_requires)zip_safeinclude_package_datar`   scriptseager_resourcesdependency_linksnamespace_packagesr7  setup_requirestests_requirepackagesentry_points
py_modulespython_requirescmdclass)r   r   r   _parse_cmdclassr   r   r5  r/  _parse_packagesr1  r   )r   r!  
parse_boolr#  parse_cmdclasss        r1   r   zConfigOptionsHandler.parsers~  s     %
%
%
- #$.%!) *"&"A"AH# # !(-/A! ! #8!7, 4$+&-
 
 	
r3   c                 v    | j         j        }t          j        |                     |          || j                  S r   )re   r`   r   rD  r   r   )r   rY   r`   s      r1   rE  z$ConfigOptionsHandler._parse_cmdclass  s1    ,8t//66T]SSSr3   c                 :   ddg}|                                 }||vr|                     |          S |                     | j                            di                     }|                    ||d         k    | j        | j                   t          j	        di |S )zTParses `packages` option value.

        :param value:
        :rtype: list
        zfind:zfind_namespace:zpackages.findr   )
namespacesr   fill_package_dirr7   )
r   r   parse_section_packages__findr   r   rd   r   r`   r   find_packages)r   rY   find_directivestrimmed_valuefind_kwargss        r1   rF  z$ConfigOptionsHandler._parse_packages  s     #$56//##E*** 77Mor22
 
 	%);;]!- 	 	
 	
 	
 #22k222r3   c                     |                      || j                  }g dt          fd|                                D                       }|                    d          }||d         |d<   |S )zParses `packages.find` configuration file section.

        To be used in conjunction with _parse_packages().

        :param dict section_options:
        )whereincludeexcludec                 *    g | ]\  }}|v 	|||fS r7   r7   )rr   kr   
valid_keyss      r1   r   zEConfigOptionsHandler.parse_section_packages__find.<locals>.<listcomp>  s*    NNN1ZAaVr3   rS  Nr   )r   r   rS   r   r   )r   r   section_datarQ  rS  rX  s        @r1   rM  z1ConfigOptionsHandler.parse_section_packages__find  s     22?DDTUU444
NNNN 2 2 4 4NNN
 
 ((#(8K r3   c                 F    |                      || j                  }|| d<   dS )z`Parses `entry_points` configuration file section.

        :param dict section_options:
        rA  N)r   r   r   r   rj   s      r1   parse_section_entry_pointsz/ConfigOptionsHandler.parse_section_entry_points  s,    
 ,,_d>NOO%^r3   c                 `    |                      || j                  }t          j        |          S r   )r   r   r   canonic_package_data)r   r   package_datas      r1   _parse_package_dataz(ConfigOptionsHandler._parse_package_data  s+    22?DDTUU*<888r3   c                 6    |                      |          | d<   dS )z`Parses `package_data` configuration file section.

        :param dict section_options:
        r_  Nr`  r   r   s     r1   parse_section_package_dataz/ConfigOptionsHandler.parse_section_package_data  s"    
  $77HH^r3   c                 6    |                      |          | d<   dS )zhParses `exclude_package_data` configuration file section.

        :param dict section_options:
        exclude_package_dataNrb  rc  s     r1   "parse_section_exclude_package_dataz7ConfigOptionsHandler.parse_section_exclude_package_data  s#    
 (,'?'?'P'P#$$$r3   c                 D                           | fd          }| d<   dS )zbParses `extras_require` configuration file section.

        :param dict section_options:
        c                 8                         d|  d|          S )Nzextras_require[r   )r5  )rW  r   r   s     r1   r   zCConfigOptionsHandler.parse_section_extras_require.<locals>.<lambda>  s#    667M7M7M7MqQQ r3   extras_requireNr   r[  s   `  r1   parse_section_extras_requirez1ConfigOptionsHandler.parse_section_extras_require  s<    
 55QQQQ
 

 "(r3   c                 v    |                      || j                  }t          j        || j                  | d<   dS )z^Parses `data_files` configuration file section.

        :param dict section_options:
        
data_filesN)r   r   r   canonic_data_filesr   r[  s      r1   parse_section_data_filesz-ConfigOptionsHandler.parse_section_data_files  s;    
 ,,_d>NOO#6vt}MM\r3   )r   r   r   rU   r  r(  r   r^   r   r  r/  r1  r"   r5  r  r   rE  rF  rM  r\  r`  rd  rg  rk  ro  r)  r*  s   @r1   r\   r\   a  sp       N	."	. #	. #		.
 ":	. 	. 	. 	. 	. 	. 5 5 [5? ? ?Ec E# E E E E 
 
 X
@T T T3 3 32  *& & &9 9 9I I IQ Q Q
( 
( 
(N N N N N N Nr3   r\   c                   0    e Zd ZdZdZdZed             ZdS )ry   zAmbiguous requirement marker.z
    One of the parsed requirements in `{field}` looks like a valid environment marker:

        {req!r}

    Please make sure that the configuration file is correct.
    You can use dangling lines to avoid this problem.
    z'userguide/declarative_config.html#opt-2c                 \    d| j          }|                     | j        | j        ||          S )Nz%https://setuptools.pypa.io/en/latest/)see_urlformat_args)	_SEE_DOCS_format_SUMMARY_DETAILS)r   r   docss      r1   r|   z_AmbiguousMarker.message  s0    Fs}FF{{3<tQS{TTTr3   N)r   r   r   rv  rw  rt  r  r|   r7   r3   r1   ry   ry      sG        .HH :I U U [U U Ur3   ry   c                       e Zd ZdZdS )r   z!userguide/declarative_config.htmlN)r   r   r   rt  r7   r3   r1   r   r     s        3IIIr3   r   )FF)r7   F)F)@r   r   rL   r<   collectionsr   r   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   errorsr   r   extern.packaging.markersr   rv   extern.packaging.requirementsr   r   extern.packaging.specifiersr   extern.packaging.versionr   r   warningsr   r   r   distutils.distr   r(   r!   r"   PathLiker  SingleCommandOptionsr  r#   rS   r2   r6   r(  r*   rQ   r+   rD   r   r   r9   r[   r\   ry   r   r7   r3   r1   <module>r     s  	 	         				 # # # # # #                                        , + + + + + + + H H H H H H K K K K K K K K 6 6 6 6 6 6 > > > > > > > > 3 3 3 3 3 3       -333333,,,,,,c2;E5#445 
  445 	'M!N	O	O	O >C+ ++	+ + + +4n  .     $&!&	 
 % 	
     <	F 	 	 	 	 	E*>$? D    * + + +&+ :;	+ + + +\2 2# 2t 2 2 2 2@^ ^ ^ ^ ^GFO ^ ^ ^B	XX XX XX XX XXM*@A XX XX XXv\N \N \N \N \N=8 \N \N \N~U U U U U3 U U U(4 4 4 4 44 4 4 4 4 4r3   