ó
    Æ1jJ,  ã                   ó¾  • S r SrSrSrSrSrSrSrSrSS/r	S	r
S
rSrS
rSS.S jrSSSS.S jrSBS jrSBS jrSBS jrSSSSSS.S jrSCS jr\S:X  Ga2  SSKr\R.                  R1                  \R.                  R3                  \R.                  R5                  \5      SS5      5      r\R:                  " \SS9  \" SSSS ./S!.S"SSS .S#SS ./S!./5      r\" \R.                  R3                  \S$5      S%S&S'9 r \ RC                  \5        SSS5        \"" S(5        \" S)S*SS ./S!.S+S*SS ./S,-  S!./5      r#\" \R.                  R3                  \S-5      S%S&S'9 r \ RC                  \#5        SSS5        \"" S.5        \" S/S0SS ./S!.S1S0SS .S2SS ./S!./5      r$\" \R.                  R3                  \S35      S%S&S'9 r \ RC                  \$5        SSS5        \"" S45        \" S5S6SS7.S8S2S9S:S;./S<SS=9r%\" \R.                  R3                  \S>5      S%S&S'9 r \ RC                  \%5        SSS5        \"" S?5        \" S5S6SS7.S8S2S9S:S;./S<S,S=9r&\" \R.                  R3                  \S@5      S%S&S'9 r \ RC                  \&5        SSS5        \"" SA5        gg! , (       d  f       GN†= f! , (       d  f       GN9= f! , (       d  f       Nê= f! , (       d  f       N¤= f! , (       d  f       N^= f)Duw  Singapore Math "model method" bar-model SVG generator.

Four model types, all in AGS brand style (CSS vars, dusty-rose border).
The public functions return a self-contained SVG string; the matching
`_*_content` helpers return just the inner XML + bounding box so that
`solution_block.py` can stack several models inside one outer frame.

Types:
  1. part_whole(entities)       â€” one entity's bar split into labelled parts
  2. comparison(entities)       â€” multiple bars drawn to relative scale
  3. multiplication(entities)   â€” bar split into N equal repeated units
  4. unitary(entities, total,   â€” N equal blank unit-boxes + optional
              unit_value)          known "extra" block + optional total bracket

Entity shape for types 1/2/3:
  {"label": "Sarah",
   "parts": [
     {"value": 8,  "known": True},
     {"value": 10, "known": True, "label": "?"}   # optional override
   ]}

Entity shape for type 4:
  {"label": "Yellow puppets",
   "units": 5,           # number of blank unit-boxes
   "extra": 1,           # number of extra "known" blocks
   "extra_value": 7}     # value shown inside the extra block (per extra)
zƒ<style>svg{--crimson:#960000;--gold:#BF9237;--lime:#88C808;--steel:#4A6488;--cream:#FAF5EE;--ink:#2A2A2A;--border:#D0ACAC;}</style>é(   é   éŒ   é   é   )zvar(--crimson)úvar(--cream))zvar(--gold)ú
var(--ink)zvar(--border)r   r   T)Úborderc          	      óè   • SUS SUS SUS SUS S3	[         /nU(       a   UR                  SUS-
  S SUS-
  S S	35        UR                  U 5        UR                  S
5        SR                  U5      $ )Nz/<svg xmlns="http://www.w3.org/2000/svg" width="z.0fú
" height="z" viewBox="0 0 Ú z">z<rect x="3" y="3" width="é   z?" rx="10" fill="none" stroke="var(--border)" stroke-width="3"/>z</svg>Ú
)ÚSTYLEÚappendÚjoin)ÚinnerÚwÚhr	   Úpartss        Ú:C:\allgifted\mathapi11v2\tools\svg_generators\bar_model.pyÚ_svgr   5   s™   € à
9¸!¸C¸ð AØ�S�'˜¨¨3¨¨q°°3°°rð	;äð€Eö
 Ø�‰Ø'¨¨!©¨C y°
¸1¸Q¹3¸s¸)ð DLð Mô	
ð 
‡L�L�ÔØ	‡L�L�ÔØ�9‰9�UÓÐó    é\  é    )Útarget_widthÚx0Úy0c                ó4  • U (       d  SU[         S-  4$ [        S U  5       5      =(       d    SnU[        -
  [         S-  -
  nXT-  nU  VVs/ s H-  nUS    Vs/ s H  n[        US   U-  [        5      PM     snPM/     n	nnU	 V
s/ s H  n
[	        U
5      PM     nn
[        U5      n[        U-   [         S-  -   n[        U 5      n[         S-  U[        -  -   US-
  [        -  -   n/ nU[         -   n[        U 5       GHv  u  nn[        U[        [        5      -     u  nnUR                  SU[         -    SU[        S-  -   S	 S
[         SUR                  SS5       S3	5        U[        -   n[        US   5       Hä  u  nnU	U   U   n
[        UR                  SS5      5      nU(       a  UO[        nU(       a  UO[        nSU;   a  [!        US   5      nO%U(       a  [!        UR                  SS5      5      nOSnUR                  SUS	 SU SU
S	 S[         SU S35        UR                  SUU
S-  -   S	 SU[        S-  -   S	 S
["         SU SU S35        UU
-  nMæ     U[        [        -   -  nGMy     SR%                  U5      Xß4$ s  snf s  snnf s  sn
f )z1Render parts-based entities. Returns (xml, W, H).Ú é   c              3   óL   #   • U  H  n[        S  US    5       5      v •  M     g7f)c              3   ó*   #   • U  H	  oS    v •  M     g7f)ÚvalueN© )Ú.0Úps     r   Ú	<genexpr>Ú+_parts_content.<locals>.<genexpr>.<genexpr>K   s   é € Ð7ªJ q˜'ž
ªJùs   ‚r   N)Úsum©r%   Úes     r   r'   Ú!_parts_content.<locals>.<genexpr>K   s"   é € ÐJÂ¸A”CÑ7¨A¨gªJÓ7×7Ð7Âùs   ‚"$é   r   r#   ú	<text x="ú" y="ú.1fú&" font-family="sans-serif" font-size="úC" font-weight="bold" fill="var(--ink)" dominant-baseline="central">Úlabelú</text>ÚknownFÚ?ú	<rect x="ú	" width="r   ú" fill="ú(" stroke="var(--ink)" stroke-width="2"/>ú" font-weight="bold" fill="ú3" text-anchor="middle" dominant-baseline="central">r   )ÚPADÚmaxÚLBLÚMIN_SEGr)   ÚlenÚBHÚGAPÚ	enumerateÚ_ENTITY_COLORSr   ÚLBL_FSÚgetÚboolÚ_UNKNOWN_FILLÚ_UNKNOWN_TEXTÚstrÚSEG_FSr   )Úentitiesr   r   r   Ú	max_totalÚavailÚscaler+   r&   Úseg_wÚswÚbar_wÚmax_barÚWÚnÚHÚoutÚyÚiÚfillÚtxtÚxÚjr5   Úf_colorÚt_colorr3   s                              r   Ú_parts_contentra   G   sÇ  € æØ�L¤#¨¡'Ð*Ð*ÜÑJÁÓJÓJ×OÈa€IØœ3Ñ¤ q¡Ñ(€EØÑ€Eñ ô Ú�ð 9:¸'º
ÓCº
°1Œc�!�G‘*˜uÑ$¤gÖ.¹
ÔCÙð 
ñ  á$Ó%šu˜ŒS�ŽW™u€EÐ%Ü�%‹j€GÜˆg‰œ˜a™Ñ€AÜˆH‹€AÜˆa‰�!”b‘&Ñ˜A ™E¤S™=Ñ(€Aà
€CØ
ŒS‰€AÜ˜(×#‰ˆˆ1Ü" 1¤s¬>Ó':Ñ#:Ñ;‰	ˆˆcØ�
‰
Ø˜œS™�z  q¬2¨a©4¡x° nð 53Ü39°(ð ;+à+,¯5©5°¸Ó+<Ð*=¸WðFô	
ð ”‰HˆÜ˜a ™jÖ)‰DˆAˆqØ�q‘˜!‘ˆBÜ˜Ÿ™˜w¨Ó.Ó/ˆEÞ#‘d¬ˆGÞ"‘c¬ˆGØ˜!‹|Ü˜A˜g™J›‘ÞÜ˜AŸE™E '¨2Ó.Ó/‘à�Ø�J‰JØ˜A˜c˜7 %¨ s¨)°B°s°8¸:ÄbÀTð JØ ˜	Ð!IðKôð �J‰JØ˜A  1¡™H S˜>¨¨q´2°a±4©x¸¨nð =7Ü7=°hð ?,Ø,3¨9ð 5DØDIÀ7È'ðSôð �‰GŠAñ+ *ð, 	
ŒR”#‰X‰‹ñ? $ð@ �I‰I�c‹N˜AÐ!Ð!ùòU Dùó  ùâ%s   ÁJÁ J
Á8JÂJÊ
Jc                 ó2   • [        XS9u  p#n[        X#U5      $ ©N)r   ©ra   r   ©rM   r   ÚxmlrU   rW   s        r   Ú
part_wholerg   |   s   € Ü˜xÑC�I€CˆAÜ�˜‹?Ðr   c                 ó2   • [        XS9u  p#n[        X#U5      $ rc   rd   re   s        r   Ú
comparisonri   �   ó   € ä˜xÑC�I€CˆAÜ�˜‹?Ðr   c                 ó2   • [        XS9u  p#n[        X#U5      $ rc   rd   re   s        r   Úmultiplicationrl   ‡   rj   r   N)ÚtotalÚ
unit_valuer   r   r   c                ó  ^• U (       d  SU[         S-  4$ SnUS Ln[        S U  5       5      =(       d    SnU[        -
  [         S-  -
  U(       a  UOS-
  n	[        [        X˜-  5      m[        U4S jU  5       5      n
[        U
-   [         S-  -   U(       a  UOS-   n[	        U 5      n[         S-  U[
        -  -   US-
  [        -  -   n/ nU[         -   nUn[        U 5       GH¾  u  nnUR                  SU[         -    S	U[
        S-  -   S
 S[         SUR                  SS5       S3	5        U[        -   n[        UR                  SS5      5      n[        U5       H~  nUb  [        U5      OSnUR                  SUS
 S	U STS
 S[
         S[         S35        UR                  SUTS-  -   S
 S	U[
        S-  -   S
 S[         S[          SU S35        UT-  nM€     [        UR                  SS5      5      nUS:”  a‘  TU-  nUR                  S5      nUb  [        U5      OSnUR                  SUS
 S	U SUS
 S[
         S["         S35        UR                  SUUS-  -   S
 S	U[
        S-  -   S
 S[         S[$         SU S35        UU-  nU[
        [        -   -  nGMÁ     U[        -
  nU(       aÀ  U[        -   U
-   S-   nUU-   S-  nUR                  SU SU SU SU S3	5        UR                  SU SU SUS-
   SU S3	5        UR                  SU SU SUS-
   SU S3	5        UR                  SU SUS
 SUS -    SUS
 S3	5        UR                  SUS-    S	US
 S[         S!U S3	5        S"R'                  U5      X½4$ )#Nr   r    én   c              3   ój   #   • U  H)  oR                  S S5      UR                  SS5      -   v •  M+     g7f©Úunitsr   ÚextraN©rG   r*   s     r   r'   Ú#_unitary_content.<locals>.<genexpr>•   s)   é € ÐLÂ8¸a—E‘E˜' 1Ó%¨¯©¨g°qÓ(9Ö9Â8ùs   ‚13r-   r   c              3   ót   >#   • U  H-  nUR                  S S5      UR                  SS5      -   T-  v •  M/     g7frr   ru   )r%   r+   Úunit_ws     €r   r'   rv   ˜   s8   øé € ð %Ú#�að —5‘5˜ !Ó$ q§u¡u¨W°aÓ'8Ñ8¸FÖBÚ#ùs   ƒ58r.   r/   r0   r1   r2   r3   r4   rs   r6   r7   r8   r   r9   r:   r;   r<   rt   Úextra_valueé   z
<line x1="z" y1="z" x2="z" y2="é   é   zG" font-weight="bold" fill="var(--crimson)" dominant-baseline="central">r   )r=   r>   r?   r@   rA   rB   rC   rD   r   rF   rG   ÚintÚrangerK   rI   rL   rJ   Ú_EXTRA_FILLÚ_EXTRA_TEXTr   )rM   rm   rn   r   r   r   ÚBRACE_WÚ	has_totalÚ	max_unitsrO   rT   rU   rV   rW   rX   rY   Ú	first_toprZ   r+   r]   rs   Ú_r3   rt   ÚewÚevÚetxtÚlast_botÚbxÚmidrx   s                                 @r   Ú_unitary_contentrŒ   �   s\  ø€ æØ�L¤#¨¡'Ð*Ð*Ø€GØ˜TÐ!€IÜÑLÁ8ÓLÓL×QÐPQ€IØœ3Ñ¤ q¡Ñ(¶y©GÀaÑH€EÜ”˜%Ñ+Ó,€FÜô %Ù#ó%ó %€Gäˆg‰œ˜a™Ñ®i¡7¸QÑ?€AÜˆH‹€AÜˆa‰�!”b‘&Ñ˜A ™E¤S™=Ñ(€Aà
€CØ
ŒS‰€AØ€IÜ˜(×#‰ˆˆ1Ø�
‰
Ø˜œS™�z  q¬2¨a©4¡x° nð 53Ü39°(ð ;+à+,¯5©5°¸Ó+<Ð*=¸WðFô	
ð ”‰HˆÜ�A—E‘E˜' 1Ó%Ó&ˆÜ�u–ˆAØ'1Ñ'=”C˜
”OÀ3ˆEØ�J‰JØ˜A˜c˜7 %¨ s¨)°F¸3°<¸zÌ"Èð NÜ&˜Ð'OðQôð �J‰JØ˜A  q¡™L¨Ð-¨U°1´r¸!±t±8¸C°.ð A7Ü7=°hð ?,Ü,9¨?ð ;DØDIÀ7È'ðSôð �‰KŠAñ ô �A—E‘E˜' 1Ó%Ó&ˆØ�1‹9Ø˜%‘ˆBØ—‘�}Ó%ˆBØ ™n”3�r”7°"ˆDØ�J‰JØ˜A˜c˜7 %¨ s¨)°B°s°8¸:ÄbÀTð JÜ$˜Ð%MðOôð �J‰JØ˜A  1¡™H S˜>¨¨q´2°a±4©x¸¨nð =7Ü7=°hð ?,Ü,7¨=ð 9DØDHÀ6ÈðRôð �‰GˆAØ	ŒR”#‰X‰‹ñM $ðN ”3‰w€HÞØ”#‰X˜Ñ "Ñ$ˆØ˜8Ñ# qÑ(ˆØ�
‰
Ø˜˜˜F 9 +¨V°B°4°v¸h¸Zð H5ð 6ô	
ð 	�
‰
Ø˜˜˜F 9 +¨V°B°q±D°6¸À	¸{ð K5ð 6ô	
ð 	�
‰
Ø˜˜˜F 8 *¨F°2°a±4°&¸¸x¸jð I5ð 6ô	
ð 	�
‰
Ø˜˜˜F 3 s )¨6°"°Q±$°°v¸cÀ#¸Yð G5ð 6ô	
ð 	�
‰
Ø˜˜R™�y  c¨# Yð /Ü ˜ð "+Ø+0¨'°ð:ô	
ð
 �I‰I�c‹N˜AÐ!Ð!r   c                 ó6   • [        XUUS9u  pEn[        XEU5      $ )N)rm   rn   r   )rŒ   r   )rM   rm   rn   r   rf   rU   rW   s          r   ÚunitaryrŽ   ä   s&   € Ü  Ø,6Ø.:ñ<�I€CˆAô �˜‹?Ðr   Ú__main__z..Úsamples)Úexist_okÚSarahr|   )r#   r5   )r3   r   ÚJennyé
   zbar_model_part_whole.svgr   zutf-8)Úencodingzwrote bar_model_part_whole.svgÚJimmyé	   ÚDavidé   zbar_model_multiplication.svgz"wrote bar_model_multiplication.svgÚAlié   ÚAhmadé   zbar_model_comparison.svgzwrote bar_model_comparison.svgzPurple puppetsr   )r3   rs   rt   zYellow puppetsr-   r{   )r3   rs   rt   ry   é'   )rm   rn   zbar_model_unitary_setup.svgz!wrote bar_model_unitary_setup.svgzbar_model_unitary_solved.svgz"wrote bar_model_unitary_solved.svg)r   )NNr   )'Ú__doc__r   rB   rC   r?   r=   r@   rF   rL   rE   rI   rJ   r   r€   r   ra   rg   ri   rl   rŒ   rŽ   Ú__name__ÚosÚpathÚabspathr   ÚdirnameÚ__file__rX   ÚmakedirsÚpwÚopenÚfÚwriteÚprintÚmuÚcmpÚun_setupÚ	un_solvedr$   r   r   Ú<module>r°      s|  ðñð:Oð ð €Ø€Ø	€Ø€Ø
€Ø	€Ø	€ð 5Ø/ð1€à€Ø€Ø€Ø€ð !%õ ð$ .1°Q¸1õ 2"ôjô
ôð )-¸Ø"%¨!°õR"ôjð ˆzÔÛØ
�'‰'�/‰/˜"Ÿ'™'Ÿ,™, r§w¡w§¡°xÓ'@À$È	ÓRÓ
S€CØ‡K‚K�˜dÒ#ñ 
ØØ¨Ñ.Ð/ñ	1àØ¨Ñ.Ø¨$Ñ/ð1ñ	2ðó 
€Bñ 
ˆb�g‰g�l‰l˜3Ð :Ó;¸SØò
 Ø#$Ø	�‰�Œ÷
 ñ 
Ð
*Ô+ñ 
ØØ¨Ñ.Ð/ñ	1àØ¨Ñ.Ð/°!Ñ3ñ	5ðó 
€Bñ 
ˆb�g‰g�l‰l˜3Ð >Ó?ÀØò
 Ø#$Ø	�‰�Œ÷
 ñ 
Ð
.Ô/ñ ØØ¨$Ñ/Ð0ñ	2àØ¨$Ñ/Ø¨Ñ.ð0ñ	1ðó €Cñ 
ˆb�g‰g�l‰l˜3Ð :Ó;¸SØò
 Ø#$Ø	�‰�Œ÷
 ñ 
Ð
*Ô+ñ Ø"¨Q¸Ñ;Ø"¨Q¸È1ÑMðð ˜Dñ"€Hñ 
ˆb�g‰g�l‰l˜3Ð =Ó>ÀØò
 Ø#$Ø	�‰�Ô÷
 ñ 
Ð
-Ô.áØ"¨Q¸Ñ;Ø"¨Q¸È1ÑMðð ˜Añ€Iñ 
ˆb�g‰g�l‰l˜3Ð >Ó?ÀØò
 Ø#$Ø	�‰�	Ô÷
 ñ 
Ð
.Õ/ðy ÷
 ö 
 ú÷
 ö 
 ú÷
 õ 
 ú÷
 õ 
 ú÷
 õ 
 ús<   Ã7JÅJÆ6J,ÈJ=É$KÊ
JÊ
J)Ê,
J:Ê=
KË
K