
    eCiX                     	   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m
Z
 ddlmZ ej        dk     r3 edej         dej         d	ej        
            ej        d           ddlmZ  eej                            dd                    Z eej                            dd                    Zej        Zerej        Zn	erej        Z ej        de            ej                     ddl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'm(Z(m)Z)m*Z*m+Z+ ep# eej                            dd                    Z, e ej-        dd                    Z.dZ/dZ0dZ1da2da3 ej4        d          Z5 e"j6        ddd            e"j6        d            e"j6        d            e"j6        ddd            e"j6        d             e"j6        d!            e"j6        d"d#$            e"j6        d%d#&            e"j6        d'            e"j6        d(            e"j6        d)            e"j6        d*d#&            e"j6        d+            e"j6        d,            e"j6        d-            e"j6        d.            e"j6        d/            e"j6        d0            e"j6        d1            e"j6        d2            e"j6        d3d4           d5 Z7	 	 	 dpd6Z8d7 Z9d8 Z:g g fd9Z;dqd:Z<e)d;             Z=d< Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdB ZDe)dC             ZEdD ZFdE ZGdF ZHe) ejI                    dG                         ZJdH ZKe)dqdI            ZL ejI                    drdJ            ZMdK ZNdL ZOdM ZPdN ZQe)dO             ZRdP ZSdQ ZTdR ZUe)dS             ZVdT ZWdU ZXdV ZYdW ZZdX Z[dY Z\dZ Z]d[ Z^d\ Z_ ePd]          Z` ePd^          Za eOd_          Zb eOd`          Zc eOda          Zd eOdb          Ze eOdc          Zf eOdd          Zg eOde          Zh eOdf          Zi eOdg          Zj eOdh          Zk eOdi          Zl e'd!          Zm e'dj          Zn e'dk          Zo e'dl          Zp e'dm          ZqdndogZrdZs e_             dS )szfShared code specific to emscripten.  General purpose and low-level helpers belong instead in
utils.py.    N)PIPE   )ToolchainProfiler)   
   z1error: emscripten requires python 3.10 or above ( )file)colored_logger
EMCC_DEBUG0EMCC_LOGGING1z#%(name)s:%(levelname)s: %(message)s)formatlevel)cacheconfigdiagnosticsfilelock	tempfilesutils)settings)exe_path_from_rootexit_with_errormemoizepath_from_rootsafe_ensure_dirsEMCC_DEBUG_SAVEEMCC_VERBOSEF)   r   r      sharedzabsolute-paths)enabledpart_of_allz
almost-asmexperimentalzlegacy-settings	linkflagsemcc	undefinedT)error
deprecated)r#   version-checkzexport-mainzmap-unrecognized-librarieszunused-command-line-argumentzpthreads-mem-growth	transpilezlimited-postlink-optimizationsz	em-js-i64zjs-compilercompatibilityunsupportedzunused-mainclosure)r$   c                 n    | dk    sJ | dk     r#t          j        |            j        }d| d|  dS d|  S )Nr   z	received z (r	   z	returned )signalSignalsname)codesignal_names     0/b/s/w/ir/x/w/install/emscripten/tools/shared.pyreturncode_to_strr8   _   sS    		AXX.$'',K-{--d----	T		    c           
         |t           j                                        }g }i fd}t          j                    }t                      }d}d}	|	t          |           k     r|t          |           k     rt                    |k     r|r|                    |          }
nd}
t          rIt          
                    d|dz   t          |           d                    | |                   fz             t          | |                    t          j        | |         |
d||          }||<   |r|                    ||
j        f           |dz  }n |            }                    |          }|j        dk    rPt'          d|dz   t          |           t)          |j                  t+          j        | |                   fz             |	dz  }	|	t          |           k     |r#|                    d	 
           d |D             S dS )zRuns multiple subprocess commands.

  route_stdout_to_temp_files_suffix : string
    if not None, all stdouts are instead written to files, and an array
    of filenames is returned.
  Nc                  *   	                                  D ]\  } }|                                | c S t          t                                                               \  } }	 |                    d           | S # t
          j        $ r Y nw xY w)NTg?)timeout)itemspollnextitercommunicate
subprocessTimeoutExpired)idxproc	processess     r7   get_finished_processz4run_multiple_processes.<locals>.get_finished_process   s     ((  )#t99;;"*** # tIOO--..//ic4%%%
&   s   'A? ?BBr   zRunning subprocess %d/%d: %sr   r   )stdoutstderrenvcwdz+subprocess %d/%d failed (%s)! (cmdline: %s)c                     | d         S Nr    )xs    r7   <lambda>z(run_multiple_processes.<locals>.<lambda>   s
    ! r9   )keyc                     g | ]
}|d          S )r   rN   ).0rO   s     r7   
<listcomp>z*run_multiple_processes.<locals>.<listcomp>   s    ###QAaD###r9   )osenvironcopyr   get_num_coresget_temp_fileslengetDEBUGloggerdebugjoinprint_compiler_stagerB   Popenappendr4   pop
returncoder   r8   shlexsort)commandsrJ   !route_stdout_to_temp_files_suffixrK   std_outsrG   num_parallel_processes
temp_filesinum_completedrH   rE   rD   finished_processrF   s                 @r7   run_multiple_processesro   h   sx    	[
*//

C( )     !.00*!-H%%3x==S^^.DDD	*  ABB	 e3q1uc(mmSXXV^_`VaMbMb6ccddd8A;'''hqk&3TWXXXdil	* *FK()))1faa ! ""c"s++		$	)	)EqRUV^R_R_ar  tD  tO  bP  bP  RW  R\  ]e  fi  ]j  Rk  Rk  Il  l  	m  	m  	mqm- 	H%%0 ' $MMnnM%%%##(####$ $r9   c                 n   t          |            t          rdS 	 t          j        | g|R i |S # t          j        $ r@}t          dt          j        |           t          |j
                             Y d}~dS d}~wt          $ r.}t          dt          j        |           |           Y d}~dS d}~ww xY w)zILike `run_process` above but treat failures as fatal and exit_with_error.r   z'%s' failed (%s)Nz'%s' failed: %s)r`   SKIP_SUBPROCSr   run_processrB   CalledProcessErrorr   re   r_   r8   rd   OSError)cmdargskwes       r7   
check_callry      s    s 1;S.4...2...		& Z Z Z&
39J1<9X9XYYYYYYYYY	 ; ; ;%uz#:::::::::;s    / B45A99B4#B//B4c                 L    t          |            t          j        |            d S N)r`   r   exec)ru   s    r7   exec_processr}      s!    s*S/////r9   c                 R    t           j        |z   | gz   |z   }t          |fi |j        S )zExecute a javascript tool.

  This is used by emcc to run parts of the build process that are written
  implemented in javascript.
  )r   NODE_JSry   rH   )filenamejsargs	node_argsrw   commands        r7   run_js_toolr      s5     NY&(3f<'	G	"	"r	"	"	))r9   c                     t           j        rt          d| dz             g}nt          j        t          d|           gz   }t
          j                            |d                   s|rd S t          |  d           |S )Nznode_modules/.binz.cmdz` was not found! Please run "npm install" in Emscripten root directory to set up npm dependencies)	r   WINDOWSr   r   r   rU   pathexistsr   )r4   
missing_okru   s      r7   get_npm_cmdr      s    
] G-tf}==
>CC
.N+>EEF
FC	B	 	  A AT  A  A  A	*r9   c                     t           j                            t                    st	          dt          z             t          t          dgt                    } t          j        d| j	                  }|o|
                    d          S )N"clang executable not found at `%s`	--versionrH   z[Vv]ersion\s+(\d+\.\d+)r   )rU   r   r   CLANG_CCr   ry   r   researchrH   group)rE   ms     r7   get_clang_versionr      sm    		!	! E88CDDD	X{+D	9	9	9$i*DK88!	
	qwwqzzr9   c                     t                      } |                     dt          z            rdS dt          j        v r"|                     dt          dz   z            rdS t          j        ddt          | t                     dS )Nz%d.TBUILDBOT_BUILDNUMBERr   r,   zULLVM version for clang executable "%s" appears incorrect (seeing "%s", expected "%s")F)r   
startswithEXPECTED_LLVM_VERSIONrU   rV   r   warningr   )actuals    r7   check_llvm_versionr      s    &u4455 4 rz))"7!";<== To'~  AI  KQ  Sh  i  i  i	r9   c                     t           j                            t                    st	          dt          z             	 t          j        t          dgt                    j        } n,# t          j
        $ r t	          dt          z             Y nw xY wd| vrt	          dt          z             |                     d          d         S )Nr   z-print-targetsr   zHerror running `clang -print-targets`.  Check your llvm installation (%s)zRegistered Targets:zRerror parsing output of `clang -print-targets`.  Check your llvm installation (%s)r   )rU   r   r   r   r   r   rr   r   rH   rB   rs   split)target_infos    r7   get_clang_targetsr      s    		!	! E88CDDDk#X/?$@NNNUKK		& k k k^aiijjjjjk+--hkssttt			0	1	1!	44s   'A% %&BBc                     t                      } d| vrmt                              d           t          dt          j                   t          | t          j                   t          dt          j                   dS dS )Nwasm32zDLLVM has not been built with the WebAssembly backend, clang reports:zK===========================================================================r
   FT)r   r]   criticalprintsysrI   )targetss    r7   
check_llvmr      sz    'W
OOZ[[[	
W^a^hiiii	'
####	
W^a^hiiii5	r9   c                      t           j                            t          t          j                  t          u rt          j        d         nt          j                  S rM   )rU   r   dirnametyper   r   listrN   r9   r7   get_node_directoryr     s:    	d6>.B.Bd.J.J**PVP^	_	__r9   c                      t           j                                        } t                      t           j        z   | d         z   | d<   | S )NPATH)rU   rV   rW   r   pathsep)rJ   s    r7   env_with_node_in_pathr     s7    

#"$$rz1CK?#f+	*r9   c                 .   t          j        | dgz   t                    j                                        }|                    d          }|                    d          d                             d          }t          d |D                       }||fS )Nr   r   v-r   .c              3   4   K   | ]}t          |          V  d S r{   )intrS   r   s     r7   	<genexpr>z)_get_node_version_pair.<locals>.<genexpr>  s(      **Q#a&&******r9   )r   rr   r   rH   stripremoveprefixr   tuple)nodejsr   versions      r7   _get_node_version_pairr     s    V{m3DAAAHNNPP&$$'MM#q!'',,'**'*****'	r9   c                 ,    t          |           d         S )Nr   )r   )r   s    r7   get_node_versionr      s    		'	'	**r9   c                  4   	 t          t          j                  \  } }n.# t          $ r!}t	          j        dd|           Y d }~d S d }~ww xY w|t          k     r@d                    d t          D                       }t	          j        dd|  d| d           |S )Nr,   zcannot check node version: %sr   c              3   4   K   | ]}t          |          V  d S r{   )strr   s     r7   r   z%check_node_version.<locals>.<genexpr>-  s(      ==1A======r9   z&node version appears too old (seeing "z", expected "vz"))r   r   r   	Exceptionr   r   MINIMUM_NODE_VERSIONr_   )r   r   rx   expecteds       r7   check_node_versionr   $  s    ,V^<<OFGG	   )H!LLL
FFFFF ###xx==(<=====H)tRX)t)thp)t)t)tuuu	.s    
A
AA
c                 :    t          |           }|r	|dk     rdgS g S )N)r!   r   r   z--experimental-wasm-reftypesr   r   node_versions     r7   node_reference_types_flagsr   3  s/    !&)), lZ//*++Ir9   c                 h    t          |           }|r	|dk     rdgS |r|dk    rt          j        sdgS g S )N)   r   r   z--experimental-wasm-eh)r"   r   r   z--experimental-wasm-exnref)r   r   WASM_LEGACY_EXCEPTIONSr   s     r7   node_exception_flagsr   <  sR    !&)), &lZ//$%% *lj009X0())	)r9   c                 <    t          |           }|r
|dk     rddgS g S )N)   r   r   z--experimental-wasm-bulk-memoryz--experimental-wasm-threadsr   r   s     r7   node_pthread_flagsr   G  s2    !&)), lZ//-/LMMIr9   c                      	 t          j        t          j        ddgz   t                     d S # t
          $ r1} t          dt          j        t          j        |            Y d } ~ d S d } ~ ww xY w)Nz-ezconsole.log("hello")r   zUthe configured node executable (%s) does not seem to work, check the paths in %s (%s))r   rr   r   r   r   r   r   	EM_CONFIG)rx   s    r7   
check_noder   P  s    R	fn.D'EEdSSSSSS	 R R Rkmsm{  ~D  ~N  PQ  R  R  R  R  R  R  R  R  RRs   *. 
A)&A$$A)c                  :    t           j         dt          j         dS )N|
)r   EMSCRIPTEN_VERSIONr   	LLVM_ROOTrN   r9   r7   generate_sanityr   Y  s    $	;	;v'7	;	;	;;r9   c                 |   t                       t                       t                      }t          j                            d          rt                              d           d S | st                              d           |st          d           t                       t          j        d          5  t          t          fD ]^}t          j                            |          s=t          j                            |dz             st          d|t           j                   _	 d d d            d S # 1 swxY w Y   d S )NEM_IGNORE_SANITYz,EM_IGNORE_SANITY set, ignoring sanity checksz#(Emscripten: Running sanity checks)z2failing sanity checks due to previous llvm failurezsanity LLVMz.exez%cannot find %s, check the paths in %s)r   r   r   rU   rV   r[   r]   infor   r   r   profile_blockr   LLVM_ARr   r   r   r   )quietllvm_okru   s      r7   perform_sanity_checksr   ]  s}    LL'Z^^&'' 
KK>???
F	 7
KK5666	 JHIII,,,&}55 X X'" X XW^^C   Xf)E)E X?fFVWWWXX X X X X X X X X X X X X X X X X Xs   5A.D11D58D5c                      s%t           j                            d          dk    rdS dt           j        d<   t          rd t          j        r rt                     dS t           j                            d          rt                     dS t                      t          j	        d           fd} |            rdS t          j
        d          5   |            r	 ddd           dS t           j                                      rt          j                  }t                              d	|                                           t                              d
                                           t                              d           t          j                     nt                              d            t                       t          j                   ddd           dS # 1 swxY w Y   dS )a  Check that basic stuff we need (a JS engine to compile, Node.js, and Clang
  and LLVM) exists.

  The test runner always does this check (through |force|). emcc does this less
  frequently, only when ${EM_CONFIG}_sanity does not exist or is older than
  EM_CONFIG (so, we re-check sanity when the settings are changed).  We also
  re-check sanity and clear the cache when the version changes.
  EMCC_SKIP_SANITY_CHECKr   NTr   z
sanity.txtc                     d } t          j        t                    5  t          j                  } d d d            n# 1 swxY w Y   | k    r0t
                              d            rt                     dS dS )Nzsanity file up-to-date: TF)
contextlibsuppressr   r   	read_filer]   r^   r   )sanity_datar   forcer   sanity_files    r7   sanity_is_correctz'check_sanity.<locals>.sanity_is_correct  s    K 
	Y	'	' 1 1OK00k1 1 1 1 1 1 1 1 1 1 1 1 1 1 1hll;k;;<<< 
 %e$$$T5s   >AAsanityzold sanity: %sznew sanity: %sz,(Emscripten: config changed, clearing cache)zsanity file not found: )rU   rV   r[   r\   r   FROZEN_CACHEr   r   r   get_pathlockr   r   r   r   r]   r   r   eraser^   
write_file)r   r   r   r   r   r   s   ``  @@r7   check_sanityr   w  si    
 2:>>":;;sBB
F *-"*%&  E  #E"""
FZ^^&'' %   
F(|,,+          
Fz( , , , , , , , , , ,
 
w~~k"" <OK00kkk"K$5$5$7$7888kk"HNN$4$4555kk@AAAkmmmmll:[::;;; 
[(+++#, , , , , , , , , , , , , , , , , ,s   G>6C;G>>HHc                     |r| d|z   z  } t           j                            t          j                  }t          j        ||           S )Nr   )rU   r   
expanduserr   r   r   find_exe)toolsuffix	llvm_roots      r7   llvm_tool_path_with_suffixr     sB     C&LDg  !122)		4	(	((r9   c                 6    t          | t          j                  S r{   )r   r   LLVM_ADD_VERSIONr   s    r7   llvm_tool_pathr     s    	#D&*A	B	BBr9   c                 6    t          | t          j                  S r{   )r   r   CLANG_ADD_VERSIONr   s    r7   clang_tool_pathr    s    	#D&*B	C	CCr9   c                 j    |d         dk    sJ t           j        rt          j        | |          n| |z   S )Nr   r   )r   MINIMAL_RUNTIMEr   replace_suffix)r   
new_suffixs     r7   replace_or_append_suffixr    s>    	A#				7?7O	j	h
	3	3	3U]`jUjjr9   c                      t           s5t          j        dt                    a t          sd }  | t                      t           S )zGReturns a path to EMSCRIPTEN_TEMP_DIR, creating one if it didn't exist.emscripten_temp_)prefixdirc                 :      fd}t          j        |           d S )Nc                  0    t          j                    d S r{   )r   
delete_dir)ds   r7   
clean_tempzJget_emscripten_temp_dir.<locals>.prepare_to_clean_temp.<locals>.clean_temp  s    

1




r9   )atexitregister)r  r  s   ` r7   prepare_to_clean_tempz6get_emscripten_temp_dir.<locals>.prepare_to_clean_temp  s4    	 	 	 	 	 	
#####r9   )EMSCRIPTEN_TEMP_DIRtempfilemkdtempTEMP_DIR
DEBUG_SAVE)r  s    r7   get_emscripten_temp_dirr    sT     
 
1"*2D(SSS 1$ $ $ /000	r9   c                     t           j                            t                      t           j                            |                     S r{   )rU   r   r_   r  basenamer4   s    r7   in_tempr    s/    	-//1A1A$1G1G	H	HHr9   c                 B    t           j                            | d          S )Nemscripten_temp)rU   r   r_   )temp_dirs    r7   get_canonical_temp_dirr"    s    	h 1	2	22r9   c                     d a t          j                            dt	          j                              at          j                            t                    st          dt           d           t          t                    at          rt          a 	 t          t                      n2# t          $ r%} t          dt          j        |            Y d } ~ nd } ~ ww xY wdt          j        vryt          j                            t           d          }t%          j        |          }dt          j        d<   |                                 t+          j        |j                   d S d S d S )NEMCC_TEMP_DIRzThe temporary directory `z<` does not exist! Please make sure that the path is correct.zJerror creating canonical temp dir (Check definition of TEMP_DIR in %s): %sEM_HAVE_TEMP_DIR_LOCKzemscripten.lockr   )r  rU   rV   r[   r  
gettempdirr  r   isdirr   r"  CANONICAL_TEMP_DIRr\   r   r   r   r   r_   r   FileLockacquirer  r  release)rx   filelock_namer   s      r7   setup_temp_dirsr-    sO   Z^^OX-@-B-BCC(	x	 	  xvvvvwww-h77
 $,y*++++ y y ybdjdtvwxxxxxxxxy bj00gll#68IJJm}--d,/bj()
llnnnodl#####)$ $ 10s   B( (
C2CCc                      t           r"t          j        t                      d          S t          j        t          d          S )NT)save_debug_filesF)r  r   	TempFilesr  r  rN   r9   r7   rY   rY     sB     A 6884PPPP x%@@@@r9   c           
         d t           r]t          dd                    fd| D                       z   t          j                   t          j                                         dS t          rjt          d | d                   dt          j        | dd                   t          j                   t          j                                         dS dS )zTEmulate the '-v/-###' flags of clang/gcc by printing the sub-commands
  that we run.c                 D    t          d | D                       r| S d|  dS )Nc              3   F   K   | ]}|                                 p|d v V  dS )z./-_N)isalnum)rS   cs     r7   r   z<print_compiler_stage.<locals>.maybe_quote.<locals>.<genexpr>*  s3      
3
3!199;;%!v+
3
3
3
3
3
3r9   ")all)args    r7   maybe_quotez)print_compiler_stage.<locals>.maybe_quote)  s4    

3
3s
3
3
333 jZZZr9   r   c                 &    g | ]} |          S rN   rN   )rS   ar9  s     r7   rT   z(print_compiler_stage.<locals>.<listcomp>0  s!    666Q++a..666r9   r
   r   r   N)rq   r   r_   r   rI   flushPRINT_SUBPROCSre   )ru   r9  s    @r7   r`   r`   %  s        	#6666#66677
7cjIIIIJ 	Ekk#a&))))5:c!""g+>+>+>
?cjQQQQJ r9   c                 l    t          |           sd| z   S |                     d          r
| dd          n| S )N$_r   )is_c_symbolr   r  s    r7   demangle_c_symbol_namerB  7  s?    	T		 :__S))	3abbt3r9   c                 ,    |                      d          S )Nr@  r   r  s    r7   rA  rA  =  s    			r9   c                 N     h d}d} |v pt           fd|D                       S )N>   __stop_em_js__em_lib_deps__start_em_js__stop_em_asm__start_em_asm__stop_em_lib_deps__start_em_lib_deps)	__em_js__rG  c              3   B   K   | ]}                     |          V  d S r{   rD  )rS   pr4   s     r7   r   z%is_internal_global.<locals>.<genexpr>G  s/      3b3b1DOOA4F4F3b3b3b3b3b3br9   )any)r4   internal_start_stop_symbolsinternal_prefixess   `  r7   is_internal_globalrS  A  sL    !2 !2 !2 5	,	,	b3b3b3b3bPa3b3b3b0b0bbr9   c                 X    t          |           rdS | dvo|                     d           S )NF)__asyncify_data__asyncify_state__indirect_function_tablememory)dynCall_zorig$)rS  r   r  s    r7   is_user_exportrZ  J  sQ     5	c	c  
Slpl{l{  }R  mS  mS  iS  Sr9   c                 >    | dk    rd} t          |           rd| z   S | S )zMangle a name the way asm.js/JSBackend globals are mangled.

  Prepends '_' and replaces non-alphanumerics with '_'.
  Used by wasm backend for JS library consistency with asm.js.
  __main_argc_argvmainr@  )rZ  r  s    r7   asmjs_mangler^  P  s4     
DD :	+r9   c                 Z    || vrt          d|z             |                     ||          S )Nz(expected to find pattern in input JS: %s)r   replace)input_patternreplacements      r7   
do_replacerd  _  s5    F>HIII		-	--r9   c                  "    t           j        rdS dS )Nzwasm64-unknown-emscriptenzwasm32-unknown-emscripten)r   MEMORY64rN   r9   r7   get_llvm_targetrg  e  s     '&&&&r9   c                  H    t          j                     t                       d S r{   )r   set_version_globalsr-  rN   r9   r7   initrj  l  s#    r9   clangzclang++zclang-scan-depszllvm-arzllvm-dwpzllvm-ranlibzllvm-nmzllvm-dwarfdumpzllvm-objcopyz
llvm-stripzwasm-ldzllvm-profdatazllvm-covzem++emaremranlibztools/file_packagerz.dylibz.so)NNN)F)FF)t__doc__r  loggingrU   r   re   r2   rB   r   r  r   toolchain_profilerr   version_infor   
executabler   rI   exit r   r   rV   r[   r\   r   ERROR	log_levelINFObasicConfigenabler   r   r   r   r   r   r   r   r   r   r   r   r   r  getenvr=  rq   r   r   r  r  	getLoggerr]   add_warningr8   ro   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   profiler   r   r   r   r   r   r  r  r  r  r"  r-  rY   r`   rB  rA  rS  rZ  r^  rd  rg  rj  r   	CLANG_CXXCLANG_SCAN_DEPSr   LLVM_DWPLLVM_RANLIBLLVM_NMLLVM_DWARFDUMPLLVM_OBJCOPY
LLVM_STRIPWASM_LDLLVM_PROFDATALLVM_COVEMCCEMXXEMAREMRANLIBFILE_PACKAGERDYLIB_EXTENSIONSrun_via_emxxrN   r9   r7   <module>r     s      				 				       



        1 1 1 1 1 1 g%[CN[[S[[[[beblmmmm
#(1+++       	BJNN<--..s2:>>.#6677M	 m)) l)  @	 R R R R          D D D D D D D D D D D D D D D D       a a a a a a a a a a a a a aAcc"*..):C@@AA
YRY~s3344 "    		8	$	$  (%U K K K K   % % %   ' ' '  )5e L L L L   $ $ $       4 0 0 0 0  T 2 2 2 2   ( ( (   & & &  4 5 5 5  6t D D D D  - . . .   $ $ $  8 9 9 9   $ $ $   & & &   ( ( (   & & &   & & &  	5 1 1 1 1    $=A#H$ H$ H$ H$V
; 
; 
;  
 "$r * * * *
 
 
 
 	  	  	5 	5 	5	 	 	` ` `    + + + 	  	       	R R  	R< < < 	X X X 	X2 G, G, G, G,T) ) )C C CD D Dk k k 	  	"I I I3 3 3$ $ $B 	A A 	A  $4 4 4  c c cS S S  . . .' ' '   ?7##OI&&	 .!233
.
#
#>*%%n]++
.
#
# 011~n--^L))

.
#
#//>*%%&!!&!!&!!j))""#899 e$  r9   