Ë
    Q^(h š  ã                   ó  — d Z ddlZddlZddlZddlZddl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mZ ddlmZmZmZmZmZmZmZmZmZmZmZ dd	lmZ d
d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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d
dl-m8Z9 d
dl:m;Z; erd
dl<m=Z=  e4j|                  e?«      Z@ed   ZAdZBdZCe G d„ d«      «       ZDe G d„ d«      «       ZEe G d„ d«      «       ZFdeGdeGfd„ZHeeFeEeDf   ZIdeeI   ddfd „ZJe7dd!dd"œd#eeF   d$eGd%eGd&eeGeGf   d'eeG   d(eKd)eeG   fd*„«       ZLe7dddd+œd#eeF   d$eGd%eGd&eeGeGf   d'eeG   d)eeG   d,eeM   fd-„«       ZNd.eOfd/„ZPe7	 	 	 d:d#eeF   d$eGd%eGd&eeGeGf   d)eGd'eeG   d,eMd0eeG   ddfd1„«       ZQe7	 d;d2eeE   d$eGd%eGd&eeGeGf   d)eGd'eeG   deeeGeeG   f   ed3eRf   f   fd4„«       ZS	 	 d<deeI   d5eeeGeeG   f   ed3eRf   f   d6eGd7eeG   d8eeG   deeeGef      fd9„ZTy)=z<
Type definitions and utilities for the `create_commit` API
é    N)Údefaultdict)Úcontextmanager)Ú	dataclassÚfield)Úgroupby)ÚPathÚPurePosixPath)ÚTYPE_CHECKINGÚAnyÚBinaryIOÚDictÚIterableÚIteratorÚListÚLiteralÚOptionalÚTupleÚUnion)Ú
thread_mapé   )Ú	constants)ÚEntryNotFoundErrorÚHfHubHTTPErrorÚXetAuthorizationErrorÚXetRefreshTokenError)Ú
hf_hub_url)Ú
UploadInfoÚ
lfs_uploadÚpost_lfs_batch_info)
ÚFORBIDDEN_FOLDERSÚXetTokenTypeÚchunk_iterableÚ(fetch_xet_connection_info_from_repo_infoÚget_sessionÚhf_raise_for_statusÚloggingÚshaÚtqdm_stream_fileÚvalidate_hf_hub_args)Útqdm)Ú_get_progress_bar_context)ÚRepoFile©ÚlfsÚregulariô  é   c                   ó@   — e Zd ZU dZeed<   dZeee	d   f   ed<   d„ Z
y)ÚCommitOperationDeletea«  
    Data structure holding necessary info to delete a file or a folder from a repository
    on the Hub.

    Args:
        path_in_repo (`str`):
            Relative filepath in the repo, for example: `"checkpoints/1fec34a/weights.bin"`
            for a file or `"checkpoints/1fec34a/"` for a folder.
        is_folder (`bool` or `Literal["auto"]`, *optional*)
            Whether the Delete Operation applies to a folder or not. If "auto", the path
            type (file or folder) is guessed automatically by looking if path ends with
            a "/" (folder) or not (file). To explicitly set the path type, you can set
            `is_folder=True` or `is_folder=False`.
    Úpath_in_repoÚautoÚ	is_folderc                 óü   — t        | j                  «      | _        | j                  dk(  r | j                  j                  d«      | _        t	        | j                  t
        «      st        d| j                  › d�«      ‚y )Nr4   ú/zNWrong value for `is_folder`. Must be one of [`True`, `False`, `'auto'`]. Got 'z'.)Ú_validate_path_in_repor3   r5   ÚendswithÚ
isinstanceÚboolÚ
ValueError©Úselfs    úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/huggingface_hub/_commit_api.pyÚ__post_init__z#CommitOperationDelete.__post_init__M   sn   € Ü2°4×3DÑ3DÓEˆÔà�>‰>˜VÒ#Ø!×.Ñ.×7Ñ7¸Ó<ˆDŒNÜ˜$Ÿ.™.¬$Ô/ÜØ`Ðae×aoÑaoÐ`pÐprÐsóð ð 0ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r5   r   r;   r   r@   © rA   r?   r2   r2   9   s,   … ñð ÓØ.4€Iˆu�T˜7 6™?Ð*Ñ+Ó4órA   r2   c                   óh   — e Zd ZU dZeed<   eed<   dZee   ed<   dZee   ed<   dZ	ee   ed<   d„ Z
y)	ÚCommitOperationCopyab  
    Data structure holding necessary info to copy a file in a repository on the Hub.

    Limitations:
      - Only LFS files can be copied. To copy a regular file, you need to download it locally and re-upload it
      - Cross-repository copies are not supported.

    Note: you can combine a [`CommitOperationCopy`] and a [`CommitOperationDelete`] to rename an LFS file on the Hub.

    Args:
        src_path_in_repo (`str`):
            Relative filepath in the repo of the file to be copied, e.g. `"checkpoints/1fec34a/weights.bin"`.
        path_in_repo (`str`):
            Relative filepath in the repo where to copy the file, e.g. `"checkpoints/1fec34a/weights_copy.bin"`.
        src_revision (`str`, *optional*):
            The git revision of the file to be copied. Can be any valid git revision.
            Default to the target commit revision.
    Úsrc_path_in_repor3   NÚsrc_revisionÚ_src_oidÚ	_dest_oidc                 ól   — t        | j                  «      | _        t        | j                  «      | _        y ©N)r8   rK   r3   r=   s    r?   r@   z!CommitOperationCopy.__post_init__w   s(   € Ü 6°t×7LÑ7LÓ MˆÔÜ2°4×3DÑ3DÓEˆÕrA   )rB   rC   rD   rE   rF   rG   rL   r   rM   rN   r@   rH   rA   r?   rJ   rJ   X   sI   … ñð& ÓØÓØ"&€L�(˜3‘-Ó&ð #€Hˆh�s‰mÓ"ð  $€Iˆx˜‰}Ó#óFrA   rJ   c                   óV  — e Zd ZU dZeed<   eeeee	f   ed<    e
dd¬«      Zeed<    e
ddd¬«      Zee   ed	<    e
ddd¬«      Zee   ed
<    e
ddd¬«      Zee   ed<    e
ddd¬«      Zeed<    e
ddd¬«      Zeed<   dd„Zeddedee	   fd„«       Zdefd„Zedee   fd„«       Zy)ÚCommitOperationAdda¿  
    Data structure holding necessary info to upload a file to a repository on the Hub.

    Args:
        path_in_repo (`str`):
            Relative filepath in the repo, for example: `"checkpoints/1fec34a/weights.bin"`
        path_or_fileobj (`str`, `Path`, `bytes`, or `BinaryIO`):
            Either:
            - a path to a local file (as `str` or `pathlib.Path`) to upload
            - a buffer of bytes (`bytes`) holding the content of the file to upload
            - a "file object" (subclass of `io.BufferedIOBase`), typically obtained
                with `open(path, "rb")`. It must support `seek()` and `tell()` methods.

    Raises:
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If `path_or_fileobj` is not one of `str`, `Path`, `bytes` or `io.BufferedIOBase`.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If `path_or_fileobj` is a `str` or `Path` but not a path to an existing file.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If `path_or_fileobj` is a `io.BufferedIOBase` but it doesn't support both
            `seek()` and `tell()`.
    r3   Úpath_or_fileobjF)ÚinitÚreprÚupload_infoN)rT   rU   ÚdefaultÚ_upload_modeÚ_should_ignoreÚ_remote_oidÚ_is_uploadedÚ_is_committedÚreturnc                 ó‚  — t        | j                  «      | _        t        | j                  t        «      rt        | j                  «      | _        t        | j                  t
        «      rtt        j                  j                  t        j                  j                  | j                  «      «      }t        j                  j                  |«      sDt        d|› d�«      ‚t        | j                  t        j                  t        f«      st        d«      ‚t        | j                  t        j                  «      rE	 | j                  j                  «        | j                  j!                  dt        j"                  «       t        | j                  t
        «      r%t)        j*                  | j                  «      | _        yt        | j                  t        «      r%t)        j.                  | j                  «      | _        yt)        j0                  | j                  «      | _        y# t$        t&        f$ r}t        d«      |‚d}~ww xY w)z6Validates `path_or_fileobj` and compute `upload_info`.zProvided path: 'z(' is not a file on the local file systemz�path_or_fileobj must be either an instance of str, bytes or io.BufferedIOBase. If you passed a file-like object, make sure it is in binary mode.r   zNpath_or_fileobj is a file-like object but does not implement seek() and tell()N)r8   r3   r:   rS   r   rF   ÚosÚpathÚnormpathÚ
expanduserÚisfiler<   ÚioÚBufferedIOBaseÚbytesÚtellÚseekÚSEEK_CURÚOSErrorÚAttributeErrorr   Ú	from_pathrV   Ú
from_bytesÚfrom_fileobj)r>   rS   Úexcs      r?   r@   z CommitOperationAdd.__post_init__¬   s§  € ä2°4×3DÑ3DÓEˆÔô �d×*Ñ*¬DÔ1Ü#& t×';Ñ';Ó#<ˆDÔ Ü�d×*Ñ*¬CÔ0Ü Ÿg™g×.Ñ.¬r¯w©w×/AÑ/AÀ$×BVÑBVÓ/WÓXˆOÜ—7‘7—>‘> /Ô2Ü Ð#3°OÐ3DÐDlÐ!mÓnÐnÜ˜D×0Ñ0´2×3DÑ3DÄeÐ2LÔMäð#óð ô
 �d×*Ñ*¬B×,=Ñ,=Ô>ðØ×$Ñ$×)Ñ)Ô+Ø×$Ñ$×)Ñ)¨!¬R¯[©[Ô9ô �d×*Ñ*¬CÔ0Ü)×3Ñ3°D×4HÑ4HÓIˆDÕÜ˜×,Ñ,¬eÔ4Ü)×4Ñ4°T×5IÑ5IÓJˆDÕä)×6Ñ6°t×7KÑ7KÓLˆDÕøô œ^Ð,ò Ü Ødóàðûðús   Ä7AH ÈH>È-H9È9H>Ú	with_tqdmc              #   óœ  K  — t        | j                  t        «      st        | j                  t        «      rI|r#t	        | j                  «      5 }|–— ddd«       yt        | j                  d«      5 }|–— ddd«       yt        | j                  t        «      r"t        j                  | j                  «      –— yt        | j                  t        j                  «      rS| j                  j                  «       }| j                  –— | j                  j                  |t        j                  «       yy# 1 sw Y   yxY w# 1 sw Y   yxY w­w)u�  
        A context manager that yields a file-like object allowing to read the underlying
        data behind `path_or_fileobj`.

        Args:
            with_tqdm (`bool`, *optional*, defaults to `False`):
                If True, iterating over the file object will display a progress bar. Only
                works if the file-like object is a path to a file. Pure bytes and buffers
                are not supported.

        Example:

        ```python
        >>> operation = CommitOperationAdd(
        ...        path_in_repo="remote/dir/weights.h5",
        ...        path_or_fileobj="./local/weights.h5",
        ... )
        CommitOperationAdd(path_in_repo='remote/dir/weights.h5', path_or_fileobj='./local/weights.h5')

        >>> with operation.as_file() as file:
        ...     content = file.read()

        >>> with operation.as_file(with_tqdm=True) as file:
        ...     while True:
        ...         data = file.read(1024)
        ...         if not data:
        ...              break
        config.json: 100%|â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ| 8.19k/8.19k [00:02<00:00, 3.72kB/s]

        >>> with operation.as_file(with_tqdm=True) as file:
        ...     requests.put(..., data=file)
        config.json: 100%|â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ| 8.19k/8.19k [00:02<00:00, 3.72kB/s]
        ```
        NÚrb)r:   rS   rF   r   r(   Úopenrf   rd   ÚBytesIOre   rg   rh   ÚSEEK_SET)r>   rp   ÚfileÚprev_poss       r?   Úas_filezCommitOperationAdd.as_fileÏ   s  è ø€ ôH �d×*Ñ*¬CÔ0´J¸t×?SÑ?SÔUYÔ4ZÙÜ% d×&:Ñ&:Ó;ð ¸tØ’J÷ð ô ˜$×.Ñ.°Ó5ð ¸Ø’J÷ð ä˜×,Ñ,¬eÔ4Ü—*‘*˜T×1Ñ1Ó2Ó2Ü˜×,Ñ,¬b×.?Ñ.?Ô@Ø×+Ñ+×0Ñ0Ó2ˆHØ×&Ñ&Ò&Ø× Ñ ×%Ñ% h´·±Õ<ð A÷ð ú÷ð üs7   ‚AEÁD4ÁEÁ2E Á7B=EÄ4D=Ä9EÅ E	ÅEc                 ó”   — | j                  «       5 }t        j                  |j                  «       «      cddd«       S # 1 sw Y   yxY w)z[
        The base64-encoded content of `path_or_fileobj`

        Returns: `bytes`
        N)rx   Úbase64Ú	b64encodeÚread©r>   rv   s     r?   Ú
b64contentzCommitOperationAdd.b64content  s8   € ð �\‰\‹^ð 	1˜tÜ×#Ñ# D§I¡I£KÓ0÷	1÷ 	1ò 	1ús	   ‘#>¾Ac                 ó  — | j                   €y| j                   dk(  r$| j                  j                  j                  «       S | j	                  «       5 }t        j                  |j                  «       «      cddd«       S # 1 sw Y   yxY w)aÊ  Return the OID of the local file.

        This OID is then compared to `self._remote_oid` to check if the file has changed compared to the remote one.
        If the file did not change, we won't upload it again to prevent empty commits.

        For LFS files, the OID corresponds to the SHA256 of the file content (used a LFS ref).
        For regular files, the OID corresponds to the SHA1 of the file content.
        Note: this is slightly different to git OID computation since the oid of an LFS file is usually the git-SHA1 of the
              pointer file content (not the actual file content). However, using the SHA256 is enough to detect changes
              and more convenient client-side.
        Nr.   )rX   rV   Úsha256Úhexrx   r'   Úgit_hashr|   r}   s     r?   Ú
_local_oidzCommitOperationAdd._local_oid
  sp   € ð ×ÑÐ$ØØ×Ñ %Ò'Ø×#Ñ#×*Ñ*×.Ñ.Ó0Ð0ð —‘“ð 1 4Ü—|‘| D§I¡I£KÓ0÷1÷ 1ò 1ús   Á#A>Á>B©r]   N)F)rB   rC   rD   rE   rF   rG   r   r   rf   r   r   rV   r   rX   r   Ú
UploadModerY   r;   rZ   r[   r\   r@   r   r   rx   r~   Úpropertyrƒ   rH   rA   r?   rR   rR   |   s  … ñð. ÓØ˜3  e¨XÐ5Ñ6Ó6Ù#¨°UÔ;€K�Ó;ñ
 */°EÀÈtÔ)T€L�(˜:Ñ&ÓTñ &+°¸EÈ4Ô%P€N�H˜T‘NÓPñ "'¨E¸ÀtÔ!L€K�˜#‘ÓLñ  E°¸uÔE€L�$ÓEñ   U°ÀÔF€M�4ÓFó!MðF ñ/= ð /=°(¸8Ñ2Dò /=ó ð/=ðb1˜Eó 1ð ð1˜H S™Mò 1ó ñ1rA   rR   r3   r]   c                 ó4  ‡— | j                  d«      r| dd  } | dk(  s| dk(  s| j                  d«      rt        d| › d�«      ‚| j                  d«      r| d	d  } t        D ]7  Št        ˆfd
„| j	                  d«      D «       «      sŒ't        d‰› d| › d�«      ‚ | S )Nr7   r   ú.z..z../z,Invalid `path_in_repo` in CommitOperation: 'ú'z./é   c              3   ó(   •K  — | ]	  }|‰k(  –— Œ y ­wrP   rH   )Ú.0ÚpartÚ	forbiddens     €r?   ú	<genexpr>z)_validate_path_in_repo.<locals>.<genexpr>+  s   øè ø€ ÒE Tˆt�yÕ ÑEùs   ƒzHInvalid `path_in_repo` in CommitOperation: cannot update files under a 'z/' folder (path: 'z').)Ú
startswithr<   r    ÚanyÚsplit)r3   rŽ   s    @r?   r8   r8   "  sÁ   ø€ à×Ñ˜sÔ#Ø# A BÐ'ˆØ�sÒ˜l¨dÒ2°l×6MÑ6MÈeÔ6TÜÐGÈÀ~ÐUVÐWÓXÐXØ×Ñ˜tÔ$Ø# A BÐ'ˆÜ&ò ˆ	ÜÓE¨\×-?Ñ-?ÀÓ-DÔEÕEÜØZÐ[dÐZeð fØ!�N #ð'óð ðð ÐrA   Ú
operationsc                 óú  — t        t        «      }| D ]ç  }|j                  }t        |t        «      r^||   dkD  rt        j                  d|› d�«       ||xx   dz  cc<   t        |«      j                  D ]  }|t        |«      xx   dz  cc<   Œ t        |t        «      sŒŽ|t        t        |«      «         dkD  sŒ©|j                  rt        j                  d|› d�«       ŒÏt        j                  d|› d�«       Œé y)a’  
    Warn user when a list of operations is expected to overwrite itself in a single
    commit.

    Rules:
    - If a filepath is updated by multiple `CommitOperationAdd` operations, a warning
      message is triggered.
    - If a filepath is updated at least once by a `CommitOperationAdd` and then deleted
      by a `CommitOperationDelete`, a warning is triggered.
    - If a `CommitOperationDelete` deletes a filepath that is then updated by a
      `CommitOperationAdd`, no warning is triggered. This is usually useless (no need to
      delete before upload) but can happen if a user deletes an entire folder and then
      add new files to it.
    r   zBAbout to update multiple times the same file in the same commit: 'z9'. This can cause undesired inconsistencies in your repo.r   z_About to delete a folder containing files that have just been updated within the same commit: 'zLAbout to delete a file that have just been updated within the same commit: 'N)r   Úintr3   r:   rR   ÚwarningsÚwarnr	   ÚparentsrF   r2   r5   )r“   Únb_additions_per_pathÚ	operationr3   Úparents        r?   Ú_warn_on_overwriting_operationsrœ   6  s  € ô -8¼Ó,<ÐØò ˆ	Ø ×-Ñ-ˆÜ�iÔ!3Ô4Ø$ \Ñ2°QÒ6Ü—‘ðØ%˜ð '"ð"ôð
 " ,Ó/°1Ñ4Ó/Ü'¨Ó5×=Ñ=ò 8�ð &¤c¨&£kÓ2°aÑ7Ô2ð8ô �iÔ!6Õ7Ø$¤S¬°|Ó)DÓ%EÑFÈÓJØ×&Ò&Ü—M‘Mð=Ø=I¸Nð KIðIõô —M‘Mð*Ø*6¨ð 89ð9õñ/rA   é   )ÚendpointÚnum_threadsÚrevisionÚ	additionsÚ	repo_typeÚrepo_idÚheadersrž   rŸ   r    c                 ón  ‡‡‡— g }t        | t        ¬«      D ]—  }t        |D �	cg c]  }	|	j                  ‘Œ c}	|||‰‰d¬«      \  }
}|radj	                  |D �cg c]8  }d|j                  d«      › d|j                  di «      j                  d	«      › �‘Œ: c}«      }t        d
|› �«      ‚||
z  }Œ™ | D �ci c]'  }|j                  j                  j                  «       |“Œ) c}Šg }|D ]N  }|j                  d«      €*t        j                  d‰|d      j                  › d�«       Œ>|j                  |«       ŒP t        |«      dk(  rt        j                  d«       ydˆˆˆfd„}t        j                  r=t        j                  dt        |«      › d�«       t!        |d¬«      D ]
  } ||«       Œ yt        |«      dk(  r!t        j                  d«        ||d   «       yt        j                  dt        |«      › d|› d�«       t#        ||dt        |«      › d�|t         ¬«       yc c}	w c c}w c c}w )a2  
    Uploads the content of `additions` to the Hub using the large file storage protocol.

    Relevant external documentation:
        - LFS Batch API: https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md

    Args:
        additions (`List` of `CommitOperationAdd`):
            The files to be uploaded
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated
            by a `/`.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        num_threads (`int`, *optional*):
            The number of concurrent threads to use when uploading. Defaults to 5.
        revision (`str`, *optional*):
            The git revision to upload to.

    Raises:
        [`EnvironmentError`](https://docs.python.org/3/library/exceptions.html#EnvironmentError)
            If an upload failed for any reason
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the server returns malformed responses
        [`HTTPError`](https://requests.readthedocs.io/en/latest/api/#requests.HTTPError)
            If the LFS batch endpoint returned an HTTP error.
    ©Ú
chunk_sizeN)Úupload_infosr£   r¢   r    rž   r¤   Útokenú
z$Encountered error for file with OID Úoidz: `ÚerrorÚmessagez$LFS batch endpoint returned errors:
ÚactionszContent of file z/ is already present upstream - skipping upload.r   zNo LFS files to upload.c                 óŒ   •— 	 ‰| d      }t        || ‰‰¬«       y # t        $ r}t        dj                  › d�«      |‚d }~ww xY w)Nr«   )rš   Úlfs_batch_actionr¤   rž   zError while uploading 'z' to the Hub.)r   Ú	ExceptionÚRuntimeErrorr3   )Úbatch_actionrš   ro   rž   r¤   Ú	oid2addops      €€€r?   Ú_wrapped_lfs_uploadz._upload_lfs_files.<locals>._wrapped_lfs_upload¸  sZ   ø€ ð	iØ! ,¨uÑ"5Ñ6ˆIÜ ¸\ÐSZÐemÖnøÜò 	iÜÐ!8¸×9OÑ9OÐ8PÐP]Ð^Ó_ÐehÐhûð	iús   ƒ ›	A¤>¾Az
Uploading z* LFS files to the Hub using `hf_transfer`.zhuggingface_hub.lfs_upload)Únamer   zUploading 1 LFS file to the Hubz" LFS files to the Hub using up to z threads concurrentlyzUpload z
 LFS files)ÚdescÚmax_workersÚ
tqdm_classr„   )r"   ÚUPLOAD_BATCH_MAX_NUM_FILESr   rV   ÚjoinÚgetr<   r€   r�   ÚloggerÚdebugr3   ÚappendÚlenr   ÚHF_HUB_ENABLE_HF_TRANSFERÚhf_tqdmr   )r¡   r¢   r£   r¤   rž   rŸ   r    Úbatch_actionsÚchunkÚopÚbatch_actions_chunkÚbatch_errors_chunkÚerrr­   Úadd_opÚfiltered_actionsÚactionrµ   r´   s      ``             @r?   Ú_upload_lfs_filesrÌ   d  s^  ú€ ðV !#€MÜ 	Ô6PÔQò -ˆÜ2EØ38Ö9¨R˜"Ÿ.›.Ò9ØØØØØØô3
Ñ/ÐÐ/ñ Ø—i‘ið  2öàð ;¸3¿7¹7À5»>Ð:JÈ#ÈcÏgÉgÐV]Ð_aÓNb×NfÑNfÐgpÓNqÐMrÒsòóˆGô ÐDÀWÀIÐNÓOÐOàÐ,Ñ,‰ð+-ð, HQÖQ¸V�×#Ñ#×*Ñ*×.Ñ.Ó0°&Ñ8ÒQ€Ið ÐØò ,ˆØ�:‰:�iÓ Ð(Ü�L‰LØ" 9¨V°E©]Ñ#;×#HÑ#HÐ"Ið J7ð 7õð
 ×#Ñ# FÕ+ð,ô ÐÓ Ò!Ü�‰Ð.Ô/Ø÷iô ×*Ò*Ü�‰�z¤#Ð&6Ó"7Ð!8Ð8bÐcÔdÜÐ.Ð5QÔRò 	(ˆFÙ Õ'ñ	(ä	ÐÓ	 !Ò	#Ü�‰Ð6Ô7ÙÐ,¨QÑ/Õ0ä�‰ØœÐ-Ó.Ð/Ð/QÐR]ÐQ^Ð^sÐtô	
ô 	ØØØœ3Ð/Ó0Ð1°Ð<Ø#Üö	
ùòq :ùòùò Rs   £H(
Á=H-
Â5,H2)rž   r    Ú	create_prrÍ   c                 óV  ‡‡‡‡‡‡‡— t        | «      dk(  ryddlm}m} 	 t	        t
        j                  ‰‰‰‰‰‰rddind¬«      }	|	j                  }|	j                  |	j                  f}dt        t        t         f   fˆˆˆˆˆˆfd„}t#        j$                  t        | «      t&        z  «      }t!        t#        j(                  |«      «      dz   }t+        t-        | t&        ¬«      «      D �]Z  \  }}|D �cg c]  }|‘Œ }}|D �cg c]  }t/        |j0                  t2        «      sŒ|‘Œ! }}|D �cg c]%  }t/        |j0                  t        t4        f«      sŒ$|‘Œ' }}t7        d„ ||z   D «       «      }|dkD  r%dt        |dz   «      j9                  |«      › d	|› d�}nd}t;        ||ddddt<        j?                  «       ¬«      }|5 Šdt         fˆfd„}t        |«      dkD  r. ||D �cg c]  }t        |j0                  «      ‘Œ c}||||‰«       t        |«      dkD  r% ||D �cg c]  }|j0                  ‘Œ c}||||‰«       ddd«       �Œ] y# t        $ r2}
|
j                  j                  dk(  rt        d‰› d	‰› d
�«      |
‚‚ d}
~
ww xY wc c}w c c}w c c}w c c}w c c}w # 1 sw Y   �ŒÀxY w)aQ  
    Uploads the content of `additions` to the Hub using the xet storage protocol.
    This chunks the files and deduplicates the chunks before uploading them to xetcas storage.

    Args:
        additions (`List` of `CommitOperationAdd`):
            The files to be uploaded.
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated
            by a `/`.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        endpoint: (`str`, *optional*):
            The endpoint to use for the xetcas service. Defaults to `constants.ENDPOINT`.
        revision (`str`, *optional*):
            The git revision to upload to.
        create_pr (`bool`, *optional*):
            Whether or not to create a Pull Request with that commit.

    Raises:
        [`EnvironmentError`](https://docs.python.org/3/library/exceptions.html#EnvironmentError)
            If an upload failed for any reason.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the server returns malformed responses or if the user is unauthorized to upload to xet storage.
        [`HTTPError`](https://requests.readthedocs.io/en/latest/api/#requests.HTTPError)
            If the LFS batch endpoint returned an HTTP error.

    **How it works:**
        The file download system uses Xet storage, which is a content-addressable storage system that breaks files into chunks
            for efficient storage and transfer.

        `hf_xet.upload_files` manages uploading files by:
            - Taking a list of file paths to upload
            - Breaking files into smaller chunks for efficient storage
            - Avoiding duplicate storage by recognizing identical chunks across files
            - Connecting to a storage server (CAS server) that manages these chunks

        The upload process works like this:
        1. Create a local folder at ~/.cache/huggingface/xet/chunk-cache to store file chunks for reuse.
        2. Process files in parallel (up to 8 files at once):
            2.1. Read the file content.
            2.2. Split the file content into smaller chunks based on content patterns: each chunk gets a unique ID based on what's in it.
            2.3. For each chunk:
                - Check if it already exists in storage.
                - Skip uploading chunks that already exist.
            2.4. Group chunks into larger blocks for efficient transfer.
            2.5. Upload these blocks to the storage server.
            2.6. Create and upload information about how the file is structured.
        3. Return reference files that contain information about the uploaded files, which can be used later to download them.
    r   N)Úupload_bytesÚupload_filesrÍ   Ú1©Ú
token_typer£   r¢   r    r¤   rž   Úparamsi‘  z2You are unauthorized to upload to xet storage for r7   zX. Please check that you have configured your access token with write access to the repo.r]   c            
      óš   •— t        t        j                  ‰‰‰‰‰‰rddind ¬«      } | €t        d«      ‚| j                  | j
                  fS )NrÍ   rÑ   rÒ   zFailed to refresh xet token)r#   r!   ÚWRITEr   Úaccess_tokenÚexpiration_unix_epoch)Únew_xet_connectionrÍ   rž   r¤   r£   r¢   r    s    €€€€€€r?   Útoken_refresherz*_upload_xet_files.<locals>.token_refresher,  s^   ø€ ÜEÜ#×)Ñ)ØØØØØÙ)2�K Ñ%¸ô
Ðð Ð%Ü&Ð'DÓEÐEØ!×.Ñ.Ð0B×0XÑ0XÐXÐXrA   r   r¦   c              3   óH   K  — | ]  }|j                   j                  –— Œ y ­wrP   )rV   Úsize)rŒ   rÅ   s     r?   r�   z$_upload_xet_files.<locals>.<genexpr>A  s   è ø€ ÒP°B˜BŸN™N×/Õ/ÑPùs   ‚ "zUploading Batch [z]...zUploading...ÚBTzhuggingface_hub.xet_put)r·   ÚtotalÚinitialÚunitÚ
unit_scaler¶   Ú	log_levelÚ	incrementc                 ó(   •— ‰j                  | «       y rP   )Úupdate)rã   Úprogresss    €r?   Úupdate_progressz*_upload_xet_files.<locals>.update_progressR  s   ø€ Ø—‘ 	Õ*rA   ) rÀ   Úhf_xetrÏ   rÐ   r#   r!   rÖ   r   ÚresponseÚstatus_coder   rž   r×   rØ   r   rF   r•   ÚmathÚceilrº   Úlog10Ú	enumerater"   r:   rS   rf   r   ÚsumÚzfillr+   r½   ÚgetEffectiveLevel)r¡   r¢   r£   r¤   rž   r    rÍ   rÏ   rÐ   Úxet_connection_infoÚeÚxet_endpointÚaccess_token_inforÚ   Ú
num_chunksÚnum_chunks_num_digitsÚirÄ   rÅ   Ú_chunkÚ	bytes_opsÚ	paths_opsÚexpected_sizeÚdescriptionÚprogress_cmrç   ræ   s    ``````                   @r?   Ú_upload_xet_filesrÿ   Ó  sÉ  þ€ ô~ ˆ9ƒ~˜ÒØç1ðÜFÜ#×)Ñ)ØØØØØÙ)2�K Ñ%¸ô
Ðð" '×/Ñ/€LØ,×9Ñ9Ð;N×;dÑ;dÐeÐðYœU¤3¬ 8™_÷ Yò Yô —‘œ3˜y›>Ô,FÑFÓG€JÜ¤§
¡
¨:Ó 6Ó7¸!Ñ;ÐÜœn¨YÔC]Ô^Ó_ó *‰ˆˆ5Ø$Ö%˜’"Ð%ˆÐ%à"(ÖR˜B¬J°r×7IÑ7IÌ5Õ,Q’RÐRˆ	ÐRØ"(ÖX˜B¬J°r×7IÑ7IÌCÔQUÈ;Õ,W’RÐXˆ	ÐXÜÑP¸)ÀiÑ:OÔPÓPˆà˜Š>Ø-¬c°!°a±%«j×.>Ñ.>Ð?TÓ.UÐ-VÐVWÐXbÐWcÐcgÐh‰Kà(ˆKÜ/ØØØØØØ*Ü×.Ñ.Ó0ô
ˆð ð 	˜Hð+¬3õ +ô �9‹~ Ò!ÙØ7@ÖA°”S˜×+Ñ+Õ,ÒAØ Ø%Ø#Ø#Øôô �9‹~ Ò!ÙØ2;Ö<¨B�R×'Ó'Ò<Ø Ø%Ø#Ø#Øô÷	ñ 	ð)*ðV øôM ò Ø�:‰:×!Ñ! SÒ(Ü'ØDÀYÀKÈqÐQXÐPYð Zið jóð ðð 	ûðüò8 &ùâRùÚXùò. Bùò =÷!	ñ 	ús_    &I Ã3	JÄJ
Ä"J
Ä,%JÅJÆ?!JÇ JÇ< JÈJÈ/JÉ	JÉ-I=É=JÊ
JÊJ(	Úpreupload_infoc                 ó,  — | j                  d«      }t        |t        «      st        d«      ‚|D ]b  }t        |t        «      rFt        |j                  d«      t
        «      r't        |j                  d«      t
        «      r|d   dv rŒYt        d«      ‚ | S )NÚfilesz&preupload_info is improperly formattedr`   Ú
uploadModer-   z'preupload_info is improperly formatted:)r¼   r:   Úlistr<   ÚdictrF   )r   r  Ú	file_infos      r?   Ú_validate_preupload_infor  j  s‹   € Ø×Ñ˜wÓ'€EÜ�eœTÔ"ÜÐAÓBÐBØò Hˆ	ä�y¤$Ô'Ü˜9Ÿ=™=¨Ó0´#Ô6Ü˜9Ÿ=™=¨Ó6¼Ô<Ø˜<Ñ(Ð,>Ò>äÐFÓGÐGðHð ÐrA   Úgitignore_contentc                 óö  — |�|nt         j                  }i }i }	i }
t        | d«      D �]P  }d|D �cg c]\  }|j                  t	        j
                  |j                  j                  «      j                  d«      |j                  j                  dœ‘Œ^ c}i}|�||d<   t        «       j                  |› d|› d|› d	|› �|||rd
dind¬«      }t        |«       t        |j                  «       «      } |j                  di |d   D �ci c]  }|d   |d   “Œ c}¤Ž  |	j                  di |d   D �ci c]  }|d   |d   “Œ c}¤Ž  |
j                  di |d   D �ci c]  }|d   |j!                  d«      “Œ c}¤Ž �ŒS | D ]>  }||j                     |_        |	|j                     |_        |
|j                     |_        Œ@ | D ]#  }|j                  j                  dk(  sŒd|_        Œ% yc c}w c c}w c c}w c c}w )aï  
    Requests the Hub "preupload" endpoint to determine whether each input file should be uploaded as a regular git blob,
    as a git LFS blob, or as a XET file. Input `additions` are mutated in-place with the upload mode.

    Args:
        additions (`Iterable` of :class:`CommitOperationAdd`):
            Iterable of :class:`CommitOperationAdd` describing the files to
            upload to the Hub.
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated
            by a `/`.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        revision (`str`):
            The git revision to upload the files to. Can be any valid git revision.
        gitignore_content (`str`, *optional*):
            The content of the `.gitignore` file to know which files should be ignored. The order of priority
            is to first check if `gitignore_content` is passed, then check if the `.gitignore` file is present
            in the list of files to commit and finally default to the `.gitignore` file already hosted on the Hub
            (if any).
    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    Nr0   r  Úascii)r`   ÚsamplerÜ   Ú	gitIgnorez/api/zs/z/preupload/rÍ   rÑ   )Újsonr¤   rÔ   r`   r  ÚshouldIgnorer«   r   r/   rH   )r   ÚENDPOINTr"   r3   rz   r{   rV   r  ÚdecoderÜ   r$   Úpostr%   r  r  rå   r¼   rX   rY   rZ   )r¡   r¢   r£   r¤   r    rž   rÍ   r  Úupload_modesÚshould_ignore_infoÚoid_inforÄ   rÅ   ÚpayloadÚrespr   rv   Úadditions                     r?   Ú_fetch_upload_modesr  y  s/  € ðN $Ð/‰x´Y×5GÑ5G€Hð +-€LØ*,ÐØ)+€Hä 	¨3Ó/ó _ˆàð  öð ð	 ŸO™OÜ$×.Ñ.¨r¯~©~×/DÑ/DÓE×LÑLÈWÓUØŸN™N×/Ñ/óòð	
ˆð Ð(Ø#4ˆG�KÑ ä‹}×!Ñ!Øˆj˜˜i˜[¨¨7¨)°;¸x¸jÐIØØÙ)2�K Ñ%¸ð	 "ó 
ˆô 	˜DÔ!Ü1°$·)±)³+Ó>ˆØˆ×ÑÑeÈNÐ[bÑLcÖdÀD˜t F™|¨T°,Ñ-?Ñ?ÒdÒeØ!Ð×!Ñ!ÑmÐTbÐcjÑTkÖ$lÈD T¨&¡\°4¸Ñ3GÑ%GÒ$lÒmØˆ�‰Ñ^À^ÐT[ÑE\Ö]¸T˜4 ™<¨¯©°%«Ñ8Ò]Ô^ð1_ð6 ò ?ˆØ ,¨X×-BÑ-BÑ CˆÔØ"4°X×5JÑ5JÑ"KˆÔØ'¨×(=Ñ(=Ñ>ˆÕð?ð ò .ˆØ×Ñ×$Ñ$¨Ó)Ø$-ˆHÕ!ñ.ùòAùò( eùÚ$lùÚ]s   °A!G'ÄG,Ä-G1ÅG6Úcopiesr,   c           
      óÄ  — ddl m}m}  |||¬«      }i }	i }
| D �cg c]  }|j                  ‘Œ }}t	        dt        |«      t        «      D ]P  }|j                  ||||t        z    ||¬«      }|D ]*  }t        ||«      rŒ|j                  |
|j                  |f<   Œ, ŒR t        | d„ ¬«      D �]§  \  }}t        |«      }|D �cg c]  }|j                  ‘Œ }}t	        dt        |«      t        «      D ]Û  }|j                  ||||t        z    |xs ||¬«      }|D ]±  }t        ||«      rt        d«      ‚|j                  |
|j                  |f<   |j                  r||	|j                  |f<   ŒSt!        ||||xs ||j                  ¬	«      }t#        «       j%                  ||¬
«      }t'        |«       |j(                  |	|j                  |f<   Œ³ ŒÝ |D ]€  }|j                  |f|	vr t+        d|j                  › d|xs |› d�«      ‚|
j%                  |j                  |j,                  f«      |_        |
j%                  |j                  |f«      |_        Œ‚ �Œª |	S c c}w c c}w )a;  
    Fetch information about the files to copy.

    For LFS files, we only need their metadata (file size and sha256) while for regular files
    we need to download the raw content from the Hub.

    Args:
        copies (`Iterable` of :class:`CommitOperationCopy`):
            Iterable of :class:`CommitOperationCopy` describing the files to
            copy on the Hub.
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated
            by a `/`.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        revision (`str`):
            The git revision to upload the files to. Can be any valid git revision.

    Returns: `Dict[Tuple[str, Optional[str]], Union[RepoFile, bytes]]]`
        Key is the file path and revision of the file to copy.
        Value is the raw content as bytes (for regular files) or the file information as a RepoFile (for LFS files).

    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    r   )ÚHfApiÚ
RepoFolder)rž   r¤   r   )r£   Úpathsr    r¢   c                 ó   — | j                   S rP   )rL   )rÅ   s    r?   ú<lambda>z&_fetch_files_to_copy.<locals>.<lambda>	  s
   € À2Ç?Á?€ rA   )Úkeyz$Copying a folder is not implemented.)rž   r¢   r£   r    Úfilename)r¤   zCannot copy z at revision z: file is missing on repo.)Úhf_apir  r  r3   ÚrangerÀ   ÚFETCH_LFS_BATCH_SIZEÚget_paths_infor:   Úblob_idr`   r   r  rK   ÚNotImplementedErrorr.   r   r$   r¼   r%   Úcontentr   rL   rM   rN   )r  r¢   r£   r¤   r    rž   r  r  r"  Úfiles_to_copyr  rÅ   Ú
dest_pathsÚoffsetÚdest_repo_filesrv   rL   r“   Ú	src_pathsÚsrc_repo_filesÚsrc_repo_fileÚurlré   rš   s                           r?   Ú_fetch_files_to_copyr1  Î  s·  € ÷N *á˜H¨gÔ6€FØOQ€Mà?A€Hà,2Ö3 b�"—/“/Ð3€JÐ3Ü˜œ3˜z›?Ô,@ÓAò 	?ˆØ ×/Ñ/ØØ˜V fÔ/CÑ&CÐDØØð	 0ó 
ˆð $ò 	?ˆDÜ˜d JÕ/Ø26·,±,�˜$Ÿ)™) XÐ.Ò/ñ	?ð	?ô %,¨FÑ8RÔ$Só 'SÑ ˆ�jÜ˜*Ó%ˆ
Ø3=Ö>¨R�R×(Ó(Ð>ˆ	Ð>Ü˜Aœs 9›~Ô/CÓDò 	YˆFØ#×2Ñ2ØØ ¨Ô2FÑ)FÐGØ%Ò1¨Ø#ð	 3ó ˆNð "0ò Y�Ü˜m¨ZÔ8Ü-Ð.TÓUÐUØ?L×?TÑ?T�˜-×,Ñ,¨lÐ;Ñ<à ×$Ò$ØHU�M =×#5Ñ#5°|Ð"DÒEô %Ø!)Ø"+Ø 'Ø!-Ò!9°Ø!.×!3Ñ!3ô�Cô  +›}×0Ñ0°¸gÐ0ÓF�HÜ'¨Ô1ØHP×HXÑHX�M =×#5Ñ#5°|Ð"DÒEñ%Yð	Yð: $ò 	SˆIØ×*Ñ*¨LÐ9ÀÑNÜ(Ø" 9×#=Ñ#=Ð">¸mØ#Ò/ xÐ0Ð0JðLóð ð "*§¡¨y×/IÑ/IÈ9×KaÑKaÐ.bÓ!cˆIÔØ"*§,¡,°	×0FÑ0FÈÐ/QÓ"RˆIÕò	SðA'SðP Ðùòk 4ùò ?s   ›IÃIr)  Úcommit_messageÚcommit_descriptionÚparent_commitc              #   óœ  K  — |�|nd}||dœ}|�||d<   d|dœ–— d}| D �]  }t        |t        «      r5|j                  r)t        j	                  d|j
                  › d	�«       |d
z  }ŒIt        |t        «      rA|j                  dk(  r2d|j                  «       j                  «       |j
                  ddœdœ–— Œšt        |t        «      r]|j                  dk(  rNd|j
                  d|j                  j                  j                  «       |j                  j                  dœdœ–— �Œt        |t        «      r#|j                  rdndd|j
                  idœ–— �Œ:t        |t        «      r¥||j                   |j"                  f   }t        |t$        «      r8dt'        j(                  |«      j                  «       |j
                  ddœdœ–— �Œ­|j*                  r+d|j
                  d|j*                  j                  dœdœ–— �Œät-        d«      ‚t-        d|› dt/        |dd«      › �«      ‚ |dkD  rt        j1                  d|› d�«       yy­w)aG  
    Builds the payload to POST to the `/commit` API of the Hub.

    Payload is returned as an iterator so that it can be streamed as a ndjson in the
    POST request.

    For more information, see:
        - https://github.com/huggingface/huggingface_hub/issues/1085#issuecomment-1265208073
        - http://ndjson.org/
    NÚ )Úsummaryrý   ÚparentCommitÚheader)r   Úvaluer   zSkipping file 'z(' in commit (ignored by gitignore file).r   r/   rv   rz   )r(  r`   Úencodingr.   ÚlfsFiler€   )r`   Úalgor«   rÜ   ÚdeletedFolderÚdeletedFiler`   )r`   r=  r«   z_Malformed files_to_copy (should be raw file content as bytes or RepoFile objects with LFS info.z(Unknown operation to commit. Operation: z. Upload mode: rX   zSkipped z/ file(s) in commit (ignored by gitignore file).)r:   rR   rY   r½   r¾   r3   rX   r~   r  rV   r€   r�   rÜ   r2   r5   rJ   rK   rL   rf   rz   r{   r.   r<   ÚgetattrÚinfo)	r“   r)  r2  r3  r4  Úheader_valueÚnb_ignored_filesrš   Úfile_to_copys	            r?   Ú_prepare_commit_payloadrE  4  s�  è ø€ ð" 0BÐ/MÑ+ÐSUÐð  .Ð>PÑQ€LØÐ Ø'4ˆ�^Ñ$Ø \Ñ
2Ò2àÐð  ó @ˆ	ä�iÔ!3Ô4¸×9QÒ9QÜ�L‰L˜?¨9×+AÑ+AÐ*BÐBjÐkÔlØ Ñ!ÐØô �iÔ!3Ô4¸×9OÑ9OÐS\Ò9\àà(×3Ñ3Ó5×<Ñ<Ó>Ø%×2Ñ2Ø (ññó ô ˜	Ô#5Ô6¸9×;QÑ;QÐUZÒ;Zà à%×2Ñ2Ø$Ø$×0Ñ0×7Ñ7×;Ñ;Ó=Ø%×1Ñ1×6Ñ6ñ	ñô ô ˜	Ô#8Ô9à*3×*=Ò*=‘À=Ø  )×"8Ñ"8Ð9ñô ô
 ˜	Ô#6Ô7Ø(¨)×*DÑ*DÀi×F\ÑF\Ð)]Ñ^ˆLÜ˜,¬Ô.à!ä#)×#3Ñ#3°LÓ#A×#HÑ#HÓ#JØ )× 6Ñ 6Ø$,ññô ð ×!Ò!à$à )× 6Ñ 6Ø (Ø+×/Ñ/×6Ñ6ññô ô !Øuóð ô
 Ø:¸9¸+ð FÜ˜I ~°tÓ<Ð=ð?óð ð{@ðD ˜!ÒÜ�‰�hÐ/Ð0Ð0_Ð`Õað ùs   ‚I
I)NFNrP   )NN)UrE   rz   rd   rë   r_   r–   Úcollectionsr   Ú
contextlibr   Údataclassesr   r   Ú	itertoolsr   Úpathlibr   r	   Útypingr
   r   r   r   r   r   r   r   r   r   r   Útqdm.contrib.concurrentr   r6  r   Úerrorsr   r   r   r   Úfile_downloadr   r.   r   r   r   Úutilsr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   rÂ   Ú
utils.tqdmr+   r"  r,   Ú
get_loggerrB   r½   r…   r$  rº   r2   rJ   rR   rF   r8   ÚCommitOperationrœ   r•   rÌ   r;   rÿ   r  r  r  rf   r1  rE  rH   rA   r?   ú<module>rS     s  ðñó Û 	Û Û 	Û Ý #Ý %ß (Ý ß 'ß p× p× pÑ på .å ß cÓ cÝ %ß <Ñ <÷÷ ÷ õ #Ý 1ñ Ý ð 
ˆ×	Ñ	˜HÓ	%€ð Ð%Ñ&€
ð Ð à Ð ð ÷ð ó ðð< ÷ Fð  Fó ð FðF ÷b1ð b1ó ðb1ðJ¨ð °ó ð" Ð*Ð,?ÐAVÐVÑW€ð+°°_Ñ0Eð +È$ó +ð\ ð #ØØ"òk
àÐ&Ñ'ðk
ð ðk
ð ð	k
ð
 �#�s�(‰^ðk
ð �s‰mðk
ð ðk
ð �s‰mòk
ó ðk
ð\ ð #Ø"Ø $òSàÐ&Ñ'ðSð ðSð ð	Sð
 �#�s�(‰^ðSð �s‰mðSð �s‰mðSð ˜‰~òSó ðSðl¨Tó ð ð #ØØ'+ñQ.ØÐ*Ñ+ðQ.àðQ.ð ðQ.ð �#�s�(‰^ð	Q.ð
 ðQ.ð �s‰mðQ.ð ðQ.ð   ‘}ðQ.ð 
òQ.ó ðQ.ðh ð #ñbØÐ(Ñ)ðbàðbð ðbð �#�s�(‰^ð	bð
 ðbð �s‰mðbð 
ˆ%��X˜c‘]Ð"Ñ
# U¨:°uÐ+<Ñ%=Ð
=Ñ>òbó ðbðR )-Ø#'ñ_bØ˜Ñ)ð_bà˜˜c 8¨C¡=Ð0Ñ1°5¸ÀUÐ9JÑ3KÐKÑLð_bð ð_bð ! ™ð	_bð
 ˜C‘=ð_bð ˆd�3˜�8‰nÑô_brA   