+
    "Ý³jðµ  ã                   óÐ  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RI Ht ^ RIHt ^ RIH	t	 ^ RI
HtHtHt ^ RIt^ RIHu Hu Ht ^ RIHt . RGOtR	 tR
 R lt] P0                  R R l4       tRHR ltR tR tR tR tR R ltR t R R lt!RIR lt"R t#RJR lt$ ! R R]P                   PJ                  4      t&RKR lt'R R lt(R  t)R! t*R" t+ R# t,R$ t-R% t.R& t/RLR' lt0R( t1R) t2 ! R* R]Pf                  4      t4R+ t5R, t6R- t7R. t8R/ t9R0 R1 lt:R2 t;R3 t<R4 t=R5 R6 lt>R7 R8 lt?R9 R: lt@R; R< ltAR= tBR> R? ltCR@ RA ltDRB tERC RD ltFRE tG ! RF R]P                   PJ                  4      tHR# )Mé    N©Úreduce)Úversion©Úgcd)ÚAnyÚOptionalÚUnion)Úreturn_and_correct_aliasingÚTorchAOBaseTensorÚDummyModulec                óX   € \         P                  P                  P                  V 4       V # )zTDecorator to register a class as a pytree constant for dynamo non-strict trace mode.)ÚtorchÚutilsÚ_pytreeÚregister_constant)Úclss   &ÚN/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torchao/utils.pyÚregister_as_pytree_constantr   -   s   € ä	‡K�K×Ñ×)Ñ)¨#Ô.Ø€Jó    c                óf   € V ^8„  d   QhR\         R\        \         \        P                  3,          /# )é   Útarget_device_strÚdevice)Ústrr
   r   r   )Úformats   "r   Ú__annotate__r   3   s(   € ÷ :ñ :¤#ð :¬u´S¼%¿,¹,Ð5FÕ/Gñ :r   c                 óH   € \         P                  ! V4      P                  V 8H  # ©N)r   r   Útype)r   r   s   &&r   Ú
_is_devicer!   3   s   € Ü�<Š<˜Ó×$Ñ$Ð(9Ñ9Ð9r   c                óX   € V ^8„  d   QhR\         P                  P                  R\        /# )r   ÚmoduleÚreturn)r   ÚnnÚModuler   )r   s   "r   r   r   9   s"   € ÷ ñ ¬%¯(©(¯/©/ð ¼cñ r   c                óL  € V P                  4        Uu0 uF  qP                  kK  	  upV P                  4        Uu0 uF  qP                  kK  	  up,          p\        V4      ^8:  g   Q RV 24       h\        V4      ^ 8”  d   \	        \        V4      4      pV# RpV# u upi u upi )zz
Returns the unique device for a module, or None if no device is found.
Throws an error if multiple devices are detected.
zKprepare only works with cpu or single-device CUDA modules, but got devices N)Ú
parametersr   ÚbuffersÚlenÚnextÚiter)r#   ÚpÚdevicesr   s   &   r   Ú_assert_and_get_unique_devicer/   8   s«   € ð "(×!2Ñ!2Ô!4Ó5Ñ!4˜A�xŒxÑ!4Ñ5Ø Ÿ.™.Ô*ó9Ù*�Q�ŒÑ*ñ9õ €Gô ˆw‹<˜1Ôð ð	Ø"˜)ð	%óÐô %(¨£L°1Ô$4ŒT”$�w“-Ó €FØ€Mð ;?€FØ€Mùò 6ùò 9s
   “B»B!c                óx	  € Vf   / pVfG   \        V \        P                  P                  4      '       g   Q R4       h\	        V 4      P
                  pVR8X  Ed	   \        P                  P                  4        \        P                  P                  RR7      p\        P                  P                  RR7      pVP                  4        \        V4       FE  p\        P                  P                  P                  R4      ;_uu_ 4        V ! V/ VB  RRR4       KG  	  VP                  4        \        P                  P                  4        VP                  V4      V,          # VR8X  Ed   \        P                  P                  4        \        P                  P                   P                  RR7      p\        P                  P                   P                  RR7      pVP                  4        \        V4       FE  p\        P                  P                  P                  R4      ;_uu_ 4        V ! V/ VB  RRR4       KG  	  VP                  4        \        P                  P                  4        VP                  V4      V,          # VR8X  dÌ   \        P"                  P                  4        \$        P$                  ! 4       p\        V4       FE  p\        P                  P                  P                  R4      ;_uu_ 4        V ! V/ VB  RRR4       KG  	  \$        P$                  ! 4       p	\        P"                  P                  4        W˜,
          V,          p
V
# VR	8X  Ed	   \        P&                  P                  4        \        P&                  P                  RR7      p\        P&                  P                  RR7      pVP                  4        \        V4       FE  p\        P                  P                  P                  R4      ;_uu_ 4        V ! V/ VB  RRR4       KG  	  VP                  4        \        P&                  P                  4        VP                  V4      V,          # R#   + '       g   i     EK©  ; i  + '       g   i     EKš  ; i  + '       g   i     EKÛ  ; i  + '       g   i     Ká  ; i)
z?Benchmark model runs with `args` and `kwargs` both are optionalNzFExpecting `model` to be torch.nn.Module if device_type is not providedÚcudaT)Úenable_timingztimed regionÚmpsÚcpuÚxpu)Ú
isinstancer   r%   r&   r/   r    r1   ÚsynchronizeÚEventÚrecordÚrangeÚautogradÚprofilerÚrecord_functionÚelapsed_timer3   Úeventr4   Útimer5   )ÚmodelÚnum_runsÚargsÚkwargsÚdevice_typeÚstart_eventÚ	end_eventÚ_Ú
start_timeÚend_timeÚaverage_time_per_runs   &&&&&      r   Úbenchmark_modelrL   J   so  € à‚~ØˆàÒÜ˜%¤§¡§¡×1Ò1ð 	
ØTó	
Ð1ô 4°EÓ:×?Ñ?ˆà�fÕÜ�
‰
×ÑÔ Ü—j‘j×&Ñ&°TÐ&Ó:ˆÜ—J‘J×$Ñ$°4Ð$Ó8ˆ	Ø×ÑÔô �x–ˆAÜ—‘×(Ñ(×8Ñ8¸×HÕHÙ�tÐ&˜vÒ&÷ IÑHñ !ð 	×ÑÔÜ�
‰
×ÑÔ Ø×'Ñ'¨	Ó2°XÕ=Ð=à	˜Õ	Ü�	‰	×ÑÔÜ—i‘i—o‘o×+Ñ+¸$Ð+Ó?ˆÜ—I‘I—O‘O×)Ñ)¸Ð)Ó=ˆ	Ø×ÑÔô �x–ˆAÜ—‘×(Ñ(×8Ñ8¸×HÕHÙ�tÐ&˜vÒ&÷ IÑHñ !ð 	×ÑÔÜ�	‰	×ÑÔØ×'Ñ'¨	Ó2°XÕ=Ð=à	˜Ô	Ü�	‰	×ÑÔÜ—Y’Y“[ˆ
ô �x–ˆAÜ—‘×(Ñ(×8Ñ8¸×HÕHÙ�tÐ&˜vÒ&÷ IÑHñ !ô —9’9“;ˆÜ�	‰	×ÑÔØ (Õ 5¸ÕAÐØ#Ð#à	˜Õ	Ü�	‰	×ÑÔÜ—i‘i—o‘o°D�oÓ9ˆÜ—I‘I—O‘O°$�OÓ7ˆ	Ø×ÑÔô �x–ˆAÜ—‘×(Ñ(×8Ñ8¸×HÕHÙ�tÐ&˜vÒ&÷ IÑHñ !ð 	×ÑÔÜ�	‰	×ÑÔØ×'Ñ'¨	Ó2°XÕ=Ð=ñ 
÷I I×HÑHú÷ I×HÑHú÷ I×HÑHú÷  I×HÐHús0   Ä	Q)È*	Q>Ë>	RÐ	R(Ñ)Q;Ñ>RÒR%Ò(R9c                 óN  € \         P                  P                  \         P                  P                  P                  \         P                  P                  P
                  .R R7      ;_uu_ 4       pV! V/ VB pRRR4       XP                  V 4       X#   + '       g   i     L#; i)T)Ú
activitiesÚrecord_shapesN)r   r<   ÚprofileÚProfilerActivityÚCPUÚCUDAÚexport_chrome_trace)ÚpathÚfnrC   rD   ÚprofÚresults   &&*,  r   Úprofiler_runnerrY   ‘   s‡   € Ü	�‰×	Ñ	ä�N‰N×+Ñ+×/Ñ/Ü�N‰N×+Ñ+×0Ñ0ð
ð ð 
 ÷ 
ô 
ð 
Ù�TÐ$˜VÑ$ˆ÷
ð 	×Ñ˜TÔ"Ø€M÷
÷ 
ús   Á0	BÂB$	c                  óL  € R .p \         P                  P                  4       '       d   V P                  R4       M5\         P                  P                  4       '       d   V P                  R4       \         P
                  P                  4       '       d   V P                  R4       V # )r4   r1   r5   r3   )r   r1   Úis_availableÚappendr5   r3   )r.   s    r   Úget_available_devicesr]   ž   sk   € Øˆg€GÜ‡z�z×Ñ× Ò Ø�‰�vÕÜ	�‰×	Ñ	×	!Ò	!Ø�‰�uÔÜ‡y�y×Ñ×ÒØ�‰�uÔØ€Nr   c                  óŠ   € \         P                  P                  4       '       g   Q h\         P                  P                  4       # r   )r   Úacceleratorr[   Úcurrent_accelerator© r   r   Úget_current_accelerator_devicerb   ©   s2   € Ü×Ñ×)Ñ)×+Ò+Ð+Ð+Ü×Ñ×0Ñ0Ó2Ð2r   c                  óÆ   € \         P                  P                  4       '       d=   \         P                  P                  4       p \	        V ^ ,           RV ^,           24      # R# )r   Ú.g        )r   r1   r[   Úget_device_capabilityÚfloat)Ú
capabilitys    r   Úget_compute_capabilityrh   ®   sH   € Ü‡z�z×Ñ× Ò Ü—Z‘Z×5Ñ5Ó7ˆ
Ü˜
 1�� a¨
°1­ Ð7Ó8Ð8Ùr   c                óx   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  /# )r   ÚoutputÚ
output_refr$   )r   ÚTensor)r   s   "r   r   r   µ   s-   € ÷ ñ œUŸ\™\ð ´u·|±|ð ÌÏÉñ r   c                 óÀ   € \         P                  ! \         P                  ! W,
          4      4      \         P                  ! \         P                  ! V4      4      ,          # r   )r   ÚmeanÚabs)rj   rk   s   &&r   Úcompute_max_diffrp   µ   s;   € Ü�:Š:”e—i’i Õ 3Ó4Ó5¼¿
º
Ü�	Š	�*Óó9õ ð r   c           	      ó¬   € ^ RI Hu Hp V ! V/ VB  V ! V/ VB  VP                  RRVRVRV /R7      pVP	                  4       pVP
                  R,          # )r   Nzf(*args, **kwargs)rC   rD   Úf)ÚstmtÚglobalsg    €„.A)Útorch.utils.benchmarkr   Ú	benchmarkÚTimerÚblocked_autorangern   )rr   rC   rD   rv   Út0Úmeasurements   &*,   r   Ú(benchmark_torch_function_in_microsecondsr{   »   sk   € ß-Ð-ñ €tÐˆvÒÙ€tÐˆvÒà	�‰Ø!Ø˜˜x¨°°aÐ8ð 
ó 
€Bð ×&Ñ&Ó(€KØ×Ñ˜cÕ!Ð!r   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   ÚnrC   r$   ©Úint)r   s   "r   r   r   Ê   s!   € ÷ ñ ”Sð ¤ð ¬ñ r   c                 ór   € \        R  VR,           4      pW,          ^ 8X  d   V # W,           W,          ,
          # )c                 ó2   € W,          \        W4      ,          # r   r   )ÚxÚys   &&r   Ú<lambda>Úfind_multiple.<locals>.<lambda>Ë   s   €  ¥¬#¨a«)Ö!3r   ©é   r   )r}   rC   Úks   &* r   Úfind_multipler‰   Ê   s/   € ÜÑ3°T¸Dµ[ÓA€AØ…u�„zØˆØ�5�A•E�?Ðr   c                óD   a aaa€ ^ RI Ho S'       d   RMRoVVV V3R lpV# )a¯  This decorator is used to preserve some high level operators for torch.export.export
while still allow them to be decomposed for inductor path

requirement: make sure `fn.__name__[1:]` is the operator name you want to register

NOTE: This should be applied at the top, after all other decorators have been applied
NOTE: We haven't tested the case when `fn` accepts tensor subclass instance as input,
e.g. uint4 tensor subclass instance, and we'll probably need to figure out what would make
sense for downstream system (like executorch) to accept as well

Example:
    lib = torch.library.Library("my_namespace', "FRAGMENT")

    register_custom_op = _register_custom_op(lib)

    @register_custom_op
    def _the_op_that_needs_to_be_preserved(...)
        ...

    # after this, `_the_op_that_needs_to_be_preserved` will be preserved as
    # torch.ops.my_namespace.the_op_that_needs_to_be_preserved operator after
    # torch.export.export

)Úregister_decompositionÚCompositeImplicitAutogradÚCompositeExplicitAutogradc                 óú  <a € ^ RI Hp \        ;QJ d    V 3R lR 4       F  '       g   K   RM	  RM! V 3R lR 4       4      '       d   Q RS P                   24       hS P                  pV^ ,          R8X  d
   VR,          pW!! S / R	7      ,           pSP	                  V4       SP                  VS S4       SP                  p\        \        \        P                  V4      V4      pS'       d   S	! V.4      ! S 4       V# )
r   )Úinfer_schemac              3   ó@   <"  € T F  qSP                   9   x € K  	  R # 5ir   )Ú__name__)Ú.0ÚcrV   s   & €r   Ú	<genexpr>Ú9_register_custom_op.<locals>.decorator.<locals>.<genexpr>õ   s   øé € Ð7±¨A˜BŸK™KÖ'³ùs   ƒz.<>TFzEExpecting op to be defined in normal functions, not lambda or local: rH   ºr‡   NN)Úmutates_args)
Útorch._library.infer_schemar�   Úanyr‘   ÚdefineÚimplÚnsÚgetattrr   Úops)
rV   r�   Úop_nameÚschemaÚlib_namespaceÚopÚdispatch_keyÚinductor_decomposedÚlibr‹   s
   f     €€€€r   Ú	decoratorÚ&_register_custom_op.<locals>.decoratorò   sÊ   ù€ Ý<ç“3Ô7±Ó7—3—3’3Ô7±Ó7×7Ò7ð 	
ØSÐTV×T_ÑT_ÐS`Ðaó	
Ð7ð —+‘+ˆØ�1�:˜ÔØ˜b•kˆGØ˜<¨¸Ô<Õ<ˆØ�
‰
�6ÔØ�‰�˜"˜lÔ+àŸ™ˆÜ”WœUŸY™Y¨Ó6¸Ó@ˆßÙ" B 4Ô(¨Ô,Øˆ	r   )Útorch._inductor.decompositionr‹   )r¥   r¤   r¦   r£   r‹   s   ff @@r   Ú_register_custom_opr©   Ñ   s-   û€ õ2 E÷ ñ 	$à(ð ÷ð ð& Ðr   c                 ó   a a€ V V3R  lpV# )c                 ó.   <€ SP                  SV R 4      pV# )ÚMeta)r›   )rV   r¢   r¥   rŸ   s   & €€r   r¦   Ú$_register_meta_op.<locals>.decorator	  s   ø€ Ø�X‰X�g˜r 6Ó*ˆØˆ	r   ra   )r¥   rŸ   r¦   s   ff r   Ú_register_meta_opr®     s   ù€ öð Ðr   c                óp  a€ V3R lo^ pV P                  4        F˜  w  r4\        V\        P                  P                  4      '       d   V'       d   K9  \
        P                  ! VP                  RR7      VP                  RR7      4       F  pVS! V4      ,          pK  	  V\        WA4      ,          pKš  	  V# )zÂ
Returns the model size in bytes. The option to ignore embeddings
is useful for models with disproportionately large embeddings compared
to other model parameters that get quantized/sparsified.
c                 óê   <€ \        V R 4      '       d=   ^ pV P                  4       ^ ,           F  p\        W4      pVS! V4      ,          pK  	  V# V P                  4       V P	                  4       ,          # )Ú__tensor_flatten__)Úhasattrr±   r�   ÚnumelÚelement_size)ÚtensorÚsizeÚ	attr_nameÚ
sub_tensorÚ	flat_sizes   &   €r   r¹   Ú*get_model_size_in_bytes.<locals>.flat_size  sm   ø€ Ü�6Ð/×0Ò0ØˆDð $×6Ñ6Ó8¸×;Ð;�	Ü$ VÓ7�
Ø™	 *Ó-Õ-’ñ <ð ˆKà—<‘<“> F×$7Ñ$7Ó$9Õ9Ð9r   F)Úrecurse)
Únamed_childrenr6   r   r%   Ú	EmbeddingÚ	itertoolsÚchainr(   r)   Úget_model_size_in_bytes)rA   Úignore_embeddingsÚ
model_sizeÚnameÚchildr-   r¹   s   &&    @r   rÀ   rÀ     sœ   ø€ õ
:ð €JØ×+Ñ+Ö-‰ˆÜ˜5¤%§(¡(×"4Ñ"4×5Ò5×:KÑ:KÜ—_’_Ø× Ñ ¨Ð Ó/°·±Àu°Ó1Mö�ð ™i¨›lÕ*’
ñð Ô1°%ÓKÕKŠJñ .ð Ðr   c                   ó,   a € ] tR tRt o R tR tRtV tR# )ÚUnwrapTensorSubclassi.  c                óB  € \        V4      p\        V P                  4       F[  w  r4p\        V4      p\	        WRV) R  4       UUu/ uF  w  rxWxbK	  	  pppW&R  pVP                  WTR R 4      p	VP                  V	4       K]  	  \        V4      ^8X  g   Q hV^ ,          # u uppi r   )ÚlistÚreversedÚrebuild_stackr*   ÚzipÚ__tensor_unflatten__r\   )
ÚselfÚtensorsÚtodoÚtpÚmetaÚinner_tensorsÚ	nb_tensorÚaÚbÚrebuilts
   &*        r   ÚforwardÚUnwrapTensorSubclass.forward/  s£   € Ü�G‹}ˆÜ'/°×0BÑ0BÖ'CÑ#ˆB�mÜ˜MÓ*ˆIÜ.1°-ÀyÀjÀkÐARÔ.SÔTÑ.S¡d a˜QšTÑ.SˆMÑTØ˜
Ð#ˆDØ×-Ñ-¨mÀ4ÈÓNˆGØ�K‰K˜Ö ñ (Dô �4‹y˜AŒ~Ðˆ~Ø�A�wˆùó Us   ÁBc                óÜ  € \        V4      \        P                  Jg   Q h. p. pV.pV'       d¸   VP                  4       pVP	                  4       w  rgVP                  \        V4      Wv34       V Fq  p\        WX4      p	\        V	4      \        P                  J d   VP                  V	4       K>  \        V	\        P                  4      '       g   Q hVP                  V	4       Ks  	  K¿  W n        V# r   )	r    r   rl   Úpopr±   r\   r�   r6   rÊ   )
rÍ   rµ   rÊ   Úplain_tensorsrÏ   ÚobjrÒ   Úmetadatar·   Úvals
   &&        r   Úright_inverseÚ"UnwrapTensorSubclass.right_inverse;  sÂ   € Ü�F‹|¤5§<¡<Ó/Ð/Ð/ØˆØˆØˆxˆßØ—(‘(“*ˆCØ&)×&<Ñ&<Ó&>Ñ#ˆMØ× Ñ ¤$ s£)¨XÐ!EÔFÛ*�	Ü˜cÓ-�Ü˜“9¤§¡Ó,Ø!×(Ñ(¨Ö-ä% c¬5¯<©<×8Ò8Ð8Ð8Ø—K‘K Ö$ó +ð +ÔàÐr   )rÊ   N)r‘   Ú
__module__Ú__qualname__Ú__firstlineno__r×   rß   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   rÆ   rÆ   .  s   ø‡ € ò
÷ð r   rÆ   c                óD  € V P                  4        EFŠ  w  r#\        V\        P                  P                  4      '       g,   \        V\        P                  P
                  4      '       Ed%   \        VR4      '       Ed   \        VP                  4      \        P                  Jdë   \        VP                  4      \        P                  P                  Jdº   \        VP                  \        P                  4      '       d�   \        \        VP                  4      \        P                  4      '       d]   \        VP                  \        4      '       d=   \        P                  ! V4      '       g!   \        P                  ! VR\!        4       4       \#        V4       EK�  	  V # )a%  Unwraps (nested) tensor subclass in the model to plain tensors
This is a workaround to make a model with tensor subclass to work with `torch.export.export`
and `torch.aot_compile`, we hope this can be integrated into compile stack soon
tracking issue: https://github.com/pytorch/ao/issues/345
Úweight)r¼   r6   r   r%   ÚLinearr½   r²   r    ré   rl   Ú	ParameterÚ
issubclassr   ÚparametrizeÚis_parametrizedÚregister_parametrizationrÆ   Úunwrap_tensor_subclass)rA   Ú	filter_fnrÃ   rÄ   s   &&  r   rð   rð   Q  s   € ð ×+Ñ+×-‰ˆô ˜5¤%§(¡(§/¡/×2Ò2Ü˜e¤U§X¡X×%7Ñ%7×8Ó8ä˜˜x×(Ó(Ü�U—\‘\Ó"¬%¯,©,Ó6Ü�U—\‘\Ó"¬%¯(©(×*<Ñ*<Ó<Ü˜5Ÿ<™<¬¯©×6Ò6Üœ4 §¡Ó-¬u¯|©|×<Ò<Ü˜5Ÿ<™<Ô):×;Ò;Ü×/Ò/°×6Ò6ä×0Ò0Ø�xÔ!5Ó!7ôô 	˜u×%ñ% .ð& €Lr   c                óD   € V ^8„  d   QhR\         P                  R\        /# )r   Údtyper$   )r   ró   Úbool)r   s   "r   r   r   m  s   € ÷ ñ œ5Ÿ;™;ð ¬4ñ r   c                 ó†   € \         P                  \         P                  \         P                  \         P                  0pW9   # r   )r   Úfloat8_e4m3fnÚfloat8_e4m3fnuzÚfloat8_e5m2Úfloat8_e5m2fnuz)ró   Ú	fp8_typess   & r   Ú_is_float8_typerû   m  s8   € ä×ÑÜ×ÑÜ×ÑÜ×Ñð	€Ið ÑÐr   c                óú   € \        \        P                  ! RV 4      4      p\        P                  ! RV 4      pV'       d0   \	        \
        VP                  4       4      w  r4pV'       d   RpW4V.# \        RV  24      h)z€
Parse version string representing pre-release with -1

Examples: "2.5.0.dev20240708+cu121" -> [2, 5, -1], "2.5.0" -> [2, 5, 0]
z	(git|dev)z(\d+)\.(\d+)\.(\d+)zInvalid version string format: éÿÿÿÿ)rô   ÚreÚsearchÚmatchÚmapr   ÚgroupsÚ
ValueError)Úversion_stringÚis_prereleaser   ÚmajorÚminorÚpatchs   &     r   Úparse_versionr	  w  sk   € ô œŸš <°Ó@ÓA€MÜ�HŠHÐ+¨^Ó<€EßÜ!¤# u§|¡|£~Ó6Ñˆ�eßØˆEØ˜eÐ$Ð$äÐ:¸>Ð:JÐKÓLÐLr   c                  ó@   € \        \        P                  R 4      '       * # )Úgit_version)r²   r   r   ra   r   r   Ú	is_fbcoder  ‰  s   € Ü”u—}‘} mÓ4Ô4Ð4r   c                 óp   € \        4       '       d   R # \        \        P                  4      \        V 4      8¬  # ©T)r  r	  r   Ú__version__)Úmin_versions   &r   Útorch_version_at_leastr  �  s)   € Ü‡{‚{Ùô œ×*Ñ*Ó+¬}¸[Ó/IÑIÐIr   c                óÈ   a a€ \        S R4      '       g   / S n        S S P                  9  d   / S P                  S &   \        S\        \        34      '       g   S.oVV 3R lpV# )a\  Decorator for implementing aten ops like `torch.ops.aten.linear.default` for
tensor subclass, the implemented functions are called in ``__torch_dispatch__`` callback
for ``torch.Tensor`` subclasses

Examples::

    implements = MyTensor.implements

    @implements(torch.ops.aten.linear.default):
    def _(func, types, args, kwargs):
        ...

Ú_ATEN_OP_TABLEc                 ó„   <€ S F8  p\         P                  ! V 4      V 3R  l4       pVSP                  S,          V&   K:  	  V # )c                 ó   € V! WW#4      # r   ra   ©rr   ÚtypesrC   rD   Ú_funcs   &&&&&r   ÚwrapperÚ/_implements.<locals>.decorator.<locals>.wrapper³  ó   € á˜Q tÓ4Ð4r   )Ú	functoolsÚwrapsr  )Úfuncr¢   r  Úaten_opsr   s   &  €€r   r¦   Ú_implements.<locals>.decorator°  sI   ø€ ÛˆBä�_Š_˜TÓ"Ø6:ó 5ó #ð5ð +2ˆC×Ñ˜sÕ# BÓ'ñ ð ˆr   )r²   r  r6   rÈ   Útuple)r   r  r¦   s   ff r   Ú_implementsr"  ›  s^   ù€ ô �3Ð(×)Ò)ØˆÔØ
�#×$Ñ$Ô$Ø"$ˆ×Ñ˜3ÑÜ�h¤¤u ×.Ò.Ø�:ˆöð Ðr   c                óÈ   a a€ \        S R4      '       g   / S n        S S P                  9  d   / S P                  S &   \        S\        \        34      '       g   S.oV V3R lpV# )a©  Decorator for implementing torch functions / ops
like ``torch.nn.functional.linear``, ``torch.Tensor.t`` for the tensor subclass
the implemented functions are called in ``__torch_function__`` callback
for ``torch.Tensor`` subclasses

Examples::

    implements_torch_function = MyTensor.implements_torch_function

    @implements_torch_function(torch.nn.functional.linear):
    def _(func, types, args, kwargs):
        ...

Ú_TORCH_FN_TABLEc                 ó„   <€ S F8  p\         P                  ! V 4      V 3R  l4       pVSP                  S,          V&   K:  	  V # )c                 ó   € V! WW#4      # r   ra   r  s   &&&&&r   r  Ú>_implements_torch_function.<locals>.decorator.<locals>.wrapperÖ  r  r   )r  r  r$  )r  rV   r  r   Ú	torch_fnss   &  €€r   r¦   Ú-_implements_torch_function.<locals>.decoratorÓ  sI   ø€ ÛˆBä�_Š_˜TÓ"Ø6:ó 5ó #ð5ð ,3ˆC×Ñ Õ$ RÓ(ñ ð ˆr   )r²   r$  r6   rÈ   r!  )r   r(  r¦   s   ff r   Ú_implements_torch_functionr*  ½  s^   ù€ ô �3Ð)×*Ò*Ø ˆÔØ
�#×%Ñ%Ô%Ø#%ˆ×Ñ˜CÑ Ü�i¤$¬ ×/Ò/Ø�Kˆ	öð Ðr   c                 óÄ  a€ V P                   pV P                  p\        P                  P                  pV! \        P                  P                  P
                  P                  4      R  4       pV! \        P                  4      R 4       pV! \        P                  P                  .4      R 4       pV! VP                  P                  VP                  P                  VP                  P                  VP                  P                  .4      R 4       pR R loV! VP                  P                  4      V3R l4       pV! VP                  P                  4      R 4       pR# )	c                 óœ  a a€ \        V4      ^8X  g   Q hV^ ,          pVP                  4        F  pVR9   d   K  Q h	  RV9   d   VR,          VP                  8X  g   Q hRV9   d   VR,          VP                  8X  g   Q hVP	                  R4      oSVP
                  8X  d   V# V^ ,          P                  VV 3R l4      p\        S W#V4      # )r‡   ró   Úlayoutr   c                 ó   <€ S! V SR 7      # )©r   ra   )r‚   r   r  s   &€€r   r„   Ú:_implements_common_tensor_ops.<locals>._.<locals>.<lambda>÷  s   ø€ ¹¸aÈÕ9Or   )ró   r-  r   )r*   Úkeysró   r-  Úgetr   Ú_apply_fn_to_datar   )r  r  rC   rD   rÍ   rˆ   Ú
new_tensorr   s   f&&&   @r   rH   Ú(_implements_common_tensor_ops.<locals>._å  s¿   ù€ ô �4‹y˜AŒ~Ðˆ~Ø�A�wˆà—‘–ˆAØÐ5Ö5Ð5Ð5ñ ð �fÔØ˜'•? d§j¡jÔ0Ð0Ð0Ø�vÔØ˜(Õ# t§{¡{Ô2Ð2Ð2à—‘˜HÓ%ˆØ�T—[‘[Ô ØˆKØ˜!•W×.Ñ.Õ/OÓPˆ
Ü*¨4°¸zÓJÐJr   c                 óÎ   € \        V4      ^8X  g   Q h\        V^ ,          4      \        V^,          4      8H  ;'       d(    V^ ,          P                  V^,          P                  8H  # )r   )r*   r    Úshape©r  r  rC   rD   s   &&&&r   rH   r5  þ  sJ   € ä�4‹y˜AŒ~Ðˆ~Ü�D˜•G‹}¤ T¨!¥W£Ñ-×PÐP°$°qµ'·-±-À4ÈÅ7Ç=Á=Ñ2PÐPr   c                 óD   a aa€ S^ ,          P                  VV V3R l4      # )r   c                 ó*   <€ S! V .SR ,          O5/ SB # ©r–   ra   ©r‚   rC   r  rD   s   &€€€r   r„   r0  	  s   ø€ ±4¸Ð3O¸DÀ½HÒ3OÈÒ3Or   )r3  r8  s   f&ffr   rH   r5    s   ú€ ð �A�w×(Ñ(Ö)OÓPÐPr   c           
      ó\   a aa€ \        S SSS^ ,          P                  VV V3R l4      4      # )r   c                 ó*   <€ S! V .SR ,          O5/ SB # r;  ra   r<  s   &€€€r   r„   r0    s   ø€ ±°QÐ0L¸¸b½Ò0LÀVÒ0Lr   )r   r3  r8  s   f&ffr   rH   r5    s.   ú€ ô +ØØØØ��G×%Ñ%Ö&LÓMó	
ð 	
r   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   rÍ   Úsrcr$   )r   rô   )r   s   "r   r   Ú3_implements_common_tensor_ops.<locals>.__annotate__  s#   € ÷ $
ñ $
Ô.ð $
Ô5Fð $
Ì4ñ $
r   c                 ó–  a a€ \         ;QJ d*    V V3R  lS P                   4       F  '       d   K   RM	  RM! V V3R  lS P                   4       4      pRp\        S R4      '       dQ   \         ;QJ d*    V V3R lS P                   4       F  '       d   K   RM	  RM! V V3R lS P                   4       4      p\         ;QJ d*    V V3R lS P                   4       F  '       d   K   RM	  RM! V V3R lS P                   4       4      pRp\        S R4      '       dQ   \         ;QJ d*    V V3R lS P
                   4       F  '       d   K   RM	  RM! V V3R lS P
                   4       4      p\        S 4      \        S4      8H  ;'       dB    S P                  SP                  8H  ;'       d!    T;'       d    T;'       d    T;'       d    T# )c              3   ó~   <"  € T F2  p\        SV4      P                  \        SV4      P                  8H  x € K4  	  R # 5ir   ©r�   r7  ©r’   Út_namerÍ   r@  s   & €€r   r”   ÚH_implements_common_tensor_ops.<locals>._same_metadata.<locals>.<genexpr>  s7   øé € ð "
á0�ô �D˜&Ó!×'Ñ'¬7°3¸Ó+?×+EÑ+EÖEÛ0ùs   ƒ:=FTÚoptional_tensor_data_namesc              3   ó¶   <"  € T FN  p\        SV4      e.   \        SV4      P                  \        SV4      P                  8H  M\        SV4      R J x € KP  	  R # 5ir   rD  rE  s   & €€r   r”   rG  #  s^   øé € ð /ñ >�Fô ˜t VÓ,Ò8ô ˜D &Ó)×/Ñ/´7¸3ÀÓ3G×3MÑ3MÒMä   fÓ-°Ð5ô6ó >ùs   ƒAAc              3   óV   <"  € T F  p\        SV4      \        SV4      8H  x € K   	  R # 5ir   ©r�   ©r’   Úa_namerÍ   r@  s   & €€r   r”   rG  ,  s+   øé € ð 
á5�ô �D˜&Ó!¤W¨S°&Ó%9Ö9Û5ùó   ƒ&)Úoptional_tensor_attribute_namesc              3   óV   <"  € T F  p\        SV4      \        SV4      8H  x € K   	  R # 5ir   rK  rL  s   & €€r   r”   rG  3  s+   øé € ð 'áB�Fô ˜˜fÓ%¬°°fÓ)=Ö=ÛBùrN  )ÚallÚtensor_data_namesr²   rH  Útensor_attribute_namesrO  r    r7  )rÍ   r@  Ú_tensor_shape_matchÚ_optional_tensor_shape_matchÚ_attr_matchÚ_optional_attr_matchs   ff    r   Ú_same_metadataÚ5_implements_common_tensor_ops.<locals>._same_metadata  sƒ  ù€ ß!›cõ "
à×0Ò0ó"
ŸcŸcšcõ "
à×0Ò0ó"
ó 
Ðð (,Ð$Ü�4Ð5×6Ò6ç+.«3õ /ð #×=Ò=ó/¯3¯3ª3õ /ð #×=Ò=ó/ó ,Ð(÷ “cõ 
à×5Ò5ó
—c—c’cõ 
à×5Ò5ó
ó 
ˆð
  $ÐÜ�4Ð:×;Ò;ß#&£3õ 'à"×BÒBó'§3§3¢3õ 'à"×BÒBó'ó $Ð ô �‹Jœ$˜s›)Ñ#÷ %ð %Ø—
‘
˜cŸi™iÑ'÷%ð %à#÷%ð %ð -÷%ð %ð ÷	%ð %ð
 %ð	
r   c                 ó
  <€ V^ ,          pV^,          pS! WE4      '       dF   VP                  4       ^ ,          pV F&  p\        WG4      P                  \        WW4      4       K(  	  R# \        RV^ ,          V^,          3 24      h)r   Nz7Not supported args for copy_ due to metadata mismatch: )r±   r�   Úcopy_r  )	r  r  rC   rD   rÍ   r@  Úself_tensorsÚtensor_namerX  s	   &&&&    €r   rH   r5  A  s~   ø€ à�A�wˆØ�1�gˆÙ˜$×$Ò$Ø×2Ñ2Ó4°QÕ7ˆLÛ+�Ü˜Ó*×0Ñ0´¸Ó1JÖKñ  ,áÜØEÀdÈ1ÅgÈtÐTUÍwÐFVÐEWÐXó
ð 	
r   c                 ón  € V^ ,          p\        VR4      '       Ed�   \        VR4      '       Edn   VP                  ! VR,          / VB pVP                  R4      pVP                  RR4      pVP                   Uu. uF  p\	        WG4      P                  WVR7      NK   	  pp. p	\        VR4      '       dW   VP                   FF  p
\	        WJ4      pVe$   V	P                  VP                  WVR7      4       K5  V	P                  R	4       KH  	  VP                   Uu. uF  pVR8w  d   \	        WL4      MTNK  	  pp. p\        VR
4      '       d.   VP                   Uu. uF  pVR8w  d   \	        WL4      MTNK  	  ppVP                  ! . VOVOV	OVO5!  p\        WW?4      # \        R4      hu upi u upi u upi )r   rR  rS  r–   r   Únon_blockingF)r_  rH  NrO  z¡Subclasses must implement `aten._to_copy.default` or specify `tensor_data_names` and `tensor_attribute_names` for tensor class or tensor instance before using it)r²   Ú_get_to_kwargsrÚ   rR  r�   ÚtorH  r\   rS  rO  Ú	__class__r   ÚNotImplementedError)r  r  rC   rD   rÍ   r   r_  rÃ   rÎ   Úoptional_tensorsÚtensor_data_nameÚmaybe_tensorr·   Útensor_attributesÚoptional_tensor_attributesÚts   &&&&            r   rH   r5  N  sñ  € à�A�wˆÜ�4Ð,×-Ó-´'ØÐ*÷3
ó 3
ð ×(Ò(¨$¨r­(Ð=°fÑ=ˆFØ—Z‘Z Ó)ˆFØ!Ÿ:™: n°eÓ<ˆLð !×2Ò2óá2�Dô ˜Ó#×&Ñ& vÐ&ÖIÙ2ð ð ð  "ÐÜ�tÐ9×:Ò:Ø(,×(GÔ(GÐ$Ü#*¨4Ó#B�LØ#Ò/Ø(×/Ñ/Ø(ŸO™O¨F˜OÓNöð )×/Ñ/°Ö5ñ )Hð "&×!<Ò!<ó!á!<�Ið -6¸Ô,A”˜Ô(ÀvÒMÙ!<ð ð !ð *,Ð&Ü�tÐ>×?Ò?ð &*×%IÒ%Ió.á%I˜	ð 1:¸XÔ0E”G˜DÔ,È6ÒQÙ%Ið +ð .ð
 —’ð Øðà"ðð "ðð ,ó	ˆAô /¨t¸6ÓEÐEä!ð pó
ð 	
ùòGùò !ùò.s   Á:$F(ÄF-ÅF2N)Ú
implementsÚimplements_torch_functionr   rž   Úatenra  Údtype_layoutÚ!_has_compatible_shallow_copy_typerl   Ú
contiguousÚdetachÚdefaultÚcloneÚaliasr[  Ú_to_copy)r   rj  rk  rl  rH   rX  s   &    @r   Ú_implements_common_tensor_opsru  à  s?  ø€ Ø—‘€JØ #× =Ñ =ÐÜ�9‰9�>‰>€Dá”—	‘	—‘×!Ñ!×.Ñ.Ó/ñKó 0ðKñ0 œu×FÑFÓGñQó HðQñ ä�L‰L×#Ñ#ð	
óñ
Qóð
Qñ à�K‰K×ÑØ�J‰J×ÑØ�J‰J×ÑØ�O‰O×#Ñ#ð		
óñ
óð
õ$
ñL �—
‘
×"Ñ"Ó#ô

ó $ð

ñ �—‘×%Ñ%Ó&ñ-
ó 'ò-
r   c                 ó¤  € \        V R 4      '       d   \        V R4      '       g   Q h\        P                  P                  W4       \	        V R. 4       F4  pW P
                  9  g   K  \        W4      '       d   K(  \        WR4       K6  	  \	        V R. 4       F4  pW0P
                  9  g   K  \        W4      '       d   K(  \        WR4       K6  	  R# )rR  rS  rH  NrO  )r²   r   Ú_utilsÚ_set_obj_stater�   Ú__dict__Úsetattr)rÍ   ÚstateÚoptional_tensor_data_nameÚoptional_tensor_attribute_names   &&  r   Ú _torchao_base_tensor__setstate__r~    sÁ   € Ü�4Ð,×-Ò-´'ØÐ&÷3ò 3ð ð ô 
‡L�L×Ñ Ô,Ü%,¨TÐ3OÐQSÖ%TÐ!Ø$¯M©MÖ9Ä'Ø÷C
ô C
ô �D°TÖ:ñ	 &Uô +2ØÐ/°ö+Ð&ð *·±Ö>ÄwØ÷H
ô H
ô �D¸$Ö?ó+r   c                ó`  € Vf   / MTp\        V R4      '       dI   W P                  9   d9   WP                  V ,          9   d"   V P                  V ,          V,          ! WW44      # \        P                  P	                  4       ;_uu_ 4        V! V/ VB uuRRR4       #   + '       g   i     R# ; i)zðUse this util function for a common `__torch_function__` implementation
that dispatches to ops/functions registered with `_implements`

class MyTensor(torch.Tensor):
    ...
    __torch_function__ = classmethod(_dispatch__torch_function__)
Nr$  )r²   r$  r   Ú_CÚDisableTorchFunctionSubclass)r   r  r  rC   rD   s   &&&&&r   Ú_dispatch__torch_function__r‚  “  s†   € ð ’>‰R v€Fä�Ð&×'Ò'Ø×&Ñ&Ô&Ø×'Ñ'¨Õ,Ô,à×"Ñ" 3Õ'¨Ö-¨d¸4ÓHÐHÜ	�‰×	.Ñ	.×	0Õ	0Ù�TÐ$˜VÑ$÷ 
1×	0×	0Ó	0ús   Â	BÂB-	c                óÂ  € \        V R4      '       dI   W P                  9   d9   WP                  V ,          9   d"   V P                  V ,          V,          ! WW44      # \        ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      pVP                  4        UUu/ uF  w  rgV\	        V4      bK  	  ppp\        V P                   RV: RV: RV: RV: 2	4      hu uppi )zðUse this util function for a common `__torch_dispatch__` implementation
that dispatches to ops/functions registered with `_implements`

class MyTensor(torch.Tensor):
    ...
    __torch_dispatch__ = classmethod(_dispatch__torch_dispatch__)
r  c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir   )r    ©r’   Úargs   & r   r”   Ú._dispatch__torch_dispatch__.<locals>.<genexpr>µ  s   é € Ð0©4 C”d˜3—i�i«4ùs   ‚zC dispatch: attempting to run unimplemented operator/function: func=z, types=z, arg_types=z, kwarg_types=)r²   r  r!  Úitemsr    rc  r‘   )	r   r  r  rC   rD   Ú	arg_typesrˆ   r†  Úkwarg_typess	   &&&&&    r   Ú_dispatch__torch_dispatch__r‹  ¦  sß   € ô 	�Ð%×&Ò&Ø×%Ñ%Ô%Ø×&Ñ& sÕ+Ô+à×!Ñ! #Õ& tÖ,¨T¸$ÓGÐGç”Ñ0©4Ó0—‘Ñ0©4Ó0Ó0€IØ.4¯l©l¬nÔ=©n¡F A�1”d˜3“i’<©n€KÑ=Ü
Ø�<‰<ˆ.Ð\ÐW[ÑV]Ð]fÐ`eÑ_gÐgtÐjsÑiuð  vEð  yDñ  xFð  	Góð ùó >s   ÂCc                ó@  € \         ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      pRV9   d   VP                  R4       \        P                  P                  P
                  ! V/ VB w  r4rVVf   V P                  MTpVf   V P                  MTpRVRVRV/pV# )z±Helper function to get the device, dtype and non_blocking keyword args for `aten._to_copy.default` op

Returns: {"device": device, "dtype": dtype, "non_blocking": non_blocking}
c              3   ój   "  € T F)  p\        V\        P                  4      '       d   K%  Vx € K+  	  R # 5ir   )r6   r   r-  r…  s   & r   r”   Ú!_get_to_kwargs.<locals>.<genexpr>Â  s   é € ÐJ¡˜¬J°s¼E¿L¹L×,I—’£ùs   ‚"3©
3r-  r   ró   r_  )r!  rÚ   r   r€  Ú_nnÚ	_parse_tor   ró   )rÍ   rC   rD   r   ró   r_  rH   s   &*,    r   r`  r`  ¼  s“   € ÷ Œ5ÑJ¡ÓJ�5‰5ÑJ¡ÓJÓJ€DØ�6ÔØ�
‰
�8ÔÜ%*§X¡X§\¡\×%;Ò%;¸TÐ%LÀVÑ%LÑ"€F�<Ø"šNˆT�[Š[°€FØš-ˆD�JŠJ¨U€Eà�&Ø�Ø˜ð€Fð
 €Mr   c                   ó¶   a € ] tR tRt o Rt]R 4       t]! ]4      t]! ]	4      t
]! ]4      t]! ]4      t]! ]4      t]tR tR t]R 4       tR tR tR	 tR
tV tR# )r   iÐ  aG  A util tensor subclass that provides commonly used functions
new tensor subclass can inherit to get all the utility functions

Attributes (defined by subclass of ``TorchAOBaseTensor``):

* :attr:`tensor_data_names` (List[str]): list of names of all required tensor_data, order should match
    the `__init__` list of tensor subclass (optional to define to use ``TorchAOBaseTensor``,
    required for getting the util functions been defined (see Note section))

* :attr:`tensor_attribute_names` (List[str]): list of names of non-``Tensor`` attributes,
    order should match the ``__init__`` list of tensor subclass, following all the ``tensor_data_names`` arguments (optional to define to use ``TorchAOBaseTensor``, required for getting the
    util functions been defined (see Note section))

* :attr:`optional_tensor_data_names` (List[str]): it's not required to get the
    additional util functions been implemented, but this will be need if there are
    some optional ``Tensor`` data attributes, when defined, this will be a list of names of ``Tensor``s that
    can be optional

* :attr:`optional_tensor_attribute_names` (List[str]): it's not required to get the
    additional util functions been implemented, but this will be need if there are
    some optional non-``Tensor`` attributes, when defined, this will be a list of names of attributes
    that can be optional

Note:
    **Argument Order**

    Argument order in ``__init__`` and ``__new__`` of subclass of ``TorchAOBaseTensor`` should match exaclty with ``tensor_data_names`` + ``tensor_attribute_names`` + ``optional_tensor_data_names`` (if present) + ``optional_tensor_attribute_names`` (if present)


Note:
    **How to Get Predefined Util Functions**

    If ``tensor_data_names`` (torch.Tensor data attribute names) and ``tensor_attribute_names`` (non-torch.Tensor attribute names) are defined, there are some additional util
    functions that will be added, this includes:

    ``__tensor_flatten__``: flattens a subclassed tensor instance, returns a ``tuple``, first element is tensor data names for valid tensor data, second element is a dict from attribute_name to non-``Tensor`` attributes

    ``__tensor_unflatten__``: takes a ``tensor_data_dict`` (a map from tensor name to ``Tensor``), and list of non-``Tensor`` attributes, returns a new instance of the subclassed tensor

    ``_apply_fn_to_data``: takes a function (``Tensor -> Tensor``),  applies function to all tensor data and recreate a new subclassed Tensor with the transformed tensor data

    ``__repr__``: the string representation of the subclassed tensor instance

    ``_same_metadata``: returns whether the metadata is the same between two instances of cls

    ``__setstate__``: when loading a serialized tensor subclass checkpoints, it sets the new optional tensor and tensor attribute that is saved in the old checkpoint to None, to maintain BC of old checkpoints when we add new optional tensor data or attributes to the tensor subclass

    torch function supported (``__torch_function__``): ``torch.Tensor.contiguous``

    aten ops supported (``__torch_dispatch__``): ``aten.detach.default``, ``aten.clone.default``, ``aten.alias,default``, ``aten.contiguous.default``, ``aten.copy_.default``, ``aten._to_copy.default`` (enables ``t.to``)

Note:
    **Subclassing and Op Inheritance**

    Subclasses of ``TorchAOBaseTensor`` automatically inherit aten op (``__torch_dispatch__``)
    and torch function (``__torch_function__``) implementations from their parent classes.
    Each subclass gets its own independent dispatch tables, so registering a new op on a child
    does not affect the parent, and vice versa.

    A child class can override an inherited op by registering its own implementation with
    ``@ChildClass.implements(...)``. If no override is provided, the parent's implementation
    is used automatically.

    For multiple inheritance (e.g., ``class C(B, A)``), ops are inherited from all parents
    following Python's MRO (Method Resolution Order), with later bases taking priority.

    Example::

        class Parent(TorchAOBaseTensor):
            tensor_data_names = ["qdata"]
            tensor_attribute_names = ["attr"]

            def __new__(cls, qdata, attr):
                r = torch.Tensor._make_wrapper_subclass(cls, qdata.shape)
                r.qdata = qdata
                r.attr = attr
                return r

            def __init__(self, qdata, attr):
                pass

        @Parent.implements([torch.ops.aten.cat.default])
        def parent_cat(func, types, args, kwargs):
            # parent implementation
            ...

        # Child inherits Parent's aten.cat implementation automatically
        class Child(Parent):
            tensor_data_names = ["qdata"]
            tensor_attribute_names = ["attr"]

        # Optionally override an inherited op:
        @Child.implements([torch.ops.aten.cat.default])
        def child_cat(func, types, args, kwargs):
            # child-specific implementation
            ...

Note:
    **Safetensors Support**

    ``TorchAOBaseTensor`` subclasses can be serialized to and loaded from the
    `safetensors <https://huggingface.co/docs/safetensors>`_ format. Since safetensors
    only stores plain ``torch.Tensor`` objects, the serialization layer (in
    ``torchao.prototype.safetensors``) decomposes each tensor subclass into its
    constituent plain tensors (from ``tensor_data_names``/``optional_tensor_data_names``)
    plus JSON metadata (from ``tensor_attribute_names``/``optional_tensor_attribute_names``),
    and reconstructs the subclass on load.

    To add safetensors support for a new ``TorchAOBaseTensor`` subclass:

    1. Define ``tensor_data_names``, ``tensor_attribute_names`` (and optionally
       ``optional_tensor_data_names``, ``optional_tensor_attribute_names``) on the subclass,
       which is already required for the other utility functions above.

    2. Register the subclass in ``torchao/prototype/safetensors/safetensors_utils.py``:

       - Add the class name string to ``ALLOWED_TENSORS_SUBCLASSES``.
       - Add a ``"ClassName": ClassName`` entry to ``ALLOWED_CLASSES``.
       - If the subclass has non-Tensor attributes with custom types (dataclasses, enums,
         named tuples), add those types to ``ALLOWED_CLASSES`` as well.

    Once registered, Hugging Face Transformers users can use ``save_pretrained`` and
    ``push_to_hub`` with the default ``safe_serialization=True`` option. See
    https://docs.pytorch.org/ao/main/eager_tutorials/torchao_hf_integration.html#saving-the-model
    for a full end-to-end example.

Examples::

    class MyTensor(TorchAOBaseTensor):
        tensor_data_names = ["a", "b"]
        tensor_attribute_names = ["c", "d"]
        optional_tensor_data_names = ["e", "f"]
        optional_tensor_attribute_names = ["g", "h"]


        def __new__(
            cls,
            a: Tensor,
            b: Tensor,
            c: int,
            d: str,
            e: Optional[Tensor] = None,
            f: Optional[Tensor] = None,
            g: Optional[int] = None,
            h: Optional[int] = None,
        ):
            pass

        def __init__(
            self,
            a: Tensor,
            b: Tensor,
            c: int,
            d: str,
            e: Optional[Tensor] = None,
            f: Optional[Tensor] = None,
            g: Optional[int] = None,
            h: Optional[int] = None,
        ):
            pass

c                óš  € R V P                   9  d   / V n        RV P                   9  d   / V n        W P                  9  d   / V P                  V &   W P                  9  d   / V P                  V &   \        V R4      '       d.   \        V R4      '       d   V P	                  4        \
        V n        V P                   F�  p\        VR R4      pV'       d/   W#9   d)   V P                  V ,          P                  W2,          4       \        VRR4      pV'       g   K]  W$9   g   Ke  V P                  V ,          P                  WB,          4       K�  	  R# )r  r$  rR  rS  N)
ry  r  r$  r²   ru  r~  Ú__setstate__Ú	__bases__r�   Úupdate)r   rD   ÚparentÚparent_aten_tableÚparent_torch_tables   &,   r   Ú__init_subclass__Ú#TorchAOBaseTensor.__init_subclass__t  s  € à 3§<¡<Ô/Ø!#ˆCÔØ C§L¡LÔ0Ø"$ˆCÔØ×(Ñ(Ô(Ø&(ˆC×Ñ˜sÑ#Ø×)Ñ)Ô)Ø')ˆC×Ñ Ñ$ô �3Ð+×,Ò,´¸Ð>V×1WÒ1WØ×-Ñ-Ô/Ü?ˆCÔð —m”mˆFÜ '¨Ð0@À$Ó GÐß  VÔ%@à×"Ñ" 3Õ'×.Ñ.Ð/@Õ/HÔIä!(¨Ð1BÀDÓ!IÐß!Ñ! fÖ&BØ×#Ñ# CÕ(×/Ñ/Ð0BÕ0JÖKó $r   c                óh   € \         P                  P                  \        \	        V 4      4      4       R # r   )r   r€  Ú_log_api_usage_oncer   r    )rÍ   rC   rD   s   &*,r   Ú__init__ÚTorchAOBaseTensor.__init__˜  s   € Ü�‰×$Ñ$¤S¬¨d«£_Ö5r   c           	     ó  € \        V R 4      '       dÚ   \        V R4      '       dÈ   V P                  P                  4       p\        V R4      '       d6   V P                   F%  p\	        W4      pVf   K  VP                  V4       K'  	  V P                   Uu/ uF  qD\	        W4      bK  	  pp\        V R4      '       d.   TV P                   Uu/ uF  pV\	        W4      bK  	  up,          pW3# \        R4      hu upi u upi )rR  rS  rH  rO  z‹Subclasses should implement __tensor_flatten__ or specify `tensor_data_names` and `tensor_attribute_names` for tensor class before using it)	r²   rR  ÚcopyrH  r�   r\   rS  rO  rc  )rÍ   rR  re  rf  ÚattrÚ	attr_dicts   &     r   r±   Ú$TorchAOBaseTensor.__tensor_flatten__›  s  € Ü�4Ð,×-Ò-´'ØÐ*÷3
ò 3
ð !%× 6Ñ 6× ;Ñ ;Ó =ÐÜ�tÐ9×:Ò:Ø(,×(GÔ(GÐ$Ü#*¨4Ó#B�LØ#Ô/Ø)×0Ñ0Ð1AÖBñ )Hð 7;×6QÒ6QóÙ6Q¨d”g˜dÓ)Ò)Ñ6Qð ð ô �tÐ>×?Ò?Ø%à $× DÒ Dó)á D˜ð œ' $Ó-Ò-Ù Dñ)õ �	ð
 %Ð/Ð/ä!ð Zó
ð 	
ùòùò)s   ÂC7ÃC<c                ó  € \        V R 4      '       dÙ   \        V R4      '       dÇ   V P                   Uu. uF  qQV,          NK  	  pp/ p\        V R4      '       d,   V P                   Uu/ uF  pW�P                  VR4      bK  	  ppV P                   Uu. uF  qRV,          NK  	  p	p/ p
\        V R4      '       d#   V P
                   Uu/ uF  pWRV,          bK  	  p
pV ! . VOV	O5/ VBV
B # \        R4      hu upi u upi u upi u upi )rR  rS  rH  NrO  z�Subclasses should implement __tensor_unflatten__ or specify `tensor_data_names` and `tensor_attribute_names` for tensor class before using it)r²   rR  rH  r2  rS  rO  rc  )r   Útensor_data_dictrg  Ú
outer_sizeÚouter_striderÃ   Úrequired_tensorsÚoptional_tensor_dictre  Úrequired_attributesÚoptional_attribute_dicts   &&&&&      r   rÌ   Ú&TorchAOBaseTensor.__tensor_unflatten__µ  se  € ô �3Ð+×,Ò,´¸Ð>V×1WÒ1Wà36×3HÒ3Hó Ù3H¨4 ×&Ð&Ñ3Hð ð  ð $&Ð Ü�sÐ8×9Ò9ð -0×,JÒ,Jó(á,JÐ(ð %×&:Ñ&:Ð;KÈTÓ&RÒRÙ,Jð %ð (ð 58×4NÒ4Nó#Ù4N¨D $×'Ð'Ñ4Nð  ð #ð ')Ð#Ü�sÐ=×>Ò>ð !$× CÒ Có+á C˜ð ¨DÕ1Ò1Ù Cð (ð +ñ
 ð Ø!ðà$òð 'ðð *ñ	ð ô "ð \ó
ð 	
ùò7 ùò
(ùò
#ùò
+s   ³C6Á(C;ÂD ÃDc           	     óH  € \        V R 4      '       dø   \        V R4      '       dæ   V P                   Uu. uF  q!! \        W4      4      NK  	  pp/ p\        V R4      '       d3   V P                   F"  p\        W4      pVe   V! V4      WE&   K  RWE&   K$  	  V P                   Uu. uF  p\        W4      NK  	  pp/ p\        V R4      '       d&   V P
                   U	u/ uF  p	V	\        W	4      bK  	  pp	V P                  ! . VOVO5/ VBVB # \        R4      hu upi u upi u up	i )rR  rS  rH  NrO  z�Subclasses should implement _apply_fn_to_data or specify `tensor_data_names` and `tensor_attribute_names` for tensor class or tensor instance before using it)r²   rR  r�   rH  rS  rO  rb  rc  )
rÍ   rV   r¡  r¨  r©  re  rf  rª  r«  r·   s
   &&        r   r3  Ú#TorchAOBaseTensor._apply_fn_to_dataÙ  sm  € Ü�4Ð,×-Ò-´'ØÐ*÷3
ò 3
ð 59×4JÒ4Jó Ù4J¨D�”7˜4Ó&Ö'Ñ4Jð ð  ð $&Ð Ü�tÐ9×:Ò:Ø(,×(GÔ(GÐ$Ü#*¨4Ó#B�LØ#Ò/ÙACÀLÓAQÐ,Ó>àAEÐ,Ó>ñ )Hð 15×0KÒ0Kó#Ù0K¨”˜Ö#Ñ0Kð  ð #ð ')Ð#Ü�tÐ>×?Ò?ð &*×%IÒ%Ió+á%I˜	ð œw tÓ7Ò7Ù%Ið (ð +ð
 —>’>ð Ø!ðà$òð 'ðð *ñ	ð ô "ð ló
ð 	
ùò; ùò#ùò
+s   ³DÂ"DÃDc           	     ó¾  € \        V R 4      '       EdA   \        V R4      '       Ed.   RpWP                  ^ ,           R\        W P                  ^ ,          4       2,          pV P                  R,           F  pVRV R\        W4       2,          pK  	  V P                   F  pVRV R\        W4       2,          pK  	  \        V R4      '       d,   V P                   F  pVRV R\        W4       2,          pK  	  \        V R4      '       d,   V P
                   F  pVRV R\        W4       2,          pK  	  V P                  P                   RV R	2# \        R
4      h)rR  rS  Ú Ú=r–   z, rH  rO  Ú(Ú)z’Subclasses must implement __repr__ or specify `tensor_data_names` and `tensor_attribute_names` for tensor class or tensor instance before using it)	r²   rR  r�   rS  rH  rO  rb  r‘   rc  )rÍ   Úrepr_strre  Útensor_attribute_names   &   r   Ú__repr__ÚTorchAOBaseTensor.__repr__þ  s€  € Ü�4Ð,×-Ó-´'ØÐ*÷3
ó 3
ð ˆHà×1Ñ1°!Õ4Ð5°Q´w¸t×E[ÑE[Ð\]ÕE^Ó7_Ð6`ÐaÕaˆHØ$(×$:Ñ$:¸2×$>Ð$>Ð Ø˜bÐ!1Ð 2°!´G¸DÓ4SÐ3TÐUÕU’ñ %?ð *.×)DÔ)DÐ%ØØÐ.Ð/¨q´¸Ó1UÐ0VÐWõ’ñ *Eô �tÐ9×:Ò:Ø(,×(GÔ(GÐ$ØØÐ-Ð.¨a´¸Ó0OÐ/PÐQõ’Hñ )Hô �tÐ>×?Ò?Ø-1×-QÔ-QÐ)Ø "Ð%:Ð$;¸1¼WÀTÓ=aÐ<bÐ cÕc’Hñ .Rð —n‘n×-Ñ-Ð.¨a°¨z¸Ð;Ð;ä!ð aó
ð 	
r   c                óB   € \        V R4      '       g   R# V P                  # )a@  
.. deprecated:: 0.15.1
   This method is deprecated as of version 0.15.1 since it's
   part of the older tensor subclass development stack,
   for information about new dev stack, please check
   https://docs.pytorch.org/ao/main/quantization_overview.html
   and https://docs.pytorch.org/ao/main/contributor_guide.html
Ú_layoutN)r²   r¹  )rÍ   s   &r   Ú
get_layoutÚTorchAOBaseTensor.get_layout   s   € ô �t˜Y×'Ò'ÙØ�|‰|Ðr   ra   N)r‘   rá   râ   rã   Ú__doc__Úclassmethodr™  r"  rj  r*  rk  ru  r‹  Ú__torch_dispatch__r‚  Ú__torch_function__r`  r�  r±   rÌ   r3  r¶  rº  rä   rå   ræ   s   @r   r   r   Ð  s˜   ø‡ € ñaðF ñLó ðLñ8 ˜[Ó)€JÙ +Ð,FÓ GÐÙ$/Ð0MÓ$NÐ!Ù$Ð%@ÓAÐÙ$Ð%@ÓAÐØ#€Nò6ò
ð4 ñ!
ó ð!
òF#
òJ 
÷Dð r   c                ó  € V\        V4      ,
          \        V 4      8”  d   \        R4      h\        V 4      p\        \        V 4      V4       F1  pVP	                  W$V,
          \        V4      ,           ,          4       K3  	  V# )ai  
__torch_dispatch__ doesn't guarantee the number of arguments you are
passed (e.g., defaulted arguments are not passed); but usually it is
convenient to pad out the arguments list with defaults.  This function
helps you do that.
Args:
    args: the list of positional arguments passed to __torch_dispatch__
    n: the number of arguments you are expecting to get
    defaults_tail: default values for the arguments, starting from the
        end of the list
Example:
    >>> fill_defaults([1, 2, 3], 5, [3, 4, 5])
    [1, 2, 3, 4, 5]
    >>> fill_defaults([1, 2, 3], 5, [None, None, None])
    [1, 2, 3, None, None]]
z%not enough defaults to fill arguments)r*   ÚRuntimeErrorrÈ   r:   r\   )rC   r}   Údefaults_tailÚrÚis   &&&  r   Úfill_defaultsrÅ  .  sf   € ð" 	Œ3ˆ}ÓÕ¤ D£	Ô)ÜÐBÓCÐCÜˆT‹
€AÜ”3�t“9˜aÖ ˆØ	�‰� 1�u¤s¨=Ó'9Õ9Õ:Ö;ñ !à€Hr   c                  ó†   € \         P                  P                  4       ;'       d    \         P                  P                  R J# r   )r   r1   r[   r   Úhipra   r   r   Úis_ROCMrÈ  P  s,   € Ü�:‰:×"Ñ"Ó$×FÐF¬¯©×):Ñ):À$Ð)FÐFr   c                  ó¤   € \        4       '       d@   . ROp \        P                  P                  ^ 4      P                  pV  F  pW!9   g   K   R# 	  R# )Úgfx940TF)rÊ  Úgfx941Úgfx942©rÈ  r   r1   Úget_device_propertiesÚgcnArchName)Ú
mxArchNameÚarchNameÚarchs      r   Úis_MI300rÓ  T  s@   € Ü‡y‚yÚ3ˆ
Ü—:‘:×3Ñ3°AÓ6×BÑBˆÛˆDØÖÚñ ñ r   c                  óŠ   € \        4       '       d3   \        P                  P                  ^ 4      P                  p RV 9   d   R# R# )r   Úgfx950TFrÍ  ©rÑ  s    r   Úis_MI350r×  ^  s1   € Ü‡y‚yÜ—:‘:×3Ñ3°AÓ6×BÑBˆØ�xÔÙÙr   c                  ó~   € \        4       '       d-   \        P                  P                  ^ 4      P                  p  R# R# )r   TFrÍ  rÖ  s    r   Úis_Navi4rÙ  f  s,   € Ü‡y‚yÜ—:‘:×3Ñ3°AÓ6×BÑBˆØÙÙr   c                ó<   € V ^8„  d   QhR\         R\         R\        /# ©r   r  r  r$   ©r   rô   )r   s   "r   r   r   n  s&   € ÷ Vñ Vœð V¤Sð V¬Tñ Vr   c                óÚ   € \         P                  P                  4       ;'       d    \         P                  P                  pV'       d#   \         P                  P	                  4       W38H  # R# )z0Check if the CUDA version is exactly major.minorF©r   r1   r[   r   re   )r  r  Úis_cudas   && r   Úis_sm_versionrà  n  sH   € ä�j‰j×%Ñ%Ó'×>Ð>¬E¯M©M×,>Ñ,>€GßCJŒ5�:‰:×+Ñ+Ó-°%°Ñ?ÐUÐPUÐUr   c                  óÔ   € \         P                  P                  4       ;'       dD    \         P                  P                  ;'       d"    \         P                  P	                  4       R8¬  # )é   )râ  é	   rÞ  ra   r   r   Úis_sm_at_least_89rä  t  óM   € ä�
‰
×ÑÓ!÷ 	9ð 	9Ü�M‰M×Ñ÷	9ð 	9ä�J‰J×,Ñ,Ó.°&Ñ8ðr   c                  óÔ   € \         P                  P                  4       ;'       dD    \         P                  P                  ;'       d"    \         P                  P	                  4       R8¬  # )rã  )rã  r   rÞ  ra   r   r   Úis_sm_at_least_90rç  |  rå  r   c                  óÔ   € \         P                  P                  4       ;'       dD    \         P                  P                  ;'       d"    \         P                  P	                  4       R8¬  # )é
   )ré  r   rÞ  ra   r   r   Úis_sm_at_least_100rê  …  sM   € ä�
‰
×ÑÓ!÷ 	:ð 	:Ü�M‰M×Ñ÷	:ð 	:ä�J‰J×,Ñ,Ó.°'Ñ9ðr   c                ó<   € V ^8„  d   QhR\         R\         R\        /# rÛ  rÜ  )r   s   "r   r   r   �  s!   € ÷ 6ñ 6¤Cð 6´ð 6¼ñ 6r   c                 óì   € \         P                  P                  4       '       g   R # \         P                  P                  pVf   R # \	        \
        VP                  R4      R,          4      w  r4W43W38¬  # )Frd   :Nr   N)r   r1   r[   r   r  r   Úsplit)r  r  Úcuda_versionÚ
cuda_majorÚ
cuda_minors   &&   r   Úis_cuda_version_at_leastrñ  �  s_   € Ü�:‰:×"Ñ"×$Ò$ÙÜ—=‘=×%Ñ%€LØÒÙÜ ¤ l×&8Ñ&8¸Ó&=¸bÕ&AÓBÑ€JØÐ#¨ ~Ñ5Ð5r   c                ó$   € V ^8„  d   QhR\         /# ©r   r$   ©rô   )r   s   "r   r   r   —  s   € ÷ 
ñ 
¤Dñ 
r   c                 ó&  € \        \        P                  P                  R4      '       d)   \        P                  P                  P	                  4       # \        \        P
                  R4      '       d   \        P
                  P	                  4       # R# )zÔ
Safely query AMX tile support, guarding against private API absence.
torch.cpu._is_amx_tile_supported / torch._C._cpu._is_amx_tile_supported are
private and may be missing in certain PyTorch builds or versions.
Ú_is_amx_tile_supportedF)r²   r   r€  Ú_cpurö  r4   ra   r   r   Ú_cpu_is_amx_tile_supportedrø  —  sY   € ô Œu�x‰x�}‰}Ð6×7Ò7Ü�x‰x�}‰}×3Ñ3Ó5Ð5Ü	”—‘Ð4×	5Ò	5Ü�y‰y×/Ñ/Ó1Ð1Ùr   c                ó$   € V ^8„  d   QhR\         /# ró  rô  )r   s   "r   r   r   ¤  s   € ÷ 
ñ 
¤ñ 
r   c                 ó&  € \        \        P                  P                  R4      '       d)   \        P                  P                  P	                  4       # \        \        P
                  R4      '       d   \        P
                  P	                  4       # R# )zÏ
Safely query AVX512_VNNI support, guarding against private API absence.
torch.cpu._is_vnni_supported / torch._C._cpu._is_vnni_supported are
private and may be missing in certain PyTorch builds or versions.
Ú_is_vnni_supportedF)r²   r   r€  r÷  rû  r4   ra   r   r   Ú_cpu_is_vnni_supportedrü  ¤  sY   € ô Œu�x‰x�}‰}Ð2×3Ò3Ü�x‰x�}‰}×/Ñ/Ó1Ð1Ü	”—‘Ð0×	1Ò	1Ü�y‰y×+Ñ+Ó-Ð-Ùr   c                óD   € V ^8„  d   QhR\         P                  R\        /# )r   r   r$   )r   r   rô   )r   s   "r   r   r   ±  s"   € ÷ Añ A¤§¡ð A´ñ Ar   c                óN   € V P                   R8H  ;'       d    \        4       '       * # )zy
Helper to determine if int8 tensor quantization range should be reduced
to avoid overflow on CPUs without VNNI support.
r4   )r    rü  r/  s   &r   Úshould_reduce_rangerÿ  ±  s"   € ð
 �;‰;˜%Ñ×@Ð@Ô(>Ó(@Ô$@Ð@r   c                 ó.   € W,           ^,
          V,          # r†   ra   ©rÔ   rÕ   s   &&r   Úceil_divr  ¹  s   € Ø�E�A�I˜!ÕÐr   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   rÔ   rÕ   r$   r~   )r   s   "r   r   r   ½  s!   € ÷ ñ ”ð œð ¤ñ r   c                 ó&   € \        W4      V,          # r   )r  r  s   &&r   Úround_upr  ½  s   € Ü�A‹>˜AÕÐr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úpackage_namer  )r   )r   s   "r   r   r   Á  s   € ÷ 0ñ 0¤cð 0¼ñ 0r   c                 ót   € \         P                  P                  V 4      R JpV'       g   R# \        V 4      V8¬  # )NF)Ú	importlibÚutilÚ	find_specr   )r  r  Úpackage_existss   && r   Úis_package_at_leastr  Á  s1   € Ü—^‘^×-Ñ-¨lÓ;À4ÐG€NßÙä�<Ó  KÑ/Ð/r   c                  óˆ   € \         P                  P                  R 4      RJ;'       g    \        4       p V '       g   R# ^ RIpR# )ÚmslkNFT)r	  r
  r  r  r  )Úhas_mslkr  s     r   Ú_is_mslk_availabler  É  s1   € Ü�~‰~×'Ñ'¨Ó/°tÐ;×JÐJ¼y»{€HßÙãár   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r  r$   )r   rô   )r   s   "r   r   r   Ó  s   € ÷ Iñ I¬#ð I´$ñ Ir   c                 óp   € \        4       '       g   R # ^ RIp\        VP                  4      \        V 4      8¬  # )FN)r  r  r	  r  )r  r  s   & r   Úis_mslk_version_at_leastr  Ó  s,   € Ü×ÒÙÛä˜×)Ñ)Ó*¬m¸KÓ.HÑHÐHr   c                  ó  € \         P                  P                  R 4      RJ;'       dS    \         P                  P                  R4      RJ;'       d*    \         P                  P                  R4      RJ;'       g    \        4       # )Ú
flashinferNÚtvm_ffiÚpynvml)r	  r
  r  r  ra   r   r   Ú_is_flashinfer_availabler  Û  su   € ô 	�‰× Ñ  Ó.°dÐ:÷ 	;ð 	;ä�N‰N×$Ñ$ YÓ/°tÐ;÷	;ð 	;ô �N‰N×$Ñ$ XÓ.°dÐ:÷ð ô 
‹ðr   c                   óF   a a€ ] tR tRt oRtRV3R lV 3R llltRtVtV ;t# )r   iæ  a  This is used because the TorchAO quantization functions tend to operate on modules so to apply the transform to a tensor, we can load a
DummyModule with the target tensor and then apply the transformation to the module and then extract the transformed tensor.
c                ó^   <€ V ^8„  d   QhRS[ P                  RS[S[ P                  ,          /# )r   ré   Úbias)r   rl   r	   )r   rç   s   "€r   r   ÚDummyModule.__annotate__ë  s(   ø€ ÷ ñ ™uŸ|™|ð ±8¹E¿L¹LÕ3Iñ r   c                ó<   <€ \         SV `  4        Wn        W n        R # r   )Úsuperr�  ré   r  )rÍ   ré   r  rb  s   &&&€r   r�  ÚDummyModule.__init__ë  s   ø€ Ü‰ÑÔØŒØŽ	r   )r  ré   r   )	r‘   rá   râ   rã   r¼  r�  rä   rå   Ú__classcell__)rb  rç   s   @@r   r   r   æ  s   ù‡ € ñ÷÷ õ r   )rL   rY   r]   rh   r{   r‰   r©   rÀ   rð   r   rñ  rÓ  rä  rç  rê  r  r   r   rø  rü  rÿ  )ra   NNr  )Fr   )ra   N)Ir  r	  r¾   rþ   r@   r   Úimportlib.metadatar   Úmathr   Útypingr   r	   r
   r   Útorch.nn.utils.parametrizer%   r   rí   Útorch.utils._python_dispatchr   Ú__all__r   r!   Úcacher/   rL   rY   r]   rb   rh   rp   r{   r‰   r©   r®   rÀ   r&   rÆ   rð   rû   r	  r  r  r"  r*  ru  r~  r‚  r‹  r`  rl   r   rÅ  rÈ  rÓ  r×  rÙ  rà  rä  rç  rê  rñ  rø  rü  rÿ  r  r  r  r  r  r  r   ra   r   r   Ú<module>r)     s|  ðó Û Û Û 	Û Ý Ý &Ý ß 'Ñ 'ã ß 0Ó 0Ý Dò€ò2õ:ð
 ‡�ôó ðô"D>òN
òò3ò
õò"õô4ònôô< ˜5Ÿ8™8Ÿ?™?ô  ôFõ8òMò$5òJðòòD òF\
ò~@ô(%ò&ò,ô([˜Ÿ™ô [ò|
òDGòòòõVòòòõ6õ
õ
õAòõõ0òõIòô�%—(‘(—/‘/ö r   