
    kLj>                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   Zedz  Zedz  Zed	z  Zed
z  Z ee      ej&                  vr"ej&                  j)                  d ee             ddlmZmZ ddZdddZddZddZddZddZddZd dZd!dZ d"dZ!d#dZ"e#dk(  r e"        yy)$aa  Consolidate the consumer-side meaning of status/comment selector +0.

Previous passes proved that the status short-comment payload reads selector
byte object+0xa8+0 after binding object+0xa8 to 0x004576d8.  They also proved
that direct and local dynamic writers for backing offset +0 are still missing.

This report deliberately separates those two facts:

* consumer-side meaning: the same +0 selector drives chapter labels, chapter
  titles, and the status-comment group selector in the status/menu payload.
* producer-side writer: still not proven by static x86 absolute or local
  object-VM writer scans.
    )annotationsN)Path)Any   toolsoutwebzHwanse2.exe)read_sectionsva_to_offsetc                    	 t        j                  | j                  d            }t	        |t
              r|S i S # t        $ r i cY S w xY w)Nutf-8encoding)jsonloads	read_textFileNotFoundError
isinstancedict)pathdatas     5tools/build_status_comment_selector_meaning_review.py	load_jsonr   $   sL    zz$..'.:; dD)41r1  	s   %; A	A	c                    | yd| d| dS )N 0x0x )valuewidths     r   hxr"   ,   s"    }awaZ !!    c                V    t        j                  | dd      S t        |       d      S )Nr   T)quote)htmlescapestrr    s    r   hr*   2   s%    ;;U]r$GGE
$GGr#   c                v    | j                  d      rd| z   S | j                  d      r| j                  d      S | S )Nzout/z../zweb/)
startswithremoveprefix)r   s    r   linkr.   6   s:    vt|v  ((Kr#   c                b    | j                  dd      j                  dd      j                         S )Nu   　 r   )replacestripr)   s    r   normalize_textr4   >   s)    ==3'//;AACCr#   c                   t        |d      }t        ||      }||ddddS t               }|}t        t	        |       |dz         }d}||k  r~|dz   t	        |       k  rD| ||dz    }	|	dk(  rd}n]|	d	k(  r|j                  d
       |dz  }B|	dv rd|	j                          }n)| |   }
|
dk(  rd}n|j                  |
       |dz  }||k  r~t        |j                  dd            }|t        |      || || j                  d      |xs ddS )N   r   unmapped)vaHextextrawHexstatus      s   @
  zentry-break-400a0000s   @     
>      @     @     @  zcontrol-r   nulr   cp949r2   )errorsr0   z
scan-limit)r8   fileOffsetHexr9   r:   
terminator)intr   	bytearrayminlenextendhexappendr4   decoder"   )exesectionsva_hexvaoffbufposendrF   wordbr9   s               r   read_text_recordrY   B   sJ   	VRB
x
$C
{rZPP
+C
C
c#hc	
"CJ
)7c#hsS1W%D**3
**

5!qVV'
|4
H6J

1q% )& #**WY*?@DCc#,""3' 0L r#   c                :   g }dD ]  }| j                  |g       D ]  }|j                  d      dk(  s|j                  d      dk(  s-|j                  |dk(  rdnd|j                  d	d
      |j                  dd
      |j                  dd
      |j                  dd
      |j                  dd
      t        |j                  dg             |j                  dg       D cg c]  }|j                  dd
       c}d         |j                  d        |S c c}w )Nopcode13Tablesopcode14TablessourceModeHex0x03sourceOffsetHex0x00r\   z40 13z40 14recordVaHexr   selectorIdHexclassificationentriespointerVaHex)opcoderb   r^   r`   rc   rd   
entryCountentryPointerHexesc                    | d   | d   fS )Nrb   rg   r   )rows    r   <lambda>z*source_offset0_consumers.<locals>.<lambda>y   s    s=13x=A r#   )key)getrM   rJ   sort)vmrowsrm   rk   entrys        r   source_offset0_consumersrs   h   s   !#D3 66#r? 	Cww'61cgg>O6PTZ6Z-04D-D'''*ww}b'A),")E+.773Db+I),")E*-''2BB*G&)#'')R*@&AY\Y`Y`ajlnYo-pPUeii.K-p		 	IIAIBK	 .qs   Dc                v    dD ]3  }| j                  |g       D ]  }|j                  d      |k(  s|c c S  5 i S )Nr[   rb   )rn   )rp   record_va_hexrm   rk   s       r   table_by_recordrv   }   sG    3 66#r? 	Cww}%6
	 Ir#   c                    t         j                         } t        |       }t        t        dz        }t        t        dz        }t        t        dz        }t        t        dz        }t        t        dz        }t        |      }t        |d      }t        |d      }	t        |d      }
|j                  d	g       D ci c]S  }|j                  d
      r@t        |j                  dd            t        | |t        |j                  d
d                  U }}|	j                  d	g       D ci c]S  }|j                  d
      r@t        |j                  dd            t        | |t        |j                  d
d                  U }}|j                  dg       D ci c]  }|j                  d      | }}g }t        |j                  dg             D ]  \  }}|j                  dd      }|j                  |i       }t        |t              r|j                  di       ni }|j                  dg       }|r|d   ni }|j                  |||j                  dd      |j                  dd      |j                  dg       d d |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dg       d
        g }|
j                  d	g       }t        t!        t#        |      t#        |      t#        |      t#        |                  D ]h  }|t#        |      k  r||   ni }|t#        |      k  r||   ni }|j                  |t%        |d      |j                  |i       j                  dd      |j                  |i       j                  d d      |j                  |i       j                  dd      |j                  |i       j                  d d      |j                  d
|j                  d!d            |j                  dd      |j                  dd      |j                  dd      d"j'                  |j                  dg       d d#       |j                  d$d      |j                  dg       d%       k t        |j                  d&      t              r|j                  d&i       ni }t        |j                  d&      t              r|j                  d&i       ni }g d'}d(d)d*d+t#        |      t#        |      t#        |      t#        |      t#        |      t)        |j                  d,d-            |j                  d.d      |j                  d/d      |j                  d0d      d1d2d3}d#d4|||||||d5d6d7|j                  d.d       d8d9d6d:|j                  d/d       d8d;d<d=d8gd>
S c c}w c c}w c c}w )?Nz status_menu_vm_table_review.jsonz%status_menu_ui_expression_review.jsonz+status_comment_selector_binding_review.jsonz'status_comment_backing_writer_scan.jsonz3status_comment_indirect_selector_writer_review.json
0x004e8b1a
0x004e8ba2
0x004e8608re   rf   indexr   groups
tableIdHexstatusCommentGroupscommentBlockactorTablesr   actorTableCountmaxEntryCountsamples   
tableVaHexrh   r;   
blockVaHexcontainingSceneGroupIds)
r{   r~   r   r   r   firstActorTableVaHexfirstActorEntryCountbindingStatuscommentBlockVaHexr      r9   r8   r    / r   r   )selectorValueselectorValueHexchapterNumberchapterNumberVaHexchapterTitlechapterTitleVaHexstatusCommentBlockVaHexstatusCommentTableIdHexr   r   sampler   sceneGroupssummary)z$out/status_menu_vm_table_review.jsonz)out/status_menu_ui_expression_review.jsonz/out/status_comment_selector_binding_review.jsonz+out/status_comment_backing_writer_scan.jsonz7out/status_comment_indirect_selector_writer_review.json
0x004576d8ra   z.story/chapter selector for status/menu contextz&high-consumer-evidence-writer-unprovenoffset0WriterProvenFoffset0WriteLikeCounttarget0InStatusMenuPayloadCount"target0InStatusCommentPayloadCountzwriter-unresolvedzConsumer-side meaning is promoted: selector +0 indexes chapter number/title lists and the 9-entry status-comment group array.  The upstream writer remains unresolved.)selectorBackingBaseVaHexselectorOffsetHexmeaningCandidatemeaningConfidencesourceOffset0ConsumerCountstatusCommentGroupCountchapterNumberListCountchapterTitleListCountstatusSelectorEntryCountoffset0DirectWriterProvenoffset0DirectWriteLikeCount,offset0DynamicWriterInStatusMenuPayloadCount/offset0DynamicWriterInStatusCommentPayloadCountproducerStatusdecisionz-hwanse-status-comment-selector-meaning-reviewz"direct x86 writer for 0x004576d8+0z	not-foundzwrite-like count )namer;   evidencez9local object-VM dynamic writer inside status/menu payloadzstatus/menu target0 candidates zgame meaningpromotedzVsame selector consumes chapter labels, chapter titles, and status-comment group blocks)
versionkindsourceArtifactsr   sourceOffset0Consumers	indexRowsr   chapterNumberEntrieschapterTitleEntriesevidenceGaps)EXE
read_bytesr
   r   OUTrs   rv   rn   rG   rY   r(   	enumerater   r   rM   rangemaxrJ   r"   joinbool)rO   rP   rp   uibindingbacking_writerindirect_writer	consumerschapter_numbers_rowchapter_titles_rowstatus_selector_rowrr   chapter_numberschapter_titlesgroupbinding_by_tablestatus_groupsr{   table_idbinding_groupcomment_blockactor_tablesfirst_actor_table
index_rowsstatus_entriesstatus_entrybacking_summaryindirect_summarysource_artifactsr   s                                 r   buildr      s   
..
CS!H	3;;	<B	3@@	ABKKLGs%NNON&[ [\O(,I)"l;(\:)"l; ),,Y;99^$ 	EIIgr"#%5c8SSaceIfEg%hhO  (++Ir:99^$ 	EIIgr"#%5c8SSaceIfEg%hhN  ELKKPXZ\D]^5		,/6^^M!"&&)>"CD 
u99\2.(,,Xr:AKM[_A`))."=fhyy3/;LO&#(99->#B!&?A!> 99Y3BQ7(9(=(=lB(O(9(=(=lA(N!.!2!28R!@%2%6%6|R%H+8+<+<=VXZ+[	

* J(,,Y;Ns3}-s?/CSEXZ]^lZmno 
(-M0B(Be$05N8K0K~e,QS!&$&uaL!0!4!4UB!?!C!CFB!O&5&9&9%&D&H&HRT&U . 2 25" = A A&" M%3%7%7r%B%F%FwPR%S+7+;+;NEIIVikmLn+o+099\2+F#(99->#C!&?B!?**UYYy"%=bq%AB!&?B!?$yy)BBG	

* <FnFXFXYbFcei;jn((B7prO=GH[H[\eHfhl=m**9b9su %1#LE&))n#&}#5"%o"6!$^!4$'$7%)/*=*=>SUZ*[%\'6':':;RTU'V8H8L8LMnpq8r;K;O;OPtvw;x-c!G, ?+"+, /- =%/0C0CD[]^0_/`a T%=>N>R>RStvw>x=yz '$t
 s
 _s   =AW+AWWc                   | d   }dj                  d |j                         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S )Nr   r   c              3  X   K   | ]"  \  }}d t        |       dt        |       d $ yw)z<div class='card'><b>z
</b><span>z</span></div>Nr*   ).0kvs      r   	<genexpr>zrender_html.<locals>.<genexpr>  s3      Aq  !vZ!v]Cs   (*c              3     K   | ]a  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d          d	t        |d
          d c yw)<tr><td><code>rg   </code></td><td><code>rb   r^   :r`   </code></td><td>rd   	</td><td>rh   
</td></tr>Nr   r   rk   s     r   r   zrender_html.<locals>.<genexpr>  s      	 	s8}%& 's=)*+ ,s?+,-Qq5F1G/H.I J%&'( )\"#$ %		s   A'A)r   c               3    K   | ]  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d          dt        |d	          d
t        |d          dt        |d          dt        |d          dt        |d          dt        |d          dt        dj                  |j                  dg                    d  yw)r   r   r   r   z
<br><code>r   r   r   r   r   z</code><br><code>r   r   r   r   r   r   r   z<br>z, r   r   Nr*   r   rn   r   s     r   r   zrender_html.<locals>.<genexpr>  s!      	s-./0 1_%&'z!C8L4M2N1O P^$%&j37J3K1L0M Ns45677H3OhKiIjHk l&'()Qs?/C-D,E FX  !_%&'tAdiir8R.S,T+U V	s   CCr   c              3  2  K   | ]  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d	          dt        d
j                  |j                  dg       dd              dt        |d          d  yw)<tr><td>r{   z</td><td><code>r~   r   r   r   r   r   r   r   r   Nr   r   r   r   )r   r   s     r   r   zrender_html.<locals>.<genexpr>'  s       	w ! "u\*+, -u0123 4()*+ ,'() *EIIi4Ra89:; <'() *	s   BBr   c           
   3  |   K   | ]4  }d t        |d          dt        |d          dt        |d          d 6 yw)r   r   r   r;   r   r   Nr   r   s     r   r   zrender_html.<locals>.<genexpr>3  sZ       	V~ X  !Z!" #	s   :<r   c              3  d   K   | ](  }d t        t        |             dt        |       d * yw)z<a class='chip' href='z'>z</a>N)r*   r.   )r   r   s     r   r   zrender_html.<locals>.<genexpr>;  s3       !4:r!D'$?s   .0r   u  <!doctype html>
<meta charset="utf-8">
<title>Status Comment Selector Meaning Review</title>
<style>
  :root { color-scheme: light dark; }
  body { margin: 24px; font-family: system-ui, -apple-system, Segoe UI, sans-serif; line-height: 1.45; }
  h1 { margin: 0 0 8px; font-size: 24px; }
  h2 { margin: 28px 0 10px; font-size: 18px; }
  .muted { color: #667085; }
  .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 10px; margin: 16px 0; }
  .card { border: 1px solid #d0d5dd; border-radius: 8px; padding: 10px 12px; background: rgba(127,127,127,.05); }
  .card b { display: block; font-size: 12px; color: #667085; }
  .card span { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; overflow-wrap: anywhere; }
  table { width: 100%; border-collapse: collapse; margin: 8px 0 20px; }
  th, td { border: 1px solid #d0d5dd; padding: 7px 8px; vertical-align: top; }
  th { text-align: left; background: rgba(127,127,127,.08); }
  code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
  .scroll { overflow-x: auto; }
  .chip { display: inline-block; margin: 0 6px 6px 0; padding: 5px 8px; border: 1px solid #d0d5dd; border-radius: 999px; text-decoration: none; color: inherit; }
</style>
<h1>Status Comment Selector Meaning Review</h1>
<p class="muted">상태창 짧은 문구 selector <code>0x004576d8+0</code>의 소비 의미와 남은 writer gap을 분리한 정리 페이지입니다.</p>
<div class="cards">z</div>
<h2>Source +0 Consumers</h2>
<div class="scroll"><table>
<thead><tr><th>opcode</th><th>record</th><th>source</th><th>classification</th><th>entries</th></tr></thead>
<tbody>z</tbody>
</table></div>
<h2>Selector Index Mapping</h2>
<div class="scroll"><table>
<thead><tr><th>selector</th><th>chapter no.</th><th>chapter title</th><th>status comment block</th><th>actor/max</th><th>sample</th><th>binding</th></tr></thead>
<tbody>z</tbody>
</table></div>
<h2>Status Comment Groups</h2>
<div class="scroll"><table>
<thead><tr><th>index</th><th>table</th><th>block</th><th>actors</th><th>max entries</th><th>samples</th><th>binding</th></tr></thead>
<tbody>z</tbody>
</table></div>
<h2>Evidence Gaps</h2>
<table>
<thead><tr><th>item</th><th>status</th><th>evidence</th></tr></thead>
<tbody>z/</tbody>
</table>
<h2>Source Artifacts</h2>
<p>z</p>
)r   items)r   scardsconsumer_rowsr   
group_rowsgap_rowslinkss           r   render_htmlr     s9   YAGG GGI E GG 	 01	 	M   $ J   /0 J ww  ' H GG *+ E, 7  	 
 	| 
 	| 
 	z  
7 Y- -r#   c                    t               } t        j                  d       t        j                  d       t        dz  j	                  t        j                  | dd      d       t        d	z  j	                  t        |       d       y )
NT)exist_okz+status_comment_selector_meaning_review.jsonFr   )ensure_asciiindentr   r   z+status_comment_selector_meaning_review.html)r   r   mkdirWEB
write_textr   dumpsr   )r   s    r   mainr   o  sy    7DIItIIItI88DD

4eA6 E  	88DDD E r#   __main__)r   r   returndict[str, Any])   )r    z
int | Noner!   rG   r  r(   )r    r   r  r(   )r   r(   r  r(   )r    r(   r  r(   )rO   bytesrP   list[dict[str, Any]]rQ   r(   r  r  )rp   r  r  r  )rp   r  ru   r(   r  r  )r  r  )r   r  r  r(   )r  None)$__doc__
__future__r   r&   r   syspathlibr   typingr   __file__resolveparentsROOTTOOLSr   r   r   r(   r   insertprobe_exe_scene_tablesr
   r   r   r"   r*   r.   r4   rY   rs   rv   r   r   r   __name__r   r#   r   <module>r     s    #   
   H~''*w
Ul
Ul
]u:SXXHHOOAs5z" >2"HD#L*CLaH zF r#   