ó
    pyüiz  ã                   ó˜  • % S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J	r	  S SK
Jr  S SKJr  S SKJrJr  S SKJr  SSKJrJrJr  SS	KJrJrJrJr  SS
KJrJr  SSKJrJ r J!r!J"r"  SSK#J$r$  SSK%J&r&  \(       a  SSK'J(r(  \RR                  " \*5      r+Sr,Sr-/ SQr.\/\0   \1S'   Sr2Sr3Sr4Sr5Sr6Sr7S\/\   SS4S jr8SSSSSSSS.SSS \9S!\9\-  S"\9S#\9S-  S$\:S-  S%\/\9   \9-  S-  S&\/\9   \9-  S-  S'\0S-  S(\:S)\04S* jjr; " S+ S,\ Rx                  5      r=\>\\4   r? " S- S.5      r@S/\@SSS \9S"\9S#\94
S0 jrAS/\@S\>\=\/\?   4   S-  4S1 jrBS2\?SS4S3 jrCS4\/\?   SSS \9S"\9S#\9SS4S5 jrDS4\/\?   SSS \9S"\9S#\9SS4S6 jrES4\/\?   SSS \9S"\9S#\9SS4S7 jrF " S8 S9\5      rGS2\?S\G4S: jrHS;S<S\/\?   4S= jrIS;S<S>\0S\/\?   4S? jrJS@\9SS4SA jrKg)Bé    N)Údatetime)ÚPath)ÚLock)ÚTYPE_CHECKINGÚAny)Úquoteé   )ÚCommitOperationAddÚ
UploadInfoÚ_fetch_upload_modes)ÚLocalUploadFileMetadataÚLocalUploadFilePathsÚget_local_upload_pathsÚread_upload_metadata)ÚDEFAULT_REVISIONÚ
REPO_TYPES)ÚDEFAULT_IGNORE_PATTERNSÚ_format_sizeÚfilter_repo_objectsÚtqdm)Úis_xet_available)Úsha_fileobj)ÚHfApié
   éd   )
é   é2   éK   r   é}   éÈ   éú   i�  iX  iè  ÚCOMMIT_SIZE_SCALEé   i † i'  r    r   Ú
paths_listÚreturnc                 ó  • [         R                  S5        [        U 5      [        :”  a+  [         R	                  S[        U 5      S S[        S S35        SSKJn  U" S 5      nU  H¬  n[        UR                  5      nUR                  n[        UR                  5      S	:w  a  [        UR                  5      OS	nX&   S
==   S-  ss'   [        USS 5       H7  u  pxUS:X  a  S	OSR                  USU 5      nX&   S   R                  U5        M9     M®     UR                  5        H_  u  pšU
S
   n[        U
S   5      nX¼-   nU[         :”  d  M(  U	S	:X  a  SOU	n[         R	                  SU SUS SUS SUS S[         S S35        Ma     / n/ nU  H~  nUR"                  R%                  5       R&                  nUS-  nU[(        :”  a  UR+                  UR                  U45        MU  U[,        :”  d  Ma  UR+                  UR                  U45        M€     U(       al  SR                  S USS  5       5      n[        U5      S:”  a  S[        U5      S-
   S3OSn[         R	                  S[        U5       S[(         S U U S!35        U(       al  SR                  S" USS  5       5      n[        U5      S:”  a  S[        U5      S-
   S3OSn[         R	                  S[        U5       S#[,         S$U U S%35        [         R                  S&5        g)'aS  
Validate upload against repository limits and warn about potential issues.

Args:
    paths_list: List of file paths to be uploaded

Warns about:
    - Too many files in the repository (>100k)
    - Too many entries (files or subdirectories) in a single folder (>10k)
    - Files exceeding size limits (>20GB recommended, >200GB maximum)
z/Running validation checks on files to upload...zYou are about to upload Ú,z. files. This exceeds the recommended limit of zÍ files per repository.
Consider:
  - Splitting your data into multiple repositories
  - Using fewer, larger files (e.g., parquet files)
  - See: https://huggingface.co/docs/hub/repositories-recommendationsr   )Údefaultdictc                  ó   • S[        5       S.$ )Nr   )ÚfilesÚsubdirs)Úset© ó    Úa/home/mande/repo/quber/.venv/lib/python3.13/site-packages/huggingface_hub/_upload_large_folder.pyÚ<lambda>Ú)_validate_upload_limits.<locals>.<lambda>U   s   € ÀqÔUXÓUZÒ=[r.   Ú.r*   r	   NéÿÿÿÿÚ/r+   ÚrootzFolder 'z' contains z
 entries (z files and z/ subdirectories). This exceeds the recommended z< entries per folder.
Consider reorganising into sub-folders.i Êš;z
  - c              3   ó8   #   • U  H  u  pU S US S3v •  M     g7f©z: z.1fÚGBNr-   ©Ú.0ÚpathÚsizes      r/   Ú	<genexpr>Ú*_validate_upload_limits.<locals>.<genexpr>ƒ   s#   é € Ð!aÒL`¹j¸d T F¨"¨T°#¨J°bÕ"9ÒL`ùó   ‚é   z
  ... and z more filesÚ úFound z files exceeding the zGB recommended maximum:
  - z4
Consider splitting these files into smaller chunks.c              3   ó8   #   • U  H  u  pU S US S3v •  M     g7fr7   r-   r9   s      r/   r=   r>   �   s!   é € Ð!\ÊO¹j¸d T F¨"¨T°#¨J°bÕ"9ÊOùr?   z files larger than zGB (recommended limit):
  - z2
Large files may slow down loading and processing.zValidation checks complete.)ÚloggerÚinfoÚlenÚMAX_FILES_PER_REPOÚwarningÚcollectionsr(   r   Úpath_in_repoÚpartsÚstrÚparentÚ	enumerateÚjoinÚaddÚitemsÚMAX_FILES_PER_FOLDERÚ	file_pathÚstatÚst_sizeÚMAX_FILE_SIZE_GBÚappendÚRECOMMENDED_FILE_SIZE_GB)r$   r(   Úentries_per_folderÚpathsr;   rK   rM   ÚiÚchildÚfolderÚdataÚ
file_countÚsubdir_countÚtotal_entriesÚfolder_displayÚlarge_filesÚvery_large_filesr<   Úsize_gbÚ	files_strÚmore_strs                        r/   Ú_validate_upload_limitsrh   8   s>  € ô ‡K�KÐAÔBô ˆ:ƒÔ+Ó+Ü�‰Ø&¤s¨:£°qÐ&9ð :5Ü5GÈÐ4Jð KTðUô	
õ (á)4Ñ5[Ó)\ÐãˆÜ�E×&Ñ&Ó'ˆØ—
‘
ˆô &)¨¯©Ó%5¸Ó%<”�T—[‘[Ô!À#ˆØÑ" 7Ó+¨qÑ0Ó+ô " %¨¨ *Ö-‰HˆAØ ›F‘S¨¯©°°r¸°Ó(;ˆFØÑ& yÑ1×5Ñ5°eÖ<ó .ñ ð +×0Ñ0Ö2‰ˆØ˜'‘]ˆ
Ü˜4 	™?Ó+ˆØ"Ñ1ˆàÔ/Õ/Ø'-°£}™V¸&ˆNÜ�N‰NØ˜>Ð*¨+°mÀAÐ5Fð GØ˜q�> ¨\¸!Ð,<ð =0Ü0DÀQÐ/Gð H:ð:öñ 3ð €KØÐãˆØ�‰×#Ñ#Ó%×-Ñ-ˆØ˜Ñ&ˆàÔ%Ó%Ø×#Ñ# U×%7Ñ%7¸Ð$AÖBØÔ/Õ/Ø×Ñ × 2Ñ 2°GÐ<Ö=ñ ö Ø—M‘MÑ!aÐL\Ð]_Ð^_ÑL`Ó!aÓaˆ	ÜLOÐP`ÓLaÐdeÓLe�\¤#Ð&6Ó"7¸!Ñ";Ð!<¸KÑHÐkmˆÜ�‰Ø”SÐ)Ó*Ð+Ð+@ÔAQÐ@Rð SØ�+˜h˜Zð (BðCô	
ö Ø—M‘MÑ!\ÈKÐXZÐYZÉOÓ!\Ó\ˆ	ÜGJÈ;ÓGWÐZ[ÓG[�\¤# kÓ"2°QÑ"6Ð!7°{ÑCÐacˆÜ�‰Ø”S˜Ó%Ð&Ð&9Ô:RÐ9Sð TØ�+˜h˜Zð (@ðAô	
ô ‡K�KÐ-Õ.r.   Té<   )ÚrevisionÚprivateÚallow_patternsÚignore_patternsÚnum_workersÚprint_reportÚprint_report_everyÚapir   Úrepo_idÚfolder_pathÚ	repo_typerj   rk   rl   rm   rn   ro   rp   c                ó¶  ^• Uc  [        S5      eU[        ;  a  [        S[         35      eUc  [        n[        T5      R	                  5       R                  5       mTR                  5       (       d  [        ST S35      eUc  / nO[        U[        5      (       a  U/nU[        -  nUc-  [        R                  " 5       =(       d    Sn[        US-  S5      nU R                  XUSS	9n[        R                  S
U 35        UR                   n U R#                  XUS9n[%        U5      nUS:”  a%  [        R'                  SS SU SU SU SS S35        [-        5       (       a  [.        O[0        n[3        U4S jTR5                  S5       5       UUS9nU Vs/ s H  n[7        TU5      PM     nn[        R                  S[%        U5       S35        [9        U5        [        R                  S5        [;        USS9 Vs/ s H  nU[=        TUR>                  5      4PM     nn[A        UU5      n[C        U5       Vs/ s H"  n[D        RF                  " [H        UU UUUS.S9PM$     nnU H  nURK                  5         M     U	(       a  [M        SURO                  5       -   5        [P        RP                  " 5       n [P        RR                  " S5        [P        RP                  " 5       U-
  U
:¼  a5  U	(       a  [U        URO                  5       5        [P        RP                  " 5       nURW                  5       (       a  [        R                  S5        OM”  U H  nURY                  5         M     [        R                  URO                  5       5        [        R                  S 5        g! [(         a#  n[        R+                  SU 35         SnAGNqSnAff = fs  snf s  snf s  snf )!z„Upload a large folder to the Hub in the most resilient way possible.

See [`HfApi.upload_large_folder`] for the full documentation.
Nz For large uploads, `repo_type` is explicitly required. Please set it to `model`, `dataset` or `space`. If you are using the CLI, pass it as `--repo-type=model`.z"Invalid repo type, must be one of zProvided path: 'z' is not a directoryr	   é   T)rr   rt   rk   Úexist_okzRepo created: )rr   rt   rj   iô  Ú
zP================================================================================z
WARNING: This repository has aR   commits.
Repositories with a large number of commits can experience performance issues.

Consider squashing your commit history using `super_squash_history()`.
To do so, you need to stop this process, run the snippet below and restart the upload command.  from huggingface_hub import super_squash_history
  super_squash_history(repo_id='z', repo_type='zÎ')

Note: This is a non-revertible operation. See the documentation for more details:
https://huggingface.co/docs/huggingface_hub/main/en/package_reference/hf_api#huggingface_hub.HfApi.super_squash_history
zCould not check commit count: c              3   óŽ   >#   • U  H:  oR                  5       (       d  M  UR                  T5      R                  5       v •  M<     g 7f©N)Úis_fileÚrelative_toÚas_posix)r:   r;   rs   s     €r/   r=   Ú/upload_large_folder_internal.<locals>.<genexpr>ä   s6   øé € ÐiÒ>V°d×ZfÑZf×ZhÓ	1ˆ×	Ñ	˜+Ó	&×	/Ñ	/×	1Ð	1Ò>Vùs
   ƒAŸ&Az**/*)rl   rm   rB   z candidate files to uploadzStarting upload...zRecovering from metadata files)Údesc)Ústatusrq   rr   rt   rj   )ÚtargetÚkwargsz

zIs done: exiting main loopzUpload is complete!)-Ú
ValueErrorr   r   r   Ú
expanduserÚresolveÚis_dirÚ
isinstancerL   r   ÚosÚ	cpu_countÚmaxÚcreate_reporD   rE   rr   Úlist_repo_commitsrF   rH   Ú	ExceptionÚdebugr   ÚUPLOAD_BATCH_SIZE_XETÚUPLOAD_BATCH_SIZE_LFSr   Úglobr   rh   r   r   rJ   ÚLargeUploadStatusÚrangeÚ	threadingÚThreadÚ_worker_jobÚstartÚprintÚcurrent_reportÚtimeÚsleepÚ_print_overwriteÚis_donerO   )rq   rr   rs   rt   rj   rk   rl   rm   rn   ro   rp   Únb_coresÚrepo_urlÚcommitsÚcommit_countÚeÚupload_batch_sizeÚfiltered_paths_listÚrelpathr$   rZ   rQ   r€   Ú_ÚthreadsÚthreadÚlast_report_tss     `                        r/   Úupload_large_folder_internalrª   ˜   sµ  ø€ ð& ÑÜðIó
ð 	
ð œ
Ó"ÜÐ=¼j¸\ÐJÓKÐKØÑÜ#ˆä�{Ó#×.Ñ.Ó0×8Ñ8Ó:€KØ×Ñ×ÑÜÐ+¨K¨=Ð8LÐMÓNÐNàÑØ‰Ü	�O¤S×	)Ñ	)Ø*Ð+ˆØÔ.Ñ.€OàÑÜ—<’<“>×& QˆÜ˜( a™-¨Ó+ˆð �‰ wÈWÐ_cˆÐd€HÜ
‡K�K�.  
Ð+Ô,Ø×Ñ€Gð;Ø×'Ñ'°ÐW_Ð'Ð`ˆÜ˜7“|ˆØ˜#ÓÜ�N‰NØ�X�Jð 0Ø0<¨~ð >3ð 4;°)¸>È)Èð ULð �*˜Bð ôô& 2B×1CÑ1CÕ-ÔI^Ðô .Üi¸k×>NÑ>NÈvÔ>VÓiØ%Ø'ñÐñ
 ObÓbÒNaÀ7Ô(¨°gÖ>ÑNa€JÐbÜ
‡K�K�&œ˜Z›Ð)Ð)CÐDÔEô ˜JÔ'ä
‡K�KÐ$Ô%ô
 ˜*Ð+KÒLóâLˆEð 
Ô$ [°%×2DÑ2DÓEÓFÙLð 
ð ô ˜uÐ&7Ó8€Fô �{Ô#óò $ˆAô 	×ÒÜà ØØ"Ø&Ø$ñô		
ñ $ð ð ó ˆØ�‰Žñ ö Üˆf�v×,Ñ,Ó.Ñ.Ô/Ü—Y’Y“[€NØ
Ü�
Š
�1ŒÜ�9Š9‹;˜Ñ'Ð+=Ó=ÞÜ  ×!6Ñ!6Ó!8Ô9Ü!ŸYšY›[ˆNØ�>‰>×ÑÜ�K‰KÐ4Ô5Øñ ó ˆØ�‰Žñ ô ‡K�K�×%Ñ%Ó'Ô(Ü
‡K�KÐ%Õ&øôA ó ;ä�‰Ð5°a°SÐ9×:Ò:ûð;üò cùòùòs+   ÄAN ÆOÇ<"OÈ9)OÎ
O	Î&OÏO	c                   ó¾   • \ rS rSr\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r	\R
                  " 5       r
Srg)Ú	WorkerJobi#  r-   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚenumÚautoÚSHA256ÚGET_UPLOAD_MODEÚPREUPLOAD_LFSÚCOMMITÚWAITÚ__static_attributes__r-   r.   r/   r¬   r¬   #  s9   † Ø�YŠY‹[€FØ—i’i“k€OØ—I’I“K€MØ�YŠY‹[€FØ�9Š9‹;ƒDr.   r¬   c                   óx   • \ rS rSrSrSS\\   S\4S jjrS\4S jr	S\
S	\S
\SS4S jrS\4S jrS\
4S jrSrg)r’   i.  zBContains information, queues and tasks for a large upload process.rQ   r£   c                 ó²  • Xl         [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        [        5       U l        SU l	        SU l
        SU l        X l        SU l        SU l        S U l        [         R"                  " 5       U l        SU l        [        5       U l        U R                    Hê  nUu  pEUR*                  c  U R                  R-                  U5        M1  UR.                  c  U R                  R-                  U5        M[  UR.                  S:X  a.  UR0                  (       d  U R
                  R-                  U5        M™  UR2                  (       d  U R                  R-                  U5        MÇ  [4        R7                  SUR8                   S35        Mì     g )Nr   r	   ÚlfszSkipping file z! (already uploaded and committed))rQ   ÚqueueÚQueueÚqueue_sha256Úqueue_get_upload_modeÚqueue_preupload_lfsÚqueue_commitr   ÚlockÚnb_workers_sha256Únb_workers_get_upload_modeÚnb_workers_preupload_lfsr£   Únb_workers_commitÚnb_workers_waitingÚlast_commit_attemptr   ÚnowÚ_started_atÚ
_chunk_idxÚ_chunk_lockÚsha256ÚputÚupload_modeÚis_uploadedÚis_committedrD   rŽ   rJ   )ÚselfrQ   r£   ÚitemrZ   Úmetadatas         r/   Ú__init__ÚLargeUploadStatus.__init__1  sV  € ØŒ
Ü7<·{²{³}ˆÔÜ@EÇÂÃˆÔ"Ü>C¿kºk»mˆÔ Ü7<·{²{³}ˆÔÜ“FˆŒ	à&'ˆÔØ/0ˆÔ'Ø-.ˆÔ%Ø&7ÔØ&'ˆÔØ'(ˆÔØ15ˆÔ ä#Ÿ<š<›>ˆÔØ ˆŒÜ!%£ˆÔð —J”JˆDØ"‰OˆEØ�‰Ñ&Ø×!Ñ!×%Ñ% dÖ+Ø×%Ñ%Ñ-Ø×*Ñ*×.Ñ.¨tÖ4Ø×%Ñ%¨Ó.°x×7K×7KØ×(Ñ(×,Ñ,¨TÖ2Ø×*×*Ø×!Ñ!×%Ñ% dÖ+ä—‘˜~¨e×.@Ñ.@Ð-AÐAbÐcÖdò r.   r%   c                 óv   • U R                      [        U R                     sS S S 5        $ ! , (       d  f       g = frz   )rÌ   r"   rË   ©rÒ   s    r/   Útarget_chunkÚLargeUploadStatus.target_chunkS  s#   € Ø×ÓÜ$ T§_¡_Ñ5÷ ××ús   �*ª
8ÚsuccessÚnb_itemsÚdurationNc           
      ó¼  • U R                      U(       d/  [        R                  SU S35        U =R                  S-  sl        OKU[        U R                     :¼  a4  US:  a.  [        R                  SU S35        U =R                  S-  sl        [        S[        U R                  [        [        5      S-
  5      5      U l        S S S 5        g ! , (       d  f       g = f)NzFailed to commit z9 files at once. Will retry with less files in next batch.r	   é(   zSuccessfully committed z. at once. Increasing the limit for next batch.r   )	rÌ   rD   rH   rË   r"   rE   rŠ   ÚminrF   )rÒ   rÛ   rÜ   rÝ   s       r/   Úupdate_chunkÚLargeUploadStatus.update_chunkW  s¡   € Ø×ÓÞÜ—‘Ð!2°8°*Ð<uÐvÔwØ—’ 1Ñ$–ØÔ.¨t¯©Ñ?Ó?ÀHÈrÃMÜ—‘Ð5°h°ZÐ?mÐnÔoØ—’ 1Ñ$•ä! !¤S¨¯©¼#Ô>OÓ:PÐSTÑ:TÓ%UÓVˆDŒO÷ ×Öús   �B7CÃ
Cc                 ó®  • SnSnSnSnSnSnSnSnSn	Sn
SnU R                      U R                   HÁ  u  pÍUR                  (       a  U
S-  n
M  X�R                  -  n	US-  nUR                  b  US-  nX-R                  -  nUR
                  S:X  a  US-  nUR
                  c  US-  nUR                  (       a  US-  nXmR                  -  nUR                  (       d  M®  US-  nX�R                  -  nMÃ     [        U	5      n[        R                  " 5       nUR                  S5      nXðR                  -
  n[        U5      R                  S5      S   nSnUSU S	U S
3-  nUS-  nUS-  nUSU SU S	[        U5       SU S3	-  nUSU SU S	[        U5       SU S3	-  nUS:”  a	  USU S3-  nUSU SU S	[        U5       SU S3	-  nUSU
 S3-  nUS-  nUSU R                   S3-  nUSU R                    S3-  nUSU R"                   S3-  nUSU R$                   S3-  nUSU R&                   S3-  nUS-  nUsSSS5        $ ! , (       d  f       g= f)z<Generate a report of the current status of the large upload.r   r	   Nr»   z%Y-%m-%d %H:%M:%Sr2   z
----------Ú z (z) z----------
z	Files:   zhashed r4   z) | zpre-uploaded: Ú)z (+z unsure)z | committed: z | ignored: rx   z	Workers: z	hashing: z | zget upload mode: zpre-uploading: zcommitting: z	waiting: z3---------------------------------------------------)rÂ   rQ   Úshould_ignorer<   rÍ   rÏ   rÐ   rÑ   r   r   rÉ   ÚstrftimerÊ   rL   ÚsplitrÃ   rÄ   rÅ   rÆ   rÇ   )rÒ   Ú	nb_hashedÚsize_hashedÚnb_preuploadedÚnb_lfsÚnb_lfs_unsureÚsize_preuploadedÚnb_committedÚsize_committedÚ
total_sizeÚignored_filesÚtotal_filesr¦   rÔ   Útotal_size_strrÉ   Únow_strÚelapsedÚelapsed_strÚmessages                       r/   r™   Ú LargeUploadStatus.current_reportb  sí  € àˆ	ØˆØˆØˆØˆØÐØˆØˆØˆ
ØˆØˆà�Y‹YØ#Ÿzœz‘�Ø×)×)Ø! QÑ&�MÙØŸm™mÑ+�
Ø˜qÑ �Ø—?‘?Ñ.Ø ‘N�IØ§=¡=Ñ0�KØ×'Ñ'¨5Ó0Ø˜a‘K�FØ×'Ñ'Ñ/Ø! QÑ&�MØ×'×'Ø" aÑ'�NØ$¯©Ñ5Ð$Ø×(×(Ñ(Ø  AÑ%�LØ"§m¡mÑ3’Nñ%  *ô& *¨*Ó5ˆNä—,’,“.ˆCØ—l‘lÐ#6Ó7ˆGØ×,Ñ,Ñ,ˆGÜ˜g›,×,Ñ,¨SÓ1°!Ñ4ˆKà%ˆGØ˜˜7˜) 2 k ]°"Ð5Ñ5ˆGØ�Ñ&ˆGà�{Ñ"ˆGØ˜  ¨1¨[¨M¸¼LÈÓ<UÐ;VÐVWÐXfÐWgÐgkÐlÑlˆGØ˜¨Ð'7°q¸¸ÀÄ<ÐP`ÓCaÐBbÐbcÐdrÐcsÐstÐuÑuˆGØ˜qÓ Ø˜S  ¨xÐ8Ñ8�Ø˜¨ ~°Q°{°mÀ2ÄlÐSaÓFbÐEcÐcdÐesÐdtÐtuÐvÑvˆGØ˜ m _°BÐ7Ñ7ˆGà�{Ñ"ˆGØ˜ 4×#9Ñ#9Ð":¸#Ð>Ñ>ˆGØÐ*¨4×+JÑ+JÐ*KÈ3ÐOÑOˆGØ˜¨×)FÑ)FÐ(GÀsÐKÑKˆGØ˜ d×&<Ñ&<Ð%=¸SÐAÑAˆGØ˜ 4×#:Ñ#:Ð";¸2Ð>Ñ>ˆGØ�xÑˆGà÷_ �Y�Yús   £B7IÃEIÉ
Ic                 óˆ   • U R                      [        S U R                   5       5      sS S S 5        $ ! , (       d  f       g = f)Nc              3   ód   #   • U  H&  u  pUR                   =(       d    UR                  v •  M(     g 7frz   ©rÑ   ræ   ©r:   r¦   rÔ   s      r/   r=   Ú,LargeUploadStatus.is_done.<locals>.<genexpr>£  s(   é € ÐeÒZdÉ;È1�x×,Ñ,×F°×0FÑ0FÔFÒZdùó   ‚.0)rÂ   ÚallrQ   rØ   s    r/   r�   ÚLargeUploadStatus.is_done¡  s(   € Ø�Y‹YÜÑeÐZ^×ZdÒZdÓeÓe÷ �Y�Yús	   �3³
A)rË   rÌ   rÊ   rQ   rÈ   rÂ   rÆ   rÄ   rÅ   rÃ   rÇ   rÁ   r¿   rÀ   r¾   r£   )r	   )r­   r®   r¯   r°   Ú__doc__ÚlistÚ
JOB_ITEM_TÚintrÕ   rÙ   ÚboolÚfloatrá   rL   r™   r�   r¸   r-   r.   r/   r’   r’   .  sn   † ÙLñ e˜d :Ñ.ð  eÀ3õ  eðD6˜cô 6ð	W Dð 	W°Cð 	WÀ5ð 	WÈTô 	Wð= ô =ð~f˜÷ fr.   r’   r€   c                 ó²	  •  Sn[        U 5      nUc  gUu  pgU=[        R                  :X  aY    US   n [        U5        U R                  R                  U5        U R                     U =R                  S-  sl        SSS5        GOS=[        R                  :X  aÆ     [!        XqX#US9  U H‡  nUu  p«UR"                  (       a  M  UR$                  =S:X  a    U R&                  R                  U5        MI  S	:X  a  U R(                  R                  U5        Mk   U R                  R                  U5        M‰     U R                     U =R*                  S-  sl        SSS5        GOy=[        R,                  :X  a]     [/        XqX#US9  U H  nU R(                  R                  U5        M      U R                     U =R0                  S-  sl        SSS5        GO=[        R2                  :X  a�    [4        R4                  " 5       nSn [7        XqX#US9  [4        R4                  " 5       U-
  nU R9                  U[;        U5      U5        U R                     [4        R4                  " 5       U l        U =R>                  S-  sl        SSS5        OW[        R@                  :X  aD  [4        RB                  " [D        5        U R                     U =RF                  S-  sl#        SSS5        GMÙ  ! [         a    e [         aS  n	[        R                  SU	 35        [        R                  " 5         U R                  R                  U5         Sn	A	GNäSn	A	ff = f! , (       d  f       M|  = f! [         a    e [         a8  n	[        R                  SU	 35        [        R                  " 5          Sn	A	GNøSn	A	ff = f! , (       d  f       MÝ  = f! [         a    e [         a\  n	[        R                  S
U	 35        [        R                  " 5         U H  nU R&                  R                  U5        M       Sn	A	GNSn	A	ff = f! , (       d  f       GMc  = f! [         a    e [         a^  n	[        R                  SU	 35        [        R                  " 5         U H  nU R(                  R                  U5        M      Sn Sn	A	GN£Sn	A	ff = f! , (       d  f       GMë  = f! , (       d  f       GMþ  = f)a–  
Main process for a worker. The worker will perform tasks based on the priority list until all files are uploaded
and committed. If no tasks are available, the worker will wait for 10 seconds before checking again.

If a task fails for any reason, the item(s) are put back in the queue for another worker to pick up.

Read `upload_large_folder` docstring for more information on how tasks are prioritized.
TNr   zFailed to compute sha256: r	   )rq   rr   rt   rj   zFailed to get upload mode: r»   ÚregularzFailed to preupload LFS: zFailed to commit: F)$Ú_determine_next_jobr¬   r³   Ú_compute_sha256r¿   rÎ   ÚKeyboardInterruptr�   rD   ÚerrorÚ	tracebackÚ
format_excr¾   rÂ   rÃ   r´   Ú_get_upload_moderæ   rÏ   rÀ   rÁ   rÄ   rµ   Ú_preupload_lfsrÅ   r¶   rš   Ú_commitrá   rF   rÈ   rÆ   r·   r›   ÚWAITING_TIME_IF_NO_TASKSrÇ   )r€   rq   rr   rt   rj   Únext_jobÚjobrQ   rÓ   r¢   r¦   rÔ   Ústart_tsrÛ   rÝ   s                  r/   r–   r–   ¦  s¿  € ð Ø>Bˆô ' vÓ.ˆØÑØØ‰
ˆð Ø!”×!Ö!Ø˜Q‘x�ð2Ü# DÔ)Ø×0Ñ0×4Ñ4°TÔ:ð —[“[Ø×,Ò,°Ñ1Õ,÷ !‘[ð +”×*Ö*ð+Ü$ U¸WÐdlÒmó "�DØ"&‘K�AØ×-×-Ù Ø"×.Ñ.Þ"Ø"×6Ñ6×:Ñ:¸4Ö@Ü&Ø"×/Ñ/×3Ñ3°DÖ9ØØ"×8Ñ8×<Ñ<¸TÖBñ "ð —[“[Ø×5Ò5¸Ñ:Õ5÷ !‘[ð )”×(Ö(ð
=Ü" 5¸7ÐbjÒkÛ %˜Ø×+Ñ+×/Ñ/°Ö5ñ !&ð —[“[Ø×3Ò3°qÑ8Õ3÷ !‘[ð "”×!Ö!ÜŸ9š9›;�Ø�ð	$Ü˜E°GÐ[cÒdô  Ÿ9š9›;¨Ñ1�Ø×#Ñ# G¬S°«Z¸ÔBØ—[“[Ü15·²³�FÔ.Ø×,Ò,°Ñ1Õ,÷ !�[ô —•Ü—
’
Ô3Ô4Ø—[“[Ø×-Ò-°Ñ2Õ-÷ !òy øô  )ó ØÜ ó 2Ü—L‘LÐ#=¸a¸SÐ!AÔBÜ×(Ò(Ô*Ø×'Ñ'×+Ñ+¨D×1Ò1ûð2ú÷
 !–[ûô )ó ØÜ ó +Ü—L‘LÐ#>¸q¸cÐ!BÔCÜ×(Ò(×*Ò*ûð+ú÷* !–[ûô )ó ØÜ ó =Ü—L‘LÐ#<¸Q¸CÐ!@ÔAÜ×(Ò(Ô*Û %˜Ø×2Ñ2×6Ñ6°tÖ<÷ !&ûð=ú÷ !—[ûô )ó ØÜ ó $Ü—L‘LÐ#5°a°SÐ!9Ô:Ü×(Ò(Ô*Û %˜Ø×+Ñ+×/Ñ/°Ö5ñ !&à#–Gûð$ú÷ !—[ú÷ !—[úsž   ³&K Á%MÂM Ä?N&Å5/N8 Æ0P+Ç=P> É0R3Ê:SËMË/AL=Ì=MÍ
MÍN#Í+-NÎN#Î&
N5Î8P(ÏAP#Ð#P(Ð+
P;Ð>R0ÑAR+Ò+R0Ò3
SÓ
Sc                 óB  • U R                      U R                  S:X  a¸  U R                  R                  5       S:”  aš  U R                  b�  [
        R
                  " 5       U R                  -
  S:”  ag  U =R                  S-  sl        [        R                  S5        [        R                  [        U R                  U R                  5       5      4sS S S 5        $ U R                  S:X  a…  U R                  R                  5       S:¼  ag  U =R                  S-  sl        [        R                  S5        [        R                  [        U R                  U R                  5       5      4sS S S 5        $ U R                  R                  5       [        :¼  ae  U =R                  S-  sl        [        R                  S[         S35        [        R                  [        U R                  [        5      4sS S S 5        $ U R                   R                  5       U R"                  :¼  as  U R$                  S:X  ac  U =R$                  S-  sl        [        R                  S	5        [        R&                  [        U R                   U R"                  5      4sS S S 5        $ U R(                  R                  5       S:”  ah  U R*                  S:X  aX  U =R*                  S-  sl        [        R                  S
5        [        R,                  [/        U R(                  5      4sS S S 5        $ U R                  R                  5       S:”  am  U R                  S:X  a]  U =R                  S-  sl        [        R                  S5        [        R                  [        U R                  [        5      4sS S S 5        $ U R                   R                  5       U R"                  :¼  ac  U =R$                  S-  sl        [        R                  S5        [        R&                  [        U R                   U R"                  5      4sS S S 5        $ U R(                  R                  5       S:”  aX  U =R*                  S-  sl        [        R                  S5        [        R,                  [/        U R(                  5      4sS S S 5        $ U R                  R                  5       S:”  a]  U =R                  S-  sl        [        R                  S5        [        R                  [        U R                  [        5      4sS S S 5        $ U R                   R                  5       S:”  ac  U =R$                  S-  sl        [        R                  S5        [        R&                  [        U R                   U R"                  5      4sS S S 5        $ U R                  S:X  a¸  U R                  R                  5       S:”  aš  U R                  b�  [
        R
                  " 5       U R                  -
  S:”  ag  U =R                  S-  sl        [        R                  S5        [        R                  [        U R                  U R                  5       5      4sS S S 5        $ U R                  S:X  Ga  U R                  R                  5       S:”  añ  U R(                  R                  5       S:X  aÓ  U R                  R                  5       S:X  aµ  U R                   R                  5       S:X  a—  U R*                  S:X  a‡  U R                  S:X  aw  U R$                  S:X  ag  U =R                  S-  sl        [        R                  S5        [        R                  [        U R                  U R                  5       5      4sS S S 5        $ [1        S U R2                   5       5      (       a  [        R5                  S5         S S S 5        g U =R6                  S-  sl        [        R                  S[8         S35        [        R:                  / 4sS S S 5        $ ! , (       d  f       g = f)Nr   i,  r	   z;Job: commit (more than 5 minutes since last commit attempt)é–   zJob: commit (>100 files ready)zJob: get upload mode (>z files ready)z5Job: preupload LFS (no other worker preuploading LFS)z.Job: sha256 (no other worker computing sha256)z:Job: get upload mode (no other worker getting upload mode)zJob: preupload LFSzJob: sha256zJob: get upload moderi   z-Job: commit (1 min since last commit attempt)zJob: commitc              3   ód   #   • U  H&  u  pUR                   =(       d    UR                  v •  M(     g 7frz   rü   rý   s      r/   r=   Ú&_determine_next_job.<locals>.<genexpr>t  s(   é € ÐaÒT`Á[ÀQ�×&Ñ&×@¨(×*@Ñ*@Ô@ÒT`ùrÿ   z.All files have been processed! Exiting worker.zNo task available, waiting... (zs))rÂ   rÆ   rÁ   ÚqsizerÈ   rš   rD   rŽ   r¬   r¶   Ú_get_nrÙ   r¿   ÚMAX_NB_FILES_FETCH_UPLOAD_MODErÄ   r´   rÀ   r£   rÅ   rµ   r¾   rÃ   r³   Ú_get_oner   rQ   rE   rÇ   r  r·   )r€   s    r/   r
  r
    s$  € Ø	�‹ð ×$Ñ$¨Ó)Ø×#Ñ#×)Ñ)Ó+¨aÓ/Ø×*Ñ*Ñ6Ü—	’	“˜f×8Ñ8Ñ8¸6ÓAà×$Ò$¨Ñ)Õ$Ü�L‰LÐVÔWÜ×$Ñ$¤f¨V×-@Ñ-@À&×BUÑBUÓBWÓ&XÐY÷ 
‰ð ×%Ñ%¨Ó*¨v×/BÑ/B×/HÑ/HÓ/JÈcÓ/QØ×$Ò$¨Ñ)Õ$Ü�L‰LÐ9Ô:Ü×$Ñ$¤f¨V×-@Ñ-@À&×BUÑBUÓBWÓ&XÐY÷! 
‰ð& ×)Ñ)×/Ñ/Ó1Ô5SÓSØ×-Ò-°Ñ2Õ-Ü�L‰LÐ2Ô3QÐ2RÐR_Ð`ÔaÜ×-Ñ-¬v°f×6RÑ6RÔTrÓ/sÐt÷- 
‰ð2 ×'Ñ'×-Ñ-Ó/°6×3KÑ3KÓKÐPV×PoÑPoÐstÓPtØ×+Ò+¨qÑ0Õ+Ü�L‰LÐPÔQÜ×+Ñ+¬V°F×4NÑ4NÐPV×PhÑPhÓ-iÐj÷9 
‰ð> × Ñ ×&Ñ&Ó(¨1Ó,°×1IÑ1IÈQÓ1NØ×$Ò$¨Ñ)Õ$Ü�L‰LÐIÔJÜ×$Ñ$¤h¨v×/BÑ/BÓ&CÐD÷E 
‰ðJ ×)Ñ)×/Ñ/Ó1°AÓ5¸&×:[Ñ:[Ð_`Ó:`Ø×-Ò-°Ñ2Õ-Ü�L‰LÐUÔVÜ×-Ñ-¬v°f×6RÑ6RÔTrÓ/sÐt÷Q 
‰ðV ×'Ñ'×-Ñ-Ó/°6×3KÑ3KÓKØ×+Ò+¨qÑ0Õ+Ü�L‰LÐ-Ô.Ü×+Ñ+¬V°F×4NÑ4NÐPV×PhÑPhÓ-iÐj÷] 
‰ðb × Ñ ×&Ñ&Ó(¨1Ó,Ø×$Ò$¨Ñ)Õ$Ü�L‰L˜Ô'Ü×$Ñ$¤h¨v×/BÑ/BÓ&CÐD÷i 
‰ðn ×)Ñ)×/Ñ/Ó1°AÓ5Ø×-Ò-°Ñ2Õ-Ü�L‰LÐ/Ô0Ü×-Ñ-¬v°f×6RÑ6RÔTrÓ/sÐt÷u 
‰ðz ×'Ñ'×-Ñ-Ó/°!Ó3Ø×+Ò+¨qÑ0Õ+Ü�L‰LÐ-Ô.Ü×+Ñ+¬V°F×4NÑ4NÐPV×PhÑPhÓ-iÐj÷A 
‰ðH ×$Ñ$¨Ó)Ø×#Ñ#×)Ñ)Ó+¨aÓ/Ø×*Ñ*Ñ6Ü—	’	“˜f×8Ñ8Ñ8¸6ÓAà×$Ò$¨Ñ)Õ$Ü�L‰LÐHÔIÜ×$Ñ$¤f¨V×-@Ñ-@À&×BUÑBUÓBWÓ&XÐY÷W 
‰ð` ×$Ñ$¨Ô)Ø×#Ñ#×)Ñ)Ó+¨aÓ/Ø×#Ñ#×)Ñ)Ó+¨qÓ0Ø×,Ñ,×2Ñ2Ó4¸Ó9Ø×*Ñ*×0Ñ0Ó2°aÓ7Ø×(Ñ(¨AÓ-Ø×1Ñ1°QÓ6Ø×/Ñ/°1Ó4à×$Ò$¨Ñ)Õ$Ü�L‰L˜Ô'Ü×$Ñ$¤f¨V×-@Ñ-@À&×BUÑBUÓBWÓ&XÐY÷w 
‰ô| ÑaÐTZ×T`ÒT`Óa×aÑaÜ�K‰KÐHÔIØ÷A 
ˆðH ×%Ò%¨Ñ*Õ%Ü�L‰LÐ:Ô;SÐ:TÐTVÐWÔXÜ—N‘N BÐ'÷M 
��úsf   �B?`ÃB`Å+A=`Ç2B`ÊA<`ÌB`ÎB`Ð)A,`ÒA1`ÔA7`ÖB>`Ù#D`Þ7`ßA`à
`rÓ   c                 óî   • U u  pUR                   cB  UR                  R                  S5       n[        U5      R	                  5       Ul         SSS5        UR                  U5        g! , (       d  f       N = f)z1Compute sha256 of a file and save it in metadata.NÚrb)rÍ   rS   Úopenr   ÚhexÚsave)rÓ   rZ   rÔ   Úfs       r/   r  r  „  sU   € à�O€EØ‡�ÑØ�_‰_×!Ñ! $Ô'¨1Ü)¨!›n×0Ñ0Ó2ˆHŒO÷ (à‡M�M�%Õ÷ (Õ'ús   ­A&Á&
A4rQ   c                 óX  • U  Vs/ s H  n[        U5      PM     nn[        UUUUR                  5       [        USS9UR                  S9  [        X5       HM  u  pWUu  p‰UR                  U	l        UR                  U	l	        UR                  U	l        U	R                  U5        MO     gs  snf )zeGet upload mode for each file and update metadata.

Also receive info if the file should be ignored.
rA   )Úsafe)Ú	additionsrt   rr   Úheadersrj   ÚendpointN)Ú_build_hacky_operationr   Ú_build_hf_headersr   r)  ÚzipÚ_upload_moderÏ   Ú_should_ignoreræ   Ú_remote_oidÚ
remote_oidr#  )
rQ   rq   rr   rt   rj   rÓ   r'  ÚadditionrZ   rÔ   s
             r/   r  r  �  s£   € ñ
 ;@Ó@º%°$Ô'¨Ö-¹%€IÐ@ÜØØØØ×%Ñ%Ó'Ü�x bÑ)Ø—‘òô ˜eÖ/‰ˆØ‰ˆØ'×4Ñ4ˆÔØ!)×!8Ñ!8ˆÔØ&×2Ñ2ˆÔØ�‰�eÖò 0ùò As   …B'c                 ó®   • U  Vs/ s H  n[        U5      PM     nnUR                  UUUUS9  U  H  u  pxSUl        UR                  U5        M     gs  snf )z(Preupload LFS files and update metadata.)rr   rt   rj   r'  TN)r*  Úpreupload_lfs_filesrÐ   r#  ©	rQ   rq   rr   rt   rj   rÓ   r'  rZ   rÔ   s	            r/   r  r  £  sc   € á:?Ó@º%°$Ô'¨Ö-¹%€IÐ@Ø×ÑØØØØð	 ñ ó !‰ˆØ#ˆÔØ�‰�eÖò !ùò As   …Ac                 ó°   • U  Vs/ s H  n[        U5      PM     nnUR                  UUUUSS9  U  H  u  pxSUl        UR                  U5        M     gs  snf )zCommit files to the repo.z(Add files using upload-large-folder tool)rr   rt   rj   Ú
operationsÚcommit_messageTN)r*  Úcreate_commitrÑ   r#  r4  s	            r/   r  r  ²  sf   € á:?Ó@º%°$Ô'¨Ö-¹%€IÐ@Ø×ÑØØØØØAð ñ ó !‰ˆØ $ˆÔØ�‰�eÖò !ùò As   …Ac                   ó   • \ rS rSrSS jrSrg)ÚHackyCommitOperationAddiÆ  Nc                 óx   • [        U R                  [        5      (       a  [        U R                  5      U l        g g rz   )r‡   Úpath_or_fileobjr   rL   rØ   s    r/   Ú__post_init__Ú%HackyCommitOperationAdd.__post_init__Ç  s-   € Ü�d×*Ñ*¬D×1Ñ1Ü#& t×';Ñ';Ó#<ˆDÕ ð 2r.   )r<  )r%   N)r­   r®   r¯   r°   r=  r¸   r-   r.   r/   r:  r:  Æ  s   † ÷=r.   r:  c                 óR  • U u  p[        UR                  UR                  S9nUR                  R                  S5       nUR	                  S5      S S nS S S 5        UR
                  c  [        S5      e[        [        R                  UR
                  5      UR                  WS9Ul        UR                  Ul        UR                  Ul        UR                   Ul        UR$                  Ul        UR$                  (       a  UR                  S:X  a  SUl        U$ ! , (       d  f       NË= f)N)rJ   r<  r   i   z&sha256 must have been computed by now!)rÍ   r<   Úsampler»   r.   )r:  rJ   rS   r!  ÚpeekrÍ   rƒ   r   ÚbytesÚfromhexr<   Úupload_inforÏ   r-  ræ   r.  r0  r/  rÐ   Ú_is_uploadedr<  )rÓ   rZ   rÔ   Ú	operationÚfiler@  s         r/   r*  r*  Ì  sð   € Ø�O€EÜ'°U×5GÑ5GÐY^×YhÑYhÑi€IØ	�‰×	Ñ	˜dÔ	# tØ—‘˜3“  Ð%ˆ÷ 
$à‡�ÑÜÐAÓBÐBÜ&¬e¯m©m¸H¿O¹OÓ.LÐS[×S`ÑS`ÐioÑp€IÔØ%×1Ñ1€IÔØ'×5Ñ5€IÔØ$×/Ñ/€IÔØ%×1Ñ1€IÔØ×× × 4Ñ 4¸Ó =Ø$'ˆ	Ô!ØÐ÷ 
$Õ	#ús   ¾DÄ
D&r¼   zqueue.Queue[JOB_ITEM_T]c                 ó&   • U R                   " 5       /$ rz   )Úget)r¼   s    r/   r  r  â  s   € Ø�IŠI‹Kˆ=Ðr.   Únc                 ó’   • [        [        U R                  " 5       U5      5       Vs/ s H  o R                  " 5       PM     sn$ s  snf rz   )r“   rà   r  rI  )r¼   rJ  r¦   s      r/   r  r  æ  s2   € Ü!&¤s¨5¯;ª;«=¸!Ó'<Ô!=Ó>Ò!=˜A�IŠIŽKÑ!=Ñ>Ð>ùÒ>s   §AÚreportc                 ó,  ^• U S-  n [         R                  " 5       R                  m[        U4S jU R	                  5        5       5      n[        U5       HA  n[        R                  R                  S5        [        R                  R                  S5        MC     [        R                  R                  U 5        [        R                  R                  ST[        U R	                  5       S   5      -
  -  5        [        R                  R                  5         g)zçPrint a report, overwriting the previous lines.

Since tqdm in using `sys.stderr` to (re-)write progress bars, we need to use `sys.stdout`
to print the report.

Note: works well only if no other process is writing to `sys.stdout`!
rx   c              3   óF   >#   • U  H  n[        U5      T-  S -   v •  M     g7f)r	   N)rF   )r:   ÚlineÚterminal_widths     €r/   r=   Ú#_print_overwrite.<locals>.<genexpr>÷  s!   øé € ÐSÒ?R°t”3�t“9 Ñ.°Ö2Ò?Rùs   ƒ!z[Kz[Frä   r3   N)ÚshutilÚget_terminal_sizeÚcolumnsÚsumÚ
splitlinesr“   ÚsysÚstdoutÚwriterF   Úflush)rL  Únb_linesr¦   rP  s      @r/   rœ   rœ   ê  sÄ   ø€ ð ˆd�N€Fä×-Ò-Ó/×7Ñ7€Nô ÔS¸v×?PÑ?PÔ?RÓSÓS€Hô �8Ž_ˆÜ�
‰
×Ñ˜Ô$Ü�
‰
×Ñ˜Ö"ñ ô
 ‡J�J×Ñ�VÔÜ‡J�J×Ñ�S˜N¬S°×1BÑ1BÓ1DÀRÑ1HÓ-IÑIÑJÔKÜ‡J�J×ÑÕr.   )Lr±   Úloggingrˆ   r¼   rR  rW  r”   rš   r  r   Úpathlibr   r   Útypingr   r   Úurllib.parser   Ú_commit_apir
   r   r   Ú_local_folderr   r   r   r   Ú	constantsr   r   Úutilsr   r   r   r   Úutils._runtimer   Ú	utils.shar   Úhf_apir   Ú	getLoggerr­   rD   r  r  r"   r  r  Ú__annotations__r�   r�   rG   rR   rV   rX   rh   rL   r  rª   ÚEnumr¬   Útupler  r’   r–   r
  r  r  r  r  r:  r*  r  r  rœ   r-   r.   r/   Ú<module>rk     s<  ðô Û Û 	Û Û Û 
Û Û Û Ý Ý Ý ß %Ý ç LÑ Lß vÓ vß 3ß SÓ SÝ ,Ý "ö Ýà	×	Ò	˜8Ó	$€àÐ Ø!$Ð ÚOÐ �4˜‘9Ó OàÐ ØÐ ð Ð ØÐ ØÐ ØÐ ð]/¨Ð-AÑ(Bð ]/Àtô ]/ðL  ØØ-1Ø.2Ø"ØØ òC'Ø	ðC'àðC'ð �t‘ðC'ð
 ðC'ð �D‰jðC'ð �D‰[ðC'ð ˜‘I ‘O dÑ*ðC'ð ˜#‘Y ‘_ tÑ+ðC'ð �t‘ðC'ð ðC'ð õC'ôV�—	‘	ô ð Ð'Ð)@Ð@ÑA€
÷ufñ ufðpl3Øðl3à	ðl3ð ðl3ð ð	l3ð
 ôl3ð^g(Ð 1ð g(°e¸IÀtÈJÑGWÐ<WÑ6XÐ[_Ñ6_ô g(ð^˜*ð ¨ô ð˜D Ñ,ð °7ð ÀSð ÐUXð Ðdgð Ðlpô ð,˜$˜zÑ*ð °ð À3ð ÐSVð Ðbeð Ðjnô ð�4˜
Ñ#ð ¨'ð ¸Cð ÈCð Ð[^ð Ðcgô ô(=Ð0ô =ð ð Ð0Gô ð,Ð-ð °$°zÑ2Bô ð?Ð+ð ?°ð ?¸¸ZÑ8Hô ?ð˜Sð  Tõ r.   