
    `ie                        d dl Z d dl mZ d dlZd dl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mZ d dlmc mZ d dlmZ d dlZd	 Zd
 Zd Zd Zd ZddZd Zd Zd Z d Z!d Z"ddZ#d Z$d Z%d Z&d dZ'	 	 d!defdZ(d defdZ)dS )"    N)Tensor)TorchDispatchMode)tree_maptree_flattentree_unflatten)_pytree)partial)no_dispatchall_same_mode)Callablec                 r    | j         } ||           } ||          }||k    rd S t          d| d          )Nz.This operator is not Composite Compliant: the zR of the tensor was modified directly without going through the PyTorch dispatcher.)elemRuntimeError)wrapper_tensormetadata_namemetadata_accessorr   metadata_wrapper_tensormetadata_elems         /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/testing/_internal/composite_compliance.pycheck_attr_consistencyr      sd    D//??%%d++M-//
	1	1 	1 	12 2 2    c                     t          | |          sd S t          j        d d t          j        t          j        t          j        d}|                                D ]\  }}t          | ||           d S )Nc                     | j         S N)dtypexs    r   <lambda>z,check_metadata_consistency.<locals>.<lambda>"   s    17 r   c                     | j         S r   )devicer   s    r   r   z,check_metadata_consistency.<locals>.<lambda>#   s    AH r   )shaper   r    numelstridestorage_offset)
isinstancer   sizer"   r#   r$   itemsr   )r   CCTthings_to_checkr   r   s        r   check_metadata_consistencyr*      s    nc** ""$$- / O -<,A,A,C,C Q Q((~}>OPPPPQ Qr   c                     | j         j        dv S )N>"   timagrealview_conjaliaschunkslicesplitdetachexpandhsplitnarrowselectunbindunfoldvsplitmovedimpermutesqueezeview_asdiagonalswapaxes	expand_as	transpose	unflatten	unsqueeze
as_strided_unsafe_viewtensor_splitview_as_real_reshape_aliasview_as_complexsplit_with_sizesoverloadpacket__name__funcs    r   
is_view_fnrS   +   s    ' #, # #r   c                     | j         j        dv S )N>   t_detach_squeeze_	swapaxes_	swapdims_
transpose_
unsqueeze_as_strided_rN   rQ   s    r   is_inplace_view_fnr]   S   s    ' 	, 	 	r   c                     | j         j        }t          j        d|          rdS t          j        d|          rdS |d         dk    S )Nz__i.+__Tz__.+__F_)rO   rP   rematch)rR   names     r   
is_inplacerd   a   sM    'D	x	4   t	x$ u8s?r   Tc                 ~      G fddt           j                   G  fddt                    } |            fS )Nc                   d    e Zd ZU ej        ed<   dgZed             Zd Z	e
d fd	            ZdS )7generate_cct_and_mode.<locals>.CompositeCompliantTensorr   c                    t          |          | us
J d            t          j                            | |                                |j        |j        |j        |j        |	                                |
                                          }|j        rt          j        d|j        |j        |j        d          }|                    |                                                                |
                                |                                |	                                           ||_        n||_        |	                                |j        	                                k    sJ t          j                            ||j                                                   t          j                            ||j                                                   ||_        |S )NzRWrapping a CompositeCompliantTensor in a CompositeCompliantTensor is not supported)r   layoutr    requires_gradstridesr$    F)r   r    ri   rj   )sourcer$   r&   r#   )typetorchr   _make_wrapper_subclassr&   r   ri   r    rj   r#   r$   emptyset_untyped_storagecloner   _C	_set_conjis_conj_set_negis_negmode)clsr   rz   argskwargsrtmps          r   __new__z?generate_cct_and_mode.<locals>.CompositeCompliantTensor.__new__y   s   ::S(((d )(( 33TYY[[j{$2Dd6I6I6K6K	 4 M MA !  k*;;"'   //117799#'#6#6#8#8;;==	     88::0000
 Hq!&.."2"2333Ha111AFHr   c                     d| j          dS )NzCompositeCompliantTensor())r   )selfs    r   __repr__z@generate_cct_and_mode.<locals>.CompositeCompliantTensor.__repr__   s    ;ty;;;;r   rl   Nc                     t          j        |i |pi }t          fd|D                       }t          |          st	          d          |d         5   ||i |cd d d            S # 1 swxY w Y   d S )Nc              3   F   K   | ]}t          |          |j        V  d S r   )r%   rz   ).0eCompositeCompliantTensors     r   	<genexpr>z]generate_cct_and_mode.<locals>.CompositeCompliantTensor.__torch_dispatch__.<locals>.<genexpr>   s5      ^^QjD\6]6]^!&^^^^^^r   z*Multiple CompositeCompliantTensorModes NYIr   )pytreearg_tree_leavestupler   r   )r{   rR   typesr|   r}   all_argsmodesr   s          r   __torch_dispatch__zJgenerate_cct_and_mode.<locals>.CompositeCompliantTensor.__torch_dispatch__   s    -tF"FFH^^^^(^^^^^E '' Q"#OPPPq - -tT,V,,- - - - - - - - - - - - - - - - - -s   A++A/2A/rl   N)rP   
__module____qualname__ro   r   __annotations__	__slots__staticmethodr   r   classmethodr   )r   s   r   r   rg   t   s         lH		-	 -	 
-	^	< 	< 	< 
	- 	- 	- 	- 	- 
	- 	- 	-r   r   c                       e Zd Zd fd	ZdS );generate_cct_and_mode.<locals>.CompositeCompliantTensorModerl   Nc                 V    fd} fd}|t           j        j        j        j        k    rt          d          |j        j        dv rt          |j         d          t          |          rS|d         }t          |          s;t          fd|dd          D                       rt          d	|j         d
          t          ||          }t          ||          }	 ||i |	}
t          ||
          }t          |          rrt                      5   ||i |}t          |t          t          f          r,t!          ||          D ]\  }}|                    |           n|                    |           d d d            n# 1 swxY w Y   t                      5  t%          |          r ||i | d d d            n# 1 swxY w Y   t'          t(                    }t+          j        ||           t+          j        ||           t+          j        ||           |S )Nc                 6    t          |           r| j        n| S r   r%   r   )r   r   s    r   unwrapz^generate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.unwrap   s    !+A/G!H!HOqvvaOr   c                 T    t          | t          j                  r |           n| S r   r%   ro   r   )r   r   r   s    r   wrapz\generate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.wrap   s.    <Fq%,<W<W^//4888]^^r   z.item() is not allowed to be called inside of composite functions in the PyTorch library because not all backends and/or Tensor subclasses (e.g. vmap, ProxyTensor) support them.)rr   resize_z; is not allowed to be called inside of Composite operators.r   c              3   8   K   | ]}t          |          V  d S r   )r%   )r   ar   s     r   r   zagenerate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__.<locals>.<genexpr>   s.      VVJq*BCCVVVVVVr      z7Not composite compliant: performing in-place operation z where the Tensor being written to is regular Tensor but the other tensors are Tensor Subclasses. Please try to avoid this in-place operation.)r(   )ro   opsaten_local_scalar_densedefaultr   rO   rP   rd   r%   anyr   rS   r
   r   listziprr   r]   r	   r*   r   	tree_map_)r   rR   r   r|   r}   r   r   mutated_argumentunwrapped_argsunwrapped_kwargsunwrapped_rsrsresultr   bcheckr   autograd_view_consistencys   `               r   r   zNgenerate_cct_and_mode.<locals>.CompositeCompliantTensorMode.__torch_dispatch__   sO   P P P P P_ _ _ _ _ _ uy~9AAA"VW W W
 "+/BBB"} , , ,- - - $ 
H $(7 !"24LMM HVVVVTRSRTRTXVVVVVH&G=G G GH H H &fd33N'774D3CDDL$--B$ ($= ( !]] ( ( "T42622F!&5$-88 ($'FOO & &DAqFF1IIII& #( ( ( ( ( ( ( ( ( ( ( ( ( ( (,  * *%d++ *D$)&)))* * * * * * * * * * * * * * * 6<TUUUEUD)))UF+++UB'''Is%   A&FFF%G		GGr   )rP   r   r   r   )r   r   s   r   CompositeCompliantTensorModer      sA        J	 J	 J	 J	 J	 J	 J	 J	 J	r   r   )ro   r   r   )r   r   r   s   ` @r   generate_cct_and_moder   j   s    ?- ?- ?- ?- ?- ?- ?-5< ?- ?- ?-BK K K K K K K K'8 K K KZ $%A%A%C%CCCr   c                    t          | t                    st          | t                    sdS t          |           dk    rdS t	          d | D                       }|rdS t	          d | D                       }|rt          d          dS )NFr   c              3   J   K   | ]}t          |t          j                  V  d S r   r   r   elts     r   r   z is_tensorlist.<locals>.<genexpr>	  s.      CCjel33CCCCCCr   Tc              3   J   K   | ]}t          |t          j                  V  d S r   r   r   s     r   r   z is_tensorlist.<locals>.<genexpr>  s.      IIcJsEL99IIIIIIr   zVThis test assumes that PyTorch APIs cannot take mixed lists of Tensor and other things)r%   r   r   lenallr   )lstall_tensorsexists_one_tensors      r   is_tensorlistr     s    c4   C)?)? u
3xx1}}uCCsCCCCCK tIISIIIII E D E E 	E5r   c                      |r | |          n|S r   rl   )fn
should_mapargs      r   	maybe_mapr     s     )22c777c)r   c                     t          | t          j                  r |           S t          |           rfd| D             S t	          d          )Nc                 (    g | ]} |          S rl   rl   )r   r   r(   cct_modes     r   
<listcomp>zwrap.<locals>.<listcomp>  s%    ...QAx  ...r   z*wrap assumes that the input can be wrapped)r%   ro   r   r   r   )r   r(   r   s    ``r   r   r     sf    #u|$$ "s3!!!S /.....#....
C
D
DDr   c              #      K   d | D             }d |D             }t          j        | D ]%}fdt          ||           D             }||fV  &d S )Nc                 `    g | ]+}t          |t          j                  pt          |          ,S rl   )r%   ro   r   r   )r   r   s     r   r   z-generate_subclass_choices.<locals>.<listcomp>,  s1    ```sz#u|44Jc8J8J```r   c                      g | ]}|rd dgnd gS )FTrl   )r   is_tensor_likes     r   r   z-generate_subclass_choices.<locals>.<listcomp>-  s'    kkkDeWkkkr   c           	      b    g | ]+\  }}t          t          t                     ||          ,S ))r(   r   )r   r	   r   )r   should_wrap_argr   r(   r   s      r   r   z-generate_subclass_choices.<locals>.<listcomp>1  sO     V V V*os GDcHEEEX[\\ V V Vr   )	itertoolsproductr   )	flat_argsr(   r   is_tensor_likessubclass_optionswhich_args_are_wrappedr   s    ``    r   generate_subclass_choicesr   *  s      ``V_```Okk[jkkk"+"35E"F - -V V V V V.12H).T.TV V V,,,,,,	- -r   c              #     K   t          |          \  }}t          |           t          |          z   }t          |||          D ]\  }}|d t          |                    }	t	          |t          |           d          |          }
|d t          |                    }t	          |t          |           d          |          }|	|
||fV  d S r   )r   r   r   r   r   )r|   r}   r(   r   flat_kwargsspecflat_args_kwargschoicedebug_metadatanew_args
new_kwargsr   which_kwargs_are_wrappeds                r   %generate_subclass_choices_args_kwargsr   9  s      $V,,KDzzD$5$55";<LcS["\"\ U U*3t99*%#F3t99::$6==
!/
T
!;#1.T2Ld#S#S 
$:<TTTTTTU Ur    c                 *    t          d| d          | )Nz8Composite compliance check failed with the above error.
a(  If you are adding an OpInfo of an existing operator, please feel free to skip this test because the problem was pre-existing and file an issue. Otherwise, if you added a new operator, please read through the Composite Compliance section in aten/src/ATen/native/README.md for how to resolve this. )r   )erradditional_infos     r    raise_composite_compliance_errorr   E  s4    
	C	C 	C 	C
 
 
r   c           
          t                      \  } | |i |}t          |||          D ]`}|\  }}}	}
	  | |i |}n.# t          $ r!}t          |d|	 d|
 d           Y d }~nd }~ww xY wfd} |t	          ||          |           ad S )N- wrapped_args: 
- wrapped_kwargs: 
c                 6    t          |           r| j        n| S r   r   r   r(   s    r   r   z&check_all_permutations.<locals>.unwrapw  s    '3//6166Q6r   )r   r   r   r   r   )opr|   r}   assert_equal_fnr   expectedr   r   r   r   r   actualr   r   r(   s                 @r   check_all_permutationsr   [  s+   )++MCr4"6""H7fc8TT < <QWN*46N	R0Z00FF  	 	 	,B#9 B B%=B B B       		7 	7 	7 	7 	7 	00(;;;;9< <s   A  
A+
A&&A+c                 Z  	
 t                      \  	
	
fd} | |i |}t          ||          }t          ||          }	 
5   | |i |}d d d            n# 1 swxY w Y   n&# t          $ r}t          |           Y d }~nd }~ww xY w	fd} |t          ||          |           d S )Nc                 T    t          | t          j                  r |           n| S r   r   )r   r(   r   s    r   r   zcheck_with_mode.<locals>.wrap  s+    #-a#>#>Ess1hAEr   c                 6    t          |           r| j        n| S r   r   r   s    r   r   zcheck_with_mode.<locals>.unwrap  s    #As++2qvv2r   )r   r   r   r   )r   r|   r}   r   r   r   r   r   r   r(   r   s            @@r   check_with_moder     s[   )++MCF F F F F F r4"6""HD$DdF##F. 	) 	)R(((F	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)  . . .(--------.3 3 3 3 3 OHVV,,h77777s<   A& 	AA& AA& !A"A& &
B	0BB	c                     g }t          |           \  } }t          |          \  }}| |z   } | D ]9}t          |t          j                  s|j        r|                    |           :|S r   )r   r%   ro   r   rj   append)r|   r}   leaf_tensors
_args_spec_kwargs_specr   s         r   gather_leaf_tensorsr     s    L#D))D*'//FL&=D % %#u|,, 	 	%$$$r   c                 v   |	 | |i |}n || g|R i |}| ||          }t          j        |          }d |D             }d |D             }t          |          dk    sJ d |D             }t          ||          }	t          |	          dk    sJ t          j                            ||	|dd          S )Nc                 F    g | ]}t          |t          j                  |S rl   r   r   r~   s     r   r   z*compute_expected_grads.<locals>.<listcomp>  s)    KKK!z!U\/J/JKAKKKr   c                      g | ]}|j         	|S rl   rj   r   s     r   r   z*compute_expected_grads.<locals>.<listcomp>  s    DDDqAODDDDr   r   c                 Z    g | ](}t          j        |j        |j        |j                   )S )r    r   ro   onesr!   r    r   r   s     r   r   z*compute_expected_grads.<locals>.<listcomp>  s/    \\\QUZ@@@\\\r   Tallow_unusedretain_graph)r   tree_leavesr   r   ro   autogradgrad)
r   r|   r}   output_process_fn_gradgradcheck_wrapperresultsflat_resultsflat_diff_resultsgradsr   s
             r   compute_expected_gradsr    s    "d%f%%##B888888)((11%g..LKK|KKKLDDLDDD !!A%%%%\\J[\\\E&tV44L|q    >0,$4d  L L Lr   r   c                 P   t                      \  }t          | ||||          }t          |||          D ]l}|\  }	}
}}t          |	|
          }t	          |          dk    sJ 	 |	 | |	i |
}n || g|	R i |
}| ||          }n.# t
          $ r!}t          |d| d| d           Y d }~nd }~ww xY wt          j        |          }d |D             }d |D             }t	          |          dk    sJ d |D             }t          ||          D ]\  }}	 t          j                            |||dd	          }n1# t
          $ r$}t          |d| d| d
| d           Y d }~nd }~ww xY wfd} |t          t          ||                    |d           nd S )Nr   r   r   r   c                 F    g | ]}t          |t          j                  |S rl   r   r   s     r   r   z*check_backward_formula.<locals>.<listcomp>  s)    OOOa:a3N3NOOOOr   c                      g | ]}|j         	|S rl   r  r   s     r   r   z*check_backward_formula.<locals>.<listcomp>  s    HHH1HQHHHr   c                 Z    g | ](}t          j        |j        |j        |j                   )S r  r  r   s     r   r   z*check_backward_formula.<locals>.<listcomp>  s?     - - - AGAHAGDDD - - -r   Tr  z
- wrapped_grads: c                 6    t          |           r| j        n| S r   r   r   s    r   r   z&check_backward_formula.<locals>.unwrap  s    !+As!3!3:qvv:r   	equal_nan)r   r  r   r   r   r   r   r   r
  r   ro   r  r  r   map)r   r|   r}   r  r  r   r   r   r   r   r   r   r   r   r  r   r  r  r  flat_new_gradswhich_grad_is_batchedr   r   r(   s                          @r   check_backward_formular    s    *++MC%b$8NPabbH7fc8TT ,R ,RQWN*46N*8Z@@<  1$$$$	 ("h5*55++BHHHHZHH%10099 	 	 	,B#9 B B%=B B B       	 )'22OO<OOOHHHHH$%%))))- -+- - -5NuVY[c5d5d 	R 	R1N1
,,->n:>T - S S     0B'= B B)AB B(=B B B       ; ; ; ; ; OE#ff"5"566DQQQQQ!	R9,R ,Rs0   ($B
B8B33B8$E
E2E--E2c                 z    !" t          d          \  }fd t           fd|D                       }t          |          \  }}t           fd|D                       }	t          |	|          }
t	          j                    5  d  fd} |||||
          }t          t          j        |          }t          d |d	 
          }t          d |d 
          }t          |||          D ](}|\  }}}}t          ||
|          D ]
}|\  }!}}t          t          t          ||                              }!fd|                                D             }	 	  |i |}n  g|R i |}n4# t          $ r'}t          |d| d| d| d| d	           Y d }~nd }~ww xY wfd"t          t          j        |          }t          "fd|d 
          }t          "fd|d 
          } |||d            |||d           *	 d d d            d S # 1 swxY w Y   d S )NF)r   c                     t          |           usJ t          | t          j                  r| j        rt          j        |           S t          |           rd | D             S d S )Nc                 H    g | ]}|j         rt          j        |          nd  S r   )rj   ro   
randn_like)r   r   s     r   r   zCcheck_forward_ad_formula.<locals>.maybe_tangent.<locals>.<listcomp>  s/    PPP1?DE$Q'''PPPr   )rn   r%   ro   r   rj   r"  r   )r,   r(   s    r   maybe_tangentz/check_forward_ad_formula.<locals>.maybe_tangent  sv    Awwc!!!! a&& 	Q1? 	Q#A&&&1 	QPPaPPPPtr   c              3   .   K   | ]} |          V  d S r   rl   r   r   r#  s     r   r   z+check_forward_ad_formula.<locals>.<genexpr>  s-      <<s++<<<<<<r   c              3   .   K   | ]} |          V  d S r   rl   r%  s     r   r   z+check_forward_ad_formula.<locals>.<genexpr>  s-      JJsc 2 2JJJJJJr   c                    | \  }}t          |t          j                  r.|j        r't	          j        |                                |          S t          |          r't          d t          ||          D                       S |S )Nc              3   r   K   | ]2\  }}|'t          j        |                                |          n|V  3d S r   )fwAD	make_dualr5   )r   pritangs      r   r   zDcheck_forward_ad_formula.<locals>.maybe_make_dual.<locals>.<genexpr>  sc       D D!*d DHCST^CJJLL$???Y\ D D D D D Dr   )
r%   ro   r   rj   r)  r*  r5   r   r   r   )dualprimaltangents      r   maybe_make_dualz1check_forward_ad_formula.<locals>.maybe_make_dual  s     #OFG&%,// DF4H D~fmmoow???v&& D D D.1&'.B.BD D D D D DMr   c           	          t          t          t          | |                              }fd|                                D             } |i |S  g|R i |S )Nc                 >    i | ]\  }}| ||         f          S rl   rl   )r   kvr0  tangent_kwargss      r   
<dictcomp>zKcheck_forward_ad_formula.<locals>.compute_expected_grad.<locals>.<dictcomp>#  s3    ___1OOQq0A,BCC___r   )r   r  r   r'   )	r|   tangent_argsr}   r5  op_args	op_kwargsr  r0  r   s	      `  r   compute_expected_gradz7check_forward_ad_formula.<locals>.compute_expected_grad!  s    CT<1H1HIIJJG_____PVP\P\P^P^___I (r70i000$$R?'???Y???r   c                     | j         S r   r.  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>,  s    ah r   c                 8    t          |           t          j        u S r   rn   r)  UnpackedDualTensorr   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>.      d1gg)@@ r   )is_leafc                     | j         S r   r/  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>1  s    ai r   c                 8    t          |           t          j        u S r   r>  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>3  r@  r   c                 >    i | ]\  }}| ||         f          S rl   rl   )r   r3  r4  r0  new_tang_kwargss      r   r6  z,check_forward_ad_formula.<locals>.<dictcomp>@  s4    hhhTQPQQOA4F0G H Hhhhr   r   r   z
- wrapped_tangent_args: z
- wrapped_tangent_kwargs: r   c                 6    t          |           r| j        n| S r   r   r   s    r   r   z(check_forward_ad_formula.<locals>.unwrapQ  s    %/3%7%7>166Q>r   c                 $     | j                   S r   r<  r   r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>V  s    ffQX.. r   c                 8    t          |           t          j        u S r   r>  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>X      d1gg1H&H r   c                 $     | j                   S r   rC  rI  s    r   r   z*check_forward_ad_formula.<locals>.<lambda>[  s    ffQY// r   c                 8    t          |           t          j        u S r   r>  r   s    r   r   z*check_forward_ad_formula.<locals>.<lambda>]  rK  r   Tr  )r   r   r   r   r)  
dual_levelr   unpack_dualr   r  r   r'   r   r   )#r   r|   r}   r  r   r   r7  r   r   flat_tangent_kwargsr5  r:  r   expected_primalsexpected_tangentsr   r   r   r   r   tang_choicenew_tang_argswhich_tang_args_are_wrappedwhich_tang_kwargs_are_wrappedr8  r9  r   r   actual_primalsactual_tangentsr(   r0  r#  rF  r   s#   `  `                          @@@@@r   check_forward_ad_formularY    s7   )EJJJMC     <<<<t<<<<<L$V,,KJJJJkJJJJJ#$7>>N			 KT KT		 		 			@ 	@ 	@ 	@ 	@ 	@ 	@ )(|V^TTD,h77#@@
 
 

 %@@
 
 
 <D&#xXX )	T )	TFU[RHj"8:R  E\Sacfhpqq %T %TQ\O/1NOS=5Q5Q R RSShhhhhU_UeUeUgUghhh	(0!#W!:	!:!:!2!22!M!M!M!M9!M!M#   4W+A W W-EW W3NW W 6SW W W       ? ? ? ? ? "$"2F;;!)....HH" " "
 #+////HH# # #
  0@DQQQQ1BdSSSSSK%T	)	TEKT KT KT KT KT KT KT KT KT KT KT KT KT KT KT KT KT KTs>   CH0+FH0
F4	F/	*H0/F4	4A.H00H47H4)T)r   )NN)NNN)*ro   r   r   torch.utils._python_dispatchr   torch.utils._pytreer   r   r   torch.utilsr   r   	functoolsr	   torch.utils._mode_utilsr
   r   torch.autograd.forward_adr  
forward_adr)  typingr   ra   r   r*   rS   r]   rd   r   r   r   r   r   r   r   r   r   r   r  r  rY  rl   r   r   <module>rb     sP              : : : : : : F F F F F F F F F F ) ) ) ) ) )       > > > > > > > > ( ( ( ( ( ( ( ( (       					2 	2 	2Q Q Q$ $ $P
 
 
  XD XD XD XDt  * * *E E E&	- 	- 	-	U 	U 	U   ,< < <Z8 8 8,
 
 
L L L L: 37CG3R 3Rx 3R 3R 3R 3Rx]T ]T ]T ]T ]T ]T ]T ]Tr   