Ë
    ¤eh<C  ã                  ó   — d dl mZ d dlmZmZ d dlZd dlmZmZm	Z	 d dl
Zd dlmZ d dlZd dlmZ erd dlmZ d dlmZmZ dd	„Z	 	 	 	 d	 	 	 	 	 	 	 dd
„Z	 	 	 	 	 	 	 	 	 	 dd„Zdd„Z	 d	 	 	 	 	 dd„Z	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zy)é    )Úannotations)ÚabcÚdefaultdictN)ÚTYPE_CHECKINGÚAnyÚDefaultDict©Úconvert_json_to_lines)Ú	DataFrame)ÚIterable)ÚIgnoreRaiseÚScalarc                óF   — | d   dk(  s
| d   dk(  r| S | dd } t        | «      S )zJ
    Helper function that converts JSON lists to line delimited JSON.
    r   ú[éÿÿÿÿú]é   r	   )Úss    úW/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/pandas/io/json/_normalize.pyÚconvert_to_line_delimitsr       s4   € ð ˆQ‰4�3Š;˜1˜R™5 Cš<ØˆØ	ˆ!ˆBˆ€Aä  Ó#Ð#ó    c                óð  — d}t        | t        «      r| g} d}g }| D ]Ð  }t        j                  |«      }|j	                  «       D ]•  \  }	}
t        |	t
        «      st        |	«      }	|dk(  r|	}n||z   |	z   }t        |
t        «      r|�!||k\  r|dk7  r|j                  |	«      }
|
||<   Œd|j                  |	«      }
|j                  t        |
|||dz   |«      «       Œ— |j                  |«       ŒÒ |r|d   S |S )a�  
    A simplified json_normalize

    Converts a nested dict into a flat dict ("record"), unlike json_normalize,
    it does not attempt to extract a subset of the data.

    Parameters
    ----------
    ds : dict or list of dicts
    prefix: the prefix, optional, default: ""
    sep : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar
    level: int, optional, default: 0
        The number of levels in the json string.

    max_level: int, optional, default: None
        The max depth to normalize.

    Returns
    -------
    d - dict or list of dicts, matching `ds`

    Examples
    --------
    >>> nested_to_record(
    ...     dict(flat1=1, dict1=dict(c=1, d=2), nested=dict(e=dict(c=1, d=2), d=2))
    ... )
    {'flat1': 1, 'dict1.c': 1, 'dict1.d': 2, 'nested.e.c': 1, 'nested.e.d': 2, 'nested.d': 2}
    FTr   r   )
Ú
isinstanceÚdictÚcopyÚdeepcopyÚitemsÚstrÚpopÚupdateÚnested_to_recordÚappend)ÚdsÚprefixÚsepÚlevelÚ	max_levelÚ	singletonÚnew_dsÚdÚnew_dÚkÚvÚnewkeys               r   r!   r!   -   s  € ðX €IÜ�"”dÔØˆTˆØˆ	Ø€FØò ˆÜ—‘˜aÓ ˆØ—G‘G“Iò 	Q‰DˆAˆqä˜a¤Ô%Ü˜“F�Ø˜ŠzØ‘à #™¨Ñ)�ô ˜a¤Ô&ØÐ%¨%°9Ò*<à˜A’:ØŸ	™	 !›�AØ$%�E˜&‘MØà—	‘	˜!“ˆAØ�L‰LÔ)¨!¨V°S¸%À!¹)ÀYÓOÕPð-	Qð. 	�‰�eÕð3ñ6 Ø�a‰yÐØ€Mr   c                ó¸   — t        | t        «      rD| j                  «       D ]/  \  }}|› |› |› �}|s|j                  |«      }t	        ||||¬«       Œ1 |S | ||<   |S )a3  
    Main recursive function
    Designed for the most basic use case of pd.json_normalize(data)
    intended as a performance improvement, see #15621

    Parameters
    ----------
    data : Any
        Type dependent on types contained within nested Json
    key_string : str
        New key (with separator(s) in) for data
    normalized_dict : dict
        The new normalized/flattened Json dict
    separator : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar
    ©ÚdataÚ
key_stringÚnormalized_dictÚ	separator)r   r   r   ÚremoveprefixÚ_normalise_json)r1   r2   r3   r4   ÚkeyÚvalueÚnew_keys          r   r6   r6   ~   sz   € ô. �$œÔØŸ*™*›,ò 	‰JˆC�Ø#˜ Y K°¨uÐ5ˆGáØ!×.Ñ.¨yÓ9�äØØ"Ø /Ø#ö	ð	ð Ðð '+ˆ˜
Ñ#ØÐr   c           
     ó  — | j                  «       D ��ci c]  \  }}t        |t        «      rŒ||“Œ }}}t        | j                  «       D ��ci c]  \  }}t        |t        «      sŒ||“Œ c}}di |¬«      }i |¥|¥S c c}}w c c}}w )aw  
    Order the top level keys and then recursively go to depth

    Parameters
    ----------
    data : dict or list of dicts
    separator : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar

    Returns
    -------
    dict or list of dicts, matching `normalised_json_object`
    Ú r0   )r   r   r   r6   )r1   r4   r,   r-   Ú	top_dict_Únested_dict_s         r   Ú_normalise_json_orderedr>   §   s�   € ð #'§*¡*£,×J™$˜!˜Q´jÀÄDÕ6I��A‘ÐJ€IÑJÜ"Ø#Ÿz™z›|×C‘t�q˜!¬z¸!¼TÕ/Bˆa�‰dÓCØØØô	€Lð )ˆiÐ(˜<Ð(Ð(ùó KùãCs   ”A=­A=ÁB
Á&B
c                óª   — i }t        | t        «      rt        | |¬«      }|S t        | t        «      r| D �cg c]  }t	        ||¬«      ‘Œ }}|S |S c c}w )a˜  
    A optimized basic json_normalize

    Converts a nested dict into a flat dict ("record"), unlike
    json_normalize and nested_to_record it doesn't do anything clever.
    But for the most basic use cases it enhances performance.
    E.g. pd.json_normalize(data)

    Parameters
    ----------
    ds : dict or list of dicts
    sep : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar

    Returns
    -------
    frame : DataFrame
    d - dict or list of dicts, matching `normalised_json_object`

    Examples
    --------
    >>> _simple_json_normalize(
    ...     {
    ...         "flat1": 1,
    ...         "dict1": {"c": 1, "d": 2},
    ...         "nested": {"e": {"c": 1, "d": 2}, "d": 2},
    ...     }
    ... )
    {'flat1': 1, 'dict1.c': 1, 'dict1.d': 2, 'nested.e.c': 1, 'nested.e.d': 2, 'nested.d': 2}

    )r1   r4   ©r%   )r   r   r>   ÚlistÚ_simple_json_normalize)r#   r%   Únormalised_json_objectÚrowÚnormalised_json_lists        r   rB   rB   À   sd   € ðV  Ðä�"”dÔÜ!8¸bÈCÔ!PÐð "Ð!ô 
�BœÔ	ØPRÖSÈÔ 6°sÀÖ DÐSÐÐSØ#Ð#Ø!Ð!ùò  Ts   ¶Ac                ó¤  ‡‡‡‡‡‡‡‡‡‡‡‡— 	 d	 	 	 	 	 	 	 dˆfd„Šdˆfd„Št        | t        «      r| s
t        «       S t        | t        «      r| g} n<t        | t        j
                  «      rt        | t        «      st        | «      } nt        ‚|€|€|€‰€‰€t        t        | ‰¬«      «      S |€+t        d„ | D «       «      rt        | ‰‰¬«      } t        | «      S t        |t        «      s|g}|€g }nt        |t        «      s|g}|D �cg c]  }t        |t        «      r|n|g‘Œ c}Šg Šg Št        t        «      Š‰D �	cg c]  }	‰j                  |	«      ‘Œ c}	Šddˆˆˆˆˆˆˆˆˆˆf
d„Š ‰| |i d¬«       t        ‰«      }
‰�|
j                  ˆfd	„¬
«      }
‰j                  «       D ]š  \  }}|�||z   }||
v rt        d|› d�«      ‚t!        j"                  |t$        ¬«      }|j&                  dkD  r=t!        j(                  t+        |«      ft$        ¬«      }t-        |«      D ]
  \  }}|||<   Œ |j/                  ‰«      |
|<   Œœ |
S c c}w c c}	w )a´  
    Normalize semi-structured JSON data into a flat table.

    Parameters
    ----------
    data : dict or list of dicts
        Unserialized JSON objects.
    record_path : str or list of str, default None
        Path in each object to list of records. If not passed, data will be
        assumed to be an array of records.
    meta : list of paths (str or list of str), default None
        Fields to use as metadata for each record in resulting table.
    meta_prefix : str, default None
        If True, prefix records with dotted (?) path, e.g. foo.bar.field if
        meta is ['foo', 'bar'].
    record_prefix : str, default None
        If True, prefix records with dotted (?) path, e.g. foo.bar.field if
        path to records is ['foo', 'bar'].
    errors : {'raise', 'ignore'}, default 'raise'
        Configures error handling.

        * 'ignore' : will ignore KeyError if keys listed in meta are not
          always present.
        * 'raise' : will raise KeyError if keys listed in meta are not
          always present.
    sep : str, default '.'
        Nested records will generate names separated by sep.
        e.g., for sep='.', {'foo': {'bar': 0}} -> foo.bar.
    max_level : int, default None
        Max number of levels(depth of dict) to normalize.
        if None, normalizes all levels.

    Returns
    -------
    frame : DataFrame
    Normalize semi-structured JSON data into a flat table.

    Examples
    --------
    >>> data = [
    ...     {"id": 1, "name": {"first": "Coleen", "last": "Volk"}},
    ...     {"name": {"given": "Mark", "family": "Regner"}},
    ...     {"id": 2, "name": "Faye Raker"},
    ... ]
    >>> pd.json_normalize(data)
        id name.first name.last name.given name.family        name
    0  1.0     Coleen      Volk        NaN         NaN         NaN
    1  NaN        NaN       NaN       Mark      Regner         NaN
    2  2.0        NaN       NaN        NaN         NaN  Faye Raker

    >>> data = [
    ...     {
    ...         "id": 1,
    ...         "name": "Cole Volk",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ...     {"name": "Mark Reg", "fitness": {"height": 130, "weight": 60}},
    ...     {
    ...         "id": 2,
    ...         "name": "Faye Raker",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ... ]
    >>> pd.json_normalize(data, max_level=0)
        id        name                        fitness
    0  1.0   Cole Volk  {'height': 130, 'weight': 60}
    1  NaN    Mark Reg  {'height': 130, 'weight': 60}
    2  2.0  Faye Raker  {'height': 130, 'weight': 60}

    Normalizes nested data up to level 1.

    >>> data = [
    ...     {
    ...         "id": 1,
    ...         "name": "Cole Volk",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ...     {"name": "Mark Reg", "fitness": {"height": 130, "weight": 60}},
    ...     {
    ...         "id": 2,
    ...         "name": "Faye Raker",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ... ]
    >>> pd.json_normalize(data, max_level=1)
        id        name  fitness.height  fitness.weight
    0  1.0   Cole Volk             130              60
    1  NaN    Mark Reg             130              60
    2  2.0  Faye Raker             130              60

    >>> data = [
    ...     {
    ...         "state": "Florida",
    ...         "shortname": "FL",
    ...         "info": {"governor": "Rick Scott"},
    ...         "counties": [
    ...             {"name": "Dade", "population": 12345},
    ...             {"name": "Broward", "population": 40000},
    ...             {"name": "Palm Beach", "population": 60000},
    ...         ],
    ...     },
    ...     {
    ...         "state": "Ohio",
    ...         "shortname": "OH",
    ...         "info": {"governor": "John Kasich"},
    ...         "counties": [
    ...             {"name": "Summit", "population": 1234},
    ...             {"name": "Cuyahoga", "population": 1337},
    ...         ],
    ...     },
    ... ]
    >>> result = pd.json_normalize(
    ...     data, "counties", ["state", "shortname", ["info", "governor"]]
    ... )
    >>> result
             name  population    state shortname info.governor
    0        Dade       12345   Florida    FL    Rick Scott
    1     Broward       40000   Florida    FL    Rick Scott
    2  Palm Beach       60000   Florida    FL    Rick Scott
    3      Summit        1234   Ohio       OH    John Kasich
    4    Cuyahoga        1337   Ohio       OH    John Kasich

    >>> data = {"A": [1, 2]}
    >>> pd.json_normalize(data, "A", record_prefix="Prefix.")
        Prefix.0
    0          1
    1          2

    Returns normalized data with columns prefixed with the given string.
    c                ó  •— | }	 t        |t        «      r|D ]  }|€t        |«      ‚||   }Œ 	 |S ||   }	 |S # t        $ rD}|rt        d|› d�«      |‚‰dk(  rt        j                  cY d}~S t        d|› d|› d�«      |‚d}~ww xY w)zInternal function to pull fieldNzKey zS not found. If specifying a record_path, all elements of data should have the path.Úignorez) not found. To replace missing values of z% with np.nan, pass in errors='ignore')r   rA   ÚKeyErrorÚnpÚnan)ÚjsÚspecÚextract_recordÚresultÚfieldÚeÚerrorss         €r   Ú_pull_fieldz#json_normalize.<locals>._pull_field‚  sÏ   ø€ ð ˆð	Ü˜$¤Ô%Ø!ò +�EØ�~Ü& u›oÐ-Ø# E™]‘Fñ+ð( ˆð   ™‘ð ˆøô ò 	ÙÜØ˜1˜#ð 1ð 2óð ðð ˜Ò!Ü—v‘v•äØ˜1˜#ÐFÀqÀcð J6ð 7óð ðûð	ús%   …)9 ±9 ¹	BÁ&BÁ(BÁ.BÂBc                ó˜   •—  ‰| |d¬«      }t        |t        «      s-t        j                  |«      rg }|S t	        | › d|› d|› d�«      ‚|S )z¶
        Internal function to pull field for records, and similar to
        _pull_field, but require to return list. And will raise error
        if has non iterable value.
        T)rN   z has non list value z
 for path z. Must be list or null.)r   rA   ÚpdÚisnullÚ	TypeError)rL   rM   rO   rS   s      €r   Ú_pull_recordsz%json_normalize.<locals>._pull_recordsŸ  sj   ø€ ñ ˜R °dÔ;ˆô ˜&¤$Ô'Ü�y‰y˜Ô Ø�ð ˆô	  Ø�dÐ.¨v¨h°jÀÀð G,ð ,óð ð ˆr   r@   c              3  ó~   K  — | ]0  }|j                  «       D �cg c]  }t        |t        «      ‘Œ c}–— Œ2 y c c}w ­w©N)Úvaluesr   r   )Ú.0ÚyÚxs      r   ú	<genexpr>z!json_normalize.<locals>.<genexpr>Ì  s+   è ø€ ÒG¸Q¨Q¯X©X«ZÖ8¨”
˜1œdÕ#Ö8ÑGùÒ8ùs   ‚=™8°=©r%   r'   r   c           	     óh  •
— t        | t        «      r| g} t        |«      dkD  rU| D ]O  }t        ‰
‰«      D ]&  \  }}|dz   t        |«      k(  sŒ ‰||d   «      ||<   Œ(  ‰||d      |dd  ||dz   ¬«       ŒQ y | D ]±  } ‰||d   «      }|D �cg c]"  }t        |t        «      rt	        |‰‰¬«      n|‘Œ$ }}‰j                  t        |«      «       t        ‰
‰«      D ]<  \  }}|dz   t        |«      kD  r||   }	n ‰|||d  «      }	‰|   j                  |	«       Œ> ‰j                  |«       Œ³ y c c}w )Nr   r   r   ©r&   r`   )r   r   ÚlenÚzipr!   r"   Úextend)r1   ÚpathÚ	seen_metar&   ÚobjÚvalr7   ÚrecsÚrÚmeta_valÚ_metarS   rX   Ú_recursive_extractÚlengthsr'   Ú	meta_keysÚ	meta_valsÚrecordsr%   s             €€€€€€€€€€r   rn   z*json_normalize.<locals>._recursive_extractç  sn  ø€ Ü�dœDÔ!Ø�6ˆDÜˆt‹9�qŠ=Øò W�Ü # E¨9Ó 5ò C‘H�C˜Ø˜q‘y¤C¨£HÓ,Ù)4°S¸#¸b¹'Ó)B˜	 #šðCñ # 3 t¨A¡w¡<°°a°b°¸9ÈEÐTUÉIÖVñWð ò %�Ù$ S¨$¨q©'Ó2�ð
 "ö	ð ô " !¤TÔ*ô % Q¨C¸9ÕEàñð�ð ð —‘œs 4›yÔ)Ü # E¨9Ó 5ò 4‘H�C˜Ø˜q‘y¤3 s£8Ò+Ø#,¨S¡>™á#.¨s°C¸¸°KÓ#@˜Ø˜c‘N×)Ñ)¨(Õ3ð4ð —‘˜tÕ$ñ#%ùòs   Â'D/rb   c                ó   •— ‰› | › �S rZ   © )r^   Úrecord_prefixs    €r   ú<lambda>z json_normalize.<locals>.<lambda>
  s   ø€ °M°?À1À#Ð1F€ r   )ÚcolumnszConflicting metadata name z, need distinguishing prefix )Údtyper   )F)rL   údict[str, Any]rM   ú
list | strrN   ÚboolÚreturnzScalar | Iterable)rL   ry   rM   rz   r|   rA   )r   )r&   Úintr|   ÚNone)r   rA   r   r   r   r   r   ÚNotImplementedErrorrB   Úanyr!   r   ÚjoinÚrenamer   Ú
ValueErrorrJ   ÚarrayÚobjectÚndimÚemptyrc   Ú	enumerateÚrepeat)r1   Úrecord_pathÚmetaÚmeta_prefixru   rR   r%   r'   Úmri   rO   r,   r-   r[   Úirm   rS   rX   rn   ro   rp   rq   rr   s       ````       @@@@@@@@r   Újson_normalizer�   õ   s_  ÿû€ ð\ FKðØðØ",ðØ>Bðà	õõ:ô( �$œÔ¡dÜ‹{ÐÜ	�Dœ$Ô	àˆv‰Ü	�Dœ#Ÿ,™,Ô	'´
¸4ÄÔ0Eô �D‹z‰ä!Ð!ð 	ÐØˆLØÐØÐ!ØÐäÔ/°¸#Ô>Ó?Ð?àÐÜÑGÀ$ÔGÔGô $ D¨c¸YÔGˆDÜ˜‹ÐÜ˜¤TÔ*Ø"�mˆà€|Ø‰Ü˜œdÔ#Øˆvˆà8<Ö=°1”*˜Q¤Ô%‰Q¨A¨3Ñ.Ò=€Eð €GØ€Gä(¬Ó.€IØ*/Ö0 3�—‘˜#•Ò0€I÷%÷ %ñ< �t˜[¨"°AÕ6ä�wÓ€FàÐ Ø—‘Ó'F�ÓGˆð —‘Ó!ò +‰ˆˆ1ØÐ"Ø˜a‘ˆAà�‰;ÜØ,¨Q¨CÐ/LÐMóð ô
 —‘˜!¤6Ô*ˆà�;‰;˜Š?ä—X‘Xœs 1›v˜i¬vÔ6ˆFÜ! !›ò ‘��1Ø��q’	ðð —M‘M 'Ó*ˆˆqŠ	ð%+ð& €MùòE >ùò 1s   Ä
IÅ I)r   r   r|   r   )r;   ú.r   N)r$   r   r%   r   r&   r}   r'   ú
int | None)
r1   r   r2   r   r3   ry   r4   r   r|   ry   )r1   ry   r4   r   r|   ry   )r�   )r#   údict | list[dict]r%   r   r|   zdict | list[dict] | Any)NNNNÚraiser�   N)r1   r’   rŠ   zstr | list | Noner‹   z"str | list[str | list[str]] | NonerŒ   ú
str | Noneru   r”   rR   r   r%   r   r'   r‘   r|   r   )Ú
__future__r   Úcollectionsr   r   r   Útypingr   r   r   ÚnumpyrJ   Úpandas._libs.writersr
   ÚpandasrU   r   Úcollections.abcr   Úpandas._typingr   r   r   r!   r6   r>   rB   r�   rt   r   r   ú<module>r�      sU  ðõ #÷ó ÷ñ ó å 6ã Ý áÝ(÷ó
$ð ØØØ ðNàðNð 
ðNð ð	Nð
 óNðb&Ø
ð&àð&ð $ð&ð ð	&ð
 ó&óR)ð6 ð2"Øð2"à	ð2"ð ó2"ðn &*Ø/3Ø"Ø $Ø!ØØ ðkØ
ðkà"ðkð -ðkð ð	kð
 ðkð ðkð 
ðkð ðkð ôkr   