ó
    íòÜj¶�  ã                   óH  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r
\R                  R                  S\R                  R                  S5      5        \R                  R                  S5      rS H$  r\R                  R                  S\ S\ 35        M&     SSKrS\l        SSKrSSKJr  \" \S	\R,                  5      r\\l        S
1rS r\R6                  \l        \\l        SSKrSSKJr  SSKJrJr  SSK r!\R                  RE                  \R                  RG                  \$5      5      r%/ SQr& \&\RN                  " \(" \R                  RS                  \R                  RE                  \R                  RG                  \$5      5      S5      5      5       V s/ s H  o S   \&;  d  M  U S   PM     sn -  r&Sr,\&\-" \,5      -    Hx  r.\.\!R^                  ;  d  M  \(" \R                  R                  S\. S35      5      Ra                  5       SS Rc                  5       Re                  S5      S   \!R^                  \.'   Mz     SSS.r3S r4\
Rj                  " / SQ/ SQ/ SQ/ SQ/5      r6\
Rj                  " / SQ/ SQ/ S Q/ S!Q/5      \
Rj                  " / S"Q/ SQ/ S#Q/ S!Q/5      4 Vs/ s H$  n\6U-  \
Rn                  Rq                  \65      -  PM&     snr9\R                  R                  S\R                  R                  S5      5        SSK:r;S$ r<S% r=S& r>S' r? " S( S)5      r@S*rAS>S+ jrBS, rCS- rD0 rES. rFS?S/ jrGS@S0 jrH " S1 S25      rI\JS3:X  a§  \R–                  " 5       rL\LR›                  S4S5S69  \LR›                  S7\NS8S99  \LR›                  S:\NS;S99  \LRŸ                  5       rP\I" \PR¢                  \PR¤                  \% S<\PR¤                   S=\PR¢                   35      R§                  \PR¨                  5        ggs  sn f ! \*\+4 a     GNNf = f! \* a     GMO  f = fs  snf )Aaó  play.py -- the reef's first play: Lego grows by taste, no plan (step 1, Oct 23 2026).
Ivy, Oct 22: "there would be no plan. That's the point. It plays. It puts pieces it likes on."
Each turn: the engine (~/lego/grow.py's own legal move) proposes up to K different legal additions anywhere on the build;
each is MEASURED (relations.py between the new piece and the piece it joins, every KEPT ruler from the loop, and numbers about
the whole build); Jev picks the one this taste would keep, asked twice (reversed and relabelled); the pick is committed.
Not yet: taking pieces off, Haiku's words, Opus changing the taste. One thing at a time.
    python3 play.py --taste tidy --turns 15 --seed 1     -> runs/<taste>_s<seed>/frame_NN.png, build.ldr, log.jsonlé    Nz~/legoz~/projects/brick_reef)ÚjoinsÚjevÚloopÚ/T)ÚPartÚ_orig_freshÚ122c01c                 ó\  ^
^• [        U 5      oR                   Vs/ s H  o"S   S   S:”  d  M  UPM     snUl        U [        ;  aÁ   [        R                  " U 5       H¦  nUS   S:X  d  M  US   S:X  d  M  [        R
                  " U5      (       d  M6  [        US   S   5      S:  d  MM  [        UR                  5      [        R                  " US	   [        5      [        R                  " US   [        5      S
./-   Ul        M¨     UR                  (       GaD  [        US5      (       a%  [        UR                  R                  S   S   5      OSn/ nUR                   Hô  n[        R                  " US	   [        5      n[        US   S   5      S:”  a­  SUS   s=:  a  S:  a�  O  OšUS   S::  a‘  US   US   S-  -
  US-   ::  a|  [        R                   " US   US   U/5      m[#        U4S jUR$                   5       5      (       d7  [        UR$                  5      T[        R                   " / SQ5      S
./-   Ul        Mã  UR'                  U5        Mö     XQl         [        R                  " U 5       Vs/ s HE  o3S   S:X  d  M  US   S:X  d  M  [        R
                  " U5      (       d  M5  US   S   S:”  d  MC  UPMG     nnUR                  R(                  m
U
4S jn	U Vs/ s H  o9" U5      (       d  M  UPM     nnU(       ao  [+        U5      [+        UR$                  5      :¼  aM  U Vs/ s H:  n[        R                  " US	   [        5      [        R                   " / SQ5      S
.PM<     snUl        U$ s  snf ! [         a     GNƒf = fs  snf s  snf s  snf ! [         a     U$ f = f)a|  the engine's geometry finder sees upright studs only, and read 122c01's two wheel hubs as studs -- so its sideways ones go, and
real side studs come from LDCad's shadow library instead (Oct 24 2026: this filter threw away EVERY side stud -- 87087, the
headlight brick, 11211, 30414 -- so Pin asked four turns running for Liberty's tablet on a side stud and heard 'it fit nowhere')Úaxisé   ç®Gáz®ï?ÚkindÚcylÚgenderÚMg{®Gáz„?Úc)r   r   Úmesh0r   ç        gš™™™™™@Údgffffff@Úlengthg      @ç333333Ó?é   c              3   óœ   >#   • U  HA  n[         R                  R                  [         R                  " US    5      T-
  5      S:  v •  MC     g7f)r   ç      ð?N)ÚnpÚlinalgÚnormÚasarray)Ú.0ÚkÚats     €Ú*/home/ivy/projects/brick_reef/reef/play.pyÚ	<genexpr>Ú!_upright_fresh.<locals>.<genexpr>&   s7   øé € Ð\ÒR[ÈQœ2Ÿ9™9Ÿ>™>¬"¯*ª*°Q°s±VÓ*<¸rÑ*AÓBÀSÖHÒR[ùs   ƒA	A)r   r   g      ð¿ÚFc                 ón  >• [         R                  " U S   [        5      nT[         R                  " TS S 2S4   US   -
  5      S:  [         R                  " TS S 2S4   US   -
  5      S:  -     n[	        U5      S:„  =(       a2    [        [        US S 2S4   R                  5       5      US   -
  5      S:  $ )Nr   r   g      @r   r   ç      à?)r   r   ÚfloatÚabsÚlenÚmin)r   r   ÚselÚV0s      €r"   Úat_undersideÚ$_upright_fresh.<locals>.at_underside3   s§   ø€ Ü—
’
˜1˜S™6¤5Ó)ˆA°´R·V²V¸BºqÀ!¸t¹HÀqÈÁt¹OÓ5LÈsÑ5RÔWY×W]ÒW]Ð^`ÒabÐdeÐaeÑ^fÐijÐklÑimÑ^mÓWnÐqtÑWtÑ4uÑ1v¨3Ü�s“8˜a‘<×L¤C¬¨c²!°Q°$©i¯m©m«oÓ(>ÀÀ1ÁÑ(EÓ$FÈÑ$LÐLó    )Ú_freshÚstudsÚTYRE_HOLDERSÚSNÚsnapsÚis_engine_studr)   Úlistr   r   r(   Ú	ExceptionÚholesÚhasattrr   ÚboundsÚarrayÚanyÚsocketsÚappendÚverticesr*   )ÚnameÚpÚtr   Úz0ÚkeepÚhr   Úantir.   r-   r!   s             @@r"   Ú_upright_freshrH      sP  ù€ ô 	ˆt‹€A¯GªGÓ KªG q¸±yÀ±|ÀdÑ7J§©GÑ K�a”gØ”<Óð	Ü—X’X˜d–^�Ø�V‘9 Õ%¨!¨H©+¸Õ*<Ä×ARÒARÐST×AUÓAUÔZ]Ð^_Ð`fÑ^gÐhiÑ^jÓZkÐnrÕZrÜ" 1§7¡7›m´R·Z²ZÀÀ#ÁÌÓ5NÔXZ×XbÒXbÐcdÐekÑclÔnsÓXtÑ/uÐ.vÑv�A–Gñ $ð 	‡w‡w€wÜ,3°A°w×,?Ñ,?ŒU�1—7‘7—>‘> !Ñ$ QÑ'Ô(ÀSˆØˆØ—”ˆAÜ—
’
˜1˜S™6¤5Ó)ˆAÜ�1�V‘9˜Q‘<Ó  4Ó'¨C°!°C±&Õ,>¸3Ö,>À1ÀXÁ;ÐRUÓCUÐZ[Ð\]ÑZ^ÐabÐckÑalÐopÑapÑZpÐtvÐy|Ñt|ÓZ|Ü—X’X˜q ™t Q q¡T¨2Ð.Ó/�ÜÔ\ÐRS×R[ÒR[Ó\×\Ñ\Ü $ Q§Y¡Y£¸ÄRÇXÂXÒN^ÓE_Ñ3`Ð2aÑ a�A”IÙØ�K‰K˜ŽNñ ð Œð
ÜŸ8š8 Dœ>ó  Iš>�a¨v©Y¸%Ñ-?“ÀAÀhÁKÐSVÑDV“Ô[]×[lÒ[lÐmn×[o“ÐtuÐv|Ñt}Ð~ñ  uAð  DHñ  uH—™>ˆð  Ið �W‰W×Ñˆõ	Mñ  Ó3š4�a <°§?—™4ˆÐ3Þ”C˜“I¤ Q§Y¡Y£Ó/ñ  MQó  >Rò  MQð  HIÄBÇJÂJÈqÐQTÉvÔW\ÓD]Ôgi×goÒgoò  qAó  hBô  ?Cñ  MQñ  >R°´à€HùòG !Løô Óš$Ðüò& Iùò 4ùò >RøÜÓ�dØ€Hð ús�   ›M8®M8Á M= Á+M= Á6M= ÂM= Â*AM= ÉN É6NÊNÊNÊ.
NÊ<NË"N Ë$NË8NË>/N Ì-ANÍ.N Í=
NÎ
NÎN Î
N+Î*N+)Úfacts)Ú	relationsÚGROUPS))Ú3700Ú3701Ú3894Ú3702Ú32524Ú32316Ú32017Ú2905Ú3023Ú3020Ú3022Ú3024Ú3001Ú3034r	   Ú3641Ú3039Ú3040bÚ3665aÚ3298Ú3747bÚ3062bÚ6141Ú4589Ú3941Ú4032aÚ4740Ú41769aÚ41770aÚ3069bÚ2412bÚ3070bÚ3659Ú6091Ú3005Ú3004Ú3622Ú3010Ú3710Ú3666Ú2420zbin.jsonÚpart)Ú3867Ú3865z~/lego/ldraw/parts/z.datr   z  (zItidy building: nothing hanging off, everything centred, flush and compactzmpieces that reach out into the air, hang off, lean and look almost about to fall; tidy and compact bores them)ÚtidyÚreachc                  óœ  • [        [         S35       V s/ s H  n [        R                  " U 5      PM     nn / nU Hˆ  nUS   S:X  d  M  [        R
                  R                  US   [         SUS    S35      n[        R
                  R                  U5      oTR                  R                  U5        UR                  U5        MŠ     U$ s  sn f )Nz/loop/ledger.jsonlÚverdictrE   rA   z/loop/rulers/z.py)ÚopenÚBÚjsonÚloadsÚ	importlibÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_moduler?   )ÚlÚLÚoutÚrÚspecÚms         r"   Úkept_rulersr‹   Q   s·   € Ü $¬ sÐ*<Ð%=Ô >Ó?Ò >˜1Œ�Š�AŽÑ >€AÐ?Ø
€CÛˆØˆY‰<˜6Õ!Ü—>‘>×9Ñ9¸!¸F¹)ÌÀsÈ-ÐXYÐZ`ÑXaÐWbÐbeÐEfÓgˆDÜ—‘×/Ñ/°Ó5ˆA·{±{×7NÑ7NÈqÔ7QÐSV×S]ÑS]Ð^_ÖS`ñ ð €Jùò 	@s   • C	)çš™™™™™Ù?r   r   r   )r   r   rŒ   r   )r   gš™™™™™Ù¿r   r   )r   r   r   r   )r   r   éÿÿÿÿiáÿÿÿ)r   r   r   é   )r   r   r   r   )r   r   r   r   )r   r   r   é   )r�   r   r   r   c                 ó¸   • [         R                  " U 5       Vs/ s H"  n[         R                  " U5      (       a  M   UPM$     sn$ s  snf ! [         a    / s $ f = f)zÐthe connections the old engine didn't know -- bars, clips, bar holes, axles, axle holes, hinge fingers, ball joints --
from LDCad's shadow library (CONNECTIONS.md). Studs and anti-studs stay the engine's own.)r4   r5   r6   r8   )rA   r   s     r"   Ú	new_snapsr‘   `   s@   € ô ŸHšH TœNÓGšN�q´"×2CÒ2CÀA×2F—™NÑGÐ	GùÒGøÜÓ˜R’iÐús'   �A
 ™A¼AÁA
 ÁA
 Á
AÁAc                 ó¬   • [        S U R                  S5      =(       d    /  5       5      =(       d$    [        U R                  SS5      =(       d    S5      $ )zShow long a snap is along its axis (mm): the sum of its sections, or a clip's lengthc              3   ó>   #   • U  H  n[        US    5      v •  M     g7f)r   N)r(   )r   Úxs     r"   r#   Ú_snap_len.<locals>.<genexpr>g   s   é € Ð:Ò%8˜qŒu�Q�q‘T�{ˆ{Ò%8ùs   ‚Úsecsr   r   )ÚsumÚgetr(   )r   s    r"   Ú	_snap_lenr™   e   s?   € äÑ: Q§U¡U¨6£]×%8°bÐ%8Ó:Ó:×\¼eÀAÇEÁEÈ(ÐTUÓDV×D[ÐZ[Ó>\Ð\r0   c                 ó¦   • [         R                  " XR                  5      o"S S2S4   US S2S4   [         R                  " U5      -  -   US S2S4   4$ )Né   r   )r4   ÚframeÚTÚanchor)Úbr   r%   s      r"   Ú
snap_worldr    h   sR   € Ü
�Š�—C‘CÓ€A 2 A 2 q 5¡¨A¨b¨q¨b°!¨e©H´r·y²yÀ³|Ñ,CÑ!CÀQÀrÈÀrÈ1ÀuÁXÐ!MÐMr0   c                 ó   • U  VVVs/ s H;  n[        [        UR                  5      5        H  u  p#XU4[        X5      -   PM     M=     nnnn[	        5       n[        U5      S:  a  U$ SSKJn  U" [        R                  " U Vs/ s H  owS   PM	     sn5      5      R                  S5       H’  u  p‰XH   u  p«pÍoäU	   u  nnnnnX¯L d  [        [        UU-  5      S-
  5      S:”  a  M;  [        R                  " UU5      (       d  [        R                  " UU5      (       d  Mu  U[        U
5      U4[        U5      U41-  nM”     U$ s  snnnf s  snf )zt(id(body), snap index) pairs already joined to another body's snap (same place, same or opposite axis, and they fit)r   r   ©ÚcKDTreer›   ç333333ã?r   çš™™™™™©?)Ú	enumerater‘   rA   r    Úsetr*   Úscipy.spatialr£   r   r<   Úquery_pairsr)   r4   ÚfitsÚid)ÚbodiesrŸ   Úir   ÚWÚusedr£   ÚwÚar   ÚbaÚiaÚdaÚpaÚxaÚbcÚicÚdcÚpcÚxcs                       r"   Úsnaps_matedr¼   j   s  € á/5Õ_ªv¨!Ä)ÌIÐVW×V\ÑV\ÓL]×B^¹$¸!ˆ!�ˆ”Z Ó%Ô	%ÑB^Ñ	%©v€AÒ_Ü‹5€DÜ
ˆ1ƒv�ƒz˜$�;Ý%ÙœŸš±Ó!2²¨1 A¤$±Ñ!2Ó3Ó4×@Ñ@ÀÖE‰ˆØ™TÑˆ�˜¸!¹Ñ#5 2 r¨2¨r°2ØŠ8”sœ3˜r B™w›<¨!Ñ+Ó,¨tÓ3±XÜ�7Š7�2�r�?‰?œbŸgšg b¨"Ÿo›o¨t¼¸B»À¸ÄrÈ"ÃvÈrÀlÐ7SÑ/Sªtñ Fð €Kùô 	`ùò "3s   ‡AEÂEc                   ó6   • \ rS rSrSrSrSrSrSrSr	Sr
S rSrg)	Ú	FloorHostév   aW  the huge invisible baseplate under the build (Ivy, Oct 23 2026: "assume the bottom piece is attached to a huge baseplate
that's invisible" -> "the huge base plate should still have clutch and gravity"). One per floor stud, standing in for a
real 3867 baseplate whose stud sits there, so descriptions and pair pictures work like any other host.ru   Ú	invisibleT© c                 ó  • [         R                  " U[        5      U l        [        R
                  " S5      n[         R                  " S5      U l        U R                  UR                  S   S   -
  U R                  S S2S4'   g )Nru   é   r   r   r›   )	r   r   r(   ÚptÚGÚfreshÚeyer�   r2   )ÚsrÄ   rŸ   s      r"   Ú__init__ÚFloorHost.__init__{   sf   € Ü�zŠz˜"œeÓ$ˆŒ¬!¯'ª'°&«/ aÄÇÂÈÃ¸1¼3ÐYZ×Y]ÑY]Ð`a×`gÑ`gÐhiÑ`jÐknÑ`oÑYoÈAÏCÉCÐPRÐQRÐPRÐTUÐPUÊJr0   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rA   ÚcolourÚis_floorr2   r>   r9   rÉ   Ú__static_attributes__rÁ   r0   r"   r¾   r¾   v   s,   † ñnð €D˜K�6°D¨À"¸%ÐPRÀgÐ\^ÐTYõpr0   r¾   ç       @c                 óú   • [         R                  " [         R                  " U 5      U-
  [        S-  -   [        5      [        S-  -
  n[	        [         R
                  " [         R                  " U5      U:  5      5      $ )Nr   )r   Úmodr   ÚGRIDÚboolÚallr)   )ÚxyÚoffÚtolr   s       r"   Úon_gridrÜ   ~   sQ   € Ü
�ŠŒr�zŠz˜"‹~ Ñ#¤d¨Q¡hÑ.´Ó5¼¸q¹Ñ@€AÜ”—’”r—v’v˜a“y 3‘Ó'Ó(Ð(r0   c                 óø   • U R                   (       a'  U R                  U R                   S   S   5      S   S:„  $ [        U R                  5      =(       a'    U R                  U R                  S   S   5      S   S:  $ )aÇ  is this piece the right way up? Its studs point up -- or, for a piece with no studs on top (curved slopes, tiles), its sockets
point down. Oct 23 2026: every check used studs only, so a 2x2 curved slope as a first piece was never 'upright': it couldn't
clutch the baseplate (falsely flagged as tipping), nothing could go under it, and the game ended on 'too few moves' (Ivy: "I
think the possibility of tipping over is breaking it somehow. It ends early")r   r   r   r   g®Gáz®ï¿)r2   Ú	world_dirr×   r>   )rŸ   s    r"   Úuprightrß   �   sc   € ð
 	‡w‡w�q—{‘{ 1§7¡7¨1¡:¨fÑ#5Ó6°qÑ9¸DÑ@Ð@Ü�—	‘	‹?×K˜qŸ{™{¨1¯9©9°Q©<¸Ñ+?Ó@ÀÑCÀeÑKÐKr0   c                 óú  ^^^• [        U 5      (       a  [        U R                  5      S:  a  / $ [        R                  " U R                   Vs/ s H3  oR                  US   5      S   S:”  d  M  U R                  US   5      PM5     sn5      n[        U5      S:  a  / $ / nU GHI  mU Vs/ s HY  n[        US   TS   -
  5      S:  d  M  [        [        R                  R                  USS TSS -
  5      S-
  5      S	:  d  MW  UPM[     nn[        U5       HÐ  u  pgXVS
-   S  HÀ  nUSS TSS -
  USS TSS -
  p©[        Xš-  5      S:”  a  M+  TSS U	-   U
-   m[        UU4S jU 5       5      (       d  MS  [        R                  " TS   U	S   U
S   -   S-  -   TS
   U	S
   U
S
   -   S-  -   TS   /5      m[        U4S jU 5       5      (       a  M¯  UR                  T5        MÂ     MÒ     GML     U$ s  snf s  snf )zÙthe centre of every 2x2 square of b's own upward studs, at the studs' base -- where a 1x1 round piece presses in between four
studs (Ivy, Oct 23 2026: "Need to be able to press 1x1 round things in between four studs")rÃ   r   r   r   r   çš™™™™™É?NrÓ   r   r   r   c              3   ó°   >#   • U  HK  n[        US    TS    -
  5      S:  =(       a(    [        R                  R                  USS  T-
  5      S:  v •  MM     g7f)r   rá   Nr   )r)   r   r   r   )r   Úqr±   Úfars     €€r"   r#   Ú!between_points.<locals>.<genexpr>–   sO   øé € Ð_Ò]^ÐXY”s˜1˜Q™4 ! A¡$™;Ó'¨#Ñ-×S´"·)±)·.±.ÀÀ2ÀAÀÈÁÓ2MÐPSÑ2SÔSÒ]^ùs   ƒAAr   c              3   ón   >#   • U  H*  n[         R                  R                  TU-
  5      S :  v •  M,     g7f)r'   N©r   r   r   )r   Úor   s     €r"   r#   rå   ˜   s'   øé € ÐHÂC¸qœrŸy™yŸ~™~¨a°!©eÓ4°sÖ:ÂCùó   ƒ25)rß   r*   r2   r   r<   rÞ   Úworldr)   r   r   r¦   r=   r?   )rŸ   rC   ÚPr‡   rã   Únearr­   ÚuÚvÚduÚdvr±   r   rä   s              @@@r"   Úbetween_pointsrñ   ˆ   sé  ú€ ô �1�:‰:œ˜QŸW™W›¨Ó)°"¨9Ü
�Š¨1¯7ª7ÓWª7 a·k±kÀ!ÀFÁ)Ó6LÈQÑ6OÐRVÑ6V“/�!—'‘'˜!˜C™&–/©7ÑWÓX€AÜ
ˆ1ƒv�ƒz˜"�9Ø
€CÜˆÙÓjš1�a¤ A a¡D¨1¨Q©4¡KÓ 0°3Ñ 6“¼3¼r¿y¹y¿~¹~ÈaÐPRÐQRÈeÐVWÐXZÐYZÐV[ÉmÓ?\Ð_bÑ?bÓ;cÐfiÑ;i—™1ˆÐjÜ˜d–O‰DˆAØ˜a™%˜&“\�Ø˜2˜A˜  2 A ™¨¨"¨1¨°°"°1°©�BÜ�r‘w“< #Ó%¡xØ˜˜�e˜b‘j 2‘o�ÜÕ_Ñ]^Ó_×_Ó_ÜŸš ! A¡$¨"¨Q©%°"°Q±%©-¸1Ñ)<Ñ"<¸aÀ¹dÀbÈÁeÈbÐQRÉeÁmÐWXÑEXÑ>XÐZ[Ð\]ÑZ^Ð!_Ó`�AÜÔHÁCÓH×HÓHÈ#Ï*É*ÐUVÎ-ó "ô $ñ ð €Jùò Xùò ks   ÁG3Á/G3Â+G8Ã6G8ÄG8c                 óÚ  • U [         ;  aÙ  [        R                  R                  U S5      =(       d    SR	                  5       R                  SS5      n[        R                  " U 5      o"R                  R                  u  p4SU;   =(       a    SU;   =(       d    SU;   =(       a:    [        UR                  5      S:¬  =(       a    XC-
  S   S	:  =(       a
    XC-
  S   S	:  [         U '   [         U    $ )
z|a 1x1 round piece or 1x1 cone: one socket, a footprint no wider than one stud -- the kind that presses in between four studsÚ z  Ú z1 x 1ÚroundÚconer   r   gš™™™™™ @)Ú_ROUND1ÚCXÚNAMESr˜   ÚlowerÚreplacerÅ   rÆ   r   r;   r*   r>   )rA   ÚnmrŸ   ÚloÚhis        r"   Ú	round_1x1rÿ   œ   sÞ   € à”7ÓÜ�h‰h�l‰l˜4 Ó$×*¨×1Ñ1Ó3×;Ñ;¸DÀ#ÓFˆÜ�GŠG�D‹Mˆ§G¡G§N¡N™6˜2Ø  B™×J¨G°r©M×,I¸VÀr¹\÷  RÔPSÐTU×T]ÑT]ÓP^ÐbcÑPc÷  RÐikÑipÐrsÑhtÐwzÑhz÷  Rð  ACñ  AHð  JKñ  @Lð  ORñ  @RŒ�‰Ü�4‰=Ðr0   c                 ód  • U (       d"  SUc  [         R                  " SS/5      S4$ US4$ [        S U  5       5      nU  HÏ  nUR                  R                  S   S   US-   :  d  M(  [        U5      (       d  M:  UR                  (       d  MM  UR                   Hr  nUR                  US   5      n[        US   U-
  5      S	:¼  a  M.  Uc%  U[         R                  " USS [        5      U4s  s  $ [        USS U5      (       d  Ml  X!U4s  s  $    MÑ     X!c  [         R                  " SS/5      S4$ US4$ )
zð(floor z, stud grid offset xy, a piece clutched to the baseplate or None). The grid is FIXED in the world once a game
starts (pass off): a build that gets turned over lands wherever it lands and only clutches if an underside meets the studsr   Ng      @c              3   óX   #   • U  H   oR                   R                  S    S   v •  M"     g7f©r   r   N©Úmeshr;   ©r   rŸ   s     r"   r#   Úfloor_grid.<locals>.<genexpr>¨   s    é € Ð1ª& Q�V‰V�]‰]˜1Ñ˜aÖ ª&ùó   ‚(*r   r   r   r   r¤   )r   r<   r+   r  r;   rß   r>   rê   r)   rÕ   rÖ   rÜ   )r¬   rÚ   rD   rŸ   r    r°   s         r"   Ú
floor_gridr  ¤   s  € ö ˜#¸¹¤§¢¨#¨s¨Ó 4ÈtÐSÐSÈÈtÐSÐSÜ	Ñ1©&Ó1Ó	1€BÛˆØ�6‰6�=‰=˜Ñ˜AÑ  c¡Õ)¬g°a¯j«j¸Q¿Y¿Y¹YØ—Y”Y�Ø—G‘G˜A˜c™F“O�Ü�q˜‘t˜b‘y“> SÓ(©(Ø‘; r¬2¯6ª6°!°B°Q°%¼Ó+>ÀÐ'AÔ AÜ˜1˜R˜a˜5 #×&Ó&¨r¸¨zÔ(9ó	 ñ ð ©”—’˜#˜s˜Ó$¸tÐCÐC¸¸tÐCÐCr0   c           	      óN  ^^• [        X5      u  p2nU (       d  / $ [        R                  " U  Vs/ s H  oUR                  R                  PM     sn5      ofSS2SS24   R                  S5      U[        -  -
  USS2SS24   R                  S5      U[        -  -   p‡[        R                  " [        R                  " US   US   -
  [        -  5      [        R                  " US   US   -
  [        -  5      S-   5      [        -  US   -   n	[        R                  " [        R                  " US   US   -
  [        -  5      [        R                  " US   US   -
  [        -  5      S-   5      [        -  US   -   n
U  Vs/ s H=  oUR                  R                  S   S   US-   :  d  M'  UR                  R                  PM?     nn/ nU	 HQ  mU
 HH  m[        UU4S jU 5       5      (       a  M   UR                  [        R                  " TTU/5      5        MJ     MS     U$ s  snf s  snf )zOfree baseplate studs within `reach` studs of the build's footprint on the floorNr   r   r   r   c              3   óÌ   >#   • U  HY  oS    S    S-
  Ts=:  =(       a    US   S    S-   :  Os  =(       a'    US    S   S-
  Ts=:  =(       a    US   S   S-   :  Os  v •  M[     g7f)r   r'   r   NrÁ   )r   Úbbr”   Úys     €€r"   r#   Úfloor_points.<locals>.<genexpr>¼   sk   øé € ÐmÒilÐce�a‘5˜‘8˜c‘> A×6Ó6¨¨1©¨a©°3©Ô6×^¸2¸a¹5À¹8Àc¹>ÈA×;^Ó;^ÐPRÐSTÑPUÐVWÑPXÐ[^ÑP^Ô;^Ô^Òilùs   ƒA!A$)r  r   Úvstackr  r@   r+   rÖ   ÚmaxÚarangeÚfloorÚceilr;   r=   r?   r<   )r¬   rx   rÚ   rD   Ú_rŸ   ÚVrý   rþ   ÚxsÚysÚlowr‡   r”   r  s                @@r"   Úfloor_pointsr  ±   sØ  ù€ ä˜FÓ(�J€BˆQÞ˜"�9Ü
�	Š	©FÓ3ªF q—6‘6—?”?©FÑ3Ó4€AÂÀBÀQÀBÀ¹x¿|¹|ÈA»ÐQVÔY]ÑQ]Ñ?]Ð_`ÒabÐdfÐefÐdfÐafÑ_g×_kÑ_kÐlmÓ_nÐqvÔy}Ñq}Ñ_}¸"Ü	�Š”2—8’8˜R ™U S¨¡V™^¬tÑ3Ó4´b·g²g¸rÀ!¹uÀsÈ1Áv¹~ÔQUÑ>UÓ6VÐYZÑ6ZÓ	[Ô^bÑ	bÐehÐijÑekÑ	k€BÜ	�Š”2—8’8˜R ™U S¨¡V™^¬tÑ3Ó4´b·g²g¸rÀ!¹uÀsÈ1Áv¹~ÔQUÑ>UÓ6VÐYZÑ6ZÓ	[Ô^bÑ	bÐehÐijÑekÑ	k€BÙ"(Ó
K¢&˜Q¯F©F¯M©M¸!Ñ,<¸QÑ,?À"ÀsÁ(Ñ,J‹=ˆ1�6‰6�=Œ=¡&€CÐ
KØ
€CÛˆÛˆAÜÕmÑilÓm×mÑmÑowØ�J‰J”r—x’x  A r 
Ó+Ö,ó ñ ð €Jùò 4ùò Ls   ®HÅ<&H"Æ&H"c                   óŒ   • \ rS rSrS rS rS rS r\r	S r
\S 5       rS rS	 rS
 rSS jrS rS rS rS rS rS rS rSrg)ÚReeféÀ   c                 ór  • [         R                  " U5      U l        [        R                  R                  U5      U l        X l        X0l        [        R                  " USS9  / SQn[         R                  " XA[        U5      -     5      n[        [         R                  US-  [        [         R                  5      -     5      Ul        U R                  R                   R#                  U5        [%        5       U l        SU l        U R                  R*                  U l        U R.                  U R                  l        g )NT)Úexist_ok)rO   rX   rU   rY   r[   rc   rr   rP   rp   rs   r^   rn   é   r   )rÅ   ÚGrowerÚgr   ÚrandomÚdefault_rngÚrngÚtaster‡   ÚosÚmakedirsrÆ   r*   ÚintÚCOLOURSrÐ   ÚasmÚplacer‹   ÚrulersÚturnÚundoÚ_g_undoÚ_undo)rÈ   Úseedr$  ÚoutdirÚFIRSTSÚfirsts         r"   rÉ   ÚReef.__init__Á   s  € Ü�hŠh�t‹nˆŒ¤b§i¡i×&;Ñ&;¸DÓ&A˜aœeÈUÄ7Ð\bÔTYÔdf×doÒdoÐpvð  BFò  eGârˆÜ—’˜¤c¨&£kÑ1Ñ2Ó3ˆÄCÌÏ	É	ÐSWÐZ[ÑS[Ô_bÔcd×clÑclÓ_mÑRmÑHnÓDo°U´\Ðqr×qtÑqt×qxÑqx×q~Ñq~ð  @Eô  rFô  S^ó  S`ð  HIô  HPð  klð  bcô  bhØ—C‘C—H‘HˆŒ	¨¯©˜aŸc™c�hr0   c                 ó6   • U R                   R                  5       $ ©N)r   r¬   )rÈ   s    r"   r¬   ÚReef.bodiesÇ   s   € ˜!Ÿ#™#Ÿ*™*›,Ð&r0   c                 óÆ   • [        USS5      nU(       a=  U R                  R                  R                   H  oDR                  S==   U-  ss'   M     U R                  X5      $ )NÚ_liftr   ©r   r›   )Úgetattrr   r)  Úpartsr�   r.  )rÈ   ÚnewÚn0Údzrã   s        r"   r/  Ú
Reef._undoÈ   sC   € Ü�S˜' 3Ó'ˆÞØ—S‘S—W‘W—]”]�§C¡C¨£I°¡O¥I‘]Ø�y‰y˜Ó!Ð!r0   c                 óÈ  • U R                  5       n[        U R                  R                  5       5      nX R                  R                  5        Vs/ s H  o3S   S:X  d  M  SUS   US   US   4PM     sn-  nU VVs/ s H)  oDR                    H  oTR                  US   5      PM     M+     nnnSSKJn  U(       a  U" [        R                  " U5      5      OS	nU(       a  [        S
 U 5       5      OSn	U H·  nUR                  [        ;   a  M  UR                  R                  S   S   U	S-   :  n
[        U5      (       d  MM  [!        UR"                  5       HQ  u  p¼UR                  US   5      nUb  UR%                  US5      (       a  M5  UR'                  U
(       a  SOSXK45        MS     M¹     U VVs/ s H)  oDR"                    H  o´R                  US   5      PM     M+     nnnU(       a  U" [        R                  " U5      5      OS	nX! VVVs/ s HX  oDR                  [        ;  d  M  [!        [)        U5      5        H'  u  nnUb  UR%                  US5      (       a  M"  SUU4PM)     MZ     snnn-  n[+        U5      nX! VVVs/ s HD  n[!        [-        UR                  5      5        H  u  nn[/        U5      U4U;  d  M  SUU4PM      MF     snnn-  nU[1        U[3        U SS	5      S9 Vs/ s H+  nS[5        U5      [7        US   5      [7        US   5      44PM-     sn-  nX R9                  5       -   $ s  snf s  snnf s  snnf s  snnnf s  snnnf s  snf )a
  every place a piece could join: the engine's free hole ends and studs, PLUS free sockets on the underside of any
upright piece (Oct 23 2026: the reef asked for landing wheels 'tucked under the body' eight turns running and the
engine could not build downward at all)r   ÚholeÚstudholer   r   r›   r   r¢   Nc              3   óX   #   • U  H   oR                   R                  S    S   v •  M"     g7fr  r  r  s     r"   r#   ÚReef.conns.<locals>.<genexpr>Ú   s    é € Ð4²¨A—F‘F—M‘M !Ñ$ QÖ'²ùr  r   r   r¤   ÚliftÚsocketÚbetweenÚsnapÚ	floor_off)rÚ   r  )r¬   r7   r   Úfreer2   rê   r¨   r£   r   r<   r+   rA   Ú
BASEPLATESr  r;   rß   r¦   r>   Úquery_ball_pointr?   rñ   r¼   r‘   r«   r  r;  r¾   r(   Ú
tyre_slots)rÈ   Úbsr‡   r   rŸ   rC   r2   r£   Ústreer  rF  r    Úsor°   ÚsocksÚktreer­   rã   Úused_sr  s                       r"   ÚconnsÚ
Reef.connsÍ   sí  € ð �X‰X‹Zˆô �1—3‘3—8‘8“:Óˆà¿¹¿¹¼
ÓUº
°1ÈÁdÈfÁnÓ.�˜Q˜q™T 1 Q¡4¨¨1©Ó.¹
ÑUÑUˆÙ*,Ô>ª" Q·gµg°—‘˜˜3™–±g‘©"ˆÑ>Ý)Þ,1‘œŸš ›Ô(°tˆÞ8:”Ñ4±Ó4Ô4ÀˆÛˆAØ�v‰vœÓ#¡XØ—6‘6—=‘= Ñ# AÑ&¨°©Ñ4ˆDÜ˜1—:‘:™xÜ" 1§9¡9Ö-‘�Ø—G‘G˜B˜s™GÓ$�Ø‘=¨×(>Ñ(>¸qÀ#×(FÓ(FÈÏ
É
Ö^bÑTZÐhpÐrsÐSwÖHxó .ñ	 ñ +-Ô@ª" Q·iµi°—‘˜˜3™–±i‘©"ˆÑ@Þ,1‘œŸš ›Ô(°tˆØ¨2õ Hª2 a·±¼zÑ1IÓ!ÔV_Ô`nÐopÓ`q×VrÉdÈaÐQRØ‘=¨×(>Ñ(>¸qÀ#×(Fó "�˜A˜qÓ!ÑVrÑ!©2ó Hñ 	Hˆä˜R“ˆØ¨Õpª 1´yÄÈ1Ï6É6ÓAR×7S©t¨q°!ÔXZÐ[\ÓX]Ð_`ÐWaÐioÑWo“�˜˜A“Ñ7S‘©ÓpÑpˆØÌ\ÐZ\ÔbiÐjkÐmxÐz~Óbò  NAó  Bò  NAÈ�œ) A›,¬¨q°©t«´e¸A¸a¹D³kÐ(BÓCñ  NAñ  Bñ  	BˆØ—\‘\“^Ñ#Ð#ùò' VùÛ>ùó AùôHùô qùò Bs<   ÁM Á M Á=0MÆ80MÈM
È13M
É(M
Ê:M
ËM
Ë72Mc                 ó˜  ^• / U R                  5       p!U Vs/ s H'  o3R                  S:X  d  M  UR                  SS2S4   PM)     nnU Hx  nUR                  S:w  a  M  [        U R                  5       HJ  u  pVUR                  U-  SS2S4   m[        U4S jU 5       5      (       a  M7  UR                  SX545        ML     Mz     U$ s  snf )zGfree tyre slots: each bare wheel on a 122c01 that has no tyre on it yetrZ   Nr›   r	   c              3   ón   >#   • U  H*  n[         R                  R                  TU-
  5      S :  v •  M,     g7f)r   Nrç   )r   rC   r°   s     €r"   r#   Ú"Reef.tyre_slots.<locals>.<genexpr>ò   s'   øé € ÐFÂ¸1œ2Ÿ9™9Ÿ>™>¨!¨a©%Ó0°3Ö6Âùré   Útyre)r¬   rA   r�   r¦   Ú
TYRE_SLOTSr=   r?   )rÈ   r‡   rO  rŸ   Útyresr    r   r°   s          @r"   rN  ÚReef.tyre_slotsë   sµ   ø€ à�a—h‘h“jˆR¹rÓ*Vºr¸!ÇVÁVÈvÑEU«:¨1¯3©3¨r°¨r°1¨u¬:¹r %Ð*VÛˆAØ�v‰v˜Ó!¡8Ü! !§,¡,Ö/‘�Ø—S‘S˜1‘W˜b˜q˜b !˜eÑ$�ÜÔFÁÓF×FÓFÈÏ
É
ÐTZÐ\]ÐSaÖHbó 0ñ ð
 ˆ
ùò +Ws
   —C®Cc           	      óÒ  • SSK n[        R                  " U[        5      [        R                  R                  U5      -  n[        R                  " U[        5      [        R                  R                  U5      -  n[        R                  " Xx5      n	[        Xx-  5      n
[        R                  R                  U	5      S:  a_  U
S:”  a  [        R                  " S5      OAUR                  R                  [        R                  [        US   5      S:  a  / SQO/ SQ5      nOFUR                  R                  [        R                  " [        R                  " U
SS	5      5      U	5      nUR                  R                  [        R                  " U5      U5      U-  nU[        R                  US	4   -  SS
 oËSS
2S
4==   [        R                  " U5      U-
  -  ss'   X°l        SU l        g)ztplace new so its local_axis points along world_axis (spun about it by `spin` degrees) and local_pt lands on world_ptr   Ng•Ö&è.>rÃ   çÍÌÌÌÌÌì?)r   r   r   )r   r   r   r�   r   r›   T)Útrimeshr   r   r(   r   r   ÚcrossrÇ   ÚtransformationsÚrotation_matrixÚpir)   ÚarccosÚclipÚradiansÚr_r�   Úattached)r=  Úlocal_ptÚ
local_axisÚworld_ptÚ
world_axisÚspinr`  r±   rŸ   rî   r   ÚRrB   s                r"   ÚalignedÚReef.alignedô   s}  € ó 	Ü�JŠJ�z¤5Ó)¬B¯I©I¯N©N¸:Ó,FÑFˆÌBÏJÊJÐWaÔchÓLiÔln×luÑlu×lzÑlzð  |Fó  mGñ  MGÈÜ�HŠH�Q‹Nˆ¤ a¡e£˜AÜ�9‰9�>‰>˜!Ó˜tÓ#Ø ›U”—’�q”	¨×(?Ñ(?×(OÑ(OÔPR×PUÑPUÔdgÐhiÐjkÑhlÓdmÐpsÓdsÓW`ò  zCó  )D‰AØ×)Ñ)×9Ñ9¼"¿)º)ÄBÇGÂGÈAÈrÐSTÓDUÓ:VÐXYÓZˆaØ×#Ñ#×3Ñ3´B·J²J¸tÓ4DÀaÓHÈ1ÑLˆØ”—‘�x �{Ñ#Ñ# R aÐ(ˆ¨B¨Q¨B°¨E«(´b·j²jÀÓ6JÈQÑ6NÑ*N«(ÐXYÔPUÐjnÐ[^Õ[gr0   c                 óL  • SSK nUR                  R                  [        R                  " U5      / SQ5      nU[        R
                  UR                  U   S   S4   -  SS o‡R                  5       o™SS2S4==   UR                  UR                  U   S   5      U-
  -  ss'   X“l
        SUl        U R                  R                  R                  R                  U5        U R                  R                  R                   R                  UR"                  UR"                  S45        g)	zenew piece UNDER host: new's stud j pressed up into host's socket k, both upright, spun about verticalr   N©r   r   r   r   r   r›   TÚunder)r`  rb  rc  r   rg  rh  r2   Úcopyrê   r>   r�   ri  r   r)  r<  r?   r   rA   )
rÈ   Úhostr    r=  Újrn  r`  ro  Úscr�   s
             r"   rt  Ú
Reef.underÿ   sâ   € ãØ×#Ñ#×3Ñ3´B·J²J¸tÓ4DÂiÓPˆØ”"—%‘%˜Ÿ	™	 !™ SÑ)¨1Ð,Ñ-Ñ-¨r°Ð2ˆ¿¹»°AÀBÀQÀBÈÀEÃ(ÈdÏjÉjÐY]×YeÑYeÐfgÑYhÐilÑYmÓNnÐqsÑNsÑBsÃ(ØŒ $�3”<¨¯©¯©¯©×(<Ñ(<¸SÔ(AÀ1Ç3Á3Ç7Á7Ç=Á=×CWÑCWÐY]×YbÑYbÐdg×dlÑdlÐnuÐXvÕCwr0   c                 ó�  • [        U SS5      (       d  U R                  R                  U5      $ UR                  o"R                  nU R                  5        Hî  nXAL a  M	  UR                  oUR                  nUS   US   S-   :„  R                  5       (       d!  US   US   S-   :„  R                  5       (       a  Md  [        R                  " US   US   5      S-   [        R                  " US   US   5      S-
  p‡X‡:*  R                  5       (       a  M¼  [        R                  R                  XRSS9[        R                  :”  d  Mî    g	   g
)zxthe engine's own check, but with fewer sample points while previewing ghosts (s.quick); placing always does the full oneÚquickFr   r   çš™™™™™¹?r_  i^  )ÚnÚcollidesN)r;  r   r~  r  r;   r¬   r=   r   ÚmaximumÚminimumrÅ   ÚAssemblyÚpenetrationÚ	DEPTH_TOL)	rÈ   r=  rŠ   ÚbnrŸ   ÚmbÚbprý   rþ   s	            r"   r~  ÚReef.collides  s	  € ä�q˜' 5×)Ñ)°!·#±#·,±,¸sÓ2CÐ+CØ�H‰HˆŸ8™8�bØ—‘–ˆAØŠx™Ø—‘ˆBŸi™i˜Ø�1‘˜˜1™ ™Ñ#×(Ñ(×*Ñ*¨r°!©u°r¸!±u¸s±{Ñ/B×.GÑ.G×.IÑ.IÉ8ä—Z’Z  1¡ r¨!¡uÓ-°Ñ3´R·Z²ZÀÀ1ÁÀrÈ!ÁuÓ5MÐPSÑ5S�Ø‘�~‰~×Ñ¡Ü�z‰z×%Ñ% b¨sÐ%Ð3´a·k±kÕAÉ*ñ ð r0   c                 ó¦  • U R                   n[        R                  " U5      n[        UR                  R
                  5      nU R                  5       oˆ(       a  [        S U 5       5      OSn	US   S:H  US:H  :w  a  gUS   S:X  GaÍ  US   R                  U R                  US      -  Ul        SUl
        SUl        UR                  R
                  R                  U5        UR                  R                  R                  US   R                  SS45        U R                  5        V
s/ s GH  oªULd  M
  X¡S   Ld  M  U
R                  S:w  d  M%  U
R                  R                   S   UR                  R                   S   S	-   :„  R#                  5       (       a  Mp  UR                  R                   S   U
R                  R                   S   S	-   :„  R#                  5       (       a  M»  [        R$                  R'                  U
R                  UR                  5      [        R(                  :”  d  GM  U
PGM	     nn
U(       a  UR+                  Xg5        gXg4$  US   S
:X  am  UR,                  (       d  gUR                  R/                  US   US   R,                  US      XfR,                  U[        UR,                  5      -     US   US9  G	O"US   S:X  Ga  UR0                  (       d  gSSKnUR4                  R7                  [8        R:                  " U5      / SQ5      oÖR0                  U[        UR0                  5      -     nUSS2S4==   US   R<                  U[8        R>                  US   S4   -  SS -
  -  ss'   XÖl        SUl
        UR                  R
                  R                  U5        UR                  R                  R                  SUR                  S45        GO	US   S:X  Ga  [A        U5      (       d  g[C        US   5      nUS   [        U5      :¼  a  gSSKnUR4                  R7                  [8        R:                  " U5      / SQ5      oÖR0                  S   nUSS2S4==   XñS      U[8        R>                  US   S4   -  SS -
  -  ss'   XÖl        SUl
        UR                  R
                  R                  U5        UR                  R                  R                  US   R                  UR                  S45        GOáUS   S:X  Ga¾  [E        US   R                  5      US      n[G        [E        U5      5       VVVs/ s HH  u  nn[H        RJ                  " UU5      =(       d    [H        RJ                  " UU5      nU(       d  MD  UU4PMJ     nnnnU(       d  gUU[        U5      -     u  nu  nnU=(       a    U[        U5      -  S-  S:H  nU(       d  UO[M        UU-  5      U-  n[E        U5      U   nS/nSURO                  S5      URO                  S5      4;   =(       d%    SURO                  S5      URO                  S5      4;   nU(       aJ  [Q        U5      [Q        U5      -   S-  nUS:”  a(  [S        [8        RT                  " U* US-   S5      [V        S9OUnUS[        U5      -  -  S-  nU(       a  [Q        U5      [Q        U5      -
  S-  OSnU(       a  [W        U5      S:”  a  US:X  a  UOU* /nU H`  n[H        RX                  " UUUS   R                  UU[[        U5      5      Ul        [        U5      S:X  d  U R]                  U5      (       a  M`    O   SUl
        UR                  R
                  R                  U5        UR                  R                  R                  US   R                  UR                  S45        GOUS   S:X  Ga  [G        UR^                  5       VV s/ s H  u  nn U S   S   S:”  d  M  UPM     n!nn U!(       d  g[        S  U R                  5        5       5      n"U Ra                  US   US   UU!U[        U!5      -     U5        U"UR                  R                   S   S   -
  n#U#S!::  a  UR                  R
                  US2	 gUR                  R
                   H  n$U$R                  S"==   U#-  ss'   M     U#Ul1        GO	US   S#:X  al  [G        UR^                  5       VV s/ s H  u  nn U S   S   S:”  d  M  UPM     n!nn U!(       d  gU Ra                  US   US   UU!U[        U!5      -     U5        GO”US   S$:X  Ga  UR^                  (       d  gUS   R,                  US      n%US   Re                  U%S   5      US   -  n&US   Rg                  U%S   5      U&U%S%   -  S-  -   n'UR^                  U[        UR^                  5      -     n(U Ri                  UU(S   U(S   U'U&* U5        UR                  R
                  R                  U5        UR                  R                  R                  US   R                  UR                  S&45        GO{US   S':X  Ga&  US   Re                  US   R^                  US      S   5      S   S:  aõ  UR0                  (       d  gUS   R^                  US      n(UR0                  U[        UR0                  5      -     nU Ri                  XnS   / SQUS   Rg                  U(S   5      US   Re                  U(S   5      U5        UR                  R
                  R                  U5        UR                  R                  R                  US   R                  UR                  S(45        OKUR0                  (       d  gUR                  Rk                  XaS   U[        UR0                  5      -  US   US)9   U R]                  U5      (       a  UR+                  Xg5        gU	bø  [o        US*S+5      (       dæ  UR                  [p        ;  aÒ  UR                  R                   S   S   U	S,-
  :  a¯  US   S-;   a”  US   R                  R                   S   S   U	S,-   :  an  [o        US.S5      (       d\  X–R                  R                   S   S   -
  n#UR                  R
                   H  n$U$R                  S"==   U#-  ss'   M     U#Ul1        Xg4$ UR+                  Xg5        gXg4$ s  sn
f s  snnnf s  sn nf s  sn nf ! [l         a    UR                  R
                  US2	  gf = f)/zSapply one legal move; returns (new part, n_before) or None. Caller undoes or keeps.c              3   óX   #   • U  H   oR                   R                  S    S   v •  M"     g7fr  r  r  s     r"   r#   Ú Reef.try_move.<locals>.<genexpr>  s    é € Ð&HÂC¸q§v¡v§}¡}°QÑ'7¸Ö':ÂCùr  Nr   rZ  rZ   r   r   Tr|  rB  r›   )Úsidern  r  rs  r   Ú	baseplater2   rH  rI  r   ÚnoneÚcapsÚclpr   ç�íµ ÷Æ°>gš™™™™™é?©ÚkeyrŒ   rF  r   r   c              3   óX   #   • U  H   oR                   R                  S    S   v •  M"     g7fr  r  r  s     r"   r#   rŠ  O  s    é € ÐDº°AŸF™FŸM™M¨!Ñ,¨QÖ/ºùr  r¥   r:  rG  rC  Úface_lenzstud-in-holeÚstudzstuds, sideways)Ú	socket_ixÚstud_ixrn  Úis_pinFr   )rI  rB  rC  r9  )9r   rÅ   rÆ   r*   r)  r<  r¬   r+   r�   r[  ri  rÐ   r?   r   rA   r  r;   r=   r�  r‚  rƒ  r-  r9   Úpinr>   r`  rb  rc  r   rg  rÄ   rh  rÿ   rñ   r‘   r¦   r4   rª   rõ   r˜   r™   Úsortedr  r)   r*  r(   r~  r2   rt  r9  rÞ   rê   rp  Ústackr8   r;  rL  ))rÈ   r   rA   Úidxrn  r   r=  r>  Úbs0Úfloor0rŸ   Úbadr`  ro  rQ  ÚptsÚhdrw  Úndr    ÚcompatÚstepÚmay_flipÚflipÚspÚslidesÚslidabler†   Úmoder   Úslr­   rC   Úupsr  r?  rã   rF   Úout_dirÚfaceÚsts)                                            r"   Útry_moveÚReef.try_move  sg  € à�C‰Cˆ”q—w’w˜t“}�¬3¨q¯u©u¯{©{Ó+; bØ�h‰h‹jˆÍC¤3Ñ&HÁCÓ&HÔ#HÐUY˜&Øˆa‰D�F‰N ¨¡Ó/¸ØˆQ‰4�6Œ>Ø�a‘D—F‘F˜QŸ\™\¨!¨A©$Ñ/Ñ/ˆCŒEÀ°´ÐSTÀcÄjØ�E‰E�K‰K×Ñ˜sÔ# Q§U¡U§[¡[×%7Ñ%7¸¸1¹¿¹ÀFÈFÐ8SÔ%TØŸh™hœjó O›j˜°S¨L“1¸QÈÁd¸]“1ÈqÏvÉvÐY_ÑO_“1ØŸV™VŸ]™]¨1Ñ-°·±·±ÀÑ0BÀSÑ0HÑH×MÑM×Oó ØTW×T\ÑT\×TcÑTcÐdeÑTfÐij×ioÑio×ivÑivÐwxÑiyÐ|ÑiÑT÷  TEñ  TE÷  TGó ä—z‘z×-Ñ-¨a¯f©f°c·h±hÓ?Ä!Ç+Á+ÑM÷ ‘1™jˆCð Oö �A—F‘F˜3”O¨DØ�7ˆNðH	.Ø�‰t�v‹~Ø—y—y¨Ø—‘—	‘	˜!˜A™$  !¡§
¡
¨1¨Q©4Ñ 0°#·y±yÀÄsÈ3Ï9É9Ã~ÑAUÑ7VÐ]^Ð_`Ñ]aÐhl�	ÓmØ�1‘˜”Ø—{—{¨4ÛØ×+Ñ+×;Ñ;¼B¿JºJÀtÓ<LÊiÓX�×_jÑ_jÐknÔqtÐux÷  vAñ  vAó  rBñ  lBñ  `CÐZ\Ø�"�1�"�a�%“˜A˜a™DŸG™G q¬2¯5©5°°C±¸!°Ñ+<Ñ'<¸b¸qÐ&AÑAÑA“È1Ä5Ð]aÈcÌlØ—‘—‘×"Ñ" 3Ô'¨¯©¯©×);Ñ);¸[È#Ï(É(ÐT[Ð<\Ö)]Ø�1‘˜Ô"Ü  —‘¨tÜ$ Q q¡TÓ*�Ø�Q‘4œ3˜s›8Ó#¨DÛØ×+Ñ+×;Ñ;¼B¿JºJÀtÓ<LÊiÓX�×_jÑ_jÐklÑ_mÐZ\Ø�"�1�"�a�%“˜C !¡™I¨¬R¯U©U°2°c±7¸A°:Ñ->Ñ)>ÀÀÐ(CÑCÑC“ÈQÄUÐ_cÐPSÔP\Ø—‘—‘×"Ñ" 3Ô'¨¯©¯©×);Ñ);¸Q¸q¹T¿Y¹YÈÏÉÐR[Ð<\Ö)]Ø�1‘˜”Ü˜q ™tŸy™yÓ)¨!¨A©$Ñ/�Ü.7¼	À$»Ô.HÕ|Ò.H¡U Q¨ÔSU×SZÒSZÐ[]Ð_aÓSb×SuÔfh×fmÒfmÐnpÐrtÓfuÈQÔz{›&˜1˜a›&Ñ.H�Ò|Þ dØ&,¨S´3°v³;Ñ->Ñ&?Ñ#�Ñ#�D˜(Ø×A S¬C°«KÑ%7¸1Ñ$<ÀÑ$A�Þ!%‘T¬5°¸±Ó+=ÀÑ+D�Ü˜t“_ QÑ'�ð ˜�Ø! b§f¡f¨V£n°b·f±f¸V³nÐ%EÑE×rÈÐSU×SYÑSYÐZ`ÓSaÐce×ciÑciÐjpÓcqÐRrÑIr�ÞÜ" 2›¬°2«Ñ6¸!Ñ;�AØNOÐRSËeœV¤B§I¢I¨q¨b°!°d±(¸CÓ$@ÄcÒJÐY_�Fð  ¤C¨£K¡Ñ0°AÑ5�Þ;C”Y˜r“]¤Y¨r£]Ñ2°aÒ7È�ÞœC ›F S›L¸À»±AÈÈÐ3K¨&Û �BÜŸHšH R¨¨Q¨q©T¯V©V°R¸¼uÀR»yÓI�C”EÜ˜6“{ aÓ'¨q¯z©z¸#¯«Áñ !ð  $�”Ø—‘—‘×"Ñ" 3Ô'¨¯©¯©×);Ñ);¸Q¸q¹T¿Y¹YÈÏÉÐRXÐ<YÖ)ZØ�1‘˜”Ü%.¨s¯y©yÔ%9ÔQÒ%9™T˜Q ¸Q¸v¹YÀq¹\ÈDÑ=P—qÑ%9�ÑQÞ 4ÜÑD¸¿¹¼ÓDÓD�Ø—‘˜˜!™˜a ™d C¨¨S´3°s³8©^Ñ)<¸dÔCØ˜SŸX™XŸ_™_¨QÑ/°Ñ2Ñ2�Ø˜“: 1§5¡5§;¡;¨r©sÐ#3¸DØŸ™Ÿœ�A a§c¡c¨$£i°2¡o¥i™Ø�–	Ø�1‘˜Ó!Ü%.¨s¯y©yÔ%9ÔQÒ%9™T˜Q ¸Q¸v¹YÀq¹\ÈDÑ=P—qÑ%9�ÑQÞ 4Ø—‘˜˜!™˜a ™d C¨¨S´3°s³8©^Ñ)<¸dÖCØ�1‘˜Ô#Ø—y—y¨Ø�a‘D—J‘J˜q ™tÑ$�°°!±·±¸qÀ¹yÓ0IÈAÈaÉDÑ0P gØ˜‘t—z‘z ! C¡&Ó)¨G°a¸
±mÑ,CÀaÑ,GÑG�ÈcÏiÉiÐX[Ô^aÐbe×bkÑbkÓ^lÑXlÑNmÈØ—	‘	˜#˜r #™w¨¨6©
°D¸7¸(ÀDÔIÈ1Ï5É5Ï;É;×K]ÑK]Ð^aÔKbÐde×diÑdi×doÑdo×dvÑdvÐxyÐz{Ñx|÷  yBñ  yBð  DG÷  DLñ  DLð  N\ð  x]ö  e^Ø�1‘˜” A a¡D§N¡N°1°Q±4·:±:¸aÀ¹dÑ3CÀFÑ3KÓ$LÈQÑ$OÐRVÓ$VØ—{—{¨4Ø�q‘T—Z‘Z  !¡Ñ%�¨C¯K©K¸¼cÀ#Ç+Á+Ó>NÑ8NÑ,O rØ—	‘	˜# #™wª	°1°Q±4·:±:¸bÀ¹gÓ3FÈÈ!ÉÏÉÐWYÐZ`ÑWaÓHbÐdhÔiØ—‘—‘×"Ñ" 3Ô'¨¯©¯©×);Ñ);¸Q¸q¹T¿Y¹YÈÏÉÐRcÐ<dÕ)eà—{—{¨4Ø—‘—‘˜C 1¡°´s¸3¿;¹;Ó7GÑ1GÐQRÐSTÑQUÐ\`�Òað �:‰:�c�?‰?˜AŸF™F 3œO°Dð Ñ¤g¨c°8¸U×&CÑ&CÈÏÉÔXbÓHbÐgj×goÑgo×gvÑgvÐwxÑgyÐz{Ñg|ð  @Fð  ILñ  @Ló  hLð
 �‰tÐ3Ó3¸¸!¹¿	¹	×8HÑ8HÈÑ8KÈAÑ8NÐQWÐZ]ÑQ]Ó8]ÔfmÐnqÐszÐ|÷  gAñ  gAØŸh™hŸo™o¨aÑ0°Ñ3Ñ3�ØŸ™Ÿœ�A a§c¡c¨$£i°2¡o¥i™Ø�”	ð ˆwˆð —‘�s”¨Øˆwˆùò{Oùô2 }ùó4 Rùó Røô  ó 	.Ø—‘—‘˜B™CÐ ©ð	.úsþ   Ä'	tÄ4tÄ=tÅAtÆAtÇ%AtÈ.tÉt* É/At* Ë
t* Ë&C;t* Ï#t* Ï> t* ÐC*t* ÔA t* ÕAtÖtÖt* Ö&F8t* Ý"A/t* ß"t* ß5tàtà
t* àBt* â&;t* ã#!t* ät$ät$ä!
t* ä,*t* åt* å4C;t* é1At* ê>C"t* î!t* î38t* ôt* ô*#uõuNc                 ó:	  ^• / [        5       peU R                  5       nU Vs/ s H  oˆS   S:X  d  M  UPM     n	nU Vs/ s H  oˆS   S:w  d  M  UPM     nnU	(       a:  U(       a3  Xy[        U R                  R	                  [        U	5      5      5         /-  nU Vs/ s H  oˆS   S:X  d  M  UPM     n
n[        U
5      S:”  ag  U Vs/ s H  oˆS   S:w  d  M  UPM     sn[        S5       Vs/ s H2  oº[        U R                  R	                  [        U
5      5      5         PM4     sn-   nU Vs/ s H  oˆS   R                  [        ;   d  M  UPM     nnU(       a‰  U Vs/ s H  oˆS   R                  [        ;  d  M  UPM     nnU(       a%  U(       aQ  U R                  R                  5       S:  a3  X|[        U R                  R	                  [        U5      5      5         /-  n[        U5       GH�  n[        U5      U:¼  a    U$ U(       d    U$ XpR                  R	                  [        U5      5         mU=(       d    [        oÝU R                  R	                  [        U5      5         n[        U R                  R	                  S5      5      n[        U R                  R                  [        R                  5      5      nU R                  TXïU5      nU(       d  Mí  Uu  nnU[!        ["        R$                  " UR&                  S	S2S4   S5      5      [!        ["        R$                  " UR&                  S	S2S	S24   R)                  5       S5      5      4nU R*                  R,                  R.                  US	  Vs/ s H1  n[1        US
S5      (       d  M  UR&                  R3                  5       PM3     nnTS   R                  [        ;   nUU;  a…  TS   S;   a  [5        U4S jU 5       5      (       db  U(       a  [5        S U 5       5      (       dD  UR7                  U5        UR9                  TXïUTS   UR&                  R3                  5       US.5        U R*                  R;                  UU5        GM„     U$ s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )z[up to k distinct legal moves (not committed): each (conn, name, idx, spin, host, T, pins_T)r   r  rI  rŽ   r›   r   gÃõ(\�ÂÕ?é   Nr˜  F)r  rF  c              3   ó>   >#   • U  H  oS    S   TS   :H  v •  M     g7f)Úconnr   NrÁ   )r   rŠ   r   s     €r"   r#   ÚReef.propose.<locals>.<genexpr>—  s'   øé € ÐIlÒhkÐcdÈFÉ)ÐTUÉ,ÐZ[Ð\]ÑZ^ÖJ^Òhkùs   ƒc              3   óL   #   • U  H  oS    R                   [        ;   v •  M     g7f)rv  N)rA   rL  )r   rŠ   s     r"   r#   r¶  ˜  s   é € Ð,WÒSVÈa¨v©Y¯^©^¼zÖ-IÒSVùs   ‚"$)rµ  rA   rœ  rn  rv  r�   Úpins)r§   rU  r'  r#  Úintegersr*   ÚrangerA   rL  r!  ÚPALETTEr(   ÚchoicerÅ   ÚSPINSr°  Útupler   rõ   r�   Úravelr   r)  r<  r;  ru  r=   Úaddr?   r-  )rÈ   r    ÚtriesÚpoolr  r‡   ÚseenrU  r   ÚflÚsnr  r†  ÚsrcrA   rœ  rn  rˆ   r=  r>  r’  rB   r¸  Úonplates           `               r"   ÚproposeÚReef.proposex  s²  ø€ àœ›ˆT q§w¡w£y˜uÙÓ2š�A A¡$¨'¡/�a™ˆÐ2ñ "Ó5šE�q q¡T¨W¡_—™EˆÐ5Þ–%˜¤c¨!¯%©%¯.©.¼¸R»Ó*AÓ&BÑ#CÐ"DÑD˜ñ
 Ó1š�A A¡$¨&¡.�a™ˆÐ1Üˆr‹7�Q‹;Ù %Ó8¢˜1¨1©°©—Q¡Ñ8ÔfkÐlmÔfnÓ;oÒfnÐab¼sÀ1Ç5Á5Ç>Á>ÔRUÐVXÓRYÓCZÓ?[Ô<\ÑfnÑ;oÑoˆEÙÓ:š�A A¡$§)¡)¬zÑ"9�a™ˆÐ:ÞÙ %ÓE¢˜1¨1©¯©¼*Ñ)D—Q¡ˆEÐEÞžU q§u¡u§|¡|£~¸Ó'<¸uÌCÐPQ×PUÑPU×P^ÑP^Ô_bÐceÓ_fÓPgÓLhÑIiÐHjÑ?j¸uÜ�u—ˆAÜ�3‹x˜1‹}˜eð ˆ
ö ˜%ð ˆ
ð —e‘e—n‘n¤S¨£ZÓ0Ñ1ˆA¸¿Ä°3ÐUV×UZÑUZ×UcÑUcÔdgÐhkÓdlÓUmÑQnÈ$Ü�a—e‘e—n‘n QÓ'Ó(ˆC´°q·u±u·|±|ÄAÇGÁGÓ7LÓ1M¨$Ø—
‘
˜1˜d¨Ó.ˆAÞ‘hØ‰GˆC�ØœœrŸxšx¨¯©¨b¨q¨b°!¨e©°aÓ8Ó9¼5ÄÇÂÈ#Ï%É%ÐPRÐQRÐPRÐTVÐUVÐTVÐPVÉ-×J]ÑJ]ÓJ_ÐabÓAcÓ;dÐeˆCØ()¯©¯©¯©°b°cÑ(:ÓZÒ(: 1¼gÀaÈÐSX×>Y“J�A—C‘C—H‘H–JÑ(:ˆDÐZØ˜‘d—i‘i¤:Ñ-ˆGØ˜$‹¨¨!©Ð0AÓ(AÄcÔIlÑhkÓIl×FlÑFlÞ$¬Ñ,WÑSVÓ,W×)WÑ)WØ—‘˜”˜sŸz™z°1¸dÐX\ÐfgÐhiÑfjÐqt×qvÑqv×q{Ñq{Óq}ð  HLñ  +Mô   NØ�C‰C�H‰H�S˜"×ñ ð ˆ
ùòA 3ùò 6ùò 2ùâ8ùÒ;oùÚ:ùâEùò [sW   ¡Q5±Q5½Q:ÁQ:ÂQ?Â*Q?ÃRÃRÃ*9R	Ä,RÅ
RÅRÅ;RÍ7RÎRc                 óü   • SSK Jn  U" S5      oDR                  US   R                  US   R                  SS9  UR                  US   US   S	S9  US
    H  oTR                  SUSS9  M     UR                  U5        g)znhost grey 71 + candidate red 4 + its pins, so relations.py / the rulers measure the new piece against its hostr   )ÚModelÚpairrv  éG   )ÚrotrÐ   rA   r�   rÃ   r¸  Ú2780N)ÚbuildrË  rÀ  rA   r�   Úwrite)rÈ   rŠ   ÚpathrË  r   r�   s         r"   Úpair_ldrÚReef.pair_ldrœ  sr   € åÙ�&‹MˆŸ5™5  6¡§¡°Q°v±Y·[±[È˜5ÑLÈaÏeÉeÐTUÐV\ÑT]ÐcdÐehÑciÐrsÈeÑNtØ�6”ˆAŸE™E &¨a¸˜EÓ:‘Ø	�‰��r0   c                 ó:  • U R                  5       n[        R                  " US   5      o1S   Ul        U Vs/ s H  oDR                  PM     snUR                  /-   n[
        R                  " U Vs/ s H  ofR                  S   PM     snS5      n[
        R                  " U Vs/ s H  ofR                  S   PM     snS5      nUS   R                  R                  n	[
        R                  " U Vs/ s H  ofR                  PM     sn5      n
[
        R                  " U Vs/ s H  ofR                  R                  S5      PM     sn5      nU
S S 2S 4   U-  R                  S5      U
R                  5       -  n[        SUS   U	S   S   -
  U	S   S   US   -
  5      n[        SUS   U	S   S   -
  U	S   S   US   -
  5      n[
        R                  " U Vs/ s H  oDR                  PM     sn Vs/ s H  ofR                  R                  S5      PM     sn5      R                  S5      n[        [        US   US   -
  5      S5      US   US   -
  S-  S SUS   US   -
  S-  S 3[        [        [
        R                   R#                  UR                  R                  R                  S5      U-
  5      5      S-  S5      [        [        [
        R$                  " XÞ5      5      S5      ['        U5      S-   S	.$ s  snf s  snf s  snf s  snf s  snf s  snf s  snf )
NrA   r�   r   r   r   r³  z.1fz x )zbuild height after, mmzbuild footprint after, studsz/new piece distance from the build centre, studsz:build centre of mass outside the first piece footprint, mmzpieces in the build after)r¬   rÅ   rÆ   r�   r  r   r+   r;   r  r<   Úarear@   Úmeanr—   rõ   r(   r   r   Úhypotr*   )rÈ   rŠ   rO  r=  rB   Úmeshesr”   rý   rþ   ÚbaseÚareasÚcentsÚcomÚout_xÚout_yr·   s                   r"   Úbuild_numbersÚReef.build_numbers¢  së  € Ø�X‰X‹ZˆœqŸwšw q¨¡yÓ1˜¸S¹6°3´5Ù"$Ó%¢"˜Q—&”&¡"Ñ%¨¯©¨
Ñ2ˆÜ�VŠV©&Ó1ª& Q—X‘X˜a”[©&Ñ1°1Ó5ˆ¼B¿FºFÑY_ÓC`ÒY_ÐTUÇHÁHÈQÄKÑY_ÑC`ÐbcÓ<d°rØ�!‰u�z‰z× Ñ ˆ¬"¯(ª(ÁFÓ3KÂF¸q·F´FÁFÑ3KÓ*L %ÔVX×V^ÒV^ñ  }Có  `Dò  }CÐwx×`jÑ`j×`oÑ`oÐpqÖ`rñ  }Cñ  `Dó  WEÈeØ’Q˜�W‰~ Ñ%×*Ñ*¨1Ó-°·	±	³Ñ;ˆÜ�A�s˜1‘v  Q¡¨¡
Ñ*¨D°©G°A©J¸¸Q¹Ñ,?Ó@ˆÌ#ÈaÐQTÐUVÑQWÐZ^Ð_`ÑZaÐbcÑZdÑQdÐfjÐklÑfmÐnoÑfpÐsvÐwxÑsyÑfyÓJzÀ%Ü�XŠXÁBÓ3GÂB¸q·F´FÁBÒ3GÓHÒ3G¨a—z‘z—‘ qÖ)Ñ3GÑHÓI×NÑNÈqÓQˆÜ*/´°b¸±e¸bÀ¹e±mÓ0DÀaÓ*HØ46°q±E¸B¸q¹E±MÀQÑ3FÀsÐ2KÈ3ÐPRÐSTÑPUÐXZÐ[\ÑX]ÑP]ÐabÑObÐcfÐNgÐ0hÜCHÌÌrÏyÉyÏ~É~Ð^a×^fÑ^f×^oÑ^o×^tÑ^tÐuvÓ^wÐz|Ñ^|ÓO}ÓI~ð  BCñ  JCð  EFó  DGÜNSÔTYÔZ\×ZbÒZbÐchÓZpÓTqÐstÓNuÜ-0°«W°q©[ñ	:ð 	:ùò &ùÚ1ùÒC`ùÚ3Kùò  `Dùò 4HùÒHs)   ·K:Á1K?Â%LÃ2L	Ä"$LÇLÇ1$Lc                 óÆ  • U R                    SU S3o0R                  X5        [        R                  R	                  [        R                  5      n[        R
                  " U5      oU Vs/ s H  ofS   S:X  d  M  UPM     snS   ou Vs/ s H  ofS   S:X  d  M  UPM     snS   nX4l        [        R                  " US   US   5      [        R                  " US   US   5      sUl        Ul	        [        S U 5       5      Ul        UR                  R                  b$  UR                  R                  R                  5       O[        R                  " / S	Q5      n	SU	S'   [        R                   R#                  U	5      S
:  a  [        R                  " / S	Q5      n	U	[        R                   R#                  U	5      -  Ul        [        R                  " / SQ5      Ul        [        R(                  " UR&                  UR$                  5      Ul        [-        U5      Ul        0 n
U R0                   H3  n[3        [5        UR7                  U5      5      S5      X«R8                  '   M5     [=        U5      R?                  SS5      R?                  SS5      [@         Vs0 s H  oÌUR.                  U   _M     snU
U RC                  U5      S.$ s  snf s  snf ! [:         a     M¯  f = fs  snf )Nz/cand_ú.ldrr   rÍ  rÃ   r   r   c              3   ó0   #   • U  H  oS    S:H  v •  M     g7f)r   rÏ  NrÁ   )r   rB   s     r"   r#   Ú Reef.describe.<locals>.<genexpr>´  s   é € Ð]|Òv{ÐqrÐ`aÑ^bÐflÖ^lÒv{ùs   ‚)r   r   r   r�  )r   r   r   r›   ÚgreyÚexistingÚredr=  )Údescriptionz'measurements against the piece it joinszmore measurementszthe whole build)"r‡   rÓ  rø   ÚCtxÚ__new__Úreadr«   ÚPieceræ  rè  r—   r¸  Úlongru  r   r<   r   r   ÚalongÚupra  ÚacrossrJ   Úrelr+  rõ   r(   ÚmeasureÚCLAIMr8   rI   rû   rK   rà  )rÈ   rŠ   r­   rÒ  r   r<  rB   r   rˆ   ÚlaÚmorerh  Úg_s                r"   ÚdescribeÚReef.describe¯  s?  € Ø—%‘%�˜˜q˜c Ð&ˆ¯
©
°1Ô(;Ü�F‰F�N‰Nœ2Ÿ6™6Ó"ˆä—’˜“ˆ¨uÓ#Cªu¨!¸!¹À¹
§A©uÑ#CÀAÑ#F˜qÐX]ÓLkÒX]ÐSTÐcdÑaeÐijÑajÏQÑX]ÑLkÐlmÑLnÈØŒ¤R§X¢X¨a°©d°A°a±DÓ%9¼2¿8º8ÀAÀaÁDÈ!ÈAÉ$Ó;O�]�Q”V˜QœUÔZ]Ñ]|Ñv{Ó]|ÓZ|ÐQRÔQWØ#$§6¡6§;¡;Ñ#:ˆQ�V‰V�[‰[×ÑÔÄÇÂÊÓ@UˆÐ_`ÐWYÐZ[ÑW\Ü�9‰9�>‰>˜"Ó Ó$¬2¯8ª8²KÓ+@ bØ”r—y‘y—~‘~ bÓ)Ñ)ˆŒ´"·(²(º;Ó2G¨1¬4ÔTV×T\ÒT\Ð]^×]aÑ]aÐcd×cjÑcjÓTkÈÌÔu~ð  @Dó  vEÐmnÔmrØˆØ—(”(ˆBÜ"'¬¨b¯j©j¸«mÓ(<¸aÓ"@�—h‘h“ñ ô  % T›{×2Ñ2°6¸:ÓF×NÑNÈuÐV[Ó\ÝTZÓ;[ÒTZÈbÀÇÁÀbÁ	ºMÑTZÑ;[ÐrvØ#$§?¡?°1Ó#5ñ7ð 	7ùò $DùÒLkøô Ó"šdÐ"üâ;[s0   Á)KÁ9KÂKÂKÈ.0KÊKË
KËKc           	      óÜ  ^^^• [        U5       VVs/ s H  u  p#U R                  X25      PM     snnmS[        U R                      S3mSmUUU4S jn[	        [        [        U5      5      5      oT" U5      od" US S S2   5      ou Vs0 s H  oˆXh   Xx   -   _M     n	n[        X™R                  S9n
X¦U[        XfR                  S9[        XwR                  S9:H  TU
   S   S.4$ s  snnf s  snf )	NzvSomeone is playing with Lego with no plan, adding one piece at a time to what they have built. Their taste: they love z�. Each option is one piece they could add next, measured against the piece it would join and against the whole build. Which one would they add?ÚABCDEFc                 ó  >• [         R                  " TSST[        U 5       VVs0 s H  u  pTU   TU   _M     snnS.05      nUS   S   S   n[        U 5       VVs0 s H  u  pX$R                  TU   S5      _M     snn$ s  snnf s  snnf )NrÀ  r¼  )ÚtypeÚinstructionsÚcriteriaÚanswersÚprobabilitiesr   )r   Úcallr¦   r˜   )Úorderr­   rw  rˆ   rB   r†   Údescrã   s        €€€r"   ÚaskÚReef.choose.<locals>.askÅ  s¾   ø€ Ü—’˜˜U¨XÀqÔqzð  |Aô  rBô  WCò  rBÑimÐijÐWXÐYZÑW[Ð]aÐbcÑ]dÒWdñ  rBò  WCñ  %Dð  Eó  FˆAØ�)‘˜UÑ# OÑ4ˆAÔ\eÐfkÔ\lÔ=mÒ\lÑTXÐTU¸aÇÁÀqÈÁtÈQÃÒ>OÑ\lÒ=mÐ6mùó WCùÛ=ms   ¤BÁ!Br�   r‘  ré  )Úp1Úp2Úagreer  )	r¦   rø  ÚTASTESr$  r7   rº  r*   r  r˜   )rÈ   Úcandsr­   rŠ   r  rè   r  r  rw  ÚtotÚpickr†   r  rã   s              @@@r"   ÚchooseÚReef.choose¿  s  ú€ Ü-6°uÔ-=Ô>Ò-=¡T Q�—
‘
˜1Ö Ñ-=Ò>ˆðÜ˜AŸG™G‘_Ð%ð &FðGˆð ˆ÷	nô ””s˜5“zÓ"Ó#ˆ¨#¨a«& R°s¸1¹T¸r¸T¹7³|°"ÐfgÓKhÒfgÐabÈrÉuÐWYÑW\É}ÒL\ÑfgÀSÐKhÜ�3ŸG™GÑ$ˆØ b´3°r¿v¹vÑ3FÌ#Èb×V\ÑV\ÑJ]Ñ3]ÐgkÐlpÑgqÐrñ  hAñ  Bð  Bð  	Bùó ?ùò Lis   ’C#ÂC)c                 óÜ  • U R                  US   US   US   US   5      nU(       d  gUS   nUS   S:X  a;  U R                  R                  R                  [	        US   5      S	US
   US   45        US   S;  aX  U R                  R                  R                  US   S	:X  a  [	        US   5      S	US
   US   4O[	        US   5      SUS
   45        U R                  R                  5         g)Nrµ  rA   rœ  rn  Fr   rC  r   rB  r   r›   )rG  rZ  rC  r  rF  rI  r•  T)r°  r   r¯   rÀ  r«   Ú	reconcile)rÈ   rŠ   rˆ   r   s       r"   ÚcommitÚReef.commitË  s5  € Ø�J‰J�q˜‘y ! F¡)¨Q¨u©X°q¸±yÓAˆÞ˜Øˆf‰IˆØˆQ‰4�:Ó˜qŸs™sŸx™xŸ|™|¬R°°!±«X°v¸qÀ¹tÀQÀqÁTÐ,JÔKØˆQ‰4ÐNÓNÐPQ×PSÑPS×PXÑPX×P\ÑP\ð  @Að  BCñ  @Dð  HNó  @NÔ^`ÐabÐcdÑaeÓ^fÐhnÐpqÐrsÑptÐvwÐxyÑvzÑ]{ô  UWð  XYð  Z[ñ  X\ó  U]ð  _eð  ghð  ijñ  gkð  Tlô  QmØ	�‰�‰ŒØr0   c                 óR  • U R                    SU R                  S 3oR                  R                  R	                  US-   5        [
        R                  " SSSSSS	S
US-   SSSSSSUS-   /SS9   SS Ko"R                  US-   5        g ! [         a  n[        SUSS9   S nAg S nAff = f)Nz/frame_Ú02drã  ÚflatpakÚrunz--filesystem=homezorg.leocad.LeoCADz-lz/home/ivy/lego/ldrawz-iz.pngz-wÚ700z-hz--viewpointÚhomeT)Úcapture_outputr   zglb failed:©Úflush)r‡   r,  r   r)  Ú	write_ldrÚ
subprocessr  Úto_glbÚ
ldr_to_glbr8   Úprint)rÈ   Ústemr  Úes       r"   rœ   Ú
Reef.frameÓ  sÂ   € Ø—%‘%�˜ §¡ s˜|Ð,ˆ¯c©c¯g©g×.?Ñ.?ÀÀvÁÔ.NÜ�Š˜	 5Ð*=Ð?RÐTXÐZpÐrvÐx|ð  @Fñ  yFð  HLð  NSð  UYð  [`Ø% v¨t°f©}ð>ØNRò	Tð	CÛ×,Ñ,¨T°F©]Õ;øÜÓBœu ]°A¸T×BûÐBús   Á/B Â
B&ÂB!Â!B&c                 ó  • [        U R                   S3S5      o R                  5         [        SUS-   5       GH  U l        U R                  5       n[        U5      S:  a  [        SU R                  SSS9    O×U R                  U5      u  pEU R                  X4   5      nU R                  [        U5      X4   S	   US
.UEnUR                  [        R                  " U5      S-   5        UR                  5         U R                  5         [        SU R                   S[        U5       SX4   S	    SUS   (       a  SOS SUS   S S  3
SS9  GM     U R                  R                  R!                  U R                   S35        g )Nz
/log.jsonlr°   r   r   r,  ztoo few movesTr  rA   )r,  ÚoptionsÚpickedÚ	committedÚ
zturn z: z options, picked rô   r	  z(same both orders)z(orders disagreed)z -- r  én   z
/build.ldr)r{   r‡   rœ   rº  r,  rÈ  r*   r!  r  r  rÑ  r}   Údumpsr  r   r)  r  )rÈ   ÚturnsÚlogr  r  ÚinfoÚokÚrecs           r"   ÚplayÚ	Reef.playÚ  s}  € Ü�a—e‘e�W˜JÐ'¨Ó-ˆ¯w©w¬yÜ˜A˜u q™y×)ˆAŒFØ—I‘I“KˆEÜ�5‹z˜A‹~œu V¨Q¯V©V°_ÈDÒQÑSXØŸ™ %›‰JˆD¨q¯x©x¸¹Ó/D¨"ØŸ6™6¬c°%«jÀEÁKÐPVÑDWÐfhÑqÐlpÐqˆCØ�I‰I”d—j’j “o¨Ñ,Ô-¨s¯y©y¬{¸A¿G¹G¼IÜ�E˜!Ÿ&™&˜ ¤C¨£J <Ð/@ÀÁÈVÑATÐ@UÐUVÐosÐt{×o|ÑWkð  CWð  WXð  X\ð  ]að  bhñ  ]ið  jnð  knð  ]oð  \pð  qð  y}õ  ~ñ *ð 	
�‰�‰×Ñ˜QŸU™U˜G :Ð.Õ/r0   rÁ   )rŽ   é<   NT)rË   rÌ   rÍ   rÎ   rÉ   r¬   r/  rU  Ú_TYRE_SLOTSr[  rN  Ústaticmethodrp  rt  r~  r°  rÈ  rÓ  rà  rø  r  r  rœ   r1  rÒ   rÁ   r0   r"   r  r  À   su   † ò1ò 'ò"ò
$ð: €Jòð ñ	oó ð	oòxòòeôL#òHò:ò7ò BòòCõ	0r0   r  Ú__main__z--tasterw   )Údefaultz--turnsé   )rý  r7  z--seedr   z/runs/Ú_s)r¤   r6  )r›   N)UrÏ   Úsysr%  r}   Úargparseru  r  Úimportlib.utilr   Únumpyr   rÒ  ÚinsertÚ
expanduserr|   rB   ÚkitÚ	ALLOW_ANYÚgrowrÅ   r   r;  rÆ   r1   r   r3   rH   r}  r   rI   rJ   rK   Úctxrø   ÚdirnameÚabspathÚ__file__ÚHEREr»  Úloadr{   ÚjoinÚOSErrorÚ
ValueErrorrL  r7   Ú_nrù   ÚreadlineÚstripÚsplitr
  r‹   r<   Ú_Cr   Úinvr4  r5   r4   r‘   r™   r    r¼   r¾   rÖ   rÜ   rß   rñ   r÷   rÿ   r  r  r  rË   ÚArgumentParserÚapÚadd_argumentr'  Ú
parse_argsr±   r0  r$  r1  r,  )rŸ   r   s   00r"   Ú<module>rV     sØ  ðñw÷ A× @× @Ó @Û Ø ‡�‡���2—7‘7×%Ñ% hÓ/Ô 0°b·g±g×6HÑ6HÐI`Ó6a°!Û	!€A 3§8¡8§?¡?°1¸¸¸1¸Q¸C°jÖ#AÑ	!Û 
˜DˆCŒMã Ý Ù	��M 1§7¡7Ó	+€¸V¨Q¬]Øˆz€ò'ðP —8‘8€Ô Ø
€„Û 
Ý ß 'Û Ø	‡w�w‡��r—w‘w—‘ xÓ0Ó1€òB€ð#Ø 4§9¢9©T°"·'±'·,±,¸r¿w¹w¿¹ÈrÏwÉwÏÉÐ_gÓOhÓ?iÐkuÓ2vÓ-wÔ#xó  VÒ#x˜að  Eñ  }Fð  NUñ  }U“	��&”	Ñ#xñ  Vñ  V€Gà€
Ø
‘D˜Ó$Ô
$€BØ	�—‘ÕÙ  §¡×!3Ñ!3Ð6IÈ"ÈÈTÐ4RÓ!SÓT×]Ñ]Ó_Ð`aÐ`bÐc×iÑiÓk×qÑqÐrwÓxÐyzÑ{ˆR�X‰X�b‹\ñ %ð ^ð Cñ
D€òð ‡X‚XŠ~š~ªÂÐMÓN€à‡H‚HŠoš|ª\º>ÐJÓKØ‡H‚HŠmš\ª=º.ÐIÓJñ6Ló Mò 6L°��Q‘˜Ÿ™Ÿ™ rÓ*Ô*ñ 6Lñ M€ð ‡�‡���2—7‘7×%Ñ% hÓ/Ô 0Û ò ò
]òNò
÷pñ pð €ô)òLòð& €òôDô÷c0ñ c0ðH	 ˆzÓØ	×	 Ò	 Ó	"€B B§O¡O°IÀv OÑ$NÐPR×P_ÑP_Ð`iÐpsÐ}ÐP_ñ  QAØ‡O�O�H 3°€OÑ2¸¿¹»°AÙˆ�‰�—‘˜T˜F &¨¯©¨	°°A·F±F°8Ð<Ó=×BÑBÀ1Ç7Á7ÕKð ùòy VøØ�ÐÓ "šdÐ "ûð
 Ó›ÐüòMsD   Ä:A'P Æ!O=Æ1	O=Æ:P Ç!A#PÊ,+PÏ=P ÐPÐPÐPÐP