o
    j9:j"                    @  s  U d dl mZ 	 d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dlm
Z
mZ d dlmZmZmZ d dlZd dlm  mZ d dlmZmZmZmZmZmZmZmZ d dlmZ eryd dlmZ d dlm Z  d dl!Z!d d	l"m#Z# e$e%Z&ej'e%d
Z(e) Z*de+d< e,e-B e.B dB Z/g dZ0d dl1m2Z3 edddZ4edddZ4edddZ4edddZ4dddZ4G dd dZ5G d d! d!Z6G d"d# d#e6e.Z7i d$ej8d%ej9d&ej:d'ej;d(ej;d)ej<d*ej=d+ej>d,ej?d-ej@d.ejAd/ejBd0d1d2 d3ejCd4ejDd5ejEd6ejFi d7ejGd8ejHd9ejId:ejJd;ejJd<ejKd=ejLd>ejLd?ejMd@ejNdAejOdBedCedDedEedFedGejPdHejPiZQh dIZRddMdNZSdOZTeTD ]&ZUdPeU ZVdQeV ZWeXe5eVeSeU eYeeWeQeV< eR:eV e0ZeV qpd0hZ[eRe[B Z\h dRZ]h dSZ^d*hZ_e]e_B Z`h dTZad'd:hZbd'd:dUdVZch dWZdeTD ]ZUdPeU ZVed:eV qh dXZeh dYZfdd]d^Zgdd_d`ZhddadbZiddcddZjddedfZkddgdhZlddidjZmddkdlZnddmdnZoddodpZpddudvZq	w	wddd~dZrdddZsdddZtdddZui d&ej:dAejOd7ejGd6ejd>ekd=eld'emd(esd:end;etd<eudGegdHehd-eid4eod@epZvdddZwdddZxdddZydddZzdddZ{dddZ|dddZ}dddZ~dddZdddZdddZdddZdddZe	je% ZdddZeTD ]ZUdeU ZeeUZe e_e_%eXeee q[[U[dddZ	ddddZdddZdddZi evi dFejd$ej8d*e{d8e|d/e}d5e~d3ed.ed+exd,eydBed)ezd9ejIdEedDedCed%eeedZeTD ]ZUdPeU ZVeYedeU eeV< q[U[V[T[dddZdddZdddZdddZdddZdddZdddĄZdddƄZeeeeeedǜZddd˄ZdddτZdddӄZdddׄZdddلZe D ]
\ZZeee qe D ]
\ZZeee qddd܄ZeD ]9Zee]v reee qeeav reee qee_v see^v reee eee eecvreee q[[dS )    )annotationsN)	lru_cacheupdate_wrapper)AnyoverloadTYPE_CHECKING)	sym_floatsym_itesym_maxsym_minsym_notSymBoolSymFloatSymInt)dtrace_structured)Callable)Self)ShapeEnvsym_nodeobject_NO_HINT)SymNodemethod_to_operatormagic_methods
DynamicInt)py_sym_typest
type[bool]returntype[SymBool]c                 C     d S N r   r"   r"   e/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/fx/experimental/sym_node.py_to_symtypeD      r%   	type[int]type[SymInt]c                 C  r    r!   r"   r#   r"   r"   r$   r%   F   r&   type[float]type[SymFloat]c                 C  r    r!   r"   r#   r"   r"   r$   r%   H   r&   typec                 C  r    r!   r"   r#   r"   r"   r$   r%   J   r&   c                 C  s(   | t u rtS | tu rtS | tu rtS | S r!   )boolr   intr   floatr   r#   r"   r"   r$   r%   L   s   c                   @  s  e Zd ZU dZdZded< 			ddddZdddZdddZdddZ	e
dd d!Ze
dd#d$Zdd%d&Zdd(d)Zdd+d,Zdd.d/Zdd0d1Zdd2d3Zdd4d5Zdd6d7Zdd9d:Zdd<d=Zdd>d?Zdd@dAZddCdDZddEdFZddGdHZddIdJZddKdLZddMdNZdddPdQZddRdSZ ddTdUZ!ddVdWZ"ddXdYZ#ddZd[Z$dd\d]Z%dd^d_Z&dd`daZ'ddbdcZ(ddddeZ)ddfdgZ*ddhdiZ+ddjdkZ,ddldmZ-ddndoZ.ddpdqZ/ddrdsZ0ddtduZ1ddvdwZ2ddxdyZ3ddzd{Z4dd|d}Z5dd~dZ6dddZ7dddZ8dddZ9dddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddZ@dddZAdddZBdddZCdddZDdddZEdddZFdddZGdddZHdddZIdddZJdddZKdddZLdddZMdddZNddddZOdddZPdddZQdddZRdddÄZSdddńZTdddǄZUdddɄZVddd˄ZWddd̈́ZXdddτZYdddфZZdddӄZ[dS )r   z
    This is a type erased SymInt/SymFloat which we use to do actual operations.
    End users don't touch this.  Magic methods are NOT defined on this object.
    Fr,   _optimized_summationNexprr   	shape_envShapeEnv | Nonepytyper+   hintHintType | objectconstantint | float | bool | Nonefx_nodeoptimized_summationr   Nonec                   s   | _ | _| _| _d _d  _d fdd}|tu r d }n>|d ur[t||u s>t|t|u s>t	d| dt|  jrZ jj
rZ| }	||	krZt	| d|	 d	 j d
n| }| _| _ joj jj
}
|
on| _d S )Nr   &HintType | SymInt | SymFloat | SymBoolc                    sb   ddl m}  |  jrd S  jd u rtd jj jdd}|d ur/t|ts- |n|}|S )Nr   )has_free_unbacked_symbolsz%shape_env is required to compute hintT)compute_hint)	%torch.fx.experimental.symbolic_shapesr=   r0   r1   RuntimeError_maybe_evaluate_static
isinstanceSymTypesr3   )r=   r4   selfr"   r$   r>      s   

z&SymNode.__init__.<locals>.compute_hintzCannot create SymNode of type z  with incompatible hint of type z != z (for )r   r<   )_exprr1   r3   r/   	_expr_ver_expr_cacher   r+   r%   AssertionError_translation_validation_enabledr0   _hintr6   r8   )rE   r0   r1   r3   r4   r6   r8   r9   r>   computed_hinttx_validation_enr"   rD   r$   __init__h   s:   
zSymNode.__init__r   c                 C  s   t | j|| j| j| j| jS r!   )r   rH   r3   rM   r6   r8   )rE   r1   r"   r"   r$   with_shape_env   s   zSymNode.with_shape_envotherc                 C  s<   | j |j ko| j|jko| j|jko| j|jko| j|jkS r!   )rH   r3   rM   r6   r8   rE   rR   r"   r"   r$   	_value_eq   s   



zSymNode._value_eqr-   c                 C  s   t | j| j| j| j| jfS r!   )hashrH   r3   rM   r6   r8   rD   r"   r"   r$   _value_hash   s   zSymNode._value_hashsympy.Basicc                 C  sz   t | jts
| jjr| jS | jd u rtd| jj}|dkr!| jS | jd ur.|| jkr.| jS | j	| j}|| _|| _|S )Nz$shape_env is required to access exprr   )
rB   rH   r-   	is_numberr1   rK   _replacements_version_counterrJ   rI   replace)rE   verresultr"   r"   r$   r0      s    

zSymNode.exprr<   c                 C  s   | j S r!   rM   rD   r"   r"   r$   r4      s   zSymNode.hintc                 C  s
   | j d uS r!   r]   rD   r"   r"   r$   has_hint      
zSymNode.has_hint
int | Nonec                 C  s   | j jr	t| j S d S r!   )r0   rX   r-   rD   r"   r"   r$   maybe_as_int   s   
zSymNode.maybe_as_intfloat | Nonec                 C  s$   dd l }t| j|jrt| jS d S Nr   )sympyrB   r0   Floatr.   rE   rd   r"   r"   r$   maybe_as_float   s   
zSymNode.maybe_as_floatbool | Nonec                 C  s,   dd l }| j|ju rdS | j|ju rdS d S )Nr   TF)rd   r0   truefalserf   r"   r"   r$   maybe_as_bool   s   zSymNode.maybe_as_boolc                 C  
   | j tu S r!   )r3   r-   rD   r"   r"   r$   is_int  r_   zSymNode.is_intc                 C  rl   r!   )r3   r.   rD   r"   r"   r$   is_float
  r_   zSymNode.is_floatc                 C  rl   r!   )r3   r,   rD   r"   r"   r$   is_bool  r_   zSymNode.is_boolc                 C  s"   | j d uot| j to| j j S r!   )rM   rB   r   nodeis_nested_intrD   r"   r"   r$   rq     s
   


zSymNode.is_nested_intnumc                 C  B   t |turtdt | dd l}t||| jt|||dS )NExpected int, got r   r6   r8   )r+   r-   rK   rd   r   Integerr1   rE   rr   rd   r"   r"   r$   wrap_int     zSymNode.wrap_intr.   c                 C  rs   )NzExpected float, got r   ru   )r+   r.   rK   rd   r   re   r1   rw   r"   r"   r$   
wrap_float!  ry   zSymNode.wrap_floatc                 C  sH   t |turtdt | dd l}t|r|jn|j| jt|||dS )NzExpected bool, got r   ru   )r+   r,   rK   rd   r   ri   rj   r1   rw   r"   r"   r$   	wrap_bool*  s   zSymNode.wrap_boolc                 C     | S r!   r"   rD   r"   r"   r$   clone8  r&   zSymNode.clonebuiltins.strc                 C  s   | j  S r!   r0   rD   r"   r"   r$   str;     zSymNode.strc                 C     |   S r!   r   rD   r"   r"   r$   __str__>  r   zSymNode.__str__c                 C  s   d| j  d| j d| j g}| jd ur|d| j  | jd ur+|d| j  | jd ur9|d| j  d|d S )	NzSymNode(z, shape_env=z	, pytype=zhint=z	constant=zfx_node=z, rF   )rH   r1   r3   rM   appendr6   r8   join)rE   repr"   r"   r$   __repr__A  s   


zSymNode.__repr__c                 C  r   r!   r   rD   r"   r"   r$   _graph_reprM  s   zSymNode._graph_reprc                 C  r   r!   )_absrD   r"   r"   r$   absS  r   zSymNode.absc                 C  r   r!   )_posrD   r"   r"   r$   posV  r   zSymNode.posndigitsc                 C  
   |  |S r!   )_roundrE   r   r"   r"   r$   roundY  r_   zSymNode.roundc                 C  r   r!   )_truncrD   r"   r"   r$   trunc\  r   zSymNode.truncc                 C  r   r!   )_addrS   r"   r"   r$   add_  r_   zSymNode.addc                 C  r   r!   )_subrS   r"   r"   r$   subb  r_   zSymNode.subc                 C  r   r!   )_mulrS   r"   r"   r$   mule  r_   zSymNode.mulc                 C  r   r!   )_modrS   r"   r"   r$   modh  r_   zSymNode.modc                 C  r   r!   )
_float_powrS   r"   r"   r$   	float_powk  r_   zSymNode.float_powc                 C  r   r!   )_pow_by_naturalrS   r"   r"   r$   pow_by_naturaln  r_   zSymNode.pow_by_naturalc                 C  r   r!   )_and_rS   r"   r"   r$   and_q  r_   zSymNode.and_c                 C  r   r!   )_or_rS   r"   r"   r$   or_t  r_   zSymNode.or_c                 C  r   r!   )_float_truedivrS   r"   r"   r$   float_truedivw  r_   zSymNode.float_truedivc                 C  r   r!   )_int_truedivrS   r"   r"   r$   int_truedivz  r_   zSymNode.int_truedivc                 C  r   r!   )_int_floordivrS   r"   r"   r$   int_floordiv}  r_   zSymNode.int_floordivc                 C  r   r!   )_lshiftrS   r"   r"   r$   lshift  r_   zSymNode.lshiftc                 C  r   r!   )_rshiftrS   r"   r"   r$   rshift  r_   zSymNode.rshiftc                 C  r   r!   )_sym_notrD   r"   r"   r$   r     r   zSymNode.sym_notc                 C  r   r!   )_eqrS   r"   r"   r$   eq  r_   z
SymNode.eqc                 C  r   r!   )_nerS   r"   r"   r$   ne  r_   z
SymNode.nec                 C  r   r!   )_gtrS   r"   r"   r$   gt  r_   z
SymNode.gtc                 C  r   r!   )_ltrS   r"   r"   r$   lt  r_   z
SymNode.ltc                 C  r   r!   )_lerS   r"   r"   r$   le  r_   z
SymNode.lec                 C  r   r!   )_gerS   r"   r"   r$   ge  r_   z
SymNode.gec                 C  r   r!   )_floorrD   r"   r"   r$   floor  r   zSymNode.floorc                 C  r   r!   )_is_integerrD   r"   r"   r$   
is_integer  r   zSymNode.is_integerc                 C  r   r!   )
_sym_floatrD   r"   r"   r$   r     r   zSymNode.sym_floatc                 C  r   r!   )_sym_intrD   r"   r"   r$   sym_int  r   zSymNode.sym_intc                 C  r   r!   )_ceilrD   r"   r"   r$   ceil  r   zSymNode.ceilc                 C  r   r!   )_negrD   r"   r"   r$   neg  r   zSymNode.negc                 C  r   r!   )_sym_minrS   r"   r"   r$   r     r_   zSymNode.sym_minc                 C  r   r!   )_sym_maxrS   r"   r"   r$   r
     r_   zSymNode.sym_maxthen_valelse_valc                 C     |  ||S r!   )_sym_ite)rE   r   r   r"   r"   r$   r	        zSymNode.sym_itesizeslist[SymNode]stridesc                 C  r   r!   )_is_contiguousrE   r   r   r"   r"   r$   is_contiguous  r   zSymNode.is_contiguousc                 C  r   r!   )_is_channels_last_contiguous_2dr   r"   r"   r$   is_channels_last_contiguous_2d     z&SymNode.is_channels_last_contiguous_2dc                 C  r   r!   )_is_channels_last_contiguous_3dr   r"   r"   r$   is_channels_last_contiguous_3d  r   z&SymNode.is_channels_last_contiguous_3dc                 C  r   r!   )_is_channels_last_strides_2dr   r"   r"   r$   is_channels_last_strides_2d  r   z#SymNode.is_channels_last_strides_2dc                 C  r   r!   )_is_channels_last_strides_3dr   r"   r"   r$   is_channels_last_strides_3d  r   z#SymNode.is_channels_last_strides_3dc                 C  r   r!   )'_is_non_overlapping_and_dense_indicatorr   r"   r"   r$   &is_non_overlapping_and_dense_indicator  r   z.SymNode.is_non_overlapping_and_dense_indicatorc                 C  r   r!   )r   rS   r"   r"   r$   sym_or  r_   zSymNode.sym_orc                 C  r   r!   )r   rS   r"   r"   r$   sym_and  r_   zSymNode.sym_andc                 C  r   r!   )_bitwise_andrS   r"   r"   r$   bitwise_and  r_   zSymNode.bitwise_andc                 C  r   r!   )_bitwise_orrS   r"   r"   r$   
bitwise_or  r_   zSymNode.bitwise_orc                 C  r   r!   )_bitwise_xorrS   r"   r"   r$   bitwise_xor  r_   zSymNode.bitwise_xorc                 C  r   r!   )r   rS   r"   r"   r$   truediv  r_   zSymNode.truedivc                 C  r   r!   )r   rS   r"   r"   r$   floordiv  r_   zSymNode.floordivc                 C  r   r!   )r   rS   r"   r"   r$   pow  r_   zSymNode.powc                 C  s   |  ||t| dS )N   )r   r   to_noder   r"   r"   r$   is_non_overlapping_and_dense  s   z$SymNode.is_non_overlapping_and_densec                 C     |  ddS N r   )	guard_intrD   r"   r"   r$   int_  r   zSymNode.int_argsc                 C  s   dd l }ddlm}m} | r!t| |tjtdd |D fi S dd |D }|j| }g }t	}|D ]}	|	j
d u r< n||	j
 q3t|}| jd u rPtd| jtjtdd |D f\}
}t|| jt||
d	S )
Nr   get_proxy_modehandle_sym_dispatchc                 s  s    | ]}t |V  qd S r!   	wrap_node.0ar"   r"   r$   	<genexpr>
  s    z"SymNode.sym_sum.<locals>.<genexpr>c                 S     g | ]}|j qS r"   r   r   r"   r"   r$   
<listcomp>      z#SymNode.sym_sum.<locals>.<listcomp>z!shape_env is required for sym_sumc                 s  s    | ]}|j V  qd S r!   r8   r   r"   r"   r$   r     s    r   )rd   "torch.fx.experimental.proxy_tensorr   r   r   torchsym_sumtupleAddr   r4   r   sumr1   r@   _create_fx_call_functionr   r-   )rE   r   rd   r   r   exprsout
size_hintsout_hintr   r8   _r"   r"   r$   r    s4   


zSymNode.sym_sumsize_obliviousbool | int | floatc                 C  s    | j d u r	td| j | |S )Nz!shape_env is required to evaluate)r1   r@   evaluate_sym_node)rE   r  r"   r"   r$   evaluate#  s   
zSymNode.evaluatefilelinec                 C  0   |   }zt|W S  ty   td|  w )NzFailed to convert to int: %s)r  r-   	ExceptionlogwarningrE   r  r  rr"   r"   r$   r   )     
zSymNode.guard_intc                 C  r  )NzFailed to convert to float: %s)r  r.   r  r  r  r  r"   r"   r$   guard_float3  r  zSymNode.guard_floatc                 C  r  )NFailed to convert to bool: %sr  r,   r  r  r  r  r"   r"   r$   
guard_bool=  r  zSymNode.guard_boolc                 C  sd   ddl m} | jd u rtd|  r"|| js"| jjs"| ||S | jj| j| d| | j	dS )Nr   )free_unbacked_symbolsz%shape_env is required for expect_true:r   )
r?   r  r1   r@   r^   r0   +prefer_deferred_runtime_asserts_over_guardsr  guard_or_defer_runtime_assertr8   )rE   r  r  r  r"   r"   r$   expect_trueG  s   
zSymNode.expect_truec                 C  (   ddl m} |  std|t| S )Nr   )statically_known_trueExpected bool type)r?   r#  ro   rK   r   )rE   r  r  r#  r"   r"   r$   r#  [     zSymNode.statically_known_truec                 C  s4   | j dd}zt|W S  ty   td|  w )aN  
        Like guard_bool, but if we encounter unbacked symbols, if those symbols
        are size-like, we will treat them as >= 2 for the purposes of the analysis.

        This CHANGES the runtime semantics, but all size-oblivious sites have been
        audited to ensure that the runtime semantics don't change in a material way.
        Acceptable runtime semantic changes are, e.g., squeeze() no longer dropping
        an unbacked one size, or a tensor reporting as non-contiguous even if it's
        contiguous if it would have been reported contiguous due to being empty.
        T)r  r  r  r  r"   r"   r$   guard_size_obliviousb  s   
zSymNode.guard_size_obliviousc                 C  r"  )Nr   )guard_or_falser$  )r?   r'  ro   rK   r   )rE   r  r  r'  r"   r"   r$   r'  v  r%  zSymNode.guard_or_falsec                 C  r"  )Nr   )guard_or_truer$  )r?   r(  ro   rK   r   )rE   r  r  r(  r"   r"   r$   r(  }  r%  zSymNode.guard_or_truec                 C  r   r   )r  rD   r"   r"   r$   bool_  r   zSymNode.bool_c                 C     dS )NTr"   rD   r"   r"   r$   is_symbolic  r&   zSymNode.is_symbolicc                 C  r    r!   r"   rD   r"   r"   r$   
nested_int  r&   zSymNode.nested_intc                 C  r*  )NFr"   rD   r"   r"   r$   is_constant  r&   zSymNode.is_constant)NNF)r0   r   r1   r2   r3   r+   r4   r5   r6   r7   r8   r   r9   r,   r   r:   )r1   r   r   r   )rR   r   r   r,   )r   r-   )r   rW   rG   )r   r,   )r   r`   )r   rb   )r   rh   )rr   r-   r   r   )rr   r.   r   r   )rr   r,   r   r   )r   r   )r   r~   r!   )r   r`   r   r   )rR   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   )F)r  r,   r   r  )r  r~   r  r-   r   r-   )r  r~   r  r-   r   r.   )r  r~   r  r-   r   r,   )r   r:   )\__name__
__module____qualname____doc__r/   __annotations__rP   rQ   rT   rV   propertyr0   r4   r^   ra   rg   rk   rm   rn   ro   rq   rx   rz   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r!  r#  r&  r'  r(  r)  r+  r,  r-  r"   r"   r"   r$   r   Y   s   
 
Y













	
	





















































'













r   c                      s   e Zd Zd fddZ  ZS )_DynamicScalarr   r   r   r   c                   s$   | t u rtdt j| g|R  S )Nz9_DynamicScalar is an abstract base class, use DynamicInt.)r4  	TypeErrorsuper__new__)clsr   	__class__r"   r$   r7    s   z_DynamicScalar.__new__)r   r   r   r   )r.  r/  r0  r7  __classcell__r"   r"   r9  r$   r4    s    r4  c                      sT   e Zd ZdZd fddZdd	d
ZdddZdddZdddZdddZ	  Z
S )r   a  
    User API for marking dynamic integers in `torch.compile`.
    Intended to be compatible with both compile and eager mode.

    Example usage::

        fn = torch.compile(f)
        x = DynamicInt(4)
        fn(x)  # compiles x as a dynamic integer input; returns f(4)
    valr-   r   r   c                   s2   t |tstdt| t | t|}|S )Nrt   )rB   r-   rK   r+   r6  r7  )r8  r<  objr9  r"   r$   r7    s   
zDynamicInt.__new__r   c                 C  s   d| j  dS )NzDynamicInt(rF   )realrD   r"   r"   r$   r        zDynamicInt.__repr__rR   c                 C  s   t | j| S r!   r   r>  rS   r"   r"   r$   __floordiv__  s   zDynamicInt.__floordiv__c                 C  s   t || j S r!   r@  rS   r"   r"   r$   __rfloordiv__  r?  zDynamicInt.__rfloordiv__Nc                 C  s8   |d urt | j||}n| j| }t|trt|S |S r!   r   r>  rB   r-   r   rE   rR   modulor\   r"   r"   r$   __pow__  s   

zDynamicInt.__pow__c                 C  s8   |d urt || j|}n|| j }t|trt|S |S r!   rC  rD  r"   r"   r$   __rpow__  s   

zDynamicInt.__rpow__)r<  r-   r   r   )r   r   )rR   r-   r   r   r!   )r.  r/  r0  r1  r7  r   rA  rB  rF  rG  r;  r"   r"   r9  r$   r     s    



r   r   r   r   andr   r   r   r   r   r   r   r   r   c                 C  r   r!   )r   xr"   r"   r$   <lambda>  s    rK  r   r   r   r   r   r   r   orr   r   r   r   r   r   r   r   r	   r
   r   r   r   r   >	   r   r   r   r   r   r   r   r   r   namer   Callable[[SymNode], SymNode]c                      d fdd}|S )NrE   r   r   c                   s   t | d   S )N_sym_)getattrrD   rM  r"   r$   fn  s   z_get_sym_node_fn.<locals>.fnrE   r   r   r   r"   rM  rS  r"   rR  r$   _get_sym_node_fn   s   rV  )sqrtcoscoshsinsinhtantanhasinacosatanlog2sym_r  >   rL  rH  r	   r   >   r   r   r   >   r   r   sym_log2r   xor)r   r   r   >   r   r   r   r   >   r   r   r   r   >   r   r   r   r   r   r   rL  rH  r   r   r   r   rW   bc                 C     ddl m} || |S )Nr   )FloatTrueDiv)torch.utils._sympy.functionsrg  )r   re  rg  r"   r"   r$   _sympy_float_truedivP     
ri  c                 C  rf  )Nr   )
IntTrueDiv)rh  rk  )r   re  rk  r"   r"   r$   _sympy_int_truedivV  rj  rl  c                 C  rf  )Nr   )FloorDiv)rh  rm  )r   re  rm  r"   r"   r$   _sympy_floordiv\  rj  rn  c                 C  s0   ddl m}m} | jr|jr|| |S || |S )Nr   Mod	PythonMod)rh  rp  rq  is_nonnegative)r   re  rp  rq  r"   r"   r$   
_sympy_modb  s   

rs  c                 C  rf  )Nr   )PowByNatural)rh  rt  )r   re  rt  r"   r"   r$   _sympy_pow_by_naturalk  rj  ru  c                 C  rf  )Nr   )FloatPow)rh  rv  )r   re  rv  r"   r"   r$   _sympy_float_powq  rj  rw  c                 C     dd l }|| |S rc   )rd   Andr   re  rd   r"   r"   r$   
_sympy_andw     r{  c                 C  rx  rc   )rd   Orrz  r"   r"   r$   	_sympy_or}  r|  r~  c                 C  rf  )Nr   )LShift)rh  r  )r   re  r  r"   r"   r$   _sympy_lshift  rj  r  c                 C  rf  )Nr   )RShift)rh  r  )r   re  r  r"   r"   r$   _sympy_rshift  rj  r  ordered_argslist[sympy.Basic]new_arglist[sympy.Basic] | Nonec                 C  s   t | dkr	|gS ddlm}m} || d ||k r | |g S || d ||kr/|g|  S dt | d }}||kra|| d }|| | |}|dkrPdS |dk rY|d }n|d }||ks<| || | S )zs
    If new_arg is found in ordered_args None is returned, else the new
    ordered_args with new_arg inserted
    r   )_args_sortkeyBasicr;   r      N)lensympy.core.basicr  r  compareinsert)r  r  sort_keyr  lowhighmidcompare_resultr"   r"   r$   _binary_search_insert_arg  s&   



r  Flhsrhslhs_is_optimized_summationr,   rhs_is_optimized_summationtuple[bool, sympy.Basic]c           
        sj  ddl  ddlm} d fdd	}dd
lm} ||| O }|||O }|r|r|| jd ||jd k r=|| j|j S || jd ||jd krS||j| j S t| jdkrt|jdkrt| j}|jD ]}t||}|du rv nqi|dur||S |r|j	rtt| j|}|dur||S |r| j	rtt|j| }|dur||S  
| |}	||	|	fS )a  
    Custom optimization for Add used to optimize incremental binary summations of certain properties. The idea
    is when we know the expression is a summation of unique symbols all we need to know is the correct order of symbols,
    and no other optimizations are needed. We pass evaluate=false, with the correct order of args and save the following.
    1. Avoid running other optimizations when the Add is constructed.
    2. Manually figure out the order of the args for the new expression in log(n) comparisons instead of nLog(n)
    (comparing terms is expensive and shows in the profiles).
    The function returns a tuple of (1) a boolean that indicates whether the output is a summation of unique symbols,
    (2) the result sympy expression.
    r   N)r  r  r  r   r  c                   s(   | d u rt d jj| dd}d|fS )Nzordered_args is NoneT)is_commutative)rK   r  
_from_args)r  r\   rd   r"   r$   make_optimized  s   z&_optimized_add.<locals>.make_optimized)_is_symbols_binary_summationr;   r  )r  r  r   r  )rd   r  r  rh  r  _argsr  listr  	is_symbolr  )
r  r  r  r  sortkeyr  r  new_argsr   r\   r"   r  r$   _optimized_add  s<   





r  c                 C  rf  )Nr   )BitwiseFn_bitwise_and)rh  r  )r   re  r  r"   r"   r$   r     rj  r   c                 C  rf  )Nr   )BitwiseFn_bitwise_or)rh  r  )r   re  r  r"   r"   r$   r      rj  r   c                 C  rf  )Nr   )BitwiseFn_bitwise_xor)rh  r  )r   re  r  r"   r"   r$   r     rj  r   rS  Callable[..., sympy.Basic]c                 C  s   dd l }t| |jr3| j}t|dkr3t|d |jr3|d jr3||d }|d |kr3||d  S t| |jr@| || ksFt| |jrK|| S || S )Nr   r  r   )rd   rB   Mulr   r  re   r   rv   )r   rS  rd   aacoefr"   r"   r$   _floor_ceil_helper   s   &


r  c                 C     ddl m} || S )Nr   )
FloorToInt)rh  r  )r   r  r"   r"   r$   _sympy_floor2     r  c                 C  r  )Nr   )
TruncToInt)rh  r  )r   r  r"   r"   r$   _sympy_trunc:  r  r  c                 C  r  )Nr   )	CeilToInt)rh  r  )r   r  r"   r"   r$   _sympy_ceil@  r  r  c                 C  rx  rc   )rd   Eqrz  r"   r"   r$   	_sympy_eqF  r|  r  c                 C  rx  rc   )rd   Nerz  r"   r"   r$   	_sympy_neL  r|  r  c                 C  rx  rc   )rd   Gtrz  r"   r"   r$   	_sympy_gtR  r|  r  c                 C  rx  rc   )rd   Ltrz  r"   r"   r$   	_sympy_ltX  r|  r  c                 C  rx  rc   )rd   Lerz  r"   r"   r$   	_sympy_le^  r|  r  c                 C  rx  rc   )rd   Gerz  r"   r"   r$   	_sympy_ged  r|  r  c                 C  rf  )Nr   )Min)rh  r  )r   re  r  r"   r"   r$   
_sympy_minj  rj  r  c                 C  rf  )Nr   Max)rh  r  )r   re  r  r"   r"   r$   
_sympy_maxp  rj  r  fc                 C  s   dd l }||| f|dfS )Nr   T)rd   	Piecewise)r   r   r  rd   r"   r"   r$   
_sympy_itev  s   r  $Callable[[sympy.Basic], sympy.Basic]c                   rO  )Nr   rW   r   c                   s"   dd l }t|jjjd  | S )Nr   OpaqueUnaryFn_)rh  rQ  utils_sympy	functions)r   r  rR  r"   r$   rS    s   z_get_sym_math_fn.<locals>.fnr   rW   r   rW   r"   rU  r"   rR  r$   _get_sym_math_fn  s   r  _sympy_c                 C  s   dd l }|| S rc   )rd   Absr   rd   r"   r"   r$   
_sympy_abs  s   
r  numberr   sympy.Basic | Nonec                 C  s*   ddl m}m} |d u r|| S || |S )Nr   )RoundDecimal
RoundToInt)rh  r  r  )r  r   r  r  r"   r"   r$   _sympy_round  s   
r  c                 C  r  Nr   )ToFloat)rh  r  )r   r  r"   r"   r$   _sympy_sym_float  s   r  c                 C  s*   dd l }ddlm} |||| | S r  )rd   rh  r  r  r   )r   rd   r  r"   r"   r$   _sympy_is_integer  s   r  )r   r   r   r   c                 C  s$   t | }t| |tt|d ddS )Nr   r;   )r  sympy_is_contiguous_genericr  range)r   r   dimr"   r"   r$   sympy_is_contiguous  s   r  	dim_order	list[int]c                 C  s   dd l }t| }t||kr|jS |j}|jj}|D ]}||| | |jj||| |B M }|| | 9 }qt|D ]}||| | |jjO }q;|S rc   )	rd   r  rj   ri   SOner  r  Zero)r   r   r  rd   r  r   zdr"   r"   r$   r    s   (r  c                 C     t | |g dS N)r      r  r   r  r   r   r"   r"   r$   $sympy_is_channels_last_contiguous_2d     r  c                 C  r  N)r      r  r  r   r  r  r"   r"   r$   $sympy_is_channels_last_contiguous_3d  r  r  c           	      C  s   dd l }ddlm} t| }|t|kr|jS |jj}|j}|||d dM }|D ]+}||| | d|| |k@ M }|dkrJ||||d M }|| || | d }q*|S )Nr   r  r   )	rd   rh  r  r  rj   r  r  ri   r  )	r   r   r  rd   r  r  mr  r  r"   r"   r$   &sympy_is_channels_last_strides_generic  s    	r  c                 C  r  r  r  r  r"   r"   r$   !sympy_is_channels_last_strides_2d(  r  r  c                 C  r  r  r  r  r"   r"   r$   !sympy_is_channels_last_strides_3d.  r  r  c                 C  s   ddl m} |g | |R  S )Nr   )!IsNonOverlappingAndDenseIndicator)rh  r  )r   r   r  r"   r"   r$   -_sympy_is_non_overlapping_and_dense_indicator4  s   r  )r   r   r   r   r   r   rE   rr   c                 C  sV   t |tr|jS t|tu r| |S t|tu r| |S t|tu r)| 	|S t
S r!   )rB   rC   rp   r+   r,   r{   r-   rx   r.   rz   NotImplemented)rE   rr   r"   r"   r$   r   H  s   



r   rJ  0SymInt | SymFloat | SymBool | int | float | boolc                 C  sX   t | tr| jd ur| jS |  rt| S |  rt| S |  r%t| S t	d|  )Nzunrecognized return type )
rB   r   r6   rm   r   rn   r   ro   r   rK   rI  r"   r"   r$   r   W  s   r   methodCallable[..., object]c                 C  s   t |  S r!   )METHOD_TO_OPERATORr  r"   r"   r$   r   e  r   r   funcr:   c           	        s   t d  tv r d}n}ddd}dfd	d
}|d fdd}|d  fdd}tv rAttd| | d S dkrXd! fdd}ttd| | d S dkrpd"d# fdd}ttd| | d S ttd| | d S )$N   r  r   set[str]c                  S  sJ   dd l } | jj| jj| jjj| g}dd l} dd |D | jj	 B dhB S )Nr   c                 S  s   h | ]}t |qS r"   )inspectgetfile)r   r  r"   r"   r$   	<setcomp>}      z@_make_node_magic.<locals>.uninteresting_files.<locals>.<setcomp>z<string>)
r  _dynamo
eval_framer  fxexperimentalr   torch._dynamo.guardsguardsuninteresting_files)r  modsr"   r"   r$   r  q  s   
z-_make_node_magic.<locals>.uninteresting_filesrS  Callable[..., SymNode]c                   s    t  dd	 fdd}|S )
NrE   r   rR   SymNode | Noner   c                   sj   |d u r	| n| |t jjjr3|d ur| |g n| g dfddtd fdd	d
 S )Nr   r   r   r`   c                   s`   dd l }| jd urd S t| t krd S t| j|j|jfr!d S | j|j|jfv r,d S t| S rc   )	rd   r6   idrB   r0   rv   re   ri   rj   )r   rd   )r\   r"   r$   get_id  s   
zM_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.get_idexpression_createdc                	     s@   t tdd  D fdd D tdtddS )Nc                 S     g | ]}t |qS r"   r   r   r"   r"   r$   r         zc_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.<lambda>.<locals>.<listcomp>c                   s    g | ]} |d ur |qS r!   r"   )r   i)r  r"   r$   r     s    r  )r  r\   	result_id	argumentsargument_ids
user_stackstack)r   r  
structuredget_user_stackget_framework_stackr"   )r  r  r  r\   r"   r$   rK    s   
zO_make_node_magic.<locals>.capture_provenance.<locals>.wrapper.<locals>.<lambda>)metadata_fn)r   r   r   r`   )r  _logging	_internalGET_DTRACE_STRUCTUREDr   rS   )rS  r  )r  r  r\   r$   wrapper  s   



z=_make_node_magic.<locals>.capture_provenance.<locals>.wrapperr!   )rE   r   rR   r  r   r   )	functoolswraps)rS  r!  r  )rS  r$   capture_provenance  s   *z,_make_node_magic.<locals>.capture_provenancerE   r   rR   c              	     s  ddl m}m} t}t}| jd ur|jd ur|| j|j}| r1t| ||t| t|fi S t|t	s?t
dt| d}zdkrddlm}m} | j}	|	d u rYt
d| jjsf|	| jjdkr{|jjss|	|jjdkr{|| j|j}
nv|| j|j}
nndkrt| j|j| j|j\}}
n\d	v rdd l}dd
lm}m} | jjo|| j|j}|jjo||j|j}|r|jjs|r| jjr|j|j|j|j |j!|j"d	 }|| j|jdd}
n | j|j}
n | j|j}
W n t#y   t$%d| j|j  w t&'d| j|j|
 t(v rt)}nt*v r!t+}n| j,t)u s-|j,t)u r0t)}n| j,}|d urL|turL|d urLt|t-sL||}| jd u rVt.d| j/|| j0|j0f\}}t	|
| j||||d}|S )Nr   r   zExpected SymNode, got Fr   ro  zshape_env is required for modr   )r   r   r   r   r   r   )symbol_is_typeSymT)r  failed to eval %s(%s, %s)z%s %s %s -> %sz#shape_env is required for binary op)r8   r9   )1r   r   r   r   r   r4   r   r   rB   r   rK   r+   rh  rp  rq  r1   r0   rr  bound_sympylowerr  r/   rd   torch.utils._sympy.symbolr%  r&  r  UNBACKED_INTrX   r  r  r  r  r  r  r  r  r  sym_node_logdebugalways_float_magic_methodsr.   always_bool_magic_methodsr,   r3   rC   r@   r  r8   )rE   rR   r   r   opr
  r9   rp  rq  r1   r  rd   r%  r&  lhs_is_unbackedrhs_is_unbacked	rel_classr3   r8   r  r\   r  r  r"   r$   binary_magic_impl  s   




	



z+_make_node_magic.<locals>.binary_magic_implc           
        s  ddl m}m} t}| rt| ||t| fi S | j}| jd u r'tddks/dkr5| j	|}z |}W n t
yJ   td|  w td || t}| jd ur_|| j}tv rft}ntv rmt}n
tv rtt}n| j}| j|| jf\}}	t|| j|||dS )	Nr   r   z"shape_env is required for unary opr   ceilingzfailed to eval %s(%s)z%s %s -> %sr   )r   r   r   r   r   r   r0   r1   r@   _simplify_floor_divr  r  r  r,  r-  r   r4   always_int_magic_methodsr-   r/  r,   r.  r.   r3   r  r8   r   )
rE   r   r   r0  r0   r  r
  r3   r8   r  r4  r"   r$   unary_magic_impl0  s8   


z*_make_node_magic.<locals>.unary_magic_implr	   	pred_node	then_node	else_nodec           	   
     s   ddl m}m} | jd u rd }n
| jr|j}n|j}| r/t| |tt| t|t|fi S z | j|j|j}W n tyN   t	
d| j|j|j  w | jd u rXtd| jt| j|j|jf\}}t|| j|j||dS )Nr   r   zfailed to eval %s(%s, %s, %s)z!shape_env is required for sym_iter   )r   r   r   r4   r   r	   r   r0   r  r  r  r1   r@   r  r8   r   r3   )	r:  r;  r<  r   r   r
  r  r8   r  r4  r"   r$   sym_ite_impl[  sL   


z&_make_node_magic.<locals>.sym_ite_implr   r   r`   c              	     s   ddl m}m} tj}| rt| ||t| |fi S | j}z ||}W n ty5   t	
d||  w |d u r=t}n| j}d }| jd urM|| j|}| jg}	|d urZ|	| | jd u rctd| j|t|	\}
}t|| j|||
dS )Nr   r   z!failed to eval %s(%s, ndigits=%s)zshape_env is required for roundr   )r   r   r   builtinsr   r   r   r0   r  r  r  r-   r3   r4   r8   r   r1   r@   r  r  r   )rE   r   r   r   r0  r0   r  r3   r
  r   r8   r  r4  r"   r$   
round_impl  s8   


z$_make_node_magic.<locals>.round_impl)r   r   )rS  r  r   r  )rE   r   rR   r   r   r   rT  )r:  r   r;  r   r<  r   r   r   r!   )rE   r   r   r`   r   r   )r   2magic_methods_on_operator_with_trailing_underscoreunary_methodssetattrr   )	r  r  method_attrr  r$  r5  r9  r=  r?  r"   r4  r$   _make_node_magici  s&   
.&1-rD  c                   s\   d fdd}t td	 | d fdd}ttjt s,t tjt | d S d S )NrE   r   r   r   r   r   c              	     s  ddl m}m} ttjt }| r(t| ||dd |D dd |D fi S dd |D }dd |D }z ||}W n tyM   t	
d||  w g }	d }
|D ]}|jd u r] n |	|j qTg }|D ]}|jd u rq n||j qh||	|}
drt}nt}t|| j||
S )	Nr   r   c                 S  r  r"   r   r   sr"   r"   r$   r     r  zH_make_node_sizes_strides.<locals>.sizes_strides_impl.<locals>.<listcomp>c                 S  r   r"   r   rE  r"   r"   r$   r     r   c                 S  r   r"   r   rE  r"   r"   r$   r     r   r'  
_indicator)r   r   r   rQ  sysmodulesr.  r   r  r  r  r4   r   endswithr-   r,   r   r1   )rE   r   r   r   r   r0  
size_exprsstride_exprsr  r	  r
  rF  stride_hintsr3   r4  r"   r$   sizes_strides_impl  sF   



z4_make_node_sizes_strides.<locals>.sizes_strides_implr  list[object]r  c                   s   dd l ddlm} t| |D ]" t tr2tt j	 fdd| D  fdd|D   S qdkr<|| |S t
fdd| D fdd|D S )	Nr   )!eval_is_non_overlapping_and_densec                      g | ]}t  j|qS r"   r   rp   r   re  r   r"   r$   r         zH_make_node_sizes_strides.<locals>.sizes_strides_user.<locals>.<listcomp>c                   rQ  r"   rR  rS  rT  r"   r$   r   	  rU  r   c                      g | ]}  |qS r"   sympifyr   r  r"   r$   r     r  c                   rV  r"   rW  r   r  r"   r$   r     r  )rd   r?   rP  	itertoolschainrB   r   r   rQ  rp   r,   )r   r   rP  r4  r  r$   sizes_strides_user  s,   

z4_make_node_sizes_strides.<locals>.sizes_strides_user)rE   r   r   r   r   r   r   r   )r   rO  r   rO  r   r  )rB  r   hasattrrH  rI  r.  )r  r  rN  r[  r"   r4  r$   _make_node_sizes_strides  s   2 r]  	user_typec           
        s  t v r
d nd2dd d3d	d
tv r d4ddnd4ddd5fddd6 fdd}d7 fdd}d7 fdd}d8d!d"}tv rd||d# d#| d S tv rxt|}||t|| d S d$krd9 fd)d*}||d# d#| d S d+krd:d; fd/d0}||d# d#| d S }	tv rt }	||d#|	 d#| tv r||d1|	 d#| d S d S )<Nrb  rJ  0SymInt | int | SymFloat | float | SymBool | boolr   int | float | boolc                 S  sL   t | tttfr
| S t | tr| jddS t | tr"| jddS t	d)Nr   r   z*expect to be called with constant SymBools)
rB   r-   r.   r,   r   rp   r   r   r  rK   rI  r"   r"   r$   get_constant.  s   

z&_make_user_magic.<locals>.get_constantr,   c                 S  s2   t | tttfr
dS t | tttfr| j S dS )NTF)	rB   r-   r.   r,   r   r   r   rp   r-  rI  r"   r"   r$   r-  9  s
   
z%_make_user_magic.<locals>.is_constantr   r   c                 S  s"   t | trt| jt| S | S )z;Implements True+True=2, which works in python but not sympy)rB   r   r   rp   rx   r-   rI  r"   r"   r$   promote\  s   
z!_make_user_magic.<locals>.promotec                 S  r|   r!   r"   rI  r"   r"   r$   rb  d  r&   rE   rR   tuple[Any, Any]c                   s\    dvr| |fS t | ttjf}t |ttjf}|s|r*|s#t| } |s*t|}| |fS )N)r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   )rB   r.   r  r   r   )rE   rR   f_selff_otherr  r"   r$   promote2g  s   

z"_make_user_magic.<locals>.promote2c                   s2   | } | rt  | S tt| j S r!   )r   r   rQ  rp   rD   )ra  r-  r  rC  rb  r"   r$   r9    s   z*_make_user_magic.<locals>.unary_magic_implc                   s   t |ttttttfstS t	d| | | } |}| |\} }| r1t
 | |S |r9 |}t| j|}|tu rEtS tt| j|}|rW |S |S )NzMAGIC %s %s %s)rB   r-   r.   r,   r   r   r   r  r,  r-  r   r   rp   r   rQ  rE   rR   
other_noderetra  r-  r  rC  rb  rf  r"   r$   r5    s   z+_make_user_magic.<locals>.binary_magic_implc                   s   t |ttttttfstS | } |}| |\} }| r)t| | S |r1 |}t	| j
|}|tu r=tS tt|| j
}|rO |S |S r!   )rB   r-   r.   r,   r   r   r   r  r   r   rp   r   rQ  rg  rj  r"   r$   rbinary_magic_impl  s   z,_make_user_magic.<locals>.rbinary_magic_implr^  r+   attrr   symnode_implr:   c                   s6   t |  | d fdd}| tu rt t | dS dS )	z
        Registers the SymNode magic method on SymInt/Float/Bool,
        and optionally registers a corresponding wrapped method on DynamicInt.
        r   r   r   r   c                    s<   dd | D } t t |  }t|trt|tst|S |S )Nc                 S  s    g | ]}t |tr|jn|qS r"   )rB   r   r>  )r   rJ  r"   r"   r$   r     s    zP_make_user_magic.<locals>.setattrs.<locals>.dynamic_int_impl.<locals>.<listcomp>)rQ  r-   rB   r,   r   )r   r  rl  r"   r$   dynamic_int_impl  s   z<_make_user_magic.<locals>.setattrs.<locals>.dynamic_int_implN)r   r   r   r   )rB  r   r   )r^  rl  rm  ro  r"   rn  r$   setattrs  s
   	z"_make_user_magic.<locals>.setattrs__r	   predr   r   r   c                   s   | j }t||}t||}|tu s|tu rtS t|tr't|tr'|j|jks+tdtt| j ||}|j 	 r? |S |S )Nz9then_node and else_node must be SymNodes with same pytype)
rp   r   r  rB   r   r3   rK   r   rQ  r-  )rr  r   r   r:  r;  r<  ri  )ra  rC  r"   r$   sym_ite_magic_impl  s&   

z,_make_user_magic.<locals>.sym_ite_magic_implr   r   r   r`   c                   s,   | rt  | |S tt| j|S r!   )r>  r   r   rQ  rp   r   )ra  r-  r  r"   r$   round_magic_impl  s   z*_make_user_magic.<locals>.round_magic_impl__r)rJ  r_  r   r`  )rJ  r_  r   r,   )rJ  r   r   r   )rE   r   rR   r   r   rc  )rE   r   r   r   )rE   r   rR   r   r   r   )r^  r+   rl  r   rm  r   r   r:   )rr  r   r   r   r   r   r   r   r!   )rE   r   r   r`   r   r   )r@  bool_becomes_int_magic_methodsunary_magic_methodsunary_nonmagic_methodsrQ  r   bitwise_opsreflectable_magic_methods)
r  r^  r9  r5  rk  rp  origrs  rt  method_namer"   rj  r$   _make_user_magic&  s>   

!
*

r}  )r   r   r   r   )r   r'   r   r(   )r   r)   r   r*   )r   r+   r   r+   )rM  r   r   rN  )r   rW   re  rW   r   rW   )r  r  r  rW   r   r  )FF)
r  rW   r  rW   r  r,   r  r,   r   r  )r   rW   rS  r  r   rW   r  )r   rW   r   rW   r  rW   r   rW   )rM  r   r   r  r!   )r  rW   r   r  r   rW   )r   r  r   r  r   rW   )r   r  r   r  r  r  r   rW   )rE   r   rr   r   r   r   )rJ  r   r   r  )r  r   r   r  )r  r   r  r  r   r:   )r  r   r^  r+   r   r:   )
__future__r   r>  r"  r  rY  loggingmathoperatorrH  r   r   typingr   r   r   r  torch._logging.structuredr  r  r   r	   r
   r   r   r   r   r   torch._loggingr   collections.abcr   r   rd   r?   r   	getLoggerr.  r  getArtifactLoggerr,  r   r   r2  r,   r.   r-   HintType__all__torch.typesr   rC   r%   r   r4  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rd  r   r   r   r   r   r  rw  rV  math_op_namesrM  sym_namepriv_sym_namerB  rQ  r   rx  rA  only_bool_magic_methodsrv  also_bool_magic_methodsbool_magic_methodsonly_float_magic_methodsr@  ry  r.  r8  r/  ri  rl  rn  rs  ru  rw  r{  r~  r  r  r  r  r   r   r   rz  r  r  r  r  r  r  r  r  r  r  r  r  r  rI  current_moduler  priv_sympy_namerS  r0  r  r  r  r  invertr   r  r  r  r  r  r  r  r  sizes_strides_methodsr   r   r   rD  r]  itemsr  r  r}  r"   r"   r"   r$   <module>   s^   (


    <4	
 !"#&









	





'
G

	















	



	







*





  
Z^
 [







