§
    ¨MºfNy  ã                   óÚ  — d Z ddlZddlZddlZddlZddlmZmZmZ ddl	Z	ddl	m
Z
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 d	dlmZ d	dlmZ d	dlmZ d	dlmZmZ 	 ddlm Z   e d¬¦  «         G d„ d¦  «        ¦   «         Z!n#   G d„ d¦  «        Z!Y nxY wda"i a#da$d„ Z%d„ Z&d„ Z'd„ Z( G d„ d¦  «        Z) G d„ d¦  «        Z* G d„ de¦  «        Z+d„ Z, G d „ d!e
¦  «        Z-dS )"aË  
dash_wrapper

This module provides a DjangoDash class that can be used to
expose a Plotly Dasb application through a Django server

Copyright (c) 2018 Gibbs Consulting and others - see CONTRIBUTIONS.md

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
é    N)ÚDictÚListÚCallable)ÚDashÚdependencies)Úsplit_callback_idÚinputs_to_dict)Úreverse)Úslugify)ÚFlaské   )Úapp_nameÚmain_view_label)ÚEmbeddedHolder)Úserve_locally)Ústateless_app_lookup_hook)Ústatic_asset_pathÚDjangoPlotlyJSONEncoder)Ú	dataclassT)Úfrozenc                   óV   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   dS )	ÚCallbackContextÚinputs_listÚinputsÚstates_listÚstatesÚoutputs_listÚoutputsÚ	triggeredN)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   © ó    ú^/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django_plotly_dash/dash_wrapper.pyr   r   1   sX   € € € € € € àÐÐÑØˆˆ‰ØÐÐÑØˆˆ‰ØÐÐÑØˆˆ‰Øˆˆ‰ˆˆr%   r   c                   ó®   — e Zd Zd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
ed„ ¦   «         Zd	S )
r   c                 ó   — || _         d S ©N©Ú_args)ÚselfÚkwargss     r&   Ú__init__zCallbackContext.__init__>   s   € ØˆDŒJˆJˆJr%   c                 ó   — | j         d         S )Nr   r*   ©r,   s    r&   r   zCallbackContext.inputs_listA   ó   € à”:˜mÔ,Ð,r%   c                 ó   — | j         d         S )Nr   r*   r0   s    r&   r   zCallbackContext.inputsE   ó   € à”:˜hÔ'Ð'r%   c                 ó   — | j         d         S )Nr   r*   r0   s    r&   r   zCallbackContext.states_listI   r1   r%   c                 ó   — | j         d         S )Nr   r*   r0   s    r&   r   zCallbackContext.statesM   r3   r%   c                 ó   — | j         d         S )Nr   r*   r0   s    r&   r   zCallbackContext.outputsQ   s   € à”:˜iÔ(Ð(r%   c                 ó   — | j         d         S )Nr   r*   r0   s    r&   r   zCallbackContext.outputs_listU   s   € à”:˜nÔ-Ð-r%   c                 ó   — | j         d         S )Nr   r*   r0   s    r&   r   zCallbackContext.triggeredX   s   € à”:˜kÔ*Ð*r%   N)r    r!   r"   r.   Úpropertyr   r   r   r   r   r   r   r$   r%   r&   r   r   =   sÞ   € € € € € ð	 ð 	 ð 	 ð 
ð	-ð 	-ñ 
Œð	-ð 
ð	(ð 	(ñ 
Œð	(ð 
ð	-ð 	-ñ 
Œð	-ð 
ð	(ð 	(ñ 
Œð	(ð 
ð	)ð 	)ñ 
Œð	)ð 
ð	.ð 	.ñ 
Œð	.à	ð	+ð 	+ñ 
Œð	+ð 	+ð 	+r%   c                 ó   — |t           | <   | S )z!Add app to local registry by name©Úusable_apps)ÚnameÚapps     r&   Úadd_usable_appr?   c   s   € ð …K�ÑØ€Kr%   c                  ó   — t           S )zLReturn a dictionary of all locally registered apps with the slug name as keyr;   r$   r%   r&   Úall_appsrA   i   s   € åÐr%   c                  ó*   — t          t          ¦  «        S )z;Return a list of all locally registered stateless apps
    )Úlistr<   r$   r%   r&   Úget_local_stateless_listrD   m   s   € õ •ÑÔÐr%   c                 ó°   — t                                | d¦  «        }|s$t          €t          ¦   «         at          | ¦  «        }|st	          d| z  ¦  «        ‚|S )zg
    Locate a registered dash app by name, and return a DjangoDash instance encapsulating the app.
    Nz,Unable to find stateless DjangoApp called %s)r<   ÚgetÚ_stateless_app_lookup_funcr   ÚKeyError)r=   Úsas     r&   Úget_local_stateless_by_namerJ   r   sb   € õ 
�Š˜˜tÑ	$Ô	$€Bàð .õ &Ð-Ý)BÑ)DÔ)DÐ&å'¨Ñ-Ô-ˆàð LåÐEÀdÑJÑKÔKÐKà€Ir%   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚHolderz.Helper class for holding configuration optionsc                 ó   — g | _         d S r)   )Úitemsr0   s    r&   r.   zHolder.__init__Š   s   € ØˆŒ
ˆ
ˆ
r%   c                 ó:   — | j                              |¦  «         dS )z,Add extra css file name to component packageN©rN   Úappend)r,   Ú
stylesheets     r&   Ú
append_csszHolder.append_cssŒ   s   € àŒ
×Ò˜*Ñ%Ô%Ð%Ð%Ð%r%   c                 ó:   — | j                              |¦  «         dS )z/Add extra script file name to component packageNrP   )r,   Úscripts     r&   Úappend_scriptzHolder.append_script�   s   € àŒ
×Ò˜&Ñ!Ô!Ð!Ð!Ð!r%   N)r    r!   r"   Ú__doc__r.   rS   rV   r$   r%   r&   rL   rL   ˆ   sG   € € € € € Ø4Ð4ðð ð ð&ð &ð &ð"ð "ð "ð "ð "r%   rL   c                   ó†   — e Zd ZdZ	 	 	 	 	 dd„Zd„ Zdd„Zd„ Zd„ Zd	„ Z	d
„ Z
dd„Zdd„Zed„ ¦   «         Zd„ ZeZd„ Zd„ ZdS )Ú
DjangoDashz¬
    Wrapper class that provides Dash functionality in a form that can be served by Django

    To use, construct an instance of DjangoDash() in place of a Dash() one.
    NFc                 óÄ  — |pg | _         |pg | _        || _        |r(t          j        d                     |¬¦  «        ¦  «         |€t          dz  adt          z  | _        n|| _        d | _        g | _	        g | _
        t          ¦   «         | _        t          ¦   «         | _        t          | j        | ¦  «         |€t          ¦   «         | _        n|| _        || _        |r–	 ddlm}  |¦   «         d         }	n#  ddlm}  |¦   «         d         }	Y nxY w| j        r=d	}
|	                     d
¦  «        d         }| j                             |	g||
dœ¦  «         n| j                             d|	gi¦  «         t/          j        ¦   «         d         }t/          j        |d         ¦  «        | _        	 t/          j        | j        ¦  «        | _        n#  d | _        Y nxY wd| _        d S )Nz€You are passing extra arguments {kwargs} that will be passed to Dash(...) but may not be properly handled by django-plotly-dash.©r-   r   z	djdash_%ir   )Úcss_urlÚhrefÚurlÚdpd_static_supportú/éÿÿÿÿ)Úexternal_urlÚrelative_package_pathÚ	namespacerb   Úassets)Úexternal_stylesheetsÚexternal_scriptsÚ_kwargsÚwarningsÚwarnÚformatÚuid_counterÚ_uidÚlayoutÚ_callback_setsÚ_clientside_callback_setsrL   ÚcssÚscriptsr?   Úserve_locally_settingÚ_serve_locallyÚ_suppress_callback_exceptionsÚbootstrap4.bootstrapr\   Údjango_bootstrap5.coreÚsplitrV   ÚinspectÚstackÚ	getmoduleÚcaller_moduleÚgetfileÚcaller_module_locationÚassets_folder)r,   r=   r   Úadd_bootstrap_linksÚsuppress_callback_exceptionsrf   rg   r-   r\   Úbootstrap_sourceÚhard_coded_package_nameÚbase_file_nameÚcaller_frames                r&   r.   zDjangoDash.__init__›   sC  € ð %9Ð$>¸BˆÔ!Ø 0Ð 6°BˆÔØˆŒØð 	jÝŒMð SßSYÒSYÐagÐSYÑShÔShñjô jð jð ˆ<å˜1ÑˆKØ#¥kÑ1ˆDŒIˆIàˆDŒIØˆŒØ ˆÔØ)+ˆÔ&å‘8”8ˆŒÝ‘x”xˆŒå�t”yØñ	ô 	ð 	ð Ð Ý"7Ñ"9Ô"9ˆDÔÐà"/ˆDÔà-IˆÔ*àð 	Nð4Ø8Ð8Ð8Ð8Ð8Ð8Ø#* 7¡9¤9¨VÔ#4Ð Ð øð4Ø:Ð:Ð:Ð:Ð:Ð:Ø#* 7¡9¤9¨UÔ#3Ð Ð Ð øøøàÔ"ð 
Nà*>Ð'Ø!1×!7Ò!7¸Ñ!<Ô!<¸RÔ!@�à”×&Ò&Ð@PÐ?RØBPØBYð(*ð (*ñ +ô +ð +ð +ð
 ”×&Ò&¨Ð8HÐ7JÐ'LÑMÔMÐMõ ”}‘” qÔ)ˆÝ$Ô.¨|¸A¬Ñ?Ô?ˆÔð	/Ý*1¬/¸$Ô:LÑ*MÔ*MˆDÔ'Ð'øð	/Ø*.ˆDÔ'Ð'Ð'øøøØ%ˆÔÐÐs   ÃC5 Ã5DÆ,G Ç	Gc                 ó:   — | j         j        }t          ||¦  «        S r)   )r|   r    r   )r,   Ú
asset_pathÚmodule_names      r&   Úget_asset_static_urlzDjangoDash.get_asset_static_urlÞ   s   € ØÔ(Ô1ˆÝ  ¨jÑ9Ô9Ð9r%   c                 ó.   — |                       |¬¦  «        S )zE
        Form a dash instance, for stateless use of this app
        )Úcache_id)Údo_form_dash_instance)r,   r‹   s     r&   Úas_dash_instancezDjangoDash.as_dash_instanceâ   s   € ð ×)Ò)°8Ð)Ñ<Ô<Ð<r%   c                 ó   — dS ©z/Do nothing impl - only matters if state presentNr$   r0   s    r&   Úhandle_current_statezDjangoDash.handle_current_stateè   ó   € àˆr%   c                 ó   — dS r�   r$   )r,   ÚwidÚkeyÚvalues       r&   Úupdate_current_statezDjangoDash.update_current_stateë   r‘   r%   c                 ó   — dS r�   r$   )r,   r“   r”   s      r&   Úhave_current_state_entryz#DjangoDash.have_current_state_entryî   r‘   r%   c                 óÊ   — |st           ›dt          ›�}| j        }nt           ›dt          ›�}|}d|i}|r
||d<   |dz   }t          ||¬¦  «        }|d         dk    r|dz   }||fS )	zOBase path name of this instance, taking into account any state or statelessnessz:app-ú:Úidentr‹   z--argsr[   ra   r`   )r   r   rm   r
   )r,   Úspecific_identifierr‹   Úapp_pathnameÚndidr-   Úfull_urls          r&   Úget_base_pathnamezDjangoDash.get_base_pathnameò   s‘   € à"ð 	'Ý)1¨¨µ?°?ÐCˆLØ”9ˆDˆDå&. h hµ°Ð@ˆLØ&ˆDà˜4�ˆàð 	3Ø!)ˆF�:ÑØ'¨(Ñ2ˆLå˜<°Ð7Ñ7Ô7ˆØ�BŒ<˜3ÒÐØ #‘~ˆHØ�Xˆ~Ðr%   c                 ób   — |                       ||¦  «        \  }}|                      |||¦  «        S )zIPerform the act of constructing a Dash instance taking into account state)r    Úform_dash_instance)r,   Úreplacementsrœ   r‹   rž   Úbase_pathnames         r&   rŒ   z DjangoDash.do_form_dash_instance  s7   € ð #×4Ò4Ð5HÈ(ÑSÔSÑˆˆmØ×&Ò& |°T¸=ÑIÔIÐIr%   c           
      ó´  — |€| j         }t          d|||| j        | j        | j        dœ| j        ¤Ž}| j        |_        | j        |j        d<   | j	        D ]\  }}  |j
        di |¤Ž|¦  «         Œ| j        D ]} |j        di |¤Ž Œ| j        j        D ]}|j                             |¦  «         Œ| j        j        D ]}|j                             |¦  «         Œ|S )z3Construct a Dash instance taking into account stateN)r¤   r£   rž   r   rf   rg   r�   r$   )rm   ÚWrappedDashrt   rf   rg   rh   rn   ru   Úconfigro   Úcallbackrp   Úclientside_callbackrq   rN   rS   rr   rV   )r,   r£   rž   r¤   ÚrdÚcbÚfuncÚss           r&   r¢   zDjangoDash.form_dash_instance  s1  € ð ˆ<Ø”9ˆDåð ) }Ø&2Ø"Ø'+Ô':Ø.2Ô.GØ*.Ô*?ð)ð )ð  œ<ð)ð )ˆð ”KˆŒ	Ø48Ô4VˆŒ	Ð0Ñ1àÔ+ð 	$ð 	$‰HˆB�ØˆKˆBŒKÐÐ˜"ÐÐ˜dÑ#Ô#Ð#Ð#ØÔ0ð 	)ð 	)ˆBØ"ˆBÔ"Ð(Ð( RÐ(Ð(Ð(Ð(Ø””ð 	!ð 	!ˆAØŒF×Ò˜aÑ Ô Ð Ð Ø”Ô#ð 	(ð 	(ˆAØŒJ×$Ò$ QÑ'Ô'Ð'Ð'àˆ	r%   c                 ó"  — t          |pg ¦  «        t          |pg ¦  «        z   }d„ t          j        t          j        | ¦  «        j                             ¦   «         d„ ¦  «        D ¦   «         }t          j        j        |v rd}nŒt          j        j	        |v r&| 
                    t          j        j        g ¦  «        }nS| 
                    t          j        j        g ¦  «        |d…         | 
                    t          j        j        g ¦  «        z   }|S )ai  Analyse a callback function signature to detect the expanded arguments to add when called.
        It uses the inputs and the state information to identify what arguments are already coming from Dash.

        It returns a list of the expanded parameters to inject (can be [] if nothing should be injected)
         or None if all parameters should be injected.c                 ó.   — i | ]\  }}|d „ |D ¦   «         “ŒS )c                 ó   — g | ]	}|j         ‘Œ
S r$   )r=   )Ú.0Úps     r&   ú
<listcomp>z@DjangoDash.get_expanded_arguments.<locals>.<dictcomp>.<listcomp>1  s   € Ð!=Ð!=Ð!=¨Q !¤&Ð!=Ð!=Ð!=r%   r$   )r±   ÚkindÚ
parameterss      r&   ú
<dictcomp>z5DjangoDash.get_expanded_arguments.<locals>.<dictcomp>1  s@   € ð mð mð mÑBRÀ$È
˜4Ð!=Ð!=°*Ð!=Ñ!=Ô!=ð mð mð mr%   c                 ó   — | j         S r)   )r´   )r²   s    r&   ú<lambda>z3DjangoDash.get_expanded_arguments.<locals>.<lambda>2  s
   € ÐdeÔdj€ r%   N)ÚlenÚ	itertoolsÚgroupbyry   Ú	signaturerµ   ÚvaluesÚ	ParameterÚVAR_KEYWORDÚVAR_POSITIONALrF   ÚKEYWORD_ONLYÚPOSITIONAL_OR_KEYWORD)r¬   r   ÚstateÚn_dash_parametersÚparameter_typesÚexpandeds         r&   Úget_expanded_argumentsz!DjangoDash.get_expanded_arguments(  s  € õ    ¨"Ñ-Ô-µ°E°K¸RÑ0@Ô0@Ñ@Ððmð mÝ$Ô,­WÔ->¸tÑ-DÔ-DÔ-O×-VÒ-VÑ-XÔ-XÐZjÐZjÑkÔkðmñ mô mˆåÔÔ(¨OÐ;Ð;àˆHˆHÝÔÔ-°Ð@Ð@ð '×*Ò*­7Ô+<Ô+IÈ2ÑNÔNˆHˆHð '×*Ò*­7Ô+<Ô+RÐTVÑWÔWØ(Ð)Ð)ô+Ø-<×-@Ò-@ÅÔARÔA_ÐacÑ-dÔ-dñeˆHð ˆr%   c                 ó`   ‡ ‡‡‡— t          j        ||¦  «        \  }ŠŠ}|‰‰|dœŠˆˆˆ ˆfd„}|S )ac  Form a callback function by wrapping, in the same way as the underlying Dash application would
        but handling extra arguments provided by dpd.

        It will inspect the signature of the function to ensure only relevant expanded arguments are passed to the callback.

        If the function accepts a **kwargs => all expanded arguments are sent to the function in the kwargs.
        If the function has a *args => expanded arguments matching parameters after the *args are injected.
        Otherwise, take all arguments beyond the one provided by Dash (based on the Inputs/States provided).

        )Úoutputr   rÃ   Úprevent_initial_callc                 ó‚   •— ‰j                              ‰| f¦  «         t                               | ‰‰¦  «        | _        | S r)   )ro   rQ   rY   rÇ   rÆ   )r¬   Úcallback_setr   r,   rÃ   s    €€€€r&   Ú	wrap_funcz&DjangoDash.callback.<locals>.wrap_funcV  s?   ø€ ØÔ×&Ò&¨°dÐ';Ñ<Ô<Ð<õ
 '×=Ò=¸dÀFÈEÑRÔRˆDŒMØˆKr%   )r   Úhandle_callback_args)	r,   r+   rh   rÉ   rÊ   rÍ   rÌ   r   rÃ   s	   `     @@@r&   r¨   zDjangoDash.callbackA  sv   øøøø€ õ 7CÔ6WØ�7ñ7
ô 7
Ñ3ˆ�˜Ð3ð #)Ø"(Ø!&Ø0DðFð Fˆð
	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð Ðr%   c                 ó~   — t          j        ||¦  «        \  }}}}|||||dœ}| j                             |¦  «         dS )z^Form a callback function by wrapping, in the same way as the underlying Dash application would)Úclientside_functionrÉ   r   rÃ   rÊ   N)r   rÎ   rp   rQ   )	r,   rÐ   r+   rh   rÉ   r   rÃ   rÊ   rÌ   s	            r&   r©   zDjangoDash.clientside_callbackb  sb   € å6BÔ6WØ�7ñ7
ô 7
Ñ3ˆ�˜Ð3ð 1DØ#)Ø#)Ø"'Ø1Eð	Gð Gˆð 	Ô&×-Ò-¨lÑ;Ô;Ð;Ð;Ð;r%   c                 ó&   — dt          |¦  «        z   S )zcURL of an asset associated with this component

        Use a placeholder and insert later
        zassets/)Ústr)r,   Ú
asset_names     r&   Úget_asset_urlzDjangoDash.get_asset_urlq  s   € ð �3˜z™?œ?Ñ*Ð*r%   )NNFFNNr)   ©NNN)r    r!   r"   rW   r.   r‰   r�   r�   r–   r˜   r    rŒ   r¢   ÚstaticmethodrÇ   r¨   Úexpanded_callbackr©   rÔ   r$   r%   r&   rY   rY   ”   s#  € € € € € ðð ð 15Ø%*Ø.3Ø&*Ø"&ð	A&ð A&ð A&ð A&ðF:ð :ð :ð=ð =ð =ð =ðð ð ðð ð ðð ð ðð ð ð(Jð Jð Jð Jðð ð ð ð8 ðð ñ „\ðð0ð ð ð> !Ðð<ð <ð <ð+ð +ð +ð +ð +r%   rY   c                   ó<   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚPseudoFlaskzFDummy implementation of a Flask instance, providing stub functionalityc                 ó^   — ddi| _         i | _        d| _        i | _        d| _        i | _        d S )NÚDEBUGFÚPseudoFlaskDummyName)r§   Ú	endpointsr=   Ú
blueprintsÚ_got_first_requestÚbefore_request_funcsr0   s    r&   r.   zPseudoFlask.__init__}  s9   € Ø Ð&ˆŒØˆŒØ*ˆŒ	ØˆŒØ"'ˆÔØ$&ˆÔ!Ð!Ð!r%   c                 ó   — d S r)   r$   ©r,   Úargsr-   s      r&   Úafter_requestzPseudoFlask.after_request‡  ó   € Øˆr%   c                 ó   ‡— ˆfd„}|S )Nc                 ó   •— ‰d         S )Nr   r$   )Úfrã   s    €r&   Úeh_funcz)PseudoFlask.errorhandler.<locals>.eh_funcŠ  s   ø€ Ø˜”7ˆNr%   r$   )r,   rã   r-   ré   s    `  r&   ÚerrorhandlerzPseudoFlask.errorhandler‰  s!   ø€ ð	ð 	ð 	ð 	ð 	àˆr%   c                 ó*   — |d         }|| j         |<   d S )NÚendpoint)rÝ   )r,   rã   r-   Úroutes       r&   Úadd_url_rulezPseudoFlask.add_url_rule�  s   € Ø�zÔ"ˆØ &ˆŒ�uÑÐÐr%   c                 ó   — d S r)   r$   râ   s      r&   Úbefore_first_requestz PseudoFlask.before_first_request�  rå   r%   c                 ó   — d S r)   r$   râ   s      r&   ÚrunzPseudoFlask.run’  rå   r%   c                 ó   — d S r)   r$   râ   s      r&   Úregister_blueprintzPseudoFlask.register_blueprint”  rå   r%   N)r    r!   r"   rW   r.   rä   rê   rî   rð   rò   rô   r$   r%   r&   rÙ   rÙ   {  sƒ   € € € € € ØLÐLð'ð 'ð 'ðð ð ðð ð ð'ð 'ð 'ðð ð ðð ð ðð ð ð ð r%   rÙ   c                 ó¸   — t          | t          ¦  «        r| S d                     d„ t          |                      ¦   «         ¦  «        D ¦   «         ¦  «        }d|› d�S )zÅConvert an python id (str or dict) into its Dash representation.

    see https://github.com/plotly/dash/blob/c5ba38f0ae7b7f8c173bda10b4a8ddd035f1d867/dash-renderer/src/actions/dependencies.js#L114ú,c              3   ór   K  — | ]2\  }}t          j        |¦  «        › d t          j        |¦  «        › �V — Œ3dS )rš   N)ÚjsonÚdumps)r±   ÚkÚvs      r&   ú	<genexpr>zwid2str.<locals>.<genexpr>ž  sD   è è € ÐWÐW¹4¸1¸a•t”z !‘}”}Ð6Ð6¥t¤z°!¡}¤}Ð6Ð6ÐWÐWÐWÐWÐWÐWr%   Ú{Ú})Ú
isinstancerÒ   ÚjoinÚsortedrN   )r“   Údatas     r&   Úwid2strr  ˜  sY   € õ �#•sÑÔð Øˆ
Ø�8Š8ÐWÐWÅ6È#Ï)Ê)É+Ì+ÑCVÔCVÐWÑWÔWÑWÔW€DØ�ˆ=ˆ=ˆ=Ðr%   c                   óè   ‡ — e Zd ZdZ	 dˆ fd„	Zd„ Zd„ Zdd„Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Zdd„Zej        j        d„ ¦   «         Zd„ Zd„ Zd„ Zˆ fd„Zˆ fd„Zd„ Zd„ Zdd„Zd„ Zˆ fd„Zdd„Zd„ Zˆ xZS )r¦   z3Wrapper around the Plotly Dash application instanceNFc                 ó¶  •— || _         t          | j         ¦  «        | _        t          ¦   «         | _        || _        | j        |d<   | j        |d<    t          ¦   «         j        t          fi |¤Ž || j	        j
        _        || j        j
        _        d| _        |r|| _        nt          ¦   «         | _        t!          | j        ¦  «        dk     | _        d| _        d S )NÚurl_base_pathnameÚserverFr   )rm   r   Ú
_flask_apprÙ   Ú	_notflaskÚ_base_pathnameÚsuperr.   r    rq   r§   r   rr   Ú
_adjust_idÚ_replacementsÚdictr¹   Ú_use_dash_layoutÚ_return_embedded)r,   r¤   r£   rž   r   r-   Ú	__class__s         €r&   r.   zWrappedDash.__init__¥  sÐ   ø€ ð ˆŒ	å ¤	Ñ*Ô*ˆŒÝ$™œˆŒØ+ˆÔà&*Ô&9ˆÐ"Ñ#Øœ>ˆˆxÑð 	�‰ŒÔ�Ð,Ð, VÐ,Ð,Ð,à(5ˆŒŒÔ%Ø,9ˆŒÔÔ)àˆŒØð 	(Ø!-ˆDÔÐå!%¡¤ˆDÔÝ # DÔ$6Ñ 7Ô 7¸!Ò ;ˆÔà %ˆÔÐÐr%   c                 ó   — dS )aA  Return True if underlying dash dispatching should be used.

        This stub is present to allow older code to work. Following PR #304
        (see https://github.com/GibbsConsulting/django-plotly-dash/pull/304/files for
        details) this function is no longer needed and therefore should always
        return FalseFr$   r0   s    r&   Úuse_dash_dispatchzWrappedDash.use_dash_dispatchÂ  s	   € ð ˆur%   c                 ó   — | j         S )zó
        Indicate if the underlying dash layout can be used.

        If application state is in use, then the underlying dash layout functionality has to be
        augmented with the state information and this function returns False
        )r  r0   s    r&   Úuse_dash_layoutzWrappedDash.use_dash_layoutË  s   € ð Ô$Ð$r%   c                 óZ  — |                       ¦   «         r|s	 |j        }t          j        |                     d¦  «        ¦  «        }|si }t          | j        ¦  «        }|                     |¦  «         |  	                    ||¦  «        }t          j
        |t          ¬¦  «        }||j        fS )z'Add application state to initial valuesFzutf-8)Úcls)r  r  Úmimetyperø   ÚloadsÚdecoder  r  ÚupdateÚwalk_tree_and_replacerù   r   )r,   Úbase_responseÚinitial_argumentsÚbaseDataInBytesÚbaseDataÚ	overridesÚreworked_dataÚresponse_datas           r&   Úaugment_initial_layoutz"WrappedDash.augment_initial_layoutÔ  sÆ   € à×ÒÑ!Ô!ð 	>Ð*;ð 	>ð 	>ð (Ô,ˆÝ”:˜o×4Ò4°WÑ=Ô=Ñ>Ô>ˆð !ð 	#Ø "Ðõ ˜Ô+Ñ,Ô,ˆ	Ø×ÒÐ*Ñ+Ô+Ð+ð ×2Ò2°8¸YÑGÔGˆåœ
 =Ý'>ð@ñ @ô @ˆð ˜mÔ4Ð4Ð4r%   c                 óÀ  — t          |t          ¦  «        r–dD ],}|                      |                     |d¦  «        |¦  «         Œ-|                     dd¦  «        }|�Ot	          |¦  «        }|                     |i ¦  «        }|                     ¦   «         D ]\  }}|dvr|||<   Œ|r|||<   t          |t          ¦  «        r|D ]}|                      ||¦  «         ŒdS dS )zEWalk tree of properties and extract identifiers and associated values)ÚchildrenÚpropsNÚid)r'  Úoptionsr&  r(  )rÿ   r  Úwalk_tree_and_extractrF   r  rN   rC   )r,   r  Útargetr”   r›   ÚidValsr•   Úelements           r&   r*  z!WrappedDash.walk_tree_and_extractî  s  € å�d�DÑ!Ô!ð 	+Ø,ð Hð H�Ø×*Ò*¨4¯8ª8°C¸Ñ+>Ô+>ÀÑGÔGÐGÐGØ—H’H˜T 4Ñ(Ô(ˆEØÐ Ý ™œ�ØŸš E¨2Ñ.Ô.�Ø"&§*¢*¡,¤,ð ,ð ,‘J�C˜ØÐ"HÐHÐHØ&+˜˜s™øØð +Ø$*�F˜5‘MÝ�d�DÑ!Ô!ð 	<Øð <ð <�Ø×*Ò*¨7°FÑ;Ô;Ð;Ð;ð	<ð 	<ð<ð <r%   c                 ó  ‡ ‡— t          |t          ¦  «        rÊi }i }|                     dd¦  «        }t          |t          ¦  «        r4t          |¦  «        }‰                     ¦   «         D ]\  }}||k    r|} nŒn|�‰                     |i ¦  «        }|                     ¦   «         D ]8\  }}|                     |d¦  «        }|€‰                      |‰¦  «        }|||<   Œ9|S t          |t          ¦  «        rˆˆ fd„|D ¦   «         S |S )z¦
        Walk the tree. Rely on json decoding to insert instances of dict and list
        ie we use a dna test for anatine, rather than our eyes and ears...
        r(  Nc                 ó<   •— g | ]}‰                      |‰¦  «        ‘ŒS r$   )r  )r±   Úxr!  r,   s     €€r&   r³   z5WrappedDash.walk_tree_and_replace.<locals>.<listcomp>  s)   ø€ ÐKÐKÐKÀ�D×.Ò.¨q°)Ñ<Ô<ÐKÐKÐKr%   )rÿ   r  rF   r  rN   r  rC   )	r,   r  r!  Úresponser£   ÚthisIDrú   rû   Úrs	   ` `      r&   r  z!WrappedDash.walk_tree_and_replace   s2  øø€ õ
 �d�DÑ!Ô!ð 	ØˆHØˆLà—X’X˜d DÑ)Ô)ˆFÝ˜&¥$Ñ'Ô'ð 	9å  ™œ�Ø%ŸOšOÑ-Ô-ð ð ‘D�A�qØ ’{�{Ø'(˜Ø˜ð #øð Ð#à(Ÿ}š}¨V°RÑ8Ô8�àŸ
š
™œð  ð  ‘��1Ø ×$Ò$ Q¨Ñ-Ô-�Ø�9Ø×2Ò2°1°iÑ@Ô@�AØ�˜‘�ØˆOÝ�d�DÑ!Ô!ð 	LàKÐKÐKÐKÐKÀdÐKÑKÔKÐKØˆr%   c                 ó   — | j         S )z4Underlying flask application for stub implementation)r  r0   s    r&   Ú	flask_appzWrappedDash.flask_app   s
   € àŒÐr%   c                 ó   — | j         S )zBase url of this component)r
  r0   s    r&   Úbase_urlzWrappedDash.base_url$  s   € àÔ"Ð"r%   c                 ó&   —  | j         j        |i |¤ŽS )z=Extract application context from underlying flask application)r  Úapp_contextrâ   s      r&   r9  zWrappedDash.app_context(  s%   € à*ˆtŒÔ*¨Dð 5Ø-3ð5ð 5ð 	5r%   c                 ó&   —  | j         j        |i |¤ŽS )z>Request context for testing from underluying flask application)r  Útest_request_contextrâ   s      r&   r;  z WrappedDash.test_request_context-  s%   € à3ˆtŒÔ3°Tð >Ø6<ð>ð >ð 	>r%   c                 ó^   — |�| j         ›d|›�}n| j         }| j        j        |         d         S )z+Locate endpoint function given name of viewNÚ_Ú	view_func)r
  r	  rÝ   )r,   r=   Úeps      r&   Úlocate_endpoint_functionz$WrappedDash.locate_endpoint_function2  sA   € àÐØÔ.Ð.Ð.Ø˜4ð!ˆBˆBð Ô$ˆBØŒ~Ô'¨Ô+¨KÔ8Ð8r%   c                 óz   — | j         r|                      |¦  «         t          j                             | |¦  «        S )z;Overloaded layout function to fix component names as needed)r  Ú_fix_component_idr   rn   Úfset)r,   r•   s     r&   rn   zWrappedDash.layout<  s:   € ð Œ?ð 	*Ø×"Ò" 5Ñ)Ô)Ð)ÝŒ{×Ò  eÑ,Ô,Ð,r%   c                 óÄ   — t          |dd¦  «        }|�$t          |d|                      |¦  «        ¦  «         	 |j        D ]}|                      |¦  «         ŒdS #  Y dS xY w)z,Fix name of component ad all of its childrenr(  N)ÚgetattrÚsetattrÚ_fix_idr&  rB  )r,   Ú	componentÚtheIDÚcs       r&   rB  zWrappedDash._fix_component_idD  s�   € õ ˜	 4¨Ñ.Ô.ˆØÐÝ�I˜t T§\¢\°%Ñ%8Ô%8Ñ9Ô9Ð9ð	ØÔ'ð *ð *�Ø×&Ò& qÑ)Ô)Ð)Ð)ð*ð *øð	ØˆDˆDøøøs   ¹A ÁAc                 ó,   — | j         s|S | j        ›d|›�S )z+Adjust identifier to include component namez_-_)r  rm   )r,   r=   s     r&   rG  zWrappedDash._fix_idP  s)   € àŒð 	ØˆKØœ9˜9˜9Ø˜4ð!ð 	!r%   c                 óD   — |                       |j        ¦  «        |_        |S )zUpdate component identifier)rG  Úcomponent_id)r,   Úitems     r&   Ú_fix_callback_itemzWrappedDash._fix_callback_itemW  s   € à ŸLšL¨Ô):Ñ;Ô;ˆÔØˆr%   c                 ó   •‡ — t          |t          t          f¦  «        rˆ fd„|D ¦   «         }n‰                      |¦  «        }t	          ¦   «                              |ˆ fd„|D ¦   «         ˆ fd„|D ¦   «         |¬¦  «        S )ú3Invoke callback, adjusting variable names as neededc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r$   ©rO  ©r±   r0  r,   s     €r&   r³   z(WrappedDash.callback.<locals>.<listcomp>`  ó'   ø€ ÐHÐHÐH¸A˜T×4Ò4°QÑ7Ô7ÐHÐHÐHr%   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r$   rS  rT  s     €r&   r³   z(WrappedDash.callback.<locals>.<listcomp>e  s'   ø€ Ð LÐ LÐ LÀ ×!8Ò!8¸Ñ!;Ô!;Ð LÐ LÐ Lr%   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r$   rS  rT  s     €r&   r³   z(WrappedDash.callback.<locals>.<listcomp>f  s'   ø€ Ð KÐ KÐ KÀ ×!8Ò!8¸Ñ!;Ô!;Ð KÐ KÐ Kr%   ©rÊ   )rÿ   rC   ÚtuplerO  r  r¨   )r,   rÉ   r   rÃ   rÊ   Úfixed_outputsr  s   `     €r&   r¨   zWrappedDash.callback\  s¡   øø€ õ �f�t¥U˜mÑ,Ô,ð 	<ØHÐHÐHÐHÀÐHÑHÔHˆMˆMà ×3Ò3°FÑ;Ô;ˆMå‰wŒw×Ò Ø LÐ LÐ LÐ LÀVÐ LÑ LÔ LØ KÐ KÐ KÐ KÀUÐ KÑ KÔ KØ5Ið  ñ Kô Kð 	Kr%   c                 ó  •‡ — t          |t          t          f¦  «        rˆ fd„|D ¦   «         }n‰                      |¦  «        }t	          ¦   «                              ||ˆ fd„|D ¦   «         ˆ fd„|D ¦   «         |¬¦  «        S )rQ  c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r$   rS  rT  s     €r&   r³   z3WrappedDash.clientside_callback.<locals>.<listcomp>m  rU  r%   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r$   rS  rT  s     €r&   r³   z3WrappedDash.clientside_callback.<locals>.<listcomp>s  s'   ø€ Ð+WÐ+WÐ+WÈ1¨D×,CÒ,CÀAÑ,FÔ,FÐ+WÐ+WÐ+Wr%   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r$   rS  rT  s     €r&   r³   z3WrappedDash.clientside_callback.<locals>.<listcomp>t  s'   ø€ Ð+VÐ+VÐ+VÈ1¨D×,CÒ,CÀAÑ,FÔ,FÐ+VÐ+VÐ+Vr%   rX  )rÿ   rC   rY  rO  r  r©   )r,   rÐ   rÉ   r   rÃ   rÊ   rZ  r  s   `      €r&   r©   zWrappedDash.clientside_callbacki  s§   øø€ õ �f�t¥U˜mÑ,Ô,ð 	<ØHÐHÐHÐHÀÐHÑHÔHˆMˆMà ×3Ò3°FÑ;Ô;ˆMå‰wŒw×*Ò*Ð+>Ø+8Ø+WÐ+WÐ+WÐ+WÐPVÐ+WÑ+WÔ+WØ+VÐ+VÐ+VÐ+VÐPUÐ+VÑ+VÔ+VØ@Tð	 +ñ Vô Vð 	Vr%   c                 óœ  ‡‡‡— |                      dg ¦  «        }t          |¦  «        Š|                      dg ¦  «        }|d         }|                      d¦  «        pt          |¦  «        }|                      dg ¦  «        }ˆfd„|D ¦   «         }|‰|t          |¦  «        |||dœ}	t          di |	¤Ž}
|
t          _        t          |¦  «        dk    r|
|d	<   |                     d
¦  «        o|                     d
¦  «         }|r|g}n|dd…          	                    d¦  «        }|                      dd¦  «        }| j
        |         }g }||z   D ]®}t          |t          ¦  «        rHd„ |D ¦   «         }|r9t          ||¦  «        D ](\  }}|                     |d         |d         |¦  «         Œ)n:|                      d¦  «        }|r#|                     |d         |d         |¦  «         |                     |¦  «         Œ¯|                      d¦  «        pt          |¦  «        }||d<   t          |¦  «        t          |d         ¦  «        k     rdS |d         }|j        �2h |j        £d’Š ||i ˆfd„|                     ¦   «         D ¦   «         ¤ŽŠn ||i |¤ŽŠ|r³ G d„ d¦  «        } |ˆfd„¦  «        }|D ]•}t          |t$          ¦  «        rp| 	                    d¦  «        \  }}|                     ||¦  «        rA|                      |i ¦  «                              |d¦  «        }|                     |||¦  «         Œ‡t)          d¦  «        ‚‰S )zOPerform callback dispatching, with enhanced arguments and recording of responser   rÃ   rÉ   r   ÚchangedPropIdsc                 ó@   •— g | ]}|‰                      |¦  «        d œ‘ŒS ))Úprop_idr•   ©rF   )r±   r0  Úinput_valuess     €r&   r³   z2WrappedDash.dispatch_with_args.<locals>.<listcomp>€  s/   ø€ Ð`Ð`Ð`ÈQ¨°L×4DÒ4DÀQÑ4GÔ4GÐHÐHÐ`Ð`Ð`r%   )r   r   r   r   r   r   r   r   Úcallback_contextz..é   éþÿÿÿz...Údash_appNc                 ó8   — g | ]}|                      d ¦  «        ‘ŒS )r•   rc  )r±   Úcis     r&   r³   z2WrappedDash.dispatch_with_args.<locals>.<listcomp>¦  s"   € Ð1Ð1Ð1¨�R—V’V˜G‘_”_Ð1Ð1Ð1r%   r(  r9   r•   r   ÚEDGECASEEXITr¨   c                 ó$   •— i | ]\  }}|‰v ¯	||“ŒS r$   r$   )r±   rú   rû   Úparameters_to_injects      €r&   r¶   z2WrappedDash.dispatch_with_args.<locals>.<dictcomp>Á  s*   ø€ Ð$bÐ$bÐ$b©d¨a°ÈÐMaÐHaÐHa Q¨ÐHaÐHaÐHar%   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ú0WrappedDash.dispatch_with_args.<locals>.LazyJsonz†A class to allow delayed the evaluation of a dict (returned by `func`)
                 till the first get(...) is called on the dict.c                 ó   — || _         d S r)   )Ú_root_value)r,   r¬   s     r&   r.   z9WrappedDash.dispatch_with_args.<locals>.LazyJson.__init__Ê  s   € Ø'+�DÔ$Ð$Ð$r%   c                 óž   — t          | j        t          ¦  «        r|                      ¦   «         | _        | j                             ||¦  «        S r)   )rÿ   rq  r   rF   )r,   rN  Údefaults      r&   rF   z4WrappedDash.dispatch_with_args.<locals>.LazyJson.getÍ  sD   € Ý! $Ô"2µHÑ=Ô=ð >Ø+/×+;Ò+;Ñ+=Ô+=˜Ô(ØÔ+×/Ò/°°gÑ>Ô>Ð>r%   N)r    r!   r"   rW   r.   rF   r$   r%   r&   ÚLazyJsonro  Æ  s>   € € € € € ðCð Cð,ð ,ð ,ð?ð ?ð ?ð ?ð ?r%   rt  c                  óT   •— t          j        ‰ ¦  «                             di ¦  «        S )Nr1  )rø   r  rF   )Úress   €r&   r¸   z0WrappedDash.dispatch_with_args.<locals>.<lambda>Ó  s   ø€ ­$¬*°S©/¬/×*=Ò*=¸jÈ"Ñ*MÔ*M€ r%   ú.zFUpdating state for dict keys (pattern matching) is not yet implementedr$   )rF   r	   r   r   Údashre  r¹   Ú
startswithÚendswithrx   Úcallback_maprÿ   rC   Úzipr–   rQ   rÆ   rN   rÒ   r˜   ÚNotImplementedError)r,   ÚbodyÚargMapr   r   rÉ   r   Úchanged_propsÚtriggered_inputsÚcallback_context_infore  Úsingle_caser   ÚdaÚcallback_inforã   rJ  rû   rj  Úvir¨   rt  Ú
root_valueÚoutput_itemÚ	output_idÚoutput_propertyr•   rd  rm  rv  s                              @@@r&   Údispatch_with_argszWrappedDash.dispatch_with_argsx  sñ  øøø€ à—’˜( BÑ'Ô'ˆÝ% fÑ-Ô-ˆØ—’˜' 2Ñ&Ô&ˆØ�h”ˆØ—x’x 	Ñ*Ô*ÐGÕ.?ÀÑ.GÔ.GˆØŸšÐ!1°2Ñ6Ô6ˆØ`Ð`Ð`Ð`ÐR_Ð`Ñ`Ô`Ðð "Ø"Ø!Ý$ VÑ,Ô,Ø(Ø#Ø)ð!ð !Ðõ +ÐCÐCÐ-BÐCÐCÐð !1�Ôõ ˆv‰;Œ;˜Š?ˆ?Ø)9ˆFÐ%Ñ&à ×+Ò+¨DÑ1Ô1ÐK°f·o²oÀdÑ6KÔ6KÐLˆØð 	0à�hˆGˆGð ˜Q˜r˜T”l×(Ò(¨Ñ/Ô/ˆGð �ZŠZ˜
 DÑ)Ô)ˆàÔ)¨&Ô1ˆàˆà˜&‘ð 	ð 	ˆAÝ˜!�TÑ"Ô"ð GØ1Ð1¨qÐ1Ñ1Ô1�Øð NÝ"% a¨¡)¤)ð Nð N™˜˜BØ×/Ò/°°4´¸"¸Z¼.È"ÑMÔMÐMÐMøà—E’E˜'‘N”N�Øð GØ×+Ò+¨A¨d¬G°Q°z´]ÀAÑFÔFÐFà�KŠK˜‰NŒNˆNˆNð —x’x 	Ñ*Ô*ÐGÕ.?ÀÑ.GÔ.GˆØ!-ˆˆ~Ñõ ˆt‰9Œ9•s˜=¨Ô2Ñ3Ô3Ò3Ð3Ø!�>à  Ô,ˆàÔÐ(Ø#G XÔ%6Ð#G¸Ð#GÐ Ø�(˜DÐcÐ$bÐ$bÐ$bÐ$b°f·l²l±n´nÐ$bÑ$bÔ$bÐcÐcˆCˆCà�(˜DÐ+ FÐ+Ð+ˆCàð 	xð
?ð 
?ð 
?ð 
?ð 
?ñ 
?ô 
?ð 
?ð "˜Ð"MÐ"MÐ"MÐ"MÑNÔNˆJà&ð xð x�Ý˜k­3Ñ/Ô/ð xØ1<×1BÒ1BÀ3Ñ1GÔ1GÑ.�I˜Ø×2Ò2°9¸oÑNÔNð SØ *§¢¨y¸Ñ <Ô <× @Ò @ÀÐRVÑ WÔ W˜Ø×/Ò/°	¸?ÈEÑRÔRÐRøõ .Ð.vÑwÔwÐwàˆ
r%   c                 ó.   — | j         }t          |¦  «        S )z)Return the app id in a slug-friendly form)rm   r   )r,   Úpre_slugified_ids     r&   Úslugified_idzWrappedDash.slugified_idá  s   € àœ9ÐÝÐ'Ñ(Ô(Ð(r%   c                 óh   — |r|nd}|rd|z  nd}|r|nd}|                       ¦   «         }d||||dœz  S )z·
        Return extra html properties to allow individual apps to be styled separately.

        The content returned from this function is injected unescaped into templates.
        zdjango-plotly-dashz-%sÚ ÚiframezT%(prefix)s %(prefix)s-%(template_type)s %(prefix)s-app-%(slugified_id)s%(post_part)s)rŽ  Ú	post_partÚtemplate_typeÚprefix)rŽ  )r,   r”  Úpostfixr“  r’  rŽ  s         r&   Úextra_html_propertiesz!WrappedDash.extra_html_propertiesæ  su   € ð "Ð;��Ð';ˆà'.Ð6�E˜G‘O�O°Bˆ	Ø)6ÐD˜˜¸Hˆà×(Ò(Ñ*Ô*ˆàeð  yEØu~ð zGØrxðijð ijñ jð 	jr%   c           
      ó¨  — |                       ¦   «         }|                      ¦   «         }|                      ¦   «         }|                      ¦   «         }|                      ¦   «         }t          | dd¦  «        }| j        r4dd l}	d                     |	 	                    d| j        ¬¦  «        ¦  «        }
nd}
d}|  
                    |||||||
|¬	¦  «        }|S )
NÚtitler   r   z/<link rel="icon" type="image/x-icon" href="{}">zassets.static)Úfilenamer�  z[
<div id="react-entry-point">
  <div class="_dash-loading">
    Loading...
  </div>
</div>
)Úmetasr˜  rq   r§   rr   Ú	app_entryÚfaviconÚrenderer)Ú_generate_scripts_htmlÚ_generate_css_dist_htmlÚ_generate_config_htmlÚ_generate_meta_htmlÚ_generate_rendererrE  Ú_faviconÚflaskrk   Úurl_forÚinterpolate_index)r,   rã   r-   rr   rq   r§   rš  r�  r˜  r¤  rœ  Ú
_app_entryÚindexs                r&   r¨  zWrappedDash.indexú  sí   € Ø×-Ò-Ñ/Ô/ˆØ×*Ò*Ñ,Ô,ˆØ×+Ò+Ñ-Ô-ˆØ×(Ò(Ñ*Ô*ˆØ×*Ò*Ñ,Ô,ˆÝ˜˜g vÑ.Ô.ˆØŒ=ð 	ØˆLˆLˆLØG×NÒNØ—’˜o¸¼�ÑFÔFñHô HˆGˆGð ˆGðˆJð ×&Ò&Ø˜u¨#°fØ z¸7Øð 'ñ ô ˆð
 ˆr%   c                 ó  •— | j         s t          ¦   «         j        di |¤Ž}|S | j                              |d         ¦  «         | j                              |d         ¦  «         | j                              |d         ¦  «         |d         S )Nrq   r§   rr   r›  r$   )r  r  r¦  Úadd_cssÚ
add_configÚadd_scripts)r,   r-   Úrespr  s      €r&   r¦  zWrappedDash.interpolate_index  s�   ø€ àÔ$ð 	Ø,•5‘7”7Ô,Ð6Ð6¨vÐ6Ð6ˆDØˆKàÔ×%Ò% f¨U¤mÑ4Ô4Ð4ØÔ×(Ò(¨°Ô)9Ñ:Ô:Ð:ØÔ×)Ò)¨&°Ô*;Ñ<Ô<Ð<à�kÔ"Ð"r%   c                 ó4   — |r|nt          ¦   «         | _        dS )zISet a handler for embedded references prior to evaluating a view functionN)r   r  )r,   Úembedded_holders     r&   Úset_embeddedzWrappedDash.set_embedded"  s   € à3BÐ X  ÍÑHXÔHXˆÔÐÐr%   c                 ó   — d| _         dS )z1Exit the embedded section after processing a viewFN)r  r0   s    r&   Úexit_embeddedzWrappedDash.exit_embedded&  s   € à %ˆÔÐÐr%   )NNNFr)   rÕ   )r    r!   r"   rW   r.   r  r  r$  r*  r  r5  r7  r9  r;  r@  r   rn   ÚsetterrB  rG  rO  r¨   r©   r‹  rŽ  r–  r¨  r¦  r°  r²  Ú__classcell__)r  s   @r&   r¦   r¦   ¢  sþ  ø€ € € € € Ø9Ð9ð RWð&ð &ð &ð &ð &ð &ð:ð ð ð%ð %ð %ð5ð 5ð 5ð 5ð4<ð <ð <ð$ð ð ð@ð ð ð#ð #ð #ð5ð 5ð 5ð
>ð >ð >ð
9ð 9ð 9ð 9ð 
„[Ôð-ð -ñ Ôð-ð
ð 
ð 
ð!ð !ð !ðð ð ð
Kð Kð Kð Kð KðVð Vð Vð Vð Vðgð gð gðR)ð )ð )ð
jð jð jð jð(ð ð ð8
#ð 
#ð 
#ð 
#ð 
#ðYð Yð Yð Yð&ð &ð &ð &ð &ð &ð &r%   r¦   ).rW   ry   rº   rø   ri   Útypingr   r   r   rx  r   r   Údash._utilsr   r	   Údjango.urlsr
   Údjango.utils.textr   r¤  r   r   r   Ú
middlewarer   Úutilr   rs   r   r   r   Údataclassesr   r   rl   r<   rG   r?   rA   rD   rJ   rL   rY   rÙ   r  r¦   r$   r%   r&   ú<module>r¼     sá  ððð ð4 €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø &Ð &Ð &Ð &Ð &Ð &Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø +Ð +Ð +Ð +Ð +Ð +Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ð,+Ø%Ð%Ð%Ð%Ð%Ð%à€Y�dÐÑÔðð ð ð ð ñ ô ñ Ôðð øð+ð+ð +ð +ð +ð +ñ +ô +ð +ð +ð +øøøð@ €à€à!Ð ðð ð ðð ð ðð ð ð
ð ð ð,	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ðc+ð c+ð c+ð c+ð c+ñ c+ô c+ð c+ðNð ð ð ð �%ñ ô ð ð:ð ð ðF&ð F&ð F&ð F&ð F&�$ñ F&ô F&ð F&ð F&ð F&s   Á&%B ÂB