Ë
    úmxi?Y  ã                  óÆ  — U 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 d dlmZ d dl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 d d
lmZmZmZmZmZ d dl m!Z! d dl"m#Z$ d dl"m%Z& d dl'm(Z) d dl*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6 erd dl7m8Z8 d dl9m:Z: e6e5z  e;e6e5z     z  dz  Z<de=d<   e>ed   z  Z?de=d<   	 	 	 	 dd„Z@e G d„ d«      «       ZA G d„ d«      ZBy) é    )Úannotations)Ú	dataclass)Údedent)ÚTYPE_CHECKINGÚLiteralÚ	TypeAliasÚcastÚoverload)Úconfig)Úenforce_filename_restrictionÚnormalize_upload_file_type)Úcurrent_form_id)ÚLayoutConfigÚWidthWithoutContentÚvalidate_width)Úcheck_widget_policiesÚmaybe_raise_label_warnings)ÚKeyÚLabelVisibilityÚcompute_and_register_element_idÚ get_label_visibility_proto_valueÚto_key)ÚStreamlitAPIException)ÚFileUploaderState)ÚUploadedFileInfo)ÚFileUploader)Úgather_metrics)ÚScriptRunContextÚget_script_run_ctx)Ú
WidgetArgsÚWidgetCallbackÚWidgetKwargsÚregister_widget)ÚDeletedFileÚUploadedFile)ÚSequence)ÚDeltaGeneratorNr   ÚSomeUploadedFilesÚ	directoryÚAcceptMultipleFilesc                ó  — | €g S t        «       }|€g S | j                  }t        |«      dk(  rg S |j                  j	                  |j
                  |D �cg c]  }|j                  ‘Œ c}¬«      }|D �ci c]  }|j                  |“Œ }}g }|D ]k  }|j                  |j                  «      }|�(t        ||j                  «      }|j                  |«       ŒH|j                  t        |j                  «      «       Œm |S c c}w c c}w )Nr   )Ú
session_idÚfile_ids)r   Úuploaded_file_infoÚlenÚuploaded_file_mgrÚ	get_filesr,   Úfile_idÚgetr%   Ú	file_urlsÚappendr$   )	Úwidget_valueÚctxr.   ÚfÚfile_recs_listÚ	file_recsÚcollected_filesÚmaybe_file_recÚuploaded_files	            ú_/home/htdocs/ttos/venv/lib/python3.12/site-packages/streamlit/elements/widgets/file_uploader.pyÚ_get_upload_filesr?   I   s  € ð ÐØˆ	ä
Ó
€CØ
€{Øˆ	à%×8Ñ8ÐÜ
ÐÓ !Ò#Øˆ	à×*Ñ*×4Ñ4Ø—>‘>Ø%7Ö8 �!—)“)Ò8ð 5ó €Nð
 (6Ö6 !�—‘˜A‘Ð6€IÐ6à8:€Oàò ;ˆØ"Ÿ™ q§y¡yÓ1ˆØÐ%Ü(¨¸¿¹ÓEˆMØ×"Ñ" =Õ1à×"Ñ"¤;¨q¯y©yÓ#9Õ:ð;ð Ðùò 9ùò 7s   ÁC<
Á2Dc                  ó6   — e Zd ZU ded<   dZded<   dd„Zd	d„Zy)
ÚFileUploaderSerder*   Úaccept_multiple_filesNzSequence[str] | NoneÚallowed_typesc                ó&  — t        |«      }|D ]@  }t        |t        «      rŒ| j                  sŒ!t	        |j
                  | j                  «       ŒB | j                  du xs | j                  dk(  }t        |«      dk(  r
|rg }|S d }|S |r|n|d   }|S )NTr)   r   )r?   Ú
isinstancer$   rC   r   ÚnamerB   r/   )ÚselfÚui_valueÚupload_filesÚfileÚis_multiple_or_directoryÚreturn_values         r>   ÚdeserializezFileUploaderSerde.deserializep   sµ   € Ü(¨Ó2ˆà ò 	LˆDÜ˜$¤Ô,Øà×!Ó!Ü,¨T¯Y©Y¸×8JÑ8JÕKð	Lð ×&Ñ&¨$Ð.ò 9Ø×)Ñ)¨[Ñ8ð 	!ô
 ˆ|Ó Ò!Ù4L¨bˆLð Ðð SWˆLð Ðñ ,D™<ÈÐVWÉˆLØÐó    c                ó\  — t        «       }|s|S t        |t        «      s|g}|D ]…  }t        |t        «      rŒ|j                  j                  «       }|j                  |_        |j                  |_        |j                  |_        |j                  j                  |j                  «       Œ‡ |S ©N)ÚFileUploaderStateProtorE   Úlistr$   r.   Úaddr2   rF   Úsizer4   ÚCopyFromÚ
_file_urls)rG   ÚfilesÚstate_protor8   Ú	file_infos        r>   Ú	serializezFileUploaderSerde.serialize†   s–   € Ü,Ó.ˆáØÐÜ˜%¤Ô&Ø�GˆEàò 	7ˆAÜ˜!œ[Ô)ØØ/:×/MÑ/M×/QÑ/QÓ/SˆIØ !§	¡	ˆIÔØŸV™VˆIŒNØŸV™VˆIŒNØ×Ñ×(Ñ(¨¯©Õ6ð	7ð ÐrN   )rH   úFileUploaderStateProto | NoneÚreturnr(   )rW   r(   r\   rQ   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__rC   rM   rZ   © rN   r>   rA   rA   k   s   … à.Ó.Ø*.€MÐ'Ó.óô,rN   rA   c                  óZ  — e Zd Ze	 	 	 	 	 ddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Ze	 	 	 	 	 	 ddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zedddddddddddœ
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	„«       Zedddddddddddd
œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Z ed«      	 	 	 	 	 	 	 ddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Z	 	 	 	 	 	 	 dddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Zy)ÚFileUploaderMixinNFÚvisibleÚstretch)Úmax_upload_sizeÚdisabledÚlabel_visibilityÚwidthc	                ó   — y rP   ra   ©rG   ÚlabelÚtyperB   ÚkeyÚhelpÚ	on_changeÚargsÚkwargsrf   rg   rh   ri   s                r>   Úfile_uploaderzFileUploaderMixin.file_uploader¨   ó   € ð  !rN   c	                ó   — y rP   ra   rk   s                r>   rs   zFileUploaderMixin.file_uploader¼   ó   € ð  "rN   )
rm   rn   ro   rp   rq   rr   rf   rg   rh   ri   c                ó   — y rP   ra   ©rG   rl   rB   rm   rn   ro   rp   rq   rr   rf   rg   rh   ri   s                r>   rs   zFileUploaderMixin.file_uploaderÕ   rt   rN   )rB   rm   rn   ro   rp   rq   rr   rf   rg   rh   ri   c                ó   — y rP   ra   rx   s                r>   rs   zFileUploaderMixin.file_uploaderé   rv   rN   rs   c	               óR   — t        «       }| j                  |||	|||||||
|||¬«      S )aC   Display a file uploader widget.

        By default, uploaded files are limited to 200 MB each. You can
        configure this globally using the ``server.maxUploadSize`` configuration
        option. For more information on how to set configuration options, see
        |config.toml|_. Additionally, you can set a per-widget limit using the
        ``max_upload_size`` parameter.

        .. |config.toml| replace:: ``config.toml``
        .. _config.toml: https://docs.streamlit.io/develop/api-reference/configuration/config.toml

        Parameters
        ----------
        label : str
            A short label explaining to the user what this file uploader is for.
            The label can optionally contain GitHub-flavored Markdown of the
            following types: Bold, Italics, Strikethroughs, Inline Code, Links,
            and Images. Images display like icons, with a max height equal to
            the font height.

            Unsupported Markdown elements are unwrapped so only their children
            (text contents) render. Display unsupported elements as literal
            characters by backslash-escaping them. E.g.,
            ``"1\. Not an ordered list"``.

            See the ``body`` parameter of |st.markdown|_ for additional,
            supported Markdown directives.

            For accessibility reasons, you should never set an empty label, but
            you can hide it with ``label_visibility`` if needed. In the future,
            we may disallow empty labels by raising an exception.

            .. |st.markdown| replace:: ``st.markdown``
            .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown

        type : str, list of str, or None
            The allowed file extension(s) for uploaded files. This can be one
            of the following types:

            - ``None`` (default): All file extensions are allowed.
            - A string: A single file extension is allowed. For example, to
              only accept CSV files, use ``"csv"``.
            - A sequence of strings: Multiple file extensions are allowed. For
              example, to only accept JPG/JPEG and PNG files, use
              ``["jpg", "jpeg", "png"]``.

            .. note::
                This is a best-effort check, but doesn't provide a
                security guarantee against users uploading files of other types
                or type extensions. The correct handling of uploaded files is
                part of the app developer's responsibility.

        max_upload_size : int or None
            The maximum allowed size of each uploaded file in megabytes.

            If this is ``None`` (default), the maximum file size is set by the
            ``server.maxUploadSize`` configuration option in your
            ``config.toml`` file. If this is an integer, it must be positive
            and will override the ``server.maxUploadSize`` configuration option.

        accept_multiple_files : bool or "directory"
            Whether to accept more than one file in a submission. This can be one
            of the following values:

            - ``False`` (default): The user can only submit one file at a time.
            - ``True``: The user can upload multiple files at the same time.
            - ``"directory"``: The user can select a directory to upload all
              files in the directory and its subdirectories. If ``type`` is
              set, only files matching those type(s) will be uploaded.

            When this is ``True`` or ``"directory"``, the return value will be
            a list and a user can additively select files if they click the
            browse button on the widget multiple times.

        key : str or int
            An optional string or integer to use as the unique key for the widget.
            If this is omitted, a key will be generated for the widget
            based on its content. No two widgets may have the same key.

        help : str or None
            A tooltip that gets displayed next to the widget label. Streamlit
            only displays the tooltip when ``label_visibility="visible"``. If
            this is ``None`` (default), no tooltip is displayed.

            The tooltip can optionally contain GitHub-flavored Markdown,
            including the Markdown directives described in the ``body``
            parameter of ``st.markdown``.

        on_change : callable
            An optional callback invoked when this file_uploader's value
            changes.

        args : list or tuple
            An optional list or tuple of args to pass to the callback.

        kwargs : dict
            An optional dict of kwargs to pass to the callback.

        disabled : bool
            An optional boolean that disables the file uploader if set to
            ``True``. The default is ``False``.

        label_visibility : "visible", "hidden", or "collapsed"
            The visibility of the label. The default is ``"visible"``. If this
            is ``"hidden"``, Streamlit displays an empty spacer instead of the
            label, which can help keep the widget aligned with other widgets.
            If this is ``"collapsed"``, Streamlit displays no label or spacer.

        width : "stretch" or int
            The width of the file uploader widget. This can be one of the
            following:

            - ``"stretch"`` (default): The width of the widget matches the
              width of the parent container.
            - An integer specifying the width in pixels: The widget has a
              fixed width. If the specified width is greater than the width of
              the parent container, the width of the widget matches the width
              of the parent container.

        Returns
        -------
        None, UploadedFile, or list of UploadedFile
            - If accept_multiple_files is ``False``, returns either ``None`` or
              an ``UploadedFile`` object.
            - If accept_multiple_files is ``True`` or ``"directory"``, returns
              a list with the uploaded files as ``UploadedFile`` objects. If no
              files were uploaded, returns an empty list.

            The ``UploadedFile`` class is a subclass of ``BytesIO``, and
            therefore is "file-like". This means you can pass an instance of it
            anywhere a file is expected.

        Examples
        --------
        **Example 1: Accept a single file at a time**

        >>> import streamlit as st
        >>> import pandas as pd
        >>> from io import StringIO
        >>>
        >>> uploaded_file = st.file_uploader("Choose a file")
        >>> if uploaded_file is not None:
        ...     # To read file as bytes:
        ...     bytes_data = uploaded_file.getvalue()
        ...     st.write(bytes_data)
        >>>
        ...     # To convert to a string based IO:
        ...     stringio = StringIO(uploaded_file.getvalue().decode("utf-8"))
        ...     st.write(stringio)
        >>>
        ...     # To read file as string:
        ...     string_data = stringio.read()
        ...     st.write(string_data)
        >>>
        ...     # Can be used wherever a "file-like" object is accepted:
        ...     dataframe = pd.read_csv(uploaded_file)
        ...     st.write(dataframe)

        **Example 2: Accept multiple files at a time**

        >>> import pandas as pd
        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Upload data", accept_multiple_files=True, type="csv"
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     df = pd.read_csv(uploaded_file)
        ...     st.write(df)

        .. output::
           https://doc-file-uploader.streamlit.app/
           height: 375px

        **Example 3: Accept an entire directory**

        >>> import streamlit as st
        >>>
        >>> uploaded_files = st.file_uploader(
        ...     "Upload images", accept_multiple_files="directory", type=["jpg", "png"]
        ... )
        >>> for uploaded_file in uploaded_files:
        ...     st.image(uploaded_file)

        .. output::
           https://doc-file-uploader-directory.streamlit.app/
           height: 375px

        )rl   rm   rf   rB   rn   ro   rp   rq   rr   rg   rh   ri   r7   )r   Ú_file_uploader)rG   rl   rm   rB   rn   ro   rp   rq   rr   rf   rg   rh   ri   r7   s                 r>   rs   zFileUploaderMixin.file_uploaderû   sL   € ô\ !Ó"ˆØ×"Ñ"ØØØ+Ø"7ØØØØØØØ-ØØð #ó 
ð 	
rN   )rf   rh   rg   r7   ri   c	               ó:  — t        |«      }|	� t        |	t        «      r|	dk  rt        d«      ‚t	        | j
                  ||d d¬«       t        ||
«       t        d||	h d£| j
                  |||||¬«
      }|rt        |«      nd }t        «       }||_
        ||_        |�|ng |j                  d d  |	�|	|_        nt        j                  d«      |_        |d	k(  }|d
u xs ||_        ||_        t%        | j
                  «      |_        ||_        t+        |
«      |j,                  _        |�t1        |«      |_        t5        ||¬«      }t7        |j                  ||||j8                  |j:                  |d¬«      }t=        |«       t?        |¬«      }| j
                  jA                  d||¬«       t        |j.                  tB        «      ry t        |j.                  tD        «      r+|j.                  D �cg c]  }t        |tB        «      rŒ|‘Œ c}S |j.                  S c c}w )Nr   z´The `max_upload_size` parameter must be a positive integer representing the maximum file size in megabytes, or None to fall back to the `server.maxUploadSize` configuration option.F)Údefault_valueÚwrites_allowedrs   >   rm   rf   rB   )	Úuser_keyrf   Úkey_as_main_identityÚdgrl   rm   rB   ro   ri   zserver.maxUploadSizer)   T)rC   Úfile_uploader_state_value)Úon_change_handlerrq   rr   ÚdeserializerÚ
serializerr7   Ú
value_type)ri   )Úlayout_config)#r   rE   Úintr   r   r�   r   r   r   ÚFileUploaderProtoÚidrl   rm   Úmax_upload_size_mbr   Ú
get_optionÚmultiple_filesÚaccept_directoryr   Úform_idrg   r   rh   Úvaluer   ro   rA   r#   rM   rZ   r   r   Ú_enqueuer$   rR   )rG   rl   rm   rB   rn   ro   rp   rq   rr   rf   rh   rg   r7   ri   Ú
element_idÚnormalized_typeÚfile_uploader_protoÚis_directory_uploadÚserdeÚwidget_stater‡   r8   s                         r>   r{   z FileUploaderMixin._file_uploaderÚ  sB  € ô" �S‹kˆð Ð&Ü˜?¬CÔ0°OÀqÒ4Hä'ðSóð ô 	Ø�G‰GØØØØ õ	
ô 	# 5Ð*:Ô;ä4ØØØ+ò
 "VØ�w‰wØØØ"7ØØô
ˆ
ñ" ?CÔ4°TÔ:Èˆä/Ó1ÐØ!+ÐÔØ$)ÐÔ!à.Ð:‰OÀð 	× Ñ ¡Ð#ð Ð&Ø5DÐÕ2ä5;×5FÑ5FØ&ó6ÐÔ2ð
 4°{ÑBÐà! TÐ)Ò@Ð-@ð 	Ô*ð 0CÐÔ,Ü&5°d·g±gÓ&>ÐÔ#Ø'/ÐÔ$Ü5UØó6
Ð×,Ñ,Ô2ð ÐÜ'-¨d£|ÐÔ$ä!Ð"7ÀÔWˆô
 'Ø×"Ñ"Ø'ØØØ×*Ñ*Ø—‘ØØ2ô	
ˆô 	�uÔÜ$¨5Ô1ˆà�‰×ÑØÐ0Àð 	ô 	
ô �l×(Ñ(¬+Ô6ØÜ�l×(Ñ(¬$Ô/Ø+×1Ñ1ÖT˜!¼ÀAÄ{Õ9S’AÒTÐTà×!Ñ!Ð!ùò Us   Ç/HÈHc                ó   — t        d| «      S )zGet our DeltaGenerator.r'   )r	   )rG   s    r>   r�   zFileUploaderMixin.dgM  s   € ô Ð$ dÓ+Ð+rN   )NNNNN)rl   Ústrrm   ústr | Sequence[str] | NonerB   úLiteral[True, 'directory']rn   ú
Key | Nonero   ú
str | Nonerp   úWidgetCallback | Nonerq   úWidgetArgs | Nonerr   úWidgetKwargs | Nonerf   ú
int | Nonerg   Úboolrh   r   ri   r   r\   úlist[UploadedFile])FNNNNN)rl   r™   rm   rš   rB   úLiteral[False]rn   rœ   ro   r�   rp   rž   rq   rŸ   rr   r    rf   r¡   rg   r¢   rh   r   ri   r   r\   úUploadedFile | None)rl   r™   rB   r›   rm   rš   rn   rœ   ro   r�   rp   rž   rq   rŸ   rr   r    rf   r¡   rg   r¢   rh   r   ri   r   r\   r£   )rl   r™   rB   r¤   rm   rš   rn   rœ   ro   r�   rp   rž   rq   rŸ   rr   r    rf   r¡   rg   r¢   rh   r   ri   r   r\   r¥   )NFNNNNN)rl   r™   rm   rš   rB   r*   rn   rœ   ro   r�   rp   rž   rq   rŸ   rr   r    rf   r¡   rg   r¢   rh   r   ri   r   r\   ú(UploadedFile | list[UploadedFile] | None)rl   r™   rm   rš   rB   r*   rn   rœ   ro   r�   rp   rž   rq   rŸ   rr   r    rf   r¡   rh   r   rg   r¢   r7   zScriptRunContext | Noneri   r   r\   r¦   )r\   r'   )	r]   r^   r_   r
   rs   r   r{   Úpropertyr�   ra   rN   r>   rc   rc   š   s•  „ ð ð ØØ+/Ø"&Ø&*ð!ð '+ØØ,5Ø%.ñ!àð!ð )ð!ð  :ð	!ð
 ð!ð ð!ð )ð!ð  ð!ð $ð!ð $ð!ð ð!ð *ð!ð #ð!ð 
ò!ó ð!ð& ð
 16ØØØ+/Ø"&Ø&*ð"ð '+ØØ,5Ø%.ñ"àð"ð )ð"ð  .ð	"ð
 ð"ð ð"ð )ð"ð  ð"ð $ð"ð $ð"ð ð"ð *ð"ð #ð"ð 
ò"ó ð"ð0 ð ,0ØØØ+/Ø"&Ø&*Ø&*ØØ,5Ø%.ñ!àð!ð  :ð	!ð
 )ð!ð ð!ð ð!ð )ð!ð  ð!ð $ð!ð $ð!ð ð!ð *ð!ð #ð!ð 
ò!ó ð!ð& ð
 16Ø+/ØØØ+/Ø"&Ø&*Ø&*ØØ,5Ø%.ñ"àð"ð  .ð	"ð
 )ð"ð ð"ð ð"ð )ð"ð  ð"ð $ð"ð $ð"ð ð"ð *ð"ð #ð"ð 
ò"ó ð"ñ" �OÓ$ð ,0Ø5:ØØØ+/Ø"&Ø&*ð\
ð '+ØØ,5Ø%.ñ\
àð\
ð )ð\
ð  3ð	\
ð
 ð\
ð ð\
ð )ð\
ð  ð\
ð $ð\
ð $ð\
ð ð\
ð *ð\
ð #ð\
ð 
2ò\
ó %ð\
ðB ,0Ø5:ØØØ+/Ø"&Ø&*ðq"ð '+Ø,5ØØ'+Ø%.ñq"àðq"ð )ðq"ð  3ð	q"ð
 ðq"ð ðq"ð )ðq"ð  ðq"ð $ðq"ð $ðq"ð *ðq"ð ðq"ð %ðq"ð #ðq"ð  
2ó!q"ðf ò,ó ñ,rN   rc   )r6   r[   r\   z list[UploadedFile | DeletedFile])CÚ
__future__r   Údataclassesr   Útextwrapr   Útypingr   r   r   r	   r
   Ú	streamlitr   Ú*streamlit.elements.lib.file_uploader_utilsr   r   Ú!streamlit.elements.lib.form_utilsr   Ú#streamlit.elements.lib.layout_utilsr   r   r   Ústreamlit.elements.lib.policiesr   r   Ústreamlit.elements.lib.utilsr   r   r   r   r   Ústreamlit.errorsr   Ústreamlit.proto.Common_pb2r   rQ   r   ÚUploadedFileInfoProtoÚ streamlit.proto.FileUploader_pb2r   r‰   Ústreamlit.runtime.metrics_utilr   Ústreamlit.runtime.scriptrunnerr   r   Ústreamlit.runtime.stater    r!   r"   r#   Ú'streamlit.runtime.uploaded_file_managerr$   r%   Úcollections.abcr&   Ústreamlit.delta_generatorr'   rR   r(   r`   r¢   r*   r?   rA   rc   ra   rN   r>   ú<module>r¼      sæ   ðö #å !Ý ß DÕ Då ÷õ >÷ñ ÷
÷õ õ 3Ý RÝ PÝ NÝ 9ß O÷ó ÷ NáÝ(å8ð �;Ñ  l°[Ñ&@Ñ!AÑAÀDÑHð �9ó ð "&¨°Ñ(<Ñ!<Ð �YÓ <ðØ/ðà%óðD ÷+ð +ó ð+÷\v,ò v,rN   