
    IjF                    d   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mZ ddl	m
Z
 ddlmZmZ  ee      j                         j                   d   Zedz  Zd	Zd
ZdZdZdZdZdZdZg dZg dZdg dddg dddg dddg dddg ddgZeddd ed!d"d ed#d$d iZd@d%ZdAd&Z dBd'Z!dCd(Z"dDd)Z#dEd*Z$dFd+Z%dGdHd,Z&dId-Z'dJd.Z(dKd/Z)dLd0Z*dMd1Z+dNd2Z,dOd3Z-dPd4Z.dQd5Z/dRd6Z0dSd7Z1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dTd8Z2dUd9Z3	 	 dV	 	 	 	 	 	 	 dWd:Z4dXd;Z5dXd<Z6edfdYd=Z7dZd>Z8e9d?k(  r e8        yy)[zCScan direct EXE references to save-selector selected-pointer roots.    )annotationsN)Path)Any)offset_to_varead_sections   outz0:0z1:0z2:0i0Y i5-D i+T iD+T i+T )z static-current-selector-text-refz%selected-pointer-runtime-current-rootz opcode08-current-root-activationzreal-selector-2-0-savedataz"strict-hotspot-or-runtime-producer)zR.text reference or decoded control-flow selecting current selector root 0x00540714z8runtime watchpoint showing 0x0059de30 becomes 0x00540714zJopcode 0x08 activation at 0x0040adfe with context+0x40 set from 0x00540714z/captured save bytes 0x0002=0x02 and 0x0003=0x00zTstrict map1_01a source hotspot or equivalent runtime producer selecting selector 2:0Hwanse2.exe)selectedPointerGlobalHexselectedPointerWriterHookVasselectedPointerReaderHookVasselectedPointerHandlerContexts)pathfieldszout/save_scene_selectors.json)currentSelectorcurrentSelectorRootHex	fieldMapszout/save_loader_trace.json)z"frontierExample.selectedPointerHexz%frontierExample.secondLevelPointerHexzfrontierExample.leafPointerHexz1out/save_selector_real_savedata_evidence_gap.json)currentSelectorRealSaveCountselectedPointerRealSaveCount
proofFoundz&out/runtime_selected_pointer_poll.json)currentRootHexobservedSelectorsanyReachedRouteSelectorContext
0x00500c3c
0x00501808)rowPointerHexselectedPointerHex
0x00476ab4
0x00478364
0x0053f328
0x00540714c                    d| dS )N0x08x values    K/home/exedev/hwanse/tools/summarize_save_selector_selected_pointer_usage.pyhex32r)   e   s    c{    c                "    | rt        | d      S d S )N   )intr&   s    r(   	parse_hexr.   i   s    "3ub>,,r*   c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r   fallbacks     r(   	load_jsonr8   m   s*    ;;=::dnngn677r*   c                    |j                  dd      \  }}t        |      }t        |      }t        |   }| D ]3  }|j                  d      |k(  s|j                  d      |k(  s-i ||c S  |S )N:r   groupslot)splitr-   FALLBACK_SELECTORSget)	selectorslabel
group_text	slot_textr;   r<   r7   rows           r(   selector_rowrE   s   sy    !KKQ/J	
OEy>D!%(H '777u$D)@&h&#&&' Or*   c                N    | D ]   }|d   }||d   z   }||cxk  r	|k  s|c S  " y )Nrawraw_sizer%   )sectionsoffsetsectionstartends        r(   section_for_offsetrN   ~   sE     gj))F S N !
 r*   c                V    | D ]$  }|d   }||d   z   }||cxk  r|k  sn |d   c S  y )Nvasizenamer%   rI   rP   rK   rL   rM   s        r(   section_name_for_varT      sD     #gfo%B6?"	#
 r*   c                    g d}|D ]0  \  }}}}||z   }|dk  r| || |k(  s||z   }	t        |	      ||dc S  t        |      dddS )N))s   zmov eax, dword [imm32 + eax*4]read)s   rV   zmov ecx, dword [imm32 + eax*4]rW   )s   rV   zmov edx, dword [imm32 + eax*4]rW   )s   mov al, byte [imm32]rW   )s   rX   zmov cl, byte [imm32]rW   )s   rX   mov eax, dword [imm32]rW   )s   rX   zmov ecx, dword [imm32]rW   )s   rX   zmov edx, dword [imm32]rW   )s   rX   mov dword [imm32], eaxwrite)s   =rX   zcmp dword [imm32], imm8rW   )   rY   rW   )   r^   rZ   rW   )   r^   zmov byte [imm32], alr\   )   r^   r[   r\   r   )instructionVaHexinstructionaccesszdword literal/data pointerliteral)r)   )
exefile_offsetref_vapatternspatternrelative_startdescriptionrd   pattern_startinstruction_vas
             r(   infer_instructionro      s    H  9A 
4f#n41}[)W4#n4N$).$9*  
 "&M3 r*   c                ~    t        |d   ||z
        }t        |d   |d   z   ||z         }| || j                  d      S )NrG   rH    )maxminhex)rf   rK   rg   beforeafterrL   rM   s          r(   bytes_aroundrw      sM    f 45E
genwz22K%4G
HCuS>c""r*   c                J   t        j                  d|      }g }|D ]  }|d   }| |||d   z    }d}	 |j                  ||      }	|	dk  r.||	z   }
t        ||
      }|@t	        | |
|      }|j                  |d   t        |      d|
dt        | ||
      d|       |	d	z   }q |S )
Nz<IrG   rH   r   rR   r#   06x)rK   refVaHexfileOffsetHexbytesAroundr   )structpackfindr   ro   appendr)   rw   )rf   rI   r'   needlerefsrK   section_startdatasearchhitrg   rh   rc   s                r(   	find_refsr      s    [[u%FD =1D!DE))FF+CQw'#-K!(K8F!/[&I&v %f')+c):%;#/Wk#J	
 "  1WF 	( Kr*   c                    i }| D ]   }|j                  |d   d      dz   ||d   <   " t        t        |j                                     S )NrK   r   r   r?   dictsorteditems)r   countsrefs      r(   section_countsr      sP    F C!'C	NA!>!Bs9~Cv||~&''r*   c                   t        | t              }t        | t              }t        | t              }|j	                  d      xs i }dt
        dddt        dddt        |j	                  d            d	dd
t        |j	                  d            dddt        |j	                  d            dddt        |j	                  d            dddt        |j	                  d            dddt        |j	                  d            dddt        |j	                  d            dddt        |j	                  d            dddt        dddt        dddt        d dg}|D cg c]
  }|d!   	| c}S c c}w )"NfrontierExampleselected-pointer-globalz:runtime global holding the selected scene/progress pointer)rR   r'   rolezselector-group-tablez7save selector group table indexed by save offset 0x0002zsource-selector-row-0:0r   z(row pointer for source-side selector 0:0zsource-selector-root-0:0r   z2selected pointer root for source-side selector 0:0ztarget-selector-row-1:0z(row pointer for target-side selector 1:0ztarget-selector-root-1:0z2selected pointer root for target-side selector 1:0current-selector-row-2:0z$row pointer for current selector 2:0current-selector-root-2:0z.selected pointer root for current selector 2:0current-second-level-table-2:0secondLevelPointerHexz'second-level table used by selector 2:0current-frontier-leaf-2:0leafPointerHexz@sample frontier leaf for map1_01a -> map2_02d under selector 2:0current-frontier-reader-2:0zEfrontier reader/resource gate row before map1_01a -> map2_02d recordscurrent-source-record-map1_01az.current selector field-map record for map1_01acurrent-target-record-map2_02dz.current selector field-map record for map2_02dr'   )rE   SOURCE_SELECTORTARGET_SELECTORCURRENT_SELECTORr?   SELECTED_POINTER_GLOBALSELECTOR_GROUP_TABLEr.   CURRENT_FRONTIER_READERCURRENT_SOURCE_RECORDCURRENT_TARGET_RECORD)r@   save_loader_tracesourcetargetcurrentfrontiervaluesrD   s           r(   make_watch_valuesr      s   )_5F)_5F9&67G $$%67=2H .,P	
 +)M	
 .vzz/:;>	
 /vzz*>?@H	
 .vzz/:;>	
 /vzz*>?@H	
 /w{{?;<:	
 0w{{+?@AD	
 5x||,CDE=	
 0x||,<=>V	
 2,[	
 5*D	
 5*D	
{BFF ">CS\%=C>>>s   !
E3,E3c                   g }|D ]  }t        |d         }t        | ||      }|j                  |d   t        |      t	        ||      |d   t        |      t        d |D              t        d |D              t        |      |d	        |S )Nr'   rR   r   c              3  2   K   | ]  }|d    dk(  sd  ywrK   .textr   Nr%   .0r   s     r(   	<genexpr>z"add_ref_summary.<locals>.<genexpr>0       OcS^w5NO   c              3  2   K   | ]  }|d    dk7  sd  ywr   r%   r   s     r(   r   z"add_ref_summary.<locals>.<genexpr>1  r   r   )	rR   valueHextargetSectionr   refCounttextRefCountdataRefCountsectionCountsr   )r-   r   r   r)   rT   lensumr   )rf   rI   watch_valuesrowsrD   r'   r   s          r(   add_ref_summaryr   %  s    D CL!h.Ke05AKD	OTOOOTOO+D1

 
	 Kr*   c                ,    t        fd| D              S )Nc              3  4   K   | ]  }|d    k(  s|  yw)rR   Nr%   )r   rD   rR   s     r(   r   zrow_by_name.<locals>.<genexpr>9  s     ;s6{d':;s   )next)r   rR   s    `r(   row_by_namer   8  s    ;t;;;r*   c                $   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}g }| j                  d      xs g D ci c](  }|j                  d      dk(  r|j                  d      |* }}|j                         D ]`  \  }}|j                  |      }|j                  ||d u|r|j                  d      nd |r|j                  d      nd |d   |d   |d   d       b |j                  d      xs g D ]  }|j                  d      }	|	s|	|vs|j                  |	|	|v |j                  |	i       j                  d      |j                  |	i       j                  d      |j                  d       xs d!|j                  d      d"d        |S c c}w )#Nzsave-loader-writerzJsave loader stores selector group/slot result into selected-pointer globalz.captured save bytes must select group 2 slot 0)	mechanismmeaningrouteRequirementzopcode07-indexed-writerz<opcode 7 stores indexed pointer into selected-pointer globalz8opcode 7 selected slot must resolve to selector 2:0 rootzopcode08-zero-checkzFopcode 8 checks whether selected-pointer global is zero before jumpingz>selected-pointer global must already contain selector 2:0 rootzopcode08-activator-readzDopcode 8 reads selected-pointer global and jumps active stream to itzopcode09-mode0-writerzJopcode 9 mode 0 stores current stream pointer into selected-pointer globalz8current stream must already be inside selector 2:0 rangezopcode09-mode1-writerzJopcode 9 mode 1 stores stream operand pointer into selected-pointer globalz1stream operand must point into selector 2:0 range)
0x004234ba
0x0040adb8
0x0040add6
0x0040adfe
0x0040ae37
0x0040ae4ar   rK   r   rb   rd   rc   r   r   r   )vaHexpresentrd   rc   r   r   r   selectedPointerRuntimeUsesevidenceVaHexkindzruntime-usez8inspect runtime selected-pointer value on the route path)r?   r   r   )
selected_global_refsr   known_meaningshooksr   by_instructionva_hexinforuntime_useevidences
             r(   build_hook_pointsr   <  s    .c P
 3U Z
 /_ `
 3] `
 1c Z
 1c S
5N@ E (++F39r779( 	"#S(N 
 ',,. 
  ($+.cggh'D58377=1dk*I $%7 8
 	
 ),,-IJPb ???36LL!#~5(,,Xr:>>xH-11(B?CCMR(__V4E&??95$^  L9s   -Fc                    i }| D ]/  }|j                  d      xs d}|j                  |d      dz   ||<   1 t        t        |j                                     S )Nrd   unknownr   r   r   )hook_pointsr   hookrd   s       r(   hook_access_countsr   }  sZ    F 3(#0yFA.2v3 v||~&''r*   c                b    | D ]*  }|d   }||d   z   }||cxk  r|k  sn |d   ||z
  z   c S  y )NrP   rH   rG   r%   rS   s        r(   va_to_offsetr     sN     1gj))B5>R%Z00	1
 r*   c                J    t         j                  |       j                  d      S Nrq   )bytesfromhexrt   )texts    r(   normalize_hex_bytesr     s    ==""3''r*   c                N    t        ||      }|y | |||z    j                  d      S r   )r   rt   )rf   rI   rP   lengthrJ   s        r(   bytes_at_var     s2    (B'F~vfvo&**3//r*   c           
         t        |      }t        | ||t        t        j	                  |                  xs d}|t        |      ||||k(  dS )N )rA   r   expectedBytesactualBytesmatches)r   r   r   r   r   r)   )rf   rI   rP   expectedrA   expected_normactuals          r(   
byte_checkr     sQ    '1MhCh0G,HIORFr&]* r*   c           	         | t        |      |D cg c]  }t        |       c}t        d |D              ||||dS c c}w )Nc              3  &   K   | ]	  }|d      yw)r   Nr%   r   checks     r(   r   z(build_handler_context.<locals>.<genexpr>  s     =Ui(=   )rR   handlerVaHexhookVaHexesverified
byteCheckscontextEffectrouteImplication	traceHook)r)   all)rR   
handler_vahook_vascheckscontext_effectroute_implication
trace_hookrP   s           r(   build_handler_contextr	    sJ     j),45bb	5=f=='-	 	 6s   <c                   t        dddgt        | |ddd      t        | |ddd	      t        | |d
dd      t        | |ddd      gddd      t        dddgt        | |ddd      t        | |ddd      t        | |ddd      t        | |dd d!      t        | |ddd      t        | |d"d#d$      gd%d&d'      t        d(d)d*d+gt        | |d,d-d.      t        | |d*d/d0      t        | |d1d2d3      t        | |d+d4d5      t        | |d6d7d8      gd9d:d;      t        d<d=d>d?gt        | |d@dd      t        | |dAddB      t        | |d>ddC      t        | |d?ddD      t        | |dEdFdG      t        | |dHdIdJ      gdKdLdM      gS )NNzsave-loader-selector-storei4B i4B i4B za0 da 76 45 00z#read selector group byte 0x004576dai4B z8b 04 85 35 2d 44 00z%index selector group table 0x00442d35i4B z8a 0d db 76 45 00z"read selector slot byte 0x004576dbza3 30 de 59 00z(store selected pointer global 0x0059de30z^save bytes 0x0002/0x0003 select a group/slot row, then store the selected root into 0x0059de30z[a captured save must contain selector group 2 slot 0 before this store can prove 0x00540714z:watch write 0x004234ba or load a real selector 2:0 savedat)rR   r  r  r  r  r  r  zopcode07-indexed-storei@ i@ i@ z8b 40 40z-load current stream pointer from context+0x40i@ z8a 48 01z(read zero-extended slot byte at stream+1i@ z8b 40 04zread pointer table at stream+4i@ z8b 04 88zselect table entry by slot bytei@ z83 40 40 08zadvance stream by 8zTselected pointer = dword[[context+0x40]+4 + zero_extend(byte[[context+0x40]+1]) * 4]z]non-current roots would need an opcode 0x07 row selecting 0x00540714; current scans find nonez0break on 0x0040adb8 and inspect eax before storezopcode08-activatoriɭ@ i֭@ i@ iҭ@ z83 40 40 04z0advance stream by 4 before selected-pointer testz83 3d 30 de 59 00 00z%test selected pointer global for zeroi@ z89 44 8a 44z%push return stream into context stackza1 30 de 59 00z'read selected pointer global 0x0059de30i@ z89 41 40z*replace context+0x40 with selected pointerzSif 0x0059de30 is nonzero, save the current stream and set context+0x40 = 0x0059de30z`0x0040adfe is the narrowest runtime proof point for showing selector 2:0 becomes active bytecodez<break on 0x0040adfe and require eax/0x0059de30 == 0x00540714zopcode09-stream-storei@ i7@ iJ@ i@ i@ zread mode byte at stream+1z)mode 0 stores post-advance stream pointerz&mode 1 stores stream+4 operand pointeri`@ z83 7d fc 00zdispatch mode 0ij@ z83 7d fc 01zdispatch mode 1zmode 0 stores the current active stream, mode 1 stores dword[stream+4], other modes fall through without a selected-pointer storezwopcode 0x09 only promotes if the active stream or operand is already in selector 2:0; current evidence is internal onlyzDbreak on 0x0040ae37/0x0040ae4a and classify the stored pointer range)r	  r   )rf   rI   s     r(   'build_selected_pointer_handler_contextsr    s   -! \3*6FHmn3*6LNuv3*6IKop3*6FHrs	 |{S	
 	)! \3*jBqr3*jBlm3*jBbc3*jBcd3*6FHrs3*mEZ[ r}I	
  	%! *-3*mEwx3*6LNuv3*mElm3*6FHqr3*jBno q AU	
 	(! *-3*jBqr3*jB^_3*6FHst3*6FHpq3*mEVW3*mEVW _ X]	
]> >r*   c                   t        |       }||nt        t        dz  g       }||nt        t        dz  i       }t        ||      }t	        | ||      }t        |d      }t        |d      t        |d      t        |d      t        |d      t        |d      t        |d	      t        |d
      g}t        d |D              }t        ||      }	t        | |      }
|	D cg c]  }|j                  d      dk(  s|d    }}|	D cg c]  }|j                  d      dk(  s|d    }}|dk(  }|rdnd}i dddt        dt        dt        dt        t              dt        t              dt        |d      d   d|d|d|d   d t!        |	      d!t#        |      d"t#        |      d#|d$|d%|	D cg c](  }|j                  d      dk(  s|j                  d&      * c}d'|	D cg c](  }|j                  d      dk(  s|j                  d&      * c}t#        |
      t%        d( |
D              |
d)d)d*d*t&        t(        t*        t#        t*              ||	g d+|d,S c c}w c c}w c c}w c c}w )-Nsave_scene_selectors.jsonsave_loader_trace.jsonr   r   r   r   r   r   r   r   c              3  &   K   | ]	  }|d      yw)r   Nr%   r   rD   s     r(   r   z build_summary.<locals>.<genexpr>  s      M^!4 Mr   rd   r\   r   rW   r   a  Selector 2:0 is present as data reachable from the save selector table, but this exact scan finds no .text direct reference to the current selector row/root/leaf/route records. Static evidence still points to the selected-pointer global 0x0059de30 as the runtime choke point: prove group/slot 2:0 by save bytes or catch 0x0059de30 containing 0x00540714 before opcode 8 switches context+0x40 to that stream.zwAt least one selector 2:0 value has a direct .text reference; inspect that reference before treating 2:0 as table-only.scopez<direct little-endian dword references in loaded EXE sectionssourceSelectortargetSelectorr   r   selectorGroupTableHexr   r   currentCodeRefCount$noStaticDirectCurrentSelectorCodeRef!selectedPointerGlobalTextRefCountr   selectedPointerHookAccessCountsselectedPointerWriterHookCountselectedPointerReaderHookCountr   r   selectedPointerWriteMechanismsr   selectedPointerReadMechanismsc              3  &   K   | ]	  }|d      yw)r   Nr%   r  s     r(   r   z build_summary.<locals>.<genexpr><  s     5b#c*o5br   blockedF)zNconstruct or capture a savedata sample with save offsets 0x0002=2 and 0x0003=0zJwatch writes to 0x0059de30 and verify whether the value becomes 0x00540714zdbreak at opcode 8 handler 0x0040adfe and prove context+0x40 is set from 0x00540714 on the route pathzLfind a strict map1_01a hotspot or runtime producer that selects selector 2:0)"selectedPointerHandlerContextCount&selectedPointerHandlerContextsVerifiedr   routePromotionStatuspromotionStatusr   selectedPointerUsageProofFound!failedSelectedPointerUsageGateIdsmissingEvidenceevidenceRefsevidenceRefCountwatchValuesruntimeTraceHookPointsnextEvidenceNeeded
conclusion)r   r8   OUTr   r   r   r   r   r  r?   r   r   r   r)   r   r   r   r   r  &FAILED_SELECTED_POINTER_USAGE_GATE_IDS'SELECTED_POINTER_USAGE_MISSING_EVIDENCE$SELECTED_POINTER_USAGE_EVIDENCE_REFS)rf   save_scene_selectorsr   rI   r   r   selected_globalcurrent_rowscurrent_code_ref_countr   handler_contextsrD   writer_hook_vasreader_hook_vasno_direct_current_code_refr+  s                   r(   build_summaryr8    s.   
 S!H3G3S/Yb))
Z .?-J)PY&&
Q %%9;LML3,7D!$(ABOD45D56D:;D56D78D:;D:;L ! M MM#O5FGK>sHM/:[cggh>OSZ>Zs7|[O[/:Zcggh>OSY>Ys7|ZOZ!71!< &		a
 G *O*/* 	/* 	+	*
 	#E*A$B* 	 ';!<* 	!+d4O"PQ["\* 	5* 	/0J* 	,_^-L* 	*+=k+J* 	)#o*>* 	)#o*>* 	'* 	'*  	),7+
%(3778;LPW;WCGGK +
!*& 	(,7*
%(3778;LPV;VCGGK *
'*, /22B.C255bQa5b2b*: )$*/-SB< DE"-
 !S* * \Z4+
*
s0   I!6I!I&I&5I+I+*I0I0c                j   g ddd| d    d| d    dd| d	    dd
| d    d| d    dd| d    d| d    ddj                  | d          dd| d    ddj                  | d          dd| d    d| d    d| d    d| d     d!| d"    d#| d$    d%d&j                  | d'          dd(t        | d)          d*| d+    d| d,   dd-d| d)   D cg c]  }d.| 	 c}dd/dd0d1| d2   D cg c]4  }d3|d4    d5dj                  |j                  d6      xs g       xs d7 d86 c}dd9dd:d;}| d<   D ]x  }dj                  d= |d>   j                         D              xs d7}|j	                  d?|d@    dA|dB    d5|j                  dC      xs d7 dD|dE    dD|dF    dD| dD|dG    d8       z |j                  g dH       | dI   D ]  }|j	                  d3|dJ    d5|dK    dD|j                  dL      xs d7 dD|j                  dM      xs d7 dA|j                  dN      xs d7 d5|j                  dO      xs d7 dD|j                  dP      xs d7 d8        |j                  ddQddR| dS    ddTdUg       | dV   D ]O  }dj                  |dW         }|j	                  d?|d@    dX|dY    dZ| d5|d[    dD|d\    dD|d]    dD|d^    d8       Q |j                  g d_       | dV   D ]S  }|j	                  d.|d@    d`|d[           |da   D ],  }|j	                  db|dJ    dc|dd    de|df    dg|dh    di	       . U |j                  g dj       |j                  dk | dl   D               |j	                  d       dmj                  |      S c c}w c c}w )nNz&# Save Selector Selected Pointer Usager   z	- scope: r  z- selected pointer global: `r   `z- selector group table: `r  z- current selector/root: `r   z` / `r   z&- selected pointer global .text refs: r  z!- selected pointer writer hooks: r   (, r   )z!- selected pointer reader hooks: r  r   z&- current selector direct .text refs: r  z.- no static direct current selector code ref: r  z- promotion status: r"  z- route promotion status: r!  z- proof found: r   z&- selected pointer usage proof found: r#  z(- failed selected pointer usage gates: `,r$  z- missing evidence count: r%  z- evidence refs: r'  r+  z## Missing Evidence- z## Evidence Refsz| path | fields |z| --- | --- |r&  z| `r   z` | r   -z |z## Watch ValueszM| name | value | target section | refs | .text refs | section counts | role |z-| --- | --- | --- | ---: | ---: | --- | --- |r(  c              3  0   K   | ]  \  }}| d |   ywr:   Nr%   r   rK   counts      r(   r   zmarkdown.<locals>.<genexpr>|  s     cNGUgYaw/c   r   z| rR   z | `r   r   z | r   r   r   )r   z## Runtime Trace Hook Pointsr   zQ| VA | present | access | mechanism | instruction | route requirement | meaning |z+| --- | --- | --- | --- | --- | --- | --- |r)  r   r   rd   r   rc   r   r   z## Handler Contextz- handler contexts verified: r   zP| handler | hooks | verified | context effect | route implication | trace hook |z%| --- | --- | --- | --- | --- | --- |r   r   z `r   z` | `r   r   r   r  )r   z### Handler Byte Checksr   : handler bytes verified=r   z  - `z` rA   : r   z (`r   z`))r   z## Next Evidence Neededr   c              3  &   K   | ]	  }d |   yw)r?  Nr%   r   items     r(   r   zmarkdown.<locals>.<genexpr>  s     G2dVGr   r*  
)joinr   r?   r   r   extend)summaryrJ  rD   linesr   r   r   s          r(   markdownrP  R  s^   '0'
' GG$%&' 'w/I'J&K1M	'
 $G,C$D#EQG' %W->%?$@gNfFgEhhij' 19\1]0^_' ,G4T,U+VVXY]YbYbcj  lJ  dK  ZL  YM  MN  	O' ,G4T,U+VVXY]YbYbcj  lJ  dK  ZL  YM  MN  	O' 19N1O0PQ' 9Ag9h8ij' w'89:;' %W-C%D$EF' ',/01' 19Y1Z0[\'  3388GDg<h3i2jjkl!'" %S1B)C%D$EF#'$ G$6789%'& 	''( 	)'* 	+', 	-'. 	/'0 #**;"<	=$Btf+	=1'2 	3'4 	5'6 	7'8 	9': 	;'@ ~.

 #f+d499SWWX->-D"#E#L"MRP

='D 	E'F 	G'H 	I'J 	XK'L 	8M'EP }% 
cc/FZF`F`FbccjgjVT#j/!2$sww7O7VSV6WWZ:s3~#6"7s6(#c&k]RTV	

 
LL   /0 
#g,tC	N#33swwx7H7OC6PPSww{#*s+40F0M#/Ndww)*1c2#cggi6H6OC5PPRT	

 
LL


'0X(Y'Z[
Z/  78 
		#m,-VRN 34E%S_DUUX?#$C,>(?'@CDTCUUWY	

 
LL4578 r#f+&?J?PQR& 	ELLg'r%.)9E)<L;M N=)*".	 
LL45	LLG1E)FGG	LL99U{ 
>

s   (N+9N0c           !        dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d	 | d   D              }dj                  d
 | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  dddd| d    d| d    d| d    dd| d    dt        j                  dj                  | d                d| d     dt        j                  dj                  | d!                d"| d#    d$| d%    d&| d'    d(| d)    d*| d+    d,| d-    d.t        j                  d/j                  | d0                d1t        | d          d2| d3    d4d5t        j                  | d6          d4d7d8| d9d:d;| d<d=d>|d<d?d@|d<dAdB| dC    d4dD|d<dEd8| d9dFd8| d9g      S )GNrK  c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |j                  d      xs d       d|d    d|d	    dt        j                  d
j                  d |d   j	                         D              xs d       dt        j                  |d          d  yw)<tr><td>rR   </td><td><code>r   </code></td><td>r   r@  	</td><td>r   r   r<  c              3  0   K   | ]  \  }}| d |   ywrB  r%   rC  s      r(   r   z&html_page.<locals>.<genexpr>.<genexpr>  s     $mnguy%%9$mrE  r   r   
</td></tr>N)htmlescaper?   rL  r   r  s     r(   r   zhtml_page.<locals>.<genexpr>  s       	{{3v;'( )[[Z12 3{{377?3:s;< =:  >"# ${{499$mPSTcPdPjPjPl$mmtqtuv w{{3v;'( )	s   CCr(  c              3    K   | ]  }d t        j                  |d          d|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                  |j                  d      xs d       d  yw)<tr><td><code>r   rU  r   rV  rd   r@  r   rT  rc   r   r   rX  N)rY  rZ  r?   r  s     r(   r   zhtml_page.<locals>.<genexpr>  s       	[[W./ 09~ {{3778,345 6{{377;/6378 9[[!7!>3?@ A{{377#56=#>? @{{3779-456 7	s   C9C;r)  c              3  x  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  dj                  |d                d|d    d	t        j                  |d
          d	t        j                  |d          d	t        j                  |d          d  yw)rS  rR   z
<br><code>r   z</code></td><td><code>r<  r   rU  r   rV  r   r   r  rX  NrY  rZ  rL  r  s     r(   r   zhtml_page.<locals>.<genexpr>  s      
 	{{3v;'(
4;;s>?R3S2T U[[3}+=!>?@ A:  {{3/01 2{{31234 5{{3{+,- .	
s   B8B:r   r   c              3     K   | ]E  }d t        j                  |d          d|d    ddj                  d |d   D              z   dz    G y	w)
<li>rR   rF  r   <ul>r   c              3     K   | ]X  }d t        j                  |d          dt        j                  |d          d|d    dt        j                  |d          d	 Z y	w)
z
<li><code>r   z</code> rA   rG  r   z <code>r   z</code></li>NrY  rZ  r   s     r(   r   z&html_page.<locals>.<genexpr>.<genexpr>  so      

 	[[w01$++eGn:U9VVXY E-4H(I'J K
s   AA r   z
</ul></li>Nr^  r  s     r(   r   zhtml_page.<locals>.<genexpr>  sp        	;;s6{#
$$=c*o=Nd	T
'' 

 \*
 
	
 		s   AAc              3  N   K   | ]  }d t        j                  |       d  ywr`  z</li>Nrc  rI  s     r(   r   zhtml_page.<locals>.<genexpr>  s#     gtDKK$5#6e<g   #%r*  c              3  N   K   | ]  }d t        j                  |       d  ywre  rc  rI  s     r(   r   zhtml_page.<locals>.<genexpr>  s#     cd4;;t#4"5U;crf  r%  c              3     K   | ]l  }d t        j                  |j                  d      xs d       dt        j                  dj                  |j                  d      xs g       xs d       d n yw)r\  r   r@  rU  r<  r   rX  N)rY  rZ  r?   rL  r  s     r(   r   zhtml_page.<locals>.<genexpr>  sq      
 		[[!7C89 :{{499SWWX%6%<"=DEF G	s   A2A4r&  zX<!doctype html><meta charset="utf-8"><title>Save Selector Selected Pointer Usage</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1200px;margin:24px auto}table{border-collapse:collapse;width:100%}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z-<h1>Save Selector Selected Pointer Usage</h1>z!<p>Selected pointer global <code>r   z </code>; current selector <code>r   z</code> root <code>r   z</code>.</p>z"<p>selected pointer writer hooks: r  r;  r<  r   z); reader hooks: r  r   z'); current selector direct .text refs: r  z.; no static direct current selector code ref: r  z; promotion status: <code>r"  z'</code>; route promotion status: <code>r!  z</code>; proof found: r   z&; selected pointer usage proof found: r#  z-; failed selected pointer usage gates: <code>r>  r$  z!</code>; missing evidence count: z; evidence refs: r'  z</p>z<p>r+  z<h2>Missing Evidence</h2>ra  z</ul>z<h2>Evidence Refs</h2>zB<table><thead><tr><th>path</th><th>fields</th></tr></thead><tbody>z</tbody></table>z<h2>Watch Values</h2>z<table><thead><tr><th>name</th><th>value</th><th>target section</th><th>refs</th><th>.text refs</th><th>section counts</th><th>role</th></tr></thead><tbody>z"<h2>Runtime Trace Hook Points</h2>z<table><thead><tr><th>VA</th><th>present</th><th>access</th><th>mechanism</th><th>instruction</th><th>route requirement</th><th>meaning</th></tr></thead><tbody>z<h2>Handler Context</h2>z<p>handler contexts verified: r   z<table><thead><tr><th>handler</th><th>hooks</th><th>verified</th><th>context effect</th><th>route implication</th><th>trace hook</th></tr></thead><tbody>z<h3>Handler Byte Checks</h3>z<h2>Next Evidence Needed</h2>)rL  rY  rZ  r   )rN  
value_rows	hook_rowscontext_rowsbyte_check_itemsevidence_itemsmissing_itemsref_rowss           r(   	html_pagerp    s(     =) J 		  34 I 99 
 ;<
 
L ww  ;<  WWgQeIfggNGGcPaHbccMww 
 >* H 99d 	y7
+G4N,O+PPpqx  zK  rL  qM  M`  ah  iA  aB  `C  CO  	P09Y1Z0[ \DIIg.L&MNOPPa789DKK		RYZxRyHz<{;| }33:;P3Q2R S;;BCi;j:k l''./@'A&B C--45K-L,M N#L12 333:;[3\2] ^[['2U*V!WXY Z''*73D+E'F&G H%&89:$@ dkk',/016#
}oU# 
LXJVfg 	g, 	k"
(1Y)Z([[_` 	d&
 &'
~e$S* * *r*   c                    |j                  dd       |dz  j                  t        j                  | dd      d       |:|j                  j                  dd       |j                  t        |       d       y y )	NT)parentsexist_ok)save_selector_selected_pointer_usage.jsonF)r>  r:   )ensure_ascii
separatorsr0   r1   )mkdir
write_textr4   dumpsparentrp  )rN  out_dirhtml_outs      r(   write_outputsr}    s{    MM$M.::FF

7:F G  dT:Ig.A 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                  d
t        d d       | j                         }t        |j                  j                         t        |j                  g       t        |j                  i             }t        ||j                  |j                          t#        d|j                  dz          y )N)rl   z--exer
   )typedefaultz--selectorsr  z--loader-tracer  z	--out-dirz
--html-outz!Optional HTML report output path.)r  r  helpz.wrote save selector selected pointer usage -> rt  )argparseArgumentParser__doc__add_argumentr   ROOTr,  
parse_argsr8  rf   
read_bytesr8   r@   loader_tracer}  r{  r|  print)parserargsrN  s      r(   mainr    s   $$9F
dD=4HI
D#@[:[\
(tSC[=[\
$<
4DghD$.."%$##R(G
 '4<<7	:4<<Ju;u:v
wxr*   __main__)r'   r-   returnstr)r'   
str | Noner  
int | None)r   r   r7   r   r  r   )r@   
list[dict]rA   r  r  r   )rI   r  rJ   r-   r  dict | None)rI   r  rP   r-   r  r  )rf   r   rg   r-   rh   r-   r  r   )      )rf   r   rK   r   rg   r-   ru   r-   rv   r-   r  r  )rf   r   rI   r  r'   r-   r  r  )r   r  r  dict[str, int])r@   r  r   r   r  r  )rf   r   rI   r  r   r  r  r  )r   r  rR   r  r  r   )r   r   r   r   r  r  )r   r  r  r  )rI   r  rP   r-   r  r  )r   r  r  r  )
rf   r   rI   r  rP   r-   r   r-   r  r  )rf   r   rI   r  rP   r-   r   r  rA   r  r  r   )rR   r  r  r-   r  z	list[int]r  r  r  r  r  r  r  r  r  r   )rf   r   rI   r  r  r  )NN)rf   r   r0  zlist[dict] | Noner   r  r  r   )rN  r   r  r  )rN  r   r{  r   r|  zPath | Noner  None)r  r  ):r  
__future__r   r  rY  r4   r}   pathlibr   typingr   probe_exe_scene_tablesr   r   __file__resolverr  r  r,  r   r   r   r   r   r   r   r   r-  r.  r/  r>   r)   r.   r8   rE   rN   rT   ro   rw   r   r   r   r   r   r   r   r   r   r   r   r	  r  r8  rP  rp  r}  r  __name__r%   r*   r(   <module>r     s<   I "       > H~''*
Ul $ ! $ " " * &+ ' 
 0
 -
 D
 9
E*( $Z %* %* %*  -8 F#4(H?V&<>B((0	
  	
     
,?H /3%)R	R+R #R 
	RjVrdN 25d By" zF r*   