Ë
    »¾ãj¨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ZddlZddl	m
Z
 ddlZej                  j                  dd¬«        e
e«      j                  «       j                   j                   Z	 ddlmZ  eedz  «       ed	z  d
z  Zed	z  dz  Zed	z  dz  Zed	z  dz  ZdZdZ ej6                  «       Zej:                  j=                  edddœ«       h d£Z ej@                  dejB                  «      Z"de#de#fd„Z$de#de#fd„Z%de#de#fd„Z& ej@                  dejB                  «      Z'dKde#de(de)fd„Z*dLde#de#de)fd „Z+d!„ Z,d"„ Z-dKd#„Z.dMd$e#d%e#de)fd&„Z/d'e0d(e#de(fd)„Z1 ej@                  d*«      Z2de#de0fd+„Z3d,e#de#fd-„Z4dLde#de#de0fd.„Z5de#de6fd/„Z7da8de#de#fd0„Z9dNd1„Z:dNde#d2e(d3e(d4e0dz  de0f
d5„Z;h d6£Z<de#de0fd7„Z=de0fd8„Z>d9e#d:e0fd;„Z?dOde#d4e0d<e(de@fd=„ZA	 dOde#d>e0d:e0d4e0d?e(de0fd@„ZBdAe0de#fdB„ZCde#de
fdC„ZDdAe0de
fdD„ZEde#fdE„ZFdFe#dGe#ddfdH„ZGdI„ ZHeIdJk(  r eH«        yy# e$ r Y �Œ®w xY w)PuX  
pixiv_tags: nombre de personaje -> tag canonico de Pixiv (japones/romaji) y,
opcionalmente, los tags R-18 que mas se repiten junto a el.

Sin token (solo red, cachea en `Archivos/pixiv_tags.json`):
    python Engine/pixiv_tags.py --keys "Furina,Makima_v2,Yelan"
    python Engine/pixiv_tags.py --from-batch "Output/pilots/.../plan.json"
    python Engine/pixiv_tags.py --keys "Furina" --refresh

Corregir a mano lo que no resuelve (nunca se vuelve a consultar):
    python Engine/pixiv_tags.py --set "Princess_Peach=ãƒ”ãƒ¼ãƒ�å§«" --set-en "Princess_Peach=Princess Peach"

Con token (lee obras; necesita PIXIV_REFRESH_TOKEN, ver gppt):
    python Engine/pixiv_tags.py --keys "Furina" --r18

Como resuelve: `/rpc/cps.php` es un autocompletado de **una sola palabra** (con
espacios devuelve vacio), asi que prueba variantes de la clave y puntua por
coincidencia EXACTA con `tag_translation` o `tag_name`. Lo que no llega a exacto
queda `status: revisar` con sus 3 mejores candidatos: no se adivina.

Limites: Pixiv no publica rate limit. 1,2 s entre peticiones, backoff 3/6/12 s.
Solo lee tags; no descarga obras.
é    N)ÚPathúutf-8Úbackslashreplace)ÚencodingÚerrors)Úload_dotenvz.envÚArchivoszpixiv_tags.jsonzpixiv_tags_manual.jsonzpixiv_series.jsonÚ
pixiv_tagsg333333ó?zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36zhttps://www.pixiv.net/zapplication/json)z
User-AgentÚRefererÚAccept>   õ   å¥³õ   è£¸õ   ç�€è¡£õ   aiã‚¤ãƒ©ã‚¹ãƒˆúr-18ÚaiÚr18ÚgirlÚsoloÚ1girlÚanimeÚkawaiiÚoriginalÚillustrationõ	   å¥³ã�®å­�zÙ(lora|illustrious|illust|noob|ponyxl|pony|sdxl|ilxl|illu|nvwls|nochekaiser|guy90|richy|nekoforge|konan|hardov|scarxzys|goofy|nyx|janeb|ove|ova|ingame|epilogue|character|s\d+s\d+|s\d|v\d+(\.\d+)?|sf\d|xl|[a-z]{1,2}\d+)ÚtextÚreturnc                 ó„   — t        j                  d| xs d«      j                  «       }t        j                  dd|«      }|S )z3Comparable: minusculas, sin separadores ni acentos.ÚNFKCÚ u-   [\s_\-ãƒ»=/\\'\"`.,:;!?()\[\]{}<>~+*&%$#@^|]+)ÚunicodedataÚ	normalizeÚlowerÚreÚsub)r   Úss     ú2C:\Users\Usuario\Downloads\SD\Engine\pixiv_tags.pyÚnormr(   I   s9   € ä×Ñ˜f d¢j¨bÓ1×7Ñ7Ó9€AÜ
�‰Ð?ÀÀQÓG€AØ€Hó    Útagc                 ó~  — t        j                  dd| «      }t        j                  dd|«      }t        j                  dd|«      }|j                  dd«      j                  dd«      }|j                  «       D �cg c]  }t        j                  |«      rŒ|‘Œ }}dj                  |«      j                  «       S c c}w )z4Tag de la linea del personaje -> nombre consultable.ú<lora:[^>]*>Ú z	\([^)]*\)z:[\d.]+Ú\Ú_)r$   r%   ÚreplaceÚsplitÚNOISEÚ	fullmatchÚjoinÚstrip)r*   ÚtÚwÚtokss       r'   Ú
_clean_tagr9   P   s–   € ä
�‰ˆ  SÓ)€AÜ
�‰ˆ|˜S !Ó$€AÜ
�‰ˆz˜3 Ó"€AØ	�	‰	�$˜Ó×$Ñ$ S¨#Ó.€AØ—w‘w”yÓ;‘y�!¬¯©¸Õ(:ŠA�y€DÐ;Ø�8‰8�D‹>×ÑÓ!Ð!ùò <s   Á:B:ÂB:Úkeyc                 óf  — t        j                  dd| «      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       D �cg c]  }t        j	                  |«      rŒ|‘Œ }}t        dj                  |«      «      xs | S c c}w )z¢Clave del catalogo -> nombre consultable.

    `mina-ashido-epilogue-illustriousxl-lora-nochekaiser` -> `mina ashido`
    `ChunLiSF6Illustrious` -> `Chun Li`
    r,   r-   z\[[^\]]*\]|\([^)]*\)z[_\-]+z(?<=[a-z])(?=[A-Z]))r$   r%   r1   r2   r3   r9   r4   )r:   r&   r7   r8   s       r'   Ú	clean_keyr<   Z   s�   € ô 	�‰ˆ  SÓ)€AÜ
�‰Ð&¨¨QÓ/€AÜ
�‰ˆy˜#˜qÓ!€AÜ
�‰Ð% s¨AÓ.€AØ—w‘w”yÓ;‘y�!¬¯©¸Õ(:ŠA�y€DÐ;Ü�c—h‘h˜t“nÓ%Ò,¨Ð,ùò <s   Á/B.Â
B.zÑ\b(hair|eyes?|eyebrows?|skin|breasts?|body|bangs|figure|face|ears?|tail|wings?|horns?|lips|sclera|pupils?|bun|ponytail|braid|twintails?|ahoge|solo|1girl|girl|screencap|makeup|mole|freckles?|muscular|thighs?)\bÚlineÚlimitc           	      ó8  — g }t        j                  dt        j                  dd| xs d«      «      d| D ]b  }t        |«      }|r%|j	                  «       st
        j                  |«      rŒ6t        j                  d|«      rŒM||vsŒR|j                  |«       Œd |S )zÓPrimeros tags de la linea del personaje que parezcan un NOMBRE.

    La linea empieza por el trigger del LoRA y sigue con el aspecto
    (`long hair`, `blue eyes`...), asi que se descartan los descriptores.
    Ú,r,   r    Nz[0-9a-z]*\d[0-9a-z]*)	r$   r1   r%   r9   ÚisdigitÚ
DESCRIPTORÚsearchr3   Úappend)r=   r>   Úoutr*   Únames        r'   Ú
line_namesrG   o   s‡   € ð €CÜ�x‰x˜œbŸf™f _°b¸$º*À"ÓEÓFÀvÈÓNˆÜ˜#‹ˆÙ�t—|‘|”~¬×):Ñ):¸4Ô)@ØÜ�<‰<Ð/°Ô6ØØ�sŠ?Ø�J‰J�tÕð Oð €Jr)   c                 ón  — t        |«      t        | «      gz   }g }|D ]f  }|j                  «       }|sŒt        |«      dkD  r2|j	                  dj                  |«      «       |j	                  |«       ŒV|j	                  |«       Œh |D ��cg c](  }|j                  «       D ]  }t        |«      dk\  sŒ|‘Œ Œ* }}}|t        t        |«      t        d¬«      z  }t        «       g }	}|D ]E  }
t        |
«      }|sŒ||vsŒ|j                  |«       |	j	                  |
j                  «       «       ŒG |	S c c}}w )a?  Consultas, de mas a menos probable.

    `cps.php` es un autocompletado de **una sola palabra**: con espacios
    devuelve vacio. Por eso se prueba el nombre pegado (`nicorobin`) y suelto,
    y **no** se baja a una palabra suelta si el nombre tiene varias (eso es lo
    que devolvia `peach`, `momo` o `genshin`).
    é   r    é   T)r:   Úreverse)rG   r<   r1   ÚlenrD   r4   ÚsortedÚsetr(   Úaddr5   )r:   r=   ÚnamesrE   Únmr8   r6   ÚsingleÚseenÚuniqÚqÚns               r'   Úquery_variantsrW   �   s  € ô �tÓ¤	¨#£Ð/Ñ/€EØ
€CÛˆØ�x‰x‹zˆÙØÜˆt‹9�qŠ=Ø�J‰J�r—w‘w˜t“}Ô%Ø�J‰J�r�Nà�J‰J�r�Nð ñ  ÔC™%�B¨¯©® A´s¸1³vÀ³{Ša¨ˆa˜%€FÑCØŒ6”#�f“+¤3°Ô5Ñ5€CÜ“˜ˆ$€DÛˆÜ�‹GˆÚ�˜$’Ø�H‰H�QŒKØ�K‰K˜Ÿ™›	Õ"ð	 ð
 €Kùó Ds   Â&D1Â2D1c                 ó²   — | j                  «       r&	 t        j                  | j                  d¬«      «      S |S # t        t        j
                  f$ r Y |S w xY w)Nr   ©r   )ÚexistsÚjsonÚloadsÚ	read_textÚOSErrorÚJSONDecodeError)ÚpathÚdefaults     r'   Ú	load_jsonrb       sU   € Ø‡{�{„}ð	Ü—:‘:˜dŸn™n°g˜nÓ>Ó?Ð?ð €Nøô œ×-Ñ-Ð.ò 	ØØ€Nð	ús   ’$9 ¹AÁAc                 ó�   — | j                   j                  dd¬«       | j                  t        j                  |dd¬«      d¬«       y )NT©ÚparentsÚexist_okFrI   ©Úensure_asciiÚindentr   rY   )ÚparentÚmkdirÚ
write_textr[   Údumps)r`   Údatas     r'   Ú	save_jsonro   ©   s6   € Ø‡K�K×Ñ˜d¨TÐÔ2Ø‡O�O”D—J‘J˜t°%ÀÔBÈW€OÕUr)   c           	      óz  — t        |«      D ]<  }	 t        j                  | |d¬«      }|j                  «        |j	                  «       c S  y # t
        j                  t        f$ rU}||dz
  k(  r‚ dd|z  z  }t        dt        |«      j                  › d|› d�«       t        j                  |«       Y d }~Œ©d }~ww xY w)	Né   )ÚparamsÚtimeoutrI   é   é   z    ! z; reintento en r&   )ÚrangeÚWEBÚgetÚraise_for_statusr[   ÚrequestsÚRequestExceptionÚ
ValueErrorÚprintÚtypeÚ__name__ÚtimeÚsleep)Úurlrr   ÚtriesÚiÚrÚeÚwaits          r'   Ú_getrˆ   ®   s©   € Ü�5Ž\ˆð		Ü—‘˜ F°B�Ó7ˆAØ×ÑÔ Ø—6‘6“8ŠOñ	 øô
 ×)Ñ)¬:Ð6ò 	Ø�E˜A‘IŠ~ØØ˜˜Q™‘<ˆDÜ�Fœ4 ›7×+Ñ+Ð,¨O¸D¸6ÀÐCÔDÜ�J‰J�t×Ñûð	ús   �7AÁB:Á%AB5Â5B:ÚkeywordÚlangc                 óL   — t        d| |dœ«      }|j                  dg «      xs g S )zJCandidatos de tag. `lang=en` trae `tag_translation` (el nombre en ingles).z!https://www.pixiv.net/rpc/cps.php)r‰   rŠ   Ú
candidates)rˆ   rx   )r‰   rŠ   Údocs      r'   ÚcpsrŽ   ¼   s-   € ä
Ð2Ø"¨DÑ1ó3€Cà�7‰7�< Ó$Ò*¨Ð*r)   ÚcandÚqueryc                 ó.  — t        |«      }|syt        | j                  d«      xs d«      t        | j                  d«      xs d«      g}||v ry|D ]A  }|j                  |«      rt        |«      t        |«      kD  r y||v sŒ2t        |«      dk\  sŒA y y)	zJ3 = el nombre coincide exacto; 2 = coincide + apellido/serie; 1 = parcial.r   Útag_translationr    Útag_namert   ru   rJ   rI   )r(   rx   Ú
startswithrL   )r�   r�   rU   rP   rV   s        r'   Úscorer•   Ã   sŽ   € äˆU‹€AÙØÜ�$—(‘(Ð,Ó-Ò3°Ó4Ü�$—(‘(˜:Ó&Ò,¨"Ó-ð/€EàˆE�zØÛˆØ�<‰<˜Œ?œs 1›v¬¨A«šÙØ�Š6”c˜!“f “kÙð	 ð
 r)   u   æ›–æ˜§ã�•å›žé�¿|ä»¥ä¸‹ã�®é …ç›®c           	      ó$  — | si S 	 t        d| z   ddid¬«      }|j                  d	«      xs i }|j                  d
«      xs i j                  d«      xs dj                  «       }t        j                  dd|«      dd t        t        j                  |«      «      |j                  d«      xs g D �cg c]  }|j                  d«      ‘Œ c}dd dœS # t        $ r0}t        d| ›dt        |«      j                  › �«       i cY d}~S d}~ww xY wc c}w )u+  Ficha publica del tag: descripcion de pixpedia + tags hermanos.

    Es lo que convierte una coincidencia de texto en una **verificacion**: la
    descripcion dice de que obra es el personaje, asi que se puede comprobar
    sin abrir la pagina. Un tag ambiguo (`å¿ƒæµ·`) lo dice explicitamente.
    z'https://www.pixiv.net/ajax/search/tags/rŠ   Újart   ©rƒ   z    ! tags(ú): NÚbodyÚpixpediaÚabstractr    z\s+r-   i,  ÚsiblingsTagsr*   é   )rœ   Ú	ambiguousÚsiblings)rˆ   Ú	Exceptionr}   r~   r   rx   r5   r$   r%   ÚboolÚ	AMBIGUOUSrC   )r*   r�   r†   rš   rœ   r6   s         r'   Útag_infor¤   ×   s  € ñ Øˆ	ðÜÐ<¸sÑBØ˜D�>¨ô,ˆð
 �7‰7�6‹?Ò ˜b€DØ—‘˜*Ó%Ò+¨×0Ñ0°Ó<ÒBÀ×IÑIÓK€Hä—F‘F˜6 3¨Ó1°$°3Ð7Üœ)×*Ñ*¨8Ó4Ó5Ø,0¯H©H°^Ó,DÒ,JÈÐ,JÓLÑ,J a�Q—U‘U˜5•\Ð,JÑLÈRÈaÐPñð øô ò Ü�˜C˜7 #¤d¨1£g×&6Ñ&6Ð%7Ð8Ô9Ø�	ûðüò Ms#   †C Â1DÃ	D
Ã%DÃ?D
ÄD
rœ   c                 óp   — dD ]1  }t        j                  || xs d«      }|sŒ |j                  d«      c S  y)uT   Saca la obra de la descripcion (`ã€Žãƒ€ãƒ³ãƒ€ãƒ€ãƒ³ã€�ã�®â€¦` -> `ãƒ€ãƒ³ãƒ€ãƒ€ãƒ³`).)u   ã€Ž([^ã€�]{2,30})ã€�u   ã€Œ([^ã€�]{2,30})ã€�r    rI   )r$   rC   Úgroup)rœ   ÚpatÚms      r'   Ú	series_ofr©   ï   s7   € ãAˆÜ�I‰I�c˜8š> rÓ*ˆÚØ—7‘7˜1“:Òð Bð r)   c                 óÆ  — t        «       g }}t        | |«      dd D ]Å  }dD ]ª  }	 t        ||«      }|D ]}  }|j                  d«      xs d}	|	|v rŒ|j                  |	«       |j                  |	|j                  d	«      xs dt        |j                  d
«      xs d«      t        ||«      |dœ«       Œ t        j                  t        «       Œ¬ t        d„ |D «       «      sŒÅ n |s| dg dœS |j!                  d„ ¬«       |d   }
|D �cg c]  }|d   dk(  sŒ|‘Œ }}|rt#        |d„ ¬«      n|
}|d   dk(  rdnd}t%        t'        | «      j)                  «       «      dkD  }|dk(  r#|r!t%        |d   j)                  «       «      dk(  rd}|dk(  r-t+        |d   «      t,        D �ch c]  }t+        |«      ’Œ c}v rd}t/        |d   «      }t1        |j                  dd«      «      }|dk(  r|j                  d«      rd}| |d   |d   |d   |d   ||dœ|¥d|dd  i¥S # t        $ r4}t	        d|›d|› dt        |«      j                  › �«       g }Y d}~�Œ d}~ww xY wc c}w c c}w )!zAPrueba variantes (y ambos idiomas) y elige la mejor coincidencia.Nrž   )Úenr—   z
    ! cps(r@   r™   r“   r    r’   Úaccess_countr   )r*   r«   Úaccessr•   r�   c              3   ó,   K  — | ]  }|d    dk(  –— Œ y­w)r•   rt   N© )Ú.0Úcs     r'   Ú	<genexpr>zresolve_key.<locals>.<genexpr>  s   è ø€ Ð-© 1ˆq�‰z˜Q�©ùs   ‚Úsin_resultado)r:   ÚstatusÚcandsc                 ó   — | d    | d    fS )Nr•   r­   r¯   ©r±   s    r'   Ú<lambda>zresolve_key.<locals>.<lambda>  s   € ˜a ™j˜[¨1¨X©;¨,Ñ7r)   ©r:   r•   rt   c                 ó   — | d   S )Nr­   r¯   r·   s    r'   r¸   zresolve_key.<locals>.<lambda>  s   €  a¨¢kr)   ÚokÚrevisarrI   r�   r*   rœ   rŸ   r«   r­   )r:   Újpr«   r­   r�   r´   Úseriesrµ   é   )rN   rW   rŽ   r¡   r}   r~   r   rx   rO   rD   Úintr•   r€   r�   ÚSLEEPÚanyÚsortÚmaxrL   r<   r1   r(   ÚGENERICr¤   r©   )r:   r=   rS   ÚpoolrU   rŠ   rµ   r†   r±   rF   ÚbestÚexactÚchosenr´   Úmultiword_keyÚgÚinfor¾   s                     r'   Úresolve_keyrÍ   ø   sˆ  € ä“˜ˆ$€DÜ˜C Ó& r¨Ó*ˆÛ ˆDðÜ˜A˜t›�ó �Ø—u‘u˜ZÓ(Ò.¨B�Ø˜4‘<ØØ—‘˜”Ø—‘ DØ#$§5¡5Ð):Ó#;Ò#A¸rÜ'*¨1¯5©5°Ó+@Ò+EÀAÓ'FÜ&+¨A¨q£kØ&'ñ	)õ *ð ô �J‰J”uÕð! !ô" Ñ-©Ó-Õ-Ùð' +ñ* Ø oÀÑCÐCà‡I�IÑ7€IÔ8Ø�‰7€DÙÓ0™�1  '¡
¨a£ŠQ˜€EÐ0Ù6;ŒS�Ñ1Õ2À€Fà˜G‘_¨Ò)‰T¨y€Fô œ	 #›×,Ñ,Ó.Ó/°!Ñ3€MØ�‚~™-¬C°°w±×0EÑ0EÓ0GÓ,HÈAÒ,MØˆØ�‚~œ$˜v e™}Ó-Å7Ó1KÁ7¸a´$°qµ'À7Ñ1KÑKØˆä�F˜5‘MÓ"€DÜ�t—x‘x 
¨BÓ/Ó0€FØ�‚~˜$Ÿ(™( ;Ô/ØˆàØ�U‰mØ�T‰lØ˜Ñ"Ø˜‘ØØñ
ð ð
ð 	��b�q�ñ
ð 
øôM ò Ü˜
 1 % q¨¨¨c´$°q³'×2BÑ2BÐ1CÐDÔEØ–ûðüò, 1ùò 2Ls)   ¥HÄIÄIÆ!IÈ	IÈ")IÉIc                 óH   — t        t        j                  d| xs d«      «      S )Nz[\u3040-\u30ff\u3400-\u9fff]r    )r¢   r$   rC   )r   s    r'   Úis_cjkrÏ   2  s   € Ü”—	‘	Ð9¸4º:À2ÓFÓGÐGr)   c                 ó°  — t         €|t        j                  j                  dt	        t
        dz  «      «       t        j                  j                  dt	        t
        dz  «      «       	 ddlm}  |t	        t
        «      «      a t         sy	 t         j                  | «      xs i j                  dd«      xs dS # t        $ r da Y ŒBw xY w# t        $ r Y yw xY w)zDLinea base del personaje en `personajes.txt` (para sacar su nombre).r   ÚEnginer	   )ÚPromptBuilderFr    Úbase)Ú_BUILDERÚsysr`   ÚinsertÚstrÚBASE_DIRÚprompt_builderrÒ   r¡   Úget_characterrx   )r:   rÒ   s     r'   Úcharacter_linerÛ   9  s¶   € ô ÐÜ�‰�‰˜œ3œx¨(Ñ2Ó3Ô4Ü�‰�‰˜œ3œx¨*Ñ4Ó5Ô6ð	Ý4Ù$¤S¬£]Ó3ˆHõ ØðÜ×&Ñ& sÓ+Ò1¨r×6Ñ6°v¸rÓBÒHÀbÐHøô ò 	ØŠHð	ûô ò Ùðús$   Á(B8 Â,C	 Â8CÃCÃ		CÃCc                 ó`   — t        | t        «      r| j                  ||«      S t        | ||«      S )z:Compatible con JsonDict (pixivpy 3.7.5) y pydantic (3.13).)Ú
isinstanceÚdictrx   Úgetattr)Úobjr:   ra   s      r'   Úfieldrá   L  s,   € ä�#”tÔØ�w‰w�s˜GÓ$Ð$Ü�3˜˜WÓ%Ð%r)   ÚpagesÚtoprÆ   c                 ó|  — dd l }ddlm} 	 ddlm} |j                  j                  d«      }|st        d«      ‚ |«       }|j                  |¬«       |j                  d«        |«       d}
}	| › d	�d
dddœ}t        t        d|«      «      D ]Î  } |j                  di |¤Ž}t        |d«      xs g }|
t        |«      z  }
|D ]_  }t        |d«      xs g D ]J  }t        |d«      xs t        |d«      }|r|| k(  s|t         v s|j#                  d«      rŒ>|	|xx   dz  cc<   ŒL Œa |j%                  t        |d«      «      }|s nt'        j(                  t*        «       ŒÐ |r*|	j-                  «       D ��cg c]  \  }}||v sŒ||f‘Œ c}}ng }|
|	j-                  |«      |dœS # t
        $ r t        d«      ‚w xY wc c}}w )Nr   )ÚCounter)ÚAppPixivAPIzI[!] falta pixivpy: pip install "git+https://github.com/upbit/pixivpy.git"ÚPIXIV_REFRESH_TOKENz6[!] define PIXIV_REFRESH_TOKEN (gppt login) para --r18)Úrefresh_tokenzen-usz R-18Úpartial_match_for_tagsÚ	date_descÚfor_ios)ÚwordÚsearch_targetrÃ   ÚfilterrI   ÚillustsÚtagsr*   rF   u   userså…¥ã‚ŠÚnext_url)Ú	r18_worksÚr18_topÚr18_poolr¯   )ÚosÚcollectionsrå   Úpixivpy3ræ   ÚImportErrorÚ
SystemExitÚenvironrx   ÚauthÚset_accept_languagerv   rÄ   Úsearch_illustrá   rL   rÅ   ÚendswithÚparse_qsr€   r�   rÁ   Úmost_common)r*   râ   rã   rÆ   rõ   rå   ræ   ÚtokenÚapiÚcounterÚtotalÚqsr/   Úresrï   Úillr6   rF   rV   Ú	pool_hitss                       r'   Úr18_tagsr	  S  sÒ  € ÛÝ#ðfÝ(ð �J‰J�N‰NÐ0Ó1€EÙÜÐQÓRÐRá
‹-€CØ‡H�H˜5€HÔ!Ø×Ñ˜GÔ$á“Y ˆU€GØ�E˜�-Ð2JØ¨ñ
4€Bä”3�q˜%“=Ö!ˆØˆc×ÑÑ% "Ñ%ˆÜ˜˜YÓ'Ò-¨2ˆØ”�W“ÑˆÛˆCÜ˜C Ó(Ò.¨BÒ.�ô ˜Q “Ò:¬%°°6Ó*:�Ù ¨¢¨t´w©ØŸ=™=¨Ô7ØØ˜“ Ñ"”ñ /ð ð �\‰\œ%  ZÓ0Ó1ˆÙÙÜ�
‰
”5Õð! "ñ, ð &-×%8Ñ%8Ô%:ÔHÑ%:™T˜Q ¸aÀ4ºi�1�a’&Ð%:ÓHØ ð à¨7×+>Ñ+>¸sÓ+CØ!ñ#ð #øôK ò fÜÐdÓeÐeðfüóF Is   ŒF  Å2F8Å?F8Æ F5>   õ   ã‚°ãƒ­õ   ãƒ­ãƒªõ   å°�èª¬õ   æ¼«ç”»õ   ç�£å§¦õ   ç·´ç¿’õ   è¬›åº§õ   è¼ªå§¦õ   AIç”Ÿæˆ�õ	   ã‚·ãƒ§ã‚¿õ	   ãƒªãƒ§ãƒŠõ	   ãƒ¬ã‚¤ãƒ—õ	   æ��ã��æ–¹õ	   ç¾Žå°‘å¥³õ	   è�½æ›¸ã��õ   ã�†ã�”ã‚¤ãƒ©õ   ã�µã�Ÿã�ªã‚Šõ   ã‚¤ãƒ©ã‚¹ãƒˆõ   ã‚ªãƒªã‚¸ãƒŠãƒ«õ   ãƒ�ãƒ©ã‚·ã�®è£�õ   pixivä»Šæ—¥ã�®ã�Šé¡Œõ   ã‚ªãƒªã‚¸ãƒŠãƒ«1000userså…¥ã‚ŠúR-18Gr   r   ÚNovelAIÚStableDiffusionr   õ   AIã‚¤ãƒ©ã‚¹ãƒˆúR-18c                 óh  — | sdg dœS t         j                  j                  | «      }	 t        d|z   | ddddddd	œd
¬«      }|j                  d«      xs i }t        |j                  d«      xs i j                  d«      xs d«      |j                  d«      xs g D �cg c]I  }t        |t        «      r|j                  d«      r&n|r#t        |t        «      r|j                  d«      n|‘ŒK c}dœS # t        $ r3}t        d| ›dt        |«      j                  › �«       dg dœcY d}~S d}~ww xY wc c}w )z?Obras con ese tag: total y tags que co-ocurren (`relatedTags`).r   )r  Úrelatedz+https://www.pixiv.net/ajax/search/artworks/Údate_dÚallrI   Ú
s_tag_fullr—   )rì   ÚorderÚmodeÚpÚs_moder~   rŠ   rt   r˜   z    ! obras(r™   Nrš   ÚillustMangar  ÚrelatedTagsr*   )ÚurllibÚparseÚquoterˆ   r¡   r}   r~   r   rx   rÀ   rÝ   rÞ   )r*   rU   r�   r†   rš   r6   s         r'   Úworks_ofr3  “  s5  € áØ rÑ*Ð*Ü�‰×Ñ˜3Ó€Að+ÜÐ@À1ÑDØ¨(¸EÈØ*°EÀ4ñIØPQôSˆð �7‰7�6‹?Ò ˜b€Dä�d—h‘h˜}Ó-Ò3°×8Ñ8¸ÓAÒFÀQÓGà"Ÿh™h }Ó5Ò;¸Ð;óEÙ;˜Ü(2°1´dÔ(;˜Ÿ™˜e�Áô &0°´4Ô%8�Q—U‘U˜5”\¸aÑ?Ø;ñEñð øô	 ò +Ü�˜S˜G 3¤t¨A£w×'7Ñ'7Ð&8Ð9Ô:Ø rÑ*Õ*ûð+üòEs$   ¨C0 ÂAD/Ã0	D,Ã9(D'Ä!D,Ä'D,c                  ó"   — t        t        i «      S ©N)rb   Ú
SERIES_MAPr¯   r)   r'   Úload_seriesr7  ¨  s   € Ü”Z Ó$Ð$r)   ÚrawÚsmapc                 ó$  — t        | «      }|sy|j                  «       D ]o  \  }}|j                  d«      st        |t        «      sŒ(|t        |«      k(  rd|i|¥c S |j                  d«      xs g D ]  }|t        |«      k(  sŒd|i|¥c c S  Œq y)z@Obra tal como la escribe pixpedia -> ficha del mapa (`jp`/`en`).Nr/   r½   Úaliases)r(   Úitemsr”   rÝ   rÞ   rx   )r8  r9  rV   r½   ÚvalÚaliass         r'   Úseries_entryr?  ¬  s”   € äˆS‹	€AÙØØ—:‘:–<‰ˆˆCØ�=‰=˜Ô¤Z°´TÔ%:ØØ”�R“Š=Ø˜"Ð$ Ð$Ò$Ø—g‘g˜iÓ(Ò.¨BÒ.ˆEØ”D˜“KÓØ˜bÐ( CÐ(Ô(ñ /ð  ð r)   rV   c                 óZ  ‡‡— |xs g D ��cg c]  \  }}|‰v sŒ|‘Œ }}}|sNt        | «      d   }i Št        |«      D ]  \  }}‰j                  ||«       Œ t        ˆfd„‰D «       ˆfd„¬«      }g d}
}	|D ]E  }t	        |	«      |k\  r n5‰|   j                  d«      dk(  r|
dk\  rŒ0|
d	z  }
|	j                  |«       ŒG t	        |	«      |k  r±g d
¢}|D ]s  }t	        |	«      |k\  r nc‰j                  «       D ]N  \  }}|j                  d«      |k7  s||	v rŒ|dk(  rt        ˆfd„|	D «       «      dk\  r Œ`|	j                  |«        Œs Œu t	        |	«      |k  r'|	‰D �cg c]	  }||	vsŒ|‘Œ c}d|t	        |	«      z
   z  }	|	t	        |D �cg c]	  }||	v sŒ|‘Œ c}«      fS c c}}w c c}w c c}w )a:  Los `n` generales del pool, ordenados por co-ocurrencia **medida**.

    `meas` = [(tag, veces)] sacado de leer obras reales (requiere token). Si no
    hay token, se usa `relatedTags`, que mezcla personajes y series: sirve para
    filtrar el pool, no para sustituirlo. Los huecos se completan por categoria.
    r&  c              3   ó,   •K  — | ]  }|‰v sŒ|–— Œ y ­wr5  r¯   )r°   r6   rÆ   s     €r'   r²   zpick_nsfw.<locals>.<genexpr>É  s   øè ø€ Ð6¡D˜q¨A°ªIœ¡Dùs   ƒ	�c                 ó   •— ‰|    S r5  r¯   )r6   Úranks    €r'   r¸   zpick_nsfw.<locals>.<lambda>É  s	   ø€ ÀdÈ1Âgr)   r¹   r   ÚcatÚcuerport   rI   )rE  ÚropaÚestadoÚactoÚencuadrec              3   óR   •K  — | ]  }‰|   j                  d «      dk(  sŒd–— Œ  y­w)rD  rE  rI   N)rx   )r°   r±   rÆ   s     €r'   r²   zpick_nsfw.<locals>.<genexpr>à  s*   øè ø€ ð +MÙ#)˜a¨T°!©W¯[©[¸Ó-?À8Ó-Kœ¡6ùs   ƒ' 'N)	r3  Ú	enumerateÚ
setdefaultrM   rL   rx   rD   r<  Úsum)r*   rÆ   rV   Úmeasr6   r/   Úrankedr&  r„   rÉ   rš   ÚpriorD  ÚmetarC  s    `            @r'   Ú	pick_nsfwrR  ¼  sÌ  ù€ ð "šZ R˜ZÔ6™Z‘D�A�q¨A°ªIŠa˜Z€FÑ6ÙÜ˜3“- 	Ñ*ˆØˆÜ˜gÖ&‰DˆAˆqØ�O‰O˜A˜qÕ!ð 'äÓ6¡DÓ6Ó<MÔNˆð
 �qˆD€FÛˆÜˆv‹;˜!ÒÙØ�‰7�;‰;�uÓ Ò)Ø�qŠyØØ�A‰IˆDØ�‰�aÕð ô ˆ6ƒ{�Q‚Ú?ˆÛˆCÜ�6‹{˜aÒÙØŸ:™:ž<‘��4Ø—8‘8˜E“? cÒ)¨Q°&©[ØØ˜(’?¤só +MÙ#)ó+Mó (MØPQò(RáØ—‘˜aÔ Ùñ (ð ô ˆv‹;˜Š?Ø¡$Ó:¡$˜Q¨!°6ª/’q $Ñ:Ð;L¸QÄÀVÃ¹_ÐMÑMˆFØ”3¡6Ó9¡6˜a¨Q°&ª[š 6Ñ9Ó:Ð:Ð:ùóI 7ùòF ;ùÚ9s"   ŒF™FÅ	F#Å%F#Æ	F(
ÆF(
ÚentryÚnsfw_nc                 óN  — |j                  d«      xs d}|j                  d«      xs d}t        ||«      xs i }|rt        ||||«      ng df\  }	}
|	D �cg c],  }|j                  |«      xs i j                  d«      dk(  sŒ+|‘Œ. }}|	D �cg c]	  }||vsŒ|‘Œ }}||j                  d«      xs d|j                  d«      xs ||j                  d«      xs dfD �cg c]  }|r|‘Œ }}||z   |z   dgz   }|dgdz  z   d	d }| |||z   |dd
dg||j                  d«      xs |dœ|j                  d«      xs d|j                  d«      xs ddœ|	|
t        |«      |j                  d«      xs d|j                  d«      dv |j                  d«      xs ddœS c c}w c c}w c c}w )z9Ficha publicable de un personaje -> dict con los 10 tags.r½   r    r¾   r   rD  rE  r«   é
   Nr$  r#  )Úcharr¾   r­   r´   )r»   Úmanual)rW  rð   ÚfijosÚ
por_imagenÚlibreÚextrar½   r«   ÚnsfwÚnsfw_measuredÚ	series_okÚworks_totalÚverifiedr´   )rx   r?  rR  r¢   )r:   rS  r9  rÆ   rT  rN  r½   Ú
raw_seriesÚser]  Úco_hitsr6   rY  rZ  Úheadrð   s                   r'   Úbuild_chainrf  ê  sÚ  € ð 
�‰�4‹Ò	˜B€BØ—‘˜8Ó$Ò*¨€JÜ	�j $Ó	'Ò	-¨2€BÙ9;”I˜b $¨°Ô5À"ÀaÀ�M€Dˆ'ñ ÓK™�1 §¡¨!£Ò!2°× 7Ñ 7¸Ó >À(Ó JŠQ˜€EÐKÙ!Ó4™T˜ Q¨e¢^’!˜T€JÐ4Ø˜EŸI™I d›OÒ1¨rØŸ™˜t›Ò2¨
°B·F±F¸4³LÒ4FÀBñHó Nñ H�!ÙKLò ð H€Dð Nà�5‰L˜:Ñ%¨¨Ñ,€DØ�B�4˜"‘9Ñ˜c˜rÐ"€DàØØ˜‘Ø ØØÐ*Ð+Ø R§V¡V¨D£\Ò%?°ZÑ@Ø—y‘y “Ò,¨"¸¿¹¸t»Ò8JÈÑKØØ Ü˜"“XØ—y‘y Ó*Ò/¨aØ—I‘I˜hÓ'Ð+;Ð;Ø—)‘)˜HÓ%Ò+¨ñð ùò LùÚ4ùòNs   Á,FÂFÂ	FÂFÃF"Úchainc                 ób   — dj                  | d   D �cg c]  }|sŒ|‘Œ	 c}| d   z   «      S c c}w )z?La cadena tal cual se pega en Pixiv (`R-18` incluido al final).ú, rð   r\  )r4   )rg  r6   s     r'   Ú
chain_linerj    s2   € à�9‰9  v¢Ó4¡˜A²!’a Ñ4°u¸W±~ÑEÓFÐFùÒ4s   “,›,c                 ól   — t        j                  dd| «      j                  «       xs d}t        |› d�z  S )z@Ruta de la ficha de un personaje (misma sanea que `save_chain`).z
[^\w.\- ]+r/   rW  z.json)r$   r%   r5   ÚCHAINS)r:   Úsafes     r'   Ú
chain_pathrn    s3   € ä�6‰6�-  cÓ*×0Ñ0Ó2Ò<°f€DÜ�t�f˜E�NÑ"Ð"r)   c                 ó¢   — t         j                  dd¬«       t        | d   «      }|j                  t	        j
                  | dd¬«      d¬«       |S )	NTrd   rW  FrI   rg   r   rY   )rl  rk   rn  rl   r[   rm   )rg  r`   s     r'   Ú
save_chainrp    sB   € Ü
‡L�L˜¨€LÔ-Ü�e˜F‘mÓ$€DØ‡O�O”D—J‘J˜u°5ÀÔCÈg€OÔVØ€Kr)   c                 ó´  — ddg}| D ]¿  }|j                  dj                  |d   |j                  d«      xs d|j                  d«      xs d|j                  d«      xs |j                  d	«      rd
nd|j                  d«      xs dddddœj                  |j                  d«      |j                  d«      xs d«      «      «       ŒÁ dj                  |«      S )Nu9   | Clave | Tag Pixiv | InglÃ©s | Obra | Accesos | Estado |z|---|---|---|---|---|---|z#| `{}` | {} | {} | {} | {:,} | {} |r:   r½   õ   â€”r«   r¾   rŸ   Úambiguor­   r   u   âœ…u   âš ï¸� revisaru
   âœ… manual)r»   r¼   rX  r´   Ú
)rD   Úformatrx   r4   )ÚrowsrE   r…   s      r'   Úto_markdownrw    sÁ   € ØFØ&ð(€CãˆØ�
‰
Ð8×?Ñ?Øˆe‰H�a—e‘e˜D“kÒ* U¨A¯E©E°$«KÒ,@¸5Ø�E‰E�(‹OÒK¨Q¯U©U°;Ô-?¡	ÀUØ�E‰E�(‹OÒ ˜qØÐ%5ÀÑNß‰S�—‘�x“ !§%¡%¨£/Ò":°UÓ;ó=õ 	>ð ð �9‰9�S‹>Ðr)   ÚspecÚ
field_namec                 ó  — d|vrt        d|›d�«      ‚|j                  dd«      \  }}|j                  «       |j                  «       }}|| j                  |i «      |<   t	        t
        | «       t        d|› d|› d|›�«       y )NÚ=z[!] formato incorrecto: z (usa Clave=valor)rI   z[OK] ú -> )rù   r1   r5   rL  ro   ÚMANUALr}   )rX  rx  ry  r:   Úvalues        r'   Ú	apply_setr  *  s„   € Ø
�$�ÜÐ3°D°8Ð;MÐNÓOÐOØ—‘˜C Ó#�J€CˆØ—‘“˜eŸk™k›mˆ€CØ-2€F×Ñ�c˜2Ó˜zÑ*ÜŒf�fÔÜ	ˆE�#��d˜:˜, a¨ yÐ
1Õ2r)   c                  óh  — t        j                  d¬«      } | j                  dd d¬«       | j                  dd d¬«       | j                  dd	d
¬«       | j                  dd	d¬«       | j                  dd	d¬«       | j                  dt        dd¬«       | j                  dt        dd¬«       | j                  dd d¬«       | j                  dd	d¬«       | j                  dt        dd¬«       | j                  ddg d¬ «       | j                  d!dg d"¬ «       | j	                  «       }t        t        i «      }|j                  xs g D ]  }t        ||d#«       Œ |j                  xs g D ]  }t        ||d$«       Œ |j                  s|j                  r|j                  s|j                  sy g }|j                  rK||j                  j                  d%«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}z  }|j                  r^t        j                  t!        |j                  «      j#                  d&¬'«      «      }||j%                  d(g «      D �cg c]  }|d)   ‘Œ	 c}z  }|st'        d*«      ‚t        t(        i «      }t        t*        d+z  d,z  i «      }	g }
t-        |d-«      D �]2  \  }}||v �rO||   j%                  d#«      sM|d.d/œ||   ¥}t/        d0|› d1t1        |«      › d2|› d3|j%                  d4d5«      › d6�	«       |
j3                  |«       Œmi |j%                  |i «      ¥||   ¥|d7d/œ¥}|j4                  s|j%                  d8«      �sa||   j%                  d9«      s’t7        |d#   d:«      D ]g  }|j%                  d;«      |d#   k(  sŒt        |j%                  d<«      xs d=«      |d9<   |j%                  d$«      xs |j%                  d>«      xs d5|d$<    n t9        j:                  t<        «       t?        |d#   «      }|jA                  |«       ||   j%                  d?«      xs tC        |j%                  d8d5«      «      |d?<   ||   jA                  d@D �ci c]  }||v r|||   “Œ c}«       tE        t        |«       |||<   tE        t(        |«       t9        j:                  t<        «       t/        d0|› d1t1        |«      › d2|› dA|d#   › dB|j%                  d?«      xs dC› dD|j%                  d8d5«      d dE › �«       �n||v rì|jF                  sà||   }|j4                  r‹|j%                  d#«      rz|j%                  d8«      si|jA                  t?        |d#   «      «       tC        |j%                  d8d5«      «      |d?<   |||<   tE        t(        |«       t9        j:                  t<        «       t/        d0|› d1t1        |«      › d2|› dA|j%                  d#«      › dF|j%                  dG«      › dH�«       �nt/        d0|› d1t1        |«      › d2|› dI�dJ¬K«       tI        |tK        |«      «      }|||<   tE        t(        |«       |j%                  d#«      xs dL}t/        dM|j%                  dNdO«      ›dA|› dP|j%                  dG«      › d2|j%                  d9d=«      d%›dQ�	«       |j%                  dG«      dRk7  r>|j%                  dSg «      d dT D ]&  }t/        dU|dV   › dF|d$   › dW|d9   d%›dX|dY   › �«       Œ( t9        j:                  t<        «       tM        |«      }||dZ<   |jN                  r©|j%                  d#«      r˜	 |jA                  tQ        |d#   |jR                  |jT                  |	«      «       i |j%                  |i «      ¥|¥||<   tE        t(        |«       t/        d[jW                  |d\   d]jY                  d^„ |d_   d d` D «       «      «      «       |
j3                  |«       �Œ5 |jZ                  �rOtc        «       }|	st'        df«      ‚g }|
D �]i  }|j%                  d#«      st/        dg|dZ   › dh�«       Œ(te        |dZ   |||	|jf                  |j%                  di«      xs |j%                  d_«      xs d «      }ti        |«       |j3                  |«       t/        dj|dZ   › �«       t/        dktk        |«      › �«       t/        dl|dm   › d1t1        |dn   «      › do�«       |dp   s.t/        dq|d#   d?   ›dr|d#   d?   › dstl        jn                  › �«       t1        |dt   D �cg c]  }|sŒ|‘Œ	 c}«      duk  r,t/        dvt1        |dt   D �cg c]  }|sŒ|‘Œ	 c}«      › dw�«       t9        j:                  t<        «       �Œl |rÄdxdyg}|D ]S  }|j3                  dzjW                  |d)   |d#   d)   |d$   d)   |d#   d?   |d$   d?   xs d{|d|   tk        |«      «      «       ŒU t!        tp        d}z  «      js                  djjY                  |«      djz   d&¬'«       t/        d~t1        |«      › dtp        › �«       t/        d€tp        d}z  › �«       y t/        «        t/        tu        |
«      «       |
D �cg c]  }|j%                  dG«      d�vsŒ|dZ   ‘Œ }}|r4t/        d‚t1        |«      › dƒd]jY                  |«      › �«       t/        d„«       |jv                  rJt!        |jv                  «      js                  tu        |
«      djz   d&¬'«       t/        d…|jv                  › �«       t/        d†t(        › �«       y c c}w c c}w c c}w # t&        $ r.}|jZ                  s‚ t/        da|› db�«       dc|_'        Y d }~�Œ”d }~wt\        $ r/}t/        ddt_        |«      j`                  › de|› �«       Y d }~�ŒÊd }~ww xY wc c}w c c}w c c}w )‡NzTags de Pixiv por personaje)Údescriptionz--keysu'   claves del catÃ¡logo separadas por coma)ra   Úhelpz--from-batchz5ruta a un plan.json: resuelve los personajes del lotez	--refreshÚ
store_trueu   ignora la cachÃ©)Úactionr‚  z--verifyz8re-consulta la ficha del tag (pixpedia) para confirmarloz--r18u3   aÃ±ade top tags R-18 (necesita PIXIV_REFRESH_TOKEN)z--pagesr¿   uC   pÃ¡ginas de 30 obras por personaje en --r18 (default 5 = 150 obras))r~   ra   r‚  z--topé   u   nÂº de tags R-18 a listarz--mdz'escribe el volcado markdown en esa rutaz--chainz8genera la cadena de 10 tags publicable de cada personajez--nsfw-nz6cuantos generales NSFW entran en la cadena (default 5)z--setrD   u7   fija el tag japonÃ©s a mano: "Clave=ã‚¿ã‚°" (repetible))r„  ra   r‚  z--set-enu7   fija el nombre inglÃ©s a mano: "Clave=Name" (repetible)r½   r«   r@   r   rY   ÚplanrW  z[!] pasa --keys o --from-batchr	   zpixiv_nsfw_pool.jsonrI   Úsin_tag)r:   r´   Ú[Ú/z] z -> sin tag en Pixiv (Únoter    Ú)rX  rœ   r­   r—   r“   r¬   r   r’   r¾   )rœ   r¾   r|  u    (manual) Â· zobra ?u    Â· éF   z (r´   u	   , cachÃ©)z ...T)Úflushrr  z    r�   Ú?z [z accesosr»   rµ   rt   z      ? r*   z) z score=r•   r:   z    R-18: {} obras | {}rò   ri  c              3   ó2   K  — | ]  \  }}|› d |› d�–— Œ y­w)Ú(r‹  Nr¯   )r°   r6   rV   s      r'   r²   zmain.<locals>.<genexpr>¢  s#   è ø€ ÐIÑ6H©d¨a°   1 Q C qœkÑ6Hùs   ‚ró   rž   z    [!] z! -> sigo sin co-ocurrencia medidaFu       [!] R-18 fallÃ³: z: zR[!] falta Archivos/pixiv_nsfw_pool.json (genera: python Engine/pixiv_nsfw_pool.py)z[--] z%: sin tag de personaje, no hay cadenarô   rt  z  z  co-ocurrencia medida: r^  r]  z
 generalesr_  z  [!] obra sin mapear: z -> anade 'z' a rð   é	   z  [!] solo z- tags resueltos (faltan generales o el libre)z-| Clave | Personaje | Obra | Obras | Cadena |z|---|---|---|---|---|z(| `{}` | {} / {} | {} / {} | {:,} | {} |u   Â¿?r`  z	_index.mdz
[OK] z cadenas -> z[OK] indice -> )r»   rX  r‡  z
[!] z sin resolver: u;       Corrige con: --set "Clave=ã‚¿ã‚°" --set-en "Clave=Name"z
[OK] markdown -> u   [OK] cachÃ©: )<ÚargparseÚArgumentParserÚadd_argumentrÀ   Ú
parse_argsrb   r}  rN   r  Úset_enÚkeysÚ
from_batchr1   r5   r[   r\   r   r]   rx   rù   ÚCACHErØ   rK  r}   rL   rD   ÚverifyrŽ   r€   r�   rÁ   r¤   Úupdater©   ro   ÚrefreshrÍ   rÛ   rÞ   r   r	  râ   rã   ru  r4   rg  r¡   r~   r   r7  rf  rT  rp  rj  r6  rF   rl  rl   rw  Úmd)r,  ÚargsrX  rx  r—  Úxr�   ÚitÚcacherÆ   rv  r„   r:   rS  r±   rÌ   Úkr*   Úrowr†   r9  Úchainsrg  r6   r�  r…   Úpends                              r'   Úmainr¦  4  sR  € Ü×ÑÐ,IÔJ€AØ‡N�N�8 TÐ0Y€NÔZØ‡N�N�>¨4ØOð ô Qà‡N�N�; |Ð:L€NÔMØ‡N�N�: lØRð ô Tà‡N�N�7 <ØMð ô Oà‡N�N�9¤3°Ø]ð ô _à‡N�N�7¤¨bÐ7R€NÔSØ‡N�N�6 4Ð.W€NÔXØ‡N�N�9 \ØRð ô Tà‡N�N�:¤C°ØPð ô Rà‡N�N�7 8°RØQð ô Sà‡N�N�: h¸ØQð ô Sà�<‰<‹>€Dä”v˜rÓ"€Fà—‘’˜B’ˆÜ�&˜$ Õ%ð à—‘Ò!˜rÒ!ˆÜ�&˜$ Õ%ð "à�Š�D—K’K¨$¯)ª)°t·²Øà€DØ‡y‚yØ D§I¡I§O¡O°CÔ$8ÓFÑ$8˜q¸A¿G¹G½I�—‘•Ð$8ÑFÑFˆØ‡‚Ü�j‰jœ˜dŸo™oÓ.×8Ñ8À'Ð8ÓJÓKˆØ c§g¡g¨f°bÔ&9Ó:Ñ&9 ��F“Ð&9Ñ:Ñ:ˆÙÜÐ9Ó:Ð:ä”e˜RÓ €EÜ”X 
Ñ*Ð-CÑCÀRÓH€DØ€DÜ˜D !×$‰ˆˆ3Ø�&Š=Ø˜#‘;—?‘? 4Ô(Ø #¨yÑH¸FÀ3¹KÐH�Ü˜˜!˜˜Aœc $›i˜[¨¨3¨%ð 0ØŸ)™) F¨BÓ/Ð0°ð3ô 4à—‘˜EÔ"ØØY�u—y‘y  bÓ)ÐY¨V°C©[ÐYÀÐPXÒYˆEØ�{Š{ %§)¡)¨JÕ"7ð ˜c‘{—‘ xÔ0Ü   t¡¨dÖ3˜ØŸ5™5 Ó,°°d±Ó;Ü.1°!·%±%¸Ó2GÒ2LÈ1Ó.M˜E (™OØ+0¯9©9°T«?ò ,MØ./¯e©eÐ4EÓ.Fò,MØJLð " $™Ká!ð 4ô —J‘JœuÔ%Ü  d¡Ó,�Ø—‘˜TÔ"Ø"(¨¡+§/¡/°(Ó";ò #.¼yØ—H‘H˜Z¨Ó,ó@.��h‘à�s‘×"Ñ"Ñ9Oó $3Ñ9O°AØ'(¨E¡zð %& u¨Q¡x¡KÐ9Oñ $3ô 4äœ& &Ô)Ø"��c‘
Üœ% Ô'Ü—
‘
œ5Ô!Ü�A�a�S˜œ#˜d›)˜ B s e¨4°°d±¨}ð =ØŸ™ 8Ó,Ò8°Ð9¸¸e¿i¹iÈ
ÐTVÓ>WÐX[ÐY[Ð>\Ð=]ð_ö `à�E‰\ $§,¢,Ø˜#‘JˆEØ�{Š{˜uŸy™y¨œ°u·y±yÀÔ7LØ—‘œX e¨D¡kÓ2Ô3Ü"+¨E¯I©I°jÀ"Ó,EÓ"F��h‘Ø"��c‘
Üœ% Ô'Ü—
‘
œ5Ô!Ü�A�a�S˜œ#˜d›)˜ B s e¨4°·	±	¸$³Ð/@ð AØ—i‘i Ó)Ð*¨)ð5ö 6ô �A�a�S˜œ#˜d›)˜ B s e¨4Ð0¸Õ=Ü ¤^°CÓ%8Ó9ˆEØˆE�#‰JÜ”e˜UÔ#Ø—)‘)˜D“/Ò* UˆCÜ�D˜Ÿ™ 7¨CÓ0Ð3°4¸°uð =Ø—i‘i Ó)Ð*¨"¨U¯Y©Y°xÀÓ-CÀAÐ,FÀhðPô Qà�y‰y˜Ó" dÒ*ØŸ™ 7¨BÓ/°°Ó3�AÜ˜H Q u¡X J¨b°°4±°	¸Ø˜x™[¨˜O¨7°1°W±:°,ð@õ Að 4ô �J‰J”uÔä�5‹kˆØˆˆE‰
Ø�8Š8˜Ÿ™ œðGØ—
‘
œ8 C¨¡I¨t¯z©z¸4¿8¹8ÀTÓJÔKØ: §	¡	¨#¨rÓ 2Ð:°cÐ:��c‘
Üœ% Ô'ÜÐ/×6Ñ6Ø˜Ñ$Ø—I‘IÑI°c¸)±nÀRÀaÑ6HÓIÓIóKô Lð 	�‰�CÖðS %ðV ‡zƒzÜ‹}ˆÙÜð Jó Kð KàˆÜˆCØ—7‘7˜4”=Ü˜˜c %™j˜\Ð)NÐOÔPØÜ  E¡
¨C°°t¸T¿[¹[Ø #§¡¨
Ó 3Ò Q°s·w±w¸yÓ7IÒ QÈTóSˆEä�uÔØ�M‰M˜%Ô Ü�B�s˜5‘z�lÐ#Ô$Ü�B”z %Ó(Ð)Ð*Ô+ÜÐ,¨U°?Ñ-CÐ,DÀAÜ˜˜v™Ó'Ð(¨
ð4ô 5à˜Ò%ÜÐ/°°d±¸HÑ0EÐ/Hð I#Ø#(¨¡;¨xÑ#8Ð"9¸¼j¿o¹oÐ=NðPô Qä˜u Vš}Ó2™}˜!²’A˜}Ñ2Ó3°aÒ7Ü˜¤C°E¸&²MÓ(G±M¨qÂQª°MÑ(GÓ$HÐ#Ið J@ð Aô Bä�J‰J”uÖð% ñ& ØAÐCZÐ[ˆBÛ�Ø—	‘	ÐD×KÑKØ�f‘I˜q ™w v™°°$±¸±Ø�d‘G˜HÑ% q¨¡w¨xÑ'8Ò'A¸EØ�mÑ$¤j°£mó5õ 6ð ô
 ”˜+Ñ%Ó&×1Ñ1°$·)±)¸B³-À$Ñ2FØ;Bð 2ô Dä�GœC ›K˜=¨´V°HÐ=Ô>Ü�O¤F¨[Ñ$8Ð#9Ð:Ô;Øä	„GÜ	Œ+�dÓ
ÔÙ"ÓY™d˜ a§e¡e¨H£oÐ=XÒ&XˆAˆe‹H˜d€DÐYÙÜ�”s˜4“y�k °·±¸4³Ð0AÐBÔCÜÐKÔLØ‡w‚wÜˆT�W‰W‹× Ñ ¤¨TÓ!2°TÑ!9ÀGÐ ÔLÜÐ# D§G¡G 9Ð-Ô.Ü	ˆMœ%˜Ð
!Õ"ùòI Gùò ;ùò>$3øôT ò !Ø—z’zØÜ˜  Ð#DÐEÔFØ �—’ûÜò GÜÐ-¬d°1«g×.>Ñ.>Ð-?¸rÀ!ÀÐE×FÒFûðGüò2 3ùÚ(Gùò$ Zsa   Çl&Ç/l&Él+Ñ%l0
Ü<Bl5än%
ä&n%
ån*ån*é%n/é>n/ì5	n"ì>#m'í'n"í3$nîn"Ú__main__)rJ   )r    )r«   r5  )r¿   N)JÚ__doc__r’  r[   r$   rÕ   r€   r!   Úurllib.parser0  Úpathlibr   rz   ÚstdoutÚreconfigureÚ__file__Úresolverj   rØ   Údotenvr   r¡   r™  r}  r6  rl  rÁ   ÚUAÚSessionrw   Úheadersr›  rÅ   ÚcompileÚIr2   r×   r(   r9   r<   rB   rÀ   ÚlistrG   rW   rb   ro   rˆ   rŽ   rÞ   r•   r£   r¤   r©   rÍ   r¢   rÏ   rÔ   rÛ   rá   r	  ÚCHAIN_NOISEr3  r7  r?  ÚtuplerR  rf  rj  rn  rp  rw  r  r¦  r   r¯   r)   r'   Ú<module>r¸     sÅ  ðñó. Û Û 	Û 
Û Û Û Ý ã à ‡
�
× Ñ  Ð0BÐ Ô Cá�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€ð	Ý"Ù�˜6Ñ!Ô"ð 	�:ÑÐ 1Ñ1€Ø	�JÑ	Ð!9Ñ	9€Ø˜
Ñ"Ð%8Ñ8€
Ø	�JÑ	 Ñ	-€Ø€ð7€ð €h×ÑÓ€Ø ‡�× Ñ ØØ'Ø ñô ò€ð
 	ˆ�
‰
ðKð ‡D�Dó		
€ðˆsð �só ð"�Cð "˜Có "ð-�3ð -˜3ó -ð ˆR�Z‰ZðKð ‡D�Dó	
€
ñ�Sð  ð ¨Tó ñ$˜ð  3ð °ó ò>òVó
ñ+�ð +˜Cð +¨4ó +ð�ð ˜Sð  Só ð" ˆB�J‰JÐ9Ó:€	ð�#ð ˜$ó ð0˜ð  ó ñ7�Sð 7 ð 7¨Tó 7ðtH�ð H˜ó Hð €ð˜ð  ó ó&&ñ+#�#ð +#˜cð +#¨ð +#°4¸$±;ð +#È$ó +#òn€ð�#ð ˜$ó ð*%�Tó %ð�cð  ó ñ +;�3ð +;˜dð +; sð +;¸eó +;ð^ '+ñ�Sð  ð ¨Tð ¸ð ØðØ/3óðBG�dð G˜só Gð
#�Cð #˜Dó #ð�dð ˜tó ð
˜ó 
ð3˜Cð 3¨Sð 3°Tó 3òg#ðT ˆzÒÙ…Fð øði ò 	Úð	ús   Á1H( È(H1È0H1