§
    Û×ju  ã                  óÖ  — d Z ddlmZ ddlZddlZddlmc mZ ddl	m
Z
mZmZmZ ddlmZmZ dZdZd	Zd
ZdZdZdvd„Zdwddœdvd„Zdxddœdyd„Zdzddœd{d!„Zd|d&„Zd}d(„Zd~d*„Zdd2„Zd€dd4d5d6œd�d7„Zd‚d9„Z dƒd>„Z!d„d…dB„Z"d†dD„Z#d‡dFdGœdˆdI„Z$d‰dJ„Z%dŠdLddFdMœd‹dO„Z&dPdQdRdSdTdUedVœZ'dWddXdYd?dZœdŒd^„Z(d~d_„Z)d�dWddXddFdd`œdŽda„Z*db\  Z+Z,dcZ-ddZ.d�dh„Z/d�dj„Z0d‘d’dm„Z1d‡dddndoœd“ds„Z2d�dWddXdddtœd”du„Z3dS )•a  Cameras, multi-mode rendering, previews and turntables, built on raster.py.

Cameras follow OpenGL: look_at() returns world-to-camera (view) matrices, the camera looking down its -Z axis with +Y up
and +X right; perspective() / orthographic() return projection matrices to clip space (z / w = -1 at the near plane, +1
at the far plane). A camera set is a (view, projection) pair, each [4, 4] or [B, 4, 4]. Rendered images are channels
last, top row first: [B, H, W, C]. Colours are sRGB in 0..1; shading is computed in linear light.
é    )ÚannotationsNé   )ÚMeshÚlinear_to_srgbÚsrgb_to_linearÚvertex_normals)ÚinterpolateÚ	rasterize)ÚshadedÚalbedoÚnormalÚdepthÚpositionÚmask)r   r   gs¶�Rã?)gÍÌÌÌÌÌÜ¿gÍÌÌÌÌÌä?g333333ã?)g     €A@g      4@g      >@Úreturnútorch.Tensorc                óº   — t          | t          j        ¦  «        r!|                      |t          j        ¬¦  «        n t          j        | t          j        |¬¦  «        S )N)ÚdeviceÚdtype©r   r   )Ú
isinstanceÚtorchÚTensorÚtoÚfloat32Útensor)Úvaluer   s     ú<C:\Users\johnn\OneDrive\Documents\AI\shared\mesh3d\render.pyÚ_tensorr      sc   € Ý;EÀeÍUÌ\Ñ;ZÔ;Zð  Xˆ5�8Š8˜6­¬ˆ8Ñ7Ô7Ð7Õ`eÔ`lÐmrÕzô  {Hð  QWð  aXñ  aXô  aXð  Xó    ©ç        r"   r"   ©r"   ç      ð?r"   Úcpu©r   c               óü  ‡— t          | t          j        ¦  «        r| j        n‰Šˆfd„| ||fD ¦   «         \  } }}| j        dk    }|                      dd¦  «        } t          j        |                     | ¦  «        | z
  d¬¦  «        }t          j        t          j	         
                    ||                     | ¦  «        ¦  «        d¬¦  «        }t          j        |t          j	         
                    ||¦  «        | gd¦  «        }t          j        dt          j        ‰¬¦  «                             t          | ¦  «        dd¦  «        }||d	d	…d	d…d	d…f<   || d
         z  d          |d	d	…d	d…df<   |r|n|d         S )zÍWorld-to-camera matrices [4, 4] (eye [3]) or [B, 4, 4] (eye [B, 3]) of cameras at eye looking at target, with up
    towards the top of the image. Tensors keep their device; tuples are created on `device`.c              3  ó8   •K  — | ]}t          |‰¦  «        V — Œd S ©N©r   )Ú.0Úvr   s     €r   ú	<genexpr>zlook_at.<locals>.<genexpr>#   s-   øè è € ÐEÐE¨a•w˜q &Ñ)Ô)ÐEÐEÐEÐEÐEÐEr    é   éÿÿÿÿé   ©Údimr   é   r   N©.N©.r   r   )r   r   r   r   ÚndimÚreshapeÚFÚ	normalizeÚ	expand_asÚlinalgÚcrossÚstackÚeyer   ÚrepeatÚlen)	r>   ÚtargetÚupr   ÚbatchedÚforwardÚrightÚrotationÚviews	      `     r   Úlook_atrH      sr  ø€ õ & c­5¬<Ñ8Ô8ÐDˆSŒZˆZ¸f€FØEÐEÐEÐE°C¸ÀÐ3DÐEÑEÔE�O€Cˆ�ØŒh˜!Šm€GØ
�+Š+�b˜!Ñ
Ô
€CÝŒk˜&×*Ò*¨3Ñ/Ô/°#Ñ5¸2Ð>Ñ>Ô>€GÝŒK�œ×*Ò*¨7°B·L²LÀÑ4EÔ4EÑFÔFÈBÐOÑOÔO€EÝŒ{˜E¥5¤<×#5Ò#5°e¸WÑ#EÔ#EÈÀxÐPÐRSÑTÔT€HÝŒ9�Q�eœm°FÐ;Ñ;Ô;×BÒBÅ3ÀsÁ8Ä8ÈQÐPQÑRÔR€DØ€DˆˆˆˆBˆQˆB���ˆ�OØ # i¤.Ñ0°&Ô9Ð9€DˆˆˆˆBˆQˆB�ˆ�NØÐ'ˆ4ˆ4  Q¤Ð'r    ç      D@r$   çš™™™™™¹?ç      Y@Úfov_yÚfloatÚaspectÚnearÚfarc          
     óð   — dt          j        t          j        | ¦  «        dz  ¦  «        z  }t          j        ||z  dddgd|ddgdd||z   ||z
  z  d|z  |z  ||z
  z  gg d¢gt          j        |¬¦  «        S )zaOpenGL perspective projection [4, 4]: vertical field of view in degrees, aspect = width / height.r$   r.   r   )r   r   r/   r   r   )ÚmathÚtanÚradiansr   r   r   )rL   rN   rO   rP   r   Úfs         r   ÚperspectiverV   /   s°   € à�dŒh•t”| EÑ*Ô*¨QÑ.Ñ/Ô/Ñ/€AÝŒ<˜!˜f™* a¨¨AÐ.°°A°q¸!°¸qÀ!ÀcÈDÁjÐUYÐ\_ÑU_ÑE`ÐbcÐfiÑbiÐlpÑbpÐtxÐ{~Ñt~Ñbð  ?Að  CPð  CPð  CPð  QÝ#œm°Fð<ñ <ô <ð <r    ç       @Úheightc          
     óš   — t          j        d| |z  z  dddgdd| z  ddgddd||z
  z  ||z    ||z
  z  gg d¢gt           j        |¬¦  «        S )ziOpenGL orthographic projection [4, 4] of a view box `height` high (world units) and height * aspect wide.r.   r   éþÿÿÿ)r   r   r   r   r   )r   r   r   )rX   rN   rO   rP   r   s        r   Úorthographicr[   6   s¤   € åŒ<˜!˜v¨™Ñ/°°A°qÐ9¸A¸qÀ6¹zÈ1ÈaÐ;PÐSTÐVWÐY[Ð_bÐeiÑ_iÑYjÐnqÐtxÑnxÐlyð  ~Að  DHñ  ~Hñ  mIð  SJð  LXð  LXð  LXð  YÝ#œm°Fð<ñ <ô <ð <r    ÚtextureÚ
max_heightÚintÚ	max_widthc                ó¼  ‡ ‡‡‡‡— t          dt          j        t          ‰ j        d         d|z  z  ‰ j        d         d|z  z  ¦  «        ¦  «        ¦  «        Š‰ j        d         ‰z  ‰z  ‰ j        d         ‰z  ‰z  cŠŠ‰t          dd‰dz  ‰z  z  ¦  «        z  Šˆˆˆˆ ˆfd„t	          d‰‰¦  «        D ¦   «         }t          t          j        |d¦  «        ¦  «        S )zÔuint8 sRGB [H, W, C] texture -> linear float [1, 3, h, w], area-downsampled by an integer factor to at most twice the
    render size (a cheap stand-in for mipmapping), converted by bands of rows to bound memory.r   r   r.   é  @ r0   c           
     óÚ   •— g | ]g}t          j        ‰|t          |‰z   ‰¦  «        …d ‰…d d…f                              ddd¦  «        d                               ¦   «         dz  ‰¦  «        ‘ŒhS )Nr0   r.   r   r   éÿ   )r8   Ú
avg_pool2dÚminÚpermuterM   )r+   ÚrÚbandÚfactorrX   r\   Úwidths     €€€€€r   ú
<listcomp>z_texture.<locals>.<listcomp>B   sŒ   ø€ ð  Vð  Vð  VÐyz�QŒ\˜' !¥C¨¨D©°&Ñ$9Ô$9Ð"9¸6¸E¸6À2ÀAÀ2Ð"EÔF×NÒNÈqÐRSÐUVÑWÔWÐX\Ô]×cÒcÑeÔeÐhkÑkÐmsÑtÔtð  Vð  Vð  Vr    )ÚmaxrR   ÚceilÚshapeÚranger   r   Úcat)r\   r]   r_   Úbandsrh   ri   rX   rj   s   `   @@@@r   Ú_texturerr   <   s(  øøøøø€ õ �•D”I�c '¤-°Ô"2°a¸*±nÑ"EÀwÄ}ÐUVÔGWÐ[\Ð_hÑ[hÑGiÑjÔjÑkÔkÑlÔl€FØ”M !Ô$¨Ñ.°Ñ7¸¼ÀqÔ9IÈVÑ9SÐV\Ñ9\€M€FˆEØ•C˜˜G¨°©°VÑ);Ñ<Ñ=Ô=Ñ=€Dð Vð  Vð  Vð  Vð  Vð  Vð  Vð  Võ  Dð  EFð  HNð  PTñ  Uô  Uð  Vñ  Vô  V€EÝ�%œ) E¨1Ñ-Ô-Ñ.Ô.Ð.r    Úuvsc                óº   — ||                      ¦   «         z
  dz  dz
                       dddd¦  «        }t          j        | |ddd¬¦  «        dd	d	…df         j        S )
zUBilinear lookup (repeat wrap) of a [1, C, h, w] texture at glTF uvs [N, 2] -> [N, C].r.   r   r/   ÚbilinearÚborderF)ÚmodeÚpadding_modeÚalign_cornersr   N)ÚfloorrG   r8   Úgrid_sampleÚT)r\   rs   Úgrids      r   Ú_sampler~   F   sf   € à�3—9’9‘;”;Ñ !Ñ# aÑ'×-Ò-¨a°°B¸Ñ:Ô:€DÝŒ=˜ $¨ZÀhÐ^cÐdÑdÔdÐefÐhiÐhiÐhiÐklÐelÔmÔoÐor    ú!tuple[torch.Tensor, torch.Tensor]c                ó2  ‡— ˆfd„| D ¦   «         \  }}|                      ddd¦  «        |                      ddd¦  «        }}t          t          |¦  «        t          |¦  «        ¦  «        }|                     |dd¦  «        |                     |dd¦  «        fS )Nc              3  ó8   •K  — | ]}t          |‰¦  «        V — Œd S r)   r*   )r+   Úmr   s     €r   r-   z_cameras.<locals>.<genexpr>M   s-   øè è € Ð<Ð<¨q�  6Ñ*Ô*Ð<Ð<Ð<Ð<Ð<Ð<r    r/   r3   )r7   rl   r@   Úexpand)Úcamerasr   rG   Ú
projectionÚcounts    `   r   Ú_camerasr‡   L   s”   ø€ Ø<Ð<Ð<Ð<°GÐ<Ñ<Ô<Ñ€Dˆ*Ø—|’| B¨¨1Ñ-Ô-¨z×/AÒ/AÀ"ÀaÈÑ/KÔ/Kˆ*€DÝ•�D‘	”	�3˜z™?œ?Ñ+Ô+€EØ�;Š;�u˜a Ñ#Ô# Z×%6Ò%6°u¸aÀÑ%CÔ%CÐCÐCr    Úmeshr   rw   ÚstrÚsupersampleÚnormal_spaceÚambientc           	     ó\	  ‡— |t           vrt          d|›�¦  «        ‚| j        j        }t	          ||¦  «        \  }}	t          |t          ¦  «        r||fn|\  }
}|
‰z  |‰z  }}t          j        | j         	                    ¦   «         t          j
        | j        dd…dd…f         t          j        ¬¦  «        gd¦  «        }||                     dd¦  «        z  }||	                     dd¦  «        z  }|d                              ¦   «          t          || j        ||f¦  «        \  }}}|dk    d          	                    ¦   «         }|d	k    r|}�n3|d
k    r0t!          | j         	                    ¦   «         | j        ||¦  «        }�ný|dk    r$t!          |ddd…f         | j        ||¦  «         }�nÓ| j        €t%          | j        | j        ¦  «        n| j         	                    ¦   «         }| j        duo| j        du}|g}|t*          v r˜||r| j         	                    ¦   «         gng z  }|| j        €g njt          j        t/          | j        dd…dd…f          	                    ¦   «         ¦  «        | j        dd…dd…f          	                    ¦   «         gd¦  «        gz  }t!          t          j        |d¦  «        | j        ||¦  «        }t1          j        |ddd…f         d¬¦  «        }|dk    r/|dk    r%t          j        d|dd…dd…dd…f         |¦  «        n|}�ndt          j        |ddd…f         t8          ¦  «        }|r=|dk    }t;          t=          | j        ||¦  «        |ddd…f         |         ¦  «        ||<   | j        �#|d|rdndd…f         ddd…f         }|r||z  n|}|dk    r®t          j        d|dd…dd…dd…f         |¦  «        }t          j        |ddd…f         dk     | |¦  «        }t1          j        t          j         tB          t          j        |¬¦  «        d¬¦  «        }||d|z
  ||z   "                    d¦  «        d         z  z   z  }tG          | $                    dd¦  «        ¦  «        }||z  }‰dk    rˆfd„}  | |¦  «         | |¦  «        }}||fS )zpPremultiplied values [B, H, W, C] (values x coverage, averaged over the supersamples) and coverage [B, H, W, 1].úUnknown render mode Nr   ©r   r.   ©.r   r   r4   r   r   r   .r0   r/   r1   r   Úcamerazbij,bhwj->bhwié   r   r   c                ó†   •— t          j        |                      dddd¦  «        ‰¦  «                             dddd¦  «        S )Nr   r0   r   r.   )r8   rd   rf   )ÚxrŠ   s    €r   ú<lambda>z_render.<locals>.<lambda>ƒ   s=   ø€ �œ a§i¢i°°1°a¸Ñ&;Ô&;¸[ÑIÔI×QÒQÐRSÐUVÐXYÐ[\Ñ]Ô]€ r    )%ÚMODESÚ
ValueErrorÚverticesr   r‡   r   r^   r   rp   rM   Ú	ones_liker   Ú	transposeÚneg_r
   Úfacesr	   Únormalsr   rs   Ú
base_colorÚCOLOR_MODESÚcolorsr   r8   r9   ÚeinsumÚ	full_likeÚDEFAULT_ALBEDO_LINEARr~   rr   Úwherer   ÚLIGHTÚ	clamp_minr   Úclamp)!rˆ   r„   Ú
resolutionrw   rŠ   r‹   rŒ   r   rG   r…   rX   rj   ÚhÚwÚhomogeneousr‘   ÚclipÚface_idÚbaryÚ_ÚcoveredÚvaluesr�   ÚtexturedÚ
attributesÚpixelsr   r   ÚhitÚcolorÚnormal_cameraÚlightÚpools!       `                            r   Ú_renderrº   S   s>  ø€ à•5ÐÐÝÐ8°Ð8Ð8Ñ9Ô9Ð9ØŒ]Ô!€FÝ ¨Ñ0Ô0Ñ€Dˆ*Ý0:¸:ÅsÑ0KÔ0KÐ[�Z Ð,Ð,ÐQ[�M€FˆEØ�KÑ ¨Ñ!4€q€AÝ”)˜Tœ]×0Ò0Ñ2Ô2µE´OÀDÄMÐRSÐRSÐRSÐUWÐVWÐUWÐRWÔDXÕ`eÔ`mÐ4nÑ4nÔ4nÐoÐqrÑsÔs€KØ˜4Ÿ>š>¨!¨QÑ/Ô/Ñ/€FØ�J×(Ò(¨¨AÑ.Ô.Ñ.€DØˆ„L×ÒÑÔÐÝ   t¤z°A°q°6Ñ:Ô:Ñ€GˆT�1Ø˜!Š|˜YÔ'×-Ò-Ñ/Ô/€Gàˆv‚~€~Øˆ‰Ø	�Ò	Ð	Ý˜Tœ]×0Ò0Ñ2Ô2°D´JÀÈÑNÔNˆ‰Ø	�ŠˆÝ˜f S¨!¨A¨# XÔ.°´
¸GÀTÑJÔJÐJˆ‰à?C¼|Ð?S•. ¤°´
Ñ;Ô;Ð;ÐY]ÔYe×YkÒYkÑYmÔYmˆØ”8 4Ð'ÐG¨D¬OÀ4Ð,GˆØ�Yˆ
Ø•;ÐÐØ°Ð@˜4œ8Ÿ>š>Ñ+Ô+Ð,Ð,¸bÑ@ˆJØ ¤Ð 3˜"˜"½%¼)Å^ÐTXÔT_Ð`aÐ`aÐ`aÐceÐdeÐceÐ`eÔTf×TlÒTlÑTnÔTnÑEoÔEoÐquÔq|Ð}~Ð}~Ð}~ð  ABð  ACð  ACð  ~Cô  rD÷  rJò  rJñ  rLô  rLð  EMð  OPñ  ;Qô  ;Qð  :Rñ  RˆJÝ�UœY z°1Ñ5Ô5°t´zÀ7ÈDÑQÔQˆÝ”˜V C¨¨!¨ Gœ_°"Ð5Ñ5Ô5ˆØ�8ÒÐØP\Ð`hÒPhÐPh•U”\Ð"2°D¸¸¸¸B¸Q¸BÀÀÀ¸´OÀVÑLÔLÐLÐntˆF‰Få”_ V¨C°°!°¨G¤_Õ6KÑLÔLˆFØð ^Ø ’l�Ý%¥h¨t¬ÀÀ1Ñ&EÔ&EÀvÈcÐSTÐUVÐSVÈhÔGWÐX[ÔG\Ñ]Ô]��s‘ØŒ{Ð&Ø˜s¨Ð$8 A A°qÐ$9Ð$9Ð9Ô:¸3ÀÀÀ¸7ÔC�Ø+3Ð>˜ %™˜¸�Ø�xÒÐÝ %¤Ð-=¸tÀAÀAÀAÀrÈÀrÈ2ÈAÈ2ÀI¼ÐPVÑ WÔ W�Ý %¤¨M¸#¸qÀ¸s¸(Ô,CÀaÒ,GÈ-ÈÐYfÑ gÔ g�Ýœ¥E¤Lµ½e¼mÐTZÐ$[Ñ$[Ô$[ÐabÐcÑcÔc�Ø 7¨a°'©k¸mÈeÑ>S×=^Ò=^Ð_`Ñ=aÔ=aÐbkÔ=lÑ-lÑ#lÑm�Ý# F§L¢L°°AÑ$6Ô$6Ñ7Ô7ˆFØ�gÑ€FØ�Q‚€Ø]Ð]Ð]Ð]ˆØ˜$˜v™,œ,¨¨¨W©¬�ˆØ�7ˆ?Ðr    r   Úworldç333333Ó?)rŠ   r‹   rŒ   c          	     óâ   — t          | ||||||¦  «        \  }}	|€8|t          v r-t          j        ||	                     d¦  «        z  |	gd¦  «        n|S |t          ||j        ¦  «        d|	z
  z  z   S )a‰  Renders B views of a mesh: [B, H, W, C] float32 on the mesh's device (resolution: int or (H, W)).

    mode:
    - "shaded": sRGB colour, Lambert key light from the camera's upper left plus `ambient`, two-sided;
    - "albedo": unlit sRGB colour (base colour texture x vertex colours, or grey 0.8);
    - "normal": unit normals (C = 3) in world space, or camera space (x right, y up, z towards the camera) with
      normal_space="camera"; normal maps are ignored;
    - "depth": distance along the camera axis (C = 1);
    - "position": world positions (C = 3);
    - "mask": coverage (C = 1).
    With background None, colour modes return RGBA (straight alpha, C = 4) and the other modes are zero where empty;
    otherwise every mode is composited over background (a value or per-channel sequence). supersample renders at that
    factor and averages down (anti-aliasing, fractional coverage on edges).Nçê-�™—q=r/   r   )rº   rŸ   r   rp   r¦   r   r   )
rˆ   r„   r¨   rw   Ú
backgroundrŠ   r‹   rŒ   r±   r°   s
             r   ÚrenderrÀ   ˆ   sƒ   € õ ˜d G¨Z¸¸{ÈLÐZaÑbÔb�O€FˆGØÐØNRÕVaÐNaÐNa�uŒy˜& 7×#4Ò#4°UÑ#;Ô#;Ñ;¸WÐEÀrÑJÔJÐJÐgmÐmØ•G˜J¨¬Ñ6Ô6¸!¸g¹+ÑFÑFÐFr    útuple[torch.Tensor, float]c                ó€  — | j                              ¦   «                              d¦  «        | j                              ¦   «                              d¦  «        }}||z   dz  }|t	          t          | j                              ¦   «         |z
                       d¬¦  «                             ¦   «         ¦  «        d¦  «        fS )Nr   r.   r   r1   ç�íµ ÷Æ°>)r˜   rM   ÚaminÚamaxrl   Únorm)rˆ   ÚlowÚhighÚcenters       r   Ú_framingrÊ   �   sŸ   € Ø”×#Ò#Ñ%Ô%×*Ò*¨1Ñ-Ô-¨t¬}×/BÒ/BÑ/DÔ/D×/IÒ/IÈ!Ñ/LÔ/Lˆ€CØ�D‰j˜AÑ€FØ•3•u˜dœm×1Ò1Ñ3Ô3°fÑ<×BÒBÀqÐBÑIÔI×MÒMÑOÔOÑPÔPÐRVÑWÔWÐWÐWr    rÉ   ÚradiusÚazimuthÚ	elevationc           	     ór  — |t          j        t          j        t          ¦  «        dz  ¦  «        z  }t          j        |¦  «        t          j        |¦  «        }}t	          j        t          j        |¦  «        t          j        |¦  «        z  t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        z  gt          j        | j        ¬¦  «        }t          | ||z  z   | ¦  «        }t          t          dt          |d|z  z
  d|z  ¦  «        |d|z  z   | j        ¬¦  «        }	||	|fS )ziView and projection of a camera orbiting center at the distance where the bounding sphere fills the view.r.   r   r$   çÍÌÌÌÌÌð?çü©ñÒMbP?r&   )rR   ÚsinrT   ÚFIELD_OF_VIEWr   r   Úcosr   r   rH   rV   rl   )
rÉ   rË   rÌ   rÍ   ÚdistanceÚaÚeÚ	directionrG   r…   s
             r   Ú_orbitrØ   £   s'  € à�œ¥¤­mÑ!<Ô!<¸qÑ!@ÑAÔAÑA€HÝŒ<˜Ñ Ô ¥$¤,¨yÑ"9Ô"9€q€AÝ”�dœh q™kœk­D¬H°Q©K¬KÑ7½¼À!¹¼ÅdÄhÈqÁkÄkÕTXÔT\Ð]^ÑT_ÔT_ÑF_Ð`ÕhmÔhuð  Eô  Lð  Mñ  Mô  M€IÝ�6˜I¨Ñ0Ñ0°&Ñ9Ô9€DÝ�]¨Cµ°XÀÀvÁÑ5MÈtÐV^ÉÑ1_Ô1_ÐaiÐlpÐsyÑlyÑayð  CIô  CPð  Qñ  Qô  Q€JØ�˜XÐ%Ð%r    çq=
×£pí?r…   Úfillc                ó8  — ||z   dz  t          ||z
  dz                       ¦   «                              d¦  «        ¦  «        }}||z  }t          j        dt          j        | j        ¬¦  «        }|x|d<   |d<   | |d         z  | |d         z  c|d	<   |d
<   || z  S )zfProjection zoomed and shifted so that the NDC box [low, high] fills `fill` of the image (aspect kept).r.   rÃ   r3   r   ©r   r   ©r   r   r   r   )r   r0   )r   r0   )rM   rl   r¦   r   r>   r   r   )r…   rÇ   rÈ   rÚ   rÉ   ÚhalfÚscaleÚadjusts           r   Ú_zoomrá   ­   sª   € à˜$‘J !Ñ#¥U¨T°C©Z¸1Ñ,<×+AÒ+AÑ+CÔ+C×+MÒ+MÈdÑ+SÔ+SÑ%TÔ%TˆD€FØ�4‰K€EÝŒY�q¥¤°jÔ6GÐHÑHÔH€FØ"'Ð'€Fˆ4�L�6˜$‘<Ø"' ¨&°¬)Ñ!3°e°V¸fÀQ¼iÑ5GÐ€Fˆ4�L�&˜‘,Ø�JÑÐr    rG   c           	     ód  — t          j        | j                             ¦   «         t          j        | j        d d …d d…f         t           j        ¬¦  «        gd¦  «        }|||z  j        z  }|d d …d d…f         |d d …dd …f         z  }|                     d¦  «        |                     d¦  «        fS )Nr   r�   r.   r0   r   )	r   rp   r˜   rM   r™   r   r|   rÄ   rÅ   )rˆ   rG   r…   r«   r¬   Úndcs         r   Ú_ndc_boxrä   ·   s¯   € Ý”)˜Tœ]×0Ò0Ñ2Ô2µE´OÀDÄMÐRSÐRSÐRSÐUWÐVWÐUWÐRWÔDXÕ`eÔ`mÐ4nÑ4nÔ4nÐoÐqrÑsÔs€KØ˜* tÑ+Ô.Ñ.€DØ
ˆqˆqˆq�"�1�"ˆuŒ+˜˜Q˜Q˜Q   ˜UœÑ
#€CØ�8Š8�A‰;Œ;˜Ÿš ™œÐ#Ð#r    é   r.   ©rŠ   Úsizec               óþ   — t          | ¦  «        \  }}t          ||gt          ¢R Ž \  }}}t          |gt	          | ||¦  «        ¢R Ž }t          | ||f|d|¬¦  «        d         }|                     ddd¦  «        dz  dz
  S )zÝCanonical 3/4 view (azimuth 35 degrees from the front towards +X, elevation 20 degrees), shaded, auto-framed on the
    mesh: RGBA [4, size, size] in [-1, 1] with a transparent background (alpha -1), on the mesh's device.r   ræ   r   r.   r   )rÊ   rØ   ÚPREVIEW_VIEWrá   rä   rÀ   rf   )	rˆ   rç   rŠ   rÉ   rË   rG   r…   r¯   Úimages	            r   Úpreviewrë   ¾   s•   € õ ˜d‘^”^�N€FˆFÝ  ¨Ð?µ,Ð?Ð?Ð?Ñ€Dˆ*�aÝ�zÐE¥H¨T°4¸Ñ$DÔ$DÐEÐEÐE€JÝ�4˜$ 
Ð+¨T°8ÈÐUÑUÔUÐVWÔX€EØ�=Š=˜˜A˜qÑ!Ô! AÑ%¨Ñ)Ð)r    c           
     ó
  — |t           vrt          d|›�¦  «        ‚| j        j        }t	          |t
          ¦  «        r||fn|\  }}	|du o|t          v }
|
rdnt          |€dn||¦  «        }t          | ¦  «        \  }}t          |¦  «        }t          dd||	z  |z  |z  z  ¦  «        }t          j        |||	|
rdndt          j        |¬¦  «        }t          d	||¦  «        D ]ê}t          ||z   |¦  «        }t!          | |||…         |||…         f||	f||d
d¦  «        \  }}|dk    r"|d         |d         c|||…dd	f<   |||…ddf<   Œi|
r3t          j        ||                     d¦  «        z  |gd¦  «        |||…<   Œž|dk    r	||z   dz  }n|dk    r|||z
  |z  z
  d|z  z  }||d|z
  z  z                        dddd¦  «        |||…<   Œë|dk    �r0|d                              ¦   «         }|d         |                     d¦  «        z  }||dk             }t          |¦  «        r(|                     ¦   «         | 
                    ¦   «         fn+t          j        d|¬¦  «        t          j        d|¬¦  «        f\  }}|dd||z
  z  ||z
                       d|z  ¦  «        z  z
                       d	d¦  «        z  }|d         |                     dddd¦  «        d|d         z
  z  z                        dddd¦  «        |dd…<   |S )aÇ  Views [B, H, W, C] in 0..1 rendered by groups (bounded memory). Colour modes: RGBA with straight alpha when
    background is None (C = 4), else sRGB over background. Other modes (C = 3, over black by default): normal:
    camera-space (n + 1) / 2; depth: linear from 1 at the nearest to 0.15 at the farthest surface seen in all the views
    (no flicker between views); mask: coverage; position: world coordinates mapped from the bounding sphere to 0..1.rŽ   Nr"   r   ra   r3   r0   r   r   r‘   r¼   r   r5   .r¾   r/   r   r.   r   r�   g+‡ÙÎ÷ï?© r&   ç333333ë?rÃ   r4   )r–   r—   r˜   r   r   r^   rŸ   r   rÊ   r@   rl   r   Úemptyr   ro   re   rº   rp   r¦   rƒ   ÚcloneÚzerosÚonesr§   r7   )rˆ   rG   r…   r¨   rw   r¿   rŠ   r   rX   rj   ÚtransparentrÉ   rË   r†   ÚgroupÚimagesÚstartÚstopr±   Úcoverager   ÚsolidrO   rP   s                           r   Ú_encoded_viewsrú   È   s¹  € ð
 •5ÐÐÝÐ8°Ð8Ð8Ñ9Ô9Ð9ØŒ]Ô!€FÝ0:¸:ÅsÑ0KÔ0KÐ[�Z Ð,Ð,ÐQ[�M€FˆEØ Ð$Ð<¨µÐ)<€KØ$Ðd��­'¸Ð9K°#°#ÐQ[Ð]cÑ*dÔ*d€JÝ˜d‘^”^�N€FˆFÝ�‰IŒI€EÝ��G ¨%¡°+Ñ!=ÀÑ!KÑLÑMÔM€EÝŒ[˜ ¨°KÐ/F¨q¨qÀQÍeÌmÐdjÐkÑkÔk€FÝ�q˜% Ñ'Ô'ð Zð ZˆÝ�5˜5‘= %Ñ(Ô(ˆÝ" 4¨$¨u°T¨zÔ*:¸JÀuÈTÀzÔ<RÐ)SÐV\Ð^cÐUdÐfjÐlwð  zBð  DGñ  Hô  HÑˆ�Ø�7Š?ˆ?ØEKÈFÄ^ÐU]Ð^dÔUeÐBˆF�5˜�:˜s AÐ%Ñ&¨¨u°T¨z¸3ÀÐ/AÑ(BØØð 	Ý!&¤¨F°X×5GÒ5GÈÑ5NÔ5NÑ,NÐPXÐ+YÐ[]Ñ!^Ô!^ˆF�5˜�:ÑØØ�8ÒÐØ˜xÑ'¨1Ñ,ˆFˆFØ�ZÒÐØ ¨¡°8Ñ;Ñ;ÀÀFÁ
ÑKˆFØ$ z°Q¸±\Ñ'BÑB×JÒJÈ2ÈrÐSUÐWXÑYÔYˆˆu�TˆzÑÐØˆw‚�Ø˜&”>×'Ò'Ñ)Ô)ˆØ�v” ×!3Ò!3°EÑ!:Ô!:Ñ:ˆØ�h Ò&Ô'ˆÝ25°e±*´*ð  B�U—Y’Y‘[”[ %§)¢)¡+¤+Ð.Ð.Å5Ä;ÈrÐZ`ÐCaÑCaÔCaÕchÔcmÐnpÐyð  dAñ  dAô  dAð  CB‰	ˆˆcØ˜Q ¨°©Ñ!6¸#À¹*×9OÒ9OÐPTÐW]ÑP]Ñ9^Ô9^Ñ!^Ñ^×eÒeÐfgÐijÑkÔkÑkˆØ˜IÔ&¨×);Ò);¸A¸qÀ!ÀRÑ)HÔ)HÈAÐPXÐYbÔPcÑLcÑ)dÑd×lÒlÐmoÐqsÐuwÐyzÑ{Ô{ˆˆqˆqˆq‰	Ø€Mr    é0   g      .@)rÍ   r¿   rŠ   Úframesc          	     óö  ‡ ‡‡‡‡‡— |t           vrt          d|›�¦  «        ‚t          ‰ ¦  «        \  ŠŠˆˆˆˆfd„t          ‰¦  «        D ¦   «         }ˆ fd„|D ¦   «         }t	          j        d„ |D ¦   «         ¦  «                             d¦  «        t	          j        d„ |D ¦   «         ¦  «                             d¦  «        }
}	t	          j        |	 	                    ¦   «         |
 	                    ¦   «         ¦  «        Št	          j        d„ |D ¦   «         ¦  «        t	          j        ˆfd„|D ¦   «         ¦  «        }}|�|n|t          v rd
nd}t          ‰ ||||||¦  «                             dddd¦  «        dz  dz
  S )a/  Turntable video [3, frames, size, size] in [-1, 1]: the camera orbits the mesh (starting at the front, +Z, moving
    towards +X) with the key light attached to it, framed so that the mesh stays in view on every frame. Encodings as
    _encoded_views; shaded / albedo over a white background by default.rŽ   c                ó@   •— g | ]}t          ‰‰d |z  ‰z  ‰¦  «        ‘ŒS )g     €v@)rØ   )r+   ÚirÉ   rÍ   rü   rË   s     €€€€r   rk   zturntable.<locals>.<listcomp>÷   s0   ø€ Ð[Ð[Ð[È�f�V˜V U¨Q¡Y°Ñ%7¸ÑCÔCÐ[Ð[Ð[r    c                ó:   •— g | ]\  }}}t          ‰||¦  «        ‘ŒS rí   )rä   )r+   rG   r…   r¯   rˆ   s       €r   rk   zturntable.<locals>.<listcomp>ø   s,   ø€ ÐPÐPÐPÑ2E°$¸
ÀA�X�d˜D *Ñ-Ô-ÐPÐPÐPr    c                ó   — g | ]
}|d          ‘ŒS )r   rí   ©r+   Úbs     r   rk   zturntable.<locals>.<listcomp>ù   s   € Ð1Ð1Ð1 a˜Q˜qœTÐ1Ð1Ð1r    r   c                ó   — g | ]
}|d          ‘ŒS )r   rí   r  s     r   rk   zturntable.<locals>.<listcomp>ù   s   € ÐH]ÐH]ÐH]ÐRSÈÈ1ÌÐH]ÐH]ÐH]r    c                ó   — g | ]\  }}}|‘Œ	S rí   rí   )r+   r,   r¯   s      r   rk   zturntable.<locals>.<listcomp>û   s   € Ð#<Ð#<Ð#<©'¨!¨Q° AÐ#<Ð#<Ð#<r    c                ó<   •— g | ]\  }}}t          |‰ ‰¦  «        ‘ŒS rí   )rá   )r+   r¯   ÚprÞ   s      €r   rk   zturntable.<locals>.<listcomp>û   s5   ø€ ÐKxÐKxÐKxÑfmÐfgÐijÐlmÍEÐRSÐVZÐUZÐ\`ÑLaÔLaÐKxÐKxÐKxr    N)r$   r$   r$   r"   r0   r   r.   )r–   r—   rÊ   ro   r   r=   rÄ   rÅ   ÚmaximumÚabsrŸ   rú   rf   )rˆ   rü   rç   rw   rÍ   r¿   rŠ   ÚorbitsÚboxesrÇ   rÈ   rG   r…   rÉ   rÞ   rË   s   ``  `        @@@r   Ú	turntabler  ï   s•  øøøøøø€ ð
 •5ÐÐÝÐ8°Ð8Ð8Ñ9Ô9Ð9Ý˜d‘^”^�N€FˆFØ[Ð[Ð[Ð[Ð[Ð[Ð[ÍUÐSYÉ]Ì]Ð[Ñ[Ô[€FØPÐPÐPÐPÈÐPÑPÔP€EÝ”Ð1Ð1¨5Ð1Ñ1Ô1Ñ2Ô2×7Ò7¸Ñ:Ô:½E¼KÐH]ÐH]ÐW\ÐH]ÑH]ÔH]Ñ<^Ô<^×<cÒ<cÐdeÑ<fÔ<fˆ€CÝŒ=˜Ÿš™œ D§H¢H¡J¤JÑ/Ô/€DÝ”{Ð#<Ð#<°VÐ#<Ñ#<Ô#<Ñ=Ô=½u¼{ÐKxÐKxÐKxÐKxÐqwÐKxÑKxÔKxÑ?yÔ?yˆ*€DØ)Ð5��ÈdÕVaÐNaÐNa¸?¸?Ðgj€JÝ˜$  j°$¸¸jÈ+ÑVÔV×^Ò^Ð_`ÐbcÐefÐhiÑjÔjÐmnÑnÐqrÑrÐrr    )r"   r"   )g     €f@r"   )ç     €V@r"   )ç     €VÀr"   )r"   r  )r"   r  )ÚfrontÚbackÚleftrE   ÚtopÚbottomÚthree_quarterr[   )ç      à?r  r  r"   )r…   ÚzoomÚfocusÚquantilerÚ   Úpointsr  r  c               ó	  — t          |t          ¦  «        r||fn|\  }}	| j        }
| ddt          dt	          | ¦  «        dz  ¦  «        …                              ¦   «         }|dk    r1t          j        ||d¬¦  «        t          j        |d|z
  d¬¦  «        fn)|                     d¦  «        | 	                    d¦  «        f\  }}||z   dz  t          t          ||z
   
                    ¦   «         dz  ¦  «        d¦  «        }}|t          ||
¦  «        ||z
  z  z   }|t          j        t          j        t          ¦  «        dz  ¦  «        z  }t          |d|z  z
  d	|z  ¦  «        |d|z  z   }}|d
k    rt!          t          |	|z  |||
¬¦  «        nt#          d|z  |	|z  |||
¬¦  «        }t          j        |t          j        |dd…dd…f         ¦  «        gd¦  «        }g t          j        d|
¬¦  «        }}|D �]ì\  }}t          j        |¦  «        t          j        t          dt+          d|¦  «        ¦  «        ¦  «        }}t          j        t          j        |¦  «        t          j        |¦  «        z  t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        z  gt          j        |
¬¦  «        }t          j        d|¦  «        }t5          |¦  «        dk     rdn0t          j        |¦  «         |z  dt          j        |¦  «         |z  f}||t7          |||z  z   ||¦  «        z  j        z  }|dd…dd…f         |dd…dd…f         z                       ¦   «         } t          j        ||dk    rt          j        | d|z
  d¬¦  «        n|  	                    d¦  «        ¦  «        }|                     t7          |||z  z   ||¦  «        ¦  «         �Œît          j        dt          j        |
¬¦  «        }!||z  t          |                     ¦   «                               d¦  «        ¦  «        z  x|!d<   |!d<   t          j!        |¦  «        |!|z   "                    t	          |¦  «        dd¦  «        fS )aB  Cameras (view [B, 4, 4], projection [B, 4, 4]) around points [N, 3] at angles [(azimuth, elevation)] in degrees:
    azimuth 0 looks at the front (+Z), 90 at the +X side (an object's left when it faces the front camera), 180 at the
    back; elevation 90 looks from above. Every view shares one scale: the points fill `fill` of the image in the view
    where they extend most (their quantile .. 1 - quantile range when quantile > 0, against splat floaters), magnified
    by zoom, centred on focus (fractions of the bounding box: 0.5 is the centre, y 1 the top, z 1 the front).Nr   é ¡ r   r1   r.   rÃ   rÏ   rÐ   rV   r&   r  r  r   r$   gš™™™™yV@r#   r"   r0   r3   rÜ   rÝ   )#r   r^   r   rl   r@   rM   r   r  rÄ   rÅ   rÆ   r   rR   rÑ   rT   rÒ   rV   r[   rp   r™   rñ   re   r   rÓ   r   Úcopysignr	  rH   r|   r  Úappendr>   r¦   r=   rƒ   )"r  Úanglesr¨   r…   r  r  r  rÚ   rX   rj   r   ÚsamplerÇ   rÈ   rÉ   rË   rA   rÔ   rO   rP   Úbaser«   ÚviewsrÞ   rÌ   rÍ   rÕ   rÖ   r×   ÚsignrB   r¬   rã   rà   s"                                     r   Úorbit_camerasr#    sÈ  € õ 1;¸:ÅsÑ0KÔ0KÐ[�Z Ð,Ð,ÐQ[�M€FˆEØŒ]€FØÐ3Ð3•c˜!�S ™[œ[¨FÑ2Ñ3Ô3Ð3Ô4×:Ò:Ñ<Ô<€FØjrÐuvÒjvÐjv•” ¨°aÐ8Ñ8Ô8½%¼.ÈÐQRÐU]ÑQ]ÐcdÐ:eÑ:eÔ:eÐfÐfð  ~D÷  ~Iò  ~Ið  JKñ  ~Lô  ~Lð  NT÷  NYò  NYð  Z[ñ  N\ô  N\ð  }]�I€CˆØ˜D‘j AÑ%¥s­5°$¸±*×1BÒ1BÑ1DÔ1DÀqÑ1HÑ+IÔ+IÈ4Ñ'PÔ'PˆF€FØ•7˜5 &Ñ)Ô)¨T°C©ZÑ8Ñ8€FØ�œ¥¤­mÑ!<Ô!<¸qÑ!@ÑAÔAÑA€HÝ�H˜t f™}Ñ,¨d°X©oÑ>Ô>ÀÈ4ÐRXÉ=Ñ@Xˆ#€DØS]ÐanÒSnÐSn�;•} e¨f¡n°d¸CÈÐOÑOÔOÐOõ  uAð  BCð  FLñ  BLð  NSð  V\ñ  N\ð  ^bð  dgð  pvð  uwñ  uwô  uw€DÝ”)˜V¥U¤_°V¸A¸A¸A¸rÀ¸r¸E´]Ñ%CÔ%CÐDÀaÑHÔH€KØ•e”k !¨FÐ3Ñ3Ô3ˆ4€EØ$ð Iñ IÑˆ�ÝŒ|˜GÑ$Ô$¥d¤lµ3°u½cÀ$È	Ñ>RÔ>RÑ3SÔ3SÑ&TÔ&Tˆ1ˆÝ”L¥$¤(¨1¡+¤+µ´¸±´Ñ";½T¼XÀa¹[¼[Í$Ì(ÐSTÉ+Ì+ÕX\ÔX`ÐabÑXcÔXcÑJcÐ!dÕlqÔlyð  CIð  Jñ  Jô  Jˆ	ÝŒ}˜S )Ñ,Ô,ˆÝ # I¡¤°Ò 5Ð 5ˆ_ˆ_½T¼XÀa¹[¼[¸LÈ4Ñ<OÐQTÕW[ÔW_Ð`aÑWbÔWbÐVbÐeiÑViÐ;jˆØ˜d¥W¨V°iÀ(Ñ6JÑ-JÈFÐTVÑ%WÔ%WÑWÔZÑZˆØ�A�A�A�r˜�r�EŒ{˜T ! ! ! Q R R %œ[Ñ(×-Ò-Ñ/Ô/ˆÝŒ}˜TÈxÐZ[Ê|È|¥5¤>°#°q¸8±|ÈÐ#KÑ#KÔ#KÐ#KÐad×aiÒaiÐjkÑalÔalÑmÔmˆØ�Š•W˜V i°(Ñ&:Ñ:¸FÀBÑGÔGÑHÔHÐHÑHÝŒY�q¥¤°fÐ=Ñ=Ô=€FØ"&¨¡+µ°d·h²h±j´j×6JÒ6JÈ4Ñ6PÔ6PÑ0QÔ0QÑ"QÐQ€Fˆ4�L�6˜$‘<ÝŒ;�uÑÔ ¨¡×5Ò5µc¸%±j´jÀ!ÀQÑGÔGÐGÐGr    c                ó„   — t          | t          ¦  «        rt          | j        ||fi |¤ŽS t          | d         ||fdddœ|¤ŽS )zÚorbit_cameras of a mesh, or of Gaussian splats framed on the 2-98 % quantiles of their centres (against floaters):
    the cameras render_views / render_splat_views use, computed once for a sequence rendered in slices.Úmeansç{®Gáz”?rî   )r  rÚ   )r   r   r#  r˜   )Úassetr  r¨   Úframings       r   Úasset_camerasr)  %  sZ   € õ �%�ÑÔð LÝ˜Uœ^¨V°ZÐKÐKÀ7ÐKÐKÐKÝ˜˜wœ¨°ÐaÀdÐQUÐaÐaÐY`ÐaÐaÐar    )r…   r  r  r¿   rŠ   r„   c          	     ód   — |	€t          | |||||¬¦  «        n|	\  }
}t          | |
|||||¦  «        S )a  Views [B, H, W, C] in 0..1 of a mesh from orbit_cameras (one scale shared by every view), encoded as
    _encoded_views: RGBA with a transparent background for the colour modes by default. cameras: a slice of the
    asset_cameras of a longer sequence, rendered instead of angles.N©r…   r  r  )r)  rú   )rˆ   r  r¨   rw   r…   r  r  r¿   rŠ   r„   rG   s              r   Úrender_viewsr,  -  sU   € ð
 ryð  rA•} T¨6°:È*Ð[_ÐglÐmÑmÔmÐmð  GNÑ€Dˆ*Ý˜$  j°*¸dÀJÐP[Ñ\Ô\Ð\r    )gm›BP×Ò?gštWxCEß?)g”+{ñ?ç”+{ñ¿g›gŒ`/Ô?r-  g”+{á?)ç;a>£áâ¿g-­\äø@çêV^=@Ý¿g°hüâ×?r/  g-­\äø÷?r.  ÚsplatsÚdictÚ
directionsc                óš  — | d                               ¦   «         g| d         €g n9t          | d                               ¦   «                              d¦  «        ¦  «        z   }d„ |                     d¦  «        D ¦   «         \  }}}t          |d         z  }t	          |¦  «        dk    r>|t
          |z  |d         z  z
  t
          |z  |d         z  z   t
          |z  |d         z  z
  }t	          |¦  «        d	k    �r¼||z  ||z  ||z  }	}}|t          d         |z  |z  |d	         z  z   t          d         |z  |z  |d
         z  z   t          d         d|	z  |z
  |z
  z  |d         z  z   t          d         |z  |z  |d         z  z   t          d	         ||z
  z  |d         z  z   }t	          |¦  «        dk    �r |t          d         |z  d|z  |z
  z  |d         z  z   t          d         |z  |z  |z  |d         z  z   t          d         |z  d	|	z  |z
  |z
  z  |d         z  z   t          d         |z  d|	z  d|z  z
  d|z  z
  z  |d         z  z   t          d	         |z  d	|	z  |z
  |z
  z  |d         z  z   t          d
         |z  ||z
  z  |d         z  z   t          d         |z  |d|z  z
  z  |d         z  z   }|dz                        d¦  «        S )zÝColours [N, 3] of splats seen along unit directions [N, 3] (from the camera to each splat), evaluating their
    spherical harmonics (degrees 0 to 3) as 3D Gaussian Splatting does: 0.5 + sum of the SH terms, clamped at 0.Úsh_dcÚsh_restNr   c              3  ó.   K  — | ]}|d d …d f         V — Œd S r)   rí   )r+   Úds     r   r-   zsplat_colors.<locals>.<genexpr>@  s.   è è € Ð8Ð8˜aˆq����D�ŒzÐ8Ð8Ð8Ð8Ð8Ð8r    r   r.   r0   r3   r’   é   é   é   é	   é
   é   é   é   é   é   r  )	rM   ÚlistÚunbindÚSH_C0r@   ÚSH_C1ÚSH_C2ÚSH_C3r¦   )
r0  r2  Úshr”   ÚyÚzÚresultÚxxÚyyÚzzs
             r   Úsplat_colorsrO  <  sf  € ð �Œ/×
Ò
Ñ
!Ô
!Ð	"¨F°9Ô,=Ð,E b bÍ4ÐPVÐW`ÔPa×PgÒPgÑPiÔPi×PpÒPpÐqrÑPsÔPsÑKtÔKtÑ	u€BØ8Ð8 :×#4Ò#4°QÑ#7Ô#7Ð8Ñ8Ô8�G€A€qˆ!Ý�R˜”U‰]€FÝ
ˆ2�w„w�‚{€{Ø�% !™) b¨¤eÑ+Ñ+­e°a©i¸"¸Q¼%Ñ.?Ñ?Å%È!Á)ÈbÐQRÌeÑBSÑSˆÝ
ˆ2�w„w�‚{�{Ø˜‘U˜A ™E 1 q¡5�ˆBˆØ�5 œ8 a™<¨!Ñ+¨b°¬eÑ3Ñ3µe¸A´hÀ±lÀQÑ6FÈÈAÌÑ6NÑNÕQVÐWXÔQYÐ]^ÐacÑ]cÐfhÑ]hÐkmÑ]mÑQnÐqsÐtuÔqvÑQvÑvÕy~ð  @Aô  zBð  EFñ  zFð  IJñ  zJð  MOð  PQô  MRñ  zRñ  RÝ˜!”H  R¡Ñ(¨2¨a¬5Ñ0ñ1ˆåˆr‰7Œ7�QŠ;‰;Ø�u Qœx¨!™|¨q°2©v¸©{Ñ;¸bÀ¼eÑCÑCÅeÈAÄhÐQRÁlÐUVÑFVÐYZÑFZÐ]_Ð`bÔ]cÑFcÑcÕfkÐlmÔfnÐqrÑfrÐvwÐz|Ñv|ð  @Bñ  wBð  EGñ  wGñ  gHð  KMð  NPô  KQñ  gQñ  QÝ˜aœ 1™¨¨B©°°R±©¸!¸b¹&Ñ(@ÑAÀBÀrÄFÑJñKÝMRÐSTÌXÐXYÉ\Ð]^ÐacÑ]cÐfhÑ]hÐkmÑ]mÑMnÐqsÐtvÔqwÑMwñxå˜aœ 1™¨¨R©Ñ0°2°b´6Ñ9ñ:å<AÀ!¼HÀq¹LÈBÐQRÐUWÑQWÉKÑ<XÐ[]Ð^`Ô[aÑ<añbˆFð �S‰L×#Ò# AÑ&Ô&Ð&r    Úqc                óÒ  — t          j        |                      ¦   «         d¬¦  «                             d¦  «        \  }}}}t	          j        dd||z  ||z  z   z  z
  d||z  ||z  z
  z  d||z  ||z  z   z  d||z  ||z  z   z  dd||z  ||z  z   z  z
  d||z  ||z  z
  z  d||z  ||z  z
  z  d||z  ||z  z   z  dd||z  ||z  z   z  z
  g	d¦  «                             ddd¦  «        S )Nr   r1   r.   r/   r0   )r8   r9   rM   rC  r   r=   rG   )rP  rª   r”   rI  rJ  s        r   Ú_quaternion_matricesrR  O  s.  € Ý”˜QŸWšW™YœY¨AÐ.Ñ.Ô.×5Ò5°aÑ8Ô8�J€A€qˆ!ˆQÝŒ;˜˜A  Q¡¨¨Q©¡Ñ/Ñ/°°a¸!±e¸aÀ!¹e±mÑ1DÀaÈ1ÈqÉ5ÐSTÐWXÑSXÉ=ÑFYØ˜Q ™U Q¨¡U™]Ñ+¨Q°°a¸!±e¸aÀ!¹e±mÑ1DÑ-DÀaÈ1ÈqÉ5ÐSTÐWXÑSXÉ=ÑFYØ˜Q ™U Q¨¡U™]Ñ+¨Q°!°a±%¸!¸a¹%±-Ñ-@À!ÀaÈ1ÈqÉ5ÐSTÐWXÑSXÉ=ÑFYÑBYð[à\]ñ_ô _ç_cÒ_cÐdfÐhiÐklÑ_mÔ_mðnr    r&  r%  c           
     ó¼  — | ddt          dt          | ¦  «        dz  ¦  «        …                              ¦   «         }t          j        ||d¬¦  «        t          j        |d|z
  d¬¦  «        }}||z   dz  }t          |t          t          ||z
                       ¦   «         dz  ¦  «        d¦  «        gt          ¢R Ž \  }}}t          j        |t          j	        |dd…dd…f         ¦  «        gd¦  «        ||z  j
        z  }	|	dd…dd…f         |	dd…dd…f         z  }
|t          |t          j        |
|d¬¦  «        t          j        |
d|z
  d¬¦  «        d	¬
¦  «        fS )zfCanonical 3/4 camera on the bulk of the splats (quantiles, so that floaters do not shrink the object).Nr   r  r   r1   r.   rÃ   r0   rî   )rÚ   )rl   r@   rM   r   r  rØ   rÆ   ré   rp   r™   r|   rá   )r%  r  r  rÇ   rÈ   rÉ   rG   r…   r¯   r«   rã   s              r   Ú_splat_framingrT  V  so  € àÐ1Ð1•S˜�C ™JœJ¨&Ñ0Ñ1Ô1Ð1Ô2×8Ò8Ñ:Ô:€FÝ”˜v x°QÐ7Ñ7Ô7½¼ÈÐPQÐT\ÑP\ÐbcÐ9dÑ9dÔ9dˆ€CØ�D‰j˜AÑ€FÝ  ­­U°D¸3±J×3DÒ3DÑ3FÔ3FÈÑ3JÑ-KÔ-KÈTÑ)RÔ)RÐbÕUaÐbÐbÐbÑ€Dˆ*�aÝ”)˜V¥U¤_°V¸A¸A¸A¸rÀ¸r¸E´]Ñ%CÔ%CÐDÀaÑHÔHÈJÐY]ÑL]ÔK`Ñ`€KØ
�a�a�a˜˜!˜�eÔ
˜{¨1¨1¨1¨a¨b¨b¨5Ô1Ñ
1€CØ•�z¥5¤>°#°xÀQÐ#GÑ#GÔ#GÍÌÐX[Ð]^ÐaiÑ]iÐopÐIqÑIqÔIqÐx|Ð}Ñ}Ô}Ð}Ð}r    i   )r„   Ú
max_radiusÚfragment_budgetrU  ú
int | NonerV  c               ó†  — | d                               ¦   «         }|j        }t          |t          ¦  «        r||fn|\  }}|€t	          |¦  «        nd„ t          ||¦  «        D ¦   «         \  }	}
|p t          dt          ||¦  «        dz  ¦  «        }t          j	        |t          j
        |dd…dd…f         ¦  «        gd¦  «        |	j        z  }||
j        z  }|dd…df         }t          j        |dd…df         |z  dz   |z  dz  d	z
  d|dd…df         |z  z
  |z  dz  d	z
  gd¦  «        }|
ddd…dd…f         |dd…ddf         z  |dd…dd…df         |
ddd…dd…f         z  z
  ||z  dd…ddf         z  }|t          j        |dz  | dz  g|¬
¦  «        ddd…df         z  |	ddd…dd…f         z  }|t          | d         ¦  «        | d                               ¦   «         dd…ddd…f         z  z  }||                     dd¦  «        z  dt          j        d|¬
¦  «        z  z   }|dd…ddf         |dd…ddf         |dd…ddf         }}}||z  ||z  z
  }t          j        || |gd¦  «        |dd…df         z  }t          j        d||z   dz  ||z
  dz  dz  ||z  z                        ¦   «         z                        ¦   «         z  ¦  «                             d|¦  «                             ¦   «         }|dd…df          dk    |dk    z  | d         dk    z  |dk    z  }|||dd…df         z   dk    ||dd…df         z
  t          j        |dz
  |dz
  g|¬
¦  «        k    z                       d¦  «        z  }|                     ¦   «                              d¦  «        }|t          j        ||df          d¬¦  «                 }|	dd…dd…f         j         |	dd…df         z  }| d         €dn| d         |         }t3          | d         |         |dœt5          j        ||         |z
  d¬¦  «        ¦  «        }||         ||         ||         | d         |                               ¦   «         f\  }}}}t          j        ||z  dt          j        |¬¦  «        }t          j        ||z  t          j        |¬¦  «        }d|z  dz   dz  } |                      d¦  «        }!d}"|"tA          |¦  «        k     �r§t          t          t          j!        |!|!|"         | |"         z
  |z   d¬¦  «        ¦  «        |"dz   ¦  «        }#| |"|#…         }$t          j"        t          j#        |"|#|¬
¦  «        |$¦  «        }%t          j#        tA          |%¦  «        |¬
¦  «        t          j"        |$                     d¦  «        |$z
  |$¦  «        z
  }&d||%         z  dz   }'t          j$        ||%df         ¦  «                             ¦   «         |& %                    |'d¬¦  «        z   ||%         z
  }(t          j$        ||%df         ¦  «                             ¦   «         |&|'z  z   ||%         z
  })|)||%df         z
  |(||%df         z
  }+}*d||%df         |*z  |*z  ||%df         |+z  |+z  z   z  ||%df         |*z  |+z  z
  },||%         |, &                    ¦   «         z   '                    d¦  «        }-|-dk    |)dk    z  |)|k     z  |(dk    z  |(|k     z  }.|(|z  |)z   |.         |-|.          (                    ¦   «         |%|.         }%}-}/t          j)        |/d¬¦  «        \  }/}0|-|0         |%|0         }%}-t          j*        |- ¦  «        }1|1                     d¦  «        |1z
  }2t          j
        |/t          j+        ¬¦  «        }3|/dd…         |/dd…         k    |3dd…<   |2|2t          j,        t          j-        |3t          j#        tA          |/¦  «        |¬
¦  «        d¦  «        d¦  «        j.                 z
  }2||/         |2z    &                    ¦   «         |-z                        ¦   «         }4| /                    d|/|4dd…df         ||%         z  ¦  «         | /                    d|/|1¦  «         |#}"|"tA          |¦  «        k     �°§d| &                    ¦   «         z
                        ¦   «         }5||5 0                    d¦  «        dd…df         z                       dd¦  «        }6t          j	        |6|5dd…df         gd¦  «        j         1                    d||¦  «        dz  dz
  S )aé  Thumbnail of Gaussian splats (see splats.py for the dict): RGBA [4, H, W] in [-1, 1] (size: int or (H, W)), transparent
    background, on the device of the splats. Pure PyTorch (no CUDA extension): each splat is projected as an elliptical
    2D Gaussian (3DGS EWA projection with the 0.3 pixel low-pass), coloured by its spherical harmonics for the view
    direction, and alpha-blended front to back in depth order (one depth per splat, as 3DGS). cameras: (view,
    projection) like render(); by default the canonical 3/4 view framed on the 2-98 % quantiles of the centres. Splat
    footprints are clipped to max_radius pixels (a quarter of the smaller side by default); fragment_budget bounds the memory
    (about 190 bytes per fragment).r%  Nc              3  ó&   K  — | ]}|d          V — ŒdS )r   Nrí   )r+   r‚   s     r   r-   z splat_preview.<locals>.<genexpr>l  s&   è è € ÐEnÐEnÈqÀaÈÄdÐEnÐEnÐEnÐEnÐEnÐEnr    r.   r3   r   r0   r   r  r&   Ú	rotationsÚscalesr¼   Ú	opacitiesgp?T)Ústabler5  r4  )r4  r5  r1   r   )rE   rz   )Úrounding_modeg      à¿g®Gáz®ï?r�   r/   r¾   )2rM   r   r   r^   rT  r‡   rl   re   r   rp   r™   r|   r=   r   rR  rš   r>   rm   Úsqrtr§   ÚlongÚallÚnonzeroÚsqueezeÚargsortrO  r8   r9   rñ   r   Úfloat64Úcumsumr@   ÚsearchsortedÚrepeat_interleaveÚarangeÚroundÚdivÚexpÚ	clamp_maxÚdoubleÚsortÚlog1pÚboolÚcummaxr¤   r±   Ú
index_add_r¦   r7   )7r0  rç   r„   rU  rV  r%  r   rX   rj   rG   r…   r‘   r¬   rª   ÚcentreÚjacobianÚ	footprintÚ
covariancerÕ   r  ÚcÚdeterminantÚconicrË   ÚvisibleÚorderr>   Úrestr    Úopacityrê   Úlog_transmittanceÚcountsÚendsrö   r÷   ÚspanÚsplatÚlocalÚsideÚrowÚcolÚoxÚoyÚpowerÚalphaÚkeepÚpixelro  ÚattenuationÚbeforeÚfirstÚweightrø   Úrgbs7                                                          r   Úsplat_previewr“  a  s$
  € ð �7ŒO×!Ò!Ñ#Ô#€EØŒ\€FÝ$.¨tµSÑ$9Ô$9ÐC�T˜4�L�L¸t�M€FˆEØ07°•~ eÑ,Ô,Ð,ÐEnÐEnÕT\Ð]dÐflÑTmÔTmÐEnÑEnÔEnÑ€Dˆ*ØÐ>�s 1¥c¨&°%Ñ&8Ô&8¸AÑ&=Ñ>Ô>€JÝŒY˜�uœ¨u°Q°Q°Q¸¸¸°U¬|Ñ<Ô<Ð=¸qÑAÔAÀDÄFÑJ€FØ�J”LÑ €DØˆQˆQˆQ�ˆTŒ
€AÝŒ[˜4    1 œ:¨™>¨AÑ-°Ñ6¸Ñ:¸SÑ@À1ÀtÈAÈAÈAÈqÈDÄzÐTUÁ~ÑCUÐY_ÑB_ÐbcÑBcÐfiÑBiÐjÐlmÑnÔn€FØ˜4  !  R a R˜<Ô(¨1¨Q¨Q¨Q°°d¨]Ô+;Ñ;¸dÀ1À1À1ÀbÀqÀbÈ$À;Ô>OÐR\Ð]aÐcdÐceÐceÐgiÐhiÐgiÐ]iÔRjÑ>jÑjÐopÐstÑotÐvwÐvwÐvwÐy}ð  @Dð  wDô  oEñ  E€HØ�5œ<¨°©°V°G¸a±KÐ(@ÈÐPÑPÔPÐQUÐWXÐWXÐWXÐZ^ÐQ^Ô_Ñ_ÐcgÐhlÐnpÐopÐnpÐrtÐstÐrtÐhtÔcuÑu€HØÕ0°¸Ô1DÑEÔEÈÈxÔHX×H^ÒH^ÑH`ÔH`ÐabÐabÐabÐdhÐjkÐjkÐjkÐakÔHlÑlÑm€IØ˜Y×0Ò0°°AÑ6Ô6Ñ6¸½u¼yÈÐSYÐ?ZÑ?ZÔ?ZÑ9ZÑZ€JØ˜˜˜˜A˜q˜Ô! :¨a¨a¨a°°A¨gÔ#6¸
À1À1À1ÀaÈÀ7Ô8Kˆ!€q€AØ�a‘%˜!˜a™%‘-€KÝŒK˜˜Q˜B ˜
 AÑ&Ô&¨°Q°Q°Q¸°WÔ)=Ñ=€EÝŒZ˜˜a !™e q™[¨a°!©e°q©[¸QÑ,>ÀÀQÁÑ,F×+LÒ+LÑ+NÔ+NÑN×TÒTÑVÔVÑVÑWÔW×]Ò]Ð^_ÐakÑlÔl×qÒqÑsÔs€FØ�q�q�q˜!�t”ˆ}˜qÒ  Q¨¢UÑ+¨v°kÔ/BÀWÒ/LÑMÐQ\Ð_`ÒQ`Ña€GØ�˜&    D œ/Ñ)¨QÒ.°6¸FÀ1À1À1ÀdÀ7¼OÑ3KÍuÌ|Ð]bÐefÑ]fÐhnÐqrÑhrÐ\sð  }Cð  PDñ  PDô  PDò  4Dñ  E÷  Jò  Jð  KLñ  Mô  Mñ  M€GØ�OŠOÑÔ×%Ò% aÑ(Ô(€EØ•%”- ¨¨q¨Ô!1Ð 1¸$Ð?Ñ?Ô?Ô@€EØ����B�Q�B�Œ<Œ>ˆ/˜D  !  Q œKÑ
'€CØ˜)Ô$Ð,ˆ4ˆ4°&¸Ô2CÀEÔ2J€DÝ F¨7¤O°EÔ$:ÀtÐLÐLÍaÌkÐZ_Ð`eÔZfÐilÑZlÐrsÐNtÑNtÔNtÑuÔu€FØ%+¨E¤]°E¸%´LÀ&ÈÄ-ÐQWÐXcÔQdÐejÔQk×QqÒQqÑQsÔQsÐ%sÑ"€FˆE�6˜7åŒK˜ ™¨µ´ÀvÐNÑNÔN€EÝœ F¨U¡N½%¼-ÐPVÐWÑWÔWÐØ�&‰j˜1‰n Ñ"€FØ�=Š=˜ÑÔ€DØ€EØ
•#�e‘*”*Ò
Ñ
Ý•3•uÔ)¨$°°U´¸fÀU¼mÑ0KÈoÑ0]ÐeiÐjÑjÔjÑkÔkÐmrÐuvÑmvÑwÔwˆØ�e˜D�jÔ!ˆÝÔ'­¬°U¸DÈÐ(PÑ(PÔ(PÐRVÑWÔWˆÝ”�S ™ZœZ°Ð7Ñ7Ô7½%Ô:QÐRV×R]ÒR]Ð^_ÑR`ÔR`ÐcgÑRgÐimÑ:nÔ:nÑnˆØ�6˜%”=Ñ  1Ñ$ˆÝŒk˜& ¨ Ô*Ñ+Ô+×0Ò0Ñ2Ô2°U·Y²Y¸tÐSZ°YÑ5[Ô5[Ñ[Ð^dÐejÔ^kÑkˆÝŒk˜& ¨ Ô*Ñ+Ô+×0Ò0Ñ2Ô2°U¸T±\ÑAÀFÈ5ÄMÑQˆØ�v˜e Q˜hÔ'Ñ'¨¨v°e¸Q°hÔ/?Ñ)?ˆBˆØ˜˜e Q˜hœ¨"Ñ,¨rÑ1°E¸%À¸(´OÀbÑ4HÈ2Ñ4MÑMÑNÐQVÐW\Ð^_ÐW_ÔQ`ÐceÑQeÐhjÑQjÑjˆØ˜” %§)¢)¡+¤+Ñ-×8Ò8¸Ñ>Ô>ˆØ˜Ò  S¨A¢XÑ.°#¸²+Ñ>À#ÈÂ(ÑKÈsÐU[Ê|Ñ\ˆØ" U™{¨SÑ0°$Ô7¸¸t¼×9KÒ9KÑ9MÔ9MÈuÐUYÌ{�eˆuˆÝ”j ¨tÐ4Ñ4Ô4‰ˆˆtØ˜T”{ E¨$¤KˆuˆÝ”k 5 &Ñ)Ô)ˆØ×#Ò# AÑ&Ô&¨Ñ4ˆÝ” ­U¬ZÐ8Ñ8Ô8ˆØ˜!˜"˜"”I  s¨ s¤Ò+ˆˆaˆbˆb‰	Ø˜&¥¤­e¬k¸%ÅÄÍcÐRWÉjÌjÐagÐAhÑAhÔAhÐjkÑ.lÔ.lÐnoÑ!pÔ!pÔ!wÔxÑxˆØ$ UÔ+¨fÑ4×9Ò9Ñ;Ô;¸eÑC×JÒJÑLÔLˆØ×Ò˜˜E 6¨!¨!¨!¨T¨'¤?°V¸E´]Ñ#BÑCÔCÐCØ×$Ò$ Q¨¨{Ñ;Ô;Ð;Øˆð/ •#�e‘*”*Ò
Ñ
ð0 Ð%×)Ò)Ñ+Ô+Ñ+×2Ò2Ñ4Ô4€HØ�8×%Ò% eÑ,Ô,¨Q¨Q¨Q°¨WÔ5Ñ5×
<Ò
<¸QÀÑ
BÔ
B€CÝŒ9�c˜8 A A A t GÔ,Ð-¨qÑ1Ô1Ô3×;Ò;¸A¸vÀuÑMÔMÐPQÑQÐTUÑUÐUr    )r…   r  r  r¿   r„   c               óÂ  ‡ ‡‡— |dvrt          d|›�¦  «        ‚t          |t          ¦  «        r||fn|\  ŠŠ|€t          ‰ |‰‰f|||¬¦  «        n|\  }	}t	          j        ˆˆ ˆfd„t          |	|¦  «        D ¦   «         ¦  «        }
|
ddd…f         |
ddd…f         }}|dk    r|                     d	d	d	d¦  «        S |€|
n ||z  t          ||j	        ¦  «        d
|z
  z  z   S )zôViews [B, H, W, C] in 0..1 of Gaussian splats from asset_cameras (or a slice of them given as cameras): shaded /
    albedo give the splat colours, RGBA with a transparent background when background is None; mask gives the
    coverage (C = 3).)r   r   r   z;Gaussian splats render in shaded, albedo or mask mode, not Nr+  c                óx   •— g | ]6\  }}t          ‰‰‰f||f¬ ¦  «                             ddd¦  «        dz   dz  ‘Œ7S ))r„   r   r.   r   )r“  rf   )r+   r,   r  rX   r0  rj   s      €€€r   rk   z&render_splat_views.<locals>.<listcomp>®  sj   ø€ ð  Oð  Oð  OÑptÐpqÐst�=¨°&¸%°È1ÈaÈ&ÐQÑQÔQ×YÒYÐZ[Ð]^Ð`aÑbÔbÐefÑfÐjkÑkð  Oð  Oð  Or    .r0   r   r/   r   )
r—   r   r^   r)  r   r=   Úziprƒ   r   r   )r0  r  r¨   rw   r…   r  r  r¿   r„   rG   rõ   r’  rø   rX   rj   s   `            @@r   Úrender_splat_viewsr—  ¥  sc  øøø€ ð
 Ð/Ð/Ð/ÝÐ_ÐW[Ð_Ð_Ñ`Ô`Ð`Ý0:¸:ÅsÑ0KÔ0KÐ[�Z Ð,Ð,ÐQ[�M€FˆEØxð  yH•} V¨V°f¸e°_ÐQ[ÐbfÐnsÐtÑtÔtÐtð  NUÑ€Dˆ*ÝŒ[ð  Oð  Oð  Oð  Oð  Oð  OÕx{ð  }Að  CMñ  yNô  yNð  Oñ  Oô  Oñ  Pô  P€FØ˜3   ˜7”O V¨C°°°¨G¤_ˆ€CØˆv‚~€~Ø�Š˜r 2 r¨1Ñ-Ô-Ð-ØÐ'ˆ6ˆ6¨S°8©^½gÀjÐRUÔR\Ñ>]Ô>]ÐabÐemÑamÑ>nÑ-nÐnr    )r   r   )r!   r#   )rI   r$   rJ   rK   )
rL   rM   rN   rM   rO   rM   rP   rM   r   r   )rW   r$   rJ   rK   )
rX   rM   rN   rM   rO   rM   rP   rM   r   r   )r\   r   r]   r^   r_   r^   r   r   )r\   r   rs   r   r   r   )r   r   )
rˆ   r   rw   r‰   rŠ   r^   r‹   r‰   rŒ   rM   )r   N)rˆ   r   rw   r‰   rŠ   r^   r‹   r‰   rŒ   rM   r   r   )rˆ   r   r   rÁ   )rÉ   r   rË   rM   rÌ   rM   rÍ   rM   )rÙ   )r…   r   rÚ   rM   r   r   )rˆ   r   rG   r   r…   r   )rå   )rˆ   r   rç   r^   rŠ   r^   r   r   )rˆ   r   rG   r   r…   r   rw   r‰   rŠ   r^   r   r   )rû   rå   r   )rˆ   r   rü   r^   rç   r^   rw   r‰   rÍ   rM   rŠ   r^   r   r   )r  r   r…   r‰   r  rM   r  rM   rÚ   rM   r   r   )r   )rˆ   r   rw   r‰   r…   r‰   r  rM   rŠ   r^   r   r   )r0  r1  r2  r   r   r   )rP  r   r   r   )r&  )r%  r   r  rM   )r0  r1  rU  rW  rV  r^   r   r   )
r0  r1  rw   r‰   r…   r‰   r  rM   r   r   )4Ú__doc__Ú
__future__r   rR   r   Útorch.nn.functionalÚnnÚ
functionalr8   rˆ   r   r   r   r   Úrasterr	   r
   r–   rŸ   r£   r¥   ré   rÒ   r   rH   rV   r[   rr   r~   r‡   rº   rÀ   rÊ   rØ   rá   rä   rë   rú   r  ÚVIEWSr#  r)  r,  rD  rE  rF  rG  rO  rR  rT  r“  r—  rí   r    r   ú<module>rŸ     s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€à €€€Ø Ð Ð Ð Ð Ð Ð Ð Ð à FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ *Ð *Ð *Ð *Ð *Ð *Ð *Ð *àC€Ø"€Ø6Ð Ø€Ø€Ø€ðXð Xð Xð Xð(Àuð (ð (ð (ð (ð (ð (ð <Ðkpð <ð <ð <ð <ð <ð <ð<Ðlqð <ð <ð <ð <ð <ð <ð/ð /ð /ð /ðpð pð pð pðDð Dð Dð Dð2ð 2ð 2ð 2ðjGÐijð  AHØðGð Gð Gð Gð Gð Gð*Xð Xð Xð Xð&ð &ð &ð &ðð ð ð ð ð$ð $ð $ð $ð*¸qð *ð *ð *ð *ð *ð *ð$ð $ð $ð $ðNsÐimÐz~Ø!"ðsð sð sð sð sð sð$  l¸KÐR^Ðgrð  KØ&ð	(ð 	(€ð R`Ðorð  {JØ$'°tðHð Hð Hð Hð Hð Hð@bð bð bð bð]Ð\jÐz}Ø&°4ÈAÐW[ð]ð ]ð ]ð ]ð ]ð ]ð 7�€€uØo€ð 	W€ð'ð 'ð 'ð 'ð&nð nð nð nð~ð ~ð ~ð ~ð ~ðAV°TÐTXÐqxð AVð AVð AVð AVð AVð AVðHoÐdrð  CFØ,¸Àtðoð oð oð oð oð oð oð or    