o
    è’Ojáˆ  ã                   @   s$  d Z ddlZddlZddlZddlmZ ddlZddlmZm	Z	 ddl
mZmZmZ ddlmZ ddlmZ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m Z m!Z! dd	l"m#Z# dd
l$m%Z%m&Z& e 'e(¡Z)dZ*di iZ+G dd„ dƒZ,G dd„ de,ƒZ-G dd„ de.eƒZ/G dd„ dƒZ0dS )zÛResolves regions and endpoints.

This module implements endpoint resolution, including resolving endpoints for a
given service and region and resolving the available endpoints for a service
in a specific AWS partition.
é    N)ÚEnum)ÚUNSIGNEDÚ
xform_name)ÚAUTH_TYPE_MAPSÚHAS_CRTÚresolve_auth_scheme_preference©ÚCRT_SUPPORTED_AUTH_TYPES)ÚS3_UNREFERENCED_PARAMSÚEndpointProvider)ÚEndpointProviderErrorÚEndpointVariantErrorÚ!InvalidEndpointConfigurationErrorÚInvalidHostLabelErrorÚMissingDependencyExceptionÚNoRegionErrorÚParamValidationErrorÚ$UnknownEndpointResolutionBuiltInNameÚUnknownRegionErrorÚUnknownSignatureVersionErrorÚ*UnsupportedS3AccesspointConfigurationErrorÚUnsupportedS3ConfigurationErrorÚUnsupportedS3ControlArnErrorÚ&UnsupportedS3ControlConfigurationError)Úregister_feature_id)Úensure_booleanÚinstance_cachez{service}.{region}.{dnsSuffix}Ú	endpointsc                   @   s.   e Zd ZdZddd„Zdd„ Z	dd	d
„ZdS )ÚBaseEndpointResolverz3Resolves regions and endpoints. Must be subclassed.Nc                 C   ó   t ‚)a7  Resolves an endpoint for a service and region combination.

        :type service_name: string
        :param service_name: Name of the service to resolve an endpoint for
            (e.g., s3)

        :type region_name: string
        :param region_name: Region/endpoint name to resolve (e.g., us-east-1)
            if no region is provided, the first found partition-wide endpoint
            will be used if available.

        :rtype: dict
        :return: Returns a dict containing the following keys:
            - partition: (string, required) Resolved partition name
            - endpointName: (string, required) Resolved endpoint name
            - hostname: (string, required) Hostname to use for this endpoint
            - sslCommonName: (string) sslCommonName to use for this endpoint.
            - credentialScope: (dict) Signature version 4 credential scope
              - region: (string) region name override when signing.
              - service: (string) service name override when signing.
            - signatureVersions: (list<string>) A list of possible signature
              versions, including s3, v4, v2, and s3v4
            - protocols: (list<string>) A list of supported protocols
              (e.g., http, https)
            - ...: Other keys may be included as well based on the metadata
        ©ÚNotImplementedError)ÚselfÚservice_nameÚregion_name© r%   úV/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/botocore/regions.pyÚconstruct_endpoint>   s   z'BaseEndpointResolver.construct_endpointc                 C   r   )z�Lists the partitions available to the endpoint resolver.

        :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]).
        r    ©r"   r%   r%   r&   Úget_available_partitions[   s   z-BaseEndpointResolver.get_available_partitionsÚawsFc                 C   r   )aÒ  Lists the endpoint names of a particular partition.

        :type service_name: string
        :param service_name: Name of a service to list endpoint for (e.g., s3)

        :type partition_name: string
        :param partition_name: Name of the partition to limit endpoints to.
            (e.g., aws for the public AWS endpoints, aws-cn for AWS China
            endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.

        :type allow_non_regional: bool
        :param allow_non_regional: Set to True to include endpoints that are
             not regional endpoints (e.g., s3-external-1,
             fips-us-gov-west-1, etc).
        :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
        r    )r"   r#   Úpartition_nameÚallow_non_regionalr%   r%   r&   Úget_available_endpointsb   s   z,BaseEndpointResolver.get_available_endpoints©N)r*   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r)   r-   r%   r%   r%   r&   r   ;   s    
ÿr   c                   @   s®   e Zd ZdZddgZd%dd„Zd&dd	„Zd
d„ Z			d'dd„Z	d(dd„Z					d)dd„Z
dd„ Z	d%dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdS )*ÚEndpointResolverz7Resolves endpoints based on partition endpoint metadatazaws-isoz	aws-iso-bFc                 C   s    d|vrt dƒ‚|| _|| _dS )a  
        :type endpoint_data: dict
        :param endpoint_data: A dict of partition data.

        :type uses_builtin_data: boolean
        :param uses_builtin_data: Whether the endpoint data originates in the
            package's data directory.
        Ú
partitionsz%Missing "partitions" in endpoint dataN)Ú
ValueErrorÚ_endpoint_dataÚuses_builtin_data)r"   Úendpoint_datar7   r%   r%   r&   Ú__init__}   s   	
zEndpointResolver.__init__r*   c                 C   sB   | j d D ]}|d |krq|d }||vrq|| d   S d S )Nr4   Ú	partitionÚservicesr   )r6   )r"   r#   r+   r:   r;   r%   r%   r&   Úget_service_endpoints_data‹   s   úz+EndpointResolver.get_service_endpoints_datac                 C   s&   g }| j d D ]	}| |d ¡ q|S )Nr4   r:   )r6   Úappend)r"   Úresultr:   r%   r%   r&   r)   ”   s   z)EndpointResolver.get_available_partitionsNc                 C   s”   g }| j d D ]@}|d |krq|d }||vrq|| d }|D ]%}	|	|d v }
|r=|
r=|  ||	 |¡}|r<| |	¡ q!|sA|
rF| |	¡ q!q|S )Nr4   r:   r;   r   Úregions)r6   Ú_retrieve_variant_datar=   )r"   r#   r+   r,   Úendpoint_variant_tagsr>   r:   r;   Úservice_endpointsÚendpoint_nameÚis_regional_endpointÚvariant_datar%   r%   r&   r-   š   s,   ÿ
€
€öz(EndpointResolver.get_available_endpointsc                 C   s\   | j d D ]&}|d |kr+|r%|  | d¡|¡}|r$d|v r$|d   S q|d   S qd S )Nr4   r:   ÚdefaultsÚ	dnsSuffix)r6   r@   Úget)r"   r+   rA   r:   Úvariantr%   r%   r&   Úget_partition_dns_suffix¶   s   
ÿ€ø	z)EndpointResolver.get_partition_dns_suffixc           	      C   s®   |dkr|r|d u rd}|d ur4d }| j d D ]
}|d |kr!|}q|d ur2|  |||||d¡}|S d S | j d D ]}|rE|d | jv rEq9|  |||||¡}|rT|  S q9d S )NÚs3z	us-east-1r4   r:   T)r6   Ú_endpoint_for_partitionÚ!_UNSUPPORTED_DUALSTACK_PARTITIONS)	r"   r#   r$   r+   Úuse_dualstack_endpointÚuse_fips_endpointÚvalid_partitionr:   r>   r%   r%   r&   r'   Å   sT   	ÿþý€úÿÿûÿóz#EndpointResolver.construct_endpointc                 C   s4   | j d D ]}|  ||¡r|d   S qt|dd�‚)Nr4   r:   z,No partition found for provided region_name.)r$   Ú	error_msg)r6   Ú_region_matchr   )r"   r$   r:   r%   r%   r&   Úget_partition_for_region÷   s   ÿþz)EndpointResolver.get_partition_for_regionc                 C   s  |d }|r|| j v rd|› d�}tdg|d�‚|d  |t¡}	|d u r0d|	v r-|	d }ntƒ ‚|||	|||dœ}
||	d	 v rG| jdi |
¤ŽS |  ||¡sO|r�|	 d¡}|	 d
d¡}|rr|srt d|||¡ ||
d< | jdi |
¤ŽS t d||¡ | jdi |
¤ŽS d S )Nr:   z4Dualstack endpoints are currently not supported for z
 partitionÚ	dualstack©ÚtagsrQ   r;   ÚpartitionEndpoint)r:   r#   Úservice_datarC   rN   rO   r   ÚisRegionalizedTz'Using partition endpoint for %s, %s: %srC   z*Creating a regex based endpoint for %s, %sr%   )	rM   r   rH   ÚDEFAULT_SERVICE_DATAr   Ú_resolverR   ÚLOGÚdebug)r"   r:   r#   r$   rN   rO   Úforce_partitionr+   rQ   rX   Úresolve_kwargsÚpartition_endpointÚis_regionalizedr%   r%   r&   rL      sZ   	ÿþÿÿÿ
ú

üýîz(EndpointResolver._endpoint_for_partitionc                 C   s0   ||d v rdS d|v rt  |d ¡ |¡S dS )Nr?   TÚregionRegexF)ÚreÚcompileÚmatch)r"   r:   r$   r%   r%   r&   rR   A  s
   zEndpointResolver._region_matchc                 C   s>   |  dg ¡}|D ]}t|d ƒt|ƒkr| ¡ }|  S qd S )NÚvariantsrV   )rH   ÚsetÚcopy)r"   r8   rV   rf   rI   r>   r%   r%   r&   r@   H  s   þÿz'EndpointResolver._retrieve_variant_datac                 C   s$   g }|r	|  d¡ |r|  d¡ |S )NrT   Úfips)r=   )r"   rN   rO   rV   r%   r%   r&   Ú_create_tag_listO  s   

z!EndpointResolver._create_tag_listc                 C   s4   i }|||fD ]}|   ||¡}|r|  ||¡ q|S r.   )r@   Ú_merge_keys)r"   rV   r8   Úservice_defaultsÚpartition_defaultsr>   rf   rI   r%   r%   r&   Ú_resolve_variantW  s   €z!EndpointResolver._resolve_variantc                 C   s   |  di ¡  |i ¡}|  d¡rt d|¡ |  di ¡}|  di ¡}	|  ||¡}
|
rJ|  |
|||	¡}|i krCd|› d|› �}t|
|d�‚|  ||¡ n|}d|vrV|d |d< |d	 |d	< ||d
< |  ||¡ |  |	|¡ |  ||d |||d ¡|d< d|v rŽ|  ||d |||d ¡|d< |S )Nr   Ú
deprecatedz5Client is configured with the deprecated endpoint: %srF   zEndpoint does not exist for z in region rU   rG   r:   ÚendpointNameÚhostnameÚsslCommonName)rH   r\   Úwarningrj   rn   r   rk   Ú_expand_template)r"   r:   r#   rX   rC   rN   rO   r8   rl   rm   rV   r>   rQ   r%   r%   r&   r[   a  sZ   	ÿ
þÿÿÿûûzEndpointResolver._resolvec                 C   s"   |D ]}||vr|| ||< qd S r.   r%   )r"   Ú	from_datar>   Úkeyr%   r%   r&   rk   £  s
   €þzEndpointResolver._merge_keysc                 C   s   |j |||d�S )N)ÚserviceÚregionrG   )Úformat)r"   r:   Útemplater#   rC   rG   r%   r%   r&   rt   ¨  s   ÿz!EndpointResolver._expand_template)F)r*   )r*   FNr.   )NNFF)r/   r0   r1   r2   rM   r9   r<   r)   r-   rJ   r'   rS   rL   rR   r@   rj   rn   r[   rk   rt   r%   r%   r%   r&   r3   x   s6    

		
û
ÿ
ú2
ùA
Br3   c                   @   sD   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdS )ÚEndpointResolverBuiltinszAWS::RegionzAWS::UseFIPSzAWS::UseDualStackzAWS::STS::UseGlobalEndpointzAWS::S3::UseGlobalEndpointzAWS::S3::AcceleratezAWS::S3::ForcePathStylezAWS::S3::UseArnRegionz$AWS::S3::DisableS3ExpressSessionAuthzAWS::S3Control::UseArnRegionz'AWS::S3::DisableMultiRegionAccessPointszSDK::EndpointzAWS::Auth::AccountIdz AWS::Auth::AccountIdEndpointModeN)r/   r0   r1   Ú
AWS_REGIONÚAWS_USE_FIPSÚAWS_USE_DUALSTACKÚAWS_STS_USE_GLOBAL_ENDPOINTÚAWS_S3_USE_GLOBAL_ENDPOINTÚAWS_S3_ACCELERATEÚAWS_S3_FORCE_PATH_STYLEÚAWS_S3_USE_ARN_REGIONÚ#AWS_S3_DISABLE_EXPRESS_SESSION_AUTHÚAWS_S3CONTROL_USE_ARN_REGIONÚAWS_S3_DISABLE_MRAPÚSDK_ENDPOINTÚ
ACCOUNT_IDÚACCOUNT_ID_ENDPOINT_MODEr%   r%   r%   r&   r{   °  s     ÿr{   c                   @   s´   e Zd ZdZ			d(dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ ZdS ))ÚEndpointRulesetResolverz5Resolves endpoints using a service's endpoint rulesetTNc
           
      C   s^   t |||jdkr
tnd d�| _| jjj| _|| _|| _|| _	|| _
|| _|| _|	| _i | _d S )NrK   )Úruleset_dataÚpartition_dataÚexcluded_params)r   r#   r
   Ú	_providerÚrulesetÚ
parametersÚ_param_definitionsÚ_service_modelÚ	_builtinsÚ_client_contextÚ_event_emitterÚ_use_sslÚ_requested_auth_schemeÚ_auth_scheme_preferenceÚ_instance_cache)
r"   Úendpoint_ruleset_datarŒ   Úservice_modelÚbuiltinsÚclient_contextÚevent_emitterÚuse_sslÚrequested_auth_schemeÚauth_scheme_preferencer%   r%   r&   r9   Û  s    ÿú	
z EndpointRulesetResolver.__init__c              
   C   sâ   |du ri }|du ri }|   |||¡}t d|¡ z| jjdi |¤Ž}W n ty> } z|  ||¡}|du r7‚ ||‚d}~ww t d|j¡ | jsa|j 	d¡rad|vra|j
d|jdd… › �d�}|j
d	d
„ |j ¡ D ƒd�}|S )zAInvokes the provider with params defined in the service's rulesetNz-Calling endpoint provider with parameters: %szEndpoint provider result: %szhttps://ÚEndpointzhttp://é   )Úurlc                 S   s   i | ]	\}}||d  “qS )r   r%   )Ú.0rv   Úvalr%   r%   r&   Ú
<dictcomp>)  s    ÿz>EndpointRulesetResolver.construct_endpoint.<locals>.<dictcomp>)Úheadersr%   )Ú_get_provider_paramsr\   r]   rŽ   Úresolve_endpointr   Ú#ruleset_error_to_botocore_exceptionr¤   r–   Ú
startswithÚ_replacer¨   Úitems)r"   Úoperation_modelÚ	call_argsÚrequest_contextÚprovider_paramsÚprovider_resultÚexÚbotocore_exceptionr%   r%   r&   r'   ú  sN   ÿÿ

ÿÿ€ùÿ
þýÿÿÿz*EndpointRulesetResolver.construct_endpointc           	      C   sx   i }|   |||¡}| j ¡ D ]+\}}| j|||d�}|du r+|jdur+| j|j|d�}|dur9|||< |  ||¡ q|S )a…  Resolve a value for each parameter defined in the service's ruleset

        The resolution order for parameter values is:
        1. Operation-specific static context values from the service definition
        2. Operation-specific dynamic context values from API parameters
        3. Client-specific context parameters
        4. Built-in values such as region, FIPS usage, ...
        )Ú
param_namer¯   r°   N)Úbuiltin_namerœ   )Ú_get_customized_builtinsr‘   r®   Ú_resolve_param_from_contextÚbuiltinÚ_resolve_param_as_builtinÚ_register_endpoint_feature_ids)	r"   r¯   r°   r±   r²   Úcustomized_builtinsr¶   Ú	param_defÚ	param_valr%   r%   r&   r©   0  s(   ÿýþ€z,EndpointRulesetResolver._get_provider_paramsc                 C   sV   |   ||¡}|d ur|S |  |||¡}|d ur|S |  |||¡}|d ur&|S |  |¡S r.   )Ú&_resolve_param_as_static_context_paramÚ'_resolve_param_as_dynamic_context_paramÚ)_resolve_param_as_operation_context_paramÚ&_resolve_param_as_client_context_param)r"   r¶   r¯   r°   ÚstaticÚdynamicÚoperation_context_paramsr%   r%   r&   r¹   R  s"   ÿÿÿÿ
z3EndpointRulesetResolver._resolve_param_from_contextc                 C   s   |   |¡}| |¡S r.   )Ú_get_static_context_paramsrH   )r"   r¶   r¯   Ústatic_ctx_paramsr%   r%   r&   rÀ   h  s   

z>EndpointRulesetResolver._resolve_param_as_static_context_paramc                 C   s(   |   |¡}||v r|| }| |¡S d S r.   )Ú_get_dynamic_context_paramsrH   )r"   r¶   r¯   r°   Údynamic_ctx_paramsÚmember_namer%   r%   r&   rÁ   n  s
   

þz?EndpointRulesetResolver._resolve_param_as_dynamic_context_paramc                 C   s(   |   ¡ }||v r|| }| j |¡S d S r.   )Ú_get_client_context_paramsr”   rH   )r"   r¶   Úclient_ctx_paramsÚclient_ctx_varnamer%   r%   r&   rÃ   v  s
   þz>EndpointRulesetResolver._resolve_param_as_client_context_paramc                 C   s*   |j }||v r|| d }t ||¡S d S )NÚpath)Úoperation_context_parametersÚjmespathÚsearch)r"   r¶   r¯   r°   Úoperation_ctx_paramsrÏ   r%   r%   r&   rÂ   |  s
   þzAEndpointRulesetResolver._resolve_param_as_operation_context_paramc                 C   s4   |t j ¡ vrt|d�‚| |¡}t|ƒr|ƒ S |S )N©Úname)r{   Ú__members__Úvaluesr   rH   Úcallable)r"   r·   rœ   rº   r%   r%   r&   r»   „  s   

z1EndpointRulesetResolver._resolve_param_as_builtinc                 C   ó   dd„ |j D ƒS )z=Mapping of param names to static param value for an operationc                 S   ó   i | ]}|j |j“qS r%   )rÕ   Úvalue©r¥   Úparamr%   r%   r&   r§   �  ó    ÿÿzFEndpointRulesetResolver._get_static_context_params.<locals>.<dictcomp>)Ústatic_context_parameters©r"   r¯   r%   r%   r&   rÇ   Œ  ó   þz2EndpointRulesetResolver._get_static_context_paramsc                 C   rÙ   )z7Mapping of param names to member names for an operationc                 S   rÚ   r%   )rÕ   rË   rÜ   r%   r%   r&   r§   —  rÞ   zGEndpointRulesetResolver._get_dynamic_context_params.<locals>.<dictcomp>)Úcontext_parametersrà   r%   r%   r&   rÉ   ”  rá   z3EndpointRulesetResolver._get_dynamic_context_paramsc                 C   s   dd„ | j jD ƒS )z7Mapping of param names to client configuration variablec                 S   s   i | ]	}|j t|j ƒ“qS r%   )rÕ   r   rÜ   r%   r%   r&   r§   Ÿ  s    ÿÿzFEndpointRulesetResolver._get_client_context_params.<locals>.<dictcomp>)r’   Úclient_context_parametersr(   r%   r%   r&   rÌ   œ  s   þz2EndpointRulesetResolver._get_client_context_paramsc                 C   s8   | j j ¡ }t | j¡}| jjd|› �||||d� |S )Nzbefore-endpoint-resolution.)rœ   ÚmodelÚparamsÚcontext)r’   Ú
service_idÚ	hyphenizerh   r“   r•   Úemit)r"   r¯   r°   r±   rç   r½   r%   r%   r&   r¸   ¤  s   ûz0EndpointRulesetResolver._get_customized_builtinsc           
         sð  t |tƒrt|ƒdkrtdƒ‚t dd dd„ |D ƒ¡ˆ j¡ ˆ jtkr(di fS dd„ |D ƒ}‡ fd	d„|D ƒ}ˆ jd
urZzt	‡ fdd„|D ƒƒ\}}W nc t
yY   d
i f Y S w ˆ jd
urxˆ j d¡}‡ fdd„|D ƒ}t||ƒ}|| }n8zt	dd„ |D ƒƒ\}}W n* t
y¯   d}dd„ |D ƒ}ts tdd„ |D ƒƒ}|r§tdd�‚td |¡d�‚w i }	d|v r½|d |	d< nd|v rÒt|d ƒdkrÒd |d ¡|	d< d|v rÞ|	j|d d� d|v rêt|d ƒ|	d< t d|d ||	¡ ||	fS )að  Convert an Endpoint's authSchemes property to a signing_context dict

        :type auth_schemes: list
        :param auth_schemes: A list of dictionaries taken from the
            ``authSchemes`` property of an Endpoint object returned by
            ``EndpointProvider``.

        :rtype: str, dict
        :return: Tuple of auth type string (to be used in
            ``request_context['auth_type']``) and signing context dict (for use
            in ``request_context['signing']``).
        r   z&auth_schemes must be a non-empty list.z_Selecting from endpoint provider's list of auth schemes: %s. User selected auth scheme is: "%s"z, c                 S   s   g | ]}d |  d¡› d �‘qS )ú"rÕ   )rH   ©r¥   Úsr%   r%   r&   Ú
<listcomp>Æ  s    zGEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<listcomp>Únonec                 S   s   g | ]}|d    d¡d ‘qS ©rÕ   ú#éÿÿÿÿ)Úsplitrë   r%   r%   r&   rí   Í  s    ÿc                    s&   g | ]}i |¥d ˆ   |d  ¡i¥‘qS rÔ   )Ú_strip_sig_prefix©r¥   Úschemer(   r%   r&   rí   Ð  ó    ÿÿNc                 3   s,   � | ]}ˆ   ˆ j|d  ¡rˆ j|fV  qdS ©rÕ   N)Ú._does_botocore_authname_match_ruleset_authnamer—   rë   r(   r%   r&   Ú	<genexpr>Ù  s   € 
ÿý
ÿzFEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<genexpr>ú,c                    s&   i | ]}ˆ   |d   d¡d ¡|“qS rï   )ró   rò   rë   r(   r%   r&   r§   ç  rö   zGEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<dictcomp>c                 s   s(   � | ]}|d  t v r|d  |fV  qdS r÷   )r   rë   r%   r%   r&   rù   ñ  s   € 
ý

ÿFc                 S   s   g | ]}|d  ‘qS rÔ   r%   rë   r%   r%   r&   rí   û  s    c                 s   s   � | ]}|t v V  qd S r.   r   rô   r%   r%   r&   rù   ý  s
   € ÿ
ÿzbThis operation requires an additional dependency. Use pip install botocore[crt] before proceeding.©Úmsg)Úsignature_versionÚsigningRegionrx   ÚsigningRegionSetÚsigningName)Úsigning_nameÚdisableDoubleEncodingz?Selected auth type "%s" as "%s" with signing context params: %srÕ   )Ú
isinstanceÚlistÚlenÚ	TypeErrorr\   r]   Újoinr—   r   ÚnextÚStopIterationr˜   rò   r   r   Úanyr   r   Úupdater   )
r"   Úauth_schemesÚavailable_ruleset_namesrÕ   rõ   ÚprefsÚauth_schemes_by_auth_typeÚfixable_with_crtÚauth_type_optionsÚsigning_contextr%   r(   r&   Úauth_schemes_to_signing_ctx³  s�   ü
ÿ
þ
þü

þÿ
þþÿÿîÿÿüz3EndpointRulesetResolver.auth_schemes_to_signing_ctxc                 C   s   |  d¡r|dd… S |S )z6Normalize auth type names by removing any "sig" prefixÚsigé   N)r¬   )r"   Ú	auth_namer%   r%   r&   ró   #  s   z)EndpointRulesetResolver._strip_sig_prefixc                 C   s>   |   |¡}| d¡d }|dkr| d¡r|dd… }||kS )a\  
        Whether a valid string provided as signature_version parameter for
        client construction refers to the same auth methods as a string
        returned by the endpoint ruleset provider. This accounts for:

        * The ruleset prefixes auth names with "sig"
        * The s3 and s3control rulesets don't distinguish between v4[a] and
          s3v4[a] signers
        * The v2, v3, and HMAC v1 based signers (s3, s3-*) are botocore legacy
          features and do not exist in the rulesets
        * Only characters up to the first dash are considered

        Example matches:
        * v4, sigv4
        * v4, v4
        * s3v4, sigv4
        * s3v7, sigv7 (hypothetical example)
        * s3v4a, sigv4a
        * s3v4-query, sigv4

        Example mismatches:
        * v4a, sigv4
        * s3, sigv4
        * s3-presign-post, sigv4
        ú-r   rK   é   N)ró   rò   r¬   )r"   ÚbotonameÚrsnamer%   r%   r&   rø   '  s
   
zFEndpointRulesetResolver._does_botocore_authname_match_ruleset_authnamec                 C   sh  |j  d¡}|du rdS | d¡r+z	| d¡d }W n ty%   |}Y nw t|d�S | jj}|dkro|dks;|d	kr@t|d
�S | d¡s^| d¡s^| d¡s^| d¡s^| d¡s^| d¡rct	|d
�S | 
¡  d¡rot|d�S |dkr›| d¡rƒ| d¡}t||d�S | d¡s�| d¡r’t|d
�S |dkr›t|d�S |dkr²| d¡r©t|d
�S |dkr²t|d
�S dS )z„Attempts to translate ruleset errors to pre-existing botocore
        exception types by string matching exception strings.
        rü   NzInvalid region in ARN: ú`é   )ÚlabelrK   z/S3 Object Lambda does not support S3 Acceleratez#Accelerate cannot be used with FIPSrû   zS3 Outposts does not supportzS3 MRAP does not supportz!S3 Object Lambda does not supportzAccess Points do not supportzInvalid configuration:z#Client was configured for partitionzinvalid arn:)ÚreportÚ	s3controlzInvalid ARN:ÚBucket)Úarnrü   z!AccountId is required but not setÚeventszUInvalid Configuration: FIPS is not supported with EventBridge multi-region endpoints.z&EndpointId must be a valid host label.)ÚkwargsrH   r¬   rò   Ú
IndexErrorr   r’   r#   r   r   Úlowerr   r   r   r   )r"   Úruleset_exceptionrå   rü   r  r#   r!  r%   r%   r&   r«   G  sd   
ÿ
ÿþ
ÿþýüûú



ÿ

ÿ

z;EndpointRulesetResolver.ruleset_error_to_botocore_exceptionc                 C   s6   |dkrt d| ¡ › �ƒ d S |dkrt dƒ d S d S )NÚAccountIdEndpointModeÚACCOUNT_ID_MODE_Ú	AccountIdÚRESOLVED_ACCOUNT_ID)r   Úupper)r"   r¶   r¿   r%   r%   r&   r¼   ~  s
   ÿz6EndpointRulesetResolver._register_endpoint_feature_ids)TNN)r/   r0   r1   r2   r9   r'   r©   r¹   rÀ   rÁ   rÃ   rÂ   r»   r   rÇ   rÉ   rÌ   r¸   r  ró   rø   r«   r¼   r%   r%   r%   r&   rŠ   Ø  s4    

ö6"


p 7rŠ   )1r2   rh   Úloggingrc   Úenumr   rÑ   Úbotocorer   r   Úbotocore.authr   r   r   Úbotocore.crtr	   Úbotocore.endpoint_providerr
   r   Úbotocore.exceptionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   Úbotocore.useragentr   Úbotocore.utilsr   r   Ú	getLoggerr/   r\   ÚDEFAULT_URI_TEMPLATErZ   r   r3   Ústrr{   rŠ   r%   r%   r%   r&   Ú<module>   s,   @
=  :(