import struct
PATH='extracted/assets/bin/Data/Managed/Metadata/global-metadata.dat'
D=open(PATH,'rb').read()
H=struct.unpack('<68i',D[:272])
class R:
    def __init__(s,i): s.off,s.size=H[i],H[i+1]
SEC=dict(strlit=R(2),strlitdata=R(4),string=R(6),events=R(8),props=R(10),
         methods=R(12),pdefaults=R(14),fdefaults=R(16),defaultdata=R(18),
         marshaled=R(20),params=R(22),fields=R(24),genparams=R(26),
         genconstraints=R(28),gencontainers=R(30),nested=R(32),interfaces=R(34),
         vtable=R(36),ifaceoff=R(38),types=R(40),rgctx=R(42),images=R(44),
         assemblies=R(46),usagelists=R(48),usagepairs=R(50),fieldrefs=R(52),
         refassemblies=R(54),attrinfo=R(56),attrtypes=R(58))
SO,SS=SEC['string'].off,SEC['string'].size
_sc={}
def S(i):
    if i<0 or i>=SS: return ''
    if i in _sc: return _sc[i]
    e=D.index(b'\0',SO+i); v=D[SO+i:e].decode('utf-8','replace'); _sc[i]=v; return v

def recs(name,stride,fmt):
    r=SEC[name]; n=r.size//stride
    return [struct.unpack_from(fmt,D,r.off+i*stride) for i in range(n)]

# --- structs (metadata v24.0) ---
TYPES=recs('types',104,'<11i I 8i 8H 2I')          # 26 fields
METHODS=recs('methods',56,'<12i 4H')
FIELDS=recs('fields',16,'<4i')
PROPS=recs('props',24,'<3i I 2i')
EVENTS=recs('events',28,'<7i')
PARAMS=recs('params',16,'<4i')
IMAGES=recs('images',32,'<8i')
ASSEM=recs('assemblies',68,'<4i 11i 8B'.replace(' ',''))

# string literals
SL=SEC['strlit']; SLD=SEC['strlitdata']
NLIT=SL.size//8
def literal(i):
    ln,off=struct.unpack_from('<Ii',D,SL.off+i*8)
    return D[SLD.off+off:SLD.off+off+ln].decode('utf-8','replace')

TYPE_ATTR_INTERFACE=0x20
def type_name(ti):
    t=TYPES[ti]; ns,nm=S(t[1]),S(t[0])
    return (ns+'.'+nm) if ns else nm

if __name__=='__main__':
    print('types=%d methods=%d fields=%d props=%d events=%d params=%d images=%d assemblies=%d literals=%d'%(
        len(TYPES),len(METHODS),len(FIELDS),len(PROPS),len(EVENTS),len(PARAMS),len(IMAGES),len(ASSEM),NLIT))
    print('--- assemblies/images ---')
    for im in IMAGES:
        print('  %-46s types=%-5d start=%d'%(S(im[0]),im[3],im[2]))
