§
    ÎÐj&  ã                  ó(  — d Z ddlmZ ddlZddlZddlZd„ dD ¦   «         Zd„  ed¦  «        D ¦   «         Z	d#d
„Z
d$d„Z e¦   «         \  ZZ ej        d„ e	D ¦   «         ¦  «        Z ej        d„ e	D ¦   «         ¦  «        Zd%d„Zd&d'd„Zd(ddddœd)d"„ZdS )*ah  Iso-surface extraction from a sampled scalar volume (occupancy logits, SDF, density).

Coordinates: volume[i, j, k] is the sample at bounds_min + (i, j, k) / (shape - 1) * (bounds_max - bounds_min), the
first and last samples lying on the bounds; axis 0 is x, 1 is y, 2 is z. Output faces are counter-clockwise seen from
outside the object (outward right-hand-rule normals), the object being where the volume is above `level` (inside =
"above", e.g. occupancy) or below it ("below", e.g. signed distance).

Methods:
- "lewiner" (default): scikit-image's marching cubes (Lewiner et al. 2003, topologically resolved ambiguities), on the
  CPU (the volume is copied to the CPU, the mesh is returned on the volume's device).
- "torch": vectorized classic marching cubes in PyTorch on the volume's device. Its vertices are exactly the edge
  crossings that scikit-image also produces (same linear interpolation); its case table is built here so that
  ambiguous cube faces always separate the inside corners, which keeps neighbouring cells consistent: the surface is
  crack-free and manifold (closed for a volume whose border is outside). Unlike Lewiner's method it adds no vertices
  inside the cells and resolves ambiguous cells by separating the inside corners, so it is not topologically identical
  to scikit-image there (on smooth fields the two meshes coincide almost everywhere).
é    )ÚannotationsNc                ó,   — g | ]}d D ]}d D ]}|||f‘ŒŒŒS )©r   é   © )Ú.0ÚzÚyÚxs       ú=C:\Users\johnn\OneDrive\Documents\AI\shared\mesh3d\surface.pyú
<listcomp>r      s8   € ÐFÐFÐF˜!¨vÐFÐF¨!¸vÐFÐF¸!ˆQ��1ˆIÐFÐFÐFÐFÐFó    r   c                óV   — g | ]&}t          d ¦  «        D ]}|d|z  z  °
||d|z  z  f‘ŒŒ'S )é   r   )Úrange)r   ÚaxisÚcs      r   r   r      sH   € Ð	]Ð	]Ð	] 4½UÀ1¹X¼XÐ	]Ð	]¸ÈQÐRSÐW[ÑR[É_Ð	]ˆ1ˆa�1˜‘9‰oÐ
Ð	]Ð	]Ð	]Ð	]r   é   Úreturnúlist[list[int]]c            	     óø  ‡‡‡‡— g } t          j        t          d¦  «        d¦  «        D ]Ð\  ŠŠˆfd„t          d¦  «        D ¦   «         \  ŠŠˆˆˆˆfd„dD ¦   «         }t          j        d¦  «        }‰rdnd|‰<   d„ |D ¦   «         }t          j        t          j        |d         |d	         z
  |d
         |d	         z
  ¦  «        |¦  «        d	k     r|                     ¦   «          |                      |¦  «         ŒÑ| S )zPThe 6 cube faces as corner cycles, counter-clockwise seen from outside the cube.r   r   c                ó    •— g | ]
}|‰k    ¯|‘ŒS r   r   )r   Úar   s     €r   r   z _face_cycles.<locals>.<listcomp>"   s   ø€ Ð1Ð1Ð1�a q¨D¢y y� y y yr   c           	     óZ   •— g | ]'\  }}t          d „ ‰‰f|‰f|‰ffD ¦   «         ¦  «        ‘Œ(S )c              3  ó&   K  — | ]\  }}||z  V — Œd S )Nr   )r   ÚbitÚbs      r   ú	<genexpr>z*_face_cycles.<locals>.<listcomp>.<genexpr>#   s*   è è € ÐOÐO¡F C¨�s˜a‘xÐOÐOÐOÐOÐOÐOr   )Úsum)r   ÚduÚdvr   ÚsideÚuÚvs      €€€€r   r   z _face_cycles.<locals>.<listcomp>#   sJ   ø€ ÐÐÐÑTZÐTVÐXZ•3ÐOÐO°°d¨|¸bÀ!¸WÀrÈ1ÀgÐ.NÐOÑOÔOÑOÔOÐÐÐr   ))r   r   ©r   r   )r   r   r   r   éÿÿÿÿc                óX   — g | ]'}t          j        t          |         t          ¦  «        ‘Œ(S r   )ÚnpÚarrayÚ_CORNERSÚfloat)r   r   s     r   r   z _face_cycles.<locals>.<listcomp>&   s(   € Ð;Ð;Ð;¨a�RŒX•h˜q”k¥5Ñ)Ô)Ð;Ð;Ð;r   r   é   )	Ú	itertoolsÚproductr   r(   ÚzerosÚdotÚcrossÚreverseÚappend)ÚcyclesÚcornersÚnormalÚpr   r"   r#   r$   s       @@@@r   Ú_face_cyclesr8      s  øøøø€ à€FÝÔ'­¨a©¬°&Ñ9Ô9ð ð ‰
ˆˆdØ1Ð1Ð1Ð1�5 ™8œ8Ð1Ñ1Ô1‰ˆˆ1ØÐÐÐÐÐÐÐ^~ÐÑÔˆÝ”˜!‘”ˆØ Ð(�q�q bˆˆt‰Ø;Ð;°7Ð;Ñ;Ô;ˆÝŒ6•"”(˜1˜Qœ4 ! A¤$™;¨¨!¬¨q°¬t©Ñ4Ô4°fÑ=Ô=ÀÒAÐAØ�OŠOÑÔÐØ�Š�gÑÔÐÐØ€Mr   útuple[np.ndarray, np.ndarray]c            
     ó@  ‡‡‡‡‡— d„ t          t          ¦  «        D ¦   «         } t          ¦   «         Šˆfd„t          D ¦   «         Šg }t          d¦  «        D �]«Šˆfd„t          d¦  «        D ¦   «         }i }‰D ]®}t          |¦  «        D ]œ\  }}||         r�|||dz
                    s~|}|||dz   dz                    r|dz  }|||dz   dz                    °| t	          ||dz           ||dz   dz           f¦  «                 }| t	          ||dz
           |f¦  «                 ||<   Œ�Œ¯g }	|r·t          t          |¦  «        ¦  «        g c}
Š|
}	 ‰                     |¦  «         |                     |¦  «        }||
k    rnŒ2t          ‰¦  «        Št          ˆˆˆfd	„t          ‰¦  «        D ¦   «         ¦  «        }|	                     ‰|d
…         ‰d
|…         z   ¦  «         |°·|                     d„ |	D ¦   «         ¦  «         �Œ­t          t          t          |¦  «        ¦  «        }t          j        d|dfdt          j        ¦  «        }t          |¦  «        D ]\  Š}|r||‰d
t          |¦  «        …f<   Œ|t          j        d„ |D ¦   «         t          j        ¦  «        fS )a”  Triangles (as cube edge triples, counter-clockwise seen from the outside corners) of the 256 corner configurations
    (bit c set = corner c inside), padded with -1, and their counts.

    On every cube face, each run of inside corners is cut off by a segment, so diagonal inside corners are separated and
    the two cells sharing a face always agree. The segments, oriented with the inside corners on their left seen from
    outside the cube, chain into loops; each loop is fan-triangulated from a vertex whose diagonals join no two vertices
    of a common cube face, so diagonals lie inside the cell and never coincide with a neighbour's edges (manifold).c                ó4   — i | ]\  }}t          |¦  «        |“ŒS r   )Ú	frozenset)r   ÚiÚes      r   ú
<dictcomp>z_case_table.<locals>.<dictcomp>5   s$   € Ð=Ð=Ð=¡4 1 a�y˜‰|Œ|˜QÐ=Ð=Ð=r   c                óR   •‡‡— g | ]!\  ŠŠˆˆfd „t          ‰¦  «        D ¦   «         ‘Œ"S )c                ó*   •— h | ]\  }}‰|v ¯	‰|v ¯|’ŒS r   r   )r   ÚfÚcycler   r   s      €€r   ú	<setcomp>z)_case_table.<locals>.<listcomp>.<setcomp>7   s*   ø€ ÐSÐSÐS™˜˜E¸¸e¸¸ÈÈUÈ
È
�1È
È
È
r   )Ú	enumerate)r   r   r   Úfacess    @@€r   r   z_case_table.<locals>.<listcomp>7   sB   øøø€ ÐgÐgÐgÑX\ÐXYÐ[\ÐSÐSÐSÐSÐS¥Y¨uÑ%5Ô%5ÐSÑSÔSÐgÐgÐgr   é   c                ó:   •— g | ]}t          ‰|z	  d z  ¦  «        ‘ŒS )r   )Úbool)r   r   Úconfigs     €r   r   z_case_table.<locals>.<listcomp>:   s)   ø€ Ð:Ð:Ð:¨A•$�v ‘{ Q‘Ñ'Ô'Ð:Ð:Ð:r   r   r   é   Tc              3  ót   •‡K  — | ]1Št          ˆˆˆˆfd „t          ‰¦  «        D ¦   «         ¦  «        ¯-‰V — Œ2dS )c              3  óz   •K  — | ]5}|‰‰d z
  ‰z  ‰d z   ‰z  fv¯‰‰‰                  ‰‰|                  z   V — Œ6dS )r   Nr   )r   Újr   Ú
edge_facesÚloopÚns     €€€€r   r   z(_case_table.<locals>.<genexpr>.<genexpr>N   sÂ   øè è € ð  3^ð  3^ÐefÐvwð  ABð  EFð  IJñ  EJð  NOñ  DOð  RSð  VWñ  RWð  [\ñ  Q\ð  @]ð  w]ð  w]°zÀ$ÀqÄ'Ô7JÈZÐX\Ð]^ÔX_ÔM`Ñ7`Ð3`ð  w]ð  w]ð  w]ð  w]ð  3^ð  3^r   N)Úallr   )r   r   rO   rP   rQ   s    @€€€r   r   z_case_table.<locals>.<genexpr>N   s˜   øøè è € ð  _ð  _˜a­sð  3^ð  3^ð  3^ð  3^ð  3^ð  3^ð  3^ÕjoÐpqÑjrÔjrð  3^ñ  3^ô  3^ñ  0^ô  0^ð  _˜ð  _ð  _ð  _ð  _ð  _ð  _r   Nc                óˆ   — g | ]?}t          d t          |¦  «        d z
  ¦  «        D ]}|d         ||d z            ||         f‘ŒŒ@S r%   )r   Úlen)r   r7   r=   s      r   r   z_case_table.<locals>.<listcomp>P   sW   € ÐaÐaÐa°QÍEÐRSÕUXÐYZÑU[ÔU[Ð^_ÑU_ÑL`ÔL`ÐaÐaÀq˜1˜Qœ4  1 q¡5¤¨1¨Q¬4Ð0ÐaÐaÐaÐar   r   r&   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   )rT   )r   Úts     r   r   z_case_table.<locals>.<listcomp>V   s   € Ð6Ð6Ð6 q�C ™FœFÐ6Ð6Ð6r   )rE   Ú_EDGESr8   r   r<   ÚnextÚiterr3   ÚpoprT   ÚmaxÚmapr(   ÚfullÚint64r)   )Úedge_ofÚ	trianglesÚinsideÚ	followingrC   r=   ÚcornerrN   Ú	exit_edgeÚpolygonsÚstartÚedgeÚapexÚwidthÚtableÚtrisrJ   rO   rF   rP   rQ   s                   @@@@@r   Ú_case_tablerl   -   s%  øøøøø€ ð >Ð=­9µVÑ+<Ô+<Ð=Ñ=Ô=€GÝ‰NŒN€EØgÐgÐgÐgÕ`fÐgÑgÔg€JØ€IÝ˜‘*”*ð cñ cˆØ:Ð:Ð:Ð:µ°q±´Ð:Ñ:Ô:ˆØˆ	Øð 	Vð 	VˆEÝ& uÑ-Ô-ð Vð V‘	��6Ø˜&”>ð V¨&°°q¸1±u´Ô*>ð VØ�AØ  ¨¨A©°¡{Ô!3Ô4ð Ø˜Q™˜ð ! ¨¨A©°¡{Ô!3Ô4ð à '­	°5¸¸Q¹´<ÀÈÈAÉÐQRÁ{ÔASÐ2TÑ(UÔ(UÔ V�IØ+2µ9¸eÀAÈÁE¼lÈFÐ=SÑ3TÔ3TÔ+U�I˜iÑ(øðVð ˆØð 
	7Ý�t I™œÑ/Ô/°ˆKˆE�4ØˆDðØ—’˜DÑ!Ô!Ð!Ø —}’} TÑ*Ô*�Ø˜5’=�=Øð	õ
 �D‘	”	ˆAÝð  _ð  _ð  _ð  _ð  _ð  _¥5¨¡8¤8ð  _ñ  _ô  _ñ  _ô  _ˆDØ�OŠO˜D   œK¨$¨u°¨u¬+Ñ5Ñ6Ô6Ð6ð ð 
	7ð 	×ÒÐaÐa¸(ÐaÑaÔaÑbÔbÐbÑbÝ••C˜Ñ#Ô#Ñ$Ô$€EÝŒG�S˜% �O R­¬Ñ2Ô2€EÝ! )Ñ,Ô,ð -ð -‰ˆ�Øð 	-Ø(,ˆE�&˜*�3˜t™9œ9˜*Ð$Ñ%øØ•"”(Ð6Ð6¨IÐ6Ñ6Ô6½¼ÑAÔAÐAÐAr   c                ó\   — g | ])\  }}t          t          j        ||z  ¦  «        ¦  «        ‘Œ*S r   )Úintr(   Úlog2)r   r   r   s      r   r   r   Z   s0   € Ð>Ð>Ð>©t¨q°!•s�2œ7 1 q¡5™>œ>Ñ*Ô*Ð>Ð>Ð>r   c                ó.   — g | ]\  }}t           |         ‘ŒS r   )r*   )r   r   Ú_s      r   r   r   [   s    € Ð6Ð6Ð6¡t q¨!•x ”{Ð6Ð6Ð6r   ú!tuple[torch.Tensor, torch.Tensor]c                óJ   ‡— ˆfd„| d         | d         fD ¦   «         \  }}||fS )Nc              3  ó¤   •K  — | ]J}t          j        t          j        |t          j        ¦  «        ‰¬ ¦  «                             d¦  «        V — ŒKdS )©Údevicer   N)ÚtorchÚ	as_tensorr(   ÚasarrayÚfloat64Úexpand)r   r   rv   s     €r   r   z_bounds.<locals>.<genexpr>_   sP   øè è € ÐuÐuÐYZ•”¥¤¨A­r¬zÑ!:Ô!:À6ÐJÑJÔJ×QÒQÐRSÑTÔTÐuÐuÐuÐuÐuÐur   r   r   r   )Úboundsrv   ÚlowÚhighs    `  r   Ú_boundsr   ^   s=   ø€ ØuÐuÐuÐuÐ_eÐfgÔ_hÐjpÐqrÔjsÐ^tÐuÑuÔu�I€CˆØ�ˆ9Ðr   é    Úvolumeútorch.TensorÚlevelr+   ÚaboverI   Úslabrn   c           	     óH  ‡ — ‰ j         }t          j        t          ¦  «                             |¦  «        t          j        t
          ¦  «                             |¦  «        }}t          j        t          ¦  «                             |¦  «        t          j        t          ¦  «                             |¦  «        }}‰ j        \  }	}
}g }t          d|	dz
  |¦  «        D �]E}t          ||z   |	dz
  ¦  «        }|r‰ ||dz   …         |k    n‰ ||dz   …         |k     }t          j        ||z
  |
dz
  |dz
  t          j        |¬¦  «        }t          t          ¦  «        D ]O\  }\  }}}|||||z   |z
  …|||
z   dz
  …|||z   dz
  …f                              t          j        ¦  «        |z  z  }ŒP|dk    |dk     z                       ¦   «         }||dd…df         |dd…df         |dd…df         f                              ¦   «         }|dd…dfxx         |z  cc<   t          j        t          j        t'          |¦  «        |¬¦  «        ||         ¦  «        }t          j        t'          |¦  «        |¬¦  «        t          j        ||                              d¦  «        ||         z
  ||         ¦  «        z
  }|||         |f         }||         dd…ddd…f         ||         z   }|                     |d         |
z  |d	         z   |z  |d
         z   dz  ||         z   ¦  «         �ŒG|rt          j        |¦  «        n!t          j        ddt          j        |¬¦  «        }t          j        |d¬¦  «        \  }}|dz  |dz  }}t          j        ||
|z  z  ||z  |
z  ||z  gd¦  «        }|t          j        j                             |d¦  «        z   }ˆ fd„||fD ¦   «         \  } }!|| z
  |!| z
  z  }"|                     ¦   «         |"dd…df         ||z
                       ¦   «         z  z   |fS )z`Vertices in index space [V, 3] (float64) and faces [F, 3] int64 (orientation of the case table).r   r   ©Údtyperv   éÿ   Nr,   ru   ).r   ).r   ).r,   r   T)Úreturn_inversec              3  óŽ   •K  — | ]?}‰|d d …df         |d d …df         |d d …df         f                               ¦   «         V — Œ@d S )Nr   r   r,   )Údouble)r   r7   r�   s     €r   r   z(_torch_marching_cubes.<locals>.<genexpr>}   s_   øè è € ÐOÐO¸Qˆf�Q�q�q�q˜!�t”W˜a    1 œg q¨¨¨¨A¨¤wÐ.Ô/×6Ò6Ñ8Ô8ÐOÐOÐOÐOÐOÐOr   )rv   rw   Ú
from_numpyÚ_TABLEÚtoÚ_COUNTSÚ
_EDGE_AXISÚ
_EDGE_BASEÚshaper   Úminr/   Úuint8rE   r*   ÚnonzeroÚlongÚrepeat_interleaveÚarangerT   Úcumsumr3   Úcatr^   ÚuniqueÚstackÚnnÚ
functionalÚone_hotrŒ   )#r�   rƒ   r„   r…   rv   rj   ÚcountsÚ	edge_axisÚ	edge_baseÚnxÚnyÚnzÚtriangle_edgesÚx0Úx1ra   rJ   r   ÚdxÚdyÚdzÚcellsÚcellÚslotÚlocalÚpointÚedgesrœ   rF   r   rf   ÚendÚv0Úv1rV   s#   `                                  r   Ú_torch_marching_cubesr¶   c   sK  ø€ àŒ]€FÝÔ$¥VÑ,Ô,×/Ò/°Ñ7Ô7½Ô9IÍ'Ñ9RÔ9R×9UÒ9UÐV\Ñ9]Ô9]ˆ6€EÝ Ô+­JÑ7Ô7×:Ò:¸6ÑBÔBÅEÔDTÕU_ÑD`ÔD`×DcÒDcÐdjÑDkÔDkˆy€IØ”�J€BˆˆBØ€NÝ�A�r˜A‘v˜tÑ$Ô$ð rñ rˆÝ��d‘˜B ™FÑ#Ô#ˆØ.3ÐR�˜˜2 ™6˜	Ô" UÒ*Ð*¸ÀÀ2ÈÁ6À	Ô9JÈUÒ9RˆÝ”˜R "™W b¨1¡f¨b°1©f½E¼KÐPVÐWÑWÔWˆÝ(­Ñ2Ô2ð 	cð 	c‰OˆA‰|��B˜Ø�f˜R  R¡¨"¡˜_¨b°°b±¸1±¨n¸bÀÀbÁÈ1Á¸nÐLÔM×PÒPÕQVÔQ\Ñ]Ô]ÐabÑbÑbˆFˆFØ˜1’* ¨#¢Ñ.×7Ò7Ñ9Ô9ˆØ˜˜a˜a˜a ˜dœ U¨1¨1¨1¨a¨4¤[°%¸¸¸¸1¸´+Ð=Ô>×CÒCÑEÔEˆØˆaˆaˆa�ˆdˆˆŒ�rÑˆˆ‰ÝÔ&¥u¤|µC¸±J´JÀvÐ'NÑ'NÔ'NÐPVÐW]ÔP^Ñ_Ô_ˆÝŒ|�C ™IœI¨fÐ5Ñ5Ô5½Ô8OÐPVÐW]ÔP^×PeÒPeÐfgÑPhÔPhÐkqÐrxÔkyÑPyð  |Bð  CIô  |Jñ  9Kô  9Kñ  KˆØ�f˜T”l DÐ(Ô)ˆØ�d”˜A˜A˜A˜t Q Q Q˜JÔ'¨)°EÔ*:Ñ:ˆØ×Ò  f¤°Ñ 2°U¸6´]Ñ BÀbÑHÈ5ÐQWÌ=ÑXÐ\]Ñ]Ð`iÐjoÔ`pÑpÑqÔqÐqÑqØ)7Ðp�EŒI�nÑ%Ô%Ð%½U¼[ÈÈAÕUZÔU`ÐioÐ=pÑ=pÔ=p€EÝ”L °tÐ<Ñ<Ô<�M€FˆEØ˜1‘*˜f¨™kˆ%€DÝŒK˜ 2¨¡7Ñ+¨U°b©[¸2Ñ-=¸uÀr¹zÐJÈAÑNÔN€EØ
•%”(Ô%×-Ò-¨d°AÑ6Ô6Ñ
6€CØOÐOÐOÐOÀ5È#À,ÐOÑOÔO�F€BˆØ	�‰˜˜R™Ñ €AØ�<Š<‰>Œ>˜A˜a˜a˜a ˜gœJ¨#°©+×)=Ò)=Ñ)?Ô)?Ñ?Ñ?ÀÐFÐFr   ç        ©g      ð¿g      ð?Úlewiner)ra   ÚmethodÚmaskra   Ústrrº   c               ó¤  — |dvrt          d|›�¦  «        ‚t          | t          j        ¦  «        r| n%t          j        t          j        | ¦  «        ¦  «        }|j        }|dk    rt          |||dk    ¦  «        \  }}	d}
�nY|dk    �r@ddl	m
} |                     ¦   «                              ¦   «                              ¦   «                              ¦   «         }|dk    rd	nd
}|€dnAt          |t
          j        ¦  «        r|n%|                     ¦   «                              ¦   «         } |||d||¬¦  «        \  }}	}}t          j        |                     t
          j        ¦  «        ¦  «                             |¦  «        t          j        |	                     t
          j        ¦  «        ¦  «                             |¦  «        }	}d}
nt          d|›�¦  «        ‚t)          ||¦  «        \  }}||z
  t          j        |j        t          j        |¬¦  «        dz
  z  }||z  |z                        ¦   «         }||
r|	                     d¦  «        n|	fS )a–  Iso-surface of volume [X, Y, Z] (torch tensor or numpy array) at level: vertices [V, 3] float32 in world
    coordinates and faces [F, 3] int64, outward counter-clockwise (see the module docstring for the conventions and the
    methods). bounds: (min, max) as scalars or xyz triples (e.g. Hunyuan3D's [-1.01, 1.01]). Tensors are returned on the
    volume's device (CPU for numpy input). mask ("lewiner" only): boolean [X, Y, Z] restricting the cells visited
    (scikit-image tests it at one corner of each cell: mark the cells crossed by the surface dilated by one voxel); a
    mask that covers them gives the same mesh faster on large, mostly empty volumes.)r„   Úbelowz'inside must be 'above' or 'below', not rw   r„   Fr¹   r   )Úmarching_cubesÚdescentÚascentN)rº   Úgradient_directionr»   TzUnknown marching cubes method r‡   r   )Ú
ValueErrorÚ
isinstancerw   ÚTensorr�   r(   ry   rv   r¶   Úskimage.measurer¿   Údetachr+   ÚcpuÚnumpyÚndarrayÚastyperz   r�   r^   r   Útensorr“   Úflip)r�   rƒ   r|   ra   rº   r»   rÌ   rv   ÚverticesrF   rÍ   Úskimage_marching_cubesr)   Úgradientrq   r}   r~   Úscales                     r   r¿   r¿   ‚   sJ  € ð Ð'Ð'Ð'ÝÐMÀ6ÐMÐMÑNÔNÐNÝ! &­%¬,Ñ7Ô7ÐaˆVˆV½UÔ=MÍbÌjÐY_ÑN`ÔN`Ñ=aÔ=a€FØŒ]€FØ�ÒÐÝ/°¸¸vÈÒ?PÑQÔQ‰ˆ�%Øˆ‰Ø	�9Ò	Ñ	ØLÐLÐLÐLÐLÐLØ—’‘”×%Ò%Ñ'Ô'×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5ˆØ &¨'Ò 1Ð 1�9�9°xˆØ�|ˆtˆtµ*¸TÅ2Ä:Ñ2NÔ2NÐ*f¨$¨$ÐTX×T\ÒT\ÑT^ÔT^×TdÒTdÑTfÔTfˆØ 6Ð 6°u¸eÈIÐjrÐy}Ð ~Ñ ~Ô ~Ñˆ�%˜˜AÝÔ*¨8¯?ª?½2¼:Ñ+FÔ+FÑGÔG×JÒJÈ6ÑRÔRÕTYÔTdÐej×eqÒeqÕrtÔrzÑe{Ôe{ÑT|ÔT|×TÒTð  AGñ  UHô  UH�%ˆØˆˆåÐD¸&ÐDÐDÑEÔEÐEÝ˜ Ñ'Ô'�I€CˆØ�C‰Z�EœL¨¬½U¼]ÐSYÐZÑZÔZÐ]^Ñ^Ñ_€EØ˜5Ñ  3Ñ&×-Ò-Ñ/Ô/€HØ dÐ5�U—Z’Z ‘]”]�]°Ð5Ð5r   )r   r   )r   r9   )r   rr   )r€   )
r�   r‚   rƒ   r+   r„   rI   r…   rn   r   rr   )r·   r¸   )rƒ   r+   ra   r¼   rº   r¼   r   rr   )Ú__doc__Ú
__future__r   r-   rÉ   r(   rw   r*   r   rW   r8   rl   rŽ   r�   r)   r‘   r’   r   r¶   r¿   r   r   r   ú<module>rÔ      sX  ððð ð" #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð à Ð Ð Ð Ø €€€àFÐF˜vÐFÑFÔF€Ø	]Ð	]¨5¨5°©8¬8Ð	]Ñ	]Ô	]€ðð ð ð ð)Bð )Bð )Bð )BðX �+‘-”-�€ˆØˆRŒXÐ>Ð>°vÐ>Ñ>Ô>Ñ?Ô?€
ØˆRŒXÐ6Ð6¨vÐ6Ñ6Ô6Ñ7Ô7€
ðð ð ð ð
Gð Gð Gð Gð Gð>6ÐT[ÐktÐ{ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6r   