Ë
    Ü_Ëiv§  ã                  ó®  — U d Z ddlmZ ddlZddlZddlZddlZddlZddl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 ddlmZ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$ dd	l%m&Z& dd
l'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ejr                  ejt                  ejv                  ejx                  ejz                  ej|                  dœZ? G d„ d«      Z@ G d„ d«      ZAe
reeeBef      ZCneZCdZD G d„ deC«      ZE eEeAjŒ                  ¬«      ZGdeHd<   	  eEeAj’                  ¬«      ZJdeHd<   	  eEeAj–                  ¬«      ZLdeHd<   	 eLZMdeHd<   	 dvd „ZNdwd!„ZOeMfdxd"„ZPeMf	 	 	 	 	 dyd#„ZQeMfdzd$„ZRd{d%„ZSd|d&„ZTd}d'„ZUd|d(„ZVd|d)„ZW	 	 	 	 	 	 d~d*„ZXdd+„ZYd€d,„ZZd�d-„Z[d‚d.„Z\d{d/„Z]d{d0„Z^dƒd1„Z_d„d2„Z`d…d3„Zad†d4„Zbd‡d5„Zcdˆd6„Zdd|d7„Zed‰d8„Zfi d9eY“d:e]“d;eX“d<eS“d=ec“d>ed“d?ee“d@e[“dAeT“dBdC„ “dDe`“dEef“dFeb“dGe^“dHe\“dIeZ“dJe_“dKeai¥ZgdLeHdM<    eheg«      ZidŠdN„Zjd‹dO„ZkdŒdP„Zld�dQ„ZmdŽdR„Znd‹dS„Zod�dT„Zpd�dU„Zqd‘dV„Zrd’dW„Zsd“dX„Ztd”dY„Zud•dZ„Zvd–d[„Zwd–d\„Zxd—d]„Zyd˜d^„Zzd˜d_„Z{i e|en“e}es“ej                  er“e"ek“e~eq“eep“eBen“ e€d«      en“e�j                  eu“eet“e*em“eel“e&ey“e,e{“e.ez“e0ev“e2eo“e4eoe6ewe(exi¥Z‚d`eHda<   i ZƒdbeHdc<   e‚D ]  Z„ e…e„dd«      sŒe‚e„   eƒe„�j                  <   Œ!  e‡de„ e‚D «       «      ZˆeMfdxdf„Z‰d™dg„ZŠdšdh„Z‹d›di„ZŒdœdj„Z�e0dkedle*dle(dle6dme.dne,dniZŽdoeHdp<   eBeŠe}eŠej                  e‹e2eŒe&e�iZ�dqeHdr<   d�džds„Z�dŸdt„Z‘d du„Z’y)¡a\  Tools for using Python's :mod:`json` module with BSON documents.

This module provides two helper methods `dumps` and `loads` that wrap the
native :mod:`json` methods and provide explicit BSON conversion to and from
JSON. :class:`~bson.json_util.JSONOptions` provides a way to control how JSON
is emitted and parsed, with the default being the Relaxed Extended JSON format.
:mod:`~bson.json_util` can also generate Canonical or legacy `Extended JSON`_
when :const:`CANONICAL_JSON_OPTIONS` or :const:`LEGACY_JSON_OPTIONS` is
provided, respectively.

.. _Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md

Example usage (deserialization):

.. doctest::

   >>> from bson.json_util import loads
   >>> loads(
   ...     '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$scope": {}, "$code": "function x() { return 1; }"}}, {"bin": {"$type": "80", "$binary": "AQIDBA=="}}]'
   ... )
   [{'foo': [1, 2]}, {'bar': {'hello': 'world'}}, {'code': Code('function x() { return 1; }', {})}, {'bin': Binary(b'...', 128)}]

Example usage with :const:`RELAXED_JSON_OPTIONS` (the default):

.. doctest::

   >>> from bson import Binary, Code
   >>> from bson.json_util import dumps
   >>> dumps(
   ...     [
   ...         {"foo": [1, 2]},
   ...         {"bar": {"hello": "world"}},
   ...         {"code": Code("function x() { return 1; }")},
   ...         {"bin": Binary(b"")},
   ...     ]
   ... )
   '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]'

Example usage (with :const:`CANONICAL_JSON_OPTIONS`):

.. doctest::

   >>> from bson import Binary, Code
   >>> from bson.json_util import dumps, CANONICAL_JSON_OPTIONS
   >>> dumps(
   ...     [
   ...         {"foo": [1, 2]},
   ...         {"bar": {"hello": "world"}},
   ...         {"code": Code("function x() { return 1; }")},
   ...         {"bin": Binary(b"")},
   ...     ],
   ...     json_options=CANONICAL_JSON_OPTIONS,
   ... )
   '[{"foo": [{"$numberInt": "1"}, {"$numberInt": "2"}]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]'

Example usage (with :const:`LEGACY_JSON_OPTIONS`):

.. doctest::

   >>> from bson import Binary, Code
   >>> from bson.json_util import dumps, LEGACY_JSON_OPTIONS
   >>> dumps(
   ...     [
   ...         {"foo": [1, 2]},
   ...         {"bar": {"hello": "world"}},
   ...         {"code": Code("function x() { return 1; }", {})},
   ...         {"bin": Binary(b"")},
   ...     ],
   ...     json_options=LEGACY_JSON_OPTIONS,
   ... )
   '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]'

Alternatively, you can manually pass the `default` to :func:`json.dumps`.
It won't handle :class:`~bson.binary.Binary` and :class:`~bson.code.Code`
instances (as they are extended strings you can't provide custom defaults),
but it will be faster as there is less recursion.

.. note::
   If your application does not need the flexibility offered by
   :class:`JSONOptions` and spends a large amount of time in the `json_util`
   module, look to
   `python-bsonjs <https://pypi.python.org/pypi/python-bsonjs>`_ for a nice
   performance improvement. `python-bsonjs` is a fast BSON to MongoDB
   Extended JSON converter for Python built on top of
   `libbson <https://github.com/mongodb/libbson>`_. `python-bsonjs` works best
   with PyMongo when using :class:`~bson.raw_bson.RawBSONDocument`.
é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚCallableÚMappingÚMutableMappingÚOptionalÚSequenceÚTupleÚTypeÚUnionÚcast)ÚALL_UUID_SUBTYPESÚUUID_SUBTYPEÚBinaryÚUuidRepresentation)ÚCode)ÚCodecOptionsÚDatetimeConversion)Ú_MAX_UTC_MSÚEPOCH_AWAREÚ
DatetimeMSÚ_datetime_to_millisÚ_millis_to_datetime)ÚDBRef)Ú
Decimal128)ÚInt64)ÚMaxKey)ÚMinKey)ÚObjectId)ÚRegex)ÚRE_TYPE©Ú	Timestamp)Úutc)ÚiÚlÚmÚsÚuÚxc                  ó   — e Zd ZdZ	 dZ	 dZy)ÚDatetimeRepresentationr   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚLEGACYÚ
NUMBERLONGÚISO8601© ó    úQ/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/bson/json_util.pyr-   r-   ›   s$   „ Ø€Fðð €Jðð €Gð	r7   r-   c                  ó   — e Zd ZdZ	 dZ	 dZy)ÚJSONModer   r.   r/   N)r0   r1   r2   r3   ÚRELAXEDÚ	CANONICALr6   r7   r8   r:   r:   ¿   s$   „ Ø€Fðð €Gðð €Iðr7   r:   l        c                  ó°   ‡ — e Zd ZU ded<   ded<   ded<   ded<   ded<   dˆ fd	„Zd
d
d
ej                  f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdˆ fd„Zdd„Z	ˆ xZ
S )ÚJSONOptionsÚintÚ	json_modeÚboolÚstrict_number_longÚdatetime_representationÚstrict_uuidzType[MutableMapping[str, Any]]Údocument_classc                ó"   •— t         ‰| �  «        y)a/  Encapsulates JSON options for :func:`dumps` and :func:`loads`.

        :param strict_number_long: If ``True``, :class:`~bson.int64.Int64` objects
            are encoded to MongoDB Extended JSON's *Strict mode* type
            `NumberLong`, ie ``'{"$numberLong": "<number>" }'``. Otherwise they
            will be encoded as an `int`. Defaults to ``False``.
        :param datetime_representation: The representation to use when encoding
            instances of :class:`datetime.datetime`. Defaults to
            :const:`~DatetimeRepresentation.LEGACY`.
        :param strict_uuid: If ``True``, :class:`uuid.UUID` object are encoded to
            MongoDB Extended JSON's *Strict mode* type `Binary`. Otherwise it
            will be encoded as ``'{"$uuid": "<hex>" }'``. Defaults to ``False``.
        :param json_mode: The :class:`JSONMode` to use when encoding BSON types to
            Extended JSON. Defaults to :const:`~JSONMode.LEGACY`.
        :param document_class: BSON documents returned by :func:`loads` will be
            decoded to an instance of this class. Must be a subclass of
            :class:`collections.MutableMapping`. Defaults to :class:`dict`.
        :param uuid_representation: The :class:`~bson.binary.UuidRepresentation`
            to use when encoding and decoding instances of :class:`uuid.UUID`.
            Defaults to :const:`~bson.binary.UuidRepresentation.UNSPECIFIED`.
        :param tz_aware: If ``True``, MongoDB Extended JSON's *Strict mode* type
            `Date` will be decoded to timezone aware instances of
            :class:`datetime.datetime`. Otherwise they will be naive. Defaults
            to ``False``.
        :param tzinfo: A :class:`datetime.tzinfo` subclass that specifies the
            timezone from which :class:`~datetime.datetime` objects should be
            decoded. Defaults to :const:`~bson.tz_util.utc`.
        :param datetime_conversion: Specifies how UTC datetimes should be decoded
            within BSON. Valid options include 'datetime_ms' to return as a
            DatetimeMS, 'datetime' to return as a datetime.datetime and
            raising a ValueError for out-of-range values, 'datetime_auto' to
            return DatetimeMS objects when the underlying datetime is
            out-of-range and 'datetime_clamp' to clamp to the minimum and
            maximum possible datetimes. Defaults to 'datetime'. See
            `handling out of range datetimes <https://www.mongodb.com/docs/languages/python/pymongo-driver/current/data-formats/dates-and-times/#handling-out-of-range-datetimes>`_ for details.
        :param args: arguments to :class:`~bson.codec_options.CodecOptions`
        :param kwargs: arguments to :class:`~bson.codec_options.CodecOptions`

        .. seealso:: The specification for Relaxed and Canonical `Extended JSON`_.

        .. versionchanged:: 4.0
           The default for `json_mode` was changed from :const:`JSONMode.LEGACY`
           to :const:`JSONMode.RELAXED`.
           The default for `uuid_representation` was changed from
           :const:`~bson.binary.UuidRepresentation.PYTHON_LEGACY` to
           :const:`~bson.binary.UuidRepresentation.UNSPECIFIED`.

        .. versionchanged:: 3.5
           Accepts the optional parameter `json_mode`.

        .. versionchanged:: 4.0
           Changed default value of `tz_aware` to False.
        N)ÚsuperÚ__init__)ÚselfÚargsÚkwargsÚ	__class__s      €r8   rH   zJSONOptions.__init__ù   s   ø€ ôl 	‰ÑÕr7   Nc                ó$  •— |j                  dd«      |d<   |d   r|j                  dt        «      |d<   |t        j                  t        j                  t        j
                  d fvrt        d«      ‚t        t        t        ‰| �(  | g|¢­i |¤Ž«      }|t        j                  t        j                  t        j                  fvrt        d«      ‚||_        |j                  t        j                  k(  r`|rt        d«      ‚|d t        j
                  fvrt        d«      ‚|dvrt        d	«      ‚d|_        t        j
                  |_        d
|_        |S |j                  t        j                  k(  rb|dvrt        d«      ‚|d t        j                  fvrt        d«      ‚|dvrt        d	«      ‚d
|_        t        j                  |_        d
|_        |S d|_        t        j                  |_        d|_        |�||_        |�||_        |�||_        |S )NÚtz_awareFÚtzinfoznJSONOptions.datetime_representation must be one of LEGACY, NUMBERLONG, or ISO8601 from DatetimeRepresentation.zQJSONOptions.json_mode must be one of LEGACY, RELAXED, or CANONICAL from JSONMode.z<Cannot specify strict_number_long=True with JSONMode.RELAXEDz_datetime_representation must be DatetimeRepresentation.ISO8601 or omitted with JSONMode.RELAXED)NTz6Cannot specify strict_uuid=False with JSONMode.RELAXEDTz=Cannot specify strict_number_long=False with JSONMode.RELAXEDzbdatetime_representation must be DatetimeRepresentation.NUMBERLONG or omitted with JSONMode.RELAXED)Úgetr%   r-   r3   r4   r5   Ú
ValueErrorr   r>   rG   Ú__new__r:   r;   r<   r@   rB   rC   rD   )	ÚclsrB   rC   rD   r@   rJ   rK   rI   rL   s	           €r8   rR   zJSONOptions.__new__1  s-  ø€ ð $ŸZ™Z¨
°EÓ:ˆˆzÑØ�*ÒØ%Ÿz™z¨(´CÓ8ˆF�8ÑØ"Ü"×)Ñ)Ü"×-Ñ-Ü"×*Ñ*Øð	+
ñ 
ô ðFóð ô ”K¤¡¡°Ð!F°tÒ!F¸vÑ!FÓGˆØœXŸ_™_¬h×.>Ñ.>Ä×@RÑ@RÐSÑSÜð.óð ð #ˆŒØ�>‰>œX×-Ñ-Ò-Ù!Ü Ð!_Ó`Ð`Ø&¨tÔ5K×5SÑ5SÐ.TÑTÜ ð?óð ð  ,Ñ.Ü Ð!YÓZÐZØ&+ˆDÔ#Ü+A×+IÑ+IˆDÔ(Ø#ˆDÔð0 ˆð/ �^‰^œx×1Ñ1Ò1Ø!¨Ñ5Ü Ð!`ÓaÐaØ&¨tÔ5K×5VÑ5VÐ.WÑWÜ ðBóð ð  ,Ñ.Ü Ð!YÓZÐZØ&*ˆDÔ#Ü+A×+LÑ+LˆDÔ(Ø#ˆDÔð ˆð ',ˆDÔ#Ü+A×+HÑ+HˆDÔ(Ø$ˆDÔØ!Ð-Ø*<�Ô'Ø&Ð2Ø/F�Ô,ØÐ&Ø#.�Ô Øˆr7   c           	     ó–   •— dj                  | j                  | j                  | j                  | j                  t
        ‰| �  «       «      S )Nz[strict_number_long={!r}, datetime_representation={!r}, strict_uuid={!r}, json_mode={!r}, {})ÚformatrB   rC   rD   r@   rG   Ú_arguments_repr)rI   rL   s    €r8   rV   zJSONOptions._arguments_reprt  sD   ø€ ð3ç39±6Ø×'Ñ'Ø×,Ñ,Ø× Ñ Ø—‘Ü‘Ñ'Ó)ó4ð
	
r7   c                ó¦   — | j                  «       }dD ]!  }|j                  |t        | |«      «      ||<   Œ# |j                  |«       t	        di |¤ŽS )aˆ  
        Make a copy of this JSONOptions, overriding some options::

            >>> from bson.json_util import CANONICAL_JSON_OPTIONS
            >>> CANONICAL_JSON_OPTIONS.tz_aware
            True
            >>> json_options = CANONICAL_JSON_OPTIONS.with_options(tz_aware=False, tzinfo=None)
            >>> json_options.tz_aware
            False

        .. versionadded:: 3.12
        )rB   rC   rD   r@   r6   )Ú_asdictrP   ÚgetattrÚupdater>   )rI   rK   ÚoptsÚopts       r8   Úwith_optionszJSONOptions.with_options�  sS   € ð �|‰|‹~ˆØ`ò 	<ˆCØŸ
™
 3¬°°cÓ(:Ó;ˆD�ŠIð	<à�‰�FÔÜÑ"˜TÑ"Ð"r7   )rJ   r   rK   r   )rS   zType[JSONOptions]rB   úOptional[bool]rC   zOptional[int]rD   r^   r@   r?   rJ   r   rK   r   Úreturnr>   )r_   Ústr)rK   r   r_   r>   )r0   r1   r2   Ú__annotations__rH   r:   r;   rR   rV   r]   Ú__classcell__)rL   s   @r8   r>   r>   ò   sŸ   ø… ØƒNØÓØ Ó ØÓØ2Ó2õ6ðt .2Ø15Ø&*Ø!×)Ñ)ðAØðAà*ðAð "/ðAð $ð	Að
 ðAð ðAð ðAð 
õAõF
÷#r7   r>   )r@   ÚLEGACY_JSON_OPTIONSÚCANONICAL_JSON_OPTIONSÚRELAXED_JSON_OPTIONSÚDEFAULT_JSON_OPTIONSc                ót   — |j                  dt        «      }t        j                  t	        | |«      g|¢­i |¤ŽS )aQ  Helper function that wraps :func:`json.dumps`.

    Recursive function that handles all BSON types including
    :class:`~bson.binary.Binary` and :class:`~bson.code.Code`.

    :param json_options: A :class:`JSONOptions` instance used to modify the
        encoding of MongoDB Extended JSON types. Defaults to
        :const:`DEFAULT_JSON_OPTIONS`.

    .. versionchanged:: 4.0
       Now outputs MongoDB Relaxed Extended JSON by default (using
       :const:`DEFAULT_JSON_OPTIONS`).

    .. versionchanged:: 3.4
       Accepts optional parameter `json_options`. See :class:`JSONOptions`.
    Újson_options)Úpoprf   ÚjsonÚdumpsÚ_json_convert)ÚobjrJ   rK   rh   s       r8   rk   rk   º  s5   € ð" —:‘:˜nÔ.BÓC€LÜ�:‰:”m C¨Ó6ÐH¸ÒHÀÑHÐHr7   c                ó¨   ‡— |j                  dt        «      Š‰j                  t        u r	ˆfd„|d<   nˆfd„|d<   t	        j
                  | g|¢­i |¤ŽS )aþ  Helper function that wraps :func:`json.loads`.

    Automatically passes the object_hook for BSON type conversion.

    Raises ``TypeError``, ``ValueError``, ``KeyError``, or
    :exc:`~bson.errors.InvalidId` on invalid MongoDB Extended JSON.

    :param json_options: A :class:`JSONOptions` instance used to modify the
        decoding of MongoDB Extended JSON types. Defaults to
        :const:`DEFAULT_JSON_OPTIONS`.

    .. versionchanged:: 4.0
       Now loads :class:`datetime.datetime` instances as naive by default. To
       load timezone aware instances utilize the `json_options` parameter.
       See :ref:`tz_aware_default_change` for an example.

    .. versionchanged:: 3.5
       Parses Relaxed and Canonical Extended JSON as well as PyMongo's legacy
       format. Now raises ``TypeError`` or ``ValueError`` when parsing JSON
       type wrappers with values of the wrong type or any extra keys.

    .. versionchanged:: 3.4
       Accepts optional parameter `json_options`. See :class:`JSONOptions`.
    rh   c                ó   •— t        | ‰«      S ©N)Úobject_hook©rm   rh   s    €r8   ú<lambda>zloads.<locals>.<lambda>ë  s   ø€ ¬K¸¸\Ó,J€ r7   rq   c                ó   •— t        | ‰«      S rp   )Úobject_pairs_hook©Úpairsrh   s    €r8   rs   zloads.<locals>.<lambda>í  s   ø€ Ô4EÀeÈ\Ó4Z€ r7   ru   )ri   rf   rE   Údictrj   Úloads)r)   rJ   rK   rh   s      @r8   ry   ry   Ï  sR   ø€ ð2 —:‘:˜nÔ.BÓC€Là×"Ñ"¤dÑ*Û Jˆˆ}Òã&ZˆÐ"Ñ#Ü�:‰:�aÐ)˜$Ò) &Ñ)Ð)r7   c           	     ó@  — t        | d«      r.| j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}S t        | d«      r0t        | t        t
        f«      s| D �cg c]  }t        ||«      ‘Œ c}S 	 t        | |«      S c c}}w c c}w # t        $ r | cY S w xY w)z]Recursive helper method that converts BSON types so they can be
    converted into json.
    ÚitemsÚ__iter__)Úhasattrr{   rl   Ú
isinstancer`   ÚbytesÚdefaultÚ	TypeError)rm   rh   ÚkÚvs       r8   rl   rl   ñ  s•   € ô ˆs�GÔØ>A¿i¹i»k×J±d°a¸�”=  LÓ1Ñ1ÓJÐJÜ	��jÔ	!¬*°S¼3Ä¸,Ô*GØ8;Ö<°1”˜a Õ.Ò<Ð<ðÜ�s˜LÓ)Ð)ùó	 Kùâ<øô ò ØŠ
ðús    BÁ!B
Á8B ÂBÂBc                ó8   — t        |j                  | «      |«      S rp   )rq   rE   rv   s     r8   ru   ru   ÿ  s   € ô �|×2Ñ2°5Ó9¸<ÓHÐHr7   c                óR   — d }| D ]  }|t         v sŒ|} n |rt        |   | |«      S | S rp   )Ú_PARSERS_SETÚ_PARSERS)Údctrh   Úmatchr‚   s       r8   rq   rq     sA   € Ø€EØò ˆØ”ÒØˆEÙðñ Ü˜‰˜s LÓ1Ð1Ø€Jr7   c                ó¸   — | d   }t        |t        t        f«      s| S d}| j                  dd«      D ]  }|t        j                  |d«      z  }Œ t        ||«      S )Nú$regexr   ú$optionsÚ )r~   r`   r   rP   Ú_RE_OPT_TABLEr!   )ÚdocÚdummy0ÚpatternÚflagsr\   s        r8   Ú_parse_legacy_regexr“     sa   € Ø�(‰m€Gä�g¤¤U˜|Ô,Øˆ
Ø€Eà�w‰w�z 2Ó&ò +ˆØ”×"Ñ" 3¨Ó*Ñ*‰ð+ä�˜%Ó Ð r7   c                ó<  — t        | «      dk7  rt        d| › �«      ‚t        | d   t        «      st        d| › �«      ‚|j                  t
        j                  k(  r+t        j                  t        j                  | d   «      «      S t        j                  | d   «      S )z*Decode a JSON legacy $uuid to Python UUID.r.   zBad $uuid, extra field(s): ú$uuidz$uuid must be a string: )Úlenr�   r~   r`   Úuuid_representationr   ÚUNSPECIFIEDr   Ú	from_uuidÚuuidÚUUID©r�   rh   s     r8   Ú_parse_legacy_uuidr�     s‡   € ä
ˆ3ƒx�1‚}ÜÐ5°c°UÐ;Ó<Ð<Ü�c˜'‘l¤CÔ(ÜÐ2°3°%Ð8Ó9Ð9Ø×'Ñ'Ô+=×+IÑ+IÒIÜ×Ñ¤§	¡	¨#¨g©,Ó 7Ó8Ð8ä�y‰y˜˜W™Ó&Ð&r7   c                ó^  — |t         v r{|j                  }t        | |«      }|t        j                  k(  r|S |t
        k(  rt        j                  }n#|t        j                  k(  rt        j                  }|j                  |«      S |dk(  rt        t        j                  | «      S t        | |«      S ©Nr   )r   r—   r   r   r˜   r   ÚSTANDARDÚPYTHON_LEGACYÚas_uuidr   rš   r›   )ÚdataÚsubtyperh   r—   Úbinary_values        r8   Ú_binary_or_uuidr¦   (  s    € àÔ#Ñ#Ø*×>Ñ>ÐÜ˜d GÓ,ˆØÔ"4×"@Ñ"@Ò@ØÐØ”lÒ"ä"4×"=Ñ"=ÑØ Ô$6×$?Ñ$?Ò?ô #5×"BÑ"BÐØ×#Ñ#Ð$7Ó8Ð8à�!‚|Ü”D—I‘I˜tÓ$Ð$Ü�$˜Ó Ð r7   c                óð   — t        | d   t        «      rd| d   z  | d<   t        | d   d«      }|dk\  rt        | d   dd  d«      }t        j                  | d   j	                  «       «      }t        |||«      S )Nú$typeú%02xé   l   €ÿ é   ú$binary)r~   r?   Úbase64Ú	b64decodeÚencoder¦   )r�   rh   r¤   r£   s       r8   Ú_parse_legacy_binaryr°   =  s}   € Ü�#�g‘,¤Ô$Ø  G¡Ñ,ˆˆG‰Ü�#�g‘, Ó#€GØ�*ÒÜ�c˜'‘l 1 2Ð&¨Ó+ˆÜ×Ñ˜C 	™N×1Ñ1Ó3Ó4€DÜ˜4 ¨,Ó7Ð7r7   c                ó`  — | d   }|d   }|d   }t        |t        «      st        d| › �«      ‚t        |t        «      rt        |«      dkD  rt        d| › �«      ‚t        |«      dk7  rt        d| › �«      ‚t	        j
                  |j                  «       «      }t        |t        |d«      |«      S )	Nr¬   r­   ÚsubTypez!$binary base64 must be a string: r/   z7$binary subType must be a string at most 2 characters: z=$binary must include only "base64" and "subType" components: rª   )	r~   r`   r�   r–   r­   r®   r¯   r¦   r?   )r�   rh   ÚbinaryÚb64r¤   r£   s         r8   Ú_parse_canonical_binaryrµ   G  s³   € Ø�‰^€FØ
�Ñ
€CØ�YÑ€GÜ�cœ3ÔÜÐ;¸C¸5ÐAÓBÐBÜ�gœsÔ#¤s¨7£|°aÒ'7ÜÐQÐRUÐQVÐWÓXÐXÜ
ˆ6ƒ{�aÒÜÐWÐX[ÐW\Ð]Ó^Ð^ä×Ñ˜CŸJ™J›LÓ)€DÜ˜4¤ W¨bÓ!1°<Ó@Ð@r7   c                ó  — | d   }t        | «      dk7  rt        d| › �«      ‚t        |t        «      �r	 |d   dk(  r|dd }d}nB|d   dv r|d	   d
k(  r|dd }|dd }n(|d   dv r|dd }|dd }n|d	   dv r|dd	 }|d	d }n|}d}|j                  d«      }d}|dk7  rt        t        ||d «      dz  «      }|d| }t        j                  j                  |d«      j                  |t        ¬«      }|r¿|dk7  rºt        |«      dk(  r5|dd j                  d
«      \  }	}
t        |	«      dz  t        |
«      dz  z   }nQt        |«      dk(  r$t        |dd «      dz  t        |dd «      dz  z   }nt        |«      dk(  rt        |dd «      dz  }|d   dk(  rdz  }|t        j                  ¬«      z
  }|j                  rQ|j                   r|j#                  |j                   «      }|j$                  t&        j(                  k(  rt+        |«      S |S |j                  d¬«      }|j$                  t&        j(                  k(  rt+        |«      S |S t-        t        |«      t/        d|«      «      S # t        $ r}t        d|›d�«      |‚d}~ww xY w)z3Decode a JSON datetime to python datetime.datetime.ú$dater.   zBad $date, extra field(s): éÿÿÿÿÚZNiúÿÿÿ)ú+ú-éýÿÿÿú:éûÿÿÿr�   z
time data z( does not match ISO-8601 datetime formatú.r   i@B ú%Y-%m-%dT%H:%M:%S)ÚmicrosecondrO   r«   i  é<   é   é   r»   )Úseconds©rO   zCodecOptions[Any])r–   r�   r~   r`   Ú
IndexErrorrQ   Úrfindr?   ÚfloatÚdatetimeÚstrptimeÚreplacer%   ÚsplitÚ	timedeltarN   rO   Ú
astimezoneÚdatetime_conversionr   ÚDATETIME_MSr   r   r   )r�   rh   ÚdtmÚdtÚoffsetÚexcÚ	dot_indexrÁ   ÚawareÚhoursÚminutesÚsecsÚaware_tzinfo_nones                r8   Ú_parse_canonical_datetimerÜ   V  s×  € ð ˆg‰,€CÜ
ˆ3ƒx�1‚}ÜÐ5°c°UÐ;Ó<Ð<ä�#”sÕð	dà�2‰w˜#Š~Ø˜˜"�X�Ø‘Ø�R‘˜JÑ&¨3¨r©7°cª>à˜˜"�X�Ø˜R˜S˜‘Ø�R‘˜JÑ&à˜˜"�X�Ø˜R˜S˜‘Ø�R‘˜JÑ&à˜˜"�X�Ø˜R˜S˜‘à�Ø�ð
 —H‘H˜S“Mˆ	ØˆØ˜Š?Üœe B y z NÓ3°gÑ=Ó>ˆKØ�J�Y�ˆBä×!Ñ!×*Ñ*¨2Ð/BÓC×KÑKØ#¬Cð Ló 
ˆñ �f ’mÜ�6‹{˜aÒØ!'¨¨ ×!1Ñ!1°#Ó!6‘��wÜ˜5“z DÑ(¬3¨w«<¸"Ñ+<Ñ<‘Ü�V“ Ò!Ü˜6 ! A˜;Ó'¨$Ñ.´°V¸A¸B°Z³À2Ñ1EÑE‘Ü�V“ Ò!Ü˜6 ! A˜;Ó'¨$Ñ.�Ø�a‰y˜CÒØ˜‘
�ØœH×.Ñ.°tÔ<Ñ<ˆEà× Ò Ø×"Ò"Ø×(Ñ(¨×)<Ñ)<Ó=�Ø×/Ñ/Ô3E×3QÑ3QÒQÜ! %Ó(Ð(ØˆLà %§¡°T Ó :ÐØ×/Ñ/Ô3E×3QÑ3QÒQÜ!Ð"3Ó4Ð4Ø$Ð$Üœs 3›x¬Ð.AÀ<Ó)PÓQÐQøôK ò 	dÜ˜z¨#¨Ð0XÐYÓZÐ`cÐcûð	dús   ´AI+ É+	J	É4JÊJ	c                óV   — t        | «      dk7  rt        d| › �«      ‚t        | d   «      S )z1Decode a JSON ObjectId to bson.objectid.ObjectId.r.   zBad $oid, extra field(s): ú$oid)r–   r�   r    ©r�   r�   s     r8   Ú_parse_canonical_oidrà   ›  s/   € ä
ˆ3ƒx�1‚}ÜÐ4°S°EÐ:Ó;Ð;Ü�C˜‘KÓ Ð r7   c                óZ   — | d   }t        | «      dk7  rt        d| › �«      ‚t        |«      S )z&Decode a JSON symbol to Python string.ú$symbolr.   zBad $symbol, extra field(s): )r–   r�   r`   )r�   r�   Úsymbols      r8   Ú_parse_canonical_symbolrä   ¢  s3   € à�‰^€FÜ
ˆ3ƒx�1‚}ÜÐ7¸°uÐ=Ó>Ð>Üˆv‹;Ðr7   c                ór   — | D ]  }|dvsŒt        d| › �«      ‚ t        | d   | j                  d«      ¬«      S )z%Decode a JSON code to bson.code.Code.©ú$codeú$scopezBad $code, extra field(s): rç   rè   )Úscope)r�   r   rP   )r�   r�   Úkeys      r8   Ú_parse_canonical_coderë   ª  sK   € àò AˆØÐ)Ò)ÜÐ9¸#¸Ð?Ó@Ð@ðAô ��G‘ C§G¡G¨HÓ$5Ô6Ð6r7   c                óò   — | d   }t        | «      dk7  rt        d| › �«      ‚t        |«      dk7  rt        d| › �«      ‚|d   }t        |t        «      st        dt	        |«      z  «      ‚t        |d   |«      S )	z(Decode a JSON regex to bson.regex.Regex.ú$regularExpressionr.   z(Bad $regularExpression, extra field(s): r/   zLBad $regularExpression must include only "pattern and "options" components: ÚoptionszCBad $regularExpression options, options must be string, was type %sr‘   )r–   r�   r~   r`   Útyper!   )r�   r�   Úregexr[   s       r8   Ú_parse_canonical_regexrñ   ²  s•   € àÐ$Ñ%€EÜ
ˆ3ƒx�1‚}ÜÐBÀ3À%ÐHÓIÐIÜ
ˆ5ƒz�Q‚ÜØZÐ[^ÐZ_Ð`ó
ð 	
ð �Ñ€DÜ�dœCÔ ÜØQÔUYÐZ^ÓU_Ñ`ó
ð 	
ô ��yÑ! 4Ó(Ð(r7   c                ó  — t        | j                  d«      t        «      rkd| v rgt        | j                  d«      t        t        d«      f«      r=t	        | j                  d«      | j                  d«      fd| j                  dd«      i| ¤ŽS | S )z(Decode a JSON DBRef to bson.dbref.DBRef.ú$refz$idz$dbNÚdatabase)r~   rP   r`   rï   r   ri   rß   s     r8   Ú_parse_canonical_dbrefrõ   Ã  sp   € ô 	�3—7‘7˜6“?¤CÔ(Ø�S‰LÜ�s—w‘w˜u“~¬¬T°$«ZÐ'8Ô9ä�S—W‘W˜V“_ c§g¡g¨e£nÑ[¸s¿w¹wÀuÈdÓ?SÐ[ÐWZÑ[Ð[Ø€Jr7   c                ó`  — | d   }t        | «      dk7  rt        d| › �«      ‚t        |t        «      rp|j	                  «       }|j
                  �t        d|› �«      ‚t        |j                  t        «      st        d|› �«      ‚t        |«      dk7  rt        d|› �«      ‚|S t        d| › �«      ‚)	z9Decode a JSON (deprecated) DBPointer to bson.dbref.DBRef.ú
$dbPointerr.   z Bad $dbPointer, extra field(s): z!Bad $dbPointer, extra field $db: z)Bad $dbPointer, $id must be an ObjectId: r/   z)Bad $dbPointer, extra field(s) in DBRef: z"Bad $dbPointer, expected a DBRef: )r–   r�   r~   r   Úas_docrô   Úidr    )r�   r�   ÚdbrefÚ	dbref_docs       r8   Ú_parse_canonical_dbpointerrü   Î  s´   € à�Ñ€EÜ
ˆ3ƒx�1‚}ÜÐ:¸3¸%Ð@ÓAÐAÜ�%œÔØ—L‘L“Nˆ	à�>‰>Ð%ÜÐ?À	¸{ÐKÓLÐLÜ˜%Ÿ(™(¤HÔ-ÜÐGÈ	À{ÐSÓTÐTÜˆy‹>˜QÒÜÐGÈ	À{ÐSÓTÐTØˆäÐ<¸S¸EÐBÓCÐCr7   c                ó–   — | d   }t        | «      dk7  rt        d| › �«      ‚t        |t        «      st        d| › �«      ‚t	        |«      S )z"Decode a JSON int32 to python int.ú
$numberIntr.   z Bad $numberInt, extra field(s): z$numberInt must be string: )r–   r�   r~   r`   r?   )r�   r�   Úi_strs      r8   Ú_parse_canonical_int32r   á  sQ   € à�Ñ€EÜ
ˆ3ƒx�1‚}ÜÐ:¸3¸%Ð@ÓAÐAÜ�eœSÔ!ÜÐ5°c°UÐ;Ó<Ð<Üˆu‹:Ðr7   c                óZ   — | d   }t        | «      dk7  rt        d| › �«      ‚t        |«      S )z(Decode a JSON int64 to bson.int64.Int64.ú$numberLongr.   z!Bad $numberLong, extra field(s): )r–   r�   r   )r�   r�   Úl_strs      r8   Ú_parse_canonical_int64r  ë  s4   € à�Ñ€EÜ
ˆ3ƒx�1‚}ÜÐ;¸C¸5ÐAÓBÐBÜ�‹<Ðr7   c                ó–   — | d   }t        | «      dk7  rt        d| › �«      ‚t        |t        «      st        d| › �«      ‚t	        |«      S )z%Decode a JSON double to python float.ú$numberDoubler.   z#Bad $numberDouble, extra field(s): z$numberDouble must be string: )r–   r�   r~   r`   rÉ   ©r�   r�   Úd_strs      r8   Ú_parse_canonical_doubler	  ó  sQ   € à�Ñ €EÜ
ˆ3ƒx�1‚}ÜÐ=¸c¸UÐCÓDÐDÜ�eœSÔ!ÜÐ8¸¸Ð>Ó?Ð?Ü�‹<Ðr7   c                ó–   — | d   }t        | «      dk7  rt        d| › �«      ‚t        |t        «      st        d| › �«      ‚t	        |«      S )z7Decode a JSON decimal128 to bson.decimal128.Decimal128.ú$numberDecimalr.   z$Bad $numberDecimal, extra field(s): z$numberDecimal must be string: )r–   r�   r~   r`   r   r  s      r8   Ú_parse_canonical_decimal128r  ý  sS   € àÐ Ñ!€EÜ
ˆ3ƒx�1‚}ÜÐ>¸s¸eÐDÓEÐEÜ�eœSÔ!ÜÐ9¸#¸Ð?Ó@Ð@Ü�eÓÐr7   c                ó¢   — t        | d   «      t        us| d   dk7  rt        d| › �«      ‚t        | «      dk7  rt        d| › �«      ‚t	        «       S )z,Decode a JSON MinKey to bson.min_key.MinKey.ú$minKeyr.   z$minKey value must be 1: úBad $minKey, extra field(s): )rï   r?   r�   r–   r   rß   s     r8   Ú_parse_canonical_minkeyr    sV   € äˆC�	‰NÓ¤3Ñ&¨#¨i©.¸AÒ*=ÜÐ3°C°5Ð9Ó:Ð:Ü
ˆ3ƒx�1‚}ÜÐ7¸°uÐ=Ó>Ð>Ü‹8€Or7   c                ó    — t        | d   «      t        us| d   dk7  rt        d| f«      ‚t        | «      dk7  rt        d| › �«      ‚t	        «       S )z,Decode a JSON MaxKey to bson.max_key.MaxKey.ú$maxKeyr.   z$maxKey value must be 1: %sr  )rï   r?   r�   r–   r   rß   s     r8   Ú_parse_canonical_maxkeyr    sS   € äˆC�	‰NÓ¤3Ñ&¨#¨i©.¸AÒ*=ÜÐ5¸°vÓ>Ð>Ü
ˆ3ƒx�1‚}ÜÐ7¸°uÐ=Ó>Ð>Ü‹8€Or7   c                ó:   — d| v rt        | |«      S t        | |«      S )Nr¨   )r°   rµ   rœ   s     r8   Ú_parse_binaryr    s#   € Ø�#�~Ü# C¨Ó6Ð6ä& s¨LÓ9Ð9r7   c                ó0   — | d   }t        |d   |d   «      S )Nú
$timestampÚtr&   r#   )r�   r�   Útsps      r8   Ú_parse_timestampr     s!   € Ø
ˆlÑ
€CÜ�S˜‘X˜s 3™xÓ(Ð(r7   rÞ   ró   r·   r‹   r  r  r¬   rç   r•   z
$undefinedc                 ó   — y rp   r6   )Ú_Ú_1s     r8   rs   rs   /  s   � r7   r  r  r  r÷   rí   râ   rþ   r  z,dict[str, Callable[[Any, JSONOptions], Any]]r‡   c                óä   — |j                   t        j                  k(  r)t        j                  | «      j                  «       d|z  dœS dt        j                  | «      j                  «       d|z  dœiS )Nr©   )r¬   r¨   r¬   )r­   r²   )r@   r:   r3   r­   Ú	b64encodeÚdecode)r£   r¤   rh   s      r8   Ú_encode_binaryr!  <  sb   € Ø×Ñ¤§¡Ò0Ü!×+Ñ+¨DÓ1×8Ñ8Ó:ÀVÈgÑEUÑVÐVØ¤&×"2Ñ"2°4Ó"8×"?Ñ"?Ó"AÈfÐW^ÑN^Ñ_Ð`Ð`r7   c                ó*  — |j                   t        j                  k(  r5dt        | «      cxk  r	t        k  rn nt        | j                  «       |«      S |j                   t        j                  k(  rdt        | «      iS ddt        t        | «      «      iiS )Nr   r·   r  )	rC   r-   r5   r?   r   Ú_encode_datetimeÚas_datetimer3   r`   rr   s     r8   Ú_encode_datetimemsr%  B  sx   € à×,Ñ,Ô0F×0NÑ0NÒNØ”�S“Ô(œ[Õ(ä §¡Ó 1°<Ó@Ð@Ø	×	-Ñ	-Ô1G×1NÑ1NÒ	NØœ˜S›Ð"Ð"Ø�m¤S¬¨S«£]Ð3Ð4Ð4r7   c                óx   — | j                   €dt        | «      iS t        | «      t        | j                   |«      dœS )Nrç   ræ   )ré   r`   rl   rr   s     r8   Ú_encode_coder'  M  s5   € Ø
‡y�yÐØœ˜S›Ð"Ð"ä˜S›¬]¸3¿9¹9ÀlÓ-SÑTÐTr7   c                óJ   — |j                   rdt        | «      iS t        | «      S )Nr  )rB   r`   r?   rr   s     r8   Ú_encode_int64r)  T  s#   € Ø×&Ò&Øœs 3›xÐ(Ð(ä�3‹xˆr7   c                ó   — | S rp   r6   ©rm   r�   s     r8   Ú_encode_noopr,  [  s   € Ø€Jr7   c                ót  — d}| j                   t        j                  z  r|dz  }| j                   t        j                  z  r|dz  }| j                   t        j                  z  r|dz  }| j                   t        j
                  z  r|dz  }| j                   t        j                  z  r|dz  }| j                   t        j                  z  r|dz  }t        | j                  t        «      r| j                  }n| j                  j                  d«      }|j                  t        j                  k(  r||d	œS d
||dœiS )Nr�   r&   r'   r(   r)   r*   r+   zutf-8)r‹   rŒ   rí   )r‘   rî   )r’   ÚreÚ
IGNORECASEÚLOCALEÚ	MULTILINEÚDOTALLÚUNICODEÚVERBOSEr~   r‘   r`   r   r@   r:   r3   )rm   rh   r’   r‘   s       r8   Ú_encode_regexr5  _  sõ   € Ø€EØ
‡y�y”2—=‘=Ò Ø�‰ˆØ
‡y�y”2—9‘9ÒØ�‰ˆØ
‡y�y”2—<‘<ÒØ�‰ˆØ
‡y�y”2—9‘9ÒØ�‰ˆØ
‡y�y”2—:‘:ÒØ�‰ˆØ
‡y�y”2—:‘:ÒØ�‰ˆÜ�#—+‘+œsÔ#Ø—+‘+‰à—+‘+×$Ñ$ WÓ-ˆØ×Ñ¤§¡Ò0Ø!¨uÑ5Ð5Ø ¨gÀ%Ñ"HÐIÐIr7   c                ó¢   — |j                   t        j                  k(  r1t         | cxk  r	t        k  rn ndt	        | «      iS dt	        | «      iS | S )Nrþ   r  )r@   r:   r<   Ú
_INT32_MAXr`   rr   s     r8   Ú_encode_intr8  v  sH   € Ø×Ñ¤×!3Ñ!3Ò3Üˆ;˜#Ô*¤
Õ*Ø ¤# c£(Ð+Ð+Øœs 3›xÐ(Ð(Ø€Jr7   c                ó  — |j                   t        j                  k7  rnt        j                  | «      rddiS t        j
                  | «      r| dkD  rdnd}d|iS |j                   t        j                  k(  rdt        t        | «      «      iS | S )Nr  ÚNaNr   ÚInfinityz	-Infinity)	r@   r:   r3   ÚmathÚisnanÚisinfr<   r`   Úrepr)rm   rh   Úrepresentations      r8   Ú_encode_floatrA  ~  s{   € Ø×Ñ¤§¡Ò0Ü�:‰:�cŒ?Ø# UÐ+Ð+Ü�Z‰Z˜Œ_Ø+.°ª7™Z¸ˆNØ# ^Ð4Ð4Ø×#Ñ#¤x×'9Ñ'9Ò9ð $¤S¬¨c«£^Ð4Ð4Ø€Jr7   c                óZ  — |j                   t        j                  k(  rÔ| j                  s$| j	                  t
        ¬«      } | j                  €J ‚| t        k\  r›| j                  j                  | «      }|j                  |j                  |j                  fdk(  rd}n| j                  d«      }t        | j                  dz  «      }|rd|fz  nd}dd	j                  | j                  d
«      ||«      iS t        | «      }|j                   t        j                   k(  rd|iS ddt#        |«      iiS )NrÆ   )r   r   r   r¹   z%ziè  z.%03dr�   r·   z{}{}{}rÀ   r  )rC   r-   r5   rO   rÌ   r%   r   Ú	utcoffsetÚdaysrÅ   ÚmicrosecondsÚstrftimer?   rÁ   rU   r   r3   r`   )rm   rh   ÚoffÚ	tz_stringÚmillisÚfracsecss         r8   r#  r#  Œ  s  € Ø×+Ñ+Ô/E×/MÑ/MÒMØ�zŠzØ—+‘+¤S�+Ó)ˆCØ—:‘:Ð)Ð)Ð)Ø”+ÒØ—*‘*×&Ñ& sÓ+ˆCØ—‘˜#Ÿ+™+ s×'7Ñ'7Ð8¸IÒEØ‘	àŸL™L¨Ó.�	Ü˜Ÿ™¨4Ñ/Ó0ˆFÙ.4�w & Ò*¸"ˆHà˜Ÿ™¨¯©Ð6IÓ)JÈHÐV_Ó`ðð ô ! Ó%€FØ×+Ñ+Ô/E×/LÑ/LÒLØ˜Ð Ð Ø�m¤S¨£[Ð1Ð2Ð2r7   c                ó   — t        | d|«      S rŸ   )r!  rr   s     r8   Ú_encode_bytesrL  £  s   € Ü˜#˜q ,Ó/Ð/r7   c                ó0   — t        | | j                  |«      S rp   )r!  r¤   rr   s     r8   Ú_encode_binary_objrN  §  s   € Ü˜#˜sŸ{™{¨LÓ9Ð9r7   c                ó¦   — |j                   r8t        j                  | |j                  ¬«      }t	        ||j
                  |«      S d| j                  iS )N)r—   r•   )rD   r   r™   r—   r!  r¤   Úhex)rm   rh   Úbinvals      r8   Ú_encode_uuidrR  «  sE   € Ø×ÒÜ×!Ñ! #¸<×;[Ñ;[Ô\ˆÜ˜f f§n¡n°lÓCÐCà˜Ÿ™Ð!Ð!r7   c                ó   — dt        | «      iS )NrÞ   ©r`   r+  s     r8   Ú_encode_objectidrU  ³  s   € Ø”C˜“HÐÐr7   c                ó8   — d| j                   | j                  dœiS )Nr  )r  r&   )ÚtimeÚincr+  s     r8   Ú_encode_timestamprY  ·  s   € Ø §¡¨s¯w©wÑ7Ð8Ð8r7   c                ó   — dt        | «      iS )Nr  rT  r+  s     r8   Ú_encode_decimal128r[  »  s   € Øœc #›hÐ'Ð'r7   c                ó8   — t        | j                  «       |¬«      S )N)rh   )rl   rø   rr   s     r8   Ú_encode_dbrefr]  ¿  s   € Ü˜Ÿ™›°LÔAÐAr7   c                ó
   — ddiS )Nr  r.   r6   ©r�   Údummy1s     r8   Ú_encode_minkeyra  Ã  ó   € Ø�qˆ>Ðr7   c                ó
   — ddiS )Nr  r.   r6   r_  s     r8   Ú_encode_maxkeyrd  Ç  rb  r7   z-dict[Type, Callable[[Any, JSONOptions], Any]]Ú	_ENCODERSz,dict[int, Callable[[Any, JSONOptions], Any]]Ú_MARKERSÚ_type_markerc              #  ó    K  — | ]  }|–— Œ y ­wrp   r6   )Ú.0r  s     r8   ú	<genexpr>rj  ì  s   è ø€ Ò-˜aœÑ-ùs   ‚c                óp  — 	 t        t        | «         | |«      S # t        $ r Y nw xY wt        | d«      r8| j                  }|t
        v r$t
        |   }|t         t        | «      <    || |«      S t        D ]4  }t        | |«      sŒt         |   }|t         t        | «      <    || |«      c S  t        d| z  «      ‚)Nrg  z%r is not JSON serializable)	re  rï   ÚKeyErrorr}   rg  rf  Ú_BUILT_IN_TYPESr~   r�   )rm   rh   ÚmarkerÚfuncÚbases        r8   r€   r€   ï  sÅ   € ðÜœ˜c›Ñ# C¨Ó6Ð6øÜò Ùðúô ˆs�NÔ#Ø×!Ñ!ˆØ”XÑÜ˜FÑ#ˆDà#'ŒI”d˜3“iÑ Ù˜˜\Ó*Ð*ô  ò +ˆÜ�c˜4Õ Ü˜T‘?ˆDà#'ŒI”d˜3“iÑ Ù˜˜\Ó*Ò*ð+ô Ð1°CÑ7Ó
8Ð8s   ‚ š	&¥&c                ó   — t        | «      S rp   )r–   ©rm   s    r8   Ú_get_str_sizers    s   € Üˆs‹8€Or7   c                óL   — dt        t        | j                  «       «      «      z   S )NrÃ   )r–   r`   rW  rr  s    r8   Ú_get_datetime_sizeru    s   € ØŒs”3�s—x‘x“z“?Ó#Ñ#Ð#r7   c                ó2   — dt        | j                  «      z   S )Né   )r–   r‘   rr  s    r8   Ú_get_regex_sizerx    s   € Ø”�C—K‘KÓ Ñ Ð r7   c                ó2   — dt        | j                  «      z   S )Né"   )r–   Ú
collectionrr  s    r8   Ú_get_dbref_sizer|    s   € Ø”�C—N‘NÓ#Ñ#Ð#r7   é   é   é   é   zdict[Any, int]Ú_CONSTANT_SIZE_TABLEzdict[Any, Callable[[Any], int]]Ú_VARIABLE_SIZE_TABLEc                óZ  — ||k\  r|S t        | «      }	 t        |   S # t        $ r Y nw xY w	 t        |   | «      S # t        $ r Y nw xY w|t        k(  r`| j
                  rA|dt        | j
                  ||«      z   t        | «      z   t        | j
                  «      z
  z  }|S |dt        | «      z   z  }|S |t        k(  rC| j                  «       D ].  \  }}|t        |||«      z  }|t        |||«      z  }||k\  sŒ,|c S  |S t        | d«      r | D ]  }|t        |||«      z  }||k\  sŒ|c S  |S )z!Recursively finds size of objectsrÃ   r|   )rï   r�  rl  r‚  r   ré   Úget_sizer–   rx   r{   r}   )rm   Úmax_sizeÚcurrent_sizeÚobj_typer‚   rƒ   r&   s          r8   r„  r„  1  sr  € à�xÒØÐä�C‹y€HðÜ# HÑ-Ð-øÜò ÙðúðÜ# HÑ-¨cÓ2Ð2øÜò Ùðúð ”4ÒØ�9Š9ØØ”H˜SŸY™Y¨°,Ó?Ñ?Ä#ÀcÃ(ÑJÌSÐQT×QZÑQZË^Ñ[ñˆLð  Ðð ˜A¤ C£™LÑ(ˆLð Ðð 
”TÒ	Ø—I‘I“Kò 	$‰DˆAˆqØœH Q¨°,Ó?Ñ?ˆLØœH Q¨°,Ó?Ñ?ˆLØ˜xÓ'Ø#Ò#ð		$ð Ðô 
��jÔ	!Øò 	$ˆAØœH Q¨°,Ó?Ñ?ˆLØ˜xÓ'Ø#Ò#ð	$ð Ðs   ” �	)¨)­; »	AÁAc                ót  — |dk  ry|}t        | d«      r>i }| j                  «       D ]%  \  }}t        ||«      \  }}|r|||<   |dk  sŒ" ||fS  ||fS t        | d«      rOt        | t        t
        f«      s9g }| D ].  }t        ||«      \  }}|r|j                  |«       |dk  sŒ+ ||fS  ||fS t        | |«      S )zMRecursively truncate documents as needed to fit inside max_length characters.r   rŸ   r{   r|   )r}   r{   Ú_truncate_documentsr~   r`   r   ÚappendÚ	_truncate)rm   Ú
max_lengthÚ	remainingÚ	truncatedr‚   rƒ   Útruncated_vs          r8   r‰  r‰  Z  sô   € à�Q‚ØØ€IÜˆs�GÔØˆ	Ø—I‘I“Kò 	‰DˆAˆqÜ%8¸¸IÓ%FÑ"ˆK˜ÙØ*�	˜!‘Ø˜A‹~ØØ˜)Ð#Ð#ð	ð ˜)Ð#Ð#Ü	��jÔ	!¬*°S¼3Ä¸,Ô*GØˆ	Øò 	ˆAÜ%8¸¸IÓ%FÑ"ˆK˜ÙØ× Ñ  Ô-Ø˜A‹~ØØ˜)Ð#Ð#ð	ð ˜)Ð#Ð#ä˜˜iÓ(Ð(r7   c                ón   — t        | |«      }||k  r| ||z
  fS 	 | d | }|||z
  fS # t        $ r | }Y Œw xY wrp   )r„  r�   )rm   r�  ÚsizerŽ  s       r8   r‹  r‹  u  s^   € Ü�C˜Ó#€DàˆyÒØ�I Ñ$Ð$Ð$ð	Ø˜J˜Y˜ˆIð ˜) dÑ*Ð*Ð*øô ò 	ØŠIð	ús   š& ¦4³4)rm   r   rJ   r   rK   r   r_   r`   )r)   zUnion[str, bytes, bytearray]rJ   r   rK   r   r_   r   )rm   r   rh   r>   r_   r   )rw   zSequence[Tuple[str, Any]]rh   r>   r_   r   )rˆ   zMapping[str, Any]rh   r>   r_   r   )r�   r   r�   r   r_   r   )r�   r   rh   r>   r_   úUnion[Binary, uuid.UUID])r£   r   r¤   r?   rh   r>   r_   r’  )r�   r   rh   r>   r_   z$Union[datetime.datetime, DatetimeMS])r�   r   r�   r   r_   r    )r�   r   r�   r   r_   r`   )r�   r   r�   r   r_   r   )r�   r   r�   r   r_   z
Regex[str])r�   r   r�   r   r_   r?   )r�   r   r�   r   r_   r   )r�   r   r�   r   r_   rÉ   )r�   r   r�   r   r_   r   )r�   r   r�   r   r_   r   )r�   r   r�   r   r_   r   )r�   r   r�   r   r_   r$   )r£   r   r¤   r?   rh   r>   r_   r   )rm   r   rh   r>   r_   rx   )rm   r   rh   r>   r_   rx   )rm   r   rh   r>   r_   r   )rm   r   r�   r   r_   r   )rm   r?   rh   r>   r_   r   )rm   rÉ   rh   r>   r_   r   )rm   údatetime.datetimerh   r>   r_   rx   )rm   r   rh   r>   r_   rx   )rm   r   rh   r>   r_   rx   )rm   z	uuid.UUIDrh   r>   r_   rx   )rm   r    r�   r   r_   rx   )rm   r$   r�   r   r_   rx   )rm   r   rh   r>   r_   rx   )r�   r   r`  r   r_   rx   )rm   r   r_   r?   )rm   r“  r_   r?   )rm   r!   r_   r?   )rm   r   r_   r?   )r   )rm   r   r…  r?   r†  r?   r_   r?   )rm   r   rŒ  r?   r_   úTuple[Any, int])rm   r   r�  r?   r_   r”  )“Ú__doc__Ú
__future__r   r­   rÊ   rj   r<  r.  rš   Útypingr   r   r   r   r   r	   r
   r   r   r   r   Úbson.binaryr   r   r   r   Ú	bson.coder   Úbson.codec_optionsr   r   Úbson.datetime_msr   r   r   r   r   Ú
bson.dbrefr   Úbson.decimal128r   Ú
bson.int64r   Úbson.max_keyr   Úbson.min_keyr   Úbson.objectidr    Ú
bson.regexr!   Úbson.sonr"   Úbson.timestampr$   Úbson.tz_utilr%   ÚIÚLÚMÚSÚUÚXrŽ   r-   r:   r`   Ú_BASE_CLASSr7  r>   r3   rc   ra   r<   rd   r;   re   rf   rk   ry   rl   ru   rq   r“   r�   r¦   r°   rµ   rÜ   rà   rä   rë   rñ   rõ   rü   r   r  r	  r  r  r  r  r  r‡   Úsetr†   r!  r%  r'  r)  r,  r5  r8  rA  r#  rL  rN  rR  rU  rY  r[  r]  ra  rd  rA   r   rÉ   r?   rï   r›   re  rf  Ú_typr}   rg  Útuplerm  r€   rs  ru  rx  r|  r�  r‚  r„  r‰  r‹  r6   r7   r8   ú<module>r°     sb  ðòVõn #ã Û Û Û Û 	Û ÷÷ ÷ ñ ÷ TÓ SÝ ß ?÷õ õ Ý &Ý Ý Ý Ý "Ý Ý Ý $Ý ð 
�‰Ø	�‰Ø	�‰Ø	�‰Ø	�‰Ø	�‰ñ€÷!ñ !÷H(ñ (ñV Ø˜~¨c°3¨hÑ7Ñ8�Kà€Kà€
ô`#�+ô `#ñF $/¸¿¹Ô#IÐ �[Ó Iðñ '2¸H×<NÑ<NÔ&OÐ ˜Ó Oðñ %0¸(×:JÑ:JÔ$KÐ �kÓ Kðð %9Ð �kÓ 8ð	óIó**ðD 9Mô ð CWðIØ$ðIØ4?ðIàóIð EYô ó	!ó	'ó!ó*8óAðBRØ	ðBRØ'ðBRà)óBRóJ!óó7ó)ó"óDó&óóóóóó:ó)ð
:Ø
Ð ð:à
Ð"ð:ð Ð&ð:ð Ð!ð	:ð
 Ð&ð:ð Ð&ð:ð ˆ}ð:ð Ð"ð:ð Ðð:ð Ñ$ð:ð Ð)ð:ð Ð"ð:ð Ð1ð:ð Ð,ð:ð Ð0ð:ð  Ð&ð!:ð" Ð(ð#:ð$ Ð,ñ%:€Ð
6ó ñ( �8‹}€óaó5óUóóóJó.óó3ó.0ó:ó"óó9ó(óBóóð<Øˆ,ð<à	ˆ=ð<ð ×ÑÐ'ð<ð Ð"ð	<ð
 
ˆ=ð<ð ˆð<ð ˆð<ñ 	ˆƒJ�ð<ð 	‡I‚Iˆ|ð<ð Ðð<ð 
ˆ=ð<ð 	ˆ,ð<ð 
ˆ=ð<ð ˆNð<ð ˆNð<ð  Ðð!<ð" 
ˆ=ð#<ð$ ˆ]ØÐ ØÐ"ñ)<€	Ð8ó ð0 :<€Ð
6Ó ;Øò 6€DÙˆt�^Õ$Ø&/°¡oˆ�×"Ò"Ò#ð6ñ Ñ- 9Ô-Ó-€ð 3Gô 9ó>ó$ó!ó$ð
 ˆbØˆØ	ˆ2Ø�ØˆrØ
ˆAØ
ˆAð(Ð �nó ð ˆØ	ˆ=Ø×ÑÐ)Ø	ˆ?Ø	ˆ?ð9Ð Ð5ó ô&óR)ô6
+r7   