Ë
    ÑIæj¡/  ã                  óF  — d Z ddlmZ ddlZddlZddlZddl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mZ ddlmZ  ej"                  d«      Z ej&                  d«      Z ej&                  d«      Zdd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Z	 	 	 	 dd„Zdd„Zdd„Zdd„Zddd„Z y) a¼  dubeval-project: file-based multi-video workspace (no database).

Layout (default root ./projects, override with --root or DUBEVAL_PROJECTS):

  projects/
    index.html                  # all projects, latest score per pair, links to reports
    <name>/
      project.json              # sources, languages, run history
      media/original.<ext>      # downloaded file, or symlink to a local file
      media/dub-01.<ext> ...
      work/                     # per-track caches (audio, LID, ASR, stems, judge)
      report.json  report.html  # latest run
      runs/<UTC timestamp>/report.json   # every run kept for comparison

Sources may be local paths, http(s) URLs or Google Drive share links.
é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚPathÚdubevalz^[a-z0-9][a-z0-9._-]{0,63}$z$drive\.google\.com|docs\.google\.comc                ób   — t        | xs# t        j                  j                  d«      xs d«      S )NÚDUBEVAL_PROJECTSÚprojects)r   ÚosÚenvironÚget)Úargs    ú4/root/repos/pocs/video-evals/src/dubeval/projects.pyÚ_rootr   %   s%   € Ü�ÒG”r—z‘z—~‘~Ð&8Ó9ÒG¸ZÓHÐHó    c                 óf   — t        j                  t        j                  «      j	                  d«      S )Nz%Y%m%dT%H%M%SZ)r   Únowr   ÚutcÚstrftime© r   r   Ú_nowr   )   s!   € Ü�<‰<œŸ™Ó%×.Ñ.Ð/?Ó@Ð@r   c                óÒ   — t        t        j                  j                  | «      j                  «      j
                  j                  «       }t        j                  d|xs d«      r|S dS )Nz\.[a-z0-9]{2,4}Ú ú.mp4)	r   ÚurllibÚrequestÚurlparseÚpathÚsuffixÚlowerÚreÚ	fullmatch)Úsourcer   s     r   Ú_extr$   -   sM   € Ü”&—.‘.×)Ñ)¨&Ó1×6Ñ6Ó7×>Ñ>×DÑDÓF€FÜ—\‘\Ð"4°f²lÀÔCˆ6ÐOÈÐOr   c                ó¼  — t        j                  d| t         j                  «      s•t        | «      j	                  «       j                  «       }|j                  «       st        d| › �«      ‚|j                  |j                  j                  «       xs d«      }|j                  «       s|j                  |«       |S |j                  t        | «      «      }|j                  «       r|j                  «       j                  dkD  r|S |j                  |j                  dz   «      }t         j#                  d| |«       t$        j'                  | «      r0ddl}|j+                  | t-        |«      dd¬	«      €ˆt/        d
| › �«      ‚t0        j2                  j5                  | ddi¬«      }t0        j2                  j7                  |d¬«      5 }t9        |d«      5 }t;        j<                  ||d¬«       ddd«       ddd«       |j                  «       j                  dk(  r|j?                  «        t/        d| › �«      ‚|jA                  |«       |S # 1 sw Y   Œ_xY w# 1 sw Y   ŒcxY w)z`Materialize a source next to `dest_stem` (extension added). Idempotent: reuses an existing file.z
^https?://zno such file: r   r   z.partzdownloading %s -> %sNT)ÚquietÚfuzzyz=Google Drive download failed (is the file shared publicly?): z
User-Agentzdubeval/0.1)Úheadersé<   )ÚtimeoutÚwbi   )Úlengthzempty download: )!r!   ÚmatchÚIr   Ú
expanduserÚresolveÚis_fileÚFileNotFoundErrorÚwith_suffixr   r    ÚexistsÚ
symlink_tor$   ÚstatÚst_sizeÚlogÚinfoÚ_GDRIVEÚsearchÚgdownÚdownloadÚstrÚRuntimeErrorr   r   ÚRequestÚurlopenÚopenÚshutilÚcopyfileobjÚunlinkÚrename)	r#   Ú	dest_stemÚsrcÚdestÚpartr<   ÚreqÚrÚfs	            r   ÚfetchrN   2   så  € ä�8‰8�M 6¬2¯4©4Ô0Ü�6‹l×%Ñ%Ó'×/Ñ/Ó1ˆØ�{‰{Œ}Ü# n°V°HÐ$=Ó>Ð>Ø×$Ñ$ S§Z¡Z×%5Ñ%5Ó%7Ò%A¸6ÓBˆØ�{‰{Œ}Ø�O‰O˜CÔ ØˆØ× Ñ ¤ f£Ó.€DØ‡{�{„}˜Ÿ™›×,Ñ,¨qÒ0ØˆØ×Ñ˜DŸK™K¨'Ñ1Ó2€DÜ‡H�HÐ# V¨TÔ2Ü‡~�~�fÔÛà�>‰>˜&¤# d£)°4¸tˆ>ÓDÐLÜÐ!^Ð_eÐ^fÐgÓhÐhä�n‰n×$Ñ$ V°lÀMÐ5RÐ$ÓSˆÜ�^‰^×#Ñ# C°Ð#Ó4ð 	5¸¼4ÀÀdÓ;Kð 	5ÈqÜ×Ñ˜q !¨GÕ4÷	5÷ 	5à‡y�yƒ{×Ñ˜aÒØ�‰ŒÜÐ-¨f¨XÐ6Ó7Ð7Ø‡K�K�ÔØ€K÷	5ð 	5ú÷ 	5ð 	5ús$   ÇIÇIÇ(IÉI	ÉIÉIc                ó�   — | dz  }|j                  «       st        d| › d�«      ‚t        j                  |j	                  «       «      S )Núproject.jsonzno project at z' (create it with `dubeval-project add`))r4   Ú
SystemExitÚjsonÚloadsÚ	read_text)ÚdrM   s     r   Ú_loadrV   Q   s?   € Ø	ˆNÑ€AØ�8‰8Œ:Ü˜>¨!¨Ð,SÐTÓUÐUÜ�:‰:�a—k‘k“mÓ$Ð$r   c                ó„   — | dz  }|j                  t        j                  |dd¬«      «       |j                  | dz  «       y )Nzproject.json.tmpé   F)ÚindentÚensure_asciirP   )Ú
write_textrR   ÚdumpsÚreplace)rU   ÚmetaÚtmps      r   Ú_saver`   X   s7   € Ø
Ð Ñ
 €CØ‡N�N”4—:‘:˜d¨1¸5ÔAÔBØ‡K�K��NÑ"Õ#r   c           
     óÞ  — ddl m} t        j                  |«      st	        d|›d�«      ‚|r|gng |z   D ]
  } ||«       Œ | |z  }|dz  j                  «        }	|	r|st	        d«      ‚|	r|st	        d«      ‚|dz  }
|
j                  d	d	¬
«       |	r|t        «       dg dg g dœn%t        j                  |dz  j                  «       «      }	 |rU|d   r#|d   d   |k7  rt	        d|› d|d   d   › d�«      ‚|t        t        ||
dz  «      j                  |«      «      dœ|d<   |d   D �ch c]  }|d   ’Œ	 }}|D ]i  }||v rŒt        ||
dt        |d   «      dz   d›�z  «      }|d   j                  |t        |j                  |«      «      dœ«       |j!                  |«       Œk 	 |r||d<   |r||d<   t)        ||«       |S c c}w # t"        $ r |	rt%        j&                  |d	¬«       ‚ w xY w)z[Create a project or append dubs to an existing one; downloads happen here, not at run time.é   )r0   zinvalid project name z*: lowercase letters, digits, '.', '_', '-'rP   za new project needs --originalz&a new project needs at least one --dubÚmediaT©ÚparentsÚexist_okN)ÚnameÚcreatedÚoriginalÚdubsÚsrc_langÚ	tgt_langsÚrunsri   r#   zproject z already has an original (z); use a new project name)r#   Úfilerj   zdub-Ú02d)Úignore_errorsrk   rl   )Úlangr0   Ú_NAMEr-   rQ   r4   Úmkdirr   rR   rS   rT   r>   rN   Úrelative_toÚlenÚappendÚaddÚBaseExceptionrC   Úrmtreer`   )Úrootrg   ri   rj   rk   rl   r0   ÚlabelrU   Úis_newrc   r^   ÚxÚknownrH   rM   s                   r   rw   rw   ^   sC  € õ ä�;‰;�tÔÜÐ0°°Ð8bÐcÓdÐdÙ (�8‘*¨b°IÑ=ò ˆÙ��ðàˆt‰€AØ�nÑ$×,Ñ,Ó.Ð.€FÙ‘hÜÐ9Ó:Ð:Ù‘dÜÐAÓBÐBØ�‰K€EØ	‡K�K˜ t€KÔ,á!ð ¤T£V¸ÀrÐW[ÐjlØòÜ'+§z¡z°1°~Ñ3E×2PÑ2PÓ2RÓ'Sð 	ðÙØ�JÒ D¨Ñ$4°XÑ$>À(Ò$JÜ  8¨D¨6Ð1KÈDÐQ[ÑL\Ð]eÑLfÐKgð h:ð ":ó ;ð ;à*2¼CÄÀhÐPUÐXbÑPbÓ@c×@oÑ@oÐpqÓ@rÓ<sÑtˆD�ÑØ&*¨6¡lÖ3 ��8“Ð3ˆÐ3Øò 	ˆCØ�e‰|ØÜ�c˜5 T¬#¨d°6©lÓ*;¸aÑ*?ÀÐ)DÐ#EÑEÓFˆAØ�‰L×Ñ¨3¼¸A¿M¹MÈ!Ó<LÓ8MÑ NÔOØ�I‰I�c�Nñ	ñ Ø#ˆˆZÑÙØ%ˆˆ[ÑÜ	ˆ!ˆT„NØ€Hùò! 4øô ò ÙÜ�M‰M˜!¨4Õ0Øðús    ÃAG Ä*GÄ6A0G ÇG Ç$G,c                ó´  — ddl m}m} ddlm} | |z  }t        |«      } |d|j                  d«      |j                  d«      xs g dœ|¤Ž} |||d   d   z  |d	   D �	cg c]
  }	||	d   z  ‘Œ c}	|d
z  |«      }
t        «       }|dz  |z  }|j                  dd¬«       |
j                  d¬«      }|dz  j                  |«       |dz  j                  |«        ||
j                  d¬«      |dz  «       |d   j                  |t        |dz  j                  |«      «      |
j                  D �cg c]V  }|j                   |j"                  d   |j"                  d   |j$                  j&                  |j$                  j(                  dœ‘ŒX c}t+        |
j,                  «      |
j.                  dœ«       t1        ||«       t3        | «       |d   d   S c c}	w c c}w )Nrb   )ÚConfigÚrun)Úrenderrk   rl   )rk   rl   ri   rn   rj   Úworkrm   Trd   rX   )rY   zreport.jsonrR   )Úmodeúreport.htmlÚaudio_index)ÚpairÚdubr†   ÚscoreÚseverity_counts)ÚatÚreportÚpairsÚskippedÚfailedéÿÿÿÿr   )Úpipeliner€   r�   Úvizr‚   rV   r   r   rs   Úmodel_dump_jsonr[   Ú
model_dumprv   r>   rt   Úreportsr‡   ÚtargetÚsummaryr‰   rŠ   ru   Úskipped_tracksr�   r`   Úwrite_index)rz   rg   Úcfg_overridesr€   Ú	run_batchr‚   rU   r^   Úcfgr}   ÚbatchÚstampÚrun_dirÚpayloadrL   s                  r   r�   r�   Š   sÌ  € ß2Ýàˆt‰€AÜ�‹8€DÙ
Ð
g˜$Ÿ(™( :Ó.¸$¿(¹(À;Ó:OÒ:UÐSUÑ
gÐYfÑ
g€CÙ�a˜$˜zÑ*¨6Ñ2Ñ2ÈDÐQWÉLÖ4YÀq°Q¸¸6¹³]Ò4YÐ[\Ð_eÑ[eÐgjÓk€EÜ‹F€EØ�&‰j˜5Ñ €GØ‡M�M˜$¨€MÔ.Ø×#Ñ#¨1Ð#Ó-€GØˆ}Ñ×(Ñ(¨Ô1ØˆÑ×"Ñ" 7Ô+Ù
ˆ5×Ñ ÐÓ(¨!¨mÑ*;Ô<Øˆ�L×ÑØœs G¨mÑ$;×#HÑ#HÈÓ#KÓLàdi×dqÑdqösØ_`ð Ÿ6™6¨!¯(©(°6Ñ*:È1Ï8É8ÐTaÑKbØŸI™IŸO™OÀÇ	Á	×@YÑ@Yó[ò sä�u×+Ñ+Ó,¸¿¹ñ	Fô Gô
 
ˆ!ˆT„NÜ�ÔØ�‰<˜ÑÐùò 5Zùòss   ÁG
Ä.AGc                ó  — g }t        | j                  d«      «      D ]5  }	 |j                  t        j                  |j                  «       «      «       Œ7 |S # t        j                  $ r t        j                  d|«       Y Œew xY w)Nz*/project.jsonzunreadable %s)	ÚsortedÚglobrv   rR   rS   rT   ÚJSONDecodeErrorr8   Úwarning)rz   ÚoutrM   s      r   r
   r
   £   sq   € Ø
€CÜ�D—I‘IÐ.Ó/Ó0ò ,ˆð	,Ø�J‰J”t—z‘z !§+¡+£-Ó0Õ1ð,ð
 €Jøô ×#Ñ#ò 	,Ü�K‰K˜¨Ö+ð	,ús   ¡2AÁ)BÂBc                óò  — g }t        | «      D �]   }|j                  d«      r|d   d   nd }dj                  d„ |xs i j                  dg «      D «       «      xs d}dj                  d„ |xs i j                  d	g «      D «       «      }t        j                  |d
   «      }|r	d|› d|› d�nd}|j                  d|› dt        j                  |d   d   «      › dt        |d   «      › d|› |› d|rt        j                  |d   «      nd› dt        |j                  dg «      «      › d|› d�«       �Œ# ddj                  |«      xs d› d�}| j                  dd¬«       | dz  j                  |d¬ «       | dz  S )!Nrm   r�   z<br>c              3  ó    K  — | ]F  }t        j                  |d    «      › d|d   › d|d   › d|d   d   › d|d   d	   › d
|d   d   › d�–— ŒH y­w)r‡   ú a:r†   u    â€” <b>r‰   z</b> (CrŠ   Úcriticalz / MÚmajorz / mÚminorú)N©ÚhtmlÚescape)Ú.0r}   s     r   ú	<genexpr>zwrite_index.<locals>.<genexpr>±   s‡   è ø€ ò 4ð ô �{‰{˜1˜V™9Ó%Ð& c¨!¨MÑ*:Ð);¸8ÀAÀgÁJÀ<ð PØÐ$Ñ% jÑ1Ð2°$°qÐ9JÑ7KÈGÑ7TÐ6UÐUYÐZ[Ð\mÑZnÐovÑZwÐYxÐxyô{ñ4ùs   ‚AAr�   znot run yetr   c              3  ó†   K  — | ]9  }d t        j                  |d   «      › dt        j                  |d   «      › d�–— Œ; y­w)z<div class=warn>failed: rˆ   ú: Úerrorz</div>Nr®   )r±   rM   s     r   r²   zwrite_index.<locals>.<genexpr>µ   sI   è ø€ ò BØð 4´D·K±KÀÀ%ÁÓ4IÐ3JÈ"ÌTÏ[É[ÐYZÐ[bÑYcÓMdÐLeÐekÔlñ Bùs   ‚?Ar�   rg   z	<a href="u%   /report.html">report</a> Â· <a href="z/report.json">json</a>z<tr><td><b>z</b><div class=s>ri   r#   z</div></td><td>rj   z	</td><td>r‹   z<div class=s>z run(s)</div></td><td>z
</td></tr>a.  <!doctype html><html lang="en"><head><meta charset="utf-8"><title>dubeval projects</title>
<style>body{font:14px/1.4 system-ui,sans-serif;margin:16px;color:#1a1a1a}table{border-collapse:collapse;width:100%}
th,td{border-bottom:1px solid #ddd;padding:6px;text-align:left;vertical-align:top}th{background:#f3f3f3}
.s{font-size:12px;color:#555;word-break:break-all}.warn{color:#a04000}</style></head><body>
<h1>dubeval projects</h1><table><thead><tr><th>project</th><th>dubs</th><th>latest scores per pair</th>
<th>last run</th><th>open</th></tr></thead><tbody>z'<tr><td colspan=5>no projects</td></tr>z
</tbody></table></body></html>Trd   ú
index.htmlzutf-8)Úencoding)	r
   r   Újoinr¯   r°   rv   ru   rs   r[   )	rz   ÚrowsÚpÚlastr�   r�   ÚnÚlinkÚpages	            r   r™   r™   ­   sÂ  € Ø€DÜ�d‹^ó -ˆØ !§¡ f¤ˆq�‰y˜Š}°4ˆØ—‘ñ 4ð ’j˜b×%Ñ% g¨rÓ2ô4ó 4ò Eð 8Eð 	ð —‘ñ BØ#'¢:¨2×"2Ñ"2°8¸RÓ"@ôBó Bˆä�K‰K˜˜&™	Ó"ˆÙ`d�˜1˜#ÐBÀ1À#ÐE[Ñ\ÐjlˆØ�‰�k ! Ð$5´d·k±kÀ!ÀJÁ-ÐPXÑBYÓ6ZÐ5[ð \Ü˜q ™y›>Ð*¨)°E°7¸6¸(ð CÙ6:œ4Ÿ;™; t¨D¡zÔ2ÀÐCÀ=ÔQTÐUV×UZÑUZÐ[aÐceÓUfÓQgÐPhð iØ˜& 
ð,ö 	-ð-ð3ð
 46·7±7¸4³=Ò3mÐDmÐ2nð oð"€Dð 	‡J�J�t d€JÔ+Ø	ˆLÑ×$Ñ$ T°GÐ$Ô<Ø�,ÑÐr   c                óŒ	  ‡— t        j                  dt        t         j                  ¬«      }|j	                  dd¬«       |j                  dd¬«      }|j                  d	d
¬«      }|j	                  d«       |j	                  dd¬«       |j	                  ddg d¬«       |j	                  d«       |j	                  dd¬«       |j	                  ddd¬«       |j                  dd¬«      }|j	                  ddd¬«       ||fD ]i  }|j	                  ddd¬«       |j	                  d d¬!«       |j	                  d"d#d$¬%«       |j	                  d&d'd(¬%«       |j	                  d)t        d*¬+«       Œk |j                  d,d-¬«       |j                  d.d/¬«       |j                  | «      Št        j                  t        j                  d0t        j                  ¬1«       d2D ]4  }t        j                  |«      j                  t        j                   «       Œ6 t#        ‰j$                  «      }ˆfd3„}‰j&                  d	k(  r®‰j(                  xs d4j+                  d5«      D �	cg c]#  }	|	j-                  «       sŒ|	j-                  «       ‘Œ% }
}		 t/        |‰j0                  ‰j2                  ‰j4                  ‰j6                  |
«      }t?        d6› �«       ‰j@                  r‰j0                  gng }nù‰j&                  dk(  r9‰j0                  d7gk(  rtC        |«      D �	cg c]  }	|	d   ‘Œ	 c}	n‰j0                  }n±‰j&                  d,k(  rŠtC        |«      D ]{  }	|	jE                  d8«      r|	d8   d9   nd }|rd:jG                  d;„ |d<   D «       «      nd=}t?        |	d   d>›d?tI        |	d@   «      › dAtI        |	jE                  d8g «      «      › dB|› �«       Œ} yCt?        dDtK        |«      › �«       yCdC}|D ]Ž  }tA        || |«       «      }|d<   D ]'  }t?        |› dE|dF   › dG|dH   › dI|dJ   › dB|dK   › �	«       Œ) |dL   D ]-  }t?        |› dM|dN   › dE|dO   › �t        j                  ¬P«       dQ}Œ/ t?        |› dR||z  dSz  › �«       Œ� |rt?        dT|dUz  › �«       |S c c}	w # t8        $ r%}|j;                  t=        |«      «       Y d }~�Œûd }~ww xY wc c}	w )VNzdubeval-project)ÚprogÚdescriptionÚformatter_classz--rootz<projects directory (default ./projects or $DUBEVAL_PROJECTS))ÚhelpÚcmdT)rI   Úrequiredrw   z/create a project / add dubs (downloads sources)rg   z
--originalz&path, http(s) URL or Google Drive linkz--dubrv   z#repeatable: path, URL or Drive link)ÚactionÚdefaultrÃ   z
--src-langz
--tgt-langz"comma-separated, e.g. es-419,pt-BRz--runÚ
store_truezrun the eval right after adding)rÆ   rÃ   r�   z4evaluate a project (all dubs) and refresh its reportú+zproject name(s), or 'all')ÚnargsrÃ   z
--separatez*Demucs stems (CPU: ~3 min per 5 min audio)z--no-visual)rÆ   z--llm-modelzgemini-flash,auto/best-fastz'none' disables)rÇ   rÃ   z--asr-modelzgroq/whisper-large-v3z'none' = local onlyz	--threadsé   )ÚtyperÇ   Úlistzlist projects and latest scoresÚindexzrebuild projects/index.htmlz%(asctime)s %(message)s)ÚlevelÚformatÚstream)ÚhttpxÚhttpcoreÚopenaiÚhuggingface_hubÚfaster_whisperr<   c                 ót  •— ‰j                   xs d} ‰j                  ‰j                   ‰j                  | j	                  «       dk(  rg n=| j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}‰j                  j	                  «       dk(  rd dœS ‰j                  dœS c c}w )Nr   Únoneú,)ÚseparateÚvisualÚthreadsÚ
llm_modelsÚasr_cloud_model)Ú	llm_modelrÚ   Ú	no_visualrÜ   r    ÚsplitÚstripÚ	asr_model)ÚllmÚmÚargss     €r   Ú	overrideszmain.<locals>.overridesé   s¡   ø€ Ø�n‰nÒ" ˆØ ŸM™M¸¿¹Ð5GÐTX×T`ÑT`Ø$'§I¡I£K°6Ò$9™bÐSV×S\ÑS\Ð]`ÓSaÖ?oÈaÐef×elÑelÕenÀÇÁÅ	Ò?oØ+/¯>©>×+?Ñ+?Ó+AÀVÒ+K 4ñað 	aàQU×Q_ÑQ_ñað 	aùÚ?os   ÁB5
Á2B5
r   rÙ   zproject ready: Úallrm   r�   z, c              3  ó6   K  — | ]  }|d    › d|d   › �–— Œ y­w)r‡   ú=r‰   Nr   )r±   Úys     r   r²   zmain.<locals>.<genexpr>ü   s#   è ø€ ÒR¸q ! F¡) ¨A¨a°©j¨\Ô:ÑRùs   ‚r�   znot runÚ24z dubs=rj   z runs=ú r   zwrote r´   r‡   r©   r†   z score r‰   rŠ   r�   z	: FAILED rˆ   rµ   )rn   rb   z	: report r…   zindex: r¶   )&ÚargparseÚArgumentParserÚ__doc__ÚRawDescriptionHelpFormatterÚadd_argumentÚadd_subparsersÚ
add_parserÚintÚ
parse_argsÚloggingÚbasicConfigÚINFOÚsysÚstderrÚ	getLoggerÚsetLevelÚWARNINGr   rz   rÄ   Útgt_langrá   râ   rw   rg   ri   rˆ   rk   Ú
ValueErrorrµ   r>   Úprintr�   r
   r   r¸   ru   r™   )Úargvrº   ÚsubÚarL   ÚspÚnoisyrz   rç   r}   ÚtgtrU   ÚeÚnamesr»   ÚscoresÚstatusr¼   Úresrë   rM   ræ   s                        @r   Úmainr  É   s�  ø€ Ü×ÑÐ%6ÄGÜ08×0TÑ0Tô	V€Aà‡N�N�8Ð"`€NÔaØ
×
Ñ
 °Ð
Ó
5€Cà�‰�uÐ#TˆÓU€AØ‡N�N�6ÔØ‡N�N�<Ð&N€NÔOØ‡N�N�7 8°RÐ>c€NÔdØ‡N�N�<Ô Ø‡N�N�<Ð&J€NÔKØ‡N�N�7 <Ð6W€NÔXà�‰�uÐ#YˆÓZ€AØ‡N�N�6 Ð+F€NÔGà�!ˆfò :ˆØ
�‰˜¨\Ð@lˆÔmØ
�‰˜¨lˆÔ;Ø
�‰˜Ð/LÐSdˆÔeØ
�‰˜Ð/FÐMbˆÔcØ
�‰˜¬#°qˆÕ9ð:ð ‡N�N�6Ð A€NÔBØ‡N�N�7Ð!>€NÔ?Ø�<‰<˜Ó€DÜ×ÑœgŸl™lÐ3LÔUX×U_ÑU_Õ`Ø^ò ;ˆÜ×Ñ˜%Ó ×)Ñ)¬'¯/©/Õ:ð;ä�—‘Ó€Dôað ‡x�x�5ÒØ#'§=¡=Ò#6°B×"=Ñ"=¸cÓ"BÖP˜QÀaÇgÁgÅiˆq�w‰w�yÐPˆÐPð	Ü�D˜$Ÿ)™) T§]¡]°D·H±H¸d¿m¹mÈSÓQˆAô 	� ˜sÐ#Ô$Ø#Ÿxšx�—‘‘¨R‰Ø	�‰�UÒ	Ø7;·y±yÀUÀGÒ7K¤H¨T£NÖ3˜q��6“Ó3ÐQU×QZÑQZ‰Ø	�‰�VÒ	Ü˜$“ò 	bˆAØ$%§E¡E¨&¤M�1�V‘9˜R’=°tˆDÙVZ�T—Y‘YÑRÀDÈÁMÔRÔRÐ`iˆFÜ�Q�v‘Y˜r�N &¬¨Q¨v©Y«Ð(8¸¼sÀ1Ç5Á5ÈÐQSÓCTÓ?UÐ>VÐVWÐX^ÐW_Ð`Õað	bð ä�”{ 4Ó(Ð)Ð*Ô+Øà€FØò 9ˆÜ�$˜™9›;Ó'ˆØ�W‘ò 	fˆAÜ�Q�C�r˜!˜F™)˜ C¨¨-Ñ(8Ð'9¸ÀÀ7ÁÀÈAÈaÐPaÑNbÐMcÐdÕeð	fà�X‘ò 	ˆAÜ�Q�C�y  5¡ 
¨"¨Q¨w©Z¨LÐ9ÄÇ
Á
ÕKØ‰Fð	ô 	���9˜T A™X¨Ñ5Ð6Ð7Õ8ð9ñ Ü�˜˜|Ñ+Ð,Ð-Ô.Ø€Mùò= Qøô ò 	Ø�G‰G”C˜“F�OŠOûð	üò
 4s*   ÉRÉ1RÊ8R ÌSÒ	R>ÒR9Ò9R>)r   ú
str | NoneÚreturnr   )r  r>   )r#   r>   r  r>   )r#   r>   rG   r   r  r   )rU   r   r  Údict)rU   r   r^   r  r  ÚNone)rz   r   rg   r>   ri   r  rj   ú	list[str]rk   r  rl   r  r  r   )rz   r   rg   r>   rš   r  r  r  )rz   r   r  z
list[dict])rz   r   r  r   )N)r  zlist[str] | Noner  rõ   )!rð   Ú
__future__r   rî   r¯   rR   r÷   r   r!   rC   rú   Úurllib.requestr   r   r   Úpathlibr   rü   r8   Úcompilerr   r:   r   r   r$   rN   rV   r`   rw   r�   r
   r™   r  r   r   r   ú<module>r     s°   ðñõ  #ã Û Û Û Û 	Û 	Û Û 
Û ß 'Ý à€g×Ñ˜	Ó"€àˆ�
‰
Ð1Ó2€Ø
ˆ"�*‰*Ð<Ó
=€óIóAóPó
ó>%ó$ð)Øð)Ø!%ó)óXó2óõ8Er   