o
    wi                     @   s  U d 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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mZmZmZmZmZmZmZmZmZmZmZmZ ddlZdd	lm Z m!Z!m"Z" dd
l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP dZQeeRd< edef ZSdeTdefddZUdeTdefddZVd4ddZWG dd dZXeW  ede=deeeT eTf deeeeY  eeY f dee=ddf fdd ZZede=dee=ddf fd!d"Z[ede<dee<ddf fd#d$Z\efd%ee; d&eYd'ed(ed)ede=fd*d+Z]d)ed(ed'ed&eYd%eeA de=fd,d-Z^	.d5d/e<d(eTd0eYd1eYdeee= eeTe_f f f
d2d3Z`dS )6zOmegaConf module    N)defaultdict)contextmanager)Enum)dedent)IOAnyCallableDict	GeneratorIterableListOptionalSetTupleTypeUnionoverload   )
DictConfigDictKeyType
ListConfig)_DEFAULT_MARKER__ensure_container
_get_valueformat_and_raiseget_dict_key_value_typesget_list_element_typeget_omega_conf_dumperget_type_ofis_attr_classis_dataclassis_dict_annotationis_intis_list_annotationis_primitive_containeris_primitive_dictis_primitive_listis_structured_configis_tuple_annotationis_union_annotationnullcontext	split_keytype_str)Box	ContainerNodeSCMode	UnionNode)BaseContainer)MissingMandatoryValueOmegaConfBaseExceptionUnsupportedInterpolationTypeValidationError)	AnyNodeBooleanNode	BytesNodeEnumNode	FloatNodeIntegerNodePathNode
StringNode	ValueNodez???MISSING.interpolationreturnc                 C   s   d|  d S )zt
    Equivalent to ``${interpolation}``

    :param interpolation:
    :return: input ``${node}`` with type Any
    ${} rA   rE   rE   P/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/omegaconf/omegaconf.pyIIQ   s   rH   c                 C   s   | S )z
    Use this for String interpolation, for example ``"http://${host}:${port}"``

    :param interpolation: interpolation string
    :return: input interpolation with type ``Any``
    rE   rF   rE   rE   rG   SI[      rI   c                  C   sv   ddl m}  td| j td| j td| j td| j td| j td| j	j
 td	| j	j d S )
Nr   ocz	oc.createz	oc.decodezoc.deprecatedzoc.envz	oc.selectzoc.dict.keyszoc.dict.values)omegaconf.resolversrL   	OmegaConfregister_new_resolvercreatedecode
deprecatedenvselectdictkeysvaluesrK   rE   rE   rG   register_default_resolverse   s   rX   c                   @   s  e Zd ZdZdddZe		ddedee dee	e
ef  defd	d
Zee		dde
dee dee	e
ef  deeef fddZee		ddeee eedf f dee dee	e
ef  defddZee		ddedee dee	e
ef  defddZee		ddedee dee	e
ef  defddZee			ddee	eef  dee dee	e
ef  defddZeeddfdedee dee	e
ef  deeef fddZedee
ejee f deeef fddZe	ddedee
ejee f deddfddZeddeee
  defddZedee
 defd d!Zed"eeee	eef ee eedf ef deeef fd#d$Zed"eeee	eef ee eedf ef deeef fd%d&Zed'e
d(eddfd)d*Z ed'e
d(eddfd+d,Z!eddd-d'e
d(ed.ed/eddf
d0d1Z"e#d'e
defd2d3Z$edd4d5Z%e#d'e
defd6d7Z&ed8ede	e
ef fd9d:Z'ed8ed;e	e
ef ddfd<d=Z(ed8eddfd>d?Z)ed@edAeddfdBdCZ*ed8e+dDee ddfdEdFZ,ed8e+dee fdGdHZ-ed8e.dDee ddfdIdJZ/ed8e.dee fdKdLZ0ed8edMee
ee
 f defdNdOZ1eddde2j3dPdQededRedSedTe2dee	eef ee de
ef fdUdVZ4edQedee	eef ee de
ef fdWdXZ5edQedYedefdZd[Z6edd\edYeee7e
f  defd]d^Z8ededefd_d`Z9ededefdadbZ:ededefdcddZ;eddedYee
 dee<e  fdedfZ=eedgddhdQe.dYe
diedjedRedefdkdlZ>e	ddgddmdQe.dYe
dDednedoeddfdpdqZ?edddrdQededsede
fdtduZ@edQe.ddfdvdwZAedQedeBe
 fdxdyZCeeddfdedee dee	e
ef  deeef fdzd{ZDed|edee<e  fd}d~ZEed'e
deeFe.e.e+eedf ee
df gef  fddZGdS )rN   zOmegaConf primary classrB   Nc                 C   s   t d)Nz,Use one of the static construction functions)NotImplementedError)selfrE   rE   rG   __init__t   s   zOmegaConf.__init__objparentflagsc                 C   s   t | ||S N)rN   rP   r\   r]   r^   rE   rE   rG   
structuredw   s   zOmegaConf.structuredc                 C      d S r_   rE   r`   rE   rE   rG   rP      rJ   zOmegaConf.create.c                 C   rb   r_   rE   r`   rE   rE   rG   rP      rJ   c                 C   rb   r_   rE   r`   rE   rE   rG   rP      rJ   c                 C   rb   r_   rE   r`   rE   rE   rG   rP      rJ   c                 C   rb   r_   rE   r`   rE   rE   rG   rP      rJ   c                 C   s   t j| ||dS )Nr`   )rN   _create_implr`   rE   rE   rG   rP      s
   file_c                 C   s   ddl m} t| ttjfr3tjtj	
| ddd}tj|| d}W d    n1 s-w   Y  nt| dd rBtj| | d}ntd|d ur\t|tttfs\td	t|j |d u rft }|S t|}|S )
Nr   get_yaml_loaderrutf-8encodingLoaderreadUnexpected file typezInvalid loaded object type: )_utilsrf   
isinstancestrpathlibPathioopenospathabspathyamlloadgetattr	TypeErrorlistrU   IOErrortype__name__rN   rP   )rd   rf   fr\   retrE   rE   rG   rz      s$   
zOmegaConf.loadFconfigr   resolvec                 C   s   t | st| rt| } tj| |d}t|ttjfr@t	j
tj|ddd}|| W d   dS 1 s9w   Y  dS t|drP|| |  dS td)z
        Save as configuration object to a file

        :param config: omegaconf.Config object (DictConfig or ListConfig).
        :param f: filename or file object
        :param resolve: True to save a resolved config (defaults to False)
        )r   wrh   ri   Nwritern   )r    r   rN   rP   to_yamlrp   rq   rr   rs   rt   ru   rv   rw   rx   r   hasattrflushr|   )r   r   r   datafilerE   rE   rG   save   s   
"

zOmegaConf.save	args_listc                 C   s    | d u rt jdd  } t| S )Nr   )sysargvrN   from_dotlist)r   rE   rE   rG   from_cli   s   
zOmegaConf.from_clidotlistc                 C   s   t  }||  |S )a  
        Creates config from the content sys.argv or from the specified args list of not None

        :param dotlist: A list of dotlist-style strings, e.g. ``["foo.bar=1", "baz=qux"]``.
        :return: A ``DictConfig`` object created from the dotlist.
        )rN   rP   merge_with_dotlist)r   confrE   rE   rG   r      s   
zOmegaConf.from_dotlistconfigsc                  G   s   t | dksJ t| d }t|}t|ttfsJ t|dd |j| dd   |	ddu }W d   n1 s=w   Y  |rJt
|d |S )z
        Merge a list of previously created configs into a single one

        :param configs: Input configs
        :return: the merged config object.
        r   readonlyFr   NT)lencopydeepcopyr   rp   r   r   flag_override
merge_with	_get_flagrN   set_readonlyr   targetturned_readonlyrE   rE   rG   merge   s   zOmegaConf.mergec                  G   s   t | dksJ | d }t|}t|ttfsJ t|ddgddg |j| dd   |ddu }W d   n1 s>w   Y  |rKt	|d |S )a^  
        Merge a list of previously created configs into a single one
        This is much faster than OmegaConf.merge() as the input configs are not copied.
        However, the input configs must not be used after this operation as will become inconsistent.

        :param configs: Input configs
        :return: the merged config object.
        r   r   no_deepcopy_set_nodesFTr   N)
r   r   rp   r   r   r   r   r   rN   r   r   rE   rE   rG   unsafe_merge  s   zOmegaConf.unsafe_mergenameresolverc                 C   s   t jtddd t| |S )Nz            register_resolver() is deprecated.
            See https://github.com/omry/omegaconf/issues/426 for migration instructions.
               )
stacklevel)warningswarnr   rN   legacy_register_resolverr   r   rE   rE   rG   register_resolver<  s   	zOmegaConf.register_resolverc                    sp   t sJ d tjvsJ d  ddtdtdtdttdf d	ttdf d
tf fdd}|tj < d S )Nresolver must be callable
resolver '' is already registeredr   r]   nodeargs.args_strrB   c           
         s   t |   }dd |D }ztdd |D }W n	 ty"   Y nw td  d| d|}||v r8|| n| }	|	||< |	S )Nc                 S   s    g | ]}| d d ddqS )z\  z\,,)replace).0xrE   rE   rG   
<listcomp>[  s     zPOmegaConf.legacy_register_resolver.<locals>.resolver_wrapper.<locals>.<listcomp>c                 s   s    | ]	}d |v r|V  qdS )rC   NrE   )r   irE   rE   rG   	<genexpr>a  s    zOOmegaConf.legacy_register_resolver.<locals>.resolver_wrapper.<locals>.<genexpr>z
Resolver 'z' was called with argument 'a  ' that appears to be an interpolation. Nested interpolations are not supported for resolvers registered with `[legacy_]register_resolver()`, please use `register_new_resolver()` instead (see https://github.com/omry/omegaconf/issues/426 for migration instructions).)rN   	get_cachenextStopIteration
ValueError)
r   r]   r   r   r   cache
args_unescbad_argkeyvalr   rE   rG   resolver_wrapperR  s   z<OmegaConf.legacy_register_resolver.<locals>.resolver_wrapper)callabler2   
_resolversr/   r   r   rq   )r   r   r   rE   r   rG   r   J  s$   


 z"OmegaConf.legacy_register_resolver)r   	use_cacher   r   c                   s   t std std|st rtd  dztW n ty/   dY nw dtdtffdd	}|d
|d|ddt	dt
dtdttdf dttdf dtf fdd}|t	j < dS )a  
        Register a resolver.

        :param name: Name of the resolver.
        :param resolver: Callable whose arguments are provided in the interpolation,
            e.g., with ${foo:x,0,${y.z}} these arguments are respectively "x" (str),
            0 (int) and the value of ``y.z``.
        :param replace: If set to ``False`` (default), then a ``ValueError`` is raised if
            an existing resolver has already been registered with the same name.
            If set to ``True``, then the new resolver replaces the previous one.
            NOTE: The cache on existing config objects is not affected, use
            ``OmegaConf.clear_cache(cfg)`` to clear it.
        :param use_cache: Whether the resolver's outputs should be cached. The cache is
            based only on the string literals representing the resolver arguments, e.g.,
            ${foo:${bar}} will always return the same value regardless of the value of
            ``bar`` if the cache is enabled for ``foo``.
        r   z!cannot use an empty resolver namer   r   NspecialrB   c                    s,    d uo|  j v }|rrtd|  |S )Nz?use_cache=True is incompatible with functions that receive the )
parametersr   )r   r   )sigr   rE   rG   _should_pass  s   z5OmegaConf.register_new_resolver.<locals>._should_pass_parent__node__root_r   r]   r   r   .r   c                    sv   rt |   }z|| W S  ty   Y nw i }r ||d< r&||d< r,| |d< |i |}r9|||< |S )Nr   r   r   )rN   r   KeyError)r   r]   r   r   r   r   kwargsr   )r   	pass_nodepass_parent	pass_rootr   r   rE   rG   r     s$   
z9OmegaConf.register_new_resolver.<locals>.resolver_wrapper)r   r|   r   rN   has_resolverinspect	signaturerq   boolr2   r.   r/   r   r   r   )r   r   r   r   r   r   rE   )r   r   r   r   r   r   r   rG   rO   t  s:   

zOmegaConf.register_new_resolverc                 C   s   |  |d uS r_   )_get_resolverclsr   rE   rE   rG   r     s   zOmegaConf.has_resolverc                   C   s   i t _t  dS )zh
        Clear(remove) all OmegaConf resolvers, then re-register OmegaConf's default resolvers.
        N)r2   r   rX   rE   rE   rE   rG   clear_resolvers  s   
zOmegaConf.clear_resolversc                 C   s   |  |rtj| dS dS )ap  
        Clear(remove) any resolver only if it exists.

        Returns a bool: True if resolver is removed and False if not removed.

        .. warning:
            This method can remove deafult resolvers as well.

        :param name: Name of the resolver.
        :return: A bool (``True`` if resolver is removed, ``False`` if not found before removing).
        TF)r   r2   r   popr   rE   rE   rG   clear_resolver  s   
zOmegaConf.clear_resolverr   c                 C   s   | j jS r_   )	_metadataresolver_cacher   rE   rE   rG   r     s   zOmegaConf.get_cacher   c                 C   s   t || j_d S r_   )r   r   r   r   )r   r   rE   rE   rG   	set_cache  s   zOmegaConf.set_cachec                 C   s   t | tti  d S r_   )rN   r   r   rU   r   rE   rE   rG   clear_cache     zOmegaConf.clear_cachefrom_config	to_configc                 C   s   t |t |  d S r_   )rN   r   r   )r   r   rE   rE   rG   
copy_cache  r   zOmegaConf.copy_cachevaluec                 C      |  d| d S Nr   	_set_flagr   r   rE   rE   rG   r        zOmegaConf.set_readonlyc                 C   
   |  dS r   r   r   rE   rE   rG   is_readonly     
zOmegaConf.is_readonlyc                 C   r   Nstructr   r   rE   rE   rG   
set_struct  r   zOmegaConf.set_structc                 C   r   r   r   r   rE   rE   rG   	is_struct  r   zOmegaConf.is_structrV   c                 C   sP   ddl m} t| |stdt|tr|g}dd | jd|dD }||dS )	z
        Create a masked copy of of this config that contains a subset of the keys

        :param conf: DictConfig object
        :param keys: keys to preserve in the copy
        :return: The masked ``DictConfig`` object.
        r   r   z,masked_copy is only supported for DictConfigc                 S   s   i | ]\}}||qS rE   rE   )r   r   r   rE   rE   rG   
<dictcomp>      z)OmegaConf.masked_copy.<locals>.<dictcomp>F)r   rV   )content)
dictconfigr   rp   r   rq   items_ex)r   rV   r   r   rE   rE   rG   masked_copy  s   	


zOmegaConf.masked_copyr   throw_on_missingenum_to_strstructured_config_modecfgr   r   r   c                C   s6   t | stdtt|  dtj| ||||dS )a  
        Resursively converts an OmegaConf config to a primitive container (dict or list).

        :param cfg: the config to convert
        :param resolve: True to resolve all values
        :param throw_on_missing: When True, raise MissingMandatoryValue if any missing values are present.
            When False (the default), replace missing values with the string "???" in the output container.
        :param enum_to_str: True to convert Enum keys and values to strings
        :param structured_config_mode: Specify how Structured Configs (DictConfigs backed by a dataclass) are handled.
            - By default (``structured_config_mode=SCMode.DICT``) structured configs are converted to plain dicts.
            - If ``structured_config_mode=SCMode.DICT_CONFIG``, structured config nodes will remain as DictConfig.
            - If ``structured_config_mode=SCMode.INSTANTIATE``, this function will instantiate structured configs
              (DictConfigs backed by a dataclass), by creating an instance of the underlying dataclass.

          See also OmegaConf.to_object.
        :return: A dict or a list representing this config as a primitive container.
        z-Input cfg is not an OmegaConf config object ()r   )rN   	is_configr   r,   r   r2   _to_contentr  r   r   r   r   rE   rE   rG   to_container  s   
zOmegaConf.to_containerc                 C   s   t j| dddtjdS )a  
        Resursively converts an OmegaConf config to a primitive container (dict or list).
        Any DictConfig objects backed by dataclasses or attrs classes are instantiated
        as instances of those backing classes.

        This is an alias for OmegaConf.to_container(..., resolve=True, throw_on_missing=True,
                                                    structured_config_mode=SCMode.INSTANTIATE)

        :param cfg: the config to convert
        :return: A dict or a list or dataclass representing this config.
        TFr  )rN   r  r0   INSTANTIATEr  rE   rE   rG   	to_objectE  s   zOmegaConf.to_objectr   c              
   C   sZ   t | tsJ z| |}|d u rW dS t |tsJ | W S  tttfy,   Y dS w NF)rp   r.   
_get_childr/   _is_missingr5   r   AttributeError)r  r   r   rE   rE   rG   
is_missingZ  s   

zOmegaConf.is_missingr   c                 C   sH   |d urt | tsJ | |}n| }|d ur"t |tsJ | S dS r
  )rp   r.   r  r/   _is_interpolation)r   r   r   rE   rE   rG   is_interpolationf  s   zOmegaConf.is_interpolationc                 C      ddl m} t| |S )Nr   r   ) r   rp   )r\   r   rE   rE   rG   is_listr     
zOmegaConf.is_listc                 C   r  )Nr   r   )r  r   rp   )r\   r   rE   rE   rG   is_dictx  r  zOmegaConf.is_dictc                 C   r  )Nr   )r.   )r  r.   rp   )r\   r.   rE   rE   rG   r  ~  r  zOmegaConf.is_configc                 C   s"   |d ur
|  |}n| }t|S r_   )r  rN   _get_obj_type)r\   r   crE   rE   rG   get_type  s   
zOmegaConf.get_typeT)defaultthrow_on_resolution_failurer   r  r  c             
   C   s^   ddl m} z
|| ||||dW S  ty. } zt| |d|t|d W Y d}~dS d}~ww )a  
        :param cfg: Config node to select from
        :param key: Key to select
        :param default: Default value to return if key is not found
        :param throw_on_resolution_failure: Raise an exception if an interpolation
               resolution error occurs, otherwise return None
        :param throw_on_missing: Raise an exception if an attempt to select a missing key (with the value '???')
               is made, otherwise return None
        :return: selected value or None if not found.
        r   )select_value)r  r   r  r  r   N)r   r   r   causemsg)_implr  	Exceptionr   rq   )r  r   r  r  r   r  erE   rE   rG   rT     s   $zOmegaConf.select)r   	force_addr   r"  c             	   C   s  t |}| }tt|d D ]9}|| }t||dd\}	}
t|	tsC|r?t|dd i ||
< W d   n1 s9w   Y  ni ||
< ||
 }q|d }t|ts[J dt|j |}t|t	rft
|}|rnt|ddnt }|j |rt|st|rt|tsJ ||}t|rt|tsJ || 	 W d   dS t|rt|tsJ ||| nt|rt|t
sJ ||| n
J W d   dS W d   dS 1 sw   Y  dS )a5  
        Updates a dot separated key sequence to a value

        :param cfg: input config to update
        :param key: key to update (can be a dot separated path)
        :param value: value to set, if value if a list or a dict it will be merged or set
            depending on merge_config_values
        :param merge: If value is a dict or a list, True (default) to merge
                      into the destination, False to replace the destination.
        :param force_add: insert the entire path regardless of Struct flag or Structured Config nodes.
        r   F)r   r   NzUnexpected type for root: )r+   ranger   _select_onerp   r.   r   r   r   r   intr*   rN   r  r$   r2   r  r   r  rq   __setattr__r  __setitem__)r  r   r   r   r"  splitrootr   k	next_rootkey_lastlast_keyctxr   rE   rE   rG   update  sV   







	
"zOmegaConf.update)r   	sort_keysr2  c                C   s.   t | } tj| |dd}tj|dd|t dS )a  
        returns a yaml dump of this config object.

        :param cfg: Config object, Structured Config type or instance
        :param resolve: if True, will return a string with the interpolations resolved, otherwise
            interpolations are preserved
        :param sort_keys: If True, will print dict keys in sorted order. default False.
        :return: A string containing the yaml representation.
        T)r   r   F)default_flow_styleallow_unicoder2  Dumper)r   rN   r  ry   dumpr   )r  r   r2  	containerrE   rE   rG   r     s   zOmegaConf.to_yamlc                 C   s8   ddl }t| stdt| j d|j|  dS )z
        Resolves all interpolations in the given config object in-place.

        :param cfg: An OmegaConf container (DictConfig, ListConfig)
                    Raises a ValueError if the input object is not an OmegaConf container.
        r   NzInvalid config type (z"), expected an OmegaConf Container)omegaconf._implrN   r  r   r   r   r  _resolve)r  	omegaconfrE   rE   rG   r     s   
zOmegaConf.resolvec                    s2   t | } t dtddf fdd  |  S )aA  
        Returns a set of missing keys in a dotlist style.

        :param cfg: An ``OmegaConf.Container``,
                    or a convertible object via ``OmegaConf.create`` (dict, list, ...).
        :return: set of strings of the missing keys.
        :raises ValueError: On input not representing a config.
        _cfgrB   Nc                    sb   t | trtt| }n| }|D ]}t| |r!| | qt| | r. | |  qd S r_   )	rp   r   r$  r   rN   r  add_get_full_keyr  )r;  itrr   gathermissingsrE   rG   r@     s   
z&OmegaConf.missing_keys.<locals>.gather)r   setr.   r  rE   r?  rG   missing_keys  s
   
zOmegaConf.missing_keysc           
   
   C   s  zddl m} ddlm} ddlm} | tu ri } t| trUt	j
| | d} | d u r3tji ||dW S t| trCtj| d i||dW S t| ttfsLJ tj| ||dW S t| sft| sft| sf| d u rt| |r|| || jj| jj| jj| jj|dW S t| }t|\}}|| ||||dW S t| st| rt| |r|| || jj| jj| jj|d	W S t| }t|}|| ||td
|d	W S t| trtd| j dtdt| j d t y }	 zt!d d d t|	|	d J d }	~	ww )Nr   re   r   r  rk   )r]   r^   )r   r]   ref_typeis_optionalkey_typeelement_typer^   )r   r]   rF  rG  r^   )r   r]   rG  rD  rE  r^   TzInput class 'zK' is not a structured config. did you forget to decorate it as a dataclass?zObject of unsupported type: '')r   r   r   r  r  )"ro   rf   r   r   
listconfigr   r   rp   rq   ry   rz   rN   rP   r}   rU   r%   r  r'   r   rD  optionalrF  rG  r  r   r&   r  r   r   r   r6   r   r4   r   )
r\   r]   r^   rf   r   r   obj_typerF  rG  r!  rE   rE   rG   rc   2  s   






	
	zOmegaConf._create_implr  c                 C   s   t | rt| S | d u rd S t| tr+|  rd S |  rd S t | jjr)| jjS tS t| t	r2t
S t| tr=t|  S t| trHtt| S t| trOtS t| t
tfrXt
S t| S r_   )r'   r   rp   r   _is_noner  r   object_typerU   r   r}   r?   r   _valuer1   r   tuple)r  rE   rE   rG   r    s.   




zOmegaConf._get_obj_typec                 C   s   | t jv r
t j|  S d S r_   )r2   r   )r   rE   rE   rG   r     s   zOmegaConf._get_resolverrB   N)NN)NNN)Fr_   )Hr   
__module____qualname____doc__r[   staticmethodr   r   r2   r	   rq   r   ra   r   r   r   r   rP   r   r   r   rr   rs   r   rz   r   r   r   r   r   r   Resolverr   r   rO   classmethodr   r   r   r   r   r   r   r/   r   r   r.   r   r   r   r0   DICTr  r	  r  r&  r  r  r  r  r   r  rT   r1  r   r   r   rC  rc   r  r   r   rE   rE   rE   rG   rN   q   s2   


,


	


	")Q $&.&&?$
TrN   r   namesrW   c              
   #   sp    t |tr	|g}|d u st |tr|g} fdd|D }z ||  V  W  || d S  || w )Nc                    s   g | ]}  |qS rE   )_get_node_flag)r   r   r   rE   rG   r     r   z!flag_override.<locals>.<listcomp>)rp   rq   r   r   )r   rX  rW   prev_statesrE   rZ  rG   r     s   
r   c              
   c   @    |  d}zt| d | V  W t| | d S t| | w )Nr   F)rY  rN   r   r   
prev_staterE   rE   rG   
read_write     
r_  c              
   c   r\  )Nr   F)rY  rN   r   r]  rE   rE   rG   	open_dict  r`  ra  r]   rE  r   r   rD  c              	   C   sV  t |st|r|tu rt|\}}t||| ||||d}|S t|s3t|s3t|tt	fv rC|tu rCt
|}t||| |||d}|S t|sKt|r^t|\}}t||||| ||d}|S t|rmt||||| d}|S |tksu|d u r~t||| d}|S t|trt|trt|||| |d}|S |tkrt||| |d}|S |tkrt||| |d}|S |tkrt||| |d}|S |tkrt||| |d}|S |tkrt||| |d}|S |tjkrt ||| |d}|S | d ur"| !dd	u r"t|tt	fv r	t||| ||d
}|S t|rt||| ||d
}|S t||| d}|S t"dt#| )N)r   r   r]   rD  rE  rF  rG  )r   r   r]   rE  rG  rD  )rD  rE  r   r   r]   rF  rG  )r   rD  rE  r   r]   )r   r   r]   )	enum_typer   r   r]   rE  )r   r   r]   rE  allow_objectsT)r   r   r]   rD  rE  zUnexpected type annotation: )$r!   r%   r   r   r   r#   r(   r   r}   rO  r   r   r'   r)   r1   r7   rp   
issubclassr   r:   r&  r<   floatr;   r   r8   rq   r>   bytesr9   rr   rs   r=   r   r6   r,   )r]   rE  r   r   rD  rF  rG  r   rE   rE   rG   
_node_wrap  s   TG=3+)!

rg  c                 C   s4   t |tr|| || |S t| ||||dS )N)rD  r]   rE  r   r   )rp   r/   _set_key_set_parentrg  )rD  r   r   rE  r]   rE   rE   rG   _maybe_wrapC  s   
	

rj  Tr  r   throw_on_type_errorc                 C   sD  ddl m} ddlm} |}t| tsJ d|  |  r"d |fS t| |r6t|ts.J | j|dd}n>t| |rrt|tsBJ t	|sY|rVt
d| dt|j d	d }nt|}|d
k si|d t| krld }n| |}nJ |d urt|tsJ | r|rtd| | ||fS |d u st|tsJ ||fS )Nr   r   r  zUnexpected type: F)validate_accesszIndex 'z' (z) is not an intr   zMissing mandatory value: )r   r   rI  r   rp   r.   rL  rq   r  r"   r|   r   r   r&  r   r/   r  r3   r=  )r  r   r   rk  r   r   ret_keyr   rE   rE   rG   r%  Z  s@   

r%  rP  )T)arS  r   r   rt   rv   rr   r   r   collectionsr   
contextlibr   enumr   textwrapr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   ry   r  r   r   r   ro   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   baser-   r.   r/   r0   r1   basecontainerr2   errorsr3   r4   r5   r6   nodesr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   __annotations__rU  rq   rH   rI   rX   rN   r   r   r_  ra  rg  rj  r&  r%  rE   rE   rE   rG   <module>   s    <`,


      I	
a
