
    /_iF                    j   U d dl mZ d dlZd dlZd dlmZmZmZmZ d dl	m
Z
 d dlmZmZmZ d dlmZmZmZmZmZ d dlmZmZ d dlmZ d d	l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+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 erd dl6m7Z7 dZ8de9d<   e8 dZ:de9d<    ed       G d d             Z; ed       G d d             Z<e<e;z  Z=de9d<   e G d d ee>ef                Z?d*d!Z@e G d" d#             ZAe G d$ d%             ZBd+d&ZC	 	 	 	 	 	 	 	 d,d'ZDe G d( d)e4             ZEy)-    )annotationsN)IteratorKeysViewMappingMutableMapping)deepcopy)	dataclassfieldreplace)TYPE_CHECKINGAnyFinal	TypeAliascast)configutil)get_dg_singleton_instance)StreamlitAPIExceptionUnserializableSessionStateError)WidgetState)WidgetStates)get_script_run_ctx)	RegisterWidgetResultTValueFieldName
WidgetArgsWidgetCallbackWidgetMetadatais_array_value_field_nameis_element_idis_keyed_element_id)apply_presenter)QueryParams)	CacheStatCacheStatsProvidergroup_stats)SessionManagerz$$STREAMLIT_INTERNAL_KEYr   STREAMLIT_INTERNAL_KEY_PREFIX_SCRIPT_RUN_WITHOUT_ERRORSSCRIPT_RUN_WITHOUT_ERRORS_KEYT)frozenc                      e Zd ZU dZded<   y)
Serializedz:A widget value that's serialized to a protobuf. Immutable.WidgetStateProtovalueN__name__
__module____qualname____doc____annotations__     d/var/www/html/land_sniper/venv/lib/python3.12/site-packages/streamlit/runtime/state/session_state.pyr-   r-   =   s    Dr7   r-   c                      e Zd ZU dZded<   y)Valuez0A widget value that's not serialized. Immutable.r   r/   Nr0   r6   r7   r8   r:   r:   D   s
    :Jr7   r:   r   WStatec                      e Zd ZU dZ ee      Zded<    ee      Zded<   ddZ	ddZ
dd	Zdd
ZddZddZddZd dZd!dZd"dZd#dZd$dZd%dZ	 	 	 	 	 	 d&dZd'dZd(dZd)dZy)*WStateszA mapping of widget IDs to values. Widget values can be stored in
    serialized or deserialized form, but when values are retrieved from the
    mapping, they'll always be deserialized.
    default_factoryzdict[str, WState]stateszdict[str, WidgetMetadata[Any]]widget_metadatac                ,    t        j                  |       S Nr   repr_selfs    r8   __repr__zWStates.__repr__X       zz$r7   c                |   | j                   j                  |      }|t        |      t        |t              r|j
                  S | j                  j                  |      }|t        |      t        d|j
                  j                  d            }|r|j
                  j                  |      nd}t        |      rt        d|      j                  }n$|dk(  rt        j                  t        d|            }|j                  |      }| j                  t!        ||             t	        |      | j                   |<   |S )zReturn the value of the widget with the given key.
        If the widget's value is currently stored in serialized form, it
        will be deserialized first.
        Nr   r/   r   
json_valuestr)
value_type)r@   getKeyError
isinstancer:   r/   rA   r   
WhichOneof__getattribute__r   datajsonloadsdeserializerset_widget_metadatar   )rG   kwstatemetadatavalue_field_namer/   deserializeds          r8   __getitem__zWStates.__getitem__[   s'   
 #>1+fe$<<
 ''++A. 1+LL##G,
   LL))*:; 	 %%56&++E-JJtE512E,,U3 	  +	
 |,Ar7   c                "    || j                   |<   y rC   r@   rG   rX   vs      r8   __setitem__zWStates.__setitem__   s    Ar7   c                    | j                   |= y rC   r_   rG   rX   s     r8   __delitem__zWStates.__delitem__   s    KKNr7   c                ,    t        | j                        S rC   )lenr@   rF   s    r8   __len__zWStates.__len__   s    4;;r7   c              #  8   K   | j                   E d {    y 7 wrC   r_   rF   s    r8   __iter__zWStates.__iter__   s      ;;s   c                ,    t        | j                        S rC   )r   r@   rF   s    r8   keyszWStates.keys   s    $$r7   c                6    | D ch c]	  }|| |   f c}S c c}w rC   r6   rd   s     r8   itemszWStates.items   s    &*+DG+++s   c                2    | D ch c]  }| |   	 c}S c c}w rC   r6   )rG   wids     r8   valueszWStates.values   s    %)*cS	***s   c                    | j                   j                  |j                          | j                  j                  |j                         y)zCopy all widget values and metadata from 'other' into this mapping,
        overwriting any data in this mapping that's also present in 'other'.
        N)r@   updaterA   rG   others     r8   rs   zWStates.update   s4     	5<<(##E$9$9:r7   c                4    t        |      | |j                  <   y)zGSet a widget's serialized value, overwriting any existing value it has.N)r-   id)rG   widget_states     r8   set_widget_from_protozWStates.set_widget_from_proto   s     *< 8\__r7   c                     t        |      | |<   y)zISet a widget's deserialized value, overwriting any existing value it has.N)r:   r`   s      r8   set_from_valuezWStates.set_from_value   s    (Qr7   c                6    || j                   |j                  <   y)zBSet a widget's metadata, overwriting any existing metadata it has.N)rA   rw   )rG   widget_metas     r8   rW   zWStates.set_widget_metadata   s    /:[^^,r7   c           	         | j                   j                         D ci c].  \  }}t        | j                  j	                  |      ||      s||0 c}}| _         yc c}}w )z&Remove widget state for stale widgets.N)r@   rn   _is_stale_widgetrA   rN   )rG   active_widget_idsfragment_ids_this_runrX   ra   s        r8   remove_stale_widgetszWStates.remove_stale_widgets   sZ     ))+
1#$$((+!% qD
 
s   3Ac                   | j                   j                  |      }|yt        |t              r|j                  S | j
                  j                  |      }|yt               }||_        |j                  }|j                  |j                        }t        |      r)t        ||      }|j                  j                  |       |S |dv r"t        ||t        j                   |             |S |dk(  r|j"                  j%                  |       |S |dk(  r|j&                  j%                  |       |S |dk(  r|j(                  j%                  |       |S ||t        |||       |S )zGet the serialized value of the widget with the given id.

        If the widget doesn't exist, return None. If the widget exists but
        is not in serialized form, it will be serialized first.
        N>   rK   json_trigger_valuefile_uploader_state_valuestring_trigger_valuechat_input_value)r@   rN   rP   r-   r/   rA   r.   rw   rM   
serializerr   getattrrS   extendsetattrrT   dumpsr   CopyFromr   r   )rG   rX   itemrZ   widgetr
   
serializedarrs           r8   get_serializedzWStates.get_serialized   se    {{q!<dJ':: ''++A.!#	##((4
$U+&%(CHHOOJ'   ::FE4::j#9:  11,,55jA  ,,''00<  ((##,,Z8  :#9
 FE:.r7   c                    | j                   D cg c]$  }| j                  |      r| j                  |      & }}t        d|      S c c}w )GReturn a list of serialized widget values for each widget with a value.list[WidgetStateProto])r@   r   r   )rG   	widget_idr@   s      r8   as_widget_stateszWStates.as_widget_states   sS     "[[
""9- 	*
 

 ,f55
s   )Ac                (   | j                   j                  |      }|t        d| d      |j                  }|y|j                  xs d}|j
                  xs i }t               }|r#|j                  d|_         ||i | d|_        y ||i | y)zCall the given widget's callback and return the callback's
        return value. If the widget has no callback, return None.

        If the widget doesn't exist, raise an Exception.
        NzWidget z not found.r6   TF)	rA   rN   RuntimeErrorcallbackcallback_argscallback_kwargsr   fragment_idin_fragment_callback)rG   r   rZ   r   argskwargsctxs          r8   call_callbackzWStates.call_callback  s     ''++I6;?@@$$%%+))/R "8''3'+C$d%f%',C$d%f%r7   NreturnrL   )rX   rL   r   r   )rX   rL   ra   r;   r   None)rX   rL   r   r   r   int)r   zIterator[str])r   zKeysView[str])r   zset[tuple[str, Any]])r   zset[Any])ru   r=   r   r   )rx   r.   r   r   )rX   rL   ra   r   r   r   )r}   WidgetMetadata[Any]r   r   )r   set[str]r   list[str] | Noner   r   )rX   rL   r   zWidgetStateProto | Noner   r   )r   rL   r   r   )r1   r2   r3   r4   r
   dictr@   r5   rA   rH   r]   rb   re   rh   rj   rl   rn   rq   rs   ry   r{   rW   r   r   r   r   r6   r7   r8   r=   r=   N   s    
 !&d ;F;6;D6QO3Q 1f %,+;9;
#
  0
 
	
 .`6&r7   r=   c                    d|  dS )Nzst.session_state has no key "z". Did you forget to initialize it? More info: https://docs.streamlit.io/develop/concepts/architecture/session-state#initializationr6   keys    r8   _missing_key_error_messager     s    
'u -j 	kr7   c                      e Zd ZU dZ ee      Zded<    ee      Zded<   ddZ	ddZ
ddZedd	       Zdd
ZdddZddZddZddZddZy)KeyIdMappera#  A mapping of user-provided keys to element IDs.
    It also maps element IDs to user-provided keys so that this reverse mapping
    does not have to be computed ad-hoc.
    All built-in dict-operations such as setting and deleting expect the key as the
    argument, not the element ID.
    r>   dict[str, str]_key_id_mapping_id_key_mappingc                    || j                   v S rC   )r   rG   r   s     r8   __contains__zKeyIdMapper.__contains__0  s    d****r7   c                @    || j                   |<   || j                  |<   y rC   r   r   rG   r   r   s      r8   rb   zKeyIdMapper.__setitem__3  s"    $-S!*-Y'r7   c                &    | j                  |       y rC   )deleter   s     r8   re   zKeyIdMapper.__delitem__7  s    Cr7   c                    | j                   S rC   r   rF   s    r8   id_key_mappingzKeyIdMapper.id_key_mapping:  s    ###r7   c                p    || _         |j                         D ci c]  \  }}||
 c}}| _        y c c}}w rC   )r   rn   r   )rG   key_id_mappingrX   ra   s       r8   set_key_id_mappingzKeyIdMapper.set_key_id_mapping>  s1    -1?1E1E1GHA1HHs   2Nc                :    | j                   j                  ||      S rC   )r   rN   )rG   r   defaults      r8   get_id_from_keyzKeyIdMapper.get_id_from_keyB  s    ##''W55r7   c                     | j                   |   S rC   r   rG   r   s     r8   get_key_from_idzKeyIdMapper.get_key_from_idE  s    ##I..r7   c                    | j                   j                  |j                          | j                  j                  |j                         y rC   )r   rs   r   rt   s     r8   rs   zKeyIdMapper.updateH  s6    ##E$9$9:##E$9$9:r7   c                l    | j                   j                          | j                  j                          y rC   )r   clearr   rF   s    r8   r   zKeyIdMapper.clearL  s&    ""$""$r7   c                V    | j                   |   }| j                   |= | j                  |= y rC   r   r   s      r8   r   zKeyIdMapper.deleteP  s.    ((-	  %  +r7   r   rL   r   bool)r   rL   r   r   r   r   r   rL   r   r   )r   r   )r   r   r   r   rC   )r   rL   r   
str | Noner   r   )r   rL   r   rL   )ru   r   r   r   r   r   )r1   r2   r3   r4   r
   r   r   r5   r   r   rb   re   propertyr   r   r   r   rs   r   r   r6   r7   r8   r   r   $  si     ',D&AO^A&+D&AO^A+. $ $I6/;%,r7   r   c                     e Zd ZU dZ ee      Zded<    ee      Zded<    ee	      Z
ded<    ee      Zded	<    ee      Zd
ed<   d.dZd/dZd/dZed0d       Zd1dZd2dZd3dZd4dZd5dZd6dZd7dZd8dZd9dZd:dZd;dZd/dZ	 	 	 	 	 	 	 	 	 	 d<dZ 	 	 	 	 	 	 	 	 	 	 d=dZ!	 	 	 	 	 	 	 	 	 	 d=dZ"d>dZ#d?d Z$d/d!Z%d@d"Z&dAd#Z'dBd$Z(dCd%Z)dDd&Z*dEd'Z+	 	 	 	 	 	 dFd(Z,dGd)Z-dHd*Z.d/d+Z/d/d,Z0y-)ISessionStatea  SessionState allows users to store values that persist between app
    reruns.

    Example
    -------
    >>> if "num_script_runs" not in st.session_state:
    ...     st.session_state.num_script_runs = 0
    >>> st.session_state.num_script_runs += 1
    >>> st.write(st.session_state.num_script_runs)  # writes 1

    The next time your script runs, the value of
    st.session_state.num_script_runs will be preserved.
    >>> st.session_state.num_script_runs += 1
    >>> st.write(st.session_state.num_script_runs)  # writes 2
    r>   dict[str, Any]
_old_state_new_session_stater=   _new_widget_stater   _key_id_mapperr#   query_paramsc                ,    t        j                  |       S rC   rD   rF   s    r8   rH   zSessionState.__repr__y  rI   r7   c                    | D ]  }	 | |   | j                   |<    | j                  j                          | j                  j                          y# t        $ r Y Xw xY w)zCopy all current session_state and widget_state values into our
        _old_state dict, and then clear our current session_state and
        widget_state.
        N)r   rO   r   r   r   )rG   
key_or_wids     r8   _compact_statezSessionState._compact_state}  sg    
  	J.2:.>
+	 	%%'$$&   s   A	AAc                    | j                   j                          | j                  j                          | j                  j                          | j                  j                          y)z;Reset self completely, clearing all current and old values.N)r   r   r   r   r   rF   s    r8   r   zSessionState.clear  sH    %%'$$&!!#r7   c                   | j                   j                  }i }| j                         D ]G  }t        |      st	        |      s	| |   ||<   "t        |      s.t	        |      r:	 ||   }| |   ||<   I |S # t        $ r Y Ww xY w)zVThe combined session and widget state, excluding keyless widgets and internal widgets.)r   r   _keysr    _is_internal_keyr!   rO   )rG   wid_key_mapstaterX   r   s        r8   filtered_statezSessionState.filtered_state  s     ))88 "  	A #,<Q,?7a$Q'0@0C%a.C!%aE#J	     s   $A55	B Bc                   | j                   D ch c]  }| j                  |       }}t        | j                  j	                               }| j
                  D ch c]  }| j                  |       }}||z  |z  S c c}w c c}w )zAll keys active in Session State, with widget keys converted
        to widget ids when one is known. (This includes autogenerated keys
        for widgets that don't have user_keys defined, and which aren't
        exposed to user code).
        )r   _get_widget_idsetr   rl   r   )rG   rX   old_keysnew_widget_keysnew_session_state_keyss        r8   r   zSessionState._keys  s     59OODqD''*DDd4499;<,0,C,C"
'(D""
 "
 /),BBB E"
s   A<Bc                    || j                   v S )zCTrue if a value with the given key is in the current session state.r   )rG   user_keys     r8   is_new_state_valuezSessionState.is_new_state_value  s    42222r7   c                "    || j                   |<   y)zReset a new session state value to a given value
        without triggering the "state value cannot be modified" error.
        Nr   )rG   r   r/   s      r8   reset_state_valuezSessionState.reset_state_value  s     -2)r7   c                4    t        | j                               S )zrReturn an iterator over the keys of the SessionState.
        This is a shortcut for `iter(self.keys())`.
        )iterr   rF   s    r8   rj   zSessionState.__iter__  s     DJJL!!r7   c                4    t        | j                               S )z+Return the number of items in SessionState.)rg   r   rF   s    r8   rh   zSessionState.__len__  s    4::<  r7   c                    | j                   j                  }| j                  |      }||v r
||k(  r||   }	 | j                  ||      }|t	        | ||      S |S # t
        $ r t        t        |            w xY wrC   )r   r   r   _getitemr"   rO   r   )rG   r   r   r   
base_values        r8   r]   zSessionState.__getitem__  s    ))88'',	#	S(8i(C	<y#6J (  i<  
  	<5c:;;	<s    A A A8c                >   ||t        d      |	 | j                  |   S |	 | j                  |   S |	 | j                  |   S |	 | j                  |   S t        # t        $ r Y Gw xY w# t        $ r Y Dw xY w# t        $ r Y Aw xY w# t        $ r Y t        w xY w)zGet the value of an entry in Session State, using either the
        user-provided key or a widget id as appropriate for the internal dict
        being accessed.

        At least one of the arguments must have a value.
        zEuser_key and widget_id cannot both be None. This should never happen.)
ValueErrorr   rO   r   r   rG   r   r   s      r8   r   zSessionState._getitem  s     	 1W  ..x88  --i88  y11 x00
 ;         	sE   A A- A< 	B 	A*)A*-	A98A9<	BB	BBc                    t               }|N| j                  j                  |d      }|j                  }|j                  }||v s||v rt        d| d| d      || j                  |<   y)zSet the value of the session_state entry with the given user_key.

        If the key corresponds to a widget or form that's been instantiated
        during the current script run, raise a StreamlitAPIException instead.
        Nz`st.session_state.z0` cannot be modified after the widget with key `z` is instantiated.)r   r   r   widget_ids_this_runform_ids_this_runr   r   )rG   r   r/   r   r   
widget_idsform_idss          r8   rb   zSessionState.__setitem__  s     !"?++;;HdKI00J,,HJ&(h*>+(
 3""*+=? 
 -2)r7   c                   | j                  |      }|| v s|| v st        t        |            || j                  v r| j                  |= || j                  v r| j                  |= || j
                  v r| j
                  j                  |       || j                  v r| j                  |= || j                  v r| j                  |= y y rC   )r   rO   r   r   r   r   r   r   r   s      r8   re   zSessionState.__delitem__#  s    '',	tyD05c:;;$)))'',$//!$$%%%&&s+...&&y1'	* (r7   c                \    |j                   D ]  }| j                  j                  |        y)zHSet the value of all widgets represented in the given WidgetStatesProto.N)widgetsr   ry   )rG   widget_statesr   s      r8   set_widgets_from_protoz#SessionState.set_widgets_from_proto8  s-    "** 	@E""88?	@r7   c                    | j                          | j                          | j                  |       | j                          y)zCalled by ScriptRunner before its script re-runs.

        Update widget data and call callbacks on widgets whose value changed
        between the previous and current script runs.
        N)_reset_triggersr   r  _call_callbacks)rG   latest_widget_statess     r8   on_script_will_rerunz!SessionState.on_script_will_rerun=  s7     	##$89r7   c                   ddl m} | j                  D cg c]I  }| j                  |      r6| j                  j                  j                  |      x}	 |j                  |K }}|D ]  }	 | j                  j                  |         t        | j                  j                  j                               }|D ]  }| j                  j                  j                  |      }|r|j                  7|j                  xs d}|j                   xs i }| j#                  ||||       |j$                  dk(  s{| j'                  ||||        yc c}w # |$ r' t               j                  j                  d       Y w xY w)zFCall callbacks for widgets whose value changed or whose trigger fired.r   RerunExceptionN0Calling st.rerun() within a callback is a no-op.r6   rK   )streamlit.runtime.scriptrunnerr  r   _widget_changedrA   rN   r   r   r   main_dgwarninglistr@   rl   	callbacksr   r   _dispatch_trigger_callbacksrM   _dispatch_json_change_callbacks)rG   r  rp   rZ   &changed_widget_ids_for_single_callbackwidget_ids_to_processr   r   s           r8   r  zSessionState._call_callbacksI  s   A
 --2
##C(!33CCGGLL!!- 2
. 2
 : 	C&&44S9	 !%T%;%;%B%B%G%G%I J( 	RC--==AA#FHx119))/RD--3F ,,S(D&I ""l244S(D&Q	R)2
 " )+33;;Fs   AE	+E(E:9E:c                R   ddl m} t               }|r$|j                  d|_        	  ||i | d|_        y	  ||i | y# |$ r& t               j                  j                  d       Y <w xY w# d|_        w xY w# |$ r& t               j                  j                  d       Y yw xY w)a  Execute a widget callback with fragment-aware context.

        If the widget belongs to a fragment, temporarily marks the current
        script context as being inside a fragment callback to adapt rerun
        semantics. Attempts to call ``st.rerun()`` inside a widget callback are
        converted to a user-visible warning and treated as a no-op.

        Parameters
        ----------
        callback_fn : WidgetCallback
            The user-provided callback to execute.
        cb_metadata : WidgetMetadata[Any]
            Metadata of the widget associated with the callback.
        cb_args : WidgetArgs
            Positional arguments passed to the callback.
        cb_kwargs : dict[str, Any]
            Keyword arguments passed to the callback.
        r   r  NTr  F)r  r  r   r   r   r   r  r  )rG   callback_fncb_metadatacb_args	cb_kwargsr  r   s          r8   _execute_widget_callbackz%SessionState._execute_widget_callbackq  s    2 	B ";**6'+C$1W2	2 ,1(W2	2 " )+33;;F
 ,1( " )+33;;Fs4   A A; (A,)A/ +A,,A/ /	A8;(B&%B&c                   | j                   j                  |      }|sy|j                  r	 | j                   |   }t	        |t
              r|}n|g}|D ]~  }t	        |t              st        d|      j                  d      }	t	        |	t              s@|j                  sM|j                  j                  |	      }
|
k| j                  |
|||        yy# t        $ r d}Y w xY w)a  Dispatch trigger-style callbacks for a widget.

        Handles the JSON trigger aggregator. The JSON payload may be a single
        event dict or a list of event dicts; each event must contain an
        ``"event"`` field that maps to the corresponding callback name in
        ``metadata.callbacks``.

        Examples
        --------
        A component with a "submit" callback:

        >>> metadata.callbacks = {"submit": on_submit}

        The frontend can send a single event payload:

        >>> {"event": "submit", "value": "payload"}

        Or a list of event payloads to be processed in order:

        >>> [{"event": "edit", ...}, {"event": "submit", ...}]

        Parameters
        ----------
        wid : str
            The widget ID.
        metadata : WidgetMetadata[Any]
            Metadata for the widget, including registered callbacks.
        args : WidgetArgs
            Positional arguments forwarded to the callback.
        kwargs : dict[str, Any]
            Keyword arguments forwarded to the callback.
        NzMapping[str, object]event)r   r   r   rO   rP   r  r   r   rN   rL   r  r  )rG   rp   rZ   r   r   widget_proto_stater\   payloadspayload
event_namecbs              r8   r  z(SessionState._dispatch_trigger_callbacks  s    N "33BB3G! 00$#55c:
 ,-'(># Vgt,!%&<g!F!J!J7!SJ!*c2x7I7I%//33J?> 99"hfUV 1  $#$s   C C$#C$c                   |j                   sy	 | j                  j                  |      }| j                  j                  |      }dd} ||      } ||      }	|s|	r|j                         |	j                         z  }
|
D ch c](  }|	j                  |      |j                  |      k7  s'|* }}|D ]4  }|j                   j                  |      }|!| j                  ||||       6 yy# t        $ r d}Y w xY wc c}w )a8  Dispatch change callbacks for JSON-valued widgets.

        Computes a shallow diff between the new and old JSON maps and invokes
        callbacks for keys that changed or were added/removed.

        Parameters
        ----------
        wid : str
            The widget ID.
        metadata : WidgetMetadata[Any]
            Metadata for the widget, including registered callbacks.
        args : WidgetArgs
            Positional arguments forwarded to the callback.
        kwargs : dict[str, Any]
            Keyword arguments forwarded to the callback.
        Nc                    t        | t              si S t        d|       } t        | j	                               dhk(  r,| j                  d      }t        |t              rt        |      S t        |       S )Nr   r/   )rP   r   r   r   rl   rN   )objr/   s     r8   unwrapz<SessionState._dispatch_json_change_callbacks.<locals>.unwrap  s^    c4(	'-C388:7)+(eT*;&9r7   )r(  objectr   zdict[str, object])r  r   rN   rO   r   rl   r  )rG   rp   rZ   r   r   new_valold_valr)  new_mapold_mapall_keysrX   changed_keysr   r%  s                  r8   r  z,SessionState._dispatch_json_change_callbacks  s    . !!	,,005G //%%c*
	 //g||~6H'/T!7;;q>W[[QR^3SATLT# N''++C0>11"hfMN	 '  	G	* Us   C, (C=+C=,C:9C:c                |    | j                   j                  |      }| j                  j                  |      }||k7  }|S )zuTrue if the given widget's value changed between the previous
        script run and the current script run.
        )r   rN   r   )rG   r   	new_value	old_valuechangeds        r8   r  zSessionState._widget_changed  s=     **..y9	OO''	2	!Y.r7   c                F    | j                          | j                  |       y)a  Called by ScriptRunner after its script finishes running.
         Updates widgets to prepare for the next script run.

        Parameters
        ----------
        widget_ids_this_run: set[str]
            The IDs of the widgets that were accessed during the script
            run. Any widget state whose ID does *not* appear in this set
            is considered "stale" and will be removed.
        N)r  _remove_stale_widgets)rG   r   s     r8   on_script_finishedzSessionState.on_script_finished   s     	""#67r7   c                    | j                   D ]y  }| j                   j                  j                  |      }|+|j                  dk(  rt	        d      | j                   |<   S|j                  dv sbt	        d      | j                   |<   { | j
                  D ]g  }| j                   j                  j                  |      }|+|j                  dk(  rd| j
                  |<   J|j                  dv sYd| j
                  |<   i y)z8Set all trigger values in our state dictionary to False.Ntrigger_valueF>   r   r   r   )r   rA   rN   rM   r:   r   )rG   state_idrZ   s      r8   r  zSessionState._reset_triggers.  s    .. 
	CH--==AA(KH#&&/97<U|D**84(( - 
 8=T{D**84
	C  
	5H--==AA(KH#&&/905DOOH-(( - 
 15DOOH-
	5r7   c           	     f   t               }|y| j                  j                  ||j                         | j                  j                         D ci c]M  \  }}t        |      r:t        | j                  j                  j                  |      ||j                        s||O c}}| _        yc c}}w )zHRemove widget state for widgets whose ids aren't in `active_widget_ids`.N)
r   r   r   r   r   rn   r    r   rA   rN   )rG   r   r   rX   ra   s        r8   r6  z"SessionState._remove_stale_widgetsH  s     ";33%%	
 --/
1!!$'**::>>qA%--	 qD
 
s   AB-c                L    | j                   j                  j                  |      S )zBReturn the metadata for a widget id from the current widget state.)r   rA   rN   r   s     r8   _get_widget_metadataz!SessionState._get_widget_metadatab  s    %%5599)DDr7   c                N    |j                   }|| j                  j                  |<   y)zSet a widget's metadata.N)rw   r   rA   )rG   rA   r   s      r8   _set_widget_metadataz!SessionState._set_widget_metadataf  s#    #&&	<K..y9r7   c                6    | j                   j                         S )r   )r   r   rF   s    r8   get_widget_stateszSessionState.get_widget_statesk  s    %%6688r7   c                N    t        d| j                  j                  ||            S )znTurns a value that might be a widget id or a user provided key into
        an appropriate widget id.
        rL   )r   r   r   rd   s     r8   r   zSessionState._get_widget_ido  s$     E4..>>q!DEEr7   c                "    || j                   |<   y rC   )r   r   s      r8   _set_key_widget_mappingz$SessionState._set_key_widget_mappingw  s    (1H%r7   c                d   |j                   }| j                  |       || j                  ||       || vr?||| vr9|j                  }t	         |d            }| j
                  j                  ||       t        d| |         }t	        |      }|duxr | j                  |      }t        ||      S )a  Register a widget with the SessionState.

        Returns
        -------
        RegisterWidgetResult[T]
            Contains the widget's current value, and a bool that will be True
            if the frontend needs to be updated with the current value.
        Nr   )
rw   r?  rD  rV   r   r   r{   r   r   r   )rG   rZ   r   r   rV   initial_widget_valuewidget_valuewidget_value_changeds           r8   register_widgetzSessionState.register_widgetz  s     KK	!!(+((H=D h&6($:N $00L#+L,>#? ""11)=QR
 Ci1-  (t3  
8O8O9
 $L2FGGr7   c                .    	 | |    y# t         $ r Y yw xY w)NTF)rO   r   s     r8   r   zSessionState.__contains__  s'    	I   		s    	c                :    ddl m} t        dd ||             }|gS )Nr   )asizeofst_session_state ) streamlit.vendor.pympler.asizeofrL  r$   )rG   rL  stats      r8   	get_statszSessionState.get_stats  s    <+R?vr7   c                    | D ]  }	 t        j                  | |           y# t        $ r&}dt        | |          d| d}t	        |      |d}~ww xY w)zVerify that everything added to session state can be serialized.
        We use pickleability as the metric for serializability, and test for
        pickleability by just trying it.
        z%Cannot serialize the value (of type `z`) of 'aV  ' in st.session_state. Streamlit has been configured to use [pickle](https://docs.python.org/3/library/pickle.html) to serialize session_state values. Please convert the value to a pickle-serializable type. To learn more about this behavior, see [our docs](https://docs.streamlit.io/knowledge-base/using-streamlit/serializable-session-state).N)pickler   	Exceptiontyper   )rG   rX   eerr_msgs       r8   _check_serializablez SessionState._check_serializable  sw    
  	FAFT!W%	F  	F;DaM?'RSQT U{ {  6g>AE	Fs   "	A!AAc                P    t        j                  d      r| j                          yy)zVerify that session state can be serialized, if the relevant config
        option is set.

        See `_check_serializable` for details.
        z&runner.enforceSerializableSessionStateN)r   
get_optionrX  rF   s    r8   maybe_check_serializablez%SessionState.maybe_check_serializable  s%     EF$$& Gr7   Nr   r   )r   r   )r   r   )r   rL   r   r   )r   rL   r/   z
Any | Noner   r   )r   zIterator[Any]r   )r   rL   r   r   )r   r   r   r   r   r   )r   rL   r/   r   r   r   r   )r  WidgetStatesProtor   r   )r	  r\  r   r   )
r  r   r  r   r  r   r  r   r   r   )
rp   rL   rZ   r   r   r   r   r   r   r   )r   rL   r   r   )r   r   r   r   )r   r   r   r   )r   rL   r   WidgetMetadata[Any] | None)rA   r   r   r   r   )rX   rL   r   rL   )r   rL   r   rL   r   r   )rZ   zWidgetMetadata[T]r   r   r   zRegisterWidgetResult[T]r   r   zlist[CacheStat])1r1   r2   r3   r4   r
   r   r   r5   r   r=   r   r   r   r#   r   rH   r   r   r   r   r   r   r   rj   rh   r]   r   rb   re   r  r
  r  r  r  r  r  r7  r  r6  r=  r?  rA  r   rD  rI  r   rQ  rX  r[  r6   r7   r8   r   r   V  s   " "'t!<J< */t)DD "'w!?w? #("DNKD !&k BL+B '$  4C32"!<",\2*+*@

&RP,#, ), 	,
 ", 
,\>V>V &>V 	>V
 >V 
>V@6N6N &6N 	6N
 6N 
6Np854
4EL
9F2%H)%H5?%H	 %HNF&'r7   r   c                ,    | j                  t              S rC   )
startswithr(   r   s    r8   r   r     s    >>788r7   c                N    | sy| j                   |v xs |xr | j                  |v S )NT)rw   r   )rZ   r   r   s      r8   r   r     s=    
  	(( 	Y!Wh&:&:BW&W r7   c                       e Zd ZU ded<   ddZy)SessionStateStatProviderr'   _session_mgrc                    g }| j                   j                         D ]7  }|j                  j                  }|j	                  |j                                9 t        |      S rC   )rd  list_active_sessionssessionsession_stater   rQ  r&   )rG   statssession_inforh  s       r8   rQ  z"SessionStateStatProvider.get_stats  sX    !# --BBD 	4L(00>>MLL0023	4 5!!r7   Nr^  )r1   r2   r3   r5   rQ  r6   r7   r8   rc  rc    s      "r7   rc  )r   rL   r   rL   r   )rZ   r]  r   r   r   r   r   r   )F
__future__r   rT   rS  collections.abcr   r   r   r   copyr   dataclassesr	   r
   r   typingr   r   r   r   r   	streamlitr   r   $streamlit.delta_generator_singletonsr   streamlit.errorsr   r    streamlit.proto.WidgetStates_pb2r   r.   r   r\  7streamlit.runtime.scriptrunner_utils.script_run_contextr   streamlit.runtime.state.commonr   r   r   r   r   r   r   r    r!   $streamlit.runtime.state.presentationr"   $streamlit.runtime.state.query_paramsr#   streamlit.runtime.statsr$   r%   r&   !streamlit.runtime.session_managerr'   r(   r5   r*   r-   r:   r;   rL   r=   r   r   r   r   r   rc  r6   r7   r8   <module>rz     s   #   G G  1 1  # J S L N V
 
 
 A < N N@ (B u A$%%?@ u 
 $   $   J&	 & K&nS#X& K& K&\ ., ., .,b s	' s	' s	'l9( , 
	" "1 " "r7   