"""Bounded pinned-image evidence for actual commodity UID containers and readiness."""
import bisect,hashlib,json,re,struct
from pathlib import Path
import pefile
from capstone import Cs,CS_ARCH_X86,CS_MODE_64

image=Path('artifacts/ship-model-reference/client-copy/EliteDangerous64.exe');raw=image.read_bytes()
expected='6891f70a021fa9f3a0e00458c284f48d1226e68ae7fc02ad48081aed47857e93'
if hashlib.sha256(raw).hexdigest()!=expected:raise ValueError('Expected pinned source image')
pe=pefile.PE(data=raw,fast_load=True);base=pe.OPTIONAL_HEADER.ImageBase
pe.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_EXCEPTION']])
entries=sorted((e.struct.BeginAddress,e.struct.EndAddress,e.struct.UnwindData) for e in pe.DIRECTORY_ENTRY_EXCEPTION);starts=[e[0] for e in entries]
def parent(rva):
    at=bisect.bisect_right(starts,rva)-1
    if at<0 or not entries[at][0]<=rva<entries[at][1]:return None
    row=entries[at]
    for _ in range(16):
        h=pe.get_data(row[2],4)
        if not h[0]>>3&4:return hex(row[0])
        row=struct.unpack('<III',pe.get_data(row[2]+4+((h[2]+1)&~1)*2,12))
    raise ValueError('Unwind depth')
dis=Cs(CS_ARCH_X86,CS_MODE_64)
tables={}
for key,start,size in [('enumeration',0x5241A48,0x48),('definitions',0x5219760,0x78),('commodityStyle',0x552D9F8,0x80)]:
    tables[key]=[dict(slot=hex(i),target=hex(struct.unpack('<Q',pe.get_data(start+i,8))[0]-base)) for i in range(0,size,8)]
leafs={hex(rva):[f'{i.address:x}: {i.mnemonic} {i.op_str}' for i in dis.disasm(pe.get_data(rva,128),rva)] for rva in (0x1e08e20,0x1e1d710,0x1e117e0)}
readiness=[]
# Bound the search to the enumeration provider's source family. Instruction
# windows are candidates only: their owning source must be proved separately.
start=0x1DD0000;data=pe.get_data(start,0x1E30000-start)
for field in (0x130,0xA8,0xB0):
    disp=struct.pack('<I',field)
    pattern=rb'[\x40-\x4f]?[\x88\x89\x8b\xc6\xc7][\x80-\xbf]'+re.escape(disp)
    for match in re.finditer(pattern,data,re.S):
        rva=start+match.start();ins=next(dis.disasm(pe.get_data(rva,16),rva),None)
        if ins is None:continue
        readiness.append(dict(field=hex(field),rva=hex(rva),parent=parent(rva),instruction=ins.mnemonic+' '+ins.op_str))
result=dict(imageSha256=expected,tables=tables,leafs=leafs,readinessCandidates=readiness)
out=Path('artifacts/galaxy-query-research/commodity-tree/container-evidence.json');out.write_text(json.dumps(result,indent=2),encoding='utf-8')
print(json.dumps(readiness,indent=2))
