Ë
    bÉjå<  ã                   ó  — 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	m
Z
  e
e«      j                  «       j                  j                  Zej                  j!                  d e e
e«      j                  «       j                  «      «       ddlmZ edz  dz  dz  Zedz  dz  d	z  Zedz  d
z  dz  Zedz  dz  ZdZd„ Zedz  dz  Zedz  dz  Zej                  j!                  d e e
e«      j                  «       j                  «      «       ddlmZ eeedz  edz  edz  edz  edz  edz  edz  edz  edz  edz  dœZdZg d¢Z dZ!d)d„Z"efd„Z#d„ Z$d„ Z%d „ Z&d!Z'd"Z(d#Z)d$Z*d*d%„Z+	 	 d+d&„Z,d'„ Z-e.d(k(  r e-«        yy),aû  
Test de BLOQUES: mette un bloque curado de wd14_blocks.py tras un personaje
del catalogo y comprueba si Stable Diffusion respeta la pose.

La diferencia con test_harvest_tags.py: aqui NO se recombinan pose/outfit/scene
por separado. Se coge el bloque entero tal cual (una linea de bloques.txt) y se
pega DETRAS de la linea del personaje. Asi se mide lo que el bloque pide, no lo
que nosotros reconstruimos.

    # 1. Ver los prompts sin gastar GPU
    python Engine/test_blocks.py --dry-run

    # 2. Un bloque concreto, 2 variaciones
    python Engine/test_blocks.py --char Seed --block 0 --variations 2

    # 3. Barrido: 6 bloques sobre varios personajes
    python Engine/test_blocks.py --n 6

    # 4. A/B focalizado de ropa: mismo indice en ambos pools
    python Engine/test_blocks.py --block 5 --pool desnudo
    python Engine/test_blocks.py --block 5 --pool vestido

Salida en Output/test_blocks/ + manifest_*.json con el prompt exacto de cada
imagen, y una copia del .txt original para comparar lado a lado.
é    N)Údatetime)ÚPath)ÚPromptBuilderÚArchivosÚwildcards_harvestzbloques.txtzbloques_vestidos.txtÚwd14ÚtagsÚOutputÚtest_blockszhttp://127.0.0.1:7860c                 ó   — t         | z  S ©N)ÚOUT_ROOT)Úpools    úEngine/test_blocks.pyÚout_dirr   0   s   € Ü�d‰?Ðó    Úwildcards_danbooru)Ústrip_weights_ofzbloques_sfw.txtzbloques_spicy.txtzbloques_explicit.txtzbloques_sfw_vestidos.txtzbloques_spicy_vestidos.txtzbloques_explicit_vestidos.txt)ÚdesnudoÚvestidoÚsfwÚspicyÚexplicitÚsfw_vestidoÚspicy_vestidoÚexplicit_vestidoÚdan_sfwÚ	dan_spicyÚdan_explicitÚ	dan_todoszã1boy, (faceless male:1.4), no face, blank face, featureless face, no facial features, eyes closed, black hair, short hair, muscular body, broad shoulders, large hands, masculine physique, nude male, larger male, taller dominant)Ú,Hoseki_ZenlessZoneZero_Seed_IllustriousXL_v1Ú
ArlecchinoÚYelanÚremÚReZero_Rem_IlluXLznilou-illu-nvwls-v1ÚFurinaz,ai-hoshino-s1-illustriousxl-lora-nochekaiserÚRaiden_shogunÚhu_tao_genshin_impactÚSkirkÚkugisaki_nobaraÚsanaeÚFischlÚsakamata_chloeÚfirefly_honkai_star_railÚ	robin_hsrÚgold_ship_illust_scarxzyszM(full body:1.2), wide shot, whole body visible, both characters fully visiblec                 ó\  — t         j                  | t        «      }|j                  «       st	        d|› d�«      ‚g }|j                  d¬«      j                  «       D ]8  }|j                  «       }|sŒ|j                  d«      rŒ(|j                  |«       Œ: |st	        dt        › d�«      ‚|S )Nz[!] No existe z. Ejecuta antes wd14_blocks.pyúutf-8©ÚencodingÚ#ú[!] z no tiene bloques)
ÚPOOLSÚgetÚBLOCKSÚexistsÚ
SystemExitÚ	read_textÚ
splitlinesÚstripÚ
startswithÚappend)r   ÚpathÚoutÚlines       r   Úload_blocksrD   e   s—   € Ü�9‰9�Tœ6Ó"€DØ�;‰;Œ=Ü˜>¨$¨Ð/MÐNÓOÐOØ
€CØ—‘¨�Ó0×;Ñ;Ö=ˆØ�z‰z‹|ˆÚ˜Ÿ™¨Õ,Ø�J‰J�tÕð >ñ Ü˜4¤˜xÐ'8Ð9Ó:Ð:Ø€Jr   c                 ó^  — ddl m}m}  |«       \  }}}t        | «      }t	        |j                  d«      «      D ]è  }|j                  d¬«      j                  d«      D �	cg c]#  }	|	j                  «       sŒ|	j                  «       ‘Œ% }
}	 ||
D �	cg c]0  }	|j                  |	j                  «       |	j                  «       «      ‘Œ2 c}	||«      \  }}t        «       g }}|D ])  }	|	|vsŒ|j                  |	«       |j                  |	«       Œ+ dj                  |«      |k(  sŒæ|c S  yc c}	w c c}	w )	zÎLocaliza el .txt de Archivos/wd14/tags del que salio este bloque.

    Compara SIN pesos: bloques.txt lleva '(ass_focus:0.7)' pero el .txt original
    no, asi que hay que normalizar antes de comparar.
    r   )Úload_character_tagsÚclean_blockz*.txtr2   r3   Ú,ú, N)Úwd14_blocksrF   rG   Ústrip_weightsÚsortedÚrglobr<   Úsplitr>   r8   ÚlowerÚsetÚaddr@   Újoin)ÚblockÚtags_dirrF   rG   ÚcharsÚcopiesÚaliasÚwantÚfÚtÚrawÚkeepÚ_ÚseenÚuniqs                  r   Úfind_originalr`   s   s  € ÷ =Ù.Ó0Ñ€Eˆ6�5Ü˜Ó€DÜ�H—N‘N 7Ó+Ö,ˆØ"#§+¡+°w +Ó"?×"EÑ"EÀcÔ"JÓXÑ"J˜QÈaÏgÉgÍiˆq�w‰w�yÐ"JˆÐXÙÉÓLÉÀ1˜uŸy™y¨¯©«°A·G±G³IÕ>ÈÑLÈeÐU[Ó\‰ˆˆaÜ“U˜BˆdˆÛˆAØ˜Š}Ø—‘˜”Ø—‘˜A•ð ð �9‰9�T‹?˜dÓ"ØŠHð -ð ùò YùÚLs   ÁD%Á5D%Â5D*
c                 ó0   — t        j                  dd| «      S )zH'(ass_focus:0.7), nude' -> 'ass_focus, nude'. Para comparar con el .txt.z\(([^:()]+):[\d.]+\)z\1)ÚreÚsub)rS   s    r   rK   rK   ‰   s   € ä�6‰6Ð)¨5°%Ó8Ð8r   c                 ó   — t        d«      }|j                  «       sy |j                  d«      D �ch c]  }|j                  j	                  «       ’Œ }}| j	                  «       |v ry| j                  dd«      d   j	                  «       |v S c c}w )Nz?D:\Data\Packages\Stable Diffusion WebUI Forge - Neo\models\Loraz*.safetensorsTÚ-é   r   )r   r:   rM   ÚstemrO   Úrsplit)ÚnameÚdÚpÚstemss       r   Úlora_on_diskrm   Ž   s|   € ÜÐOÓP€AØ�8‰8Œ:ØØ%&§W¡W¨_Ô%=Ó>Ñ%= ˆQ�V‰V�\‰\�^Ð%=€EÐ>Ø‡z�zƒ|�uÑØØ�;‰;�s˜AÓ˜qÑ!×'Ñ'Ó)¨UÐ2Ð2ùò ?s   °!Bc                 óV   ‡— ddl mŠ t        ˆfd„| j                  d«      D «       «      S )zFTrue si el bloque trae alguna prenda (mismo criterio que wd14_blocks).r   )ÚDROP_OUTFITc              3   ó\   •K  — | ]#  }‰j                  |j                  «       «      –— Œ% y ­wr   )ÚsearchrO   )Ú.0rZ   ro   s     €r   Ú	<genexpr>z%block_has_clothing.<locals>.<genexpr>›   s%   øè ø€ ÐGÑ6F°ˆ{×!Ñ! !§'¡'£)×,Ñ6Fùs   ƒ),rH   )rJ   ro   ÚanyrN   )rS   ro   s    @r   Úblock_has_clothingru   ˜   s    ø€ å'ÜÓG°e·k±kÀ#Ô6FÓGÓGÐGr   zF1boy, (faceless male:1.4), muscular body, broad shoulders, taller malez1boy, muscular body)Ú1girlÚ1boyznude, completely_nude, nakedc                 ó   — t        |«      }d|j                  d«      D �ch c]   }|j                  «       j                  «       ’Œ" c}v }d|v xs d|v }|rKt	        j
                  dd| «      } t	        j
                  dd| «      j                  «       j                  d«      } d|g}	|r|	j                  d	«       |d
k(  s|dk(  r t        |«      s|	j                  t        «       | dj                  |	«      g}
|r|
j                  |rt        nt        «       |
j                  |«       t        «       }g }|
D ]§  }|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}g }|D ]A  }|j                  «       }|t        v r||v rŒ |j                  |«       |j                  |«       ŒC |j                  dj                  |«      «       Œ© dj                  d„ |D «       «      |fS c c}w c c}w )z-> (prompt_con_BREAK, [tramos])ÚpovrH   rw   Úheteroz\bsolo\bÚ z,\s*,rv   zage up, mature femaleÚalwaysÚautorI   z

BREAK
c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­wr   )r>   )rr   Úxs     r   rs   z"assemble_prompt.<locals>.<genexpr>×   s   è ø€ Ð:© A°·±µ	œa©ùs   ‚˜)r   rN   r>   rO   rb   rc   r@   ru   Ú	NUDE_TAGSrR   ÚMALE_POVÚ	MALE_FULLrP   Ú
COUNT_TAGSrQ   )ÚmasterÚ	char_linerS   Ú
force_nudeÚage_upÚblock_cleanrZ   Úis_povÚ
two_peopleÚgirlÚsegsr^   rB   ÚsÚtoksÚkeptÚkeys                    r   Úassemble_promptr‘   «   sÈ  € ä" 5Ó)€KØ°+×2CÑ2CÀCÔ2HÓIÑ2H¨Q�q—w‘w“y—‘Õ(Ð2HÑIÐI€FØ˜KÐ'ÒB¨8°{Ð+B€Jñ Ü—‘˜ R¨Ó0ˆÜ—‘˜ # vÓ.×4Ñ4Ó6×<Ñ<¸SÓAˆð �YÐ€DÙØ�‰Ð+Ô,Ø�XÒ *°Ò"6Ü*<¸UÔ*CØ�‰”IÔà�D—I‘I˜d“OÐ$€Dñ Ø�‰¡•H¬IÔ6ð 	‡K�K�Ôô ‹5€DØ
€CÛˆØ#$§7¡7¨3¤<Ó=¡<˜a°1·7±7µ9�—‘•	 <ˆÐ=ØˆÛˆAØ—'‘'“)ˆCØ”jÑ Ø˜$‘;ØØ—‘˜”Ø�K‰K˜�Nð ð 	�
‰
�4—9‘9˜T“?Õ#ð ð ×ÑÑ:©Ó:Ó:¸CÐ?Ð?ùòS Jùò> >s    %G6ÅG;ÅG;c                 ó,   — t        | ||||¬«      \  }}|S )zŽCompatibilidad: usa el ensamblador nuevo. cam_brake ya no se aplica (los
    tags de cuerpo completo se descartaron por decision del usuario).)r†   r‡   )r‘   )r„   r…   rS   Ú	cam_braker‡   r†   Úposr]   s           r   Úbuild_promptr•   Ú   s#   € ô ˜V Y°Ø(2¸6ôC�F€Cˆà€Jr   c                  ó¨  — t        j                  d¬«      } | j                  dt        d d¬«       | j                  dd¬«       | j                  d	t        d
d¬«       | j                  ddd¬«       | j                  dt        dd¬«       | j                  dt        dd d¬«       | j                  dt        dd¬«       | j                  dt	        t
        «      dd¬«       | j                  dt        d¬ «       | j                  d!t        d ¬ «       | j                  d"dd#¬«       | j                  d$dd%¬«       | j                  d&g d'¢d(d)¬«       | j                  d*d¬+«       | j                  «       }t        |j                  «      }t        t        t        «      «      }dd l}	 |j                  t        › d,�d-¬.«      }|j!                  «       j                  d/d0«      }t#        d1|› �«       t&        D �cg c]$  }|j)                  |«      sŒt+        |«      d4u sŒ#|‘Œ& }	}|	s%t&        D �cg c]  }|j)                  |«      sŒ|‘Œ }	}t#        d5t-        |«      › d6|j                  › d7t-        |	«      › �«       t&        D ]0  }|j)                  |«      sŒt+        |«      d4usŒ#t#        d8|› �«       Œ2 |j.                  rvt1        t-        |«      «      D �
cg c]  }
|
|j2                  k\  sŒ|
‘Œ }}
|j4                  r|D �
cg c]  }
|
|j4                  v sŒ|
‘Œ }}
t#        d9t-        |«      › d:|› �«       n¾|j6                  �md|j6                  cxk  rt-        |«      k  s*n t9        d;|j6                  › d<t-        |«      dz
  › d=�«      ‚|j6                  gt;        |j<                  d«      z  }nEt?        j@                  t1        t-        |«      «      tC        |jD                  t-        |«      «      «      }|jF                  r|jF                  gt-        |«      z  n"|D �cg c]  }t?        jH                  |	«      ‘Œ c}}tK        |j                  «      }|jM                  d4d4¬>«       tO        jP                  «       jS                  d?«      }g }g }tU        ||«      D ]3  \  }}t1        |j<                  «      D ]  }|jW                  |||f«       Œ Œ5 tY        |d«      D �]¯  \  }
\  }}}|j)                  |«      }|st#        d@|› dA�«       Œ.|dB   }|jZ                  �%t]        j^                  dCdD|jZ                  › dE�|«      }||   }ta        |jb                  |||jd                   |jf                  |jh                  ¬F«      }|jj                  }|j                  }||jd                  rdGndHz  }|
dI›dJ|dI›dK|d dL › dK|› dM|dz   › dN�
}tm        |«      }|jW                  ||||j                  ||rt        |«      nd |dOœ«       t#        dP|
› dQt-        |«      › dR|› �«       t#        dS|d dT › dU�«       t#        dV|› �«       |jZ                  rt#        dW|jZ                  › �«       |rt#        dX|jn                  › dY�«       |jp                  rt#        dZ|d d[ › dU�«       �Œ¾||d\d]d^d_d`dd|jr                  dadbœ}	 tu        jt                  «       }|jw                  t        › dc�|dd¬e«      }|jy                  «        |j!                  «       } ||z  j{                  t}        j~                  | df   d   «      «       	 t!        j€                  | j                  dgdh«      «      j                  did0«      }!t#        djtu        jt                  «       |z
  dk›dl|!› �«       �Œ² |dn|› do�z  jƒ                  t!        j„                  |dpd¬q«      dr¬s«       t#        dtt-        |«      › du|› �«       t#        dv|› dw�«       y # t$        $ r}t#        d2|› d3�«       Y d }~�Œd }~ww xY wc c}w c c}w c c}
w c c}
w c c}w # t$        $ r d0}!Y ŒÐw xY w# t$        $ r}t#        dm|› �«       Y d }~�Œzd }~ww xY w)xNz%Test de bloques WD14 sobre personajes)Údescriptionz--blockzindice de bloque (0-based))ÚtypeÚdefaultÚhelpz--charz,personaje concreto (si no, se elige al azar))rš   z--né   z cuantos bloques probar (al azar)z--allÚ
store_truezOrecorre TODOS los bloques del pool en orden 0..N-1, para auditarlos uno por uno)Úactionrš   z--skipr   z2con --all, empieza por este indice (para reanudar)z--onlyr@   zHcon --all, procesa solo estos indices (repetible). Ej: --only 3 --only 7)r˜   r�   r™   rš   z--variationsrf   zseeds por bloquez--poolr   zzdesnudo = bloques.txt (sin ropa) | vestido = bloques_vestidos.txt (ropa del WD14 sin color). Ambos pools comparten indice.)Úchoicesr™   rš   z--seedéÿÿÿÿ)r˜   r™   z--lora-weightz--no-cam-brakez4quita el freno de camara (A/B: ver si deforma menos)z--age-upus   aÃ±ade 'age up, mature female'. FUERA por defecto: fuerza rasgos maduros que chocan con personajes de busto pequenoz--force-nude)r}   r|   Úneverr}   zˆauto (defecto) = fuerza nude solo si el bloque no trae ropa (para LoRA con ropa horneada, p.ej. Yelan). always = siempre. never = nunca.z	--dry-run)r�   z/sdapi/v1/optionsé   )ÚtimeoutÚsd_model_checkpointÚ?z[-] Forge OK | checkpoint: z[!] Forge NO responde (z). Arranca webui-user.bat --apiTz[-] z bloques (pool: z) | personajes usables: z    AVISO sin LoRA en disco -> z[-] modo --all: z bloques -> z[!] bloque z fuera de rango (0-Ú))ÚparentsÚexist_okz%Y%m%d_%H%M%Sr6   z$ no esta en personajes.txt, saltandoÚbasez(<lora:[^:>]+):[^>]*>z\g<1>:Ú>)r“   r‡   r†   Ú_sincamr{   Ú02dÚ_br]   é   Ú_vz.png)ÚfileÚ	block_idxÚcharr   rS   Úoriginal_txtÚpromptz
[Ú/z] z    bloque  : éd   z...z    char    : z    lora w  : z    original: z  <- comparar con estez    prompt  : é–   i@  iÀ  é   g      @zDPM++ 2M Karrasé   )r³   Únegative_promptÚwidthÚheightÚstepsÚ	cfg_scaleÚsampler_nameÚ
batch_sizeÚn_iterÚseedÚ	clip_skipz/sdapi/v1/txt2imgi,  )Újsonr¢   ÚimagesÚinfoz{}rÁ   z	    [OK] z.0fzs seed=z    [FAIL] Ú	manifest_z.jsonF)Úensure_asciiÚindentr2   r3   z
[OK] z en z[OK] manifest_z..json (bloque + prompt exacto + .txt original))CÚargparseÚArgumentParserÚadd_argumentÚintÚlistr7   ÚfloatÚ
parse_argsrD   r   r   ÚstrÚBASE_DIRÚrequestsr8   ÚFORGErÃ   ÚprintÚ	ExceptionÚCHARSÚget_characterrm   ÚlenÚallÚrangeÚskipÚonlyrS   r;   ÚmaxÚ
variationsÚrandomÚsampleÚminÚnr±   Úchoicer   Úmkdirr   ÚnowÚstrftimeÚzipr@   Ú	enumerateÚlora_weightrb   rc   r•   Úmaster_promptÚno_cam_braker‡   r†   r¹   r`   ri   Údry_runrÁ   ÚtimeÚpostÚraise_for_statusÚwrite_bytesÚbase64Ú	b64decodeÚloadsÚ
write_textÚdumps)"rk   ÚargsÚblocksÚBrÒ   ÚrÚckptÚeÚcÚusableÚiÚidxsr]   rU   ÚOUTÚstampÚmanifestÚjobsÚbiÚckÚvr±   r…   rS   r”   ÚnegÚtagri   ÚsrcÚpayloadÚt0ÚrespÚdataÚsds"                                     r   Úmainr  ã   sß  € Ü×ÑÐ,SÔT€AØ‡N�N�9¤3°Ð;W€NÔXØ‡N�N�8Ð"P€NÔQØ‡N�N�5œs¨AÐ4V€NÔWØ‡N�N�7 <ð6ð ô 7ð ‡N�N�8¤#¨qØLð ô Nà‡N�N�8¤#¨hÀð0ð ô 1ð ‡N�N�>¬°QÐ=O€NÔPØ‡N�N�8¤T¬%£[¸)ðSð ô Tð ‡N�N�8¤#¨r€NÔ2Ø‡N�N�?¬¸€NÔ=Ø‡N�NÐ#¨LØNð ô Pà‡N�N�: lðTð ô Uð ‡N�N�>Ò+FÐPVð;ð ô <ð ‡N�N�; |€NÔ4Ø�<‰<‹>€Dä˜Ÿ™Ó#€FÜ”cœ(“mÓ$€AãðLØ�L‰LœE˜7Ð"3Ð4¸bˆLÓAˆØ�v‰v‹x�|‰|Ð1°3Ó7ˆÜÐ+¨D¨6Ð2Ô3õ ÓQ™�A !§/¡/°!Õ"4¼Àa»ÈDÒ9PŠa˜€FÐQÙÝ"Ó9™U˜ a§o¡o°aÕ&8’!˜UˆÐ9Ü	ˆD”�V“�Ð-¨d¯i©i¨[Ð8PÔQTÐU[ÓQ\ÐP]Ð
^Ô_ßˆØ�?‰?˜1Õ¤,¨q£/¸Ò"=ÜÐ3°A°3Ð7Õ8ð ð
 ‡x‚xô !¤ V£Ô-Ó@Ñ-�a°°d·i±i³’Ð-ˆÐ@Ø�9Š9Ù#Ó6™t˜! q¨D¯I©I¢~’A˜tˆDÐ6ÜÐ ¤ T£ ¨<¸°vÐ>Õ?Ø	�‰Ð	Ø�D—J‘JÔ,¤ V£Ô,Ü˜{¨4¯:©:¨,Ð6IÌ#ÈfË+ÐVWÉ-ÈÐXYÐZÓ[Ð[Ø—
‘
ˆ|œc $§/¡/°1Ó5Ñ5‰ä�}‰}œU¤3 v£;Ó/´°T·V±V¼SÀ»[Ó1IÓJˆà'+§y¢yˆT�Y‰YˆKœ#˜d›)Ò#Ù(,Ó-© 1Œ�‰�vÕ	¨Ñ-ð 
ô �$—)‘)Ó
€CØ‡I�I�d T€IÔ*Ü�L‰L‹N×#Ñ# OÓ4€EØ€HØ€DÜ�d˜EÖ"‰ˆˆBÜ�t—‘Ö'ˆAØ�K‰K˜˜R ˜Õ$ñ (ð #ô $ D¨!×,‰ˆ‰;ˆB��AØ�‰˜rÓ"ˆÙÜ�D˜˜Ð@ÐAÔBØØ˜‘Lˆ	Ø×ÑÐ'ÜŸ™Ð7Ø"(¨×)9Ñ)9Ð(:¸!Ð<¸ióIˆIà�r‘
ˆÜ˜1Ÿ?™?¨I°uØ)-×):Ñ):Ð%:Ø"&§+¡+Ø&*§o¡oô7ˆð ×ÑˆØ�i‰iˆØ˜D×-Ò-‰y°2Ñ5ˆØ�C�˜˜2˜c˜( ! B s¨ G 9¨A¨c¨U°"°Q°q±S°E¸Ð>ˆÜ˜EÓ"ˆà�‰Ø r°2¸t¿y¹yØ¹¬C°¬HÀØñ
ô 	ô
 	��A�3�aœ˜D›	�{ " T FÐ+Ô,Ü�˜u T c˜{˜m¨3Ð/Ô0Ü�˜r˜dÐ#Ô$Ø×ÒÜ�N 4×#3Ñ#3Ð"4Ð5Ô6ÙÜ�N 3§8¡8 *Ð,BÐCÔDà�<Š<Ü�N 3 t¨ 9 +¨SÐ1Ô2Ùð ¨cØ D°2ÀCØ-¸QÈ!Ø—I‘I¨Añ	
ˆð	%Ü—‘“ˆBØ—=‘=¤E 7Ð*;Ð!<À7ÐTW�=ÓXˆDØ×!Ñ!Ô#Ø—9‘9“;ˆDØ�4‰Z×$Ñ$¤V×%5Ñ%5°d¸8±nÀQÑ6GÓ%HÔIðÜ—Z‘Z §¡¨°Ó 6Ó7×;Ñ;¸FÀCÓH�ô �IœdŸi™i›k¨"™n¨SÐ1°¸¸Ð=Ö>ðk -ðr 	ˆY�u�g˜UÐ#Ñ#×/Ñ/Ü�
‰
�8¨%¸Ô:ÀWð 0ô Nä	ˆG”C˜“M�? $ s eÐ
,Ô-Ü	ˆN˜5˜'Ð!OÐ
PÕQøôE ò LÜÐ'¨ sÐ*IÐJ×KÒKûðLüò Rùâ9ùò Aùâ6ùò 	.øô| ò Ø’ðûô ò 	%Ü�K ˜sÐ#×$Ò$ûð	%ús’   Æ"A_ Ç2`È	`È`È'`
È>`
Ë`Ë$`Ë:`Ì`Ð`Ú)A<`/Ü&5`Ý'`/ß	`ß(_=ß=`à`,à)`/à+`,à,`/à/	aà8aáaÚ__main__)r   )r}   F)TFr}   )/Ú__doc__rÉ   rñ   rÃ   rß   rb   Úsysrí   r   Úpathlibr   Ú__file__ÚresolveÚparentrÑ   rA   ÚinsertrÐ   Úprompt_builderr   r9   ÚBLOCKS_DRESSEDÚTAGS_DIRr   rÓ   r   ÚHARVESTÚHARVEST_DANrJ   r   r7   Ú	MALE_TAGSrÖ   ÚCAMERA_BRAKErD   r`   rK   rm   ru   r‚   r�   rƒ   r€   r‘   r•   r  Ú__name__© r   r   Ú<module>r!     s  ðñó2 Û Û Û Û 	Û 
Û Ý Ý á�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×6Ñ6Ó7Ô 8Ý (à	�JÑ	Ð!4Ñ	4°}Ñ	D€Ø˜JÑ&Ð)<Ñ<Ð?UÑU€Ø�jÑ  6Ñ)¨FÑ2€Ø�hÑ Ñ.€Ø€òð �ZÑ
Ð"5Ñ
5€Ø˜Ñ#Ð&:Ñ:€Ø ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×6Ñ6Ó7Ô 8Ý (ð ØØÐ&Ñ&ØÐ*Ñ*ØÐ0Ñ0ØÐ3Ñ3Ø&Ð)EÑEØ")Ð,KÑ"Kà$Ð'8Ñ8Ø&Ð)<Ñ<Ø)Ð,BÑBØ&¨Ñ6ñ	€ð&.ð 
ò	€ð _€óð #+ó ò,9ò
3òHð U€	Ø €Ø€
Ø*€	ó,@ð^ CHØ"óòIRðX ˆzÒÙ…Fð r   