
    g!2                    H   U d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZmZ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  ee      Zd
e 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	 	 	 	 	 	 	 	 	 	 	 d!dZ-y)"    )annotationsN)AnyFinal)cli_utilconfigenv_util	file_utilnet_utilsecrets)CONFIG_FILENAMES)MIN_GIT_VERSIONGitRepo)
get_logger)report_watchdog_availability
watch_file)Serverserver_address_is_unix_socketserver_utilr   _LOGGERi   @c                    t         j                  d        fd}t        j                  t        j                  |       t        j                  t        j                  |       t
        j                  dk(  r%t        j                  t        j                  |       y t        j                  t        j                  |       y )NzSetting up signal handlerc                &    j                          y N)stop)signal_numberstack_frameservers     L/var/www/openai/venv/lib/python3.12/site-packages/streamlit/web/bootstrap.pysignal_handlerz._set_up_signal_handler.<locals>.signal_handler*   s        win32)	r   debugsignalSIGTERMSIGINTsysplatformSIGBREAKSIGQUIT)r   r   s   ` r   _set_up_signal_handlerr)   '   sk    MM-. MM&...1
MM&--0
||wfoo~6fnnn5r   c                ~    t         j                  j                  dt        j                  j	                  |              y)zAdd the script's folder to the sys path.

    Python normally does this automatically, but since we exec the script
    ourselves we need to do it instead.
    r   N)r%   pathinsertosdirname)main_script_paths    r   _fix_sys_pathr0   6   s$     HHOOArww'789r   c                     t         j                  rD	 ddlm} m} t        t        j                               | u rt        j                   |              yyy# t        $ r Y yw xY w)a/  Set default asyncio policy to be compatible with Tornado 6.

    Tornado 6 (at least) is not compatible with the default
    asyncio implementation on Windows. So here we
    pick the older SelectorEventLoopPolicy when the OS is Windows
    if the known-incompatible default policy is in use.

    This has to happen as early as possible to make it a low priority and
    overridable

    See: https://github.com/tornadoweb/tornado/issues/2608

    FIXME: if/when tornado supports the defaults in asyncio,
    remove and bump tornado requirement for py38
    r   WindowsProactorEventLoopPolicyWindowsSelectorEventLoopPolicyN)	r   
IS_WINDOWSasyncior3   r4   typeget_event_loop_policyset_event_loop_policyImportErrorr2   s     r   _fix_tornado_crashr;   ?   sd      	P G11348VV --.L.NO W   		s   A 	A"!A"c                4    ddl }| gt        |      z   |_        y)ztsys.argv needs to exclude streamlit arguments and parameters
    and be set to what a user's script may expect.
    r   N)r%   listargv)r/   argsr%   s      r   _fix_sys_argvr@   _   s      !DJ.CHr   c                f   t        | j                         t        | j                         t        | j                         t                	 t        j                          d }t        j                         j                  |       y # t        $ r!}t        j                  d|       Y d }~Ld }~ww xY w)Nz Failed to load secrets.toml file)exc_infoc                 F   t        j                  d      ry t        j                  d      rt        j                  d      } n8t        j                  d      r!t               ry t        j                  d      } nd} t	        j
                  t        j                  |              y )Nserver.headlessbrowser.serverAddressserver.address	localhost)r   
get_optionis_manually_setr   r   open_browserr   get_url)addrs    r   maybe_open_browserz,_on_server_start.<locals>.maybe_open_browserv   s{    ./!!"9:$$%<=D##$45,.$$%56DDk11$78r   )_maybe_print_old_git_warningr/   "_maybe_print_static_folder_warning
_print_urlis_running_hellor   r   load_if_toml_exists	Exceptionr   errorr6   get_running_loop	call_soon)r   exrM   s      r   _on_server_startrX   h   s     !8!89&v'>'>?v&&' "
G##%9$ (();<+  G82FFGs   B 	B0B++B0c                 P    t        j                  d      t        j                  d<   y)z_Sets MAPBOX_API_KEY environment variable needed for PyDeck otherwise it will throw an exceptionzmapbox.tokenMAPBOX_API_KEYN)r   rH   r-   environ r   r   _fix_pydeck_mapbox_api_warningr]      s     $*#4#4^#DBJJ r   c                h   t        j                  d      rt        j                  |       }t        j
                  j                  |      st        j                  d| dd       yt        j                  |      }|t        kD  r.t        j                  dd       t        j                  dd       yyy)	z7Prints a warning if the static folder is misconfigured.zserver.enableStaticServingzGWARNING: Static file serving is enabled, but no static folder found at zJ. To disable static file serving, set server.enableStaticServing to false.yellowfgFzVWARNING: Static folder size is larger than 1GB. Static file serving has been disabled.N)r   rH   r	   get_app_static_dirr-   r+   isdirr   print_to_cliget_directory_sizeMAX_APP_STATIC_FOLDER_SIZE
set_option)r/   static_folder_pathstatic_folder_sizes      r   rO   rO      s     56&99:JKww}}/0!!() *;< 	 "+!=!=>P!Q!$>>!!">F%%= ? 7r   c                "   | rd}nd}g }t        j                  d      r-dt        j                  t        j                  d            fg}nt        j                  d      r6t               s,dt        j                  t        j                  d            fg}nt               rdt        j                  d      fg}ndt        j                  d      fg}t        j                         }|r&|j                  d	t        j                  |      f       t        j                  d
      r<t        j                         }|r&|j                  dt        j                  |      f       t        j                  d       t        j                  d|z  dd       t        j                  d       |D ]8  \  }}t        j                  d| ddd       t        j                  |d       : t        j                  d       | rt        j                  d       t        j                  dd       t        j                  dd       t        j                  d       t        j                  d       t        j                  d       t        j                  d       y y )Nz9Welcome to Streamlit. Check out our demo in your browser.z4You can now view your Streamlit app in your browser.rE   URLrF   zUnix Socketz	Local URLrG   zNetwork URLrD   zExternal URL z  %sblueTra   boldz  z: F)nlra   )ro   z5  Ready to create your own Python apps super quickly?z  Head over to )rp   zhttps://docs.streamlit.ioz  May you create awesome apps!)r   rI   r   rK   rH   r   r
   get_internal_ipappendget_external_ipr   rd   )rQ   title_message
named_urlsinternal_ipexternal_ipurl_nameurls          r   rP   rP      s$   SNJ56K''(9(9:Q(RST


 	/09V9X K''(9(9:J(KLM

 
'	(F--.>?@

 +--k:;

 ..0}k.A.A+.NOP./"224K!!>;3F3F{3S"TU"&=0V$G"##8*B/EfEc- $ "UV/E:9Eb!>?b!b! r   c                   t        |       }|j                         s|j                  |j                  t        k  rdj	                  d |j                  D              }dj	                  d t        D              }t        j                  d       t        j                  ddd	       t        j                  d       t        j                  d
| d| dd       t        j                  dd       t        j                  dd       yyyy)zIf our script is running in a Git repo, and we're running a very old
    Git version, print a warning that Git integration will be unavailable.
    N.c              3  2   K   | ]  }t        |        y wr   str.0vals     r   	<genexpr>z/_maybe_print_old_git_warning.<locals>.<genexpr>   s     %K:J3c#h:J   c              3  2   K   | ]  }t        |        y wr   r}   r   s     r   r   z/_maybe_print_old_git_warning.<locals>.<genexpr>   s     %J/3c#h/r   rl   z  Git integration is disabled.r_   Trn   z  Streamlit requires Git z or later, but you have r`   z>  Git is used by Streamlit Cloud (https://streamlit.io/cloud).z,  To enable this feature, please update Git.)r   is_validgit_versionr   joinr   rd   )r/   repogit_version_stringmin_version_strings       r   rN   rN      s     #$DMMO(. XX%K$:J:J%KK XX%J/%JJb!>8RVWb!'(:'; <./q2	

 	L	
 	:x	
! / ) r   c                    | j                         D ci c]  \  }}||dk7  r|j                  dd      |! }}}t        j                  d|       yc c}}w )a;  Load config options from config.toml files, then overlay the ones set by
    flag_options.

    The "streamlit run" command supports passing Streamlit's config options
    as flags. This function reads through the config options set via flag,
    massages them, and passes them to get_config_options() so that they
    overwrite config option defaults and those loaded from config.toml files.

    Parameters
    ----------
    flag_options : dict[str, Any]
        A dict of config options where the keys are the CLI flag version of the
        config option names.
    Nr\   _r{   T)force_reparseoptions_from_flags)itemsreplacer   get_config_options)flag_optionsnamer   r   s       r   load_config_optionsr     sd    ( &++--ID#?sby 	S##-   DEWXs   $Ac                ~      fd}t         D ].  }t        j                  j                  |      s#t	        ||       0 y )Nc                    t               y r   )r   )_pathr   s    r   on_config_changedz3_install_config_watchers.<locals>.on_config_changed   s    L)r   )r   r-   r+   existsr   )r   r   filenames   `  r   _install_config_watchersr     s/    * %77>>(#x!23 %r   F)stop_immediately_for_testingc               T   t        |        t                t        | |       t                t	        |       t        | |      dfdfd}t        j                         j                         rt        j                   |              yt        j                   |              y)zuRun a script in a separate thread and start a server for the app.

    This starts a blocking asyncio eventloop.
    c                    K    j                          d {    t                t                r%t        j	                  d        j                           j                   d {    y 7 V7 w)Nz'Stopping server immediately for testing)startrX   r)   r   r!   r   stopped)r   r   s   r   
run_serverzrun.<locals>.run_server=  s]     lln  	v& (MMCDKKM nn 	 	s"   A2A.AA2(A0)A20A2c                 0   K             d {    y 7 wr   r\   )r   s   r   mainzrun.<locals>.mainT  s     ls   NreturnNone)r0   r;   r@   r]   r   r   r6   get_event_loop
is_runningcreate_taskrun)r/   is_hellor?   r   r   r   r   r   s       ` @@r   r   r   (  s}     "#"D)"$\* $h/F. **,DF# 	DFr   )r   r   r   r   )r/   r~   r   r   r   )r/   r~   r?   	list[str]r   r   )rQ   boolr   r   )r   dict[str, Any]r   r   )r/   r~   r   r   r?   r   r   r   r   r   r   r   ).
__future__r   r6   r-   r"   r%   typingr   r   	streamlitr   r   r   r	   r
   r   streamlit.configr   streamlit.git_utilr   r   streamlit.loggerr   streamlit.watcherr   r   streamlit.web.serverr   r   r   __name__r   __annotations__rf   r)   r0   r;   r@   rX   r]   rO   rP   rN   r   r   r   r\   r   r   <module>r      s    #  	  
  N N - 7 ' F S SH% % 4 6:P@/ =FE28"v
:Y:4 */555 5 !	5 #'5 
5r   