
    iT                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZmZ d dlZd dlmc mZ d dlmZ d dlmZmZmZ d dlmZmZmZ d dlm Z  d d	l!m"Z" d d
l#m$Z$  edejJ                  ejL                        Z'de(de)fdZ*e jV                   G d d             Z, G d dejZ                        Z. G d d      Z/ e	de0      Z1 G d dejd                        Z3 G d d      Z4 G d d      Z5 G d d      Z6 G d d      Z7 G d  d!      Z8 G d" d#      Z9 G d$ d%      Z: G d& d'e:      Z; G d( d)e:      Z< G d* d+e:      Z= G d, d-e:      Z> G d. d/e:      Z? G d0 d1      Z@ G d2 d3      ZAy)4    N)abstractmethod)AnyCallableNewTypeOptionalTypeVarUnion)overrideSelf)TracingContext)
FakeTensorFakeTensorModeTensor)MetaConverterMetaTensorDescMetaTensorDescriber)SymNode)ShapeEnv)no_dispatch	_SymNodeTnamereturnc                 $    | j                  d      S )z
    An ops filter which allows pickle-safe ops. Pickle-safe ops are built-in
    ones where it will be possible to unpickle on any machine which has PyTorch.
    )ztorch.ops.atenztorch.ops.fbgemm)
startswithr   s    Q/var/www/html/engine/venv/lib/python3.12/site-packages/torch/fx/_graph_pickler.py_ops_filter_safer      s     ??	
     c                   .    e Zd ZU eZeeegef      e	d<   y)Options
ops_filterN)
__name__
__module____qualname__r   r!   r   r   strbool__annotations__ r   r   r    r    (   s     3CJ3%+./Br   r    c            	            e Zd ZdZddej
                  dee   ddf fdZe	de
deedef   eedf   f   fd	       Ze	de
dee   fd
       Zedde
dee   defd       Zededede
fd       Z xZS )GraphPicklerzb
    GraphPickler is a Pickler which helps pickling fx graph - in particular
    GraphModule.
    Nfileoptionsr   c                     t         |   |       |xs
 t               | _        t	        t                     | _        t        d      | _        y )NF)	copy_data)	super__init__r    r,   _UnpickleStateTokenobject_unpickle_stater   _meta_tensor_describer)selfr+   r,   	__class__s      r   r0   zGraphPickler.__init__5   s>    +')  368< ':E&J#r   obj.c                    t        |t              rt        j                  | |      S t        |t        j
                  j                        rt        j                  | |      S t        |t        j                  j                  t        j                  j                  f      rt        j                  | |      S t        |t              rt        j                  | |      S t        |t        j                        rt        j                  | |      S t        |t        j                   j"                        rt$        j                  | |      S t        |t        j
                  j&                        rJ t(        j                  | |      x}r|S t*        S N)
isinstancer   _TensorPickleDatareduce_helpertorchfxGraphModule_GraphModulePickleData_opsOperatorBaseOpOverloadPacket_OpPickleDatar   _ShapeEnvPickleDataSymInt_SymNodePickleData_guardsr   _TracingContextPickleDataNode_TorchNumpyPickleDataNotImplemented)r5   r7   reduces      r   reducer_overridezGraphPickler.reducer_overrideC   s"   * c:&$224==UXX112)77cBBejj55uzz7R7RST ..tS99X&&44T3??U\\*%33D#>>U]]99:,::4EE "#uxx}}555.<<T3GGvG "!r   c                 "    || j                   u ryy )Nunpickle_state)r3   )r5   r7   s     r   persistent_idzGraphPickler.persistent_idn   s    $&&&#r   c                     t        j                         5 } | ||      }|j                  |       |j                         cddd       S # 1 sw Y   yxY w)z#
        Pickle an object.
        N)ioBytesIOdumpgetvalue)clsr7   r,   streampicklers        r   dumpszGraphPickler.dumpsu   sF    
 ZZ\ 	%V&'*GLL??$	% 	% 	%s   *A		Adata	fake_modec                     t        |      }t        j                  |       5 }t        ||      }|j	                         cddd       S # 1 sw Y   yxY w)z%
        Unpickle an object.
        N)_UnpickleStaterS   rT   _GraphUnpicklerload)r[   r\   staterX   	unpicklers        r   loadszGraphPickler.loads   sG    
 y)ZZ 	$'6I>>#	$ 	$ 	$s   AAr9   )r"   r#   r$   __doc__rS   rT   r   r    r0   r
   r2   tupler   r   rN   r%   rQ   classmethodbytesrZ   staticmethodr   rc   __classcell__r6   s   @r   r*   r*   /   s    
KRZZ K(72C Kt K ("("	xS!5c?2	3(" ("T  HSM   % %'): %e % % $E $n $ $ $r   r*   c                       e Zd ZdeddfdZy)r^   r\   r   Nc                 0    || _         t               | _        y r9   )r\   r   meta_converter)r5   r\   s     r   r0   z_UnpickleState.__init__   s    "9Fr   )r"   r#   r$   r   r0   r(   r   r   r^   r^      s    I. IT Ir   r^   r1   c                   Z     e Zd Zdej                  deddf fdZededefd       Z	 xZ
S )r_   rX   rP   r   Nc                 2    t         |   |       || _        y r9   )r/   r0   r3   )r5   rX   rP   r6   s      r   r0   z_GraphUnpickler.__init__   s     -r   pidc                 N    |dk(  r| j                   S t        j                  d      )NrP   zInvalid persistent ID)r3   pickleUnpicklingError)r5   rp   s     r   persistent_loadz_GraphUnpickler.persistent_load   s)    ""'''(()@AAr   )r"   r#   r$   rS   rT   r^   r0   r
   r2   rt   ri   rj   s   @r   r_   r_      sG    .rzz .> .d . B6 Bf B Br   r_   c                       e Zd ZU eeef   ed<   edede	de
eeege	f   e
eef   f   fd       Zde	ddfdZd	ede	fd
Zy)rE   r[   rY   r7   r   c                 B    | j                    | |      |j                  ffS r9   unpickler3   rW   rY   r7   s      r   r<   z!_ShapeEnvPickleData.reduce_helper   s"     ||c#h(?(?@@@r   envNc                     |j                   rJ |j                  j                         | _        | j                  d= | j                  d= y )Ntracked_fakesfake_tensor_cache)_translation_validation_enabled__dict__copyr[   )r5   rz   s     r   r0   z_ShapeEnvPickleData.__init__   s@     6666LL%%'	IIo&II)*r   rP   c                     |j                   sJ |j                   j                  sJ | j                  j                         D ]&  \  }}t	        |j                   j                  ||       ( |j                   j                  S r9   )r\   	shape_envr[   itemssetattr)r5   rP   kvs       r   rx   z_ShapeEnvPickleData.unpickle   sp    ''''''1111IIOO% 	>DAqN,,661=	> ''111r   )r"   r#   r$   dictr%   r2   r'   rf   r*   r   re   r   r   r^   r1   r<   r0   rx   r(   r   r   rE   rE      s    
sF{
A"A)1A	$'12E$@S:S4TT
A A+H + +2~ 2( 2r   rE   c                       e Zd Zedededeeee	gef   eee
f   f   fd       ZdeddfdZdefdZd	e	dej                   fd
Zy)rG   rY   r7   r   c                      | |j                         |j                  f}t        |t        j                        rt
        j                  |fS t        dt        |             )NzUnhandled SymNode type )	noder3   r:   r=   rF   rG   unpickle_sym_intNotImplementedErrortype)rW   rY   r7   argss       r   r<   z _SymNodePickleData.reduce_helper   sR     CHHw667c5<<(%66<<%(?S	{&KLLr   r   Nc                     |j                   | _        |j                  | _        |j                  | _        |j                  | _        y r9   )_exprexprr   pytype_hinthint)r5   r   s     r   r0   z_SymNodePickleData.__init__   s.    JJ	kkJJ	r   c                     | j                   J t        | j                  | j                   | j                  | j                        S r9   )r   r   r   r   r   )r5   s    r   _to_sym_nodez_SymNodePickleData._to_sym_node   s3    ~~)))tyy$..$++tyyIIr   rP   c                 H    t        j                  | j                               S r9   )r=   rF   r   r5   rP   s     r   r   z#_SymNodePickleData.unpickle_sym_int   s    ||D--/00r   )r"   r#   r$   rf   r*   r   re   r   r   r^   r1   r<   r   r0   r   r=   rF   r   r(   r   r   rG   rG      s    MM M 
$'23U4AT;T5UU
	M MW  Jg J1~ 1%,, 1r   rG   c                       e Zd ZU ee   ed<   edededee	e
egef   ee
ef   f   fd       Zdededdfd	Zd
edefdZy)r;   metadatarY   r7   r   c                 X    | j                    | |j                  |      |j                  ffS r9   )rx   r4   r3   ry   s      r   r<   z_TensorPickleData.reduce_helper   s3     ||..4##
 
 	
r   	describertNc           	         |j                  |      }|j                  r:t        |j                  t        j                  j
                  j                        sJ t        j                  |d       | _	        t        j                  D ]>  }|dv rt        | j                  |      J d| dt        | j                  |               y )Nr\   )r\   	view_funcz
not None: z: )describe_tensorr   r:   r=   _subclasses
meta_utils_FakeTensorViewFuncdataclassesreplacer   r   _UNSERIALIZABLEgetattr)r5   r   r   r   r   s        r   r0   z_TensorPickleData.__init__   s    
 ,,Q/ %% 1 1 < < P P*
 	
 
 $++HE  // 	A..4==!,4 QCr'$--";!<=4	r   rP   c                 D   t        j                  | j                  j                        }dt        g t
        j                  f   dt        t
        j                  t        f   dt        ffd}j                  j                  |j                  j                  |d d       S )Nr   make_meta_tdevicer   c                 |    t               5  t        j                   |        |      cd d d        S # 1 sw Y   y xY wr9   )r   r   r\   )r   r   rP   s     r   	with_fakez-_TensorPickleData.unpickle.<locals>.with_fake	  s8      !",,M  s   2;)r   r   r   r\   r   r=   r   r	   r   r%   r   rm   meta_tensorr   )r5   rP   r   r   s    `  r   rx   z_TensorPickleData.unpickle  s    &&MM$..

	!"ell"23	=B5<<QTCT=U		 ,,88$$..
 	
r   )r"   r#   r$   r   r   r'   rf   r*   re   r   r   r^   r1   r<   r   r   r0   rx   r(   r   r   r;   r;      s    Z((
"
)3
	$'34eDBU<U6VV

 
"5 & T ,
~ 
* 
r   r;   c                       e Zd Zedededeeee	e
gef   ee	ef   f      fd       ZdededdfdZd	e
ded
ef   fdZededee	   fd       Zy)rK   rY   r7   r   c                 ^    | j                  |      x}r| j                  ||j                  ffS y r9   )from_objectrx   r3   )rW   rY   r7   r[   s       r   r<   z#_TorchNumpyPickleData.reduce_helper  s5     ??3''4'LL4)@)@"ABBr   modr   Nc                      || _         || _        y r9   )r   r   )r5   r   r   s      r   r0   z_TorchNumpyPickleData.__init__*  s    	r   rP   .c                     t        t        j                  | j                        | j                        }t
        j                  j                  j                  j                         |   S r9   )
r   	importlibimport_moduler   r   r=   _dynamo	variablesmiscget_np_to_tnp_map)r5   rP   nps      r   rx   z_TorchNumpyPickleData.unpickle.  sE    Y,,TXX6		B}}&&++==?CCr   tnpc                 d   t        |      sy t        j                  j                  j                  j                         }	 |j                  |      x}sy 	 t        |dd       x}sd}t        |dd       x}sy |t        t        j                  |      |      k(  sJ  | ||      S # t        $ r Y y w xY w)Nr#   numpyr"   )callabler=   r   r   r   get_tnp_to_np_mapget	TypeErrorr   r   r   )rW   r   	tnp_to_npr   r   r   s         r   r   z!_TorchNumpyPickleData.from_object2  s    }MM++00BBD		#--,,B, -
 r<666CJ555WY44S94@@@@3~  		s    B# #	B/.B/)r"   r#   r$   rf   r*   r2   r   re   r   r   r^   r1   r<   r%   r0   rx   r   r(   r   r   rK   rK     s    
"
)/
	dN+V34eDBU<U6VV	


 
C s t D~ D(3;:O D f $  r   rK   c                      e Zd Zededej                  j                  dee	e
egej                  j                  f   ee
ef   f   fd       Zdej                  j                  deddfdZd	edej                  j                  fd
Zy)r@   rY   r7   r   c                 X    | j                    | ||j                        |j                  ffS r9   )rx   r,   r3   ry   s      r   r<   z$_GraphModulePickleData.reduce_helperI  s1     ||W__%##
 
 	
r   gmr,   Nc                 0   t        |t        j                  j                  j                        r|j                         }n|j                         }|j                  j                         | _	        | j                  d= t        |j                  |      | _        y )N_graph)r:   r=   r>   _lazy_graph_module_LazyGraphModule_real_recompile	recompiler   r   gm_dict_GraphPickleDatar   graph)r5   r   r,   _python_codes       r   r0   z_GraphModulePickleData.__init__U  sg    b%((55FFG--/L<<>L{{'')LL"%bii9
r   rP   c                     t         j                  j                  j                  t         j                  j                        }| j                  |_        | j                  j                  ||      |_        |S r9   )	r=   r>   r?   __new__r   r   r   rx   r   )r5   rP   r   s      r   rx   z_GraphModulePickleData.unpickle_  sN    XX!!))%((*>*>?llJJ''N;		r   )r"   r#   r$   rf   r*   r=   r>   r?   re   r   r   r^   r1   r<   r    r0   rx   r(   r   r   r@   r@   H  s    	
"	
).)=)=	
	$')=)==>d''(	*
	
 	
:588// :' :d :~ %((:N:N r   r@   c                      e Zd Zdej                  j
                  deej                  j
                  d f   deddfdZdej                  j                  ded ej                  j
                  f   de
dej                  j
                  fd	Zy)
_NodePickleDatar   mappingr,   r   Nc                    t        j                  t        j                  j                  fd|j
                        | _        t        j                  t        j                  j                  fd|j                        | _        |j                  | _        |j                  | _        t        j                  |j                  |      | _        |j                  | _        |j                  | _        y )Nc                     |    S r9   r(   nr   s    r   <lambda>z*_NodePickleData.__init__.<locals>.<lambda>m  s    '!* r   c                     |    S r9   r(   r   s    r   r   z*_NodePickleData.__init__.<locals>.<lambda>o  s    WQZ r   )pytreetree_map_onlyr=   r>   rJ   r   kwargsr   oprD   rr   targetr   meta)r5   r   r   r,   s     ` r   r0   z_NodePickleData.__init__g  s     ((8LdiiX	**HHMM/
 II	''#**4;;@ II	 II	r   r   rP   c                    t        j                  t        fd| j                        }t        j                  t        fd| j                        }| j
                  j                  |      }t        |      st        |t              sJ |j                  | j                  |||| j                  | j                        }| j                  |_        |S )Nc                     |    S r9   r(   r   s    r   r   z*_NodePickleData.unpickle.<locals>.<lambda>  s    wqz r   c                     |    S r9   r(   r   s    r   r   z*_NodePickleData.unpickle.<locals>.<lambda>  s    wqz r   )r   r   r   r   r   r   rx   r   r:   r%   create_noder   r   r   r   )r5   r   r   rP   r   r   r   r   s     `     r   rx   z_NodePickleData.unpickle}  s     ##O5I499U%%14;;
 %%n5:fc#:::  &$		499UII	r   )r"   r#   r$   r=   r>   rJ   r   r    r0   Graphr^   rx   r(   r   r   r   r   f  s    hhmm ehhmm%667 	
 
,xx~~ '67 '	
 
r   r   c            
           e Zd Zedededeeegef   ee	   f   fd       Z
edededd fd       Zededeed	   ed
   f   dedd fd       Zededefd       Zededefd       Zedededefd       Zy)rD   rY   r   r   c                 l    | j                  ||j                        }|j                  |j                  ffS r9   )rr   r,   rx   r3   )rW   rY   r   results       r   r<   z_OpPickleData.reduce_helper  s0     B0'"9"9!;<<r   r,   c                 v   t        |t              rt        |      S t        j                  j
                  j                  |      }t        |t        j                  j                        r| j                  |t        |      S t        |t        j                  j                        r| j                  |t        |      S |j                  d      r!|j                  dd      \  }}t        ||      S |j                  d      r |j                  dd      \  }}t!        |      S t#        dt%        |       d| d|       )N)z	builtins.zmath.ztorch..   z	operator.zTARGET:  )r:   r%   _OpStrPickleDatar=   r>   rJ   _pretty_print_targetrA   
OpOverload
_pickle_op_OpOverloadPickleDatarC   _OpOverloadPacketPickleDatar   split_OpBuiltinPickleData_OpOperatorPickleDatar   r   )rW   r   r,   r   rootdetail_s          r   rr   z_OpPickleData.pickle  s    b##B''xx}}11"5b%**//0>>$(=wGGEJJ778>>$(CWMM__=>::c1-LD&'f55__[)

3*IAv(00 &b
!B4q&GHHr   r   dataclsr   r   c                 `    |j                   x}r ||       sddlm}  |d|         ||       S )Nr   )BypassFxGraphCachez"Unable to pickle non-standard op: )r!   torch._inductor.codecacher   )r   r   r,   r!   r   s        r   r   z_OpPickleData._pickle_op  s<     ",,,J,j6FD$'I$%PQQt}r   rP   c                      y r9   r(   r   s     r   rx   z_OpPickleData.unpickle  s    r   c                     d|v r4|j                  dd      \  }}t               |   }| j                  ||      S t               |   S )zC
        Like `globals()[name]` but supports dotted names.
        r   r   )r   globals_getattr_by_name)rW   r   r   restr   s        r   _lookup_global_by_namez$_OpPickleData._lookup_global_by_name  sI    
 $;

3*IC9S>D''d339T?"r   r   c                 n    d|v r&|j                  dd      \  }}t        | |      } d|v r&t        | |      S )zG
        Like `getattr(root, name)` but supports dotted names.
        r   r   )r   r   )r   r   r   s      r   r  z_OpPickleData._getattr_by_name  sC    
 Tk

3*IC4%D Tk tT""r   N)r"   r#   r$   rf   r*   r2   re   r   r^   r1   r<   r    rr   rh   r%   r	   r   r   r   rx   r  r  r(   r   r   rD   rD     s5   ="=(.=	x(&0159L3MM	N= = I I I_ I I& ()40M+NN

  
  ~ &   	## 	#& 	# 	# #v #S #V # #r   rD   c                   ,    e Zd ZdeddfdZdedefdZy)r   r   r   Nc                     || _         y r9   r   r5   r   s     r   r0   z_OpStrPickleData.__init__  	    	r   rP   c                     | j                   S r9   r   r   s     r   rx   z_OpStrPickleData.unpickle  s    yyr   )r"   r#   r$   r%   r0   r^   rx   r(   r   r   r   r     s(    S T ~ # r   r   c                   T    e Zd ZdeddfdZdedej                  j                  fdZ	y)r   r   r   Nc                     || _         y r9   r   r  s     r   r0   z_OpOverloadPickleData.__init__  r  r   rP   c                     | j                  | j                        }t        |t        j                  j
                        sJ |S r9   )r  r   r:   r=   rA   r   r5   rP   r7   s      r   rx   z_OpOverloadPickleData.unpickle  s5    ))$))4#uzz44555
r   )
r"   r#   r$   r%   r0   r^   r=   rA   r   rx   r(   r   r   r   r     s2    S T ~ %**:O:O r   r   c                   T    e Zd ZdeddfdZdedej                  j                  fdZ	y)r   r   r   Nc                     || _         y r9   r   r  s     r   r0   z$_OpOverloadPacketPickleData.__init__  r  r   rP   c                     | j                  | j                        }t        |t        j                  j
                        sJ |S r9   )r  r   r:   r=   rA   rC   r  s      r   rx   z$_OpOverloadPacketPickleData.unpickle  s5    ))$))4#uzz::;;;
r   )
r"   r#   r$   r%   r0   r^   r=   rA   rC   rx   r(   r   r   r   r     s2    S T ~ %**:U:U r   r   c                   0    e Zd ZdededdfdZdedefdZy)r   r   r   r   Nc                      || _         || _        y r9   )r   r   )r5   r   r   s      r   r0   z_OpBuiltinPickleData.__init__  s    		r   rP   c                 &   | j                   dk(  rt        j                  | j                        S | j                   dk(  r dd l}| j                  || j                        S | j                   dk(  r | j                  t        | j                        S t        )Nbuiltinsmathr   r=   )r   __builtins__r   r   r  r  r=   r   )r5   rP   r  s      r   rx   z_OpBuiltinPickleData.unpickle  sr    99
"##DII..YY& ((tyy99YY'!((		::%%r   r"   r#   r$   r%   r0   r^   r2   rx   r(   r   r   r   r     s/    S   
&~ 
&& 
&r   r   c                   ,    e Zd ZdeddfdZdedefdZy)r   r   r   Nc                     || _         y r9   r   r  s     r   r0   z_OpOperatorPickleData.__init__  r  r   rP   c                 B    dd l }| j                  || j                        S )Nr   )operatorr  r   )r5   rP   r  s      r   rx   z_OpOperatorPickleData.unpickle  s    $$Xtyy99r   r  r(   r   r   r   r     s(    S T :~ :& :r   r   c                       e Zd Zdej                  j
                  deddfdZdej                  j                  de	dej                  j
                  fdZ
y)	r   r   r,   r   Nc                     |j                   | _        |j                  | _        i }|j                  D ]  }t        |||      ||<    t        |j                               | _        y r9   )_tracer_cls
tracer_cls_tracer_extrastracer_extrasnodesr   re   values)r5   r   r,   r"  r   s        r   r0   z_GraphPickleData.__init__  s[    ++"1168KK 	@D)$w?E$K	@5<<>*
r   r   rP   c                     t         j                  j                  || j                  | j                        }i }| j
                  D ]  }|j                  |||      ||<    |S r9   )r=   r>   r   r  r!  r"  rx   )r5   r   rP   r   r"  nds         r   rx   z_GraphPickleData.unpickle  s[     r4??D4F4FG68** 	BBE5.AE"I	B r   )r"   r#   r$   r=   r>   r   r    r0   r?   r^   rx   r(   r   r   r   r     sS    +ehhnn +w +4 +&	((&&	8F			r   r   c                       e Zd Zededej                  j                  dee	e
egej                  j                  f   ee
ef   f   fd       ZdeddfdZdedefd	Zy)
rI   rY   r7   r   c                 B    | j                    | |      |j                  ffS r9   rw   ry   s      r   r<   z'_TracingContextPickleData.reduce_helper,  s*     LLC''
 	
r   contextNc                 6   |j                   | _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _        y r9   )	module_contextframe_summary_stackloc_in_frameaot_graph_nameparams_flatparams_flat_unwrap_subclassesparams_unwrapped_to_flat_indexoutput_strides#force_unspec_int_unbacked_size_like)r5   r(  s     r   r0   z"_TracingContextPickleData.__init__;  s    %44#*#>#> #00%44"..-4-R-R*.5.T.T+%4477 	0r   rP   c                 b   t        |j                        }| j                  |_        | j                  |_        | j                  |_        | j
                  |_        | j                  |_        | j                  |_        | j                  |_        | j                  |_	        | j                  |_
        |S r9   )r   r\   r*  r+  r,  r-  r.  r/  r0  r1  r2  )r5   rP   r(  s      r   rx   z"_TracingContextPickleData.unpickleQ  s     !9!9:!%!4!4&*&>&>##00!%!4!4"..040R0R-151T1T.!%!4!444 	3 r   )r"   r#   r$   rf   r*   r=   rH   r   re   r   r   r^   r1   r<   r0   rx   r(   r   r   rI   rI   +  s    
"
).)E)E
	$')E)EEFd''(	*

 

 
4 
,~ . r   rI   )Br   r   rS   rr   abcr   typingr   r   r   r   r   r	   typing_extensionsr
   r   r=   torch.utils._pytreeutils_pytreer   torch._guardsr   torch._subclasses.fake_tensorr   r   r   torch._subclasses.meta_utilsr   r   r   torch.fx.experimental.sym_noder   %torch.fx.experimental.symbolic_shapesr   torch.utils._mode_utilsr   rF   SymFloatr   r%   r&   r   	dataclassr    Picklerr*   r^   r2   r1   	Unpicklerr_   rE   rG   r;   rK   r@   r   rD   r   r   r   r   r   r   rI   r(   r   r   <module>rD     sq     	   C C ,  $ $ ( L L 
 3 : / Ku~~>	3 4  C C CX$6>> X$vI I 3V< 
Bf&& 
B2 2>1 1:;
 ;
|) )X <% %PB# B#J} M - &= &$:M : @3 3r   