Current File : //proc/self/root/usr/lib/python3/dist-packages/botocore/__pycache__/handlers.cpython-312.pyc
�

P��e�����	�dZddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
Z
ddlZ
ddl
mZddl
mZmZmZmZmZmZmZmZmZmZmZddlmZmZmZddlmZddlm Z m!Z!m"Z"dd	l#m$Z$dd
l%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddl
m0Z0dd
l
m1Z1ddl
m2Z2ddlm3Z3ddl)m4Z4ddl)m5Z5ddl)m6Z6ejne8�Z9e:�Z;e:�Z<ejzd�Z>dZ?dZ@ejzdj�e?e@g��ZBdZCejzd�ZDd�ZEd�ZFd�ZGd�ZHd�ZId�ZJd�ZKd �ZLd!�ZMd"�ZNd#�ZOd$�ZPd%�ZQd�d&�ZRd'�ZSd(�ZTd)�ZUGd*�d+�ZVd,�ZWd-�ZXd.�ZYd/�ZZd0�Z[d1�Z\d2�Z]d3�Z^d4�Z_d5�Z`d6�Zad7�Zbd8�Zcd9�Zdd:�Zed;�Zfd<�Zgd=�Zhd>�Zid?�Zjd@�ZkdA�ZldB�ZmdC�ZndD�ZodE�ZpdF�ZqdG�ZrdH�ZsdI�ZtdJ�ZuGdK�dL�ZvGdM�dN�ZwGdO�dP�ZxdQ�ZydR�ZzdS�Z{dT�Z|dU�Z}dV�Z~dW�ZdX�Z�gdYeEf�dZewd[�f�d\ete<f�d]ete<f�d^e(f�d_e'f�d`emf�daezf�dbe_f�dceKf�ddeNf�deeaf�dfeLf�dgeOf�dge|f�dheof�dieof�djeof�dkeXf�dleXf�dkedf�d]edf�dmedf�dne}f�doeWf�dpeWf�dqef�dreFf�dseUf�dtegf�duehf�dve,f�dwe-f�dxeGf�dxe,f�dyeGf�dzeif�d{eif�d|e]f�d}e{f�d~elf�deHe;f�d�eHe;f�d�eHe;f�d�eTf�d�eTf�d�eTf�d�eTf�d�eTf�d�eTf�d�eJf�d�ePf�d�ePf�d]ePf�dkePf�dkeQf�dmePf�d\ePf�dlePf�dleQf�d�ePf�d�ePf�d�ebf�d�ebf�d�eef�d�eff�d�e~f�d�e�f�d�epf�d�eqf�d�erf�d�enf�d�ed�d���jf�d�ed���jf�d�ed���jf�d�ej�f�d�ekf�d�ecd��f�d�ecd��f�d�ed���jf�d�ed���jf�d�ed���jf�d�ed���jf�d�ecd��f�d�ed�d�gd����jf�d�e&f�d�e^f�d�e^f�d�e^f�d�e^f�d�e^f�d�ed���jf�d�ed���jf�d�ed���jf�d�ed���jf�d�ed���jf�d�e^f�d�e^f�d�ed���jf�d�ed���jf�d�e^f�d�e^f�d�ed���jf�d�ed���jf�dreyf�Z�eue��y)�z_Builtin event handlers.

This module contains builtin handlers for events emitted by botocore.
�N)�BytesIO)�utils)�ETree�OrderedDict�
XMLParseError�ensure_bytes�get_md5�json�quote�unquote�unquote_str�urlsplit�
urlunsplit)�AppendParamDocumentation�AutoPopulatedParam�HideParamFromOperations)�VALID_HOST_LABEL_RE)�AliasConflictParameterError�ParamValidationError�UnsupportedTLSVersionWarning)�EndpointResolverBuiltins)�add_generate_db_auth_token�add_generate_presigned_post�add_generate_presigned_url)�
SAFE_CHARS�	ArnParser� conditionally_calculate_checksum�conditionally_calculate_md5�percent_encode�switch_host_with_param)�retryhandler)�	translate)�
MD5_AVAILABLE)�MissingServiceIdError)�hyphenize_service_id)�is_global_accesspoint)�SERVICE_NAME_ALIASESz^[a-zA-Z0-9.\-_]{1,255}$z]^arn:(aws).*:(s3|s3-object-lambda):[a-z\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\-.]{1,63}$zt^arn:(aws).*:s3-outposts:[a-z\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\-]{1,63}$�|)�s3zs3-outpostszs3-object-lambda�	s3expressz\?versionId=[^\s]+$c�.�tj||�S�N)r'�get)�service_name�kwargss  �3/usr/lib/python3/dist-packages/botocore/handlers.py�handle_service_name_aliasr1is���#�#�L�,�?�?�c��dtjv}tjjd�}|r|r|d}d|vrt|d��|d<yyyy)N�AWS_LAMBDA_FUNCTION_NAME�_X_AMZN_TRACE_ID�headerszX-Amzn-Trace-Idz
-=;:+&[]{}"',��safe)�os�environr-r)�paramsr/�has_lambda_name�trace_idr6s     r0�add_recursion_detection_headerr>msY��0�B�J�J�>�O��z�z�~�~�0�1�H��8���#���G�+�).�x�>N�)O�G�%�&�,�$�r2c�p�|d}d|vr|jdd�}d|vr|jdd�}||d<y)N�body�
s&#xD;�
s&#xA;)�replace)r;r/r@s   r0�escape_xml_payloadrDvsD���&�>�D���}��|�|�E�8�,����}��|�|�E�8�,���F�6�Nr2c�f�|�y|\}}t|�rtjd|�d|_yy)NzWError found for response with 200 status code, errors: %s, changing status code to 500.i�)�_looks_like_special_case_error�logger�debug�status_code)�responser/�
http_response�parseds    r0�check_for_200_errorrM�sF�� ��	�$��M�6�%�m�4����
�
�		
�%(�
�!�5r2c�
�|jdk(re	tjtj�d��}|j	|j
�|j
�}|jdk(ryy#t$rYywxYw)N���utf-8��target�encodingT�ErrorF)	rIr�	XMLParser�TreeBuilder�feed�content�closer�tag)rK�parser�roots   r0rFrF�sz��� � �C�'�
	��_�_��(�(�*�W��F�
�K�K�
�-�-�.��<�<�>�D��8�8�w������	��		�s�AA6�6	B�Bc��|jd�}|sy|dk(rtjS|dk(ry|jd�rM|dk(r|S|dk(r&d|d	�}d
|vr|d
j	|�n||d
<d}nd}|dk(rd|d
<|t
vrd|��}|Sy)a'Choose the operation-specific signer.

    Individual operations may have a different auth type than the service as a
    whole. This will most often manifest as operations that should not be
    authenticated at all, but can include other auth modes such as sigv4
    without body signing.
    �	auth_typeN�none�bearer�v4zv4-s3express�v4a�*)�region�signing_name�signingzv4-unsigned-bodyF�payload_signing_enabledr))r-�botocore�UNSIGNED�
startswith�update�S3_SIGNING_NAMES)�contextrer/r^rf�signature_versions      r0�set_operation_specific_signerro�s������K�(�I����F��� � � ��H������D�!���&������"%�l�C�G��G�#��	�"�)�)�'�2�%,��	�"� %�� $���*�*�16�G�-�.��+�+�"$�%6�$7� 8�� � �5"r2c���d|vr9	tjt|dd��jdd�}||d<yy#tt
tf$rtjdd��YywxYw)N�Outputzlatin-1rPrCzError decoding base64T��exc_info)	�base64�	b64decode�bytes�decode�
ValueError�	TypeError�AttributeErrorrGrH�rLr/�values   r0�decode_console_outputr}�s|���6��		A��$�$��f�X�&�	�2���f�W�i�(�
� %�F�8�����I�~�6�	A��L�L�0�4�L�@�	A�s�7?�+A-�,A-c��|jD]F}||vs�ttj��||<tjd||�d|�d���Hy)Nzinjecting idempotency token (z) into param 'z'.)�idempotent_members�str�uuid�uuid4rGrH)r;�modelr/�names    r0�generate_idempotent_uuidr��sM���(�(����v���t�z�z�|�,�F�4�L��L�L��$�<��'�
�r2c��	tjt|��}|S#ttf$rt
j
dd��Y|SwxYw)NzError loading quoted JSONTrr)r
�loadsrrxryrGrH)r|s r0�decode_quoted_jsondocr�sO��A��
�
�7�5�>�*���L��
�	�"�A����0�4��@��L�A�s�"�&A�Ac��d|vr%	tj|dt��}||d<yy#ttf$rt
j
dd��YywxYw)N�TemplateBody)�object_pairs_hookzerror loading JSONTrr)r
r�rrxryrGrHr{s   r0�json_decode_template_bodyr�s_�����	>��J�J��~�&�+��E�&+�F�>�"� ���I�&�	>��L�L�-��L�=�	>�s�#+�&A�Ac���d|vry|d}tj|�sJtj|�s4d|�dtj�dtj�d�}t	|���yy)N�BucketzInvalid bucket name "z%": Bucket name must match the regex "z#" or be an ARN matching the regex "�"��report)�VALID_BUCKET�search�VALID_S3_ARN�patternr)r;r/�bucket�	error_msgs    r0�validate_bucket_namer�s}���v���
�H�
�F����v�&�|�/B�/B�6�/J�#�F�8�,�&�.�.�/�0�&�.�.�/�q�
2�	�
#�)�4�4�
0K�&r2c��t|d�y)z�
    S3 server-side encryption requires the encryption key to be sent to the
    server base64 encoded, as well as a base64-encoded MD5 hash of the
    encryption key. This handler does both if the MD5 has not been set by
    the caller.
    �SSECustomerN��_sse_md5�r;r/s  r0�sse_md5r�#s��
�V�]�#r2c��t|d�y)a1
    S3 server-side encryption requires the encryption key to be sent to the
    server base64 encoded, as well as a base64-encoded MD5 hash of the
    encryption key. This handler does both if the MD5 has not been set by
    the caller specifically if the parameter is for the copy-source sse-c key.
    �CopySourceSSECustomerNr�r�s  r0�copy_source_sse_md5r�-s��
�V�,�-r2c�P�t||�sy|dz}|dz}||}t|t�r|jd�}t	j
t
|�j��jd�}t	j
|�jd�}|||<|||<y)N�Key�KeyMD5rP)	�_needs_s3_sse_customization�
isinstancer��encodert�	b64encoder	�digestrw)r;�sse_member_prefix�sse_key_member�sse_md5_member�key_as_bytes�key_md5_str�key_b64_encodeds       r0r�r�7s���&�v�/@�A��&��.�N�&��1�N��.�)�L��,��$�#�*�*�7�3���"�"�7�<�#8�#?�#?�#A�B�I�I���K��&�&�|�4�;�;�G�D�O�,�F�>��(�F�>�r2c�@�|j|dz�duxr|dz|vS)Nr�r��r-)r;r�s  r0r�r�Hs0���
�
�$�u�,�-�T�9�	7���(��6�r2c�"�tjS)zk
    This handler disables request signing by setting the signer
    name to a special sentinel value.
    )rhri)r/s r0�disable_signingr�Os��
���r2c��|jjdd�dvryd|vr0|d}t|d�rtj	d�d|dd	<yyy)
N�method�)�PUT�POSTr@�readz-Adding expect 100 continue header to request.z100-continuer6�Expect)�httpr-�hasattrrGrH)r�r;r/r@s    r0�add_expect_headerr�Ws_���z�z�~�~�h��#�?�:��
����f�~���4�� �
�L�L�H�I�*8�F�9��h�'�	!�r2c��eZdZd�Zd�Zy)�DeprecatedServiceDocumenterc��||_yr,)�_replacement_service_name)�self�replacement_service_names  r0�__init__z$DeprecatedServiceDocumenter.__init__ds
��)A��&r2c��|jj�|jd�|jj|j|j�|jd�|jj�y)Nz.This service client is deprecated. Please use z	 instead.)�style�start_important�write�refr��
end_important)r��section�
event_namer/s    r0�inject_deprecation_noticez5DeprecatedServiceDocumenter.inject_deprecation_noticegsa���
�
�%�%�'��
�
�F�G��
�
����*�*��*�*�	
�	�
�
�k�"��
�
�#�#�%r2N)�__name__�
__module__�__qualname__r�r��r2r0r�r�cs
��B�&r2r�c��d|vrU|jd�}|jd�}|jd�}|j�|jd�yd|vrv|jd�}|jd�}|j�|jd�|jd	�}|j�|jd
�yy)Nzrequest-example�structure-value�
CopySource�member-valuezH'string' or {'Bucket': 'string', 'Key': 'string', 'VersionId': 'string'}zrequest-params�
param-typez:type CopySource: str or dictzparam-documentationaqThe name of the source bucket, key name of the source object, and optional version ID of the source object.  You can either provide this value as a string or a dictionary.  The string form is {bucket}/{key} or {bucket}/{key}?versionId={versionId} if you want to copy a specific version.  You can also provide this value as a dictionary.  The dictionary format is recommended over the string format because it is more explicit.  The dictionary format is: {'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}.  Note that the VersionId key is optional and may be omitted. To specify an S3 access point, provide the access point ARN for the ``Bucket`` key in the copy source dictionary. If you want to provide the copy source for an S3 access point as a string instead of a dictionary, the ARN provided must be the full S3 access point object ARN (i.e. {accesspoint_arn}/object/{key})��get_section�
clear_textr�)	r�r�r/�parent�
param_line�
value_portion�
param_section�type_section�doc_sections	         r0�document_copy_source_formr�rs����J�&��$�$�%6�7���'�'��5�
�"�.�.�~�>�
�� � �"����
6�	
�
�Z�	'��+�+�L�9�
�$�0�0��>�����!����:�;�#�/�/�0E�F����� ����
5�	
�
(r2c��|jd�}|�yt|t�rt|�|d<yt|t�rt|�|d<yy)aHConvert CopySource param for CopyObject/UploadPartCopy.

    This handler will deal with two cases:

        * CopySource provided as a string.  We'll make a best effort
          to URL encode the key name as required.  This will require
          parsing the bucket and version id from the CopySource value
          and only encoding the key.
        * CopySource provided as a dict.  In this case we're
          explicitly given the Bucket, Key, and VersionId so we're
          able to encode the key and ensure this value is serialized
          and correctly sent to S3.

    r�N)r-r�r��_quote_source_header�dict�_quote_source_header_from_dict)r;r/�sources   r0�handle_copy_source_paramr��sS���Z�Z��
%�F�
�~�	��&�#��3�F�;��|��	�F�D�	!�=�f�E��|��
"r2c��	|d}|d}|jd�}tj|�r|�d|��}n|�d|��}t
|tdz��}|�|d	|zz
}|S#t$r}t	dt|������d}~wwxYw)
Nr�r��	VersionIdz/object/�/zMissing required parameter: r�r7z
?versionId=%s)r-r�r��KeyErrorrr�rr)�source_dictr��key�
version_id�final�es      r0r�r��s���
��X�&���%� �� �_�_�[�1�
����v�&��h�h�s�e�,�E��h�a��u�%�E�

�5�z�C�'7�8�E���
��:�-�-���L���
�"�1�#�a�&��:�
�	
��
�s�?A!�!	B�*B�Bc���tj|�}|�t|tdz��S|d|j	�||j	�d}}t|tdz��|zS)Nr�r7)�VERSION_ID_SUFFIXr�rr�start)r|�result�firstr�s    r0r�r��se��
�
%�
%�e�
,�F�
�~��e�*�s�*:�;�;�!�"2�F�L�L�N�3�U�6�<�<�>�;K�5L�z���e�*�s�*:�;�j�H�Hr2c��tj|�}||dd<|dj||�|d<d|d<i|d<|j|||j��S)Nr@�DestinationRegion�url�GETr�r6)�region_name�operation_name)�copy�deepcopyrC�generate_presigned_urlr�)�request_signer�request_dictr��
source_region�destination_region�request_dict_copys      r0�_get_cross_region_presigned_urlr�s���
�
�l�3��5G��f��1�2�+�E�2�:�:��M� ��e��#(��h��#%��i� ��0�0��}�U�Z�Z�1��r2c�D�|j}|jd�}||fS)N�SourceRegion)�_region_namer-)r�r;rrs    r0�1_get_presigned_url_source_and_destination_regionsr�s(��'�4�4���J�J�~�.�M��,�,�,r2c�v�d|dvryt||d�\}}t|||||�}||dd<||dd<y)N�PresignedUrlr@r��rr�r;r�r�r/�src�destr�s       r0�inject_presigned_url_ec2r�s`������'��A���v���I�C��*����s�D��C�&)�F�6�N�>�"�+/�F�6�N�&�'r2c��d|dvryt||d�\}}|dd=d|dvryt|||||�}||dd<y)Nrr@�PreSignedUrlr
rs       r0�inject_presigned_url_rdsr�sl���V�F�^�+��A���v���I�C��	�v��~�&�����'��
)����s�D��C�&)�F�6�N�>�"r2c�N�|j}|�t||j�yyr,)�output_shape�_decode_policy_types)rLr�r/rs    r0�json_decode_policiesrs*���%�%�L����V�U�%7�%7�8� r2c�X�d}|jdk(rj|jj�D]M\}}|jdk(r%|j|k(r||vrt	||�||<�:||vs�?t|||��O|jdk(r |j}|D]}t||��yy)N�policyDocumentType�	structure�string�list)�	type_name�members�itemsr�r�r�member)rL�shape�
shape_name�member_name�member_shape�shape_member�items       r0rr s���&�J����+�%�).���)<�)<�)>�
	H�%�K���&�&�(�2� �%�%��3��6�)�&;��;�'�'��{�#���&�$�V�K�%8�,�G�
	H�
���&� ��|�|���	5�D� ��|�4�	5�!r2c���|j�y|j}tjtj�d��}|j|�|j
�}|j}||d<y)NrPrQ�LocationConstraint)�rawrXrrUrVrWrY�text)rLrKr/�
response_bodyr[r\rds       r0�parse_get_bucket_locationr*6sb����� ��!�)�)�M�
�_�_�E�$5�$5�$7�'�
J�F�
�K�K�
���<�<�>�D�
�Y�Y�F�#)�F�� r2c��d|vrUt|dt�r|djd�|d<tj|d�jd�|d<yy)N�UserDatarP)r�r�r�rtr�rwr�s  r0�base64_encode_user_datar-Fs`���V���f�Z�(�#�.�!'�
�!3�!:�!:�7�!C�F�:��#�-�-�f�Z�.@�A�H�H��
��z��	r2c�6�d}t||�}|jS)Nzw**This value will be base64 encoded automatically. Do not base64 encode this value prior to performing the operation.**�r�append_documentation)�param�description�appends   r0�document_base64_encodingr4Ps&��	��
&�e�[�
9�F��&�&�&r2c��|jd�}|rt|t�sy|j�D](\}}	|j	d�|j	d��*y#t
$rd|�d|�d�}t
|���wxYw)aEVerify S3 Metadata only contains ascii characters.

    From: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

    "Amazon S3 stores user-defined metadata in lowercase. Each name, value pair
    must conform to US-ASCII when using REST and UTF-8 when using SOAP or
    browser-based uploads via POST."

    �MetadataN�asciiz3Non ascii characters found in S3 metadata for key "z", value: "z4".  
S3 metadata can only contain ASCII characters. r�)r-r�r�rr��UnicodeEncodeErrorr)r;r/�metadatar�r|r�s      r0�validate_ascii_metadatar:Zs����z�z�*�%�H��:�h��5�	��n�n�&�
9�
��U�		9��J�J�w���L�L��!�
9��"�	9�14�U�<�
�
'�i�8�8�
	9�s�"A!�!Bc�@�|j}|rt|d�sy|jj�D��cgc]\}}|jdvr|��}}}|D]>}||vs�||}|jd�d||<tjd||||��@ycc}}w)z�
    Check for and split apart Route53 resource IDs, setting
    only the last piece. This allows the output of one operation
    (e.g. ``'foo/1234'``) to be used as input in another
    operation (e.g. it expects just ``'1234'``).
    rN)�
ResourceId�DelegationSetId�ChangeIdr����z%s %s -> %s)�input_shaper�rrr��splitrGrH)r;r�r/r@r�rr�
orig_values        r0�fix_route53_idsrCys����#�#�K��g�k�9�=��)�0�0�6�6�8���T�5��:�:�F�F�	
��G���H���6�>����J�%�+�+�C�0��4�F�4�L��L�L���j�&��,�G�	H��
s�Bc�2�|jd��d|d<yy)N�	accountId�-r�r�s  r0�inject_account_idrG�s"��
�z�z�+��&�
"��{��'r2c�2�|}|jd|dd<y)N�
apiVersionr6zx-amz-glacier-version)r9�r�r;r/r�s    r0�add_glacier_versionrK�s#���L�7<�~�~��8�L���3�4r2c�D�|djdd��|}d|dd<yy)Nr6�Acceptzapplication/jsonr�rJs    r0�add_accept_headerrN�s3��
�i����X�t�,�4���,>��Y���)�5r2c�*�|}|d}|d}t|t�rt|�}|j�}d|vrt	j
|d��|d<|j
|�d|vrt	j|�|d<|j
|�y)z�Add glacier checksums to the http request.

    This will add two headers to the http request:

        * x-amz-content-sha256
        * x-amz-sha256-tree-hash

    These values will only be added if they are not present
    in the HTTP request.

    r6r@zx-amz-content-sha256T)�as_hexzx-amz-sha256-tree-hashN)r�rvr�tellr�calculate_sha256�seek�calculate_tree_hash)r;r/r�r6r@�starting_positions      r0�add_glacier_checksumsrV�s����L��9�%�G����D��$����t�}���	�	����W�,�*/�*@�*@���+
��&�'�	�I�I�� ��w�.�,1�,E�,E�d�,K��(�)��I�I�� r2c�2�d}td|�jS)Na�
        This is a required field.

        Ideally you will want to compute this value with checksums from
        previous uploaded parts, using the algorithm described in
        `Glacier documentation <http://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html>`_.

        But if you prefer, you can also use botocore.utils.calculate_tree_hash()
        to compute it from raw file by::

            checksum = calculate_tree_hash(open('your_file.txt', 'rb'))

        �checksumr/)�docs r0�#document_glacier_tree_hash_checksumrZ�s���C�$�J��4�I�I�Ir2c�F�d|vrD|jd�}|jd�}|j�|jd�yd|vrU|jd�}|jd�}|jd�}|j�|jd�yy)	Nzresponse-paramsr�r�z(*dict*) --zresponse-exampler�r�z{}r�)r�r�r/�template_body_sectionr�r�r�r�s        r0�0document_cloudformation_get_template_return_typer]�s����J�&� '� 3� 3�N� C��,�8�8��F�����!����=�)�	�z�	)��$�$�%6�7���'�'��7�
�"�.�.�~�>�
�� � �"����D�!�
*r2c��t|d�y)N�PredictEndpoint)r ��requestr/s  r0�switch_host_machinelearningrb�s
���7�$5�6r2c��ddl}	|j}|dkr(tjd|jzt
�yy#t$rYywxYw)Nr)�rrdz�Currently installed openssl version: %s does not support TLS 1.2, which is required for use of iot-data. Please use python installed with openssl version 1.0.1 or higher.)�ssl�OPENSSL_VERSION_INFO�warnings�warn�OPENSSL_VERSIONrrz)r/re�openssl_version_tuples   r0�&check_openssl_supports_tls_version_1_2rk�s]���

� #� 8� 8�� �9�,��M�M��!�0�0�2�-�
�-���
��
�s�8A�	A�Ac��|jdk(rOd|jvr@d|jd<d|_|jjdd�\|_|_yyy)Nr��?z!application/x-www-form-urlencoded�Content-Typer�rd)r�r�r6rA�datar`s  r0�change_get_to_postrpsW���~�~���3�'�+�+�#5�*M�����'����$+�K�K�$5�$5�c�1�$=�!���W�\�$6�r2c�"�d|vrd|d<d|d<yy)N�EncodingTypeT�encoding_type_auto_setr�r�)r;rmr/s   r0�"set_list_objects_encoding_type_urlrt	s&���V�#�-1��(�)�!&��~��	$r2c�*�tgd�ddg||��y)N)�	Delimiter�Marker�
NextMarker��Contentsr���CommonPrefixes�Prefix��top_level_keys�nested_keysrLrm��_decode_list_object�rLrmr/s   r0�decode_list_objectr�s���<�(�*F�G���	r2c�*�tgd�ddg||��y)N)rvr}�
StartAfterryr{r~r�r�s   r0�decode_list_object_v2r�"s��
�<�(�*F�G���	r2c�*�tgd�gd�||��y)N)�	KeyMarker�
NextKeyMarkerr}rv))�Versionsr�)�
DeleteMarkersr�r{r~r�r�s   r0�decode_list_object_versionsr�/s��
�
�
�
��r2c���|jd�dk(rZ|jd�rH|D]}||vs�t||�||<�|D]%\}}||vs�||D]}t||�||<��'yyy)Nrrr�rs)r-r
)rr�rLrmr��top_key�	child_keyrs        r0r�r�Es���
�z�z�.�!�U�*�w�{�{� �0�"�	7�C��f�}�)�&��+�6��s��	7�#.�	G��G�Y��&� �$�W�o�G�F�(3�F�9�4E�(F�F�9�%�G�	G�0�*r2c��d|vrTt|dt�rtt|d��|d<yt|dt�rt|d�|d<yyy)N�Body)r�r�rrrvr�s  r0� convert_body_to_file_like_objectr�TsY��
����f�V�n�c�*�$�\�&��.�%A�B�F�6�N�
��v���
.�$�V�F�^�4�F�6�N�/�r2c��dddd�}|j�D]r\}}|jdd�\}}t||�}d|z|jtf}d|zd	z|j
f}|j
|�|j
|��ty)
N�Filters�fromTime�returnFields)zec2.*.Filterzlogs.CreateExportTask.fromzcloudsearchdomain.Search.return�.rdzbefore-parameter-build.zdocs.*.z.complete-section)r�rsplit�ParameterAlias�alias_parameter_in_call�REGISTER_FIRST� alias_parameter_in_documentationr3)	�handler_list�aliases�original�new_name�
event_portion�
original_name�parameter_alias�#parameter_build_event_handler_tuple�docs_event_handler_tuples	         r0�_add_parameter_aliasesr�\s���"�&0�+9��G�&�m�m�o�6���(�'/���s�A�'>�$�
�}�(���A��
&�
�5��3�3��/
�+�
�
�%�(;�;��<�<�$
� �	���?�@����4�5�%6r2c�$�eZdZd�Zd�Zd�Zd�Zy)r�c� �||_||_yr,)�_original_name�_alias_name)r�r��
alias_names   r0r�zParameterAlias.__init__~s��+���%��r2c�F�|jr�|j|jjvrr|j|vrc|j|vr,t	|j|j|j
���|j
|j�||j<yyyy)N)r��alias�	operation)r@r�rr�rr��pop)r�r;r�r/s    r0r�z&ParameterAlias.alias_parameter_in_call�s�������"�"�e�&7�&7�&?�&?�?��#�#�v�-��*�*�f�4�9�%)�%8�%8�"&�"2�"2�&+�j�j���39�*�*�T�=M�=M�2N�F�4�.�.�/�.�@�r2c���|jd�ry|j|jvry|j|j�}|jd�}|j	|�|jd�}|j	|�y|jd�rW|jd�}|j|jvry|j|j�}|j	|�yy)Nzdocs.request-paramsr�z
param-namezdocs.request-exampler�)rjr��available_sectionsr��_replace_content)r�r�r�r/r��param_type_section�param_name_sections       r0r�z/ParameterAlias.alias_parameter_in_documentation�s���� � �!6�7��"�"�'�*D�*D�D��#�/�/��0C�0C�D�M�!.�!:�!:�<�!H���!�!�"4�5�"/�!:�!:�<�!H���!�!�"4�5�
�
"�
"�#9�
:��)�)�*;�<�G��"�"�'�*D�*D�D��#�/�/��0C�0C�D�M��!�!�-�0�
;r2c���|j�jd�}|j|j|j�}|j�|j
|�y)NrP)�getvaluerwrCr�r�r�r�)r�r�rX�updated_contents    r0r�zParameterAlias._replace_content�sT���"�"�$�+�+�G�4��!�/�/�����!1�!1�
��	�����
�
�o�&r2N)r�r�r�r�r�r�r�r�r2r0r�r�}s��&�O� 1�('r2r�c��eZdZd�Zd�Zy)�ClientMethodAliasc��||_y)z�Aliases a non-extant method to an existing method.

        :param actual_name: The name of the method that actually exists on
            the client.
        N)�_actual)r��actual_names  r0r�zClientMethodAlias.__init__�s��#��r2c�.�t||j�Sr,)�getattrr�)r��clientr/s   r0�__call__zClientMethodAlias.__call__�s���v�t�|�|�,�,r2N)r�r�r�r�r�r�r2r0r�r��s��#�-r2r�c�b�eZdZdZej
dej�Zd�Zd�Z	d�Z
d�Zy)�HeaderToHostHoisterz;Takes a header and moves it to the front of the hoststring.z(?!-)[a-z\d-]{1,63}(?<!-)$c��||_yr,)�_header_name)r��header_names  r0r�zHeaderToHostHoister.__init__�s
��'��r2c��|j|dvry|d|j}|j|�|d}|j||�}||d<y)aHoist a header to the hostname.

        Hoist a header to the beginning of the hostname with a suffix "." after
        it. The original header should be removed from the header map. This
        method is intended to be used as a target for the before-call event.
        r6Nr�)r��_ensure_header_is_valid_host�_prepend_to_host)r�r;r/�header_value�original_url�new_urls      r0�hoistzHeaderToHostHoister.hoist�sa�����F�9�$5�5���i�(��):�):�;���)�)�,�7��e�}���'�'��l�C����u�
r2c�V�|jj|�}|std���y)Nz`Hostnames must contain only - and alphanumeric characters, and between 1 and 63 characters long.r�)�_VALID_HOSTNAME�matchr)r��headerr�s   r0r�z0HeaderToHostHoister._ensure_header_is_valid_host�s2���$�$�*�*�6�2���&�<��
�r2c���t|�}|jjd�}|g|z}dj|�}|j||j
|jdf}t|�}|S)Nr�r�)r�netlocrA�join�scheme�path�queryr)r�r��prefix�url_components�parts�
new_netloc�new_componentsr�s        r0r�z$HeaderToHostHoister._prepend_to_host�ss��!�#����%�%�+�+�C�0����5� ���X�X�e�_�
��!�!������ � ��
���^�,���r2N)r�r�r��__doc__�re�compile�
IGNORECASEr�r�r�r�r�r�r2r0r�r��s0��E� �b�j�j�!>��
�
�N�O�(�
 ��
r2r�c�V�|jsy|jj|dd<y)Nr6zx-amz-api-version)�is_endpoint_discovery_operation�
service_model�api_version)r�r;r/s   r0�#inject_api_version_header_if_neededr��s*���0�0��-2�-@�-@�-L�-L�F�9��)�*r2c��d|vr|d=yy)z>Operation requires h2 which is currently unsupported in Python�start_conversationNr�)�class_attributesr/s  r0� remove_lex_v2_start_conversationr��s���/�/��1�2�0r2c���|jjd�}|sy|j}|d|d<d}|D�cgc]}||vr
|�d||����}}dj|�|d<ycc}w)N�retriesz
invocation-idzamz-sdk-invocation-id)�ttl�attempt�max�=z; zamz-sdk-request)rmr-r6r�)rar/�retries_contextr6�sdk_retry_keysr��sdk_request_headerss       r0�add_retry_headersr��s����o�o�)�)�)�4�O����o�o�G�'6��'G�G�#�$�.�N�"����/�!��%�q���%�&�'����
"&���+>�!?�G����s�A%c���|jd}d}|j|�rK|t|�d|jd<|jd�d}||k(}|r|�d�n||jd<yy)a�Strips leading `{Bucket}/` from any operations that have it.

    The original value is retained in a separate "authPath" field. This is
    used in the HmacV1Auth signer. See HmacV1Auth.canonical_resource in
    botocore/auth.py for details.

    This change is applied to the operation model during the first time the
    operation is invoked and then stays in effect for the lifetime of the
    client object.

    When the ruleset based endpoint resolver is in effect, both the endpoint
    ruleset AND the service model place the bucket name in the final URL.
    The result is an invalid URL. This handler modifies the operation model to
    no longer place the bucket name. Previous versions of botocore fixed the
    URL after the fact when necessary. Since the introduction of ruleset based
    endpoint resolution, the problem exists in ALL URLs that contain a bucket
    name and can therefore be addressed before the URL gets assembled.
    �
requestUriz	/{Bucket}Nrmrr��authPath)r�rj�lenrA)r;r�rmr/�req_uri�bucket_path�needs_slashs       r0�'remove_bucket_from_url_paths_from_modelr�	s~��&�j�j��&�G��K����+�&�#*�3�{�+;�+=�#>��
�
�<� ��-�-��$�Q�'����,��2=�G�9�A��7��
�
�:��'r2c��td�|jD��}|j�0|jjd�dk(r|r|jd=yyyy)aPRemoves the `{AccountId}.` prefix from the operation model.

    This change is applied to the operation model during the first time the
    operation is invoked and then stays in effect for the lifetime of the
    client object.

    When the ruleset based endpoint resolver is in effect, both the endpoint
    ruleset AND the service model place the {AccountId}. prefix in the URL.
    The result is an invalid endpoint. This handler modifies the operation
    model to remove the `endpoint.hostPrefix` field while leaving the
    `RequiresAccountId` static context parameter in place.
    c3�ZK�|]#}|jdk(xr|jdu���%y�w)�RequiresAccountIdTN)r�r|)�.0�	ctx_params  r0�	<genexpr>z6remove_accid_host_prefix_from_model.<locals>.<genexpr>8s3������	���-�-�I�)�/�/�T�2I�I��s�)+N�
hostPrefixz{AccountId}.)�any�static_context_parameters�endpointr-)r;r�rmr/�
has_ctx_params     r0�#remove_accid_host_prefix_from_modelr+sb�����8�8���M�
	���"��N�N���|�,��>���N�N�<�(�
�
?�	#r2c��|j}t|t�rq|jd�r_|j	d�}t|�dkDr?t
jt|d��rdjdg|dd��|_yyyyy)Nz/arn%3Ar�rdr��)
�	auth_pathr�r�rjrAr�r�is_arnrr�)rar/r
�auth_path_partss    r0�remove_arn_from_signing_pathr
Ds����!�!�I��)�S�!�i�&:�&:�9�&E�#�/�/�#�.�����!�#�	�(8�(8��O�A�&�'�)
�!$���"�)C��q�r�/B�)C� D�G��)
�#�'F�!r2c���|jd�}|duxrtj|�}|jdk(rd|tj
<n|rd|tj
<|duxrt
j|�}|tj
}|jd�rF|sC|s@|s=tj|�s'd|tj<d|tj<yyyyyy)aModify builtin parameter values for endpoint resolver

    Modifies the builtins dict in place. Changes are in effect for one call.
    The corresponding event is emitted only if at least one builtin parameter
    value is required for endpoint resolution for the operation.
    r�N�GetBucketLocationTF�use_global_endpointz
aws-global)r-rrr�r�AWS_S3_FORCE_PATH_STYLErr�r�is_s3express_bucket�
AWS_REGION�AWS_S3_USE_GLOBAL_ENDPOINT)	�builtinsr�r;rmr/�bucket_name�
bucket_is_arn�path_style_required�path_style_requesteds	         r0�$customize_endpoint_resolver_builtinsrNs����*�*�X�&�K��t�+�M�	�0@�0@��0M�M�

�z�z�(�(�EI��)�A�A�B�
�EJ��)�A�A�B�	�4��N�(;�(A�(A�+�(N�$N��$� �8�8���	���)�*�#�$���)�)�+�6�8D��)�4�4�5�HL��)�D�D�E�7��%�$�	+r2c�x�|jjd�durd|jvr|jd=yyy)N�is_presign_requestTrn)rmr-r6r`s  r0�)remove_content_type_header_for_presigningr|s<�������0�1�T�9��g�o�o�-��O�O�N�+�
.�	:r2zchoose-service-namez/getattr.mturk.list_hi_ts_for_qualification_type� list_hits_for_qualification_typez$before-parameter-build.s3.UploadPartz#before-parameter-build.s3.PutObjectzcreating-client-classzcreating-client-class.s3zcreating-client-class.iot-dataz$creating-client-class.lex-runtime-v2zafter-call.iamzafter-call.ec2.GetConsoleOutputz%after-call.cloudformation.GetTemplatezafter-call.s3.GetBucketLocationzbefore-parameter-buildzbefore-parameter-build.s3z%before-parameter-build.s3.ListObjectsz'before-parameter-build.s3.ListObjectsV2z,before-parameter-build.s3.ListObjectVersionsz$before-parameter-build.s3.CopyObjectz(before-parameter-build.s3.UploadPartCopyz/before-parameter-build.s3.CreateMultipartUploadz!before-parameter-build.s3-controlz%docs.*.s3.CopyObject.complete-sectionz)docs.*.s3.UploadPartCopy.complete-sectionzbefore-endpoint-resolution.s3zbefore-callzbefore-call.s3zbefore-call.glacierzbefore-call.apigatewayzbefore-call.s3.PutObjectzbefore-call.s3.UploadPartzbefore-call.s3.DeleteObjectsz.before-call.s3.PutBucketLifecycleConfigurationz!before-call.glacier.UploadArchivez'before-call.glacier.UploadMultipartPartzbefore-call.ec2.CopySnapshotzrequest-createdz'request-created.machinelearning.Predictzneeds-retry.s3.UploadPartCopyzneeds-retry.s3.CopyObjectz&needs-retry.s3.CompleteMultipartUploadz$choose-signer.cognito-identity.GetIdz-choose-signer.cognito-identity.GetOpenIdTokenz-choose-signer.cognito-identity.UnlinkIdentityz8choose-signer.cognito-identity.GetCredentialsForIdentityz$choose-signer.sts.AssumeRoleWithSAMLz+choose-signer.sts.AssumeRoleWithWebIdentityz
choose-signerz$before-parameter-build.s3.HeadObjectz#before-parameter-build.s3.GetObjectz1before-parameter-build.s3.CompleteMultipartUploadz-before-parameter-build.s3.SelectObjectContentz'before-parameter-build.ec2.RunInstancesz<before-parameter-build.autoscaling.CreateLaunchConfigurationzbefore-parameter-build.route53zbefore-parameter-build.glacierzbefore-sign.s3z"before-sign.polly.SynthesizeSpeechzafter-call.s3.ListObjectszafter-call.s3.ListObjectsV2z after-call.s3.ListObjectVersionsz(request-created.cloudsearchdomain.Searchz!docs.*.glacier.*.complete-sectionrEzJNote: this parameter is set to "-" bydefault if no value is not specified.z-docs.*.glacier.UploadArchive.complete-sectionrXz3docs.*.glacier.UploadMultipartPart.complete-sectionzDdocs.request-params.glacier.CompleteMultipartUpload.complete-sectionz2docs.*.cloudformation.GetTemplate.complete-sectionz(docs.*.ec2.RunInstances.complete-sectionr,z=docs.*.autoscaling.CreateLaunchConfiguration.complete-sectionz(docs.*.ec2.CopySnapshot.complete-sectionr	r�zdocs.*.s3.*.complete-section�SSECustomerKeyMD5�CopySourceSSECustomerKeyMD5z1docs.*.lambda.UpdateFunctionCode.complete-section�ZipFiler)�
ContentMD5)
�
DeleteObjects�PutBucketAcl�
PutBucketCors�PutBucketLifecycle�PutBucketLogging�PutBucketNotification�PutBucketPolicy�PutBucketReplication�PutBucketRequestPayment�PutBucketTagging�PutBucketVersioning�PutBucketWebsite�PutObjectAclzcreating-client-class.rdsz%before-call.rds.CopyDBClusterSnapshotzbefore-call.rds.CreateDBClusterzbefore-call.rds.CopyDBSnapshotz+before-call.rds.CreateDBInstanceReadReplicaz:before-call.rds.StartDBInstanceAutomatedBackupsReplicationz1docs.*.rds.CopyDBClusterSnapshot.complete-sectionrz+docs.*.rds.CreateDBCluster.complete-sectionz*docs.*.rds.CopyDBSnapshot.complete-sectionz7docs.*.rds.CreateDBInstanceReadReplica.complete-sectionzFdocs.*.rds.StartDBInstanceAutomatedBackupsReplication.complete-sectionz)before-call.neptune.CopyDBClusterSnapshotz#before-call.neptune.CreateDBClusterz5docs.*.neptune.CopyDBClusterSnapshot.complete-sectionz/docs.*.neptune.CreateDBCluster.complete-sectionz'before-call.docdb.CopyDBClusterSnapshotz!before-call.docdb.CreateDBClusterz3docs.*.docdb.CopyDBClusterSnapshot.complete-sectionz-docs.*.docdb.CreateDBCluster.complete-section)r�)�r�rtr��loggingr9r�r�rg�iorrh�
botocore.authr�botocore.compatrrrrr	r
rrr
rr�botocore.docs.utilsrrr�botocore.endpoint_providerr�botocore.exceptionsrrr�botocore.regionsr�botocore.signersrrr�botocore.utilsrrrrrr r!r"r#r$r%r&r'�	getLoggerr�rG�objectr��
REGISTER_LASTr�r��_ACCESSPOINT_ARN�_OUTPOST_ARNr�r�rlr�r1r>rDrMrFror}r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrr*r-r4r:rCrGrKrNrVrZr]rbrkrprtr�r�r�r�r�r�r�r�r�r�r�r�r�rr
rr�document_auto_populated_param�
hide_param�BUILTIN_HANDLERSr�r2r0�<module>rBsZ���
���	�	�������������
;���
6���
��"��)�5�/�0�/�
��	�	�8�	$�������
��r�z�z�5�6����
B�
��r�z�z�#�(�(�$4�l�#C�D�E��J���B�J�J�5�6��@�P�
� (�>�$1!�hA���>�
5�$�.�)�"��	9�&�&�"
�JF�6�&I��.-�
/� )�0	9�5�,
*� 
�'�9�>H�0"��?�!�BJ�"
"� 7�
�&>�'��"
��,G�5�6�B/'�/'�d
-�
-�.�.�bM�3�@�K�D)�2E�+M�\,�@��5�6�@�	:��<�=��@�	/�(���
@�	.�(���@� �8�9�!@�" �!<�=�#@�$&�'M�N�%@�&,�-M�N�'@�(�+�,�)@�*'�(=�>�+@�,-�.G�H�-@�.'�(A�B�/@�0�7�8�1@�2!�"6�7�3@�4!�"I�J�5@�8	0�*��7@�@	2�*��?@�H	7�*��G@�N,�-E�F�O@�P0�1I�J�Q@�R,�-D�E�S@�T+�,C�D�U@�X	:���W@�^)�*M�N�_@�`-�.G�H�a@�b1�2K�L�c@�d%�&J�K�e@�f�2�3�g@�h�(�)�i@�j�/�0�k@�l�0�1�m@�n �!A�B�o@�p!�"=�>�q@�r$�%7�8�s@�t$�%E�F�u@�v6�7I�J�w@�x)�*?�@�y@�z/�0E�F�{@�|$�%=�>�}@�~�)�*�@�@/�0K�L�A@�B%�&9�>�J�C@�D!�"5�~�F�E@�H	1����G@�P,�_�=�Q@�R5�o�F�S@�T5�o�F�U@�X	C���W@�^,�_�=�_@�`3�O�D�a@�b�3�4�c@�d,�W�5�e@�f+�G�4�g@�h+�G�4�i@�j,�W�5�k@�l,�-@�A�m@�n7��@�o@�p,�W�5�q@�r0��9�s@�t0�1D�E�u@�v9�'�B�w@�x5�g�>�y@�z/�0G�H�{@�~	G���}@�D&��7�E@�F&�'8�9�G@�H�3�4�I@�L	-�1��K@�R!�"4�5�S@�T#�$9�:�U@�V(�)D�E�W@�Z0�1C�D�[@�`	,���
4�	
�(�
'�
�_@�p	8��:�&�D�D��o@�x	>��:�&�D�D��w@�@	O�+�-��@�J	=�8��I@�T	3� ��,��S@�\	H� ��,��[@�f	3��>�*�H�H��e@�n	3��.�/�M�M��m@�x	'��.�/�M�M��w@�B	'��)�	
�
'�
'�	�A@�P	<� ��+��O@�Z	'����
�	
�$�*�)�Y@�J!�"<�=�K@�L-�.F�G�M@�N'�(@�A�O@�P&�'?�@�Q@�R3�4L�M�S@�V	E� ��U@�`	<��>�*�H�H��_@�h	6��>�*�H�H��g@�p	5��>�*�H�H��o@�x	B��>�*�H�H��w@�@	Q��>�*�H�H��@�L1�2J�K�M@�N+�,D�E�O@�T	@��>�*�H�H��S@�\	:��>�*�H�H��[@�h/�0H�I�i@�j)�*B�C�k@�p	>��>�*�H�H��o@�x	8��>�*�H�H��w@�~�7�8�@��B�'�(r2
¿Qué es la limpieza dental de perros? - Clínica veterinaria


Es la eliminación del sarro y la placa adherida a la superficie de los dientes mediante un equipo de ultrasonidos que garantiza la integridad de las piezas dentales a la vez que elimina en profundidad cualquier resto de suciedad.

A continuación se procede al pulido de los dientes mediante una fresa especial que elimina la placa bacteriana y devuelve a los dientes el aspecto sano que deben tener.

Una vez terminado todo el proceso, se mantiene al perro en observación hasta que se despierta de la anestesia, bajo la atenta supervisión de un veterinario.

¿Cada cuánto tiempo tengo que hacerle una limpieza dental a mi perro?

A partir de cierta edad, los perros pueden necesitar una limpieza dental anual o bianual. Depende de cada caso. En líneas generales, puede decirse que los perros de razas pequeñas suelen acumular más sarro y suelen necesitar una atención mayor en cuanto a higiene dental.


Riesgos de una mala higiene


Los riesgos más evidentes de una mala higiene dental en los perros son los siguientes:

  • Cuando la acumulación de sarro no se trata, se puede producir una inflamación y retracción de las encías que puede descalzar el diente y provocar caídas.
  • Mal aliento (halitosis).
  • Sarro perros
  • Puede ir a más
  • Las bacterias de la placa pueden trasladarse a través del torrente circulatorio a órganos vitales como el corazón ocasionando problemas de endocarditis en las válvulas. Las bacterias pueden incluso acantonarse en huesos (La osteomielitis es la infección ósea, tanto cortical como medular) provocando mucho dolor y una artritis séptica).

¿Cómo se forma el sarro?

El sarro es la calcificación de la placa dental. Los restos de alimentos, junto con las bacterias presentes en la boca, van a formar la placa bacteriana o placa dental. Si la placa no se retira, al mezclarse con la saliva y los minerales presentes en ella, reaccionará formando una costra. La placa se calcifica y se forma el sarro.

El sarro, cuando se forma, es de color blanquecino pero a medida que pasa el tiempo se va poniendo amarillo y luego marrón.

Síntomas de una pobre higiene dental
La señal más obvia de una mala salud dental canina es el mal aliento.

Sin embargo, a veces no es tan fácil de detectar
Y hay perros que no se dejan abrir la boca por su dueño. Por ejemplo…

Recientemente nos trajeron a la clínica a un perro que parpadeaba de un ojo y decía su dueño que le picaba un lado de la cara. Tenía molestias y dificultad para comer, lo que había llevado a sus dueños a comprarle comida blanda (que suele ser un poco más cara y llevar más contenido en grasa) durante medio año. Después de una exploración oftalmológica, nos dimos cuenta de que el ojo tenía una úlcera en la córnea probablemente de rascarse . Además, el canto lateral del ojo estaba inflamado. Tenía lo que en humanos llamamos flemón pero como era un perro de pelo largo, no se le notaba a simple vista. Al abrirle la boca nos llamó la atención el ver una muela llena de sarro. Le realizamos una radiografía y encontramos una fístula que llegaba hasta la parte inferior del ojo.

Le tuvimos que extraer la muela. Tras esto, el ojo se curó completamente con unos colirios y una lentilla protectora de úlcera. Afortunadamente, la úlcera no profundizó y no perforó el ojo. Ahora el perro come perfectamente a pesar de haber perdido una muela.

¿Cómo mantener la higiene dental de tu perro?
Hay varias maneras de prevenir problemas derivados de la salud dental de tu perro.

Limpiezas de dientes en casa
Es recomendable limpiar los dientes de tu perro semanal o diariamente si se puede. Existe una gran variedad de productos que se pueden utilizar:

Pastas de dientes.
Cepillos de dientes o dedales para el dedo índice, que hacen más fácil la limpieza.
Colutorios para echar en agua de bebida o directamente sobre el diente en líquido o en spray.

En la Clínica Tus Veterinarios enseñamos a nuestros clientes a tomar el hábito de limpiar los dientes de sus perros desde que son cachorros. Esto responde a nuestro compromiso con la prevención de enfermedades caninas.

Hoy en día tenemos muchos clientes que limpian los dientes todos los días a su mascota, y como resultado, se ahorran el dinero de hacer limpiezas dentales profesionales y consiguen una mejor salud de su perro.


Limpiezas dentales profesionales de perros y gatos

Recomendamos hacer una limpieza dental especializada anualmente. La realizamos con un aparato de ultrasonidos que utiliza agua para quitar el sarro. Después, procedemos a pulir los dientes con un cepillo de alta velocidad y una pasta especial. Hacemos esto para proteger el esmalte.

La frecuencia de limpiezas dentales necesaria varía mucho entre razas. En general, las razas grandes tienen buena calidad de esmalte, por lo que no necesitan hacerlo tan a menudo e incluso pueden pasarse la vida sin requerir una limpieza. Sin embargo, razas pequeñas como el Yorkshire o el Maltés, deben hacérselas todos los años desde cachorros si se quiere conservar sus piezas dentales.

Otro factor fundamental es la calidad del pienso. Algunas marcas han diseñado croquetas que limpian la superficie del diente y de la muela al masticarse.

Ultrasonido para perros

¿Se necesita anestesia para las limpiezas dentales de perros y gatos?

La limpieza dental en perros no es una técnica que pueda practicarse sin anestesia general , aunque hay veces que los propietarios no quieren anestesiar y si tiene poco sarro y el perro es muy bueno se puede intentar…… , pero no se va a poder pulir ni acceder a todas la zona de la boca …. Además los limpiadores dentales van a irrigar agua y hay riesgo de aspiración a vías respiratorias si no se realiza una anestesia correcta con intubación traqueal . En resumen , sin anestesia no se va hacer una correcta limpieza dental.

Tampoco sirve la sedación ya que necesitamos que el animal esté totalmente quieto, y el veterinario tenga un acceso completo a todas sus piezas dentales y encías.

Alimentos para la limpieza dental

Hay que tener cierto cuidado a la hora de comprar determinados alimentos porque no todos son saludables. Algunos tienen demasiado contenido graso, que en exceso puede causar problemas cardiovasculares y obesidad.

Los mejores alimentos para los dientes son aquellos que están elaborados por empresas farmacéuticas y llevan componentes químicos con tratamientos específicos para el diente del perro. Esto implica no solo limpieza a través de la acción mecánica de morder sino también un tratamiento antibacteriano para prevenir el sarro.

Conclusión

Si eres como la mayoría de dueños, por falta de tiempo , es probable que no estés prestando la suficiente atención a la limpieza dental de tu perro. Por eso te animamos a que comiences a limpiar los dientes de tu perro y consideres atender a su higiene bucal con frecuencia.

Estas simples medidas pueden conllevar a que tu perro tenga una vida más larga y mucho más saludable.

Si te resulta imposible introducir un cepillo de dientes a tu perro en la boca, pásate con él por clínica Tus Veterinarios y te explicamos cómo hacerlo.

Necesitas hacer una limpieza dental profesional a tu mascota?
Llámanos al 622575274 o contacta con nosotros

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¡Hola!