{"version":3,"file":"index.cjs","sources":["../src/adb.ts","../src/salsa20.ts","../src/blte.ts","../src/store.ts","../src/fetcher.ts","../src/jenkins96.ts","../src/parsers/archiveIndex.ts","../src/parsers/config.ts","../src/parsers/encodingFile.ts","../src/parsers/installFile.ts","../src/parsers/productConfig.ts","../src/parsers/rootFile.ts","../src/utils.ts","../src/wdc.ts","../src/client.ts","../src/dbd.ts"],"sourcesContent":["import assert from 'node:assert';\n\nconst ADB_MAGIC = 0x58465448;\n\nexport interface HotfixEntry {\n    regionID: number,\n    pushID: number,\n    uniqueID: number,\n    tableHash: number,\n    recordID: number,\n    dataSize: number,\n    recordState: number,\n    data: Buffer,\n}\n\nexport default class ADBReader {\n    public build: number;\n\n    public entries: HotfixEntry[] = [];\n\n    public tableEntries = new Map<number, HotfixEntry[]>();\n\n    constructor(buffer: Buffer) {\n        const magic = buffer.readUInt32BE(0);\n        assert(magic === ADB_MAGIC, `[ADB]: Invalid magic: ${magic.toString(16).padStart(8, '0')}`);\n\n        const version = buffer.readUInt32LE(4);\n        assert(version === 9, `[ADB]: Invalid version: ${version.toString()}`);\n\n        const build = buffer.readUInt32LE(8);\n        this.build = build;\n\n        let pointer = 44;\n        while (pointer < buffer.byteLength) {\n            const offset = pointer;\n\n            const entryMagic = buffer.readUInt32BE(offset);\n            assert(entryMagic === ADB_MAGIC, `[ADB]: Invalid entry magic: ${magic.toString(16).padStart(8, '0')}`);\n\n            const regionID = buffer.readInt32LE(offset + 4);\n            const pushID = buffer.readInt32LE(offset + 8);\n            const uniqueID = buffer.readUInt32LE(offset + 12);\n            const tableHash = buffer.readUInt32LE(offset + 16);\n            const recordID = buffer.readUInt32LE(offset + 20);\n            const dataSize = buffer.readUInt32LE(offset + 24);\n            const recordState = buffer.readUInt32LE(offset + 28);\n\n            const data = buffer.subarray(offset + 32, offset + 32 + dataSize);\n\n            const entry: HotfixEntry = {\n                regionID,\n                pushID,\n                uniqueID,\n                tableHash,\n                recordID,\n                dataSize,\n                recordState,\n                data,\n            };\n            this.entries.push(entry);\n\n            if (!this.tableEntries.has(tableHash)) {\n                this.tableEntries.set(tableHash, []);\n            }\n            this.tableEntries.get(tableHash)?.push(entry);\n\n            pointer += 32 + dataSize;\n        }\n    }\n}\n","/* eslint-disable no-bitwise */\n\nimport assert from 'node:assert';\n\nexport default class Salsa20 {\n    private readonly fixed: Uint32Array;\n\n    private readonly key: Uint32Array;\n\n    private readonly nonce: Uint32Array;\n\n    private counter = new Uint32Array([0, 0]);\n\n    private state = new Uint32Array(16);\n\n    private block = new Uint8Array(64);\n\n    private position = 0;\n\n    constructor(key: Uint8Array, nonce: Uint8Array) {\n        assert(key.length === 32 || key.length === 16, 'Salsa20 requires 128-bit or 256-bit key');\n        assert(nonce.length === 8, 'Salsa20 requires 64-bit nonce');\n\n        this.key = new Uint32Array(8);\n        const keyView = new DataView(key.buffer);\n        if (key.length === 32) {\n            for (let i = 0; i < 8; i += 1) {\n                this.key[i] = keyView.getUint32(i * 4, true);\n            }\n            this.fixed = new Uint32Array([\n                0x61707865,\n                0x3320646e,\n                0x79622d32,\n                0x6b206574,\n            ]);\n        } else {\n            for (let i = 0; i < 4; i += 1) {\n                const word = keyView.getUint32(i * 4, true);\n                this.key[i] = word;\n                this.key[i + 4] = word;\n            }\n            this.fixed = new Uint32Array([\n                0x61707865,\n                0x3120646e,\n                0x79622d36,\n                0x6b206574,\n            ]);\n        }\n\n        this.nonce = new Uint32Array(2);\n        const nonceView = new DataView(nonce.buffer);\n        for (let i = 0; i < 2; i += 1) {\n            this.nonce[i] = nonceView.getUint32(i * 4, true);\n        }\n\n        this.generateBlock();\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    private QR(a: number, b: number, c: number, d: number) {\n        let t: number;\n\n        t = (this.state[a] + this.state[d]) & 0xffffffff;\n        this.state[b] ^= (t << 7) | (t >>> 25);\n\n        t = (this.state[b] + this.state[a]) & 0xffffffff;\n        this.state[c] ^= (t << 9) | (t >>> 23);\n\n        t = (this.state[c] + this.state[b]) & 0xffffffff;\n        this.state[d] ^= (t << 13) | (t >>> 19);\n\n        t = (this.state[d] + this.state[c]) & 0xffffffff;\n        this.state[a] ^= (t << 18) | (t >>> 14);\n    }\n\n    private generateBlock() {\n        const init = new Uint32Array([\n            this.fixed[0],\n            this.key[0],\n            this.key[1],\n            this.key[2],\n\n            this.key[3],\n            this.fixed[1],\n            this.nonce[0],\n            this.nonce[1],\n\n            this.counter[0],\n            this.counter[1],\n            this.fixed[2],\n            this.key[4],\n\n            this.key[5],\n            this.key[6],\n            this.key[7],\n            this.fixed[3],\n        ]);\n        this.state = new Uint32Array(init);\n\n        for (let i = 0; i < 20; i += 2) {\n            // Odd round\n            this.QR(0, 4, 8, 12);\n            this.QR(5, 9, 13, 1);\n            this.QR(10, 14, 2, 6);\n            this.QR(15, 3, 7, 11);\n            // Even round\n            this.QR(0, 1, 2, 3);\n            this.QR(5, 6, 7, 4);\n            this.QR(10, 11, 8, 9);\n            this.QR(15, 12, 13, 14);\n        }\n\n        for (let i = 0; i < 16; i += 1) {\n            const word = (this.state[i] + init[i]) & 0xffffffff;\n            this.block[i * 4] = word & 0xff;\n            this.block[i * 4 + 1] = (word >>> 8) & 0xff;\n            this.block[i * 4 + 2] = (word >>> 16) & 0xff;\n            this.block[i * 4 + 3] = (word >>> 24) & 0xff;\n        }\n\n        this.counter[0] = (this.counter[0] + 1) & 0xffffffff;\n        if (this.counter[0] === 0) {\n            this.counter[1] = (this.counter[1] + 1) & 0xffffffff;\n        }\n    }\n\n    process(input: Uint8Array): Uint8Array {\n        const { length } = input;\n        const result = new Uint8Array(length);\n\n        for (let i = 0; i < length; i += 1) {\n            if (this.position === 64) {\n                this.generateBlock();\n                this.position = 0;\n            }\n\n            result[i] = input[i] ^ this.block[this.position];\n            this.position += 1;\n        }\n\n        return result;\n    }\n}\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\nimport zlib from 'node:zlib';\n\nimport Salsa20 from './salsa20.ts';\n\ninterface Block {\n    compressedSize: number,\n    decompressedSize: number,\n    hash: string,\n}\n\ninterface MissingKeyBlock {\n    offset: number,\n    size: number,\n    blockIndex: number,\n    keyName: string,\n}\n\nconst BLTE_MAGIC = 0x424c5445;\nconst ENC_TYPE_SALSA20 = 0x53;\nconst EMPTY_HASH = '00000000000000000000000000000000';\n\nexport default class BLTEReader {\n    public buffer: Buffer;\n\n    public readonly blte: Buffer;\n\n    public readonly blocks: Block[] = [];\n\n    public readonly keys: Map<string, Uint8Array>;\n\n    private processedBlock = 0;\n\n    private processedOffset = 0;\n\n    constructor(buffer: Buffer, eKey: string, keys = new Map<string, Uint8Array>()) {\n        this.blte = buffer;\n        this.buffer = Buffer.alloc(0);\n        this.keys = keys;\n\n        const size = buffer.byteLength;\n        assert(size >= 8, `[BLTE]: Invalid size: ${size.toString()} < 8`);\n\n        const magic = buffer.readUInt32BE(0);\n        assert(magic === BLTE_MAGIC, `[BLTE]: Invalid magic: ${magic.toString(16).padStart(8, '0')}`);\n\n        const headerSize = buffer.readUInt32BE(4);\n        if (headerSize === 0) {\n            const blteHash = crypto.createHash('md5').update(buffer).digest('hex');\n            assert(blteHash === eKey, `[BLTE]: Invalid hash: expected ${eKey}, got ${blteHash}`);\n\n            this.blocks.push({\n                compressedSize: size - 8,\n                decompressedSize: size - 9,\n                hash: EMPTY_HASH,\n            });\n            this.processedOffset = 8;\n\n            return;\n        }\n\n        const blteHash = crypto.createHash('md5').update(buffer.subarray(0, headerSize)).digest('hex');\n        assert(blteHash === eKey, `[BLTE]: Invalid hash: expected ${eKey}, got ${blteHash}`);\n\n        assert(size >= 12, `[BLTE]: Invalid size: ${size.toString()} < 12`);\n\n        const flag = buffer.readUInt8(8);\n        const numBlocks = buffer.readIntBE(9, 3);\n\n        assert(numBlocks > 0, `[BLTE]: Invalid number of blocks: ${numBlocks.toString()}`);\n        assert(flag === 0x0f, `[BLTE]: Invalid flag: ${flag.toString(16).padStart(2, '0')}`);\n\n        const blockHeaderSize = numBlocks * 24;\n        assert(headerSize === blockHeaderSize + 12, `[BLTE]: Invalid header size: header size ${headerSize.toString()} != block header size ${blockHeaderSize.toString()} + 12`);\n\n        assert(size >= headerSize, `[BLTE]: Invalid size: ${size.toString()} < ${headerSize.toString()}`);\n\n        for (let i = 0; i < numBlocks; i += 1) {\n            const offset = 12 + i * 24;\n            const compressedSize = buffer.readUInt32BE(offset);\n            const decompressedSize = buffer.readUInt32BE(offset + 4);\n            const hash = buffer.toString('hex', offset + 8, offset + 24);\n\n            this.blocks.push({\n                compressedSize,\n                decompressedSize,\n                hash,\n            });\n        }\n\n        this.processedOffset = headerSize;\n    }\n\n    private processBlock(buffer: Buffer, index: number, allowMissingKey: false): Buffer;\n    private processBlock(buffer: Buffer, index: number, allowMissingKey: true): Buffer | string;\n    private processBlock(buffer: Buffer, index: number, allowMissingKey: boolean): Buffer | string {\n        const flag = buffer.readUInt8(0);\n        switch (flag) {\n            case 0x45: { // Encrypted\n                let offset = 1;\n\n                const keyNameLength = buffer.readUInt8(offset);\n                offset += 1;\n\n                const keyNameBE = buffer.toString('hex', offset, offset + keyNameLength);\n                offset += keyNameLength;\n\n                const ivLength = buffer.readUInt8(offset);\n                offset += 1;\n\n                const ivBuffer = buffer.subarray(offset, offset + ivLength);\n                offset += ivLength;\n\n                const encryptType = buffer.readUInt8(offset);\n                offset += 1;\n\n                assert(encryptType === ENC_TYPE_SALSA20, `[BLTE]: Invalid encrypt type: ${encryptType.toString(16).padStart(2, '0')} at block ${index.toString()}`);\n\n                const keyName = [...keyNameBE.matchAll(/.{2}/g)].map((v) => v[0]).reverse().join('').toLowerCase();\n                const key = this.keys.get(keyName);\n                if (!key) {\n                    if (allowMissingKey) {\n                        return keyName;\n                    }\n                    throw new Error(`[BLTE]: Missing key: ${keyName} at block ${index.toString()}`);\n                }\n\n                const iv = new Uint8Array(8);\n                for (let i = 0; i < 8; i += 1) {\n                    if (i < ivLength) {\n                        // eslint-disable-next-line no-bitwise\n                        iv[i] = ivBuffer.readUInt8(i) ^ ((index >>> (8 * i)) & 0xff);\n                    } else {\n                        iv[i] = 0x00;\n                    }\n                }\n\n                const handler = new Salsa20(key, iv);\n                const decrypted = handler.process(buffer.subarray(offset));\n\n                if (allowMissingKey) {\n                    return this.processBlock(Buffer.from(decrypted.buffer), index, true);\n                }\n                return this.processBlock(Buffer.from(decrypted.buffer), index, false);\n            }\n            case 0x46: // Frame (Recursive)\n                throw new Error(`[BLTE]: Frame (Recursive) block not supported at block ${index.toString()}`);\n            case 0x4e: // Frame (Normal)\n                return buffer.subarray(1);\n            case 0x5a: // Compressed\n                return zlib.inflateSync(buffer.subarray(1));\n            default:\n                throw new Error(`[BLTE]: Invalid block flag: ${flag.toString(16).padStart(2, '0')} at block ${index.toString()}`);\n        }\n    }\n\n    processBytes(allowMissingKey?: false, size?: number): undefined;\n    processBytes(allowMissingKey: true, size?: number): MissingKeyBlock[];\n    processBytes(allowMissingKey = false, size = Infinity): MissingKeyBlock[] | undefined {\n        const missingKeyBlocks: MissingKeyBlock[] = [];\n\n        while (\n            this.processedBlock < this.blocks.length\n            && size > this.buffer.byteLength\n        ) {\n            const blockIndex = this.processedBlock;\n            const block = this.blocks[blockIndex];\n\n            const blockBuffer = this.blte.subarray(\n                this.processedOffset,\n                this.processedOffset + block.compressedSize,\n            );\n            if (block.hash !== EMPTY_HASH) {\n                const blockHash = crypto.createHash('md5').update(blockBuffer).digest('hex');\n                assert(blockHash === block.hash, `[BLTE]: Invalid block hash: expected ${block.hash}, got ${blockHash}`);\n            }\n\n            if (allowMissingKey) {\n                const buffer = this.processBlock(blockBuffer, blockIndex, allowMissingKey);\n                if (typeof buffer === 'string') {\n                    missingKeyBlocks.push({\n                        offset: this.buffer.byteLength,\n                        size: block.decompressedSize,\n                        blockIndex,\n                        keyName: buffer,\n                    });\n\n                    this.buffer = Buffer.concat([\n                        this.buffer,\n                        Buffer.alloc(block.decompressedSize),\n                    ]);\n                } else {\n                    assert(\n                        buffer.byteLength === block.decompressedSize,\n                        `[BLTE]: Invalid decompressed size: expected ${block.decompressedSize.toString()}, got ${buffer.byteLength.toString()}`,\n                    );\n\n                    this.buffer = Buffer.concat([this.buffer, buffer]);\n                }\n            } else {\n                const buffer = this.processBlock(blockBuffer, blockIndex, allowMissingKey);\n\n                assert(\n                    buffer.byteLength === block.decompressedSize,\n                    `[BLTE]: Invalid decompressed size: expected ${block.decompressedSize.toString()}, got ${buffer.byteLength.toString()}`,\n                );\n\n                this.buffer = Buffer.concat([this.buffer, buffer]);\n            }\n\n            this.processedBlock += 1;\n            this.processedOffset += block.compressedSize;\n        }\n\n        return allowMissingKey ? missingKeyBlocks : undefined;\n    }\n}\n\nexport type { MissingKeyBlock };\n","import fs from 'node:fs/promises';\n\nexport default class Store<K extends string | number | symbol, V> {\n    private data: Record<K, V | undefined>;\n\n    private dataFile: string;\n\n    private promise: Promise<void>;\n\n    constructor(dataFile: string) {\n        this.dataFile = dataFile;\n        this.data = {} as Record<K, V | undefined>;\n\n        this.promise = new Promise((resolve) => {\n            fs\n                .readFile(dataFile, 'utf-8')\n                .then((file) => {\n                    this.data = JSON.parse(file) as Record<K, V | undefined>;\n                    resolve();\n                })\n                .catch(() => {\n                    resolve();\n                });\n        });\n    }\n\n    public async get(key: K): Promise<V | undefined> {\n        await this.promise;\n        return this.data[key];\n    }\n\n    public async set(key: K, value: V): Promise<void> {\n        await this.promise;\n        this.data[key] = value;\n        await fs.writeFile(this.dataFile, JSON.stringify(this.data), 'utf-8');\n    }\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport https from 'node:https';\nimport path from 'node:path';\n\nimport cliProgress from 'cli-progress';\n\nimport Store from './store.ts';\n\nconst USER_AGENT = 'node-wow-casc-dbc';\n\nconst CACHE_ROOT = path.resolve('cache');\nconst CACHE_DIRS = {\n    build: 'builds',\n    indexes: 'indices',\n    data: 'data',\n    dbd: 'dbd',\n};\n\nconst CACHE_INTEGRITY_FILE = path.resolve(CACHE_ROOT, 'integrity.json');\n\nconst cacheIntegrity = new Store<string, string>(CACHE_INTEGRITY_FILE);\n\nconst formatCDNKey = (key: string): string => `${key.substring(0, 2)}/${key.substring(2, 4)}/${key}`;\n\nconst requestData = async (\n    url: string,\n    {\n        partialOffset,\n        partialLength,\n        showProgress,\n    }: {\n        partialOffset?: number,\n        partialLength?: number,\n        showProgress?: boolean,\n    } = {},\n): Promise<Buffer> => new Promise((resolve, reject) => {\n    const options = {\n        headers: {\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            'User-Agent': USER_AGENT,\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            Range: partialOffset !== undefined && partialLength !== undefined\n                ? `bytes=${partialOffset.toString()}-${(partialOffset + partialLength - 1).toString()}`\n                : 'bytes=0-',\n        },\n    };\n\n    https.get(url, options, (res) => {\n        if (res.statusCode === 301 || res.statusCode === 302) {\n            if (res.headers.location !== undefined) {\n                requestData(res.headers.location, { partialOffset, partialLength, showProgress })\n                    .then(resolve)\n                    .catch((err: unknown) => {\n                        throw err;\n                    });\n            } else {\n                reject(new Error(`Failed to request ${url}, Status Code: ${res.statusCode.toString()}`));\n            }\n            return;\n        }\n\n        if (res.statusCode === undefined || res.statusCode < 200 || res.statusCode > 302) {\n            reject(new Error(`Failed to request ${url}, Status Code: ${res.statusCode?.toString() ?? 'undefined'}`));\n            return;\n        }\n\n        const lengthText = res.headers['content-length'];\n        const length = lengthText !== undefined ? parseInt(lengthText, 10) : 0;\n        const bar = showProgress === true && !Number.isNaN(length) && length >= 10485760\n            ? new cliProgress.SingleBar({ etaBuffer: 10240 }, cliProgress.Presets.shades_classic)\n            : undefined;\n        bar?.start(length, 0);\n\n        const chunks: Buffer[] = [];\n        res.on('data', (chunk: Buffer) => {\n            bar?.increment(chunk.length);\n            chunks.push(chunk);\n        });\n        res.on('end', () => {\n            bar?.stop();\n            resolve(Buffer.concat(chunks));\n        });\n        res.on('error', (err) => {\n            bar?.stop();\n            reject(err);\n        });\n    })\n        .on('error', reject)\n        .end();\n});\n\nconst downloadFile = (\n    prefixes: string[],\n    type: 'data' | 'config',\n    key: string,\n    {\n        partialOffset,\n        partialLength,\n        showProgress,\n        showAttemptFail,\n    }: {\n        partialOffset?: number,\n        partialLength?: number,\n        showProgress?: boolean,\n        showAttemptFail?: boolean,\n    } = {},\n): Promise<Buffer> => {\n    const urls = prefixes.map((prefix) => `${prefix}/${type}/${formatCDNKey(key)}`);\n\n    return urls\n        .reduce(\n            (prev, url, index) => prev\n                .catch((err: unknown) => {\n                    if (showAttemptFail === true && index > 0 && err instanceof Error) {\n                        console.warn(`${new Date().toISOString()} [WARN]:`, err.message);\n                    }\n                    return requestData(url, { partialOffset, partialLength, showProgress });\n                }),\n            Promise.reject<Buffer>(new Error('')),\n        );\n};\n\nconst getFileCache = async (file: string): Promise<Buffer | undefined> => {\n    const integrity = await cacheIntegrity.get(file);\n    if (integrity !== undefined) {\n        try {\n            const buffer = await fs.readFile(path.resolve(CACHE_ROOT, file));\n            const hash = crypto.createHash('sha256').update(buffer).digest('hex');\n            if (hash === integrity) {\n                return buffer;\n            }\n        } catch {\n            // ignore\n        }\n    }\n    return undefined;\n};\n\nexport const getDataFile = async (\n    prefixes: string[],\n    key: string,\n    type: keyof typeof CACHE_DIRS,\n    buildCKey: string,\n    {\n        name,\n        partialOffset,\n        partialLength,\n        showProgress,\n        showAttemptFail,\n    }: {\n        name?: string,\n        partialOffset?: number,\n        partialLength?: number,\n        showProgress?: boolean,\n        showAttemptFail?: boolean,\n    } = {},\n): Promise<Buffer> => {\n    const dir = type === 'build'\n        ? path.join(CACHE_DIRS[type], buildCKey)\n        : CACHE_DIRS[type];\n    const file = name !== undefined ? path.join(dir, name) : path.join(dir, key);\n    const cacheBuffer = await getFileCache(file);\n\n    if (cacheBuffer) {\n        if (name === undefined && partialOffset !== undefined && partialLength !== undefined) {\n            return cacheBuffer.subarray(partialOffset, partialOffset + partialLength);\n        }\n        return cacheBuffer;\n    }\n\n    const downloadBuffer = await downloadFile(prefixes, 'data', key, {\n        partialOffset, partialLength, showProgress, showAttemptFail,\n    });\n    if ((partialOffset === undefined && partialLength === undefined) || name !== undefined) {\n        await fs.mkdir(path.resolve(CACHE_ROOT, dir), { recursive: true });\n        await fs.writeFile(path.resolve(CACHE_ROOT, file), downloadBuffer);\n\n        const hash = crypto.createHash('sha256').update(downloadBuffer).digest('hex');\n        await cacheIntegrity.set(file, hash);\n    }\n\n    return downloadBuffer;\n};\n\nexport const getConfigFile = async (\n    prefixes: string[],\n    key: string,\n    {\n        showProgress, showAttemptFail,\n    }: {\n        showProgress?: boolean, showAttemptFail?: boolean,\n    } = {},\n): Promise<string> => {\n    const downloadBuffer = await downloadFile(prefixes, 'config', key, { showProgress, showAttemptFail });\n    return downloadBuffer.toString('utf-8');\n};\n\nexport const getProductVersions = async (\n    region: string,\n    product: string,\n): Promise<string> => {\n    const url = region !== 'cn'\n        ? `https://${region}.version.battle.net/v2/products/${product}/versions`\n        : `https://cn.version.battlenet.com.cn/v2/products/${product}/versions`;\n    const headers = new Headers();\n    headers.set('User-Agent', USER_AGENT);\n\n    const res = await fetch(url, { headers });\n\n    return res.text();\n};\n\nexport const getProductCDNs = async (\n    region: string,\n    product: string,\n): Promise<string> => {\n    const url = region !== 'cn'\n        ? `https://${region}.version.battle.net/v2/products/${product}/cdns`\n        : `https://cn.version.battlenet.com.cn/v2/products/${product}/cdns`;\n    const headers = new Headers();\n    headers.set('User-Agent', USER_AGENT);\n\n    const res = await fetch(url, { headers });\n\n    return res.text();\n};\n","/* eslint-disable no-bitwise */\n\nconst hashlittle2 = (key: string, pc = 0, pb = 0): [number, number] => {\n    const { length } = key;\n    let offset = 0;\n\n    let a = 0xdeadbeef + length + pc | 0;\n    let b = 0xdeadbeef + length + pc | 0;\n    let c = 0xdeadbeef + length + pc + pb | 0;\n\n    while (length - offset > 12) {\n        a += key.charCodeAt(offset + 0);\n        a += key.charCodeAt(offset + 1) << 8;\n        a += key.charCodeAt(offset + 2) << 16;\n        a += key.charCodeAt(offset + 3) << 24;\n\n        b += key.charCodeAt(offset + 4);\n        b += key.charCodeAt(offset + 5) << 8;\n        b += key.charCodeAt(offset + 6) << 16;\n        b += key.charCodeAt(offset + 7) << 24;\n\n        c += key.charCodeAt(offset + 8);\n        c += key.charCodeAt(offset + 9) << 8;\n        c += key.charCodeAt(offset + 10) << 16;\n        c += key.charCodeAt(offset + 11) << 24;\n\n        // mix(a, b, c);\n        a -= c; a ^= (c << 4) | (c >>> 28); c = c + b | 0;\n        b -= a; b ^= (a << 6) | (a >>> 26); a = a + c | 0;\n        c -= b; c ^= (b << 8) | (b >>> 24); b = b + a | 0;\n        a -= c; a ^= (c << 16) | (c >>> 16); c = c + b | 0;\n        b -= a; b ^= (a << 19) | (a >>> 13); a = a + c | 0;\n        c -= b; c ^= (b << 4) | (b >>> 28); b = b + a | 0;\n\n        offset += 12;\n    }\n\n    if (length - offset > 0) {\n        // zero length strings require no mixing\n        // eslint-disable-next-line default-case\n        switch (length - offset) {\n            case 12: c += key.charCodeAt(offset + 11) << 24; // falls through\n            case 11: c += key.charCodeAt(offset + 10) << 16; // falls through\n            case 10: c += key.charCodeAt(offset + 9) << 8; // falls through\n            case 9: c += key.charCodeAt(offset + 8); // falls through\n            case 8: b += key.charCodeAt(offset + 7) << 24; // falls through\n            case 7: b += key.charCodeAt(offset + 6) << 16; // falls through\n            case 6: b += key.charCodeAt(offset + 5) << 8; // falls through\n            case 5: b += key.charCodeAt(offset + 4); // falls through\n            case 4: a += key.charCodeAt(offset + 3) << 24; // falls through\n            case 3: a += key.charCodeAt(offset + 2) << 16; // falls through\n            case 2: a += key.charCodeAt(offset + 1) << 8; // falls through\n            case 1: a += key.charCodeAt(offset + 0);\n        }\n\n        // final(a, b, c);\n        c ^= b; c -= (b << 14) | (b >>> 18);\n        a ^= c; a -= (c << 11) | (c >>> 21);\n        b ^= a; b -= (a << 25) | (a >>> 7);\n        c ^= b; c -= (b << 16) | (b >>> 16);\n        a ^= c; a -= (c << 4) | (c >>> 28);\n        b ^= a; b -= (a << 14) | (a >>> 18);\n        c ^= b; c -= (b << 24) | (b >>> 8);\n    }\n\n    return [c >>> 0, b >>> 0];\n};\n\nconst getNameHash = (name: string): string => {\n    const normalized = name.replace(/\\//g, '\\\\').toUpperCase();\n    const [pc, pb] = hashlittle2(normalized);\n    return `${pc.toString(16).padStart(8, '0')}${pb.toString(16).padStart(8, '0')}`;\n};\n\nexport default getNameHash;\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nconst VERSION_SUB_OFFSET = -12;\nconst CHECKSUM_SIZE_SUB_OFFSET = -5;\n\nconst BLOCK_SIZE_OFFSET = 3;\nconst OFFSET_BYTES_OFFSET = 4;\nconst SIZE_BYTES_OFFSET = 5;\nconst KEY_SIZE_OFFSET = 6;\n// const CHECKSUM_SIZE_OFFSET = 7;\nconst NUM_ELEMENTS_OFFSET = 8;\nconst CHECKSUM_OFFSET = 12;\n\nconst CHECKSUM_TRIES = [\n    10,\n    9,\n    8,\n    7,\n    6,\n    5,\n    4,\n    3,\n    2,\n    1,\n    0,\n];\n\ninterface ArchiveIndex {\n    key: string,\n    size: number,\n    offset: number,\n}\n\nconst tryArchiveIndexChecksumSize = (buffer: Buffer, cKey: string): number => {\n    const res = CHECKSUM_TRIES.filter(\n        (index) => (\n            buffer.readUInt8(buffer.byteLength - index + CHECKSUM_SIZE_SUB_OFFSET) === index\n            && buffer.readUInt8(buffer.byteLength - index + VERSION_SUB_OFFSET) === 1\n        ),\n    );\n\n    if (res.length === 1) {\n        return res[0];\n    }\n\n    throw new Error(`Invalid checksum size: ${res.join(', ')} in ${cKey}`);\n};\n\nconst parseArchiveIndex = (buffer: Buffer, cKey: string): Map<string, ArchiveIndex> => {\n    const checksumSize = tryArchiveIndexChecksumSize(buffer, cKey);\n\n    const versionOffset = buffer.byteLength - checksumSize + VERSION_SUB_OFFSET;\n    const footerOffset = versionOffset - checksumSize;\n\n    const tocChecksum = buffer.toString('hex', footerOffset, versionOffset);\n    const version = buffer.readUInt8(versionOffset);\n    const blockSizeKB = buffer.readUInt8(versionOffset + BLOCK_SIZE_OFFSET);\n    const offsetBytes = buffer.readUInt8(versionOffset + OFFSET_BYTES_OFFSET);\n    const sizeBytes = buffer.readUInt8(versionOffset + SIZE_BYTES_OFFSET);\n    const keySize = buffer.readUInt8(versionOffset + KEY_SIZE_OFFSET);\n    const numElements = buffer.readUInt32LE(versionOffset + NUM_ELEMENTS_OFFSET);\n    const footerChecksum = buffer.toString('hex', versionOffset + CHECKSUM_OFFSET);\n\n    assert(version === 1, `Invalid archive index version: ${version.toString()} in ${cKey}`);\n\n    const entrySize = keySize + offsetBytes + sizeBytes;\n    const blockSize = blockSizeKB * 1024;\n    const numBlocks = footerOffset / (blockSize + keySize + checksumSize);\n    const tocSize = (keySize + checksumSize) * numBlocks;\n    const toc = buffer.subarray(footerOffset - tocSize, footerOffset);\n    const footer = buffer.subarray(footerOffset);\n    const footerCheckBuffer = Buffer.concat([\n        buffer.subarray(versionOffset, buffer.byteLength - checksumSize),\n        Buffer.alloc(checksumSize),\n    ]);\n\n    const hash = crypto.createHash('md5').update(footer).digest('hex');\n    assert(hash === cKey, `Invalid footer hash in ${cKey}: expected ${cKey}, got ${hash}`);\n\n    const footerHash = crypto.createHash('md5').update(footerCheckBuffer).digest('hex').slice(0, checksumSize * 2);\n    assert(footerHash === footerChecksum, `Invalid footer checksum in ${cKey}: expected ${footerChecksum}, got ${footerHash}`);\n\n    const tocHash = crypto.createHash('md5').update(toc).digest('hex').slice(0, checksumSize * 2);\n    assert(tocHash === tocChecksum, `Invalid toc checksum in ${cKey}: expected ${tocChecksum}, got ${tocHash}`);\n\n    const result = new Map<string, ArchiveIndex>();\n    for (let i = 0; i < numBlocks; i += 1) {\n        const lastEkey = toc.toString('hex', i * keySize, (i + 1) * keySize);\n        const blockChecksum = toc.toString('hex', numBlocks * keySize + i * checksumSize, numBlocks * keySize + (i + 1) * checksumSize);\n        const blockOffset = i * blockSize;\n\n        const blockHash = crypto.createHash('md5').update(buffer.subarray(i * blockSize, (i + 1) * blockSize)).digest('hex').slice(0, checksumSize * 2);\n        assert(blockChecksum === blockHash, `Invalid block hash in ${cKey} at ${i.toString()}: expected ${blockChecksum}, got ${blockHash}`);\n\n        let length = 0;\n        while (length < blockSize) {\n            const entryOffset = blockOffset + length * entrySize;\n            const eKey = buffer.toString('hex', entryOffset, entryOffset + keySize);\n            const size = buffer.readUIntBE(entryOffset + keySize, sizeBytes);\n            const offset = buffer.readUIntBE(entryOffset + keySize + sizeBytes, offsetBytes);\n\n            result.set(eKey, { key: cKey, size, offset });\n            length += 1;\n\n            if (eKey === lastEkey) {\n                break;\n            }\n        }\n    }\n\n    assert(result.size === numElements, `Invalid number of elements: ${result.size.toString()} != ${numElements.toString()} in ${cKey}`);\n\n    return result;\n};\n\nexport default parseArchiveIndex;\n\nexport type { ArchiveIndex };\n","import assert from 'node:assert';\n\nconst normalizeKey = (key: string): string => key\n    .split('-')\n    .map((part, index) => (\n        index === 0\n            ? part\n            : `${part.charAt(0).toUpperCase()}${part.slice(1)}`\n    ))\n    .join('');\n\nconst parseConfig = (text: string): Record<string, string> => {\n    const entries: Record<string, string> = {};\n\n    text\n        .split(/\\r?\\n/)\n        .filter((line) => line.trim().length !== 0 && !line.startsWith('#'))\n        .forEach((line) => {\n            const match = /([^\\s]+)\\s?=\\s?(.*)/.exec(line);\n            assert(match !== null, 'Invalid token encountered parsing CDN config');\n\n            const [key, value] = match.slice(1);\n            entries[normalizeKey(key)] = value;\n        });\n\n    return entries;\n};\n\ninterface CDNConfig {\n    archives: string,\n    archivesIndexSize: string,\n    archiveGroup: string,\n    patchArchives: string,\n    patchArchivesIndexSize: string,\n    patchArchiveGroup: string,\n    fileIndex: string,\n    fileIndexSize: string,\n    patchFileIndex: string,\n    patchFileIndexSize: string,\n}\n\nconst parseCDNConfig = (\n    text: string,\n): CDNConfig => parseConfig(text) as unknown as CDNConfig;\n\ninterface BuildConfig {\n    root: string,\n    install: string,\n    installSize: string,\n    download: string,\n    downloadSize: string,\n    size: string,\n    sizeSize: string,\n    encoding: string,\n    encodingSize: string,\n    patchIndex: string,\n    patchIndexSize: string,\n    patch: string,\n    patchSize: string,\n    patchConfig: string,\n    buildName: string,\n    buildUid: string,\n    buildProduct: string,\n    buildPlaybuildInstaller: string,\n    buildPartialPriority: string,\n    vfsRoot: string,\n    vfsRootSize: string,\n    [key: `vfs${number}` | `vfs${number}Size`]: string,\n}\n\nconst parseBuildConfig = (\n    text: string,\n): BuildConfig => parseConfig(text) as unknown as BuildConfig;\n\nexport { parseCDNConfig, parseBuildConfig };\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport BLTEReader from '../blte.ts';\n\nconst ENC_MAGIC = 0x454e;\n\nconst MAGIC_OFFSET = 0;\nconst VERSION_OFFSET = 2;\nconst HASH_SIZE_CKEY_OFFSET = 3;\nconst HASH_SIZE_EKEY_OFFSET = 4;\nconst CKEY_PAGE_SIZE_OFFSET = 5;\nconst EKEY_PAGE_SIZE_OFFSET = 7;\nconst CKEY_PAGE_COUNT_OFFSET = 9;\nconst EKEY_PAGE_COUNT_OFFSET = 13;\n// const UNK11_OFFSET = 17;\nconst SPEC_BLOCK_SIZE_OFFSET = 18;\nconst SPEC_BLOCK_OFFSET = 22;\n\ninterface EncodingData {\n    eSpec: string[],\n    cKey2FileSize: Map<string, number>,\n    cKey2EKey: Map<string, string | string[]>,\n    eKey2ESpecIndex: Map<string, number>,\n    eKey2FileSize: Map<string, number>,\n}\n\nconst parseEncodingFile = (inputBuffer: Buffer, eKey: string, cKey: string): EncodingData => {\n    const reader = new BLTEReader(inputBuffer, eKey);\n    reader.processBytes();\n\n    const { buffer } = reader;\n\n    const encodingHash = crypto.createHash('md5').update(buffer).digest('hex');\n    assert(encodingHash === cKey, `Invalid encoding hash: expected ${cKey}, got ${encodingHash}`);\n\n    const magic = buffer.readUInt16BE(MAGIC_OFFSET);\n    assert(magic === ENC_MAGIC, `Invalid encoding magic: ${magic.toString(16).padStart(4, '0')}`);\n\n    const version = buffer.readUInt8(VERSION_OFFSET);\n    const hashSizeCKey = buffer.readUInt8(HASH_SIZE_CKEY_OFFSET);\n    const hashSizeEKey = buffer.readUInt8(HASH_SIZE_EKEY_OFFSET);\n    const cKeyPageSizeKB = buffer.readUInt16BE(CKEY_PAGE_SIZE_OFFSET);\n    const eKeyPageSizeKB = buffer.readUInt16BE(EKEY_PAGE_SIZE_OFFSET);\n    const cKeyPageCount = buffer.readUInt32BE(CKEY_PAGE_COUNT_OFFSET);\n    const eKeyPageCount = buffer.readUInt32BE(EKEY_PAGE_COUNT_OFFSET);\n    const specBlockSize = buffer.readUInt32BE(SPEC_BLOCK_SIZE_OFFSET);\n\n    assert(version === 1, `Invalid encoding version: ${version.toString()}`);\n\n    const eSpec: string[] = [];\n    let eSpecStringStart = SPEC_BLOCK_OFFSET;\n    for (\n        let i = SPEC_BLOCK_OFFSET;\n        i < SPEC_BLOCK_OFFSET + specBlockSize;\n        i += 1\n    ) {\n        if (buffer[i] === 0x00) {\n            eSpec.push(buffer.toString('ascii', eSpecStringStart, i));\n            eSpecStringStart = i + 1;\n        }\n    }\n\n    const cKey2FileSize = new Map<string, number>();\n    const cKey2EKey = new Map<string, string | string[]>();\n    const cKeyPageIndexOffset = SPEC_BLOCK_OFFSET + specBlockSize;\n    const cKeyPageIndexEntrySize = hashSizeCKey + 0x10;\n    const cKeyPageOffset = cKeyPageIndexOffset + cKeyPageIndexEntrySize * cKeyPageCount;\n    const cKeyPageSize = cKeyPageSizeKB * 1024;\n    for (let i = 0; i < cKeyPageCount; i += 1) {\n        const indexOffset = cKeyPageIndexOffset + i * cKeyPageIndexEntrySize;\n        const pageOffset = cKeyPageOffset + i * cKeyPageSize;\n\n        const firstCKey = buffer.toString('hex', indexOffset, indexOffset + hashSizeCKey);\n        const pageChecksum = buffer.toString('hex', indexOffset + hashSizeCKey, indexOffset + hashSizeCKey + 0x10);\n\n        const pageBuffer = buffer.subarray(pageOffset, pageOffset + cKeyPageSize);\n        const pageHash = crypto.createHash('md5').update(pageBuffer).digest('hex');\n        assert(pageHash === pageChecksum, `Invalid ckey page ${i.toString()} checksum: expected ${pageChecksum}, got ${pageHash}`);\n\n        const pageFirstCKey = pageBuffer.toString('hex', 6, 6 + hashSizeCKey);\n        assert(pageFirstCKey === firstCKey, `Invalid ckey page ${i.toString()} first ckey: expected ${firstCKey}, got ${pageFirstCKey}`);\n\n        let pagePointer = 0;\n        while (pagePointer < cKeyPageSize) {\n            const keyCount = pageBuffer.readUInt8(pagePointer);\n            pagePointer += 1;\n            if (keyCount === 0x00) {\n                break;\n            }\n\n            const fileSize = pageBuffer.readUIntBE(pagePointer, 5);\n            pagePointer += 5;\n\n            const fileCKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeCKey);\n            pagePointer += hashSizeCKey;\n\n            cKey2FileSize.set(fileCKey, fileSize);\n\n            if (keyCount === 1) {\n                const fileEKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeEKey);\n                cKey2EKey.set(fileCKey, fileEKey);\n                pagePointer += hashSizeEKey;\n            } else {\n                const fileEKeys: string[] = [];\n                for (let j = 0; j < keyCount; j += 1) {\n                    const fileEKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeEKey);\n                    fileEKeys.push(fileEKey);\n                    pagePointer += hashSizeEKey;\n                }\n                cKey2EKey.set(fileCKey, fileEKeys);\n            }\n        }\n    }\n\n    const eKey2ESpecIndex = new Map<string, number>();\n    const eKey2FileSize = new Map<string, number>();\n    const eKeyPageIndexOffset = cKeyPageOffset + cKeyPageSize * cKeyPageCount;\n    const eKeyPageIndexEntrySize = hashSizeEKey + 0x10;\n    const eKeyPageOffset = eKeyPageIndexOffset + eKeyPageIndexEntrySize * eKeyPageCount;\n    const eKeyPageSize = eKeyPageSizeKB * 1024;\n    const eKeyPageEntrySize = hashSizeEKey + 0x04 + 0x05;\n    for (let i = 0; i < eKeyPageCount; i += 1) {\n        const indexOffset = eKeyPageIndexOffset + i * eKeyPageIndexEntrySize;\n        const pageOffset = eKeyPageOffset + i * eKeyPageSize;\n\n        const firstEKey = buffer.toString('hex', indexOffset, indexOffset + hashSizeEKey);\n        const pageChecksum = buffer.toString('hex', indexOffset + hashSizeEKey, indexOffset + hashSizeEKey + 0x10);\n\n        const pageBuffer = buffer.subarray(pageOffset, pageOffset + eKeyPageSize);\n        const pageHash = crypto.createHash('md5').update(pageBuffer).digest('hex');\n        assert(pageHash === pageChecksum, `Invalid ekey page ${i.toString()} checksum: expected ${pageChecksum}, got ${pageHash}`);\n\n        const pageFirstEKey = pageBuffer.toString('hex', 0, hashSizeEKey);\n        assert(pageFirstEKey === firstEKey, `Invalid ekey page ${i.toString()} first ekey: expected ${firstEKey}, got ${pageFirstEKey}`);\n\n        let pagePointer = 0;\n        while (pagePointer + eKeyPageEntrySize <= eKeyPageSize) {\n            const fileEKey = pageBuffer.toString('hex', pagePointer, pagePointer + hashSizeEKey);\n            pagePointer += hashSizeEKey;\n\n            const eSpecIndex = pageBuffer.readUInt32BE(pagePointer);\n            pagePointer += 4;\n            eKey2ESpecIndex.set(fileEKey, eSpecIndex);\n\n            const fileSize = pageBuffer.readUIntBE(pagePointer, 5);\n            pagePointer += 5;\n            eKey2FileSize.set(fileEKey, fileSize);\n        }\n    }\n\n    return {\n        eSpec, cKey2FileSize, cKey2EKey, eKey2ESpecIndex, eKey2FileSize,\n    };\n};\n\nexport default parseEncodingFile;\n\nexport type { EncodingData };\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport BLTEReader from '../blte.ts';\n\nconst INSTALL_MAGIC = 0x494e;\n\nconst MAGIC_OFFSET = 0;\nconst VERSION_OFFSET = 2;\nconst HASH_SIZE_OFFSET = 3;\nconst NUM_TAGS_OFFSET = 4;\nconst NUM_ENTRIES_OFFSET = 6;\nconst TAGS_OFFSET = 10;\n\ninterface InstallTag {\n    name: string,\n    type: number,\n    files: boolean[],\n}\n\ninterface InstallFile {\n    name: string,\n    hash: string,\n    size: number,\n    tags: InstallTag[],\n}\n\ninterface InstallData {\n    tags: InstallTag[],\n    files: InstallFile[],\n}\n\nconst parseInstallFile = (inputBuffer: Buffer, eKey: string, cKey: string): InstallData => {\n    const reader = new BLTEReader(inputBuffer, eKey);\n    reader.processBytes();\n\n    const { buffer } = reader;\n\n    const installHash = crypto.createHash('md5').update(buffer).digest('hex');\n    assert(installHash === cKey, `Invalid root hash: expected ${cKey}, got ${installHash}`);\n\n    const magic = buffer.readUInt16BE(MAGIC_OFFSET);\n    assert(magic === INSTALL_MAGIC, `Invalid install magic: ${magic.toString(16).padStart(4, '0')}`);\n\n    const version = buffer.readUInt8(VERSION_OFFSET);\n    const hashSize = buffer.readUInt8(HASH_SIZE_OFFSET);\n    const numTags = buffer.readUInt16BE(NUM_TAGS_OFFSET);\n    const numEntries = buffer.readUInt32BE(NUM_ENTRIES_OFFSET);\n\n    assert(version === 1, `Invalid install version: ${version.toString()}`);\n\n    let pointer = TAGS_OFFSET;\n\n    const tags: InstallTag[] = [];\n    for (let i = 0; i < numTags; i += 1) {\n        const startOffset = pointer;\n        while (buffer[pointer] !== 0x00) {\n            pointer += 1;\n        }\n\n        const name = buffer.toString('utf-8', startOffset, pointer);\n        pointer += 1;\n\n        const type = buffer.readUInt16BE(pointer);\n        pointer += 2;\n\n        const files = [];\n        const finalOffset = pointer + Math.ceil(numEntries / 8);\n        while (pointer < finalOffset) {\n            const byte = buffer.readUInt8(pointer);\n            pointer += 1;\n\n            for (let j = 7; j >= 0; j -= 1) {\n                // eslint-disable-next-line no-bitwise\n                files.push((byte & (1 << j)) > 0);\n            }\n        }\n\n        tags.push({ name, type, files });\n    }\n\n    const files: InstallFile[] = [];\n    for (let i = 0; i < numEntries; i += 1) {\n        const startOffset = pointer;\n        while (buffer[pointer] !== 0x00) {\n            pointer += 1;\n        }\n\n        const name = buffer.toString('utf-8', startOffset, pointer);\n        pointer += 1;\n\n        const hash = buffer.toString('hex', pointer, pointer + hashSize);\n        pointer += hashSize;\n\n        const size = buffer.readUInt32BE(pointer);\n        pointer += 4;\n\n        const fileTags = tags.filter((tag) => tag.files[i]);\n\n        files.push({\n            name,\n            hash,\n            size,\n            tags: fileTags,\n        });\n    }\n\n    return { tags, files };\n};\n\nexport default parseInstallFile;\n\nexport type { InstallFile, InstallData };\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nconst parseProductConfig = (text: string): Record<string, string>[] => {\n    const lines = text.split(/\\r?\\n/);\n\n    // First line contains field definitions.\n    // Example: Name!STRING:0|Path!STRING:0|Hosts!STRING:0|Servers!STRING:0|ConfigPath!STRING:0\n    // Whitespace is replaced so that a field like 'Install Key' becomes 'InstallKey'.\n    // This just improves coding readability when accessing the fields later on.\n    const headers = lines[0]\n        .split('|')\n        .map((header) => header.split('!')[0].replace(' ', ''));\n\n    const entries = lines\n        .filter((line, index) => index > 0 && line.trim().length !== 0 && !line.startsWith('#'))\n        .map((line) => {\n            const node: Record<string, string> = {};\n            const entryFields = line.split('|');\n            for (let i = 0, n = entryFields.length; i < n; i += 1) {\n                node[headers[i]] = entryFields[i];\n            }\n\n            return node;\n        });\n\n    return entries;\n};\n\ninterface Version {\n    Region: string,\n    BuildConfig: string,\n    CDNConfig: string,\n    KeyRing: string,\n    BuildId: string,\n    VersionsName: string,\n    ProductConfig: string,\n}\n\nconst parseProductVersions = (\n    text: string,\n): Version[] => parseProductConfig(text) as unknown as Version[];\n\ninterface CDN {\n    Name: string,\n    Path: string,\n    Hosts: string,\n    Servers: string,\n    ConfigPath: string,\n}\n\nconst parseProductCDNs = (\n    text: string,\n): CDN[] => parseProductConfig(text) as unknown as CDN[];\n\nexport { parseProductVersions, parseProductCDNs };\n\nexport type { Version };\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nimport assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport BLTEReader from '../blte.ts';\n\nconst MFST_MAGIC = 0x4d465354;\n\nconst ContentFlags = {\n    Install: 0x4,\n    LoadOnWindows: 0x8,\n    LoadOnMacOS: 0x10,\n    x86_32: 0x20,\n    x86_64: 0x40,\n    LowViolence: 0x80,\n    DoNotLoad: 0x100,\n    UpdatePlugin: 0x800,\n    ARM64: 0x8000,\n    Encrypted: 0x8000000,\n    NoNameHash: 0x10000000,\n    UncommonResolution: 0x20000000,\n    Bundle: 0x40000000,\n    NoCompression: 0x80000000,\n} as const;\n\nconst LocaleFlags = {\n    enUS: 0x2,\n    koKR: 0x4,\n    frFR: 0x10,\n    deDE: 0x20,\n    zhCN: 0x40,\n    esES: 0x80,\n    zhTW: 0x100,\n    enGB: 0x200,\n    // enCN: 0x400,\n    // enTW: 0x800,\n    esMX: 0x1000,\n    ruRU: 0x2000,\n    ptBR: 0x4000,\n    itIT: 0x8000,\n    ptPT: 0x10000,\n} as const;\n\ninterface FileInfo {\n    cKey: string,\n    contentFlags: number,\n    localeFlags: number,\n}\n\ninterface RootData {\n    fileDataID2CKey: Map<number, FileInfo[]>,\n    nameHash2FileDataID: Map<string, number>,\n}\n\nconst parseRootFile = (inputBuffer: Buffer, eKey: string, cKey: string): RootData => {\n    const reader = new BLTEReader(inputBuffer, eKey);\n    reader.processBytes();\n\n    const { buffer } = reader;\n\n    const rootHash = crypto.createHash('md5').update(buffer).digest('hex');\n    assert(rootHash === cKey, `Invalid root hash: expected ${cKey}, got ${rootHash}`);\n\n    const fileDataID2CKey = new Map<number, FileInfo[]>();\n    const nameHash2FileDataID = new Map<string, number>();\n\n    const magic = buffer.readUInt32LE(0);\n    if (magic === MFST_MAGIC) {\n        // post 8.2.0\n        const firstEntry = buffer.readUInt32LE(4);\n        const newFormat = firstEntry < 100; // post 10.1.7\n\n        const headerSize = newFormat ? firstEntry : 12;\n        const version = newFormat ? buffer.readUInt32LE(8) : 0;\n        const totalFileCount = newFormat ? buffer.readUInt32LE(12) : firstEntry;\n        const namedFileCount = newFormat ? buffer.readUInt32LE(16) : buffer.readUInt32LE(8);\n\n        assert(version >= 0 && version <= 2, `Invalid root version: ${version.toString()}`);\n\n        const allowNonNamedFiles = totalFileCount !== namedFileCount;\n\n        let pointer = headerSize;\n        while (pointer < buffer.byteLength) {\n            const numRecords = buffer.readUInt32LE(pointer);\n\n            let contentFlags: number;\n            let localeFlags: number;\n            if (version >= 2) {\n                localeFlags = buffer.readUInt32LE(pointer + 4);\n\n                const contentFlags1 = buffer.readUInt32LE(pointer + 8);\n                const contentFlags2 = buffer.readUInt32LE(pointer + 12);\n                const contentFlags3 = buffer.readUInt8(pointer + 16);\n                // eslint-disable-next-line no-bitwise\n                contentFlags = (contentFlags1 | contentFlags2 | (contentFlags3 << 17));\n\n                pointer += 17;\n            } else {\n                contentFlags = buffer.readUInt32LE(pointer + 4);\n                localeFlags = buffer.readUInt32LE(pointer + 8);\n                pointer += 12;\n            }\n\n            const fileDataIDs = [];\n            let currFileDataID = -1;\n            for (let i = 0; i < numRecords; i += 1) {\n                currFileDataID += buffer.readUInt32LE(pointer) + 1;\n                fileDataIDs.push(currFileDataID);\n                pointer += 4;\n            }\n\n            for (let i = 0; i < numRecords; i += 1) {\n                const fileDataID = fileDataIDs[i];\n                const fileCKey = buffer.toString('hex', pointer, pointer + 16);\n                pointer += 16;\n\n                if (fileDataID2CKey.has(fileDataID)) {\n                    fileDataID2CKey.get(fileDataID)?.push({\n                        cKey: fileCKey,\n                        contentFlags,\n                        localeFlags,\n                    });\n                } else {\n                    fileDataID2CKey.set(fileDataID, [\n                        { cKey: fileCKey, contentFlags, localeFlags },\n                    ]);\n                }\n            }\n\n            // eslint-disable-next-line no-bitwise\n            if (!(allowNonNamedFiles && (contentFlags & ContentFlags.NoNameHash))) {\n                for (let i = 0; i < numRecords; i += 1) {\n                    const fileDataID = fileDataIDs[i];\n                    const nameHash = buffer.readBigUInt64LE(pointer).toString(16).padStart(16, '0');\n                    pointer += 8;\n\n                    nameHash2FileDataID.set(nameHash, fileDataID);\n                }\n            }\n        }\n    } else {\n        // pre 8.2.0\n        let pointer = 0;\n        while (pointer < buffer.byteLength) {\n            const numRecords = buffer.readUInt32LE(pointer);\n            const contentFlags = buffer.readUInt32LE(pointer + 4);\n            const localeFlags = buffer.readUInt32LE(pointer + 8);\n            pointer += 12;\n\n            const fileDataIDs = [];\n            let currFileDataID = -1;\n            for (let i = 0; i < numRecords; i += 1) {\n                currFileDataID += buffer.readUInt32LE(pointer) + 1;\n                fileDataIDs.push(currFileDataID);\n                pointer += 4;\n            }\n\n            for (let i = 0; i < numRecords; i += 1) {\n                const fileDataID = fileDataIDs[i];\n                const fileCKey = buffer.toString('hex', pointer, pointer + 16);\n                const nameHash = buffer.toString('hex', pointer + 16, pointer + 24);\n                pointer += 24;\n\n                if (fileDataID2CKey.has(fileDataID)) {\n                    fileDataID2CKey.get(fileDataID)?.push({\n                        cKey: fileCKey,\n                        contentFlags,\n                        localeFlags,\n                    });\n                } else {\n                    fileDataID2CKey.set(fileDataID, [\n                        { cKey: fileCKey, contentFlags, localeFlags },\n                    ]);\n                }\n\n                nameHash2FileDataID.set(nameHash, fileDataID);\n            }\n        }\n    }\n\n    return { fileDataID2CKey, nameHash2FileDataID };\n};\n\nexport default parseRootFile;\n\nexport { ContentFlags, LocaleFlags };\n\nexport type { FileInfo, RootData };\n","const JEDEC = [\n    'B',\n    'KB',\n    'MB',\n    'GB',\n    'TB',\n    'PB',\n    'EB',\n    'ZB',\n    'YB',\n];\n// Simplified version of https://github.com/avoidwork/filesize.js\nexport const formatFileSize = (input: number) => {\n    if (Number.isNaN(input)) return '';\n\n    let size = input;\n    const isNegative = size < 0;\n    const result = [];\n\n    // Flipping a negative number to determine the size.\n    if (isNegative) size = -size;\n\n    // Determining the exponent.\n    let exponent = Math.floor(Math.log(size) / Math.log(1024));\n    if (exponent < 0) exponent = 0;\n\n    // Exceeding supported length, time to reduce & multiply.\n    if (exponent > 8) exponent = 8;\n\n    // Zero is now a special case because bytes divide by 1.\n    if (size === 0) {\n        result[0] = 0;\n        result[1] = JEDEC[exponent];\n    } else {\n        const val = size / (2 ** (exponent * 10));\n\n        result[0] = Number(val.toFixed(exponent > 0 ? 2 : 0));\n\n        if (result[0] === 1024 && exponent < 8) {\n            result[0] = 1;\n            exponent += 1;\n        }\n\n        result[1] = JEDEC[exponent];\n    }\n\n    // Decorating a 'diff'.\n    if (isNegative) result[0] = -result[0];\n\n    return result.join(' ');\n};\n\nexport const resolveCDNHost = async (\n    hosts: string[],\n    path: string,\n): Promise<string[]> => {\n    const latencies = await Promise.allSettled(\n        hosts.map(async (host) => {\n            const start = Date.now();\n            await fetch(`https://${host}/`);\n            const end = Date.now();\n            return {\n                host,\n                latency: end - start,\n            };\n        }),\n    );\n\n    const resolved = latencies\n        .filter((result): result is PromiseFulfilledResult<{\n            host: string, latency: number,\n        }> => result.status === 'fulfilled')\n        .map((result) => result.value)\n        .sort((a, b) => a.latency - b.latency);\n\n    return resolved.map((result) => `https://${result.host}/${path}`);\n};\n","import assert from 'node:assert';\n\nimport type ADBReader from './adb.ts';\nimport type { MissingKeyBlock } from './blte.ts';\n\nconst WDC5_MAGIC = 0x57444335;\n\ninterface WDCReaderOptions {\n    blocks?: MissingKeyBlock[],\n    adb?: ADBReader,\n    detectIsZeroedByData?: boolean,\n}\n\ninterface MergedMissingKeyBlock {\n    offset: number,\n    size: number,\n}\n\ninterface SectionHeader {\n    tactKeyHash: bigint,\n    fileOffset: number,\n    recordCount: number,\n    stringTableSize: number,\n    offsetRecordsEnd: number,\n    idListSize: number,\n    relationshipDataSize: number,\n    offsetMapIDCount: number,\n    copyTableCount: number,\n}\n\ninterface FieldStructure {\n    size: number,\n    position: number,\n}\n\ninterface FieldStorageInfoCompressionNone {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'none',\n}\n\ninterface FieldStorageInfoCompressionBitpacked {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpacked',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n    flags: number,\n}\n\ninterface FieldStorageInfoCompressionCommonData {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'commonData',\n    defaultValue: number,\n}\n\ninterface FieldStorageInfoCompressionBitpackedIndexed {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpackedIndexed',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n}\n\ninterface FieldStorageInfoCompressionBitpackedIndexedArray {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpackedIndexedArray',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n    arrayCount: number,\n}\n\ninterface FieldStorageInfoCompressionBitpackedSigned {\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    additionalDataSize: number,\n    storageType: 'bitpackedSigned',\n    bitpackingOffsetBits: number,\n    bitpackingSizeBits: number,\n    flags: number,\n}\n\ntype FieldStorageInfo = FieldStorageInfoCompressionNone\n    | FieldStorageInfoCompressionBitpacked\n    | FieldStorageInfoCompressionCommonData\n    | FieldStorageInfoCompressionBitpackedIndexed\n    | FieldStorageInfoCompressionBitpackedIndexedArray\n    | FieldStorageInfoCompressionBitpackedSigned;\n\ninterface OffsetMapEntry {\n    offset: number,\n    size: number,\n    data: Buffer,\n}\n\ninterface ParsedFieldNone {\n    type: 'none',\n    data: number | bigint,\n    string?: string,\n}\n\ninterface ParsedFieldCommonData {\n    type: 'commonData',\n    data: number,\n}\n\ninterface ParsedFieldBitpacked {\n    type: 'bitpacked',\n    data: number,\n}\n\ninterface ParsedFieldBitpackedArray {\n    type: 'bitpackedArray',\n    data: number[],\n}\n\ntype ParsedField = ParsedFieldNone\n    | ParsedFieldCommonData\n    | ParsedFieldBitpacked\n    | ParsedFieldBitpackedArray;\n\ninterface SparseRow {\n    type: 'sparse',\n    data: Buffer,\n}\n\ninterface Section {\n    header: SectionHeader,\n    isZeroed: boolean,\n    recordDataSize: number,\n    records: Buffer[],\n    idList: number[],\n    offsetMap: OffsetMapEntry[],\n    relationshipMap: Map<number, number>,\n}\n\ninterface HotfixModify {\n    type: 'modify',\n    data: Buffer,\n}\n\ninterface HotfixDelete {\n    type: 'delete',\n}\n\ntype Hotfix = HotfixModify | HotfixDelete;\n\n/* eslint-disable no-bitwise */\nconst readBitpackedValue = (\n    buffer: Buffer,\n    fieldOffsetBits: number,\n    fieldSizeBits: number,\n    signed = false,\n) => {\n    const offsetBytes = fieldOffsetBits >>> 3;\n    const bitOffset = fieldOffsetBits & 0x7;\n    const sizeBytes = Math.ceil((fieldSizeBits + bitOffset) / 8);\n\n    // need to be bigint\n    let value = 0n;\n\n    for (let i = sizeBytes - 1; i >= 0; i -= 1) {\n        const byte = buffer.readUInt8(offsetBytes + i);\n        value = (value << 8n) | BigInt(byte);\n    }\n\n    const result = signed\n        ? BigInt.asIntN(fieldSizeBits, value >> BigInt(bitOffset))\n        : BigInt.asUintN(fieldSizeBits, value >> BigInt(bitOffset));\n\n    return fieldSizeBits <= 32 ? Number(result) : result;\n};\n/* eslint-enable no-bitwise */\n\nconst isDataRangeAllZero = (\n    buffer: Buffer,\n    offset: number,\n    length: number,\n): boolean => {\n    const end = offset + length;\n\n    for (let pointer = offset; pointer < end; pointer += 1) {\n        if (buffer[pointer] !== 0x00) {\n            return false;\n        }\n    }\n    return true;\n};\n\nexport default class WDCReader {\n    public readonly tableHash: number;\n\n    public readonly layoutHash: number;\n\n    public readonly locale: number;\n\n    public readonly isNormal: boolean;\n\n    public readonly hasRelationshipData: boolean;\n\n    public readonly fields: FieldStructure[];\n\n    public readonly fieldsInfo: FieldStorageInfo[];\n\n    public readonly rows = new Map<number, ParsedField[] | SparseRow>();\n\n    public readonly relationships = new Map<number, number>();\n\n    public readonly copyTable = new Map<number, number>();\n\n    public readonly hotfixes = new Map<number, Hotfix>();\n\n    constructor(\n        buffer: Buffer,\n        blocksOrOption?: MissingKeyBlock[] | WDCReaderOptions,\n        adbInput?: ADBReader,\n    ) {\n        const options: WDCReaderOptions = (\n            blocksOrOption === undefined || Array.isArray(blocksOrOption)\n        )\n            ? { blocks: blocksOrOption, adb: adbInput }\n            : blocksOrOption;\n\n        const blocks = options.blocks ?? [];\n        const adb = options.adb ?? adbInput;\n        const detectIsZeroedByData = options.detectIsZeroedByData ?? false;\n\n        const mergedBlocks: MergedMissingKeyBlock[] = [];\n        if (!detectIsZeroedByData) {\n            blocks\n                .sort((a, b) => a.offset - b.offset)\n                .forEach(({ offset, size }) => {\n                    const lastBlock = mergedBlocks[mergedBlocks.length - 1];\n                    if (\n                        mergedBlocks.length > 0\n                        && lastBlock.offset + lastBlock.size >= offset\n                    ) {\n                        lastBlock.size = Math.max(\n                            lastBlock.offset + lastBlock.size,\n                            offset + size,\n                        ) - lastBlock.offset;\n                    } else {\n                        mergedBlocks.push({\n                            offset,\n                            size,\n                        });\n                    }\n                });\n        }\n\n        const magic = buffer.readUInt32BE(0);\n        const version = buffer.readUInt32LE(4);\n        // const schema = buffer.toString('ascii', 8, 136);\n        // const recordCount = buffer.readUInt32LE(136);\n        const fieldCount = buffer.readUInt32LE(140);\n        const recordSize = buffer.readUInt32LE(144);\n        // const stringTableSize = buffer.readUInt32LE(148);\n        const tableHash = buffer.readUInt32LE(152);\n        const layoutHash = buffer.readUInt32LE(156);\n        // const minID = buffer.readUInt32LE(160);\n        // const maxID = buffer.readUInt32LE(164);\n        const locale = buffer.readUInt32LE(168);\n        const flags = buffer.readUInt16LE(172);\n        const idIndex = buffer.readUInt16LE(174);\n        // const totalFieldCount = buffer.readUInt32LE(176);\n        // const bitpackedDataOffset = buffer.readUInt32LE(180);\n        // const lookupColumnCount = buffer.readUInt32LE(184);\n        const fieldStorageInfoSize = buffer.readUInt32LE(188);\n        const commonDataSize = buffer.readUInt32LE(192);\n        const palletDataSize = buffer.readUInt32LE(196);\n        const sectionCount = buffer.readUInt32LE(200);\n\n        assert(magic === WDC5_MAGIC, `Invalid WDC5 magic: ${magic.toString(16).padStart(8, '0')}`);\n        assert(version === 5, `Invalid WDC5 version: ${version.toString()}`);\n\n        this.tableHash = tableHash;\n        this.layoutHash = layoutHash;\n        this.locale = locale;\n\n        // eslint-disable-next-line no-bitwise\n        const isNormal = !(flags & 0x1);\n        // eslint-disable-next-line no-bitwise\n        const hasRelationshipData = !!(flags & 0x2);\n\n        this.isNormal = isNormal;\n        this.hasRelationshipData = hasRelationshipData;\n\n        const sectionHeaders: SectionHeader[] = [];\n        const sectionHeadersOffset = 204;\n        for (let i = 0; i < sectionCount; i += 1) {\n            const sectionHeaderOffset = sectionHeadersOffset + i * 40;\n\n            sectionHeaders.push({\n                tactKeyHash: buffer.readBigUInt64LE(sectionHeaderOffset),\n                fileOffset: buffer.readUInt32LE(sectionHeaderOffset + 8),\n                recordCount: buffer.readUInt32LE(sectionHeaderOffset + 12),\n                stringTableSize: buffer.readUInt32LE(sectionHeaderOffset + 16),\n                offsetRecordsEnd: buffer.readUInt32LE(sectionHeaderOffset + 20),\n                idListSize: buffer.readUInt32LE(sectionHeaderOffset + 24),\n                relationshipDataSize: buffer.readUInt32LE(sectionHeaderOffset + 28),\n                offsetMapIDCount: buffer.readUInt32LE(sectionHeaderOffset + 32),\n                copyTableCount: buffer.readUInt32LE(sectionHeaderOffset + 36),\n            });\n        }\n\n        const fields: FieldStructure[] = [];\n        const fieldsOffset = 204 + sectionCount * 40;\n        for (let i = 0; i < fieldCount; i += 1) {\n            const fieldOffset = fieldsOffset + i * 4;\n            fields.push({\n                size: buffer.readInt16LE(fieldOffset),\n                position: buffer.readUInt16LE(fieldOffset + 2),\n            });\n        }\n        this.fields = fields;\n\n        const fieldsInfo: FieldStorageInfo[] = [];\n        const fieldsInfoOffset = fieldsOffset + fieldCount * 4;\n        for (let i = 0; i < fieldStorageInfoSize / 24; i += 1) {\n            const fieldInfoOffset = fieldsInfoOffset + i * 24;\n\n            const fieldOffsetBits = buffer.readUInt16LE(fieldInfoOffset);\n            const fieldSizeBits = buffer.readUInt16LE(fieldInfoOffset + 2);\n            const additionalDataSize = buffer.readUInt32LE(fieldInfoOffset + 4);\n            const storageType = buffer.readUInt32LE(fieldInfoOffset + 8);\n            const arg1 = buffer.readUInt32LE(fieldInfoOffset + 12);\n            const arg2 = buffer.readUInt32LE(fieldInfoOffset + 16);\n            const arg3 = buffer.readUInt32LE(fieldInfoOffset + 20);\n\n            switch (storageType) {\n                case 0:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'none',\n                    });\n                    break;\n                case 1:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpacked',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                        flags: arg3,\n                    });\n                    break;\n                case 2:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'commonData',\n                        defaultValue: arg1,\n                    });\n                    break;\n                case 3:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpackedIndexed',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                    });\n                    break;\n                case 4:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpackedIndexedArray',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                        arrayCount: arg3,\n                    });\n                    break;\n                case 5:\n                    fieldsInfo.push({\n                        fieldOffsetBits,\n                        fieldSizeBits,\n                        additionalDataSize,\n                        storageType: 'bitpackedSigned',\n                        bitpackingOffsetBits: arg1,\n                        bitpackingSizeBits: arg2,\n                        flags: arg3,\n                    });\n                    break;\n                default:\n                    throw new Error(`Unknown storage type: ${storageType.toString(16).padStart(8, '0')}`);\n            }\n        }\n        this.fieldsInfo = fieldsInfo;\n\n        const palletData = new Map<number, number[]>();\n        const palletDataOffset = fieldsInfoOffset + fieldStorageInfoSize;\n        let palletDataPointer = palletDataOffset;\n        for (let i = 0; i < fieldsInfo.length; i += 1) {\n            const fieldInfo = fieldsInfo[i];\n            if (fieldInfo.storageType === 'bitpackedIndexed' || fieldInfo.storageType === 'bitpackedIndexedArray') {\n                const data: number[] = [];\n                for (let j = 0; j < fieldInfo.additionalDataSize / 4; j += 1) {\n                    data.push(buffer.readUInt32LE(palletDataPointer));\n                    palletDataPointer += 4;\n                }\n                palletData.set(i, data);\n            }\n        }\n\n        assert(\n            palletDataPointer === palletDataOffset + palletDataSize,\n            `Invalid pallet data size: ${(palletDataPointer - palletDataOffset).toString()} != ${palletDataSize.toString()}`,\n        );\n\n        const commonData = new Map<number, Map<number, number>>();\n        const commonDataOffset = palletDataPointer;\n        let commonDataPointer = commonDataOffset;\n        for (let i = 0; i < fieldsInfo.length; i += 1) {\n            const fieldInfo = fieldsInfo[i];\n            if (fieldInfo.storageType === 'commonData') {\n                const map = new Map<number, number>();\n                for (let j = 0; j < fieldInfo.additionalDataSize / 8; j += 1) {\n                    map.set(\n                        buffer.readUInt32LE(commonDataPointer),\n                        buffer.readUInt32LE(commonDataPointer + 4),\n                    );\n                    commonDataPointer += 8;\n                }\n                commonData.set(i, map);\n            }\n        }\n\n        assert(\n            commonDataPointer === commonDataOffset + commonDataSize,\n            `Invalid common data size: ${(commonDataPointer - commonDataOffset).toString()} != ${commonDataSize.toString()}`,\n        );\n\n        const encryptedIDs = new Map<number, number[]>();\n        const encryptedRecordsOffset = commonDataPointer;\n        let encryptedRecordsPointer = encryptedRecordsOffset;\n        for (let i = 0; i < sectionHeaders.length; i += 1) {\n            const sectionHeader = sectionHeaders[i];\n            if (sectionHeader.tactKeyHash !== 0n) {\n                const count = buffer.readUInt32LE(encryptedRecordsPointer);\n                encryptedRecordsPointer += 4;\n\n                const data: number[] = [];\n                for (let j = 0; j < count; j += 1) {\n                    data.push(buffer.readUInt32LE(encryptedRecordsPointer));\n                    encryptedRecordsPointer += 4;\n                }\n                encryptedIDs.set(i, data);\n            }\n        }\n\n        const stringTable = new Map<number, string>();\n        let stringTableDelta = 0;\n\n        const sectionsOffset = encryptedRecordsPointer;\n        let sectionPointer = sectionsOffset;\n        const sections = sectionHeaders.map((sectionHeader): Section => {\n            assert(\n                sectionPointer === sectionHeader.fileOffset,\n                `Invalid section offset: ${sectionPointer.toString()} != ${sectionHeader.fileOffset.toString()}`,\n            );\n\n            const sectionRecordSize = isNormal\n                ? (sectionHeader.recordCount * recordSize + sectionHeader.stringTableSize)\n                : (sectionHeader.offsetRecordsEnd - sectionPointer);\n\n            const sectionSize = sectionRecordSize\n                + sectionHeader.idListSize\n                + sectionHeader.copyTableCount * 8\n                + sectionHeader.offsetMapIDCount * 10\n                + sectionHeader.relationshipDataSize;\n\n            const recordDataSize = isNormal\n                ? recordSize * sectionHeader.recordCount\n                : sectionHeader.offsetRecordsEnd - sectionHeader.fileOffset;\n\n            const isZeroed = detectIsZeroedByData\n                ? (\n                    sectionHeader.tactKeyHash !== 0n\n                    && isDataRangeAllZero(buffer, sectionHeader.fileOffset, recordDataSize)\n                )\n                : mergedBlocks.some((block) => {\n                    const sectionStart = sectionHeader.fileOffset;\n                    const sectionEnd = sectionStart + sectionSize;\n                    const blockStart = block.offset;\n                    const blockEnd = blockStart + block.size;\n\n                    return sectionStart >= blockStart && sectionEnd <= blockEnd;\n                });\n\n            if (isZeroed) {\n                sectionPointer += sectionSize;\n                if (isNormal) {\n                    stringTableDelta += sectionHeader.stringTableSize;\n                }\n                return {\n                    header: sectionHeader,\n                    isZeroed,\n                    recordDataSize,\n                    records: [],\n                    idList: [],\n                    offsetMap: [],\n                    relationshipMap: new Map(),\n                };\n            }\n\n            const records: Buffer[] = [];\n            if (isNormal) {\n                for (let j = 0; j < sectionHeader.recordCount; j += 1) {\n                    records.push(buffer.subarray(sectionPointer, sectionPointer + recordSize));\n                    sectionPointer += recordSize;\n                }\n\n                const stringTableOffset = sectionPointer;\n                let stringStartPointer = stringTableOffset;\n                while (sectionPointer < stringTableOffset + sectionHeader.stringTableSize) {\n                    if (buffer[sectionPointer] === 0x00) {\n                        if (sectionPointer - stringStartPointer > 0) {\n                            const string = buffer.toString('utf-8', stringStartPointer, sectionPointer);\n                            stringTable.set(\n                                stringStartPointer - stringTableOffset + stringTableDelta,\n                                string,\n                            );\n                        }\n\n                        stringStartPointer = sectionPointer + 1;\n                    }\n                    sectionPointer += 1;\n                }\n                stringTableDelta += sectionHeader.stringTableSize;\n            } else {\n                sectionPointer = sectionHeader.offsetRecordsEnd;\n            }\n\n            const idList: number[] = [];\n            for (let j = 0; j < sectionHeader.idListSize / 4; j += 1) {\n                idList.push(buffer.readUInt32LE(sectionPointer));\n                sectionPointer += 4;\n            }\n\n            for (let j = 0; j < sectionHeader.copyTableCount; j += 1) {\n                const dst = buffer.readUInt32LE(sectionPointer);\n                const src = buffer.readUInt32LE(sectionPointer + 4);\n                this.copyTable.set(dst, src);\n\n                sectionPointer += 8;\n            }\n\n            const offsetMap: OffsetMapEntry[] = [];\n            for (let j = 0; j < sectionHeader.offsetMapIDCount; j += 1) {\n                const offset = buffer.readUInt32LE(sectionPointer);\n                const size = buffer.readUInt16LE(sectionPointer + 4);\n                const data = buffer.subarray(offset, offset + size);\n\n                sectionPointer += 6;\n\n                offsetMap.push({\n                    offset,\n                    size,\n                    data,\n                });\n            }\n\n            const offsetMapIDList: number[] = [];\n\n            if (hasRelationshipData) {\n                // Note, if flag 0x02 is set,\n                // offset_map_id_list will appear before relationship_map instead\n                for (let j = 0; j < sectionHeader.offsetMapIDCount; j += 1) {\n                    offsetMapIDList.push(buffer.readUInt32LE(sectionPointer));\n                    sectionPointer += 4;\n                }\n            }\n\n            const relationshipMap = new Map<number, number>();\n            if (sectionHeader.relationshipDataSize > 0) {\n                const numEntries = buffer.readUInt32LE(sectionPointer);\n                // const relationshipMinID = buffer.readUInt32LE(sectionPointer + 4);\n                // const relationshipMaxID = buffer.readUInt32LE(sectionPointer + 8);\n\n                sectionPointer += 12;\n\n                for (let j = 0; j < numEntries; j += 1) {\n                    const foreignID = buffer.readUInt32LE(sectionPointer);\n                    const recordIndex = buffer.readUInt32LE(sectionPointer + 4);\n                    sectionPointer += 8;\n\n                    relationshipMap.set(recordIndex, foreignID);\n                }\n            }\n\n            if (!hasRelationshipData) {\n                // see if (hasRelationshipData)\n                for (let j = 0; j < sectionHeader.offsetMapIDCount; j += 1) {\n                    offsetMapIDList.push(buffer.readUInt32LE(sectionPointer));\n                    sectionPointer += 4;\n                }\n            }\n\n            return {\n                header: sectionHeader,\n                isZeroed,\n                recordDataSize,\n                records,\n                idList,\n                offsetMap,\n                relationshipMap,\n            };\n        });\n\n        const totalRecordDataSize = sections\n            .reduce((acc, section) => acc + section.recordDataSize, 0);\n        sections.forEach((section) => {\n            const {\n                header, isZeroed, records, idList, offsetMap, relationshipMap,\n            } = section;\n\n            const prevRecordDataSize = sections\n                .filter((s) => s.header.fileOffset < header.fileOffset)\n                .reduce((acc, s) => acc + s.recordDataSize, 0);\n\n            if (isZeroed) {\n                return;\n            }\n\n            for (let recordIndex = 0; recordIndex < header.recordCount; recordIndex += 1) {\n                let recordID = idList.length > 0 ? idList[recordIndex] : undefined;\n                const recordBuffer = isNormal\n                    ? records[recordIndex]\n                    : offsetMap[recordIndex].data;\n\n                if (isNormal) {\n                    const recordData = fieldsInfo.map((fieldInfo, fieldIndex): ParsedField => {\n                        switch (fieldInfo.storageType) {\n                            case 'none': {\n                                const value = readBitpackedValue(\n                                    recordBuffer,\n                                    fieldInfo.fieldOffsetBits,\n                                    fieldInfo.fieldSizeBits,\n                                );\n\n                                if (typeof value === 'bigint') {\n                                    return {\n                                        type: 'none',\n                                        data: value,\n                                    };\n                                }\n\n                                if (recordID === undefined && fieldIndex === idIndex) {\n                                    recordID = value;\n                                }\n\n                                // eslint-disable-next-line no-bitwise\n                                const fieldOffset = fieldInfo.fieldOffsetBits >>> 3;\n                                const offset = prevRecordDataSize - totalRecordDataSize\n                                    + (recordSize * recordIndex) + fieldOffset + value;\n\n                                return {\n                                    type: 'none',\n                                    data: value,\n                                    string: stringTable.get(offset),\n                                };\n                            }\n                            case 'commonData': {\n                                const value = recordID !== undefined\n                                    ? commonData.get(fieldIndex)?.get(recordID)\n                                    : undefined;\n\n                                return {\n                                    type: 'commonData',\n                                    data: value ?? fieldInfo.defaultValue,\n                                };\n                            }\n                            case 'bitpacked':\n                            case 'bitpackedSigned':\n                            case 'bitpackedIndexed':\n                            case 'bitpackedIndexedArray': {\n                                let value = readBitpackedValue(\n                                    recordBuffer,\n                                    fieldInfo.fieldOffsetBits,\n                                    fieldInfo.fieldSizeBits,\n                                    fieldInfo.storageType === 'bitpackedSigned',\n                                );\n\n                                assert(typeof value === 'number', 'Bitpacked value must be a number');\n\n                                if (fieldInfo.storageType === 'bitpackedIndexedArray') {\n                                    const fieldPalletData = palletData.get(fieldIndex);\n\n                                    assert(fieldPalletData, `No pallet data for field ${fieldIndex.toString()}`);\n\n                                    const data: number[] = [];\n                                    const palletStart = value * fieldInfo.arrayCount;\n\n                                    for (let j = 0; j < fieldInfo.arrayCount; j += 1) {\n                                        data.push(fieldPalletData[palletStart + j]);\n                                    }\n\n                                    return {\n                                        type: 'bitpackedArray',\n                                        data,\n                                    };\n                                }\n\n                                if (fieldInfo.storageType === 'bitpackedIndexed') {\n                                    const fieldPalletData = palletData.get(fieldIndex);\n\n                                    assert(fieldPalletData, `No pallet data for field ${fieldIndex.toString()}`);\n\n                                    value = fieldPalletData[value];\n                                }\n\n                                if (recordID === undefined && fieldIndex === idIndex) {\n                                    recordID = value;\n                                }\n\n                                return {\n                                    type: 'bitpacked',\n                                    data: value,\n                                };\n                            }\n                            default:\n                                fieldInfo satisfies never;\n                                throw new Error('Unreachable');\n                        }\n                    });\n\n                    assert(recordID !== undefined, 'No record ID found');\n\n                    this.rows.set(recordID, recordData);\n\n                    const foreignID = relationshipMap.get(recordIndex);\n                    if (foreignID !== undefined) {\n                        this.relationships.set(recordID, foreignID);\n                    }\n                } else {\n                    const recordData = {\n                        type: 'sparse',\n                        data: recordBuffer,\n                    } satisfies SparseRow;\n\n                    // for now (10.2.5), every sparse table has idList\n                    // so we can safely assume recordID is not undefined\n                    assert(recordID !== undefined, 'No record ID found');\n\n                    this.rows.set(recordID, recordData);\n\n                    const foreignID = relationshipMap.get(recordIndex);\n                    if (foreignID !== undefined) {\n                        this.relationships.set(recordID, foreignID);\n                    }\n                }\n            }\n        });\n\n        const entries = adb?.tableEntries.get(tableHash);\n        entries\n            ?.filter((entry) => entry.pushID !== -1)\n            .sort((a, b) => a.pushID - b.pushID)\n            .forEach((entry) => {\n                switch (entry.recordState) {\n                    case 1: // Valid\n                        this.hotfixes.set(entry.recordID, { type: 'modify', data: entry.data });\n                        break;\n                    case 2: // Delete\n                        this.hotfixes.set(entry.recordID, { type: 'delete' });\n                        break;\n                    case 3: // Invalid\n                        this.hotfixes.delete(entry.recordID);\n                        break;\n                    case 4: // NotPublic\n                        break;\n                    default:\n                        throw new Error(`Unknown record state: ${entry.recordState.toString()}`);\n                }\n            });\n    }\n\n    getAllIDs(): number[] {\n        return [...this.rows.keys(), ...this.copyTable.keys()];\n    }\n\n    getRowData(id: number): ParsedField[] | SparseRow | undefined {\n        const hotfix = this.hotfixes.get(id);\n        if (hotfix) {\n            switch (hotfix.type) {\n                case 'modify':\n                    return {\n                        type: 'sparse',\n                        data: hotfix.data,\n                    };\n                case 'delete':\n                    return undefined;\n                default:\n                    hotfix satisfies never;\n                    throw new Error('Unreachable');\n            }\n        }\n\n        const dst = this.copyTable.get(id);\n        if (dst !== undefined) {\n            return this.rows.get(dst);\n        }\n        return this.rows.get(id);\n    }\n\n    getRowRelationship(id: number): number | undefined {\n        const dst = this.copyTable.get(id);\n        if (dst !== undefined) {\n            return this.relationships.get(dst);\n        }\n        return this.relationships.get(id);\n    }\n}\n\nexport type {\n    FieldStructure,\n    FieldStorageInfo,\n    FieldStorageInfoCompressionNone,\n    FieldStorageInfoCompressionBitpacked,\n    FieldStorageInfoCompressionCommonData,\n    FieldStorageInfoCompressionBitpackedIndexed,\n    FieldStorageInfoCompressionBitpackedIndexedArray,\n    FieldStorageInfoCompressionBitpackedSigned,\n    ParsedField,\n    ParsedFieldNone,\n    ParsedFieldCommonData,\n    ParsedFieldBitpacked,\n    ParsedFieldBitpackedArray,\n    SparseRow,\n    Hotfix,\n    HotfixModify,\n    HotfixDelete,\n};\n","import assert from 'node:assert';\nimport crypto from 'node:crypto';\n\nimport { mapLimit, retry } from 'async';\nimport cliProgress from 'cli-progress';\n\nimport BLTEReader from './blte.ts';\nimport {\n    getProductVersions,\n    getProductCDNs,\n    getConfigFile,\n    getDataFile,\n} from './fetcher.ts';\nimport getNameHash from './jenkins96.ts';\nimport parseArchiveIndex from './parsers/archiveIndex.ts';\nimport { parseCDNConfig, parseBuildConfig } from './parsers/config.ts';\nimport parseEncodingFile from './parsers/encodingFile.ts';\nimport parseInstallFile from './parsers/installFile.ts';\nimport { parseProductVersions, parseProductCDNs } from './parsers/productConfig.ts';\nimport parseRootFile, { LocaleFlags, ContentFlags } from './parsers/rootFile.ts';\nimport { resolveCDNHost, formatFileSize } from './utils.ts';\nimport WDCReader from './wdc.ts';\n\nimport type ADBReader from './adb.ts';\nimport type { MissingKeyBlock } from './blte.ts';\nimport type { ArchiveIndex } from './parsers/archiveIndex.ts';\nimport type { EncodingData } from './parsers/encodingFile.ts';\nimport type { InstallFile, InstallData } from './parsers/installFile.ts';\nimport type { Version } from './parsers/productConfig.ts';\nimport type { FileInfo, RootData } from './parsers/rootFile.ts';\n\ninterface ClientPreloadData {\n    prefixes: string[],\n    archives: Map<string, ArchiveIndex>,\n    encoding: EncodingData,\n    rootFile: RootData,\n    install: InstallData,\n}\n\ninterface FileFetchResultFull {\n    type: 'full',\n    buffer: Buffer,\n    blocks: undefined,\n}\n\ninterface FileFetchResultPartial {\n    type: 'partial',\n    buffer: Buffer,\n    blocks: MissingKeyBlock[],\n}\n\ntype FileFetchResult = FileFetchResultFull | FileFetchResultPartial;\n\nenum LogLevel {\n    error = 0,\n    warn = 1,\n    info = 2,\n    debug = 3,\n}\n\nconst textLogLevel = [\n    'ERROR',\n    'WARN',\n    'INFO',\n    'DEBUG',\n] as const;\n\nexport default class CASCClient {\n    public readonly region: string;\n\n    public readonly product: string;\n\n    public readonly version: Version;\n\n    public readonly name2FileDataID = new Map<string, number>();\n\n    public readonly keys = new Map<string, Uint8Array>();\n\n    public preload?: ClientPreloadData;\n\n    static async getProductVersion(region: string, product: string): Promise<Version | undefined> {\n        const versionsText = await getProductVersions(region, product);\n        const versions = parseProductVersions(versionsText);\n        return versions.find((version) => version.Region === region);\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public static LocaleFlags = LocaleFlags;\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public static ContentFlags = ContentFlags;\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public static LogLevel = LogLevel;\n\n    public logLevel: LogLevel;\n\n    constructor(region: string, product: string, version: Version, logLevel = LogLevel.info) {\n        this.region = region;\n        this.product = product;\n        this.version = version;\n        this.logLevel = logLevel;\n    }\n\n    private log(level: LogLevel, message: unknown): void {\n        if (level <= this.logLevel) {\n            if (level <= LogLevel.error) {\n                console.error(`${new Date().toISOString()} [${textLogLevel[level]}]:`, message);\n            } else {\n                console.info(`${new Date().toISOString()} [${textLogLevel[level]}]:`, message);\n            }\n        }\n    }\n\n    async init(): Promise<void> {\n        this.log(LogLevel.info, 'Preloading remote CASC build:');\n        this.log(LogLevel.info, this.version);\n\n        this.log(LogLevel.info, 'Fetching CDN configuration...');\n        const serverConfigText = await getProductCDNs(this.region, this.product);\n        const serverConfig = parseProductCDNs(serverConfigText).find(\n            (config) => config.Name === this.region,\n        );\n        assert(serverConfig, 'No server config found');\n\n        this.log(LogLevel.info, 'Locating fastest CDN server...');\n        const prefixes = await resolveCDNHost(\n            serverConfig.Hosts.split(' '),\n            serverConfig.Path,\n        );\n        this.log(LogLevel.info, 'Resolved CDN servers:');\n        prefixes.forEach((prefix) => {\n            this.log(LogLevel.info, prefix);\n        });\n\n        this.log(LogLevel.info, 'Fetching build configurations...');\n        const cdnConfigText = await getConfigFile(prefixes, this.version.CDNConfig, {\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        const cdnConfig = parseCDNConfig(cdnConfigText);\n        const buildConfigText = await getConfigFile(prefixes, this.version.BuildConfig, {\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        const buildConfig = parseBuildConfig(buildConfigText);\n\n        this.log(LogLevel.info, 'Loading archives...');\n        const archiveKeys = cdnConfig.archives.split(' ');\n        const archiveCount = archiveKeys.length;\n        const archiveTotalSize = cdnConfig.archivesIndexSize\n            .split(' ')\n            .reduce((a, b) => a + parseInt(b, 10), 0);\n        const archiveBar = this.logLevel >= LogLevel.info\n            ? new cliProgress.SingleBar({ etaBuffer: 100 }, cliProgress.Presets.shades_classic)\n            : undefined;\n        archiveBar?.start(archiveCount, 0);\n        const archivesMapArray = await mapLimit(\n            archiveKeys,\n            50,\n            async (key: string) => {\n                const fileName = `${key}.index`;\n                const buffer = await retry({\n                    times: 5,\n                    interval: 3000,\n                }, async () => getDataFile(prefixes, fileName, 'indexes', this.version.BuildConfig, {\n                    showProgress: this.logLevel >= LogLevel.info,\n                    showAttemptFail: this.logLevel >= LogLevel.warn,\n                }));\n                const map = parseArchiveIndex(buffer, key);\n\n                archiveBar?.increment();\n\n                return map;\n            },\n        )\n            .then((result) => {\n                archiveBar?.stop();\n                return result.flatMap((e) => [...e]);\n            })\n            .catch((error: unknown) => {\n                archiveBar?.stop();\n                throw error;\n            });\n        const archives = new Map(archivesMapArray);\n        this.log(\n            LogLevel.info,\n            `Loaded ${archiveCount.toString()} archives (${archives.size.toString()} entries, ${formatFileSize(archiveTotalSize)})`,\n        );\n\n        this.log(LogLevel.info, 'Loading encoding table...');\n        const [encodingCKey, encodingEKey] = buildConfig.encoding.split(' ');\n        const encodingBuffer = await getDataFile(prefixes, encodingEKey, 'build', this.version.BuildConfig, {\n            name: 'encoding',\n            showProgress: this.logLevel >= LogLevel.info,\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        this.log(LogLevel.info, `Loaded encoding table (${formatFileSize(encodingBuffer.byteLength)})`);\n\n        this.log(LogLevel.info, 'Parsing encoding table...');\n        const encoding = parseEncodingFile(encodingBuffer, encodingEKey, encodingCKey);\n        this.log(LogLevel.info, `Parsed encoding table (${encoding.cKey2EKey.size.toString()} entries)`);\n\n        const getBuildConfigKeys = (configText: string): [string, string] => {\n            if (configText.includes(' ')) {\n                const [cKey, eKey] = configText.split(' ');\n                return [cKey, eKey];\n            }\n\n            const cKey = configText;\n            const eKeys = encoding.cKey2EKey.get(cKey);\n            assert(eKeys !== undefined, `Failing to find encoding key for ${cKey}`);\n\n            const eKey = typeof eKeys === 'string' ? eKeys : eKeys[0];\n\n            return [cKey, eKey];\n        };\n\n        this.log(LogLevel.info, 'Loading root table...');\n        const [rootCKey, rootEKey] = getBuildConfigKeys(buildConfig.root);\n        const rootBuffer = await getDataFile(prefixes, rootEKey, 'build', this.version.BuildConfig, {\n            name: 'root',\n            showProgress: this.logLevel >= LogLevel.info,\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        this.log(LogLevel.info, `Loaded root table (${formatFileSize(rootBuffer.byteLength)})`);\n\n        this.log(LogLevel.info, 'Parsing root file...');\n        const rootFile = parseRootFile(rootBuffer, rootEKey, rootCKey);\n        this.log(LogLevel.info, `Parsed root file (${rootFile.fileDataID2CKey.size.toString()} entries, ${rootFile.nameHash2FileDataID.size.toString()} hashes)`);\n\n        this.log(LogLevel.info, 'Loading install manifest...');\n        const [installCKey, installEKey] = getBuildConfigKeys(buildConfig.install);\n        const installBuffer = await getDataFile(prefixes, installEKey, 'build', this.version.BuildConfig, {\n            name: 'install',\n            showProgress: this.logLevel >= LogLevel.info,\n            showAttemptFail: this.logLevel >= LogLevel.warn,\n        });\n        this.log(LogLevel.info, `Loaded install manifest (${formatFileSize(installBuffer.byteLength)})`);\n\n        this.log(LogLevel.info, 'Parsing install manifest...');\n        const install = parseInstallFile(installBuffer, installEKey, installCKey);\n        this.log(LogLevel.info, `Parsed install manifest (${install.tags.length.toString()} tags, ${install.files.length.toString()} files)`);\n\n        this.preload = {\n            prefixes,\n            archives,\n            encoding,\n            rootFile,\n            install,\n        };\n    }\n\n    async loadRemoteListFile(): Promise<void> {\n        const url = 'https://github.com/wowdev/wow-listfile/releases/latest/download/community-listfile.csv';\n        const text = await (await fetch(url)).text();\n        const lines = text.split('\\n').map((line) => line.trim()).filter((line) => line.length > 0);\n\n        lines.forEach((line) => {\n            const [fileDataID, name] = line.split(';');\n            this.name2FileDataID.set(name.trim(), parseInt(fileDataID.trim(), 10));\n        });\n    }\n\n    async loadRemoteTACTKeys(): Promise<void> {\n        const url = 'https://raw.githubusercontent.com/wowdev/TACTKeys/master/WoW.txt';\n        const text = await (await fetch(url)).text();\n        const lines = text.split('\\n').map((line) => line.trim()).filter((line) => line.length > 0);\n\n        lines.forEach((line) => {\n            const [keyName, keyHex] = line.split(' ');\n\n            assert(keyName.length === 16, `Invalid keyName length: ${keyName.length.toString()}`);\n            assert(keyHex.length === 32, `Invalid key length: ${keyHex.length.toString()}`);\n\n            const key = Uint8Array.from(Buffer.from(keyHex, 'hex'));\n\n            this.keys.set(keyName.toLowerCase(), key);\n        });\n    }\n\n    async loadTACTKeys(): Promise<void> {\n        const keysCKeys = this.getContentKeysByFileDataID(1302850);\n        const lookupCKeys = this.getContentKeysByFileDataID(1302851);\n\n        assert(keysCKeys?.[0], 'Failing to find dbfilesclient/tactkey.db2');\n        assert(lookupCKeys?.[0], 'Failing to find dbfilesclient/tactkeylookup.db2');\n\n        const [keysResult, lookupResult] = await Promise.all([\n            this.getFileByContentKey(keysCKeys[0].cKey),\n            this.getFileByContentKey(lookupCKeys[0].cKey),\n        ]);\n\n        const keysReader = new WDCReader(keysResult.buffer);\n        const lookupReader = new WDCReader(lookupResult.buffer);\n\n        lookupReader.getAllIDs().forEach((keyID) => {\n            const lookupRow = lookupReader.rows.get(keyID);\n            const keyRow = keysReader.rows.get(keyID);\n\n            if (keyRow) {\n                assert(Array.isArray(lookupRow) && lookupRow.length > 0, `Invalid TACTKeyLookup table row at id ${keyID.toString()}`);\n                assert(Array.isArray(keyRow) && keyRow.length > 0, `Invalid TACTKey table row at id ${keyID.toString()}`);\n\n                const keyName = lookupRow[0].data.toString(16).padStart(16, '0');\n                const keyHexLE = keyRow[0].data.toString(16).padStart(32, '0');\n\n                assert(keyName.length === 16, `Invalid keyName length: ${keyName.length.toString()}`);\n                assert(keyHexLE.length === 32, `Invalid key length: ${keyHexLE.length.toString()}`);\n\n                const keyHex = [...keyHexLE.matchAll(/.{2}/g)].map((v) => v[0]).reverse().join('');\n                const key = Uint8Array.from(Buffer.from(keyHex, 'hex'));\n\n                this.keys.set(keyName.toLowerCase(), key);\n            }\n        });\n    }\n\n    loadBroadcastTACTKeys(adb: ADBReader): void {\n        adb.tableEntries\n            .get(0x021826BB) // BroadcastText\n            ?.forEach(({ data }) => {\n                if (data.byteLength > 0) {\n                    let pointer = 0;\n\n                    // Text_lang\n                    while (data[pointer] !== 0) {\n                        pointer += 1;\n                    }\n                    pointer += 1;\n\n                    // Text1_lang\n                    while (data[pointer] !== 0) {\n                        pointer += 1;\n                    }\n                    pointer += 1 + 43;\n\n                    if (pointer < data.byteLength) {\n                        const extraTableHash = data.readUInt32LE(pointer);\n                        if (extraTableHash === 0xDF2F53CF) { // TactKey\n                            const keyName = data.readBigUInt64LE(pointer + 4).toString(16).padStart(16, '0');\n                            const key = Uint8Array.from(data.subarray(pointer + 12));\n\n                            if (!this.keys.has(keyName)) {\n                                this.keys.set(keyName, key);\n                            }\n                        }\n                    }\n                }\n            });\n    }\n\n    getFileDataIDByName(name: string): number | undefined {\n        assert(this.preload, 'Client not initialized');\n\n        const { rootFile } = this.preload;\n        const { nameHash2FileDataID } = rootFile;\n\n        const nameHash = getNameHash(name);\n        return nameHash2FileDataID.get(nameHash) ?? this.name2FileDataID.get(name.toLowerCase());\n    }\n\n    getContentKeysByFileDataID(fileDataID: number): FileInfo[] | undefined {\n        assert(this.preload, 'Client not initialized');\n\n        const { rootFile } = this.preload;\n\n        return rootFile.fileDataID2CKey.get(fileDataID);\n    }\n\n    getContentKeysFromInstall(name: string): InstallFile[] | undefined {\n        assert(this.preload, 'Client not initialized');\n\n        const { install } = this.preload;\n\n        return install.files.filter((file) => file.name === name);\n    }\n\n    async getFileByContentKey(cKey: string, allowMissingKey?: false): Promise<FileFetchResultFull>;\n    async getFileByContentKey(cKey: string, allowMissingKey: true): Promise<FileFetchResult>;\n    async getFileByContentKey(cKey: string, allowMissingKey = false): Promise<FileFetchResult> {\n        assert(this.preload, 'Client not initialized');\n\n        const { prefixes, encoding, archives } = this.preload;\n        const eKeys = encoding.cKey2EKey.get(cKey);\n        assert(eKeys !== undefined, `Failing to find encoding key for ${cKey}`);\n\n        const eKey = typeof eKeys === 'string' ? eKeys : eKeys[0];\n\n        const archive = archives.get(eKey);\n        const blte = archive\n            ? await getDataFile(prefixes, archive.key, 'data', this.version.BuildConfig, {\n                name: eKey,\n                partialOffset: archive.offset,\n                partialLength: archive.size,\n                showProgress: this.logLevel >= LogLevel.info,\n                showAttemptFail: this.logLevel >= LogLevel.warn,\n            })\n            : await getDataFile(prefixes, eKey, 'data', this.version.BuildConfig, {\n                showProgress: this.logLevel >= LogLevel.info,\n                showAttemptFail: this.logLevel >= LogLevel.warn,\n            });\n\n        const reader = new BLTEReader(blte, eKey, this.keys);\n        if (!allowMissingKey) {\n            reader.processBytes(allowMissingKey);\n\n            const hash = crypto.createHash('md5').update(reader.buffer).digest('hex');\n            assert(hash === cKey, `Invalid hash: expected ${cKey}, got ${hash}`);\n\n            return {\n                type: 'full',\n                buffer: reader.buffer,\n                blocks: undefined,\n            };\n        }\n\n        const blocks = reader.processBytes(allowMissingKey);\n\n        if (blocks.length === 0) {\n            const hash = crypto.createHash('md5').update(reader.buffer).digest('hex');\n            assert(hash === cKey, `Invalid hash: expected ${cKey}, got ${hash}`);\n\n            return {\n                type: 'full',\n                buffer: reader.buffer,\n                blocks: undefined,\n            };\n        }\n\n        return {\n            type: 'partial',\n            buffer: reader.buffer,\n            blocks,\n        };\n    }\n}\n\nexport type {\n    Version,\n    ClientPreloadData,\n    ArchiveIndex,\n    EncodingData,\n    InstallFile,\n    InstallData,\n    RootData,\n    FileInfo,\n    FileFetchResultFull,\n    FileFetchResultPartial,\n    FileFetchResult,\n    MissingKeyBlock,\n};\n","import assert from 'node:assert';\n\nimport type WDCReader from './wdc.ts';\n\ninterface Manifest {\n    tableHash: string,\n    tableName?: string,\n    db2FileDataID?: number,\n    dbcFileDataID?: number,\n}\n\ninterface Column {\n    name: string,\n    type: string,\n    isID: boolean,\n    isInline: boolean,\n    isRelation: boolean,\n    isSigned: boolean,\n    size?: number,\n    arraySize?: number,\n}\n\ntype BasicColumnData = number | bigint | string | undefined;\n\ntype ColumnData = BasicColumnData | BasicColumnData[];\n\nconst PATTERN_COLUMN = /^(int|float|locstring|string)(<[^:]+::[^>]+>)?\\s([^\\s]+)/;\nconst PATTERN_LAYOUT = /^LAYOUT\\s(.*)/;\nconst PATTERN_FIELD = /^(\\$([^$]+)\\$)?([^<[]+)(<(u|)(\\d+)>)?(\\[(\\d+)\\])?$/;\n\nconst castIntegerBySize = (\n    value: number,\n    src: number,\n    srcSigned: boolean,\n    dst: number,\n    dstSigned: boolean,\n): number => {\n    const castBuffer = Buffer.alloc(6);\n\n    if (srcSigned) {\n        castBuffer.writeIntLE(value, 0, src);\n    } else {\n        castBuffer.writeUIntLE(value, 0, src);\n    }\n\n    return dstSigned ? castBuffer.readIntLE(0, dst) : castBuffer.readUIntLE(0, dst);\n};\n\nconst castFloat = (value: number, src: number, srcSigned: boolean): number => {\n    const castBuffer = Buffer.alloc(4);\n\n    if (srcSigned) {\n        castBuffer.writeIntLE(value, 0, src);\n    } else {\n        castBuffer.writeUIntLE(value, 0, src);\n    }\n\n    const result = castBuffer.readFloatLE(0);\n    return result;\n};\n\nconst castBigInt64 = (value: bigint, srcSigned: boolean, dstSigned: boolean): bigint => {\n    const castBuffer = Buffer.alloc(8);\n\n    if (srcSigned) {\n        castBuffer.writeBigInt64LE(value, 0);\n    } else {\n        castBuffer.writeBigUInt64LE(value, 0);\n    }\n\n    return dstSigned ? castBuffer.readBigInt64LE(0) : castBuffer.readBigUInt64LE(0);\n};\n\nconst getCastBuffer = (value: bigint, srcSize: number, dstSize: number): Buffer => {\n    const castBuffer = Buffer.alloc(dstSize);\n    let remain = value;\n\n    // eslint-disable-next-line no-bitwise\n    for (let i = 0; i < srcSize && remain > 0n; i += 1, remain >>= 8n) {\n        const byte = Number(BigInt.asUintN(8, remain));\n        castBuffer.writeUInt8(byte, i);\n    }\n\n    return castBuffer;\n};\n\nexport default class DBDParser {\n    public readonly wdc: WDCReader;\n\n    public readonly definitions = new Map<string, string>();\n\n    public columns: Column[] = [];\n\n    private cache = new Map<number, Record<string, ColumnData>>();\n\n    private constructor(wdc: WDCReader) {\n        this.wdc = wdc;\n    }\n\n    private async init(): Promise<void> {\n        const manifestsURL = 'https://raw.githubusercontent.com/wowdev/WoWDBDefs/master/manifest.json';\n        const manifests = await (await fetch(manifestsURL)).json() as Manifest[];\n\n        const tableHashHex = this.wdc.tableHash.toString(16).padStart(8, '0').toLowerCase();\n        const manifest = manifests.find((v) => v.tableHash.toLowerCase() === tableHashHex);\n\n        assert(manifest?.tableName !== undefined, `No manifest found for table hash ${tableHashHex}`);\n\n        const url = `https://raw.githubusercontent.com/wowdev/WoWDBDefs/master/definitions/${manifest.tableName}.dbd`;\n        const text = await (await fetch(url)).text();\n        const lines = text.split('\\n').map((v) => v.trim());\n\n        const chunks = lines.reduce<string[][]>((acc, line) => {\n            if (line.length > 0) {\n                acc[acc.length - 1].push(line);\n            } else {\n                acc.push([]);\n            }\n            return acc;\n        }, [[]]).filter((chunk) => chunk.length > 0);\n\n        const columnsChunk = chunks.shift();\n        assert(columnsChunk?.[0] === 'COLUMNS', 'No column definitions found');\n\n        columnsChunk.shift();\n        columnsChunk.forEach((line) => {\n            const match = PATTERN_COLUMN.exec(line);\n            if (match) {\n                const [, type, , name] = match;\n                this.definitions.set(name.replace('?', ''), type);\n            }\n        });\n\n        const layoutHashHex = this.wdc.layoutHash.toString(16).padStart(8, '0').toLowerCase();\n        const versionChunk = chunks.find((chunk) => chunk.find((line) => {\n            const layoutsMatch = PATTERN_LAYOUT.exec(line);\n            const layouts = layoutsMatch?.[1].split(',').map((v) => v.trim().toLowerCase());\n            return layouts?.includes(layoutHashHex) === true;\n        }) !== undefined);\n\n        assert(versionChunk, `No version definition found for layout hash ${layoutHashHex}`);\n\n        versionChunk.forEach((line) => {\n            if (line.startsWith('LAYOUT') || line.startsWith('BUILD') || line.startsWith('COMMENT')) {\n                return;\n            }\n\n            const match = PATTERN_FIELD.exec(line);\n            if (match) {\n                const [\n                    , ,\n                    annotationsText,\n                    name, ,\n                    unsigned,\n                    sizeText, ,\n                    arraySizeText,\n                ] = match;\n                const type = this.definitions.get(name);\n\n                assert(type !== undefined, `No type found for column ${name}`);\n\n                const annotations = annotationsText ? annotationsText.split(',').map((v) => v.trim()) : [];\n                const size = sizeText ? parseInt(sizeText, 10) : undefined;\n                const arraySize = arraySizeText ? parseInt(arraySizeText, 10) : undefined;\n\n                const isID = annotations.includes('id');\n                const isInline = !annotations.includes('noninline');\n                const isRelation = annotations.includes('relation');\n                const isSigned = !unsigned;\n\n                this.columns.push({\n                    name,\n                    type,\n                    isID,\n                    isInline,\n                    isRelation,\n                    isSigned,\n                    size,\n                    arraySize,\n                });\n            }\n        });\n    }\n\n    static async parse(wdc: WDCReader): Promise<DBDParser> {\n        const parser = new DBDParser(wdc);\n\n        await parser.init();\n\n        return parser;\n    }\n\n    getAllIDs(): number[] {\n        return this.wdc.getAllIDs();\n    }\n\n    getRowData(id: number): Record<string, ColumnData> | undefined {\n        if (this.cache.has(id)) {\n            return structuredClone(this.cache.get(id));\n        }\n\n        const row = this.wdc.getRowData(id);\n        if (!row) {\n            return undefined;\n        }\n\n        const data: Record<string, ColumnData> = {};\n        if (Array.isArray(row)) {\n            let fieldIndex = 0;\n            this.columns.forEach((column) => {\n                if (column.isID) {\n                    data[column.name] = id;\n\n                    if (column.isInline) {\n                        fieldIndex += 1;\n                    }\n                } else if (column.isInline) {\n                    assert(row.length > fieldIndex, `No value found for column ${column.name}`);\n\n                    const cell = row[fieldIndex];\n                    const fieldInfo = this.wdc.fieldsInfo[fieldIndex];\n                    const srcSigned = fieldInfo.storageType === 'bitpackedSigned';\n                    const srcSize = (\n                        fieldInfo.storageType === 'none'\n                        || fieldInfo.storageType === 'bitpacked'\n                        || fieldInfo.storageType === 'bitpackedSigned'\n                    )\n                        ? Math.ceil(fieldInfo.fieldSizeBits / 8)\n                        : 4;\n                    const dstSize = column.size !== undefined\n                        ? Math.ceil(column.size / 8)\n                        : undefined;\n\n                    if (cell.type === 'bitpackedArray') {\n                        data[column.name] = cell.data.map((v) => {\n                            if (column.type === 'float') {\n                                return castFloat(v, srcSize, srcSigned);\n                            }\n                            if (dstSize !== undefined) {\n                                return castIntegerBySize(\n                                    v,\n                                    srcSize,\n                                    srcSigned,\n                                    dstSize,\n                                    column.isSigned,\n                                );\n                            }\n                            return v;\n                        });\n                    } else if (column.type === 'string' || column.type === 'locstring') {\n                        if (cell.data > 0) {\n                            assert(cell.type === 'none', `Invalid data type for string column ${column.name}`);\n                            assert(typeof cell.string === 'string', `Missing string for string column ${column.name}`);\n\n                            data[column.name] = cell.string;\n                        }\n                    } else if (column.type === 'float') {\n                        if (column.arraySize !== undefined) {\n                            const castBuffer = getCastBuffer(\n                                typeof cell.data === 'number' ? BigInt(cell.data) : cell.data,\n                                srcSize,\n                                4 * column.arraySize,\n                            );\n\n                            const values: number[] = [];\n                            for (let i = 0; i < column.arraySize; i += 1) {\n                                const value = castBuffer.readFloatLE(i * 4);\n                                values.push(value);\n                            }\n\n                            data[column.name] = values;\n                        } else {\n                            assert(typeof cell.data === 'number', `Invalid data type for float column ${column.name}`);\n\n                            data[column.name] = castFloat(cell.data, srcSize, srcSigned);\n                        }\n                    } else if (column.type === 'int') {\n                        if (column.arraySize !== undefined) {\n                            assert(dstSize !== undefined, `Missing size for int array column ${column.name}`);\n\n                            const castBuffer = getCastBuffer(\n                                typeof cell.data === 'number' ? BigInt(cell.data) : cell.data,\n                                srcSize,\n                                dstSize * column.arraySize,\n                            );\n\n                            if (dstSize > 6) {\n                                assert(dstSize === 8, `Unexpected size ${dstSize.toString()} for column ${column.name}`);\n\n                                const values: bigint[] = [];\n                                if (column.isSigned) {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readBigInt64LE(i * dstSize);\n                                        values.push(value);\n                                    }\n                                } else {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readBigUInt64LE(i * dstSize);\n                                        values.push(value);\n                                    }\n                                }\n\n                                data[column.name] = values;\n                            } else {\n                                const values: number[] = [];\n                                if (column.isSigned) {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readIntLE(i * dstSize, dstSize);\n                                        values.push(value);\n                                    }\n                                } else {\n                                    for (let i = 0; i < column.arraySize; i += 1) {\n                                        const value = castBuffer.readUIntLE(i * dstSize, dstSize);\n                                        values.push(value);\n                                    }\n                                }\n\n                                data[column.name] = values;\n                            }\n                        } else if (typeof cell.data === 'number') {\n                            data[column.name] = castIntegerBySize(\n                                cell.data,\n                                srcSize,\n                                srcSigned,\n                                dstSize ?? srcSize,\n                                column.isSigned,\n                            );\n                        } else {\n                            assert(column.size === undefined || column.size === 64, `Unexpected size ${column.size?.toString() ?? ''} for column ${column.name}`);\n\n                            if (srcSigned !== column.isSigned) {\n                                data[column.name] = castBigInt64(\n                                    cell.data,\n                                    srcSigned,\n                                    column.isSigned,\n                                );\n                            } else {\n                                data[column.name] = cell.data;\n                            }\n                        }\n                    } else {\n                        throw new Error(`Unsupported column type ${column.type} for column ${column.name}`);\n                    }\n\n                    fieldIndex += 1;\n                } else if (column.isRelation) {\n                    const relation = this.wdc.getRowRelationship(id);\n                    data[column.name] = relation ?? 0;\n                }\n            });\n        } else {\n            const buffer = row.data;\n            let offset = 0;\n            let fieldIndex = 0;\n            this.columns.forEach((column) => {\n                if (column.isID) {\n                    data[column.name] = id;\n\n                    if (column.isInline) {\n                        const currField = this.wdc.fields[fieldIndex];\n                        const size = Math.ceil((column.size ?? (32 - currField.size)) / 8);\n                        offset += size;\n\n                        fieldIndex += 1;\n                    }\n                } else if (column.isInline) {\n                    const values = [];\n\n                    if (column.type === 'string' || column.type === 'locstring') {\n                        const count = column.arraySize ?? 1;\n\n                        for (let i = 0; i < count; i += 1) {\n                            const startOffset = offset;\n                            while (buffer[offset] !== 0x00) {\n                                offset += 1;\n                            }\n\n                            values.push(buffer.toString('utf-8', startOffset, offset));\n                            offset += 1;\n                        }\n\n                        data[column.name] = count > 1 ? values : values[0];\n                    } else {\n                        // note: layout hash won't change when array size changes\n                        // so we try to determine array size based on field structure\n                        const currField = this.wdc.fields[fieldIndex];\n                        const nextField = this.wdc.fields[fieldIndex + 1];\n                        const size = Math.ceil((column.size ?? (32 - currField.size)) / 8);\n\n                        let count;\n                        if (fieldIndex + 1 < this.wdc.fields.length) {\n                            // reading hotfix for normal db2 may have fields with same position\n                            count = Math.max((nextField.position - currField.position) / size, 1);\n                        } else {\n                            // nextPos = byteLength - offset + currPos\n                            count = column.arraySize !== undefined\n                                ? ((buffer.byteLength - offset) / size)\n                                : 1;\n                        }\n\n                        for (let i = 0; i < count; i += 1) {\n                            if (column.type === 'float') {\n                                const value = buffer.readFloatLE(offset);\n                                values.push(value);\n                                offset += 4;\n                            } else if (size > 6) {\n                                assert(size === 8, `Unexpected size ${size.toString()} for column ${column.name}`);\n\n                                const value = column.isSigned\n                                    ? buffer.readBigInt64LE(offset)\n                                    : buffer.readBigUInt64LE(offset);\n\n                                values.push(value);\n                                offset += size;\n                            } else {\n                                const value = column.isSigned\n                                    ? buffer.readIntLE(offset, size)\n                                    : buffer.readUIntLE(offset, size);\n\n                                values.push(value);\n                                offset += size;\n                            }\n                        }\n\n                        data[column.name] = count > 1 ? values : values[0];\n                    }\n\n                    fieldIndex += 1;\n                } else if (column.isRelation) {\n                    const relation = this.wdc.getRowRelationship(id);\n                    data[column.name] = relation ?? 0;\n                }\n            });\n        }\n\n        this.cache.set(id, data);\n\n        return structuredClone(data);\n    }\n}\n\nexport type {\n    Column,\n    ColumnData,\n    BasicColumnData,\n};\n"],"names":["assert","blteHash","crypto","zlib","fs","path","https","cliProgress","MAGIC_OFFSET","VERSION_OFFSET","files","LogLevel","mapLimit","retry","cKey","eKey"],"mappings":"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"}