
    g3fi]                       U d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZmZmZ ddl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mZ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+ erddl,m-Z-  G d dee(e)f         Z. G d de.e(e)f         Z/ G d de0ejb                        Z2 e       Z3de4d<    ejj                         Z6 G d de.e(e)f         Z7ddZ8	 	 	 	 	 	 ddZ9	 	 	 	 	 	 ddZ:y)z6`Runnable` objects that can be dynamically configured.    )annotationsN)abstractmethod)AsyncIteratorCallableIteratorSequence)wraps)TYPE_CHECKINGAnycast)WeakValueDictionary)	BaseModel
ConfigDict)override)RunnableRunnableSerializable)RunnableConfigensure_configget_config_listget_executor_for_configmerge_configs)	AnyConfigurableFieldConfigurableFieldConfigurableFieldMultiOptionConfigurableFieldSingleOptionConfigurableFieldSpecInputOutputgather_with_concurrencyget_unique_config_specs)Graphc                     e Zd ZU dZded<   	 dZded<   	  ed      Zee	dd	              Z
ee	dd
              Zee	d d              Zee	d!d              Ze	d"d#d       Ze		 d"	 	 	 d#d       Ze	d"d$d       Ze		 d"	 	 	 	 	 d%d       Z	 d"	 	 	 d&dZe	 d"	 	 	 d&d       Ze		 d"	 	 	 	 	 	 	 d'd       Ze		 d"	 	 	 	 	 	 	 d'd       Ze		 d"dd	 	 	 	 	 	 	 	 	 d(d       Ze		 d"dd	 	 	 	 	 	 	 	 	 d(d       Ze		 d"	 	 	 	 	 	 	 d)d       Ze		 d"	 	 	 	 	 	 	 d*d       Ze		 d"	 	 	 	 	 	 	 d+d       Ze		 d"	 	 	 	 	 	 	 d,d       Ze	d-d       Zy).DynamicRunnablezSerializable `Runnable` that can be dynamically configured.

    A `DynamicRunnable` should be initiated using the `configurable_fields` or
    `configurable_alternatives` method of a `Runnable`.
    #RunnableSerializable[Input, Output]defaultNRunnableConfig | NoneconfigT)arbitrary_types_allowedc                     y)z,Return `True` as this class is serializable.T clss    c/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_core/runnables/configurable.pyis_lc_serializablez"DynamicRunnable.is_lc_serializableB   s         c                
    g dS )zwGet the namespace of the LangChain object.

        Returns:
            `["langchain", "schema", "runnable"]`
        )	langchainschemarunnabler*   r+   s    r-   get_lc_namespacez DynamicRunnable.get_lc_namespaceH   s
     32r/   c                .    | j                   j                  S N)r%   	InputTypeselfs    r-   r7   zDynamicRunnable.InputTypeR   s     ||%%%r/   c                .    | j                   j                  S r6   )r%   
OutputTyper8   s    r-   r;   zDynamicRunnable.OutputTypeW   s     ||&&&r/   c                L    | j                  |      \  }}|j                  |      S r6   )prepareget_input_schemar9   r'   r3   s      r-   r>   z DynamicRunnable.get_input_schema\   s&    <</&((00r/   c                L    | j                  |      \  }}|j                  |      S r6   )r=   get_output_schemar?   s      r-   rA   z!DynamicRunnable.get_output_schemaa   s(      <</&))&11r/   c                L    | j                  |      \  }}|j                  |      S r6   )r=   	get_graphr?   s      r-   rC   zDynamicRunnable.get_graphh   s&    <</&!!&))r/   c                l     | j                   di i | j                  dt        t        ||            iS )Nr'   r*   )	__class____dict__r   r   )r9   r'   kwargss      r-   with_configzDynamicRunnable.with_configm   s;     t~~ 
WW-ff8U*VW
 	
r/   c                    | }t        |t              r9|j                  t        |j                  |            \  }}t        |t              r9|t        d|      fS )zPrepare the `Runnable` for invocation.

        Args:
            config: The configuration to use.

        Returns:
            The prepared `Runnable` and configuration.
        r   )
isinstancer#   _preparer   r'   r   r?   s      r-   r=   zDynamicRunnable.preparex   sS     -1?3'00xPV1WXHf ?3.777r/   c                     y r6   r*   )r9   r'   s     r-   rK   zDynamicRunnable._prepare   s     :=r/   c                R    | j                  |      \  }} |j                  ||fi |S r6   )r=   invoker9   inputr'   rG   r3   s        r-   rN   zDynamicRunnable.invoke   s/      <</&xuf777r/   c                n   K   | j                  |      \  }} |j                  ||fi | d {   S 7 wr6   )r=   ainvokerO   s        r-   rR   zDynamicRunnable.ainvoke   s;       <</&%X%%eV>v>>>>s   ,535F)return_exceptionsc                   t        |t        |            }|D cg c]  } j                  |       }}t         fd|D              r3  j                  j
                  ||D cg c]  \  }}|	 c}}fdiS |sg S 	 	 	 	 	 	 dfd}	t        |      dk(  rt        d |	|d   |d         g      S t        |d         5 }
t        dt        |
j                  |	||                  cd d d        S c c}w c c}}w # 1 sw Y   y xY w)Nc              3  @   K   | ]  \  }}|j                   u   y wr6   r%   .0p_r9   s      r-   	<genexpr>z(DynamicRunnable.batch.<locals>.<genexpr>        6TQqDLL 6   rS   c                    | \  }}r	  |j                   ||fi S  |j                   ||fi S # t        $ r}|cY d }~S d }~ww xY wr6   )rN   	Exceptionpreparedinput_boundr'   erG   rS   s        r-   rN   z%DynamicRunnable.batch.<locals>.invoke   s_     %ME6 '5<<A&AA $u||FF=f== ! Hs   2 	AAAA   list[Output]r   ra   .tuple[Runnable[Input, Output], RunnableConfig]rb   r   returnzOutput | Exception)
r   lenr=   allr%   batchr   r   listmap)r9   inputsr'   rS   rG   configscra   rZ   rN   executors   `  ``      r-   rl   zDynamicRunnable.batch   s)    "&#f+6-45DLLO556X66%4<<%%'(tq!( #4 	  I	>D	>	>  	> v;!VAY)G(HII$WQZ0 	VHX\\&(F-S(TU	V 	V= 6
 )2	V 	Vs   C5'C:&D  D	c          	        K   t        |t        |            }|D cg c]  } j                  |       }}t         fd|D              r;  j                  j
                  ||D cg c]  \  }}|	 c}}fdi d {   S |sg S 	 	 	 	 	 	 dfd}	t        |	||      }
t        |d   j                  d      g|
  d {   S c c}w c c}}w 7 S7 w)Nc              3  @   K   | ]  \  }}|j                   u   y wr6   rV   rW   s      r-   r[   z)DynamicRunnable.abatch.<locals>.<genexpr>   r\   r]   rS   c                   K   | \  }}r	  |j                   ||fi  d {   S  |j                   ||fi  d {   S 7  # t        $ r}|cY d }~S d }~ww xY w7 wr6   )rR   r_   r`   s        r-   rR   z'DynamicRunnable.abatch.<locals>.ainvoke   ss      %ME6 !.vv!H!HHH +U]]66DVDDD	 I  H EsN   A A AA A A A A 	AAAA AA r   max_concurrencyrg   )	r   rj   r=   rk   r%   abatchrn   r   get)r9   ro   r'   rS   rG   rp   rq   ra   rZ   rR   coross   `  ``      r-   rw   zDynamicRunnable.abatch   s      "&#f+6-45DLLO556X66,,,'(tq!( #4 	   I	ED	E	E  	E GXv.,WQZ^^<M-NWQVWWW7 6
 )0 Xs:   CC2C)C5CCACCCCc                R    | j                  |      \  }} |j                  ||fi |S r6   )r=   streamrO   s        r-   r{   zDynamicRunnable.stream   s/      <</&xuf777r/   c                  K   | j                  |      \  }} |j                  ||fi |2 3 d {   }| 7 
6 y wr6   )r=   astreamr9   rP   r'   rG   r3   chunks         r-   r}   zDynamicRunnable.astream   sL       <</&+8++E6DVD 	 	%K	D   )><:<><>c                R    | j                  |      \  }} |j                  ||fi |S r6   )r=   	transformrO   s        r-   r   zDynamicRunnable.transform  s1      <</&!x!!%:6::r/   c                  K   | j                  |      \  }} |j                  ||fi |2 3 d {   }| 7 
6 y wr6   )r=   
atransformr~   s         r-   r   zDynamicRunnable.atransform  sL       <</&.8..ufGG 	 	%K	Gr   c                ~     t         j                        t              rt              d fd       }|S S )Nc                 t   |j                         D ]n  \  }}|dk(  st        |t              sd|v s"t        |d   t              s6
j                  t	        d|            \  }}i |d|i} t        |	      | i |c S  t        |       D ]p  \  }}t        |t              sd|v st        |d   t              s0
j                  t	        d|            \  }}t        |       }|||<    t        |	      |i |c S  
j                  r%
j                         \  }} t        |	      | i |S  | i |S )Nr'   configurabler   )	itemsrJ   dictr=   r   getattr	enumeraterm   r'   )argsrG   keyargr3   r'   idxargslattrnamer9   s           r-   wrapperz,DynamicRunnable.__getattr__.<locals>.wrapper  sO    & HHCh"3-*c1&s>':DA+/<<=Ms8S+T(&!=F!=Hf!=6wx6GGGH !*$ 	IHC"3-*c1&s>':DA+/<<=Ms8S+T(& $T
%+c
6wx6HHH	I ;;'+||~$Hf278T2DCFCCT,V,,r/   )r   r   rG   r   ri   r   )r   r%   callabler	   )r9   r   r   r   s   `` @r-   __getattr__zDynamicRunnable.__getattr__  s<    t||T*D>4[- -8 Nr/   )ri   bool)ri   z	list[str])ri   ztype[Input])ri   ztype[Output]r6   )r'   r&   ri   ztype[BaseModel])r'   r&   ri   r!   )r'   r&   rG   r   ri   zRunnable[Input, Output]r'   r&   ri   rh   )rP   r   r'   r&   rG   r   ri   r   )
ro   zlist[Input]r'   z,RunnableConfig | list[RunnableConfig] | NonerS   r   rG   
Any | Noneri   rf   )rP   r   r'   r&   rG   r   ri   Iterator[Output])rP   r   r'   r&   rG   r   ri   AsyncIterator[Output])rP   zIterator[Input]r'   r&   rG   r   ri   r   )rP   zAsyncIterator[Input]r'   r&   rG   r   ri   r   )r   strri   r   )__name__
__module____qualname____doc____annotations__r'   r   model_configclassmethodr   r.   r4   propertyr7   r;   r>   rA   rC   rH   r=   r   rK   rN   rR   rl   rw   r{   r}   r   r   r   r*   r/   r-   r#   r#   1   s    10($(F!(# $L    3  3 &  & '  ' 1 1 .22+2	2 2 * *  )-
%
 	

 
!
 
 /38+8	78  .2=+=	7= = <@88$98LO8	8 8 <@??$9?LO?	? ?  @D(V
 #((V(V =(V
  (V (V 
(V (VT  @D$X
 #($X$X =$X
  $X $X 
$X $XL  )-88 &8 	8
 
8 8  )- & 	
 
   )-;; &; 	;
 
; ;  )-# & 	
 
  # #r/   r#   c                  \    e Zd ZU dZded<   	 edd       Ze	 	 	 	 d	d       Z	 d
	 	 	 ddZ	y)RunnableConfigurableFieldsa  `Runnable` that can be dynamically configured.

    A `RunnableConfigurableFields` should be initiated using the
    `configurable_fields` method of a `Runnable`.

    Here is an example of using a `RunnableConfigurableFields` with LLMs:

        ```python
        from langchain_core.prompts import PromptTemplate
        from langchain_core.runnables import ConfigurableField
        from langchain_openai import ChatOpenAI

        model = ChatOpenAI(temperature=0).configurable_fields(
            temperature=ConfigurableField(
                id="temperature",
                name="LLM Temperature",
                description="The temperature of the LLM",
            )
        )
        # This creates a RunnableConfigurableFields for a chat model.

        # When invoking the created RunnableSequence, you can pass in the
        # value for your ConfigurableField's id which in this case
        # will be change in temperature

        prompt = PromptTemplate.from_template("Pick a random number above {x}")
        chain = prompt | model

        chain.invoke({"x": 0})
        chain.invoke({"x": 0}, config={"configurable": {"temperature": 0.9}})
        ```

    Here is an example of using a `RunnableConfigurableFields` with `HubRunnables`:

        ```python
        from langchain_core.prompts import PromptTemplate
        from langchain_core.runnables import ConfigurableField
        from langchain_openai import ChatOpenAI
        from langchain.runnables.hub import HubRunnable

        prompt = HubRunnable("rlm/rag-prompt").configurable_fields(
            owner_repo_commit=ConfigurableField(
                id="hub_commit",
                name="Hub Commit",
                description="The Hub commit to pull from",
            )
        )

        prompt.invoke({"question": "foo", "context": "bar"})

        # Invoking prompt with `with_config` method

        prompt.invoke(
            {"question": "foo", "context": "bar"},
            config={"configurable": {"hub_commit": "rlm/rag-prompt-llama"}},
        )
        ```
    zdict[str, AnyConfigurableField]fieldsc                j   g }t        | j                        j                  }| j                  j	                         D ]  \  }}t        |t              r|j                  t        |j                  |j                  |j                  xs ||   j                  |j                  xs ||   j                  t        | j                  |      |j                               |j                  t        |||   j                                |j!                  | j                  j"                         t%        |      S )zGet the configuration specs for the `RunnableConfigurableFields`.

        Returns:
            The configuration specs.
        idr   description
annotationr%   	is_shared)typer%   model_fieldsr   r   rJ   r   appendr   r   r   r   r   r   r   make_options_specextendconfig_specsr    )r9   r   default_fields
field_namespecs        r-   r   z'RunnableConfigurableFields.config_specs}  s    dll+88 $ 1 1 3 	J$ 12##)77!YY$($4$4 %B)*5AA#'?? $A)*5@@ 'j A"&..	 ##%dN:,F,R,RS	& 	DLL556&|44r/   c                V     | j                   j                  di i | j                  |S )Nr*   )r%   configurable_fieldsr   r9   rG   s     r-   r   z.RunnableConfigurableFields.configurable_fields  s-     0t||//L2KT[[2KF2KLLr/   Nc                   t        |      }| j                  j                         D ci c]  \  }}|j                  ||f }}}|j	                  di       j                         D ci c](  \  }}||v rt        ||   d   t              r	||   d   |* }}}| j                  j                         D ci c]\  \  }}t        |t              rG||j                  |j	                  di       j	                  |j                        xs |j                     ^ }}}| j                  j                         D 	ci c]g  \  }}t        |t              rR||j	                  di       j	                  |j                  |j                        D 	cg c]  }	|j                  |	    c}	i }
}}}	i |||
}|rz| j                  j                  j                         D ci c])  \  }}|t        | j                        j                  v r||+ }}} | j                  j                  di i |||fS | j                  |fS c c}}w c c}}w c c}}w c c}	w c c}	}}w c c}}w )Nr   re   r   r*   )r   r   r   r   rx   rJ   r   r   optionsr%   r   rF   r   r   rE   )r9   r'   r   r   specs_by_idkvr   configurable_single_optionsoconfigurable_multi_optionsr   init_paramss                r-   rK   z#RunnableConfigurableFields._prepare  sl    v&=A[[=N=N=PQ	Ttwwd+QQ 

>26<<>
1KJ{1~a/@BS$T N1q 
 
 ))+'
1!:; qyy&**^R8<<QTTBOaiiQQ'
# '
 ))+&
 &

 1!9: NB7;;ADD!))L 		! &
" &

!
)
 )
  !LL11779AqT\\*777 1K  '&&I)HK)H<)HI  f%%G R

'
&
s1   H9(-H?5A!I7AIII.IIri   zlist[ConfigurableFieldSpec]rG   r   ri   r$   r6   r   )
r   r   r   r   r   r   r   r   r   rK   r*   r/   r-   r   r   >  sh    9v ,+)5 5@ M,M	,M M /3'&+'&	7'&r/   r   c                      e Zd ZdZy)StrEnumzString enum.N)r   r   r   r   r*   r/   r-   r   r     s    r/   r   ztWeakValueDictionary[ConfigurableFieldSingleOption | ConfigurableFieldMultiOption | ConfigurableField, type[StrEnum]]_enums_for_specc                      e Zd ZU dZded<   	 ded<   	 dZded<   	 d	ed
<   	 eedd              Ze	 	 	 	 dd       Z		 d	 	 	 ddZ
y) RunnableConfigurableAlternativesa  `Runnable` that can be dynamically configured.

    A `RunnableConfigurableAlternatives` should be initiated using the
    `configurable_alternatives` method of a `Runnable` or can be
    initiated directly as well.

    Here is an example of using a `RunnableConfigurableAlternatives` that uses
    alternative prompts to illustrate its functionality:

        ```python
        from langchain_core.runnables import ConfigurableField
        from langchain_openai import ChatOpenAI

        # This creates a RunnableConfigurableAlternatives for Prompt Runnable
        # with two alternatives.
        prompt = PromptTemplate.from_template(
            "Tell me a joke about {topic}"
        ).configurable_alternatives(
            ConfigurableField(id="prompt"),
            default_key="joke",
            poem=PromptTemplate.from_template("Write a short poem about {topic}"),
        )

        # When invoking the created RunnableSequence, you can pass in the
        # value for your ConfigurableField's id which in this case will either be
        # `joke` or `poem`.
        chain = prompt | ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)

        # The `with_config` method brings in the desired Prompt Runnable in your
        # Runnable Sequence.
        chain.with_config(configurable={"prompt": "poem"}).invoke({"topic": "bears"})
        ```

    Equivalently, you can initialize `RunnableConfigurableAlternatives` directly
    and use in LCEL in the same way:

        ```python
        from langchain_core.runnables import ConfigurableField
        from langchain_core.runnables.configurable import (
            RunnableConfigurableAlternatives,
        )
        from langchain_openai import ChatOpenAI

        prompt = RunnableConfigurableAlternatives(
            which=ConfigurableField(id="prompt"),
            default=PromptTemplate.from_template("Tell me a joke about {topic}"),
            default_key="joke",
            prefix_keys=False,
            alternatives={
                "poem": PromptTemplate.from_template("Write a short poem about {topic}")
            },
        )
        chain = prompt | ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
        chain.with_config(configurable={"prompt": "poem"}).invoke({"topic": "bears"})
        ```
    r   whichzJdict[str, Runnable[Input, Output] | Callable[[], Runnable[Input, Output]]]alternativesr%   r   default_keyr   prefix_keysc                   t         5  t        j                  | j                        x}rnt	        | j                  j
                  xs | j                  j                  d g t        | j                  j                               | j                  D              }t        d|      t        | j                  <   d d d        t        t        | j                  j                  | j                  j
                  | j                  j                  | j                  | j                  j                        g| j                   rQ| j"                  j$                  D cg c]1  }t'        || j                  j                   d| j                         3 c}n| j"                  j$                  z   | j                  j)                         D cg c]Y  \  }}t+        |t,              rD|j$                  D ]5  }| j                   r%t'        || j                  j                   d|       n|7 [ c}}}z         S # 1 sw Y   uxY wc c}w c c}}}w )Nc              3  $   K   | ]  }||f 
 y wr6   r*   rX   r   s     r-   r[   z@RunnableConfigurableAlternatives.config_specs.<locals>.<genexpr>0  s       A   type[StrEnum]r   ==)_enums_for_spec_lockr   rx   r   r   r   r   rm   r   keysr   r   r    r   r   r   r   r%   r   prefix_config_specr   rJ   r   )r9   
which_enumsalt_keyalts        r-   r   z-RunnableConfigurableAlternatives.config_specs'  s    " 	P,00<<z<$JJOO4tzz}}!T4(9(9(>(>(@#A!T4CSCS!T
 /3?J.O

+	P ' &zz}} $

 6 6) ,,"jj22	  ## "\\66 'qTZZ]]O2d>N>N=O*PQ
 \\..#4 %)$5$5$;$;$=	 	 !GSc#78))	  '' 'qTZZ]]O2gY*GH		) 
  	
	P 	P4	s   B.H(6H5
?AH:(H2c                    | j                  | j                   | j                  j                  di || j                  | j
                  | j                        S )N)r   r%   r   r   r   r*   )rE   r   r%   r   r   r   r   r   s     r-   r   z4RunnableConfigurableAlternatives.configurable_fieldsX  sS     ~~**4DLL44>v>**((((  
 	
r/   Nc                Z   t        |      }|j                  di       j                  | j                  j                  | j                        }| j
                  rht        di |d|j                  di       j                         D ci c],  \  }}t        || j                  j                   d| d      |. c}}i      }|| j                  k(  r| j                  |fS || j                  v r,| j                  |   }t        |t              r||fS  |       |fS d| }t        |      c c}}w )Nr   r   r   /zUnknown alternative: )r   rx   r   r   r   r   r   r   _strremoveprefixr%   r   rJ   r   
ValueError)r9   r'   r   r   r   r   msgs          r-   rK   z)RunnableConfigurableAlternatives._prepared  s+    v&

>2.224::==$BRBRS "$*JJ~r$B$H$H$J% Aq )tzz}}oRwa,HI1L%	F D$$$LL&))D%%%##E*C#x(V}$E6?"%eW-o%s   1D'r   r   r6   r   )r   r   r   r   r   r   r   r   r   r   rK   r*   r/   r-   r   r     s    7r H  + K 7
 -
  -
^ 	
,	
	,	
 	
 /3+	7r/   r   c                N    | j                  |      r| j                  |dd      S | S )z6`str.removeprefix()` is only available in Python 3.9+. re   )
startswithreplace)r   prefixs     r-   r   r     s%    '(||F';199VR#BBr/   c                    | j                   sRt        | d| j                   | j                  | j                  | j
                  | j                  | j                         S | S )aa  Prefix the id of a `ConfigurableFieldSpec`.

    This is useful when a `RunnableConfigurableAlternatives` is used as a
    `ConfigurableField` of another `RunnableConfigurableAlternatives`.

    Args:
        spec: The `ConfigurableFieldSpec` to prefix.
        prefix: The prefix to add.

    Returns:
        The prefixed `ConfigurableFieldSpec`.
    r   r   )r   r   r   r   r   r   r%   )r   r   s     r-   r   r     s[    0 ~~ 	477)$((LLnn	
 r/   c           	     p   t         5  t        j                  |       x}rn_t        | j                  xs | j
                  d t        | j                  j                               D              }t        d|      t        | <   ddd       t        | t              rGt        | j
                  | j                  | j                  xs || j                  | j                        S t        | j
                  | j                  | j                  xs |t            | j                  | j                        S # 1 sw Y   xY w)af  Make options spec.

    Make a `ConfigurableFieldSpec` for a `ConfigurableFieldSingleOption` or
    `ConfigurableFieldMultiOption`.

    Args:
        spec: The `ConfigurableFieldSingleOption` or `ConfigurableFieldMultiOption`.
        description: The description to use if the spec does not have one.

    Returns:
        The `ConfigurableFieldSpec`.
    c              3  $   K   | ]  }||f 
 y wr6   r*   r   s     r-   r[   z$make_options_spec.<locals>.<genexpr>  s     ;A!Q;r   r   Nr   )r   r   rx   r   r   r   rm   r   r   r   rJ   r   r   r   r%   r   r   )r   r   enums      r-   r   r     s     
 @"&&t,,4,		$TWW;dll&7&7&9!:;D %)$$?OD!@ $56$ww((7KLLnn
 	
 !77YY$$3D>.. %@ @s   A8D,,D5)r   r   r   r   ri   r   )r   r   r   r   ri   r   )r   z<ConfigurableFieldSingleOption | ConfigurableFieldMultiOptionr   z
str | Noneri   r   );r   
__future__r   r   	threadingabcr   collections.abcr   r   r   r   	functoolsr	   typingr
   r   r   weakrefr   pydanticr   r   typing_extensionsr   langchain_core.runnables.baser   r   langchain_core.runnables.configr   r   r   r   r   langchain_core.runnables.utilsr   r   r   r   r   r   r   r   r    langchain_core.runnables.graphr!   r#   r   r   Enumr   r   r   Lockr   r   r   r   r   r*   r/   r-   <module>r      s!   < "      
 ( * & H 
 
 
 4J*5&=9 JZM&!? M&bc499     
 &y~~' cuf}'E cLC

),:)
F)) )r/   