o
    h|                     @  s  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 ddlmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZ ddlZddlm  mZ dd	lm Z m!Z! dd
l"m#Z# ddl$m%Z%m&Z&m'Z' ej(dkrddlm)Z)m*Z*m+Z+ n
ddl,m)Z)m*Z*m+Z+ ej(dkrddlm-Z-m.Z. nddl,m-Z-m.Z. erddlZ/ddl0Z1ddl"m2Z2 ddl3m4Z5 ddl6m7Z8 ede#dZ9edZ:e.dZ;edZ<e*dede<f e<fdZ=e*dee;e<f e;e<fdZ>e*dde:e<fdZ?e*dee-e:e;f e<f e:e;e<fdZ@e+G dd  d e)ZAd!d"d#dd$d%ZBd&d' eBC D ZDg d(ZEg d)ZFg d*ZGeHeIeJeBeJeDZKd+d,Ld-MeKd.d/d0Ld-MeEd1Ld-MeEeF d2Ld-MeGd3ZNeOd4ZPd5eQd6< dd;d<ZRdd?d@ZSddCdDZTddHdIZUddLdMZVddOdPZWddSdTZX		U	V	U	Uddd^d_ZYddcddZZddgdhZ[e	dddndoZ\eddqdoZ\	VdddrdoZ\dddtduZ]edv Z^dweQdx< 	 G dydw dwZ_dzd{ Z`dddZadddZbdS )zUtility routines.    )annotationsN)IteratorMappingMutableMapping)deepcopy)groupby)
itemgetter)TYPE_CHECKINGAnyCallableLiteralTypeVarcastoverload)is_pandas_dataframeis_polars_dataframe)IntoDataFrame)
SchemaBase
SchemaLike	Undefined)      )ProtocolTypeAliasTyperuntime_checkable)r   
   )Concatenate	ParamSpec)IntoExpr)	DataFrame)StandardType_TTIntoDataFrame)boundTPR	WrapsFunc.)type_paramsWrappedFuncWrapsMethodz Callable[Concatenate[T, ...], R]WrappedMethodc                   @  s   e Zd Z	dddd	Zd
S )DataFrameLikeFTnan_as_nullbool
allow_copyreturnDfiDataFramec                 C     d S N )selfr,   r.   r3   r3   E/var/www/vscode/kcb/lib/python3.10/site-packages/altair/utils/core.py__dataframe__>   s   zDataFrameLike.__dataframe__N)FT)r,   r-   r.   r-   r/   r0   )__name__
__module____qualname__r6   r3   r3   r3   r5   r+   <   s    r+   ONQG)ordinalnominalquantitativetemporalgeojsonc                 C  s   i | ]\}}||qS r3   r3   ).0kvr3   r3   r5   
<dictcomp>K       rF   )argmaxargminaveragecountdistinctmaxmeanmedianminmissingproductq1q3ci0ci1stderrstdevstdevpsumvalidvaluesvariance	variancepexponentialexponentialb)
row_numberrank
dense_rankpercent_rank	cume_distntilelagleadfirst_value
last_value	nth_value)Qyearquartermonthweekday	dayofyeardatehoursminutessecondsmillisecondsyearquarteryearquartermonth	yearmonthyearmonthdateyearmonthdatehoursyearmonthdatehoursminutes yearmonthdatehoursminutessecondsyearweekyearweekdayyearweekdayhoursyearweekdayhoursminutesyearweekdayhoursminutessecondsyeardayofyearquartermonth	monthdatemonthdatehoursmonthdatehoursminutesmonthdatehoursminutessecondsweekdayweeksdayhoursweekdayhoursweekdayhoursminutesweekdayhoursminutessecondsdayhoursdayhoursminutesdayhoursminutessecondshoursminuteshoursminutessecondsminutessecondssecondsmillisecondsutcyear
utcquarterutcmonthutcweekutcdayutcdayofyearutcdateutchours
utcminutes
utcsecondsutcmillisecondsutcyearquarterutcyearquartermonthutcyearmonthutcyearmonthdateutcyearmonthdatehoursutcyearmonthdatehoursminutes#utcyearmonthdatehoursminutessecondsutcyearweekutcyearweekdayutcyearweekdayhoursutcyearweekdayhoursminutes!utcyearweekdayhoursminutessecondsutcyeardayofyearutcquartermonthutcmonthdateutcmonthdatehoursutcmonthdatehoursminutesutcmonthdatehoursminutesseconds
utcweekdayutcweekdayhoursutcweekdayhoursminutesutcweekdayhoursminutessecondsutcdayhoursutcdayhoursminutesutcdayhoursminutessecondsutchoursminutesutchoursminutessecondsutcminutessecondsutcsecondsmillisecondsz(?P<field>.*)z(?P<type>{})|z(?P<aggregate>count)z(?P<op>count)z(?P<aggregate>{})z
(?P<op>{})z(?P<timeUnit>{}))fieldtype	agg_countop_count	aggregate	window_optimeUnit)r   r   r   r   z<frozenset[Literal['field', 'aggregate', 'type', 'timeUnit']]SHORTHAND_KEYSdatar
   r/   =InferredVegaLiteType | tuple[InferredVegaLiteType, list[Any]]c                 C  s   ddl m} || dd}|dv rdS |dkr't| dr'| jjr'd	| jj fS |d
v r-dS |dv r3dS tjd| ddd dS )z
    From an array-like input, infer the correct vega typecode.

    ('ordinal', 'nominal', 'quantitative', or 'temporal').

    Parameters
    ----------
    data: Any
    r   )infer_dtypeF)skipna>   mixed-integermixed-integer-floatcomplexintegerfloatingr@   categoricalcatr>   >   bytesmixedstringbooleanunicoder   r?   >   rr   timeperioddatetime	timedelta
datetime64timedelta64rA   z.I don't know how to infer vegalite type from 'z'.  Defaulting to nominal.   
stacklevel)	pandas.api.typesr   hasattrr   ordered
categoriestolistwarningswarn)r   r   typr3   r3   r5   infer_vegalite_type_for_pandas   s   	
r   featdict[str, Any]c              	     sL    fdddD }z d  |  d }W |S  ttfy%   |}Y |S w )zf
    Merge properties with geometry.

    * Overwrites 'type' and 'geometry' entries if existing.
    c                   s   i | ]}| | qS r3   r3   )rC   rD   r   r3   r5   rF     rG   z$merge_props_geom.<locals>.<dictcomp>r   geometry
properties)updateAttributeErrorKeyError)r   geom
props_geomr3   r   r5   merge_props_geom  s   
r   geot.MutableMapping[Any, Any]c                 C  s   t | } | D ]}tt| | jdr| |  | |< qtt| }|d dkrF|d }t	|dkrDt
|D ]
\}}t|||< q9|S |d dkrRt|}|S d|d}|S )z
    Santize a geo_interface to prepare it for serialization.

    * Make a copy
    * Convert type array or _Array to list
    * Convert tuples to lists (using json.loads/dumps)
    * Merge properties with geometry
    )_Arrayarrayr   FeatureCollectionfeaturesr   Featurer   )r   strr   r7   
startswithr   jsonloadsdumpslen	enumerater   )r   keygeo_dctidxr   r3   r3   r5   sanitize_geo_interface"  s"   	
r  dtypesubtyper-   c              	   C  s0   dd l }z|| |W S  ttfy   Y dS w )Nr   F)numpy
issubdtypeNotImplementedError	TypeError)r  r  npr3   r3   r5   numpy_is_subtypeC  s   r  dfpd.DataFramec           
        s  ddl  ddl}|  } t| j|jr| jt| _| jD ]}t|ts.d|d}t|qt| j	|j
r<d}t|t| j|j
rId}t| fdd}| j D ]}tt|d }|d }t|}|d	kr{| | t}|| d| |< qT|d
kr| | t}|| d| |< qT|dkr| | t| |< qT|dkr| | t}|| d| |< qT|dr| | dd dd| |< qT|drd| d| d}t||drqT|dv r| | t}|| d| |< qTt| jr	| | t| |< qTt| jr*| | }|  |B }	|t|	 d| |< qT|tkrC| | t|}|| d| |< qT| S )a  
    Sanitize a DataFrame to prepare it for serialization.

    * Make a copy
    * Convert RangeIndex columns to strings
    * Raise ValueError if column names are not strings
    * Raise ValueError if it has a hierarchical index.
    * Convert categoricals to strings.
    * Convert np.bool_ dtypes to Python bool objects
    * Convert np.int dtypes to Python int objects
    * Convert floats to objects and replace NaNs/infs with None.
    * Convert DateTime dtypes into appropriate string representations
    * Convert Nullable integers to objects and replace NaN with None
    * Convert Nullable boolean to objects and replace NaN with None
    * convert dedicated string column to objects and replace NaN with None
    * Raise a ValueError for TimeDelta dtypes
    r   Nz(Dataframe contains invalid column name: z. Column names must be stringsz"Hierarchical indices not supportedc                   s   t |  jr
|  S | S r2   )
isinstancendarrayr   )valr  r3   r5   to_list_if_arrayx  s   z3sanitize_pandas_dataframe.<locals>.to_list_if_arrayr   categoryr   r-   r   )r   	timestampc                 S  s   |   S r2   )	isoformat)xr3   r3   r5   <lambda>  s    z+sanitize_pandas_dataframe.<locals>.<lambda>NaT r   Field "" has type "^" which is not supported by Altair. Please convert to either a timestamp or a numerical value.r   >
   Int8Int16Int32Int64UInt8UInt16UInt32UInt64Float32Float64)r  pandascopyr  columns
RangeIndexastyper   
ValueErrorindex
MultiIndexdtypesitemsr   objectwherenotnullr   applyreplacer  r   r   isnullisinf)
r  pdcol_namemsgr  
dtype_itemr  
dtype_namecol
bad_valuesr3   r  r5   sanitize_pandas_dataframeM  st   






rA  nw.DataFrame[TIntoDataFrame]c                 C  s   | j }g }d}t|  }| D ]Z\}}|tjkr-|r-|t|tj	j
| q|tjkr?|t|j
| q|tj	krT|t|j
| d q|tjkrfd| d| d}t||| q| |S )z3Sanitize narwhals.DataFrame for JSON serialization.z%Y-%m-%dT%H:%M:%Sz%.fr  r  r  )schemar   	to_nativer2  nwDateappendr?  r   Datetimedt	to_stringDurationr.  select)r   rC  r+  local_iso_fmt_string	is_polarsnamer  r<  r3   r3   r5   sanitize_narwhals_dataframe  s&   

 

rP  r   nw.DataFrame[Any]c                 C  sB   t j| dd}t |dkrddlm} || }t j|dd}|S )z
    Wrap `data` in `narwhals.DataFrame`.

    If `data` is not supported by Narwhals, but it is convertible
    to a PyArrow table, then first convert to a PyArrow Table,
    and then wrap in `narwhals.DataFrame`.
    Teager_or_interchange_onlyinterchanger   )arrow_table_from_dfi_dataframe)
eager_only)rE  from_native	get_levelaltair.utils.datarU  )r   data_nwrU  pa_tabler3   r3   r5   to_eager_narwhals_dataframe  s   r\  TF	shorthanddict[str, Any] | strIntoDataFrame | Noneparse_aggregatesparse_window_opsparse_timeunitsparse_typesc                   s0  ddl m}  s
i S g }|r|dg |dg |r(|dg |dg |r0|dg |dg |rDttjd	d
 |D  }dd
 |D }t trS }	nt fdd
|D }	d|	v rnt	
|	d |	d |	d< |	ddikrxd|	d< d|	v rd|	vrd|	d< d|	vr||r|	d dd}
tj|dd}|j}|
|v r||
 }||
 tjtjhv rt| rt| |	d< nt||	d< t|	d tr|	d d |	d< |	d d |	d< d|	v rd|	d v r|	d |	d dd  dkrtd|	d dd ddt  d d  d! |	S )"a 
  
    General tool to parse shorthand values.

    These are of the form:

    - "col_name"
    - "col_name:O"
    - "average(col_name)"
    - "average(col_name):O"

    Optionally, a dataframe may be supplied, from which the type
    will be inferred if not specified in the shorthand.

    Parameters
    ----------
    shorthand : dict or string
        The shorthand representation to be parsed
    data : DataFrame, optional
        If specified and of type DataFrame, then use these values to infer the
        column type if not provided by the shorthand.
    parse_aggregates : boolean
        If True (default), then parse aggregate functions within the shorthand.
    parse_window_ops : boolean
        If True then parse window operations within the shorthand (default:False)
    parse_timeunits : boolean
        If True (default), then parse timeUnits from within the shorthand
    parse_types : boolean
        If True (default), then parse typecodes within the shorthand

    Returns
    -------
    attrs : dict
        a dictionary of attributes extracted from the shorthand

    Examples
    --------
    >>> import pandas as pd
    >>> data = pd.DataFrame({"foo": ["A", "B", "A", "B"], "bar": [1, 2, 3, 4]})

    >>> parse_shorthand("name") == {"field": "name"}
    True

    >>> parse_shorthand("name:Q") == {"field": "name", "type": "quantitative"}
    True

    >>> parse_shorthand("average(col)") == {"aggregate": "average", "field": "col"}
    True

    >>> parse_shorthand("foo:O") == {"field": "foo", "type": "ordinal"}
    True

    >>> parse_shorthand("min(foo):Q") == {
    ...     "aggregate": "min",
    ...     "field": "foo",
    ...     "type": "quantitative",
    ... }
    True

    >>> parse_shorthand("month(col)") == {
    ...     "field": "col",
    ...     "timeUnit": "month",
    ...     "type": "temporal",
    ... }
    True

    >>> parse_shorthand("year(col):O") == {
    ...     "field": "col",
    ...     "timeUnit": "year",
    ...     "type": "ordinal",
    ... }
    True

    >>> parse_shorthand("foo", data) == {"field": "foo", "type": "nominal"}
    True

    >>> parse_shorthand("bar", data) == {"field": "bar", "type": "quantitative"}
    True

    >>> parse_shorthand("bar:O", data) == {"field": "bar", "type": "ordinal"}
    True

    >>> parse_shorthand("sum(bar)", data) == {
    ...     "aggregate": "sum",
    ...     "field": "bar",
    ...     "type": "quantitative",
    ... }
    True

    >>> parse_shorthand("count()", data) == {
    ...     "aggregate": "count",
    ...     "type": "quantitative",
    ... }
    True
    r   )is_data_typez{agg_count}\(\)z{aggregate}\({field}\)z{op_count}\(\)z{window_op}\({field}\)z{timeUnit}\({field}\)z{field}c                 s  s    | ]	}|d  |fV  qdS )z:{type}Nr3   rC   pr3   r3   r5   	<genexpr>~  s    z"parse_shorthand.<locals>.<genexpr>c                 s  s2    | ]}t d |jdi t d t jV  qdS )z\Az\ZNr3   )recompileformatSHORTHAND_UNITSDOTALLre  r3   r3   r5   rg    s
     
c                 3  s,    | ]}|  d ur|   V  qd S r2   )match	groupdict)rC   expr]  r3   r5   rg    s    r   r   rK   r@   r   rA   r   \r  TrR  r   sort:z"{}" z0is not one of the valid encoding data types: {}.z, zi
For more details, see https://altair-viz.github.io/user_guide/encodings/index.html#encoding-data-types. z>If you are trying to use a column name that contains a colon, zPprefix it with a backslash; for example "column\:name" instead of "column:name".)rY  rd  extendlist	itertoolschainr  dictnextINV_TYPECODE_MAPgetr7  rE  rW  rC  ObjectUnknownr   rD  r    infer_vegalite_type_for_narwhalstuplerfindr.  rj  splitjoinTYPECODE_MAPr\   )r]  r   r`  ra  rb  rc  rd  patternsregexpsattrsunescaped_fieldrZ  rC  columnr3   rp  r5   parse_shorthand  s~   f


 	r  r  	nw.Series8InferredVegaLiteType | tuple[InferredVegaLiteType, list]c                 C  s   | j }t| r| j  } sd| fS |tjks&|tjks&|tj	kr(dS |
 r.dS |tjks8|tjkr:dS d| }t|)Nr>   r?   r@   rA   zUnexpected DtypeKind: )r  rE  is_ordered_categoricalr   get_categoriesis_emptyto_listStringCategoricalBoolean
is_numericrH  rF  r.  )r  r  r   r<  r3   r3   r5   r    s   
r  tpCallable[P, Any]c                  s.   t ddd}t dd	d}d fdd}|S )a_  
    Use the signature and doc of ``tp`` for the decorated callable ``cb``.

    - **Overload 1**: Decorating method
    - **Overload 2**: Decorating function

    Returns
    -------
    **Adding the annotation breaks typing**:

        Overload[Callable[[WrapsMethod[T, R]], WrappedMethod[T, P, R]], Callable[[WrapsFunc[R]], WrappedFunc[P, R]]]
    cbWrapsMethod[T, R]r/   WrappedMethod[T, P, R]c                S  r1   r2   r3   r  r3   r3   r5   decorate     zuse_signature.<locals>.decorateWrapsFunc[R]WrappedFunc[P, R]c                S  r1   r2   r3   r  r3   r3   r5   r    r  *WrappedMethod[T, P, R] | WrappedFunc[P, R]c                  sl   t  d | _ j }r-| jpd j d d}d|g|jdddd	 R | _| S d
 }t|)z
        Raises when no doc was found.

        Notes
        -----
        - Reference to ``tp`` is stored in ``cb.__wrapped__``.
        - The doc for ``cb`` will have a ``.rst`` link added, referring  to ``tp``.
        __init__zRefer to :class:``
r  T)keependsr   NzFound no doc for )getattr__wrapped____doc__r7   r  
splitlinesr   )r  doc_inline_1r<  r  r3   r5   r    s   	
$
N)r  r  r/   r  )r  r  r/   r  )r  r  r/   r  )r   )r  r  r3   r  r5   use_signature  s   r  originalr   t.Mapping[Any, Any]r*  Literal[False]c                 C  r1   r2   r3   r  r   r*  r3   r3   r5   update_nested     r  Literal[True]c                 C  r1   r2   r3   r  r3   r3   r5   r    r  c                 C  sd   |rt | } | D ]%\}}t|tr+| |i }t|tr&t||| |< q
|| |< q
|| |< q
| S )a  
    Update nested dictionaries.

    Parameters
    ----------
    original : MutableMapping
        the original (nested) dictionary, which will be updated in-place
    update : Mapping
        the nested dictionary of updates
    copy : bool, default False
        if True, then copy the original dictionary rather than modifying it

    Returns
    -------
    original : MutableMapping
        a reference to the (modified) original dict

    Examples
    --------
    >>> original = {"x": {"b": 2, "c": 4}}
    >>> update = {"x": {"b": 5, "d": 6}, "y": 40}
    >>> update_nested(original, update)  # doctest: +SKIP
    {'x': {'b': 5, 'c': 4, 'd': 6}, 'y': 40}
    >>> original  # doctest: +SKIP
    {'x': {'b': 5, 'c': 4, 'd': 6}, 'y': 40}
    )r   r2  r  r   r|  r   r  )r  r   r*  r  r  orig_valr3   r3   r5   r    s   




in_ipythonc                 C  sH   t  }| rddlm} | }nd }|d ur|| d S tj|  d S )Nr   )get_ipython)sysexc_infoIPython.core.getipythonr  showtraceback	tracebackprint_exception)r  r  r  ipr3   r3   r5   display_traceback:  s   r  )r   datumvalue_ChannelCache_CHANNEL_CACHEc                   @  sJ   e Zd ZU ded< ded< edddZdddZdddZdddZdS )r  dict[type[SchemaBase], str]channel_to_name/dict[str, dict[_ChannelType, type[SchemaBase]]]name_to_channelr/   c                 C  sB   zt }W t S  ty    | | }t |_t|j|_|a Y t S w r2   )r  	NameError__new___init_channel_to_namer  _invert_group_channelsr  )clscachedr3   r3   r5   
from_cacheV  s   
z_ChannelCache.from_cacher  	type[Any]r   c                C  s,   | j | }r
|S dt|j}t|)Nzpositional of type )r  r|  r   r7   r
  )r4   r  encodingr<  r3   r3   r5   get_encodingb  s   z_ChannelCache.get_encodingobjr
   r  c                  s   t |tr|S t |trd|i}nt |ttfr" fdd|D S t |tr+| }j  }rR|d|v r:dnd }z|j	|ddW S  t
jyQ   | Y S w tjd d	d
 |S )Nr]  c                   s   g | ]} | qS r3   )_wrap_in_channel)rC   elr  r4   r3   r5   
<listcomp>n  s    z2_ChannelCache._wrap_in_channel.<locals>.<listcomp>r  r   F)validatezUnrecognized encoding channel r   r   )r  r   r   rv  r  r   to_dictr  r|  	from_dict
jsonschemaValidationErrorr   r   )r4   r  r  channelr  r3   r  r5   r  h  s"   



z_ChannelCache._wrap_in_channelkwargsr   c                  s    fdd|  D S )Nc                   s&   i | ]\}}|t ur| ||qS r3   )r   r  )rC   r  r  r4   r3   r5   rF     s
    z6_ChannelCache.infer_encoding_types.<locals>.<dictcomp>)r2  )r4   r  r3   r  r5   infer_encoding_types~  s   
z"_ChannelCache.infer_encoding_typesN)r/   r  )r  r  r/   r   )r  r
   r  r   )r  r   )	r7   r8   r9   __annotations__classmethodr  r  r  r  r3   r3   r3   r5   r  R  s   
 

c                    s4   ddl m}  | j| j| jf  fdd| j D S )a  
    Construct a dictionary of channel type to encoding name.

    Note
    ----
    The return type is not expressible using annotations, but is used
    internally by `mypy`/`pyright` and avoids the need for type ignores.

    Returns
    -------
        mapping: dict[type[`<subclass of FieldChannelMixin and SchemaBase>`] | type[`<subclass of ValueChannelMixin and SchemaBase>`] | type[`<subclass of DatumChannelMixin and SchemaBase>`], str]
    r   )channelsc                   s2   i | ]}t |trt| rt|tr||jqS r3   )r  r   
issubclassr   _encoding_name)rC   cmixinsr3   r5   rF     s    z)_init_channel_to_name.<locals>.<dictcomp>)altair.vegalite.v5.schemar  FieldChannelMixinValueChannelMixinDatumChannelMixin__dict__r\   )chr3   r  r5   r    s
   
r  mr  r  c                  s.   ddd t |  td} fdd	|D S )z;Grouped inverted index for `_ChannelCache.channel_to_name`.itIterator[tuple[type[Any], str]]r/   r
   c                 S  sD   i }| D ]\}}|j }|drq|drd}nd}|||< q|S )z
        Returns a 1-2 item dict, per channel.

        Never includes `datum`, as it is never utilized in `wrap_in_channel`.
        DatumValuer  r   )r7   endswith)r  itemr  _rO  sub_keyr3   r3   r5   _reduce  s   


z'_invert_group_channels.<locals>._reducer   c                   s   i | ]	\}}| |qS r3   r3   )rC   rD   chansr  r3   r5   rF     s    z*_invert_group_channels.<locals>.<dictcomp>N)r  r  r/   r
   )r   r2  r   )r  grouperr3   r  r5   r    s   
r  argstuple[Any, ...]r  c                 C  sn   t  }| D ]+}t|ttfrtt|dn|}|t|}||vr(|||< qd|d}t	||
|S )aa  
    Infer typed keyword arguments for args and kwargs.

    Parameters
    ----------
    args : Sequence
        Sequence of function args
    kwargs : MutableMapping
        Dict of function kwargs

    Returns
    -------
    kwargs : dict
        All args and kwargs in a single dict, with keys and types
        based on the channels mapping.
    Nz	encoding z specified twice.)r  r  r  rv  r  rz  iterr  r   r.  r  )r  r  cacheargr  r  r<  r3   r3   r5   r    s    

r  )r   r
   r/   r   )r   r   r/   r   )r   r   r/   r   )r  r
   r  r
   r/   r-   )r  r  r/   r  )r   rB  r/   rB  )r   r   r/   rQ  )NTFTT)r]  r^  r   r_  r`  r-   ra  r-   rb  r-   rc  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   )F)r  r
   r   r  r*  r-   r/   r   )T)r  r-   )r  r  r/   r  )r  r  r  r   )cr  
__future__r   rw  r   rh  r  r  r   collections.abcr   r   r   r*  r   r   operatorr   typingr	   r
   r   r   r   r   r   r  narwhals.stable.v1stablev1rE  narwhals.stable.v1.dependenciesr   r   narwhals.stable.v1.typingr   altair.utils.schemapir   r   r   version_infor   r   r   typing_extensionsr   r   tr)  r:  r   altair.utils._dfi_typesr   r0   !altair.vegalite.v5.schema._typingr    InferredVegaLiteTyper!   r#   r$   r%   r&   r(   r)   r*   r+   r  r2  r{  
AGGREGATESWINDOW_AGGREGATES	TIMEUNITSrv  rx  r  VALID_TYPECODESrj  r  rk  	frozensetr   r  r   r   r  r  rA  rP  r\  r  r  r  r  r  _ChannelTyper  r  r  r  r3   r3   r3   r5   <module>   s    $


T


0

!

 

! 
<
*-4
