
    `i1                     2   U 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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mZmZ d dlmZ d dl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# d d	l$m%Z% d d
l&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 ddl9m:Z:m;Z; ddl;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZD  ejE        eF          ZGdaHeeIeJeKeLf                           eMd<   daNeOeMd<   daPeeJeQeeK         f                  eMd<    e'eFd          ZR e'eFd          ZSeIe         ZT e jU        ddd g          ZVg d!ZWejX        d"eOfd#            ZY	 	 d`d$eIe>         d%eOd&eeK         d"dfd'ZZd(eIe>         d"ej[        fd)Z\	 	 dad$eeT         d*eJeKeKf         d+eeK         d,eQd"df
d-Z]d*eJeKeKf         d"eJeKeVf         fd.Z^d/ej        j-        d(eTd"dfd0Z_ej`        d"ed         fd1            Zai abeJeKeJeKeIeK         f         f         eMd2<   i aceJeKeIeK         f         eMd3<   dadeeQ         eMd4<   i aeeJeKeKf         eMd5<   i afeJeKeIeK         f         eMd6<   d ageQeMd7<   dbd8Zhej`        d"ed         fd9            Zi G d: d;          Zj G d< d=          Zkd$eTd"dfd>Zld$eTd"dfd?Zmd@eIeeKdf                  d"dfdAZnd$ee>         d"dfdBZodCeepeeqf                  d"dfdDZrdbdEZsej`        d"ed         fdF            Zteju         G dG dH                      Zv ejw                    ZxdIeeQ         dJeJeKef         d"eJeKeJeKeIeK         f         f         fdKZydLeJeKef         d"eJeKeJeKef         f         fdMZzd"eJeKef         fdNZ{d"eJeKeJeKeIeK         f         f         fdOZ|	 dcdPeee>         e<f         dQeKdReOd"eeQ         fdSZ}dTedUed"dfdVZ~dWeKd"efdXZddYdZed[eKf         d\ej        j        d]eJeKef         d^ee4         d"eKf
d_ZdS )d    N)IteratorSequence)AnyCallableIOOptionalUnion)patch)
draw_graphget_aot_graph_nameget_graph_being_compiled)fx)save_graph_repro)get_debug_dir)utils)getArtifactLogger)trace_structured)signpost_event)GraphModule)_extract_tensor_metadataTensorMetadata)legalize_graph)FileLike)
OrderedSet)tree_map   )configir)ExternKernel)BaseSchedulerNodeFusedSchedulerNodeNopKernelSchedulerNode
OutputNodeSchedulerNode)VGRAPH_EXECUTION_ORDERFRECORD_GRAPH_EXECUTIONGRAPH_COMPILE_IDSir_pre_fusionir_post_fusionBufMetanamen_origin)dotz-Gnslimit=2z-Gnslimit1=2z-Gmaxiter=5000returnc                  .    t          j        d          d uS )Nr.   )shutilwhich     i/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/_inductor/debug.pyhas_dotr6   >   s    <d**r4   nodesprint_graphfnamec           
         t                      st                              d           dS |t                      }t	          |           }|j        D ]}d|j        vr|j        d         j        }t          |t                    r-t          |d         t                    r
|d         f}n|d         }d}t          |t          j                  r|j        j        }t          ||ddddd          }||j        d<   |rt!          |           t#          i |          }t%          |           |j                                         t+          ||dt,          j        j                   dS )z$
    Draw a graph in fname.svg.
    z*draw_buffers() requires `graphviz` packageNfusion_metar   tensor_metaF)
clear_metadot_graph_shape)r6   logwarningr   create_fx_from_snodesr7   metagroup
isinstancetupleintr   ComputedBufferdatadtyper   printr   r   graphlintr   r   tracer>   )	r7   r8   r9   rK   noderC   rI   metadatagms	            r5   draw_buffersrQ   C   sn    99 @AAA}(**!%((E , ,	))	-(.eU## 	!%(C(( !qa dB-.. 	$IOE!%dD$MM#+	-   e	R		B2HMMOOO
EeV\5Q     r4   snodesc                    dt           dt          dt          f         fd}t          j        dg d          }i }i }t
          j                                        }d}g }d}| D ]}	|	                                rd}
|
}n|		                                rd	}
|
}ngt          |	t                    rd
}
|
}nMt          |	t                    r
d}
|	j        }n.t          |	t                    r
d}
|	j        }nt          d          t
          j        j                            |	                                d          }|
 d| } ||          }i }t)          |	d          rd|	                                i}|                    |d|          }dt.          t0          t          f         dt2          ffd |	          r|                    |           |	                                }||_         |||	|
          |j        d<   |||<   |	                                D ]}|||                                <   ||}| D ]}	|	                                }|	j        j         }||         }g }|D ]}|j        |v r||j                 }nQ|!                    |          5  |"                    |j                  }|||j        <   ddd           n# 1 swxY w Y   ||k    rq|                    |           tG          |          |_$        |%                    tM          |          dk    r|d         ntG          |                     |S )B
    Creates a FX Graph from a list of SchedulerNode objects.
    r,   r/   .c                 8    dt           dt          fd}| |_        |S )Nargsr/   c                      dS Nr   r3   )rV   s    r5   func1z;create_fx_from_snodes.<locals>.get_fake_func.<locals>.func1w   s    1r4   )r   rF   __name__)r,   rY   s     r5   get_fake_funcz,create_fx_from_snodes.<locals>.get_fake_funcv   s2    	 	 	 	 	 	 r4   
FusionMeta)rC   snodetypeNexterntemplatenopcomputefusedzUnknown node typeoriginal_atenz: 
get_devicedevicer3   rV   kwargsr]   c                     t          | t                    r t          fd| j        D                       S t          d |                                 D                       S )Nc              3   .   K   | ]} |          V  d S Nr3   ).0x	in_outputs     r5   	<genexpr>z;create_fx_from_snodes.<locals>.in_output.<locals>.<genexpr>   s+      >>A99Q<<>>>>>>r4   c              3   ^   K   | ](}|j         D ]}t          |j        t                    V  )d S rk   )usersrD   rN   r#   )rl   bufusers      r5   ro   z;create_fx_from_snodes.<locals>.in_output.<locals>.<genexpr>   s[        I   49j11      r4   )rD   r!   anyrR   get_outputs)r]   rn   s    r5   rn   z(create_fx_from_snodes.<locals>.in_output   su    %!344 ?>>>>>>>>>>   ,,..     r4   r;   r   r   )'strr   rF   collections
namedtupletorchr   Graph	is_externis_templaterD   r"   r$   rC   r!   RuntimeError	_inductorr   get_fused_kernel_name	get_nodeshasattrre   call_functionr	   r    boolappendget_namer,   rB   ru   read_writesreadsinserting_beforeplaceholderrE   rV   outputlen)rR   r[   r\   buf_to_fx_nodenode_to_fx_noderK   
first_nodeoutputsrC   r]   	node_type
fused_name	func_name	node_funcrh   fx_noder,   rr   depsnew_argsdepdep_nodern   s                         @r5   rA   rA   q   s   
C HS#X$6     '6P6P6PQQJNOHNNEJGE 2! 2!?? 	4 IEE   	4"IEE566 
	4IEE}-- 	4!IKEE122 	4IKEE2333_*@@OO
 

 !00J00	!M),,	5,'' 	4 0 0 2 23F%%ib%HH	U#46H#HI 	d 	 	 	 	 	 	 9U 	$NN7###~~&0jy&I&I]# '$$&& 	5 	5C-4N3<<>>** J  ' '~~ &!$' 		& 		&Cx>)))#(3++J77 8 8$00::H/7N38,8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7""OOH%%%%X	LLs7||q00eGnnEEELs   %KK	K	node_name_to_buf_nameparent_buf_name	n_originsc                 ^   | d S | D ]}|                                 }|                                }|)t          |          dk    rt          ||||n|           Ut          |          dk    r|d         |k    sJ |j        }||j        |j        D ]}|j        }	|	|vr	||n|||	<   d S )Nr   r   )r   r   r   $update_orig_fx_node_name_to_buf_namerN   originsr,   )
r7   r   r   r   rN   buf_namechildren_nodesir_nodeorigin	node_names
             r5   r   r      s    }  ==??))%#n*=*=*A*A0%+3  
 ~&&!++q0AT0I0I0II)?go5o 	 	FI  555 / 7HH_ &i0	# r4   c                 ,   i }|                                  D ]8\  }}||vrt          |g          ||<   ||                             |           9i }|                                  D ]-\  }}t          ||                   }t	          ||          ||<   .|S rk   )itemsr   addr   r+   )r   buf_name_to_n_noder   r   node_name_to_buf_metan_nodes         r5   get_node_name_to_buf_metar      s     4::<< 8 8	8---+5yk+B+Bx((x(,,Y77774::<< E E	8'122+28V+D+Di((  r4   rP   c                     i }t          ||           |dS t          |          }| j        j        D ]-}|j        |v r"|                    |j                  |j        d<   .dS )rT   Nbuf_meta)r   r   rK   r7   r,   getrB   )rP   rR   r   r   rN   s        r5   annotate_orig_fx_with_snodesr     s     -/(1FGGG$56KLL I I9---$9$=$=di$H$HDIj!I Ir4   c               #     K   t           j                            dd          dk    } dd l}t	          j        |j        j        j                  }t          j
                    }| s5	 d V  |                                 n# |                                 w xY wd S |                    t          dd                     t           j                            t!                      d          }t          j        |d           t	          j        t           j                            |d	t'                       d
                    }|                    t          j                   |                    t	          j        d                     |                    |           	 d V  |                    |           |                                 d S # |                    |           |                                 w xY w)NTORCH_COMPILE_DEBUG01r   z*functorch.compile.config.debug_partitionerTtorchinductor)exist_okaot_z
_debug.log3[%(filename)s:%(lineno)d %(levelname)s] %(message)s)osenvironr   torch._functorch.aot_autogradlogging	getLogger
_functorchaot_autogradrZ   
contextlib	ExitStackcloseenter_contextr
   pathjoinr   makedirsFileHandlerr   setLevelDEBUGsetFormatter	Formatter
addHandlerremoveHandler)compile_debugry   r?   stackr   fhs         r5   enable_aot_loggingr     s     JNN#8#>>#EM((((

E,9B
C
CC ""E 	EEEKKMMMMEKKMMMM 
JDQQRRR7<<99DKt$$$$		
3%''333	
 	

 
B KKOOOPP   NN2" 	"s   $A= =BG
 
+G5 _inductor_post_to_pre_grad_nodes._inductor_triton_kernel_to_post_grad_node_info_pre_grad_graph_id#_inductor_pre_grad_node_stack_trace_inductor_kernel_stack_trace(_inductor_kernel_provenance_debug_handlec                  
    da d S rX   )r   r3   r4   r5   -reset_inductor_kernel_provenance_debug_handler   L  s    /0,,,r4   c               #   0  K   t           } t                                          }t                                          }t                                          }t
                                          }da i ai ai ai a	 dV  | a |a|a|a|adS # | a |a|a|a|aw xY w)zzContext manager that resets provenance tracking globals upon entering
    and restores their original values when exiting.N)r   r   copyr   r   r   )original_pre_grad_graph_idoriginal_post_to_pre_grad_nodes-original_triton_kernel_to_post_grad_node_info+original_inductor_pre_grad_node_stack_trace$original_inductor_kernel_stack_traces        r5   reset_provenance_globalsr   Q  s       "4&F&K&K&M&M#6;;== 2 	,0022 0 ,H+L+L+N+N( ')$572*,'#% 
 8+J(9 	7 (L$7 	,++ 8+J(9 	7 (L$7 	, 	
 	
 	
 	
s   9B	 	Bc                      e Zd Z ej                    Zededee         fd            Z	ddZ
deddfdZ	 dd	ed
edededee         f
dZej        	 dd	ed
edededeee                  f
d            ZdedefdZddZddZd	ededdfdZdeee                  dee         dee         ddfdZddZdedeed                  fdZdS )DebugContextfolder_namer/   c                    t           j        j        pt                      }t          j        D ]_}t          j                            |d|  d|           }t          j        	                    |          st          j
        |           |c S `d S )Nr   .)r   rM   	debug_dirr   r   _counterr   r   r   existsr   )r   r   ndirnames       r5   create_debug_dirzDebugContext.create_debug_dir  s    L*=moo	& 	 	Agll$$$$ G
 7>>'** G$$$ tr4   Nc                 R    d | _         d | _        t          j                    | _        d S rk   )_prof_pathr   r   _stack)selfs    r5   __init__zDebugContext.__init__  s$    

 *,,r4   new_pathc                    | j         sd S |                    d          s
J |            ddlm} 	  || d          5  t          j                            |          rt          j        |           t          j	        | j         |           d d d            d S # 1 swxY w Y   d S # t          $ r% t                              d| j         |           Y d S w xY w)Nz.debugr   )FileLockz.lockz(Failed to copy debug files from %s to %s)r   endswithfilelockr   r   r   r   r1   rmtreecopytreeOSErrorr?   r@   )r   r   r   s      r5   r   zDebugContext.copy  sL   z 	F  **44H44*%%%%%%	X,,,-- 6 67>>(++ ,M(+++
H5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6  	 	 	KK:DJ     	s5   B& ABB& BB&  B!B& &+CCwfilename
write_moderV   rh   c                 |    | j         sJ t          t          j                            | j         |          |g|R i |S rk   r   openr   r   r   )r   r   r   rV   rh   s        r5   fopenzDebugContext.fopen  sC     zzBGLLX66
TTTTTVTTTr4   c              /      K   | j         sJ t          t          j                            | j         |          |g|R i |5 }|V  d d d            d S # 1 swxY w Y   d S rk   r   )r   r   r   rV   rh   fs         r5   fopen_contextzDebugContext.fopen_context  s       zz"',,tz844jR4RRR6RR 	VWGGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s    AAAsuffixc                 ^    | j         sJ t          j                            | j         |          S rk   )r   r   r   r   )r   r  s     r5   r   zDebugContext.filename  s'    zzw||DJ///r4   c                    t           j        j        dd l}| j        sJ t
          j                            | j        t
          j                            | j                   d          }|	                    |d          5 }|
                    | j        t
          j                            | j                             d d d            n# 1 swxY w Y   t           j                            |           d S d S )Nr   z.tar.gzzw:gz)arcname)r   rM   
upload_tartarfiler   r   r   r   basenamer   r   )r   r	  tar_filetars       r5   r  zDebugContext.upload_tar  s    <".NNN::w||
rw//
;;DDD H h// J3
BG,<,<TZ,H,HIIIJ J J J J J J J J J J J J J JL##H----- /.s   ??C

CCc                 z   t           j        rdt          j        d          j        }                    t          j                   dt          dd ffd}| j        	                    ||           | j        
                    t          j        |                      t           j        j        sd S |                     t!                                | _        t           j        j        r |                     dt          j                   t           j        j        r"|                     dt          j                   d S d S )Nztorch._dynamolevelr/   c                 2                         |            d S rk   )r   )r  r?   s    r5   reset_log_levelz/DebugContext.__enter__.<locals>.reset_log_level  s    U#####r4   z	debug.logzinfo.log)r   debugr   r   r  r   r   r   r   callbackr   r%   set_debug_handlerrM   enabledr   r   r   	debug_log_setup_log_captureinfo_logINFO)r   
prev_levelr  r?   s      @r5   	__enter__zDebugContext.__enter__  s(   < 	>#O44CJLL'''$s $t $ $ $ $ $ $ K  *===!!!"5d";";<<<|# 	F**+=+?+?@@
<! 	@##K???<  	>##J=====	> 	>r4   r  c                    t          j        d          }| j                            |                     |                    }t          j        |          }|                    |           |                    t          j        d                     |	                    |           |                    t          |j        |                     | j                            |j        |           d S )Nztorch._inductorr   )r   r   r   r   r   StreamHandlerr   r   r   r   minr  r  r   )r   r   r  r?   fdchs         r5   r  zDebugContext._setup_log_capture  s    
  122[&&tzz(';';<<"2&&
E
STT	
 	
 	
 	rSE**+++S.33333r4   exc_typeexc_valexc_tbc                 0   | j         r-| j                                          |                                  | j        rA|                                  t
                              dt                      | j                   | j        	                                 d S )Nz%s debug trace: %s)
r   disable_save_profile_datar   r  r?   r@   r   r   r   )r   r   r!  r"  s       r5   __exit__zDebugContext.__exit__  s     : 	&J   ##%%%: 	VOOKK,.F.H.H$*UUUr4   c                    | j         sJ | j                             |                     d                     |                     d          5 }t	          j        | j         |          }|                                 |                    d           |                    d           |                    d           |                    d           d d d            d S # 1 swxY w Y   d S )Nzcompile.profzcompile.stats)streamcumtimed   tottime)	r   
dump_statsr   r   pstatsStats
strip_dirs
sort_statsprint_stats)r   r  statss      r5   r%  zDebugContext._save_profile_data  s   zz
dmmN;;<<<ZZ(( 	#BLB777EY'''c"""Y'''c"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   BCC!$C!r,   ).Nc                    t           j        j        ret          t           j        |          rK	 t          t	          |           |          S # t
          $ r  t                              dd           Y d S w xY wdt          dt          dd fd}|S )Nz Ignoring exception in debug codeTexc_inforV   rh   r/   c                      d S rk   r3   rg   s     r5   ignoredz)DebugContext.__getattr__.<locals>.ignored  s    r4   )	r   rM   r  getattrDebugFormatter	Exceptionr?   r@   r   )r   r,   r7  s      r5   __getattr__zDebugContext.__getattr__	  s    < 	GFL$$?$? 	~d33T:::   >NNNtt
s c d     Ns   A
 
&A43A4r/   N)r   )rZ   
__module____qualname__	itertoolscountr   staticmethodrv   r   r   r   r   r   r   r   r   contextmanagerr   r  r   r  r  rF   r  r^   BaseExceptionr&  r%  r   r;  r3   r4   r5   r   r   |  sS       y  Hc hsm    \- - - -
S T    & U UU U 	U
 U 
CU U U U  	 		 	 		
 	 
"S'		 	 	 	0s 0s 0 0 0 0
. 
. 
. 
.> > > >.44 4 
	4 4 4 4 4./ -( 	
 
   	# 	# 	# 	# )1D(E      r4   r   c                   ~   e Zd ZdeddfdZdej        j        deej	                 ddfdZ
dej        j        deej	                 ddfdZd	eddfd
Zd	eddfdZed	edefd            Zd	eddfdZdej        j        d	eddfdZddededdfdZdedeej                 dedef         dededee         ddfdZdS )r9  handlerr/   Nc                 \    |j         | _         |j        | _        |j        | _        || _        d S rk   )r   r  r   rE  )r   rE  s     r5   r   zDebugFormatter.__init__  s+    ]
$2(r4   rP   inputsc           
         |                      d          5 }d }t          j        j        j        j        rHt          j        j                            |          }t          j
                            |j                  }t          j        j        j        j        }t          j        j                            ddd          5  t          |||d||           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                      d          5 }|                    |                    d                     d d d            d S # 1 swxY w Y   d S )Nzfx_graph_runnable.pyF)ztrace.enabledztrace.save_real_tensorsinductor)save_dirstable_hashzfx_graph_readable.pyprint_output)r   ry   r~   r   rM   save_real_tensors_subclasses
fake_utilstry_convert_fake_to_realr   r   r   r,   r
   r   writeprint_readable)r   rP   rG  r  rJ  rK  s         r5   fx_graphzDebugFormatter.fx_graph  s    
 ZZ.// 	2H%+= 4*5NNvVV7??2733
  /06HK'--"'EJJ  
 
 !% +   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	, ZZ.// 	<2HHR&&E&::;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<sH   B(C7>C C7 C$	$C7'C$	(C77C;>C;*EEEc                     |                      d          5 }|                    |                    d                     d d d            d S # 1 swxY w Y   d S )Nzfx_graph_transformed.pyFrL  )r   rR  rS  )r   rP   rG  r  s       r5   fx_graph_transformedz#DebugFormatter.fx_graph_transformed=  s    
 ZZ122 	<bHHR&&E&::;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s   *AAAr7   c                     |                      d          5 }|                    |                     |                     d d d            d S # 1 swxY w Y   d S )Nzir_pre_fusion.txtr   rR  	_write_irr   r7   r  s      r5   r)   zDebugFormatter.ir_pre_fusionE  s    ZZ+,, 	,HHT^^E**+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,   )AAAc                     |                      d          5 }|                    |                     |                     d d d            d S # 1 swxY w Y   d S )Nzir_post_fusion.txtrX  rZ  s      r5   r*   zDebugFormatter.ir_post_fusionI  s    ZZ,-- 	,HHT^^E**+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,r[  c                     t          j                    }| D ]>}|                    |                                           |                    d           ?|                                S )Nz


)ioStringIOrR  	debug_strgetvalue)r7   rr   rN   s      r5   rY  zDebugFormatter._write_irM  s[    kmm 	  	 DIIdnn&&'''IIh||~~r4   c                 N    t          ||                     d                     d S )Nzgraph_diagram.svg)r9   )rQ   r   )r   r7   s     r5   graph_diagramzDebugFormatter.graph_diagramU  s(    U$--0C"D"DEEEEEEr4   c                     t          ||           t          ||                     d          dt          dt          j        j                   d S )Nzorig_fx_graph_diagram.svgFT)r9   r=   progparse_stack_tracer>   )r   r   r   GRAPHVIZ_COMMAND_SCALABLEr   rM   r>   )r   rP   r7   s      r5   draw_orig_fx_graphz!DebugFormatter.draw_orig_fx_graphX  sY    
 	%R///-- ;<<*""L8	
 	
 	
 	
 	
 	
r4   pyr   	extensionc                 \    t          j        ||                     d|                      d S )Nzoutput_code.)r1   r   r   )r   r   rj  s      r5   output_codezDebugFormatter.output_codeg  s/    Hdmm,F9,F,FGGHHHHHr4   r,   input_nodestimingsChoiceCallerelapseprecompile_elapseprescreening_elapsec                 l   ddl m dt           j        dt          t          t          f         ffd|t
          j                                        t
          j                                        fd|D             |||d}| 	                    dd	d
          5 }|
                                D ]j\  }	}
t          |	                                          }|                    |           |
|d<   t          j        ||           |                    d           k	 d d d            d S # 1 swxY w Y   d S )Nr   )FixedLayoutrN   r/   c           	      .   t          | d          r| j        }nd}|t          |           j        d}	 |                                 }t          |          rd}	 t          |j                  }nM# t          $ r@ 	 t          j
        j                            |j        d          }n# t          $ r Y nw xY wY nw xY w |j        |j        g t          j
        j                            |j                  g t          j
        j                            |j                  |          }t%          |          |d<   nt%          |          |d<   n# t          $ r Y nw xY w	 t%          |                                           |d<   n# t          $ r Y nw xY w	 t%          |                                           |d	<   n# t          $ r Y nw xY w	 t%          t          j
        j                            |                                                     |d
<   n# t          $ r Y nw xY w	 t%          t          j
        j                            |                                                     |d<   n# t          $ r Y nw xY w	 t%          t          j
        j                            |                                                     |d<   n# t          $ r Y nw xY wt          | d          r2t          | j        t2          j                  r | j                  |d<   |S )Nr,    )r,   r^   r   )fallback)rI   sizestrideoffsetlayoutrI   rf   ry  rx  numelrH   )r   r,   r^   rZ   get_output_specrD   rF   rz  r:  r%   rK   sizevars	size_hintrf   rI   
size_hintsrx  ry  rv   	get_dtypere   
get_strideget_size	get_numelrH   r   IRNode)rN   r   	node_infor{  rz  static_layoutrt  build_node_infos         r5   r  z>DebugFormatter.log_autotuning_results.<locals>.build_node_infou  sj   tV$$  I			!T

+ I--//fk22 6F!!$V]!3!3$ ! ! !!%&W%5%?%? & &@ & &FF  ) ! ! ! D!! %0K$lHqw/::6;GGHL!1!<!<V]!K!KL%% % %M +.m*<*<Ih''*-f++Ih'   %()9)9%:%:	'""   &)$//*;*;&<&<	(##   &)G$//0A0ABB' '	(##    $'(8(C(CDMMOO(T(T$U$U	&!!   %()9)C)CDNNDTDT)U)U%V%V	'""   tV$$ ?DIry)I)I ?$3ODI$>$>	&!s   &E A0 /E 0
B:;+B'&B:'
B41B:3B44B:7E 9B::BE 
EE $F 
FF$F; ;
GGAH 
H H $AI+ +
I87I8<AK 
KKc                 &    g | ]} |          S r3   r3   )rl   rN   r  s     r5   
<listcomp>z9DebugFormatter.log_autotuning_results.<locals>.<listcomp>  s#    JJJdOOD11JJJr4   )op_namecuda_device_namecuda_device_countrm  autotuning_timeprecompile_timeprescreening_timezautotuning_result_json_list.txtatzutf-8)encodingbenchmark_result
)r   rt  r  dictrv   ry   cudaget_device_namedevice_countr  r   	info_dictupdatejsondumprR  )r   r,   rm  rn  rp  rq  rr  general_propertiesr  callertimer  rt  r  s               @@r5   log_autotuning_resultsz%DebugFormatter.log_autotuning_resultsj  s    	$#####:	") :	S#X :	 :	 :	 :	 :	 :	 :	z  %
 : : < <!&!8!8!:!:JJJJkJJJ%0!4
 
 -tg   
 
 	 '   !1!1!3!344	  !344404	,-	)R(((	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B D))D-0D-)ri  )rZ   r=  r>  r   r   ry   r   r   listTensorrT  rV  SchedulerNodeListr)   r*   rA  rv   rY  rc  rh  rl  r   r  r  floatr   r  r3   r4   r5   r9  r9    s0            <H < U\"< 
	< < < <<<H < U\"< 
	< < < <,#4 , , , , ,,$5 ,$ , , , , * s    \F#4 F F F F F
H 
 !
 
	
 
 
 
I IC IC I4 I I I IXX ")_X ne+,	X
 X !X &e_X 
X X X X X Xr4   r9  c                     t                               t          j                  r3t                               dt
                              |                      t          j        	                    |            d S )NzBEFORE FUSION
%s)
ir_pre_fusion_logisEnabledForr   r  infor9  rY  r%   r  r)   r7   s    r5   log_ir_pre_fusionr    s\    %%gl33 U2N4L4LU4S4STTTG%     r4   c                     t                               t          j                  r3t                               dt
                              |                      t          j        	                    |            d S )NzAFTER FUSION
%s)
ir_post_fusion_logr  r   r  r  r9  rY  r%   r  r*   r  s    r5   log_ir_post_fusionr    s\    &&w|44 U 2N4L4LU4S4STTTG5!!!!!r4   schedulec                      	 t          dd  fd           d S # t          $ r  t                              dd           Y d S w xY w)Nartifactc                      dddS )Ninductor_collective_scheduler  r,   r  r3   r3   r4   r5   <lambda>z+_dump_collective_schedule.<locals>.<lambda>  s    6"! ! r4   c                       S rk   r3   r  s   r5   r  z+_dump_collective_schedule.<locals>.<lambda>  s    x r4   metadata_fn
payload_fnzAFailed to log inductor_collective_schedule via structured loggingTr4  )r   r:  r?   r  r  s   `r5   _dump_collective_scheduler    s    
  ('''	
 	
 	
 	
 	
 	
  
 
 
		O 	 	
 	
 	
 	
 	
 	

s    &AAc                 J    fd| D             }|rt          |           d S d S )Nc           	          g | ]>}t          t          |d d          xt          j                  -t          dd          ?S )rN   Npython_kernel_name)rD   r8  r   _CollectiveKernel)rl   rN   ops     r5   r  z+log_collective_schedule.<locals>.<listcomp>  sZ       GD&$777b9MNN($//  r4   )r  )r7   r  r  s     @r5   log_collective_scheduler    sS         H  ,!(+++++, ,r4   node_runtimesc           	         	 t           j        j        j        dt          t
          t                            dt          t                   ffd}dt          dt          t                   fd}g | D ](\  }}t          |j
        d|                                          }t          j        |j
                  rdnd}g }	 |                                D ]}|j
        }	|	                                }
t!          |	j        t$          j                  r|	                                nd	}|	                                }|                     ||
           ||           ||          d
           n# t.          $ r Y nw xY w                    ||||d           *t1          dd fd           d	S # t.          $ r  t2                              dd           Y d	S w xY w)zDLog per-op runtime estimates and output tensor metadata for TLParse.rm   r/   c                 <    | t           |                     ng S rk   )r  )rm   to_size_hintss    r5   to_listz,log_runtime_and_tensor_meta.<locals>.to_list  s$    -.]4a(()))Br4   rI   c                 V    | d S t          |           }|                    d          }|S )Nztorch.)rv   removeprefix)rI   ss     r5   dtype_to_strz1log_runtime_and_tensor_meta.<locals>.dtype_to_str  s-    }tE

Ax((AHr4   r  
collectiverb   N)shapery  rI   )r,   r^   estimated_runtime_nsr   r  c                      dddS )N inductor_runtime_and_tensor_metar  r  r3   r3   r4   r5   r  z-log_runtime_and_tensor_meta.<locals>.<lambda>&  s    :"! ! r4   c                      d iS )Nopsr3   )r  s   r5   r  z-log_runtime_and_tensor_meta.<locals>.<lambda>*  s    s| r4   r  z.Failed to log inductor_runtime_and_tensor_metaTr4  )r%   rK   r~  r  r   r   r   r  rv   r8  rN   r   r   is_collectiveru   maybe_get_sizerD   r{  r   Layoutr  maybe_get_dtyper   r:  r   r?   r  )r  r  r  r  
runtime_nsr,   op_typer   rr   irnoder  ry  rI   r  r  s                @@r5   log_runtime_and_tensor_metar    so   :S(3	Cx. 	C49 	C 	C 	C 	C 	C 	C	 	 	 	 	 	 %'* !	 !	MAz16#7FFD&+&9!&&A&APllyG -/G==??  C XF"1133E &fmRY??"))+++! 
 #2244ENN%,WU^^&-gfoo%1\%%8%8          JJ #,6&	     	  ,+++	
 	
 	
 	
 	
 	
  S S S		BT	RRRRRRSs7   B9F2 >B/E.-F2 .
E;8F2 :E;;5F2 2&GGc                      t           sdS 	 t          dd d            dS # t          $ r  t                              dd           Y dS w xY w)	z:Emit a structured artifact with the graph execution order.Nr  c                      dddS )Ngraph_executionr  r  r3   r3   r4   r5   r  z%log_graph_execution.<locals>.<lambda>7  s    )"! ! r4   c                      dt           iS )Ngraph_execution_order)r&   r3   r4   r5   r  z%log_graph_execution.<locals>.<lambda>;  s     79NO r4   r  zFailed to log graph_executionTr4  )r&   r   r:  r?   r  r3   r4   r5   log_graph_executionr  0  s      
B  PO	
 	
 	
 	
 	
 	
  B B B		1D	AAAAAABs   ! &A
Ac               #   z   K   g a i ada	 dV  t                       dada dadS # t                       dada daw xY w)z5Record graph execution order and log it once on exit.TNF)r&   r(   r'   r  r3   r4   r5   $record_and_log_graph_execution_orderr  A  sy       !!!& $  	!& $     s   $ :c                   .    e Zd ZU eed<   ej        ed<   dS )TensorMetadataHoldertensor_metadatarf   N)rZ   r=  r>  r   __annotations__ry   rf   r3   r4   r5   r  r  Q  s,         ####Lr4   r  pre_grad_graph_idpost_to_pre_grad_nodes_jsonc           	         i i d}t          |t                    st                              d           |S t          | t                    s|S t          j        t                    }t          j        t                    }	 dt          t          t          f         dt          fd}|                                D ]\  }t          |t                    st                              d           |c S |D ]M} ||          s|c c S |                    d          | k    rB||d                                                 |                             |d                    fd	|                    d
g           D             }|r|                                \  }	 ||	          s|c c S |	                    d          | k    rB||	d                                                 |                             |	d                    |                    fd|	                    d
g           D                        |Odt          t          t          f         ddfd}
 |
|            |
|           ||dS # t"          $ ru}t%          dddt          |          t'          j                    d           t                              d|           t                              d|            |cY d}~S d}~ww xY w)zx
    Create bidirectional mappings between pre_grad graph nodes
    and post_grad graph code nodes, and vice versa.
    )	preToPost	postToPrezCProvenance tacking error: post_to_pre_grad_nodes_json is not a dictrN   r/   c                     t          | t                    st                              d           dS d| vsd| vsd| vrt                              d           dS dS )NzVProvenance tacking error: node provenance in post_to_pre_grad_nodes_json is not a dictFgraph_idr,   	from_nodezYProvenance tacking error: node provenance in post_to_pre_grad_nodes_json has wrong formatT)rD   r  r?   error)rN   s    r5   check_formatz8create_mapping_pre_post_grad_nodes.<locals>.check_formatv  sy    dD)) 		l   u%%t););{RV?V?V		o   u4r4   zIProvenance tacking error: post_to_pre_grad_nodes_json value is not a listr  r,   c                     g | ]}|fS r3   r3   )rl   r   	outer_keys     r5   r  z6create_mapping_pre_post_grad_nodes.<locals>.<listcomp>  s    KKKA!YKKKr4   r  c              3       K   | ]}|fV  	d S rk   r3   )rl   r   
parent_keys     r5   ro   z5create_mapping_pre_post_grad_nodes.<locals>.<genexpr>  s8       ! !,-J! ! ! ! ! !r4   dNc                 ^    | D ]}t          | |                   | |<   t          |           } d S rk   r  r  r  keys     r5   convert_sets_to_listszAcreate_mapping_pre_post_grad_nodes.<locals>.convert_sets_to_lists  5     & &af#QAAAr4   rI  provenance_tracking_error"create_mapping_pre_post_grad_nodesfunction	error_msgstack_tracez post_to_pre_grad_nodes_json:  %szpre_grad_graph_id:  %s)rD   r  r?   r  rF   rw   defaultdictr   rv   r   r   r   r  r   r   popextendr:  r   	traceback
format_exc)r  r  empty_returnpre_to_postpost_to_prer  
node_arrayrN   r   current_noder  er  r  s               @@r5   r  r  Z  s    5 5L
 1488 		WXXX'--  "-"9*"E"EK"-"9*"E"EKD	tCH~ 	$ 	 	 	 	 &A%F%F%H%H 	 	!Izj$// $		_   $###"  #|D)) (''''''88J''+<<<V-11)<<<	*..tF|<<< LKKK+r1J1JKKK 	/4yy{{,L*'<55 ,++++++#''
337HHH#L$89==jIII#J/33L4HIIILL ! ! ! !1=1A1A+r1R1R! ! !     	*	T#s(^ 	 	 	 	 	 	k***k***$$
 
 	
     	'@ VV(355 	
 	
 	
 			46QRRR		*,=>>>s4   A0J 4J 
B&J 1CJ 
L A*K;5L ;L triton_kernel_to_post_grad_jsonc           	         i i d}t          | t                    st                              d           |S t	          j        t                    }	 |                                 D ]X\  }}t          |t                    st                              d           |c S |D ]}||         	                    |           Ydt          t          t          f         ddfd} ||           | |dS # t          $ rZ}t          dd	d
t          |          t          j                    d           t                              d|            |cY d}~S d}~ww xY w)zqCreate bidirectional mappings between triton kernel name and post_grad
    graph code nodes, and vice versa.
    )cppCodeToPostpostToCppCodezGProvenance tacking error: triton_kernel_to_post_grad_json is not a dictzMProvenance tacking error: triton_kernel_to_post_grad_json value is not a listr  r/   Nc                 ^    | D ]}t          | |                   | |<   t          |           } d S rk   r  r  s     r5   r  zFcreate_node_mapping_kernel_to_post_grad.<locals>.convert_sets_to_lists  r  r4   rI  r  "create_mapping_kernel_to_post_gradr  z$triton_kernel_to_post_grad_json:  %s)rD   r  r?   r  rw   r   r   r   r  r   rv   r   r:  r   r  r  )r  r  post_to_cpp_coder  r  	curr_noder  r
  s           r5   'create_node_mapping_kernel_to_post_gradr    s    / /L
 5t<< 		U	
 	
 	
 '2'>z'J'J$%D%J%J%L%L 	; 	;!Izj$// $		c   $###' ; ;	 +//	::::;	T#s(^ 	 	 	 	 	 	.///<-
 
 	
     	'@ VV(355 	
 	
 	
 			24S	
 	
 	
 s'   AC- AC- -
E7AEEEc            	         	 i } t           r}t          t                    }i t          |} t          j        j        rMt          j        	                    dd          5 }t          j        | |           d d d            n# 1 swxY w Y   d| d<   | S # t          $ r?}t          dddt          |          t          j                    d           i cY d }~S d }~ww xY w)	Nz/inductor_provenance_tracking_node_mappings.jsonr   g       @versionrI  r  dump_inductor_provenance_infor  )r   r  r   r   r   rM   r  r%   r  r   r  r  r:  r   rv   r  r  )node_mappingnode_mapping_kernelr  r
  s       r5   r  r    sM   " (* 	0"I># #2%L |# 0W]]Es  0IlB///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 #&Y    	'; VV(355 	
 	
 	
 						sB   AB A=1B =BB B	B 
C4CCCc            	         	 t                               di           } t          t                                                    t          t
                                                    z  }i }|D ]}t
                              |g           }t                      }|D ]+}|                    |                     |g                      ,t                              |g           |t          |          d||<   |S # t          $ r?}t          dddt          |          t          j                    d           i cY d}~S d}~ww xY w)zCreate kernel information JSONr  )stack_tracespost_grad_nodespre_grad_nodesrI  r  create_kernel_information_jsonr  N)r   r   r   r   keysr   r  r  r:  r   rv   r  r  )r  all_kernelsresultkernel_namer  r  	post_noder
  s           r5   r  r    ss   %
 7::;KK !=!B!B!D!DEE
:??AAI
 I
 
 & 	 	KLPPR O /9llN, F F	%%kooi&D&DEEEE != @ @b Q Q#2"&~"6"6# #F;  
 
 
'< VV(355 	
 	
 	
 						
s   C6C9 9
E4D=7E=Enode_scheduler!  r{   c           	        
 	 ddl m}m} t          dz  ag }| dt           }|rt	          | t
                    sJ t                              |g           
| j        r&| j        j	        }|
vr

                    |           n&
                    
fd| j        D                        t          |                                           }nt	          | t                    sJ t                      }| D ]}|||fvry|j        rt                              |g           
|                    |j                                                   
                    
fd|j        j        D                        t          |          }t$                              |g                               |           t          S # t&          $ r>}	t)          ddd	t+          |	          t-          j                    d
           Y d}	~	dS d}	~	ww xY w)z
    Set the mapping between `kernel_name` and the post_grad nodes in `node_schedule`.

    Returns a unique int debug handler for each call to this function.
    r   )DisableReductionEnableReduction:c              3   8   K   | ]}|j         v|j         V  d S rk   r,   rl   r   curr_node_infos     r5   ro   z:set_kernel_post_grad_provenance_tracing.<locals>.<genexpr>i  s>       & &{.88 K8888& &r4   Nc              3   8   K   | ]}|j         v|j         V  d S rk   r)  r*  s     r5   ro   z:set_kernel_post_grad_provenance_tracing.<locals>.<genexpr>{  s>       . . &%{.@@ #K@@@@. .r4   rI  r  'set_kernel_post_grad_provenance_tracingr  )codegen.simd_kernel_featuresr%  r&  r   rD   r   r   
setdefaultorigin_noder,   r   r  r   r  get_stack_tracesr   rN   r  r   r:  r   rv   r  r  )r#  r!  r{   r%  r&  r  origin_node_namestack_traces_setr]   r
  r+  s             @r5   r-  r-  G  s   =SSSSSSSS 	1A50"$$QQ'OQQ $	2m\:::::KVVR N ( 	#0#<#A #>99"))*:;;;%% & & & &"/"7& & &   
   > > @ @AALLmT222220:&  2B CCCz-JUU +R  '
 )//
0K0K0M0MNNN&-- . . . .*/**<. . .   
   011L$//R@@GGUUU77    	'E VV(355 	
 	
 	
 ttttts   F5F9 9
H3G<<HrV   rh   c                     d}t           j                            |          st          j        |           dt          dt          fd}t          || |f          \  }}d}| d| dt          t                     d}t          |d	          5 }t          j
        ||f|           d
d
d
           n# 1 swxY w Y   t                              t          j                  rd| d|d}	t          |	           d
S d
S )z
    This function is used to save arguments for a compile_fx_inner function call
    to the file system.  Later on one can replay the compile_fx_inner call
    with the saved arguments using load_args_and_run_compile_fx_inner.
    z/tmp/inductor_saved_argsrm   r/   c                 ~    t          | t          j                  r"t          t	          |           | j                  S | S )z
        Pickle FakeTensor will result in error:
        AttributeError: Can't pickle local object 'WeakValueDictionary.__init__.<locals>.remove'

        Convert all Tensor to metadata. This may also makes pickle faster.
        )rD   ry   r  r  r   rf   rm   s    r5   handle_tensorz5save_args_for_compile_fx_inner.<locals>.handle_tensor  s8     a&& 	'(@(C(CQXNNNHr4   compile_fx_inner/_z.pklwbNz3
Arguments for a compile_fx_inner call is saved to z. To replay the call,
run the following:

from torch._inductor.debug import load_args_and_run_compile_fx_inner
load_args_and_run_compile_fx_inner(z
)
        )r   r   r   mkdirr   r   nextsave_args_cntr   pickler  r?   r  r   r   rJ   )
rV   rh   folderr7  args_to_savekwargs_to_savefn_namer   r  messages
             r5   save_args_for_compile_fx_innerrE    sl    (F7>>&!! 

 
 
 
 
 
 $,MD&>#J#J L. G::w::m!4!4:::D	dD		 7Q\>2A6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 && 37 
 %)   	g s   B00B47B4r   c                    ddl m} t          | d          5 }t          j        |          \  }}d d d            n# 1 swxY w Y   dt
          dt
          fd}t          j                            d          }|5  t          j
        d	d
          5  t          |||f          \  }} ||i |cd d d            cd d d            S # 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   )r8  rbrm   r/   c                     t          | t                    rJt          j        j                            | j        j        | j        j        | j        j	        | j
                  S | S rk   )rD   r  ry   _dynamotestingrand_stridedr  r  ry  rI   rf   r6  s    r5   r7  z9load_args_and_run_compile_fx_inner.<locals>.handle_tensor  sY    a-.. 	=(55!'!(!'	   Hr4   T)allow_non_fake_inputs	save_argsF)torch._inductor.compile_fxr8  r   r?  loadr   ry   rO  FakeTensorModer   r
   r   )r   r8  r  rV   rh   r7  	fake_modes          r5   "load_args_and_run_compile_fx_innerrR    s   ;;;;;;	dD		 &Q{1~~f& & & & & & & & & & & & & & &	 	 	 	 	 	 !00t0LLI	 1 1FLe44 1 1f~>>f0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1sC   ;??:CC-CC
	
CC
	CC"%C")package_pathfunc.exported_programinductor_configsrS  c                   ddl m} ddlm} ddlm} ddlm} |j        j	        }|
                    d          }	t          |	t          j        j                  sJ |j        \  }
}	 |r|j        j        dk    r ||d	|
           |r|j        j        dk    rt#          j        |	          }t#          j        |j                  }t#          j        |          } |||d         |d         |
          \  }}t'          |          }t          j                            ||d          } | |
                    d          |||dd            | |	|
||||          S # |$ r0} ||dd|           t*                              d           |d }~wt.          $ r,}|r#d}|j        j        dk    rd} ||d	||           |d }~ww xY w)Nr   )AccuracyError)dump_to_minify)r   )_aoti_flatten_inputsF)check_guards   aot_inductor)options   r   )strictTaccuracy)rV  rS  load_and_runcheck_accuracy)rV  rS  rb  aot_inductor_accuracyminify)commandr^  zAccuracy failedrun)torch._dynamo.debug_utilsrX  torch._dynamo.repro.aotirY  torch._inductorr   rN  rZ  r]  dump_aoti_minifiermodulerD   ry   r   r   example_inputsrepro_levelr   deepcopyrE   exportr?   r@   r:  )rT  rU  rV  rS  rX  rY  r   rZ  use_minifierrP   rV   rh   gm_copyexample_inputs_copyconfig_copyflat_example_inputstuple_inputsflattened_epr
  rf  s                       r5   aot_inductor_minifier_wrapperrx    s    877777777777&&&&&&??????&9L		 	 e	 	4	4Bb%(./////#2LD&> 	F/;q@@N (   
  	F/;q@@ mB''G"&-0@0O"P"P-(899K/C/C#A&#A&#	0 0 0, !!455L <..wU.SSLD###77!,)!)    t-%%
 
 
 	
    #$		
 	
 	
 	
 	%&&&    	G".!33N (	    s%   'C7E G$+FG'GG)FNrX   r<  )F)rw   r   r   dataclasses	functoolsr^  r?  r  r   r   os.pathr?  r-  r1   r  collections.abcr   r   typingr   r   r   r   r	   unittest.mockr
   ry   functorch.compiler   r   r   r   torch._dynamo.repro.after_aotr   torch._dynamo.utilsr   rj  r   torch._loggingr   torch._logging._internalr   torch._utils_internalr   torch.fx.graph_moduler   torch.fx.passes.shape_propr   r   torch.fx.passes.tools_commonr   torch.typesr   torch.utils._ordered_setr   torch.utils._pytreer   rv  r   r   r   	schedulerr    r!   r"   r#   r$   virtualizedr%   r   rZ   r?   r&   r  r  rv   objectr  r'   r   r(   rF   r  r  r  rx   r+   rg  cacher6   rQ   rz   rA   r   r   r   rB  r   r   r   r   r   r   r   r   r   r   r9  r  r  r  r  rE   r  r  r  r  	dataclassr  r@  r>  r  r  r  r  r-  rE  rR  rp  ExportedProgramrx  r3   r4   r5   <module>r     s	                     				       				         . . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 5        V V V V V V V V V V       : : : : : : - - - - - - ! ! ! ! ! ! , , , , , , 5 5 5 5 5 5 0 0 0 0 0 0 - - - - - - O O O O O O O O 7 7 7 7 7 7             / / / / / / ( ( ( ( ( (                                  g!! <@ xT#v+%6 78 ? ? ?$  $ $ $8< 8Dhsm!345 < < <%%h@@ &&x1ABB I 
 +
 VZ,@
A
ATTT  + + + + + + +!"++ C=+ 
	+ + + +\_$'8"9 _bh _ _ _ _J &*	   %& S>  c]  	 
 
       F!S>!	#w,! ! ! !"III 
I I I I" %HTN % % % %V EG  $sDd3i,@'@"A F F FGI .S$s)^0D I I I$( HSM ( ( (68 #T#s(^ 8 8 857 d3S	>2 7 7 701 (# 1 1 11 1 1 1
 '
(4. '
 '
 '
 '
TY Y Y Y Y Y Y Yxj j j j j j j jZ!. !4 ! ! ! !"/ "D " " " "
U39-=(> 
4 
 
 
 
"	,8,=#> 	,4 	, 	, 	, 	,=Sxc5j8I/J =St =S =S =S =S@B B B B" !htn ! ! ! !        
  	!!^}^!%c3h^ 
#tCcN#
#$^ ^ ^ ^B9%)#s(^9	#tCH~
9 9 9 9x#tCH~ # # # #L'S$sDI~2F-F(G ' ' ' 'Z H H"34lBCHH H c]	H H H HV+# + + + + + +\1S 1S 1 1 1 18 (,Q Q Q
38
Ql2Q 38n	Q
 8$Q 	Q Q Q Q Q Qr4   