
    {YhB                        U d 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 ddlmZmZmZmZmZmZ ddlmZ ddlmZ ddlZddlmZ ddlmZ dd	lmZ d
dlm Z m!Z!m"Z"m#Z# d
dl$m%Z%m&Z&m'Z'm(Z( d
dl)m*Z*m+Z+m,Z, d
dl
m-Z-m.Z.m/Z/ d
dl0m1Z1 dZ2ee
j3                 e4d<   	 ddl5Z2n# e6$ r dZ2Y nw xY we!j7        Z7dZ8 ej9        e:          Z; ed          Z<deej=                 deej=                 fdZ>de?de?fdZ@d ZAdejB        jC        dedededeDe         f
dZEdedeFfdZGedej=        dej=        fd             ZHedeeDe         eIed!f         eJeef         f         deKfd"            ZHdedeej=        eKf         fd#ZHde?fd$ZLdqde?d&e
jM        d'e?ddfd(ZNdd)d*e.d+eOd,ed-ed.eOde-fd/ZP G d0 d1          ZQ G d2 d3          ZR G d4 d5          ZS G d6 d7          ZT G d8 d9          ZUd&e?de?fd:ZVd&e?de?fd;ZWd<e?de?fd=ZXd&e?de?fd>ZY	 	 	 drd?ed@ed!ef         dAeOdBeeO         dCeeO         dDeOddfdEZZdFej[        deDej=                 ded!ef         fdGZ\	 	 dsdJeKdKeKdLeFdMeKde?f
dNZ]ej^        dOdfdPeeO         dQeeO         dRej_        dSee?ej`        f         dTeOdej=        fdUZa edV          ZbdeFfdWZcd@ee<ebf         dXedee<ebf         fdYZdddZ d[d\eed]e?d^e?dXed_ee?         d`eed!ef         ged!ef         f         deefdaZfd@ee<ebf         dee<ebf         fdbZgd@ee<ebf         dee<ebf         fdcZhd@ee<ebf         dee<ebf         fddZid@ee<ebf         dee<ebf         fdeZjd@ee<ebf         dee<ebf         fdfZkd@ee<ebf         dee<ebf         fdgZld@ee<ebf         dee<ebf         fdhZmd@ee<ebf         dee<ebf         fdiZndtdkeFddfdlZodmee<ebf         dne<jp        doe<jq        debfdpZrdS )ua1  Testing utilities and infrastructure for Dynamo.

This module provides a comprehensive set of testing utilities including:
- Test result collection and validation
- Graph manipulation and comparison tools
- Test case management and execution helpers
- Specialized test decorators for different Python versions and features
- RNG state management
- Compilation counting and monitoring
- Debug utilities for bytecode transformation

The utilities in this module are used across Dynamo's test suite to ensure
consistent testing patterns and proper test isolation.
    N)Sequence)AnyCallableOptionaloverloadTypeVarUnion)	ParamSpec)patch)fx)	aot_eager)OutputGraph   )config
eval_frameoptimize_assertreset)create_instructiondebug_checksis_generatortransform_code_object)CheckFunctionManager	CompileIdGuardedCode)ConvertFrameReturnDynamoFrameTypewrap_guarded_code)samenp   _Pxreturnc                     | d S |                                                                                      | j                  S N)detachclonerequires_grad_requires_gradr"   s    g/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/torch/_dynamo/testing.pyclone_mer,   ?   s6    yt88::,,Q_===    namec                 .    t          j        dd|           S )Nz^_orig_mod[.] resub)r.   s    r+   remove_optimized_module_prefixr4   E       6"B---r-   c                     ddl m d d fd}  t          j        |d          |           |i | j        fS )Nr   )InstructionTranslatorc                 H    |                                  j        j        | S r%   )
current_txoutputregion_tracker)_gmargskwargsr7   gmr;   s      r+   extract_graph_backendz8extract_graph_and_tracker.<locals>.extract_graph_backendO   s&     .99;;BQ
r-   T)backend	fullgraph)torch._dynamo.symbolic_convertr7   torchcompilegraph)fnr=   r>   r@   r7   r?   r;   s       @@@r+   extract_graph_and_trackerrH   I   s    DDDDDD	BN       E@EM/4@@@DDdUfUUU8^##r-   model
predictionlossexample_inputsc                 J   g }|                     |           |                     |           i }i }|                                 D ]_\  }}t          | t          j                  rt          |          }|}	|j        }
|j        t          j        |          }
|
||dz   <   |	||<   `|                     |           |                     |           i }| 	                                D ]3\  }}t          | t          j                  rt          |          }|||<   4|                     |           |D ]r}t          |t          t          f          r |                    d |D                        >t          |t          j                  r|                     |j                   s|S )Nz.gradc              3   X   K   | ]%}t          |t          j                  |j        V  &d S r%   )
isinstancerD   Tensorgrad).0inps     r+   	<genexpr>z"collect_results.<locals>.<genexpr>{   s5      XX*S%,:W:WX38XXXXXXr-   )appendnamed_parametersrO   r   OptimizedModuler4   rQ   rD   
zeros_likenamed_bufferstuplelistextendrP   )rI   rJ   rK   rL   resultsgradsparamsr.   param
param_copyrQ   buffersbufferexamples                 r+   collect_resultsre   Z   s    GNN:NN4 EF--// 	" 	"eeZ788 	81$77D
z:#E**D $dWn!tNN5NN6G++--  feZ788 	81$77DNN7! - -gt}-- 	-NNXXwXXXXXXX'5<00 -w|,,,Nr-   outc                    t          | t          j                  r| j        S t          | t          t
          f          rt          d | D                       S | dS t          | t                    rdS t          dt          |                     )Nc              3   4   K   | ]}t          |          V  d S r%   )requires_bwd_passrR   r"   s     r+   rT   z$requires_bwd_pass.<locals>.<genexpr>   s+      55A$Q''555555r-   FDon't know how to reduce)
rO   rD   rP   r)   r[   rZ   anyintNotImplementedErrortyperf   s    r+   ri   ri      s    #u|$$   	C$	'	' 55555555	u	C		 u
8$s))
D
DDr-   c                     d S r%    rp   s    r+   reduce_to_scalar_lossrs      s    >Acr-   .c                     d S r%   rr   rp   s    r+   rs   rs      s	     Cr-   c                    t          | t          j                  r)|                                 |                                 z  S t          | t
          t          f          r)t          d | D                       t          |           z  S t          |           j	        dv rt          | j                  S t          |           j	        dk    r| j                                        S t          | t                    rMt          d |                                 D                       t          |                                           z  S t!          dt          |                     )z/Reduce the output of a model to get scalar lossc              3   4   K   | ]}t          |          V  d S r%   rs   rj   s     r+   rT   z(reduce_to_scalar_loss.<locals>.<genexpr>   s+      99(++999999r-   )MaskedLMOutputSeq2SeqLMOutput!CausalLMOutputWithCrossAttentionsSquashedNormalc              3   4   K   | ]}t          |          V  d S r%   rw   )rR   values     r+   rT   z(reduce_to_scalar_loss.<locals>.<genexpr>   s+      JJE(//JJJJJJr-   rk   )rO   rD   rP   sumnumelr[   rZ   lenro   __name__rs   logitsmeandictvalueskeysrn   rp   s    r+   rs   rs      s1   #u|$$ 
wwyy399;;&&	C$	'	' 
99S99999CHHDD	c	   
 

 %SZ000	c	/	/	/x||~~	C		 
JJSZZ\\JJJJJSHHJJN
 N
 
 	
 8$s))
D
DDr-   c                      t           j                            t           j                            t                    d          } t           j                            |           st          j        |            | S )Nz../debug)ospathjoindirname__file__existsmkdir)r   s    r+   	debug_dirr      sM    7<<11:>>D7>>$ 
Kr-   r0   codeextrac           	      x   t          t          j                            t	                      |           d          5 }|                    t          j        |                                           dt          j        |                                           d| d           d d d            d S # 1 swxY w Y   d S )Nwz


)	openr   r   r   r   writedisBytecodeinfo)r.   r   r   fds       r+   
debug_dumpr      s    	bgll9;;--s	3	3 
r
|D!!&&((UUcl4.@.@.D.D.F.FUUEUUU	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   A'B//B36B3)skipframe
cache_sizehooks_r   c                   dt           t                   dt          ddfd}t          j        j                                        }t          j        j                            d          5  |5  t          | j                  r&t                      cddd           cddd           S t          | j                   t          | j        |          }t          i dddddd	it                      t                      | j        g d
          }t          t!          |t#          | j        |          j        t'          d	d	                              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 )zused to debug jump updatesinstructionscode_optionsr#   Nc                     |                      dt          d                     |                      dt          d                     d S )Nr   NOP)insertr   )r   r   s     r+   insert_nopsz&debug_insert_nops.<locals>.insert_nops   sF    A1%88999A1%8899999r-   debug_insert_nopsF_idr   )r   compiler_fnroot_txexportexport_constraintsframe_statelocal_scopeglobal_scopef_codetorch_function_mode_stackpackage)frame_idframe_compile_id)r[   r   rD   _dynamoutilsget_metrics_contextdynamo_timedr   r   r   r   r   r   localsglobalsr   r   r   guard_managerr   )	r   r   r   r   r   r   metrics_contextr   rF   s	            r+   r   r      sT   
:$s) :3 :4 : : : : m)==??O			)	)*=	>	> 
 
 
 
%% 	(%''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 	U\"""$U\;??#
 <&(
 
 
 !$U\599G1q999 
 
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sC   'E<*"E$E<%B&E$E<$E(	(E<+E(	,E<<F F c                   l    e Zd Zd	dZdej        j        deej                 de	de
f         fdZd	dZdS )
CompileCounterr#   Nc                 "    d| _         d| _        d S Nr   frame_countop_countselfs    r+   __init__zCompileCounter.__init__       r-   r?   rL   .c                     | xj         dz  c_         |j        j        D ]}d|j        v r| xj        dz  c_        |j        S )Nr   call)r   rF   nodesopr   forward)r   r?   rL   nodes       r+   __call__zCompileCounter.__call__   sQ     	AHN 	# 	#D  "zr-   c                 "    d| _         d| _        d S r   r   r   s    r+   clearzCompileCounter.clear   r   r-   r#   N)r   
__module____qualname__r   rD   r   GraphModuler[   rP   r   r   r   r   rr   r-   r+   r   r      s}           (&8<U\8J	#s(	        r-   r   c                   t    e Zd ZdeddfdZdej        j        deej	                 de
def         fdZd
d	ZdS )CompileCounterWithBackendrA   r#   Nc                 >    d| _         d| _        || _        g | _        d S r   )r   r   rA   graphs)r   rA   s     r+   r   z"CompileCounterWithBackend.__init__   s#    24r-   r?   rL   .c                     ddl m} | xj        dz  c_        |j        j        D ]}d|j        v r| xj        dz  c_        | j                            |             || j	                  ||          S )Nr   )lookup_backendr   )
backends.registryr   r   rF   r   r   r   r   rU   rA   )r   r?   rL   r   r   s        r+   r   z"CompileCounterWithBackend.__call__   s     	655555AHN 	# 	#D  "2+~~dl++B???r-   c                 0    d| _         d| _        g | _        d S r   )r   r   r   r   s    r+   r   zCompileCounterWithBackend.clear
  s    r-   r   )r   r   r   strr   rD   r   r   r[   rP   r   r   r   r   rr   r-   r+   r   r      s        5 5 5 5 5 5
@(&
@8<U\8J
@	#s(	
@ 
@ 
@ 
@     r-   r   c                   d    e Zd ZddZdej        j        deej                 de	de
f         fdZdS )	EagerAndRecordGraphsr#   Nc                     g | _         d S r%   )r   r   s    r+   r   zEagerAndRecordGraphs.__init__  s    24r-   r?   rL   .c                 D    | j                             |           |j        S r%   )r   rU   r   )r   r?   rL   s      r+   r   zEagerAndRecordGraphs.__call__  s"     	2zr-   r   r   r   r   r   rD   r   r   r[   rP   r   r   r   rr   r-   r+   r   r     si        5 5 5 5(&8<U\8J	#s(	     r-   r   c                   d    e Zd ZddZdej        j        deej                 de	de
f         fdZdS )	AotEagerAndRecordGraphsr#   Nc                 0    g | _         g | _        g | _        d S r%   )r   	fw_graphs	bw_graphsr   s    r+   r   z AotEagerAndRecordGraphs.__init__  s    245757r-   r?   rL   .c                 f     j                             |           dt          j        j        dt
          t          j                 dt          dt          f         f fd}dt          j        j        dt
          t          j                 dt          dt          f         f fd}t          ||||          S )Nr?   rL   r#   .c                 F    j                             |            | j        S r%   )r   rU   r   r?   rL   r   s     r+   fw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.fw_compiler(  #     N!!"%%%:r-   c                 F    j                             |            | j        S r%   )r   rU   r   r   s     r+   bw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.bw_compiler.  r   r-   )r   r   )
r   rU   rD   r   r   r[   rP   r   r   r   )r   r?   rL   r   r   s   `    r+   r   z AotEagerAndRecordGraphs.__call__#  s     	2	$	6:5<6H	c3h	 	 	 	 	 		$	6:5<6H	c3h	 	 	 	 	 	 ##	
 
 
 	
r-   r   r   rr   r-   r+   r   r     si        8 8 8 8

(&
8<U\8J
	#s(	
 
 
 
 
 
r-   r   c                       e Zd ZddZd ZdS )InductorAndRecordGraphsr#   Nc                 "    g | _         g | _        d S r%   )r   inductor_graphsr   s    r+   r   z InductorAndRecordGraphs.__init__=  s    24;=r-   c                      dd l mc m}  j                            |           |j         fd}t          j        |d|          5  |                    ||          cd d d            S # 1 swxY w Y   d S )Nr   c                  T    j                             | d                     | i |S r   )r   rU   )r=   r>   old_compile_fx_innerr   s     r+   patchedz1InductorAndRecordGraphs.__call__.<locals>.patchedH  s4     ''Q000''8888r-   _compile_fx_inner)new)torch._inductor.compile_fx	_inductor
compile_fxr   rU   r   r   object)r   r?   rL   compile_fx_modr   r   s   `    @r+   r   z InductorAndRecordGraphs.__call__A  s   ;;;;;;;;;2-?	9 	9 	9 	9 	9 	9 \.*=7KKK 	A 	A!,,R@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   
A--A14A1r   )r   r   r   r   r   rr   r-   r+   r   r   <  s<        > > > >A A A A Ar-   r   c                 .    t          j        dd|           S )Nz(?m)^ *#.*\n?r0   r1   r   s    r+   strip_commentr  P  r5   r-   c                 f    d                     d |                     d          D                       S )Nr   c                 6    g | ]}|                                 S rr   )rstrip)rR   lines     r+   
<listcomp>z)remove_trailing_space.<locals>.<listcomp>U  s     AAAdkkmmAAAr-   )r   splitr   s    r+   remove_trailing_spacer  T  s/    99AA

40@0@AAABBBr-   gm_strc                 :    t          t          |                     S r%   )r  r  )r	  s    r+   normalize_gmr  X  s     !v!6!6777r-   c                 2    t          j        dd|           }|S )z-
    Normalize code: remove empty lines.
    z[\r\n]+r   r1   )r   normal_codes     r+   empty_line_normalizerr  ^  s     &T400Kr-   r   rG   nargsexpected_opsexpected_ops_dynamicexpected_frame_countc                    t           j        s||}t                      }d t          |          D             }d t          |          D             } || }	 || }
t	                        t          |          |          } || } || } || } || }t	                       |                     t          ||	                     |                     t          ||	                     |                     t          ||
                     |                     t          ||
                     |                     |j	        |           ||                     |j
        |           d S d S )Nc                 8    g | ]}t          j        d d           S 
   rD   randnrR   r   s     r+   r  z!standard_test.<locals>.<listcomp>s  $    777QU[R  777r-   c                 8    g | ]}t          j        d d           S r  r  r  s     r+   r  z!standard_test.<locals>.<listcomp>t  r  r-   )r   assume_static_by_defaultr   ranger   r   
assertTruer   assertEqualr   r   )r   rG   r  r  r  r  actualargs1args2correct1correct2opt_fnval1aval2aval1bval2bs                   r+   standard_testr*  f  sx    * ,/C/O+F77%,,777E77%,,777Er5zHr5zH	GGG$_V$$R((FFENEFENEFENEFENE	GGGOOD))***OOD))***OOD))***OOD))***V')=>>>,77777  r-   r?   c                     | j         S r%   )r   )r?   rL   s     r+   dummy_fx_compiler,    s     :r-   T皙?speeduppvalue
is_correctpvalue_thresholdc                 4    |sdS ||k    r| ddS | dd|dS )NERRORz.3fzx SAMEzx p=z.2frr   )r.  r/  r0  r1  s       r+   format_speedupr4    sI      w   %%%%%+++v++++r-   cpusizestridedtypedevice
extra_sizec                 z   t          d t          | |          D                       dz   |z   }|j        rZ|j        dk    r7	 t	          j        |t          j        |                              |          }n0t	          j        |||          }nt	          j        |g||          }t	          j	        || |          S )Nc              3   ,   K   | ]\  }}|d z
  |z  V  dS )r   Nrr   )rR   shaper7  s      r+   rT   zrand_strided.<locals>.<genexpr>  s/      HH]UFUQY& HHHHHHr-   r   )r8  r9  )r8  )r6  r8  r9  )
r~   zipis_floating_pointitemsizerD   r  float16tozeros
as_strided)r6  r7  r8  r9  r:  needed_sizerc   s          r+   rand_stridedrF    s     	HHc$6G6GHHHHH
	
	 
  M>Q [EM&QQQTT U  FF [E&IIIFF;-uVLLLFD&111r-   _Tc                      t           j         S r%   )r   r  rr   r-   r+   check_dynamic_shape_capturerI    s    ...r-   patchesc                      t          j                   dt          j        dt          j        dt
          f fd            }|S )Nr=   r>   r#   c            	          t          j                    5 }D ]/\  }}}|                    t          j        |||                     0 | i |cd d d            S # 1 swxY w Y   d S r%   )
contextlib	ExitStackenter_contextr   r   )r=   r>   stackmoduleattrvalrG   rJ  s         r+   _fnz"_make_fn_with_patches.<locals>._fn  s    !## 	'u%, E E!c##ELs$C$CDDDD2t&v&&		' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   :AA #A )	functoolswrapsr!   r=   r>   rG  )rG   rJ  rT  s   `` r+   _make_fn_with_patchesrW    s\    _R'27 'bi 'B ' ' ' ' ' ' ' Jr-   c                     | S r%   rr   r*   s    r+   <lambda>rY    s    a r-   )
xfail_prop	decoratorcls
cls_prefix	fn_suffixrZ  r[  c          	      <   t          | | j         | j        i           }|j        |_        t	          |           D ]}|                    d          rt          | |          }t          |          s t          ||t          | |                     V| | }	t          |g|R  }
|	|
_        |$t          ||          rt          j        |
          }
t          ||	 ||
                     t          ||          st          ||t          | |                     |S )Ntest_)ro   r   	__bases__r   dir
startswithgetattrcallablesetattrrW  hasattrunittestexpectedFailure)r\  r]  r^  rZ  r[  rJ  DummyTestClassr.   rG   new_namenew_fns              r+   make_test_cls_with_patchesrm    s9    Z777KKN"0"9NC > >??7## 	>d##BB<< gc4.@.@AAA+	++H*28888F&FO%'"j*A*A%!1&99NHii.?.?@@@@.. 	>ND'#t*<*<===r-   c                 N    t           j        dk    r| S t          j        |           S )N)r       sysversion_inforh  r   rG   s    r+   skipIfNotPy311rt    s%    
7""	=r-   c                 `    t           j        dk    r| S  t          j        d          |           S )Nr       zRequires Python 3.12+rp  rs  s    r+   skipIfNotPy312rx    s0    
7""	18=011"555r-   c                 N    t           j        dk    rt          j        |           S | S )Nrv  )rq  rr  rh  ri  rs  s    r+   xfailIfPy312rz    s&    
7""'+++Ir-   c                 `    t           j        dk    r t          j        d          |           S | S )Nrv  zNot supported in Python 3.12+rp  rs  s    r+   skipIfPy312r|    s0    
7""=x}<==bAAAIr-   c                 `    t           j        dk    r| S  t          j        d          |           S )N)r    r  zRequires Python 3.10+rp  rs  s    r+   requiresPy310r~    s0    
7""	5x}455b999r-   c                     d| _         | S NT)_expected_failure_dynamicrs  s    r+   expectedFailureDynamicr  
  s    #'B Ir-   c                     d| _         | S r  )!_expected_failure_codegen_dynamicrs  s    r+   expectedFailureCodegenDynamicr        +/B(Ir-   c                     d| _         | S r  )!_expected_failure_dynamic_wrapperrs  s    r+   expectedFailureDynamicWrapperr    r  r-   Fuse_xlac                 &   t          j        d           t          j        d           t          rt          j                            d           | r@dd lmc m} |                    dt          |
                                                     d S d S )Ni9  r   )rD   manual_seedrandomseedr   torch_xla.core.xla_modelcore	xla_modelset_rng_stater   
xla_device)r  xms     r+   reset_rng_stater    s    	d
K	 
	t 5---------
s2==??33444445 5r-   fr=   r>   c                      | |i |S r%   rr   )r  r=   r>   s      r+   &_skipped_function_for_test_reconstructr  &  s     1dfr-   )r0   )NNr   )Tr-  )F)s__doc__rM  r   rU  loggingos.pathr   r  r2   rq  typesrh  collections.abcr   typingr   r   r   r   r   r	   typing_extensionsr
   unittest.mockr   rD   r    torch._dynamo.backends.debuggingr   torch._dynamo.output_graphr   r0   r   r   r   r   bytecode_transformationr   r   r   r   guardsr   r   r   r   r   r   r   r   r   
ModuleType__annotations__numpyModuleNotFoundErrorunsupportedthree	getLoggerr   logr!   rP   r,   r   r4   rH   nnModuler[   re   boolri   rs   rZ   r   floatr   CodeTyper   rm   r   r   r   r   r   r   r  r  r  r  r*  r   r,  r4  float32r8  r9  rF  rG  rI  rW  ro   rm  rt  rx  rz  r|  r~  r  r  r  r  r=   r>   r  rr   r-   r+   <module>r     sI
         



        				 



   $ $ $ $ $ $ D D D D D D D D D D D D D D D D ' ' ' ' ' '              6 6 6 6 6 6 2 2 2 2 2 2 8 8 8 8 8 8 8 8 8 8 8 8            A @ @ @ @ @ @ @ @ @ I I I I I I I I I I       "&HU % % %   	BBB $	g!!Yt__>& >8EL+A > > > >. . . . . .$ $ $"%8?%(+%36%HK%	#Y% % % %P	E3 	E4 	E 	E 	E 	E 
 Au| A A A A 
 A 
	tCy%S/4S>9	:
   

Es EuU\5-@'A E E E E,3    
 
S 
 
s 
D 
 
 
 
 QR%
 %
 %
%
(+%
47%
<?%
JM%
%
 %
 %
 %
P       &       6       
 
 
 
 
 
 
 
>A A A A A A A A(. . . . . .C C C C C C8 8 8 8 8 8      #'*. !8 8
8c8 8 3-	8
 #3-8 8 
8 8 8 8B
(,U\(:c3h    !	
, 
,
,
, 
, 	
,
 	
, 
, 
, 
,  ',2 2
3-2SM2 ;2 #u|#$	2
 2 \2 2 2 28 WT]]/T / / / /
	hr2v. 	# 	(2r6BR 	 	 	 	" !%DOK  	  	
  #s(+,hsCx.@@A 
   >xB' HRV,<    6xB' 6HRV,< 6 6 6 6Xb"f% (2r6*:    HRV$ "b&)9    :hr2v& :8BF+; : : : :xB/ HRV4D    hr2v&6 8BF;K    hr2v&6 8BF;K    
5 5T 5d 5 5 5 5B "359     s   )B. .B87B8