
    7,Jj۵                       d Z ddlm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                  j                  d e ee      j#                         j$                               ddlmZmZmZ ddlmZmZ  ee      j#                         j4                  d   Zed	z  Zd
ZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)e(dddfZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1dCd!Z2dCd"Z3dDd#Z4dEd$Z5dd%d&	 	 	 	 	 	 	 	 	 	 	 dFd'Z6dGd(Z7dHd)Z8dId*Z9dJd+Z:dKd,Z;dLd-Z<dMd.Z=dNd/Z>dOd0Z?dPd1Z@dQd2ZAdRd3ZBe!dd4	 	 	 	 	 	 	 	 	 	 	 dSd5ZCdTdUd6ZDdVd7ZEdWd8ZF	 	 	 	 	 	 	 	 dXd9ZGdYd:ZHdZd;ZId[d<ZJd\d=ZKd]d>ZLd]d?ZMefd^d@ZNd_dAZOePdBk(  r eO        yy)`zDSummarize runtime writes to the savedat scene-selector byte globals.    )annotationsN)Counter)Path)offset_to_varead_sectionsva_to_offset)DEFAULT_HANDLER_VAanalyze_stream_effect   outivE ivE im@ i8D i D iG O   iM iM    iɭ@ i1 x)m      r   r   im  z0:0z1:0z2:0z10:0map1_01amap2_02diT c                    d| dS )N0x08x values    Q/home/exedev/hwanse/tools/summarize_save_selector_runtime_selector_byte_writes.pyhex32r   4       c{    c                    d| dS )Nr   02xr   r   s    r   hex8r   8   r   r   c                "    | rt        | d      S d S )N   )intr   s    r   	parse_hexr#   <   s    "3ub>,,r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   <Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr.   @   s?    (B'F~!c#h.dC033r   r%   )beforeafterc          	         g }t        | |dz         D ]L  }||dz  z   }t        | ||      }|j                  ||dz  dt        |      |t        |      nd |dk(  d       N |S )Nr   r%   z+#xr   )relativeWordOffsetrelativeByteOffsetHexvaHexvalueHexisCenterOpcode4f)ranger.   appendr   )	r*   r+   	center_var/   r0   rowsrelativer,   r   s	            r   dword_window_aroundr<   G   s     D6'519- 	A%h+"*(01S'92Y(-(9et (A
 		 Kr   c                t   t        | ||dz
        }t        | ||dz         }t        | ||dz         }t        | ||dz         }||||f}|t        |      nd |t        |      nd |t        |      nd g|t        |      nd |t        |      nd |t        |      nd g|t        k(  ||ft        k(  |t        k(  dS )Nr%   r      )previousHexnextPrefixHexnextSignatureHexcommonPreviousOpcode31commonNext6d05commonRouteSignature)r.   r   ROOT_PROLOGUE_PREVIOUS_WORDROOT_PROLOGUE_NEXT_PREFIXROOT_PROLOGUE_COMMON_SIGNATURE)r*   r+   r,   previousnext0next1next2	signatures           r   prologue_patternrM   ]   s    XrAv.HS(BF+ES(BF+ES(BG,E5%/I*2*>uXD!-E%L4!-E%L4

 "-E%L4!-E%L4!-E%L4

 #+.I"I %.,EE )-K K r   c                \    |y | D ]$  }|d   }||d   z   }||cxk  r|k  sn |d   c S  y )Nr,   raw_sizenamer   )r+   r,   sectionstartends        r   section_name_for_varT   t   sM    	z #gj))B6?"	#
 r   c                F    | D ]  }|d   |k(  s|c S  t        d| d      )NrP   zmissing z section)
ValueError)r+   rP   rQ   s      r   section_by_namerW      s8     6?d"N xvX.
//r   c                R    | sy | j                  d       d| j                  d       S )Ngroup:slotgetrows    r   selector_keyr`      s,    gggq 122r   c                |    i }| D ])  }|j                  d      }t        |t              s%|||<   + t        |      |fS )NselectedPointer)r]   
isinstancer"   sorted)	selectorscontextsr_   roots       r   selector_indexrh      sM     "H ww()$$	
 (X%%r   c                X   t        j                  ||       dz
  }|dk  ry ||   }|dz   t        |      k  r||dz      n|dz   }| |k\  ry ||   }t        |      |j	                  d      xs t        |      t        |       dt        |       d| |z
  d|j	                  d      xs g d	S )
Nr   r   i @  selectedPointerHexz..z+0x03x	fieldMaps)selectorrootHexrootRangeHexrelativeOffsetHexrl   )bisectbisect_rightr'   r`   r]   r   )r,   rootsrf   indexrg   rS   r_   s          r   root_context_for_varu      s    r*Q.Eqy<D#ai#e*4%	
$-C	Sy
4.C %77/0?E$K ;-r%*6"29S/2WW[)/R r   c                <   | t        d|dz
        | }| |dz   |dz    }|dkD  r| |dz
     nd }d}d}|dk(  rd}d}n2|d	k(  rd
}d}n(|dk(  rd}d}n|dk(  rd}d}n|dk\  r| |dz
  | dk(  rd}d}|||t        |      nd |j                         |j                         dS )Nr   r%   
   r   unknown   movAlFromMoffs8read   movMoffs8FromAlwrite   movEaxFromMoffs   movMoffsFromEax   s   movClFromMoffs8)instructionKindaccessopcodeByteHexprefixBytesHexsuffixBytesHex)maxr   hex)r*   
ref_offsetr/   r0   opcodekindr   s          r   classify_moffs_refr      s    Q
Q'4F
Q
R0E$.NSa FDF~ 	4 	4 	4 	qSa<K )/);f **,))+ r   c                R   t        |d      }|d   }||d   z   }t        j                  d|      }g }|}	 | j                  |||      }	|	dk  rnFt	        ||	      }
|
2|j                  t        |
      t        |      dt        | |	             |	dz   }_|j                  d 	       |S )
N.textrawrO   r&   r   )refVaHex	targetHexr   c                    | d   S Nr   r   r^   s    r   <lambda>z$text_refs_to_value.<locals>.<lambda>   
    c*o r   key)	rW   r(   packfindr   r8   r   r   sort)r*   r+   r   text	raw_startraw_endneedlerefscursorhitref_vas              r   text_refs_to_valuer      s    8W-DUI$z**G[[u%FDF
hhvvw/7h,KK!&M"5\ %S#. 
 q  	II-I.Kr   c           	         dt         dfdt        dfdt        dfg}g }|D ]R  \  }}}| |z
  }|dk  s|dz  r|dz  }d|cxk  r|k  s(n +|j                  |t	        |      |t        |      d       T |S )Ngeneral-object   save-selectorevent-objectr   r%   )table
tableVaHexr   	opcodeHex)GENERAL_HANDLER_TABLE_VASAVE_SELECTOR_HANDLER_TABLE_VAEVENT_OBJECT_HANDLER_TABLE_VAr8   r   r   )r   tablesr:   rP   basecountdeltar   s           r   table_names_for_refr      s    	3U;	8%@	6>F
 D# dE19	!KK#Dk !&\	  Kr   c                6   t        j                  d|      }g }|D ]h  }|d   }||d   z   }|}	 | j                  |||      }	|	dk  r,t        ||	      }
|
*|j	                  t        |
      |d   t        |
      d       |	dz   }W |j                  d 	       |S )
Nr&   r   rO   r   rP   )r   rQ   tableMatchesr   c                    | d   S r   r   r^   s    r   r   z&handler_pointer_refs.<locals>.<lambda>  r   r   r   )r(   r   r   r   r8   r   r   r   )r*   r+   
handler_var   r   rQ   r   r   r   r   r   s              r   handler_pointer_refsr      s    [[z*FD EN	gj11((6673CQw!(C0F! %f&v$7$? 
 1WF 	  	II-I.Kr   c                j   g }dt         fdt        fdt        ffD ]  \  }}t        t	        dt
        dz
        t
        dz         D ]j  }||dz  z   }t        | ||      }|j                  |t        |      |t        |      t        |      |t        |      nd t        ||      |t        k(  d       l  |S )	Nr   r   r   r   r      r%   )r   r   r   r   
entryVaHexhandlerVaHexhandlerSectionisRuntimeSelectorHandler)r   r   r   r7   r   RUNTIME_SELECTOR_OPCODEr.   r8   r   r   rT   RUNTIME_SELECTOR_HANDLER)r*   r+   r:   
table_namer   r   entry_vahandlers           r   handler_table_windowr   
  s    D	34	89	67 
D
 C#:Q#>?AX[\A\] 	Ffqj(HsHh7GKK##Dk !&\#Ho292Eg4"5h"H,37O,O	 		$ Kr   c                   ||dz  z   }t        | ||      }|t        ||      nd }i }|t        k(  r
ddigg g d}n||dk(  rt        | ||      }t	        |j                  dg       D ch c]%  }|j                  d      s|j                  d      ' c}      }	|t        |      t        |      ||t        |      nd ||t        k(  |	|j                  d      du t        |j                  d            |t        k(  xr	 |t        k(  d	S c c}w )
Nr%   bytes)fixedAdvancesstreamReadsstreamStoresr   r   canJumpToDwordAtPlus4Tr   )r   r   r   	handlerVar   r   isDefaultHandlerr   r   writesStreammatchesSelectedRootConsumer)r.   rT   r	   r
   rd   r]   r   r   boolSELECTED_ROOT_CONSUMER_OPCODESELECTED_ROOT_CONSUMER_HANDLER)
r*   r+   table_var   r   r   rQ   effectitemadvancess
             r   handler_entry_for_tabler   !  s"   &1*$H#x2J;E;Q!(J7W[GF''%,aL>"VXY		Gw$6&sHjAVZZQS5TjTX\X`X`ahXitxx(jkH&\Ho-7-Cj)!&*<<!!',C!D!LVZZ78'-1N'N'S]aS  ks   (D?D)r   	max_stepsc               $   g }|}t               }t        |      D ]  }||v r!|j                  |t        |      dd        |S |j	                  |       t        | ||      }	|	!|j                  |t        |      dd        |S |	dz  }
t        | |||
      }|t        |      t        |	      d|}|j                  |       |d   }t        |      dk(  r|d   s	||d	   z  }t        |      dk(  r|d   rd
|d<    |S |sd|d<    |S d|d<    |S  |S )Nloop)stepr4   
stopReason
unreadable   )r   r4   r5   r   r   r   r   zbranch-or-fallthroughr   zno-fixed-advancezmultiple-advances)setr7   r8   r   addr.   r   r'   )r*   r+   	stream_var   r   r:   r,   seenr   r   r   r   r_   r   s                 r   trace_continuation_streamr   :  sh    D	BUDi  :KKb	PQ6 K5 	h+=KKb	VW, K+ )#x6J2Ye
 	
 	C?+x=Ag.E&F(1+Bx=A'*A"B 7C K  2C K 0LK=< Kr   c                >   g }t        |      D ]  }||dz  z   }t        | ||      }| |S t        ||      }|dz  }	|dz	  dz  }
|r| d}n|dk  rd}n|
dk  r|	dk  rd}nd}|j                  |t	        |      t	        |      t        |d	z        |	|
||d
        |S )Nr%   i  r!   z-pointerzsmall-scalar@   zu16-pair-smallzpacked-scalarr   )rt   r4   r5   lowByteOpcodeHexu16Lou16HiclassificationpointsIntoSection)r7   r.   rT   r8   r   r   )r*   r+   start_var   r:   rt   r,   r   rQ   lohir   s               r   continuation_table_previewr   f  s    Du 
	!h+=0 K/ &h6V^rkV# 'y1Nf_+N4ZB$J-N,Nr!%L$($6"0%,		
!
8 Kr   c                   t        | |t              }t        | |t              }|r|d   ni }|r|d   ni }t        t              t        t              t        t        dz   k(  t        t              |j                  d      |j                  d      |j                  d      du |j                  d      du||t        | |t              ddS )	Nr   r%   r   r   r   Ta  mode1 continuation starts at save-selector opcode 0x08 selected-root consumer, so opcode 0x4f mode1 looks like selector-byte set followed by selected-root consumer entry. This grounds the continuation mechanism, but still does not prove who entered a root-local self-writer.)mode1ContinuationStreamHexmode0ContinuationStreamHexmode0IsMode1Plus4handlerTableHexmode1FirstOpcodeHexmode1FirstHandlerHex#mode1StartsWithSelectedRootConsumer$mode0StartsAfterSelectedRootConsumer
mode1Trace
mode0TracetablePreviewpromotionImpact)r   MODE1_CONTINUATION_STREAMMODE0_CONTINUATION_STREAMr   r   r]   r   )r*   r+   mode1_tracemode0_tracemode1_firstmode0_firsts         r   continuation_stream_analysisr    s    +C;TUK+C;TUK$/+a.RK$/+a.RK&+,E&F&+,E&F6:SVW:WW !?@*{; + ?/:?\/]ae/e0;@]0^fj0j!!23B[\v r   c           
         | dz	  dz  }| dz	  dz  }| dz	  dz  }ddddd	j                  |d
      }t        | dz        |t        |      |t        |      |t        |      |dk(  r
| d| |d	S d |d	S )Nr   r   r!      z5push stream+4 and switch context stream to 0x004dc518zSwrite stream+2/+3 to runtime selector bytes and switch context stream to 0x004dc514z+call mode helper 0x00423319 with argument 0z+call mode helper 0x00423319 with argument 1)r   r   r   r   zunknown moder   rZ   )	r   modemodeHexrY   groupHexr[   slotHextargetSelectormodeMeaning)r]   r   )r   r  rY   r[   mode_meanings        r   decode_runtime_selector_opcoder    s    QJ$Db[D ERK4DB`88	
 
c$  %$,':K:/3qyUG1TF+#
 
 ?C#
 
r   c                	   t        |d      }t        |      \  }}g }t        |d   |d   |d   z   dz
  d      D ])  }t        j                  d| |      d   }|dz  t
        k7  r+|d	   |z   |d   z
  }	t        |      }
t        |	||      }t        |	      t        |      d
|
d|i}|
j                  d      dk(  r t        | ||	      |d<   t        | ||	      |d<   |xs i j                  d      }t        ||
j                  d            |d<   |
j                  d      dk(  xr |
j                  d      t        k(  |d<   |t        k(  xr |d   |d<   |j                  |       , t        d |D              }|D cg c]  }|d   dk(  s| }}|D cg c]  }|j                  d      t        k(  s| }}|D cg c]:  }|j                  d      xs i j                  d      |j                  d      k(  r|< }}|D cg c]:  }|j                  d      xs i j                  d      |j                  d      k7  r|< }}|D cg c]>  }|j                  d      xs i j                  d      t         t"        t        t$        hv r|@ }}|D cg c]/  }|j                  d      xs i j                  d      t        k7  r|1 }}|D cg c]:  }|j                  d      xs i j                  d      |j                  d      k(  r|< }}|D cg c]*  }|j                  d      xs i j                  d      du r|, }}|D cg c]  }|j                  d      t        k(  r| }}t'        d |D              }t'        d |D              }i dt)        |      dt+        t-        |j/                                     dt)        |      dt)        |      dt)        |      d|d |d!t)        |      d"t)        |      d#t)        |      d$t)        |      d%t)        |      d&t)        |      d'|d(|d)t        t0              t2        D cg c]  }t        |       c}t4        D cg c]  }t        |       c}t)        |      t)        |      ||t)        |      t)        |      t)        |      t)        |      ||d*}||fS c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )+Nz.datar   rO   r   r%   r&   r   r   r,   )r4   r5   rootContextr  r   prologuePatternprologueWindowrm   r  	routeRoleisCurrentSelectorMode1WriterisCurrentSelfWriterc              3  &   K   | ]	  }|d      yw)r  Nr   .0r_   s     r   	<genexpr>z*scan_opcode4f_data_rows.<locals>.<genexpr>  s     4S^4   rD   Tc              3  l   K   | ],  }|j                  d       xs i j                  d      du rd . yw)r  rB   Tr   Nr\   r  s     r   r  z*scan_opcode4f_data_rows.<locals>.<genexpr>  s;      1GG%&,"112JKtS 	
1   24c              3  l   K   | ],  }|j                  d       xs i j                  d      du rd . yw)r  rC   Tr   Nr\   r  s     r   r  z*scan_opcode4f_data_rows.<locals>.<genexpr>  s;      +GG%&,"112BCtK 	
+r  opcode4fRowCount
modeCountsmode1RowCountmode1SelfWriteCountmode1CrossWriteCount&mode1RowsPrecededByCommonOpcode31Count mode1RowsWithCommonNext6d05Countmode1CurrentSelectorWriterCount1mode1CurrentSelectorWriterOutsideCurrentRootCountrouteContextMode1RowCountrouteContextSelfWriteCount routeContextCommonSignatureCount crossWriteToCurrentSelectorCountcurrentSelectorRowsrouteContextMode1RowsrootSelfWritePattern)commonPreviousOpcode31HexcommonNextPrefixHexcommonRouteSignatureHexr!  r"  r#  r$  r(  r)  r*  ,currentSelectorTargetOutsideCurrentRootCountrouteContextSelfWriteRowscrossWriteRows)rW   rh   r7   r(   r)   r   r  ru   r   r]   rM   r<   
route_roleCURRENT_SELECTORr8   r   SOURCE_SELECTORPREDECESSOR_SELECTORADDRESS_PREDECESSOR_SELECTORsumr'   dictrd   itemsrE   rF   rG   )r*   r+   re   datars   rf   r:   r-   r   r,   decodedroot_contextr_   context_selectorcounts
mode1_rowscurrent_selector_rowsmode1_self_write_rowsmode1_cross_write_rowsroute_context_rows*current_selector_rows_outside_current_rootroute_context_self_write_rows#route_context_common_signature_rows cross_writes_to_current_selector&mode1_rows_preceded_by_common_opcode31 mode1_rows_with_common_next_6d05summarys                              r   scan_opcode4f_data_rowsrM    s   
 8W-D$Y/OE8DUT%[4
3C%Ca%GK ""4f5a8DL44$Z& 4;.07*2uh?2Ye
 
 <	
 ;;v!#%5c8R%HC!"$7Xr$JC !(.B33J?%&6DT8UVKKK1$Z5E)FJZ)Z 	*+  00XS9W5X 	!" 	C14 4t44F!%:#V)9#:J:,6hS#''BR:SWg:gShh!WW]#)r..z:cggFV>WW 	 
 "WW]#)r..z:cggFV>WW 	 
 "WW]#)r..z: (	?
 
 	  -2GGM"(b--j9=MM 	2. 2
 *%WW]#)r..z:cggFV>WW 	%! %
 *+GG%&,"112HITQ 	+' +
 .(77#$(88 	($ ( .1 11 .* (+ ++ ($CId6&,,.12 	Z 	s#89	
 	$: ; 	12X 	+,L 	*3/D+E 	<SAk=l 	$S);%< 	%c*G&H 	+C0S,T 	+C0P,Q 	4 	 !3  	)./J)K>W#XUE%L#XB`'ae'a#&'<#=$'(>$?6\0P*-.K*L034W0X034T0U<?@j<k)F4!
!G@ =W ;h2%+(< $Y'asO   <S
SS2S<?S?SAS4S	?S/S$!S)	S.
%S3c                    | t         k(  r
|t         k(  ry| t        k(  r
|t        k(  ry| t        k(  r
|t        k(  ry| t        k(  r
|t        k(  ry|t         k(  ry| t        t        t         t        hv ryy)Nz current-root-self-selector-writezsource-root-self-selector-writez$predecessor-root-self-selector-writez,address-predecessor-root-self-selector-writez2current-selector-target-write-outside-current-rootz"route-context-other-selector-writeznon-route-context)r5  r6  r7  r8  )r?  target_selectors     r   r4  r4  (  sv    ++CS0S1?*//Q0//OG[4[577OOk<k=**CO-ACSUqrr3r   c                   g }| D ]  }dD ]  \  }}}|j                  |      xs g D ]  }|j                  d      }t        |t              s%t        |d      }|dz  t        k7  r>|j                  |j                  d      |j                  d      |j                  d      ||j                  |      |j                  d      |j                  d	      |d
t        |                |S )N))leafwordsleafPointerHex)nestednestedWordsnestedPointerHexr5   r!   r   sourcetargetrm   rt   r4   )rW  rX  rm   
streamKindstreamVaHex	wordIndex	wordVaHexr5   )r]   rc   strr"   r   r8   r  )	leaf_streamsr:   rQ  stream_kindr   
stream_keyword	value_hexr   s	            r   leaf_opcode_hitsrc  8  s    D -
 	(Kj +  HHZ0	!)S1Ir*DL%<<"hhx0"hhx0 $ 4"-#'88J#7!%'!2!%'!2 )
 5U;
 
		. Kr   c                   t        |       }t        | |t              }t        | |t              }t	        | |t
              }t        | ||      \  }}t        | |      }	t        |      }
||z   D cg c],  }|j                  d      dk(  rd|j                  dd      v r|. }}|d   }|D cg c]  }|j                  d      r| }}|D cg c]4  }|j                  d      xs i j                  d	      t        t        hv r|6 }}|d
   }d}i dt        dt        dt        dt        t               dt        t              t        t              t#        |      t#        |      ||ddt        t
              t        t$              t        t&              t        t(              t+        t,              t#        |      |t/        | |      dd	d|	di |d|idt#        |
      d|
dt#        |      dt#        |      dt#        |      dddd |d!    d"|d#    d$|d%    d&|d'    d(	d)t#        |      d*k(  xr t1        d+ |D              d,t#        |      d-k(  t#        |      d-k(  ddd.g d/|d0S c c}w c c}w c c}w )1Nr   r~   0x00406er    r+  r  r  rm   r-  a  The runtime selector byte globals are written by general-object opcode 0x4f mode 1. Static data contains exactly one mode-1 write to selector 2:0, but it lives inside the current selector 2:0 root itself. The source root 0:0 and predecessor root 1:0 only contain self-selector writes, and all four route-context mode-1 rows share the selector-root prologue signature. No cross-root write to selector 2:0 is present in the source/predecessor roots or the route frontier leaf streams. This documents the selector-byte write mechanism and the root self-identification pattern, but does not prove normal execution order for map1_01a -> map2_02d.rW  rX  currentSelectorcurrentRootHexruntimeSelectorGlobals)groupGlobalHexslotGlobalHexgroupTextRefCountslotTextRefCount	groupRefsslotRefsruntimeSelectorHandlerzmode 1 reads stream+2 as selector group and stream+3 as selector slot, writes them to 0x004576da/0x004576db, pushes stream+4, and switches context stream to 0x004dc514)	r   generalHandlerTableHexsaveSelectorHandlerTableHexeventObjectHandlerTableHexr   handlerPointerRefCounthandlerPointerRefshandlerTableWindowmode1SemanticscontinuationStreamAnalysisopcode4fDataScanr:   leafStreamOpcode4fHitCountleafStreamOpcode4fHitswriterPairNearHandlerCountmode1CurrentSelfWriterCount-sourceOrPredecessorCurrentSelectorWriterCount!rootSelfWritePatternPromotesRouteFrootSelfWritePatternConclusionzmode1 self writes=r!  z, cross writes=r"  z, route common signature rows=r)  z, cross writes to selector 2:0=r*  z; current selector 2:0 matches the same root self-write prologue pattern as the confirmed source/predecessor/address-predecessor selector roots.$selectorByteWriteMechanismIdentifiedr   c              3  f   K   | ])  }t        d  |j                  d      xs g D               + yw)c              3  p   K   | ].  }|j                  d       dk(  xr |j                  d      dk(   0 yw)r   r   r   0x4fNr\   )r  matchs     r   r  z*build_summary.<locals>.<genexpr>.<genexpr>  s@      @ IIg&*::_uyy?UY_?__ @s   46r   N)anyr]   )r  refs     r   r  z build_summary.<locals>.<genexpr>  s=         @!$!8!>B@ @s   /1currentSelectorByteWriterFoundr   blocked)zPprove how the runtime enters selector root 2:0 from the confirmed map1_01a routezlfind a source/predecessor-root opcode 0x4f mode1 write to selector 2:0, if one exists in an unscanned streamz\capture a real savedat/runtime trace with selector bytes 2:0 and selected pointer 0x00540714zFfind a strict map1_01a source hotspot or coordinate table for map2_02d)+currentSelectorWriterIsCurrentRootSelfWriteexecutionOrderProvenselectorByteWritePromotesRoutepromotionStatusremainingProofs
conclusion)r   r   RUNTIME_SELECTOR_GROUP_GLOBALRUNTIME_SELECTOR_SLOT_GLOBALr   r   rM  r  rc  r]   r6  r7  SOURCETARGETr5  r   CURRENT_ROOTr'   r   r   r   r   r   r   r  )r*   re   r^  r+   
group_refs	slot_refshandler_refsopcode_rowsopcode_summarycontinuation_analysis	leaf_hitsr_   writer_ref_pairscurrent_rowscurrent_self_rows%source_or_predecessor_current_writersroot_patternr  s                     r   build_summaryr  T  s   S!H#C3PQJ"32NOI'X7OPL"9#x"SK8hG .I!I-778'J#''*b:Q,Q 	  ""78L#77() 	 
 $-GGM"(b--j9oOc=dd 	-) - ""89L	k B&B&B 	+B 	%-	B
 	!#$AB"#?@!$Z #I#!#
B 	!!":;&+,D&E+01O+P*/0M*N56&),&7"."6sH"Es#
B6 	%&;7B8 	 

K
9B@ 	%c)nABB 	!)CBD 	%c*:&;EBF 	&s+<'=GBH 	8=b9cIBJ 	,UKBL 	) .C!D E F()?@A B++78Z+[*\ ],,89[,\+] ^EEOB\ 	/ !Q&   ( aBl 	)#l*;q*@mBn 8;;L7MQR7R %*/$
 !CB B/
-s   -1I0)I5	9I:c                    | j                  d      xs i }|j                  d      xs d d|j                  d      xs d d|j                  d      xs d j                         S )Nr  rm   - rn   rp   rf  )r]   strip)r_   contexts     r   row_selector_textr    sf    ggm$*G;;z")c
*!GKK	,B,Ic+J!;;*+1r
2	4egr   c                   | d   }| d   }| j                  d      xs i }| d   }|d   }g ddd| d	    d
| d    dd| d    d| d    dd|d    d|d    dd|d    d|d    d|d    dd|d    d|d    dd| d     d!|d"    d#|d$    d%|d&    d'|d(    d)|d*    d+|d,    d-d.j                  |d/          d+|d0    d1|d2    d3|d4    d5|d6    d7|d8    d9|d:    d;| d<    d=| d>    d?|j                  d@       ddA|j                  dB       dC|j                  dD       ddE|j                  dF       dG| dH    dI| dJ    dK| dL    dd| dM   d| dN   ddOd|j                  dP      xs dddQdR}dSD ]  }|j                  | dT      xs g }|r|dU   ni }	t        dV |D        dW      }
|j                  dX| dY|j                  | dZ       dY|	j                  d      xs dW dY|	j                  d      xs dW dYt	        |	j                  d[      d\u       j                          d]|
xs dW d^        |j                  g d_       dSD ]  }|j                  | dT      xs g D ]  }d`j                  da |j                  dbg       D              xs dW}|j                  dX| d]|j                  dc       dd|j                  de       dY|j                  dfdW       dY|j                  ddW       dY|j                  d      xs dW d]| dg|j                  dh      xs dW d^         |j                  g di       |j                  dj      xs g D ]>  }|j                  dk|dl    dd|de    dY|df    dY|dm    d]|dn    dg|do    dg|dp    d^       @ |j                  g dq       |dr   D ]R  }d.j                  ds |j                  dt      xs g D              xs dW}|j                  dX|du    d]|dv    dg| d^       T |dr   s|j                  dw       |j                  g dx       |dy   |dz   z   D ],  }|j                  dX|d{    dY|du    d]|d|    dg|d}    d^	       . |j                  g d~       |d   D ]  }|j                  d      xs i }d|j                  d      xs dW dd.j                  |j                  d      xs g       xs dW d|j                  d       }|j                  dX|de    dY|df    dY|j                  d      xs dW d]t        |       dg| dg|d    d^        |d   s|j                  d       |j                  g d       |d   D ]H  }|j                  dX|de    dY|df    dY|j                  d      xs dW d]t        |       dg|d    d^       J |d   s|j                  d       |j                  g d       | d   D ]  }|j                  d|         |j                  d       dj                  |      S )Nri  rp  rx  ry  r-  z,# Save Selector Runtime Selector Byte Writesrf  z
- route: `rW  z` -> `rX  `z- current selector/root: `rg  z` `rh  z- selector globals: group `rj  z	`, slot `rk  z- group/slot text refs: rl  z / rm  z- runtime selector handler: `r   z!- handler table opcode: general `rq  z
` opcode `r   z- writer pair near handler: r|  z- opcode 0x4f data rows: r  z- mode 1 rows: r   z- mode 1 self-write rows: r!  z- mode 1 cross-write rows: r"  z- mode 1 rows preceded by `r.  z`: r#  z - mode 1 rows with next prefix `, r/  r$  z#- mode 1 current-selector writers: r%  z8- mode 1 current-selector writers outside current root: r&  z!- route-context self-write rows: r(  z0- route-context common prologue signature rows: r)  z"- cross writes to selector `2:0`: r*  z/- source/predecessor current-selector writers: r~  z - leaf-stream opcode 0x4f hits: rz  z- mode1 continuation stream: `r   z,- mode1 starts with selected-root consumer: r   z- mode0 continuation stream: `r   z- mode0 is mode1+4: r   z*- root self-write pattern promotes route: r  z&- selector byte write promotes route: r  z- promotion status: `r  r  r  z## Continuation Stream Previewr   zV| mode | stream | first opcode | first handler | selected-root consumer | trace stop |%| --- | --- | --- | --- | --- | --- |mode1mode0Tracer   c              3  b   K   | ]'  }|j                  d       s|j                  d        ) ywr   Nr\   r  s     r   r  zmarkdown.<locals>.<genexpr>  $     Ussww|?TSWW\*U   //r  z| `z` | `ContinuationStreamHexr   Tz` | z |)rf  z### Continuation tracerf  z@| mode | step | va | value | opcode | handler | advance | stop |z2| --- | ---: | --- | --- | --- | --- | --- | --- |/c              3  &   K   | ]	  }d |   yw+Nr   r  r   s     r   r  zmarkdown.<locals>.<genexpr>       V!E7Vr  r   r   z | `r4   r5   z | r   )rf  z### Continuation table previewrf  z=| index | va | value | low opcode | u16 lo | u16 hi | class |z.| ---: | --- | --- | --- | ---: | ---: | --- |r   z| rt   r   r   r   r   )rf  z## Handler Referencesrf  z| ref | section | table match |z| --- | --- | --- |ru  c              3  6   K   | ]  }|d     d|d      ywr   rZ   r   Nr   r  r   s     r   r  zmarkdown.<locals>.<genexpr>  s*      
7;tG}oQtK012
   r   r   rQ   z| - | - | - |)rf  z## Selector Global Text Refsrf  z'| target | ref | access | instruction |z| --- | --- | --- | --- |rn  ro  r   r   r   )rf  z## Route Mode 1 Rowsrf  zA| va | value | target selector | root context | prologue | role |r  r,  r  zprev=r?   z; next=rA   z	; common=rD   r  r  z| - | - | - | - | - | - |)rf  z## Cross Writesrf  z6| va | value | target selector | root context | role |z| --- | --- | --- | --- | --- |r3  z| - | - | - | - | - |)rf  z## Remaining Proofsrf  r  z- 
)r]   joinnextr8   r]  lowerextendr  )rL  globals_r   continuationscanr  linesmode_keytracefirststopr_   r   matchespatternprologuer   s                    r   markdownr    s	   /0H./G;;;<BL%&D./L)6)
) WX&'vgh.?-@B) %W->%?$@GL\D]C^^_`	)
 &h/?&@%A8TcKdJeefg) #8,?#@"AXN`EaDbc) ((?'@B) ,G4L,M+NjY`alYmXnnop) 'w/K'L&MN) $D);$<#=>) $/01) %\2G%H$IJ) &l3I&J%KL) &l3N&O%PPST`  bJ  UK  TL  	M) +499\BW5X+Y*ZZ]^j  lN  _O  ^P  	Q)  .d3T.U-VW!)" C4H{C|B}~#)$ ,L9U,V+WX%)& ;<Hj;k:lm')( -\:\-],^_))* :'Bq:r9st+), +73O+P*QR-). ))9)9:V)W(XXYZ/)0 7|7G7GHm7n6op1)2 ))9)9:V)W(XXYZ3)4 |//0CDEF5)6 5W=`5a4bc7)8 19Y1Z0[\9):  (9 :;1=;)< 	=)> 	?)@ 	A)B 	01C)D 	E)F 	)G)H 	I)J 	*+1rK)L 	M)N 	aO)P 	0Q)ET ' 
  H:U!34:!arUeUWZ[(5!1!1XJ>S2T!U V W		+&-#.eEIIn4M4TQT3U VEII;<DEKKMNdSWS^[^R__ac	
	
 
LL   ' ##xj$67=2 	CxxVRT9UVV]Z]HLLhZtCGGFO#4D9I8J%PSPWPWXbdgPhOi jGGK-.eCGGN4K4Rs3SSWX`Waadehelelmyez  fB  B  eC  CEF	 
LL   /52 
Wd3w<.c*o5FeCPbLcKddh7|nCG~S5E1F0GrK	


 
LL   +, P)) 
?Bww~?V?\Z\
 
  	 	s3z?+4I/?s7)2NO	P
 '(_%	LL   $x
';; 
#k"#5Z(9c(m_CPSTePfOggij	


 
LL   +, 

''+,2GKK.5#6 7IIgkk*<=CDKL Mkk"89:< 	
 	#g,uS_$5U377CS;T;[X[:\\` %&c(3s;7G6HL	


 '(01	LL   ,- 
#g,uS_$5U377CS;T;[X[:\\` %&c#k*:);2?	


 (),-	LL  
 )* "r$[!"	LL99Ur   c                D   | d   }| d   }| j                  d      xs i }| d   }|d   }dj                  d |d   D              xs d	}dj                  d
 |d   |d   z   D              }dj                  d |d   D              xs d}dj                  d |d   D              xs d}	g }
g }dD ]t  }|j                  | d      xs g }|r|d   ni }t        d |D        d      }|
j                  dt	        j
                  |       dt	        j
                  |j                  | d      xs d       dt	        j
                  |j                  d      xs d       dt	        j
                  |j                  d      xs d       dt        |j                  d      du       j                          d t	        j
                  |xs d       d!       |D ]L  }d"j                  d# |j                  d$g       D              xs d}|j                  dt	        j
                  |       d|j                  d%       d&t	        j
                  |j                  d'      xs d       dt	        j
                  |j                  d(      xs d       dt	        j
                  |j                  d      xs d       dt	        j
                  |j                  d      xs d       dt	        j
                  |       d t	        j
                  |j                  d)      xs d       d!       O w dj                  d* |j                  d+      xs g D              }dj                  g d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<t	        j
                  | d=          d>t	        j
                  | d?          d@| dA    dB| dC    dD	dEt	        j
                  | dF          dGdEt	        j
                  | dH          dGdIdJ|d    dK|dL    dM|d    dNdO|dP    dQ|dR    dSdT|dU    dV|dW    dXdYj                  |dZ          dV|d[    dS	d\|d]    d^|d_    dSd`|da    db|dc    dd|de    dSdf| dg    dSdh| di    dSdjt	        j
                  |j                  dk      xs d       dl|j                  dm       dSdnt	        j
                  |j                  do      xs d       dp|j                  dq       dSdr| ds    dSdt| du    dSdv| dw    dNdxdydEt	        j
                  |j                  dz      xs d{       dGd|dj                  |
      d}d~ddj                  |      d}dd|d}dd|d}dd|d}dd|d}dd|	d}ddd{      S )Nri  rp  rx  ry  r-  r  c              3    K   | ]|  }d t        j                  |d          dt        j                  |d          dt        j                  dj                  d |j                  d      xs g D              xs d       d	 ~ y
w)<tr><td><code>r   </code></td><td>rQ   	</td><td>r  c              3  6   K   | ]  }|d     d|d      ywr  r   r  s     r   r  z&html_page.<locals>.<genexpr>.<genexpr>h  s&     $vPTWa[8I7J%K$vr  r   r  
</td></tr>N)htmlescaper  r]   r  s     r   r  zhtml_page.<locals>.<genexpr>d  s       	[[Z12 3{{3y>*+ ,{{499$vX[X_X_`nXoXusu$vv}z}~ @	s   BBru  z.<tr><td colspan="3">No handler refs.</td></tr>c              3     K   | ]k  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d	 m y	w)
r  r   </code></td><td><code>r   r  r   r  r   r  Nr  r  r  s     r   r  zhtml_page.<locals>.<genexpr>l  s       	[[[!123 4[[Z12 3{{3x=)* +{{30123 4		s   A1A3rn  ro  c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |j                  d      xs d       dt        j                  t        |             dt        j                  t	        |j                  d      xs i j                  d	                   dt        j                  |d
          d  yw)r  r4   r  r5   r  r  r  r  r  rD   r  r  N)r  r  r]   r  r]  r  s     r   r  zhtml_page.<locals>.<genexpr>u  s      
 	[[W./ 0[[Z12 3[[)9!:!AcBC D{{,S123 4{{3(9 : @bEEF\]^_` a{{3{+,- .	
s   C!C#r,  z;<tr><td colspan="6">No route-context mode 1 rows.</td></tr>c              3  H  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |j                  d      xs d       dt        j                  t        |             dt        j                  |d          d	  y
w)r  r4   r  r5   r  r  r  r  r  r  N)r  r  r]   r  r  s     r   r  zhtml_page.<locals>.<genexpr>  s      	 	[[W./ 0[[Z12 3[[)9!:!AcBC D{{,S123 4{{3{+,- .		s   B B"r3  z.<tr><td colspan="5">No cross writes.</td></tr>r  r  r   c              3  b   K   | ]'  }|j                  d       s|j                  d        ) ywr  r\   r  s     r   r  zhtml_page.<locals>.<genexpr>  r  r  r  r  r  r  r   r   r  r   Tr  r  r  c              3  &   K   | ]	  }d |   ywr  r   r  s     r   r  zhtml_page.<locals>.<genexpr>  r  r  r   r   </td><td><code>r4   r5   r   c              3    K   | ]}  }d |d    dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d	|d
    d	t        j                  |d          d  yw)z<tr><td>rt   r  r4   r  r5   r   r  r   r  r   r   r  Nr  r  s     r   r  zhtml_page.<locals>.<genexpr>  s      * 	7|n [[W./ 0[[Z12 3[[%7!89: ;7|n 7|n {{3/012 3	*s   BBr   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z;  <title>Save Selector Runtime Selector Byte Writes</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin: 16px 0 28px; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z9    th { background: #1d1d1d; position: sticky; top: 0; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z5  <h1>Save Selector Runtime Selector Byte Writes</h1>z  <p>Route <code>rW  z</code> -&gt; <code>rX  z </code>; current selector <code>rg  z</code> root <code>rh  z</code>.</p>z  <p>r  z</p>r  z  <ul>z    <li>Handler <code>z</code>, general table <code>rq  z</code> opcode <code>z</code>.</li>z     <li>Mode 1 self-write rows: r!  z; cross-write rows: r"  z.</li>z&    <li>Mode 1 rows preceded by <code>r.  z	</code>: r#  z; next prefix <code>r  r/  r$  z)    <li>Mode 1 current-selector writers: r%  z; outside current root: r&  z'    <li>Route-context self-write rows: r(  z"; common prologue signature rows: r)  z ; cross writes to selector 2:0: r*  z5    <li>source/predecessor current-selector writers: r~  z&    <li>leaf-stream opcode 0x4f hits: rz  z)    <li>mode1 continuation stream: <code>r   z-</code>; starts with selected-root consumer: r   z)    <li>mode0 continuation stream: <code>r   z</code>; mode0 is mode1+4: r   z0    <li>root self-write pattern promotes route: r  z,    <li>selector byte write promotes route: r  z     <li>Promotion status: <code>r  z  </ul>z&  <h2>Continuation Stream Preview</h2>r   rf  z  <table><thead><tr><th>mode</th><th>stream</th><th>first opcode</th><th>first handler</th><th>selected-root consumer</th><th>trace stop</th></tr></thead><tbody>z  </tbody></table>z  <h3>Continuation Trace</h3>z  <table><thead><tr><th>mode</th><th>step</th><th>va</th><th>value</th><th>opcode</th><th>handler</th><th>advance</th><th>stop</th></tr></thead><tbody>z%  <h3>Continuation Table Preview</h3>z  <table><thead><tr><th>index</th><th>va</th><th>value</th><th>low opcode</th><th>u16 lo</th><th>u16 hi</th><th>class</th></tr></thead><tbody>z  <h2>Handler References</h2>zX  <table><thead><tr><th>ref</th><th>section</th><th>table match</th></tr></thead><tbody>z$  <h2>Selector Global Text Refs</h2>zf  <table><thead><tr><th>target</th><th>ref</th><th>access</th><th>instruction</th></tr></thead><tbody>z  <h2>Route Mode 1 Rows</h2>z  <table><thead><tr><th>va</th><th>value</th><th>target selector</th><th>root context</th><th>common prologue</th><th>role</th></tr></thead><tbody>z  <h2>Cross Writes</h2>z{  <table><thead><tr><th>va</th><th>value</th><th>target selector</th><th>root context</th><th>role</th></tr></thead><tbody>z</body>z</html>)r]   r  r  r8   r  r  r]  r  )rL  r  r   r  r  r  handler_rowsglobal_rows	mode_rows
cross_rowscontinuation_summary_rowscontinuation_trace_rowsr  r  r  r  r_   r   continuation_preview_rowss                      r   	html_pager  ]  sy
   /0H./G;;;<BL%&D./L99  /0  : 
:  ))  K(8J+?? K 		 
 /0
 
 
G 
G   	   01	 	 	: 
:  !# &   H:U!34:!arUeUWZ[!((X./ 0\%5%5
BW6X%Y%`]`ab cUYY{%;%BsCD EUYY~%>%E#FG Huyy!>?4GHNNPQ R;;t{s+, -		
  	CxxVRT9UVV]Z]H#**![[23 4wwv' (![[)9)@SAB C![[)<)CDE F![[)=)DEF G![[)@)GCHI J{{8,- .{{377<#8#?C@A B		8 !%		 *  ##N39r* ! 99 BBB 	B 	#	B
 	QB 	FB 	B 	iB 	UB 	XB 	DB 	'B 	B 	B 	B  	@!B" DKK(9:;;OPTP[P[\cdl\mPnOo  pP  QX  Yj  Qk  Pl  l  @G  HX  @Y  Z  Zf  	g#B$ GL12348%B& G$DEFGtL'B( 	)B* !!8 99VW^_wWxVy  zO  PW  Xc  Pd  Oe  er  	s+B, +<8M+N*OOcdp  rH  eI  dJ  JP  	Q-B. 1>Y1Z0[[deq  s[  f\  e]  ]q  rv  r{  r{  |H  I^  |_  r`  qa  aj  kw  xZ  k[  j\  \b  	c/B0 4D9Z4[3\\tuy  {n  vo  up  pv  	w1B2 2,?[2\1]]  AM  Np  Aq  @r  rR  S_  `B  SC  RD  DJ  	K3B4 @Hw@x?yy  	A5B6 19U1V0WW]^7B8 4DKK@P@PQm@n@uru4v3w  xe  fr  fv  fv  w\  f]  e^  ^d  	e9B: 4DKK@P@PQm@n@uru4v3w  xS  T`  Td  Td  ex  Ty  Sz  z@  	A;B< ;7Cf;g:hhno=B> 7w?_7`6aagh?B@ +73D+E*FmTABB 	CBD 	1EBF L,,->?E2FGtLGBH 	lIBJ 			+,KBL 	MBN 	(OBP 	bQBR 			)*SBT 	UBV 	0WBX 	YYBZ 	"[B\ 	]B^ 	(_B` 	caBb 	cBd 	eBf 	/gBh 	qiBj 	kBl 	mBn 	'oBp 	^qBr 	sBt 	uBv 	"wBx 	FyBz 	{B| 	}B~ 	B@ 	ABB 	CB B Br   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok/save_selector_runtime_selector_byte_writes.jsonF),rZ   )ensure_ascii
separatorsr  utf-8encoding)mkdir
write_textjsondumps)rL  out_dirs     r   write_outputsr    sD    MM$M.@@LL

7:FM M r   c            	        t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  d	t        t               | j                         }t        |j                  j                         t        j                  |j                  j                  d
            t        j                  |j                  j                  d
                  }t!        ||j"                         t%        d|d   d    d|j"                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz--selectorszsave_scene_selectors.jsonz--leaf-streamszsave_selector_leaf_streams.jsonz	--out-dirr  r  z+wrote runtime selector byte write summary (ry  r%  z current-selector writer) -> r  )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr  r*   
read_bytesr  loadsre   	read_textr^  r  r  print)parserargsrL  s      r   mainr    s)   $$9F
dD=4HI
D#@[:[\
(tSCd=de
$<D

4>>++W+=>

4$$...@AG
 '4<<(		&'(IJK LllNNO	Qr   __main__)r   r"   returnr]  )r   
str | Noner  
int | None)r*   r   r+   
list[dict]r,   r"   r  r  )r*   r   r+   r  r9   r"   r/   r"   r0   r"   r  r  )r*   r   r+   r  r,   r"   r  r:  )r+   r  r,   r  r  r  )r+   r  rP   r]  r  r:  )r_   dict | Noner  r  )re   r  r  z!tuple[list[int], dict[int, dict]])r,   r"   rs   z	list[int]rf   zdict[int, dict]r  r  )r*   r   r   r"   r  r:  )r*   r   r+   r  r   r"   r  r  )r   r"   r  r  )r*   r   r+   r  r   r"   r  r  )r*   r   r+   r  r  r  )
r*   r   r+   r  r   r"   r   r"   r  r:  )r*   r   r+   r  r   r"   r   r"   r   r"   r  r  )0   )
r*   r   r+   r  r   r"   r   r"   r  r  )r*   r   r+   r  r  r:  )r   r"   r  r:  )r*   r   r+   r  re   r  r  ztuple[list[dict], dict])r?  r  rO  r  r  r]  )r^  r  r  r  )r*   r   re   r  r^  r  r  r:  )r_   r:  r  r]  )rL  r:  r  r]  )rL  r:  r  r   r  None)r  r  )Qr   
__future__r   r  rq   r  r  r(   syscollectionsr   pathlibr   pathinsertr]  __file__resolveparentprobe_exe_scene_tablesr   r   r   summarize_script_handler_tabler	   r
   r  r  r  r  r  r   r   r   r   r   r   r   r   r   rE   rF   rG   r6  r7  r5  r8  r  r  r  r   r   r#   r.   r<   rM   rT   rW   r`   rh   ru   r   r   r   r   r   r   r   r   r  r  rM  r4  rc  r  r  r  r  r  r  __name__r   r   r   <module>r      si   J "      
   3tH~--/667 8 L L T H~''*
Ul * ) % % !+  *  & &  $ !+ ( 4 	"    % 		-4 	 
   ,.03&$<.,..< 3)	)) )
 ) ) )XB2.n	nn n 	nb 8aHZzZz 25 ( zF r   