@rhyster/wow-casc-dbc 2.11.27 → 2.11.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"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 http from 'node:http';\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 http.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 = `http://${region}.patch.battle.net:1119/${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 = `http://${region}.patch.battle.net:1119/${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 = 0;\n let localeFlags = 0;\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 = Number(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(`http://${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) => `http://${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 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 if (sizeBytes <= 6) {\n // safe to be number\n const rawValue = buffer.readUIntLE(offsetBytes, sizeBytes);\n return Number(\n signed\n ? BigInt.asIntN(fieldSizeBits, BigInt(rawValue >>> bitOffset))\n : BigInt.asUintN(fieldSizeBits, BigInt(rawValue >>> bitOffset)),\n );\n }\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 return signed\n ? BigInt.asIntN(fieldSizeBits, value >> BigInt(bitOffset))\n : BigInt.asUintN(fieldSizeBits, value >> BigInt(bitOffset));\n};\n/* eslint-enable no-bitwise */\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(buffer: Buffer, blocks: MissingKeyBlock[] = [], adb?: ADBReader) {\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 = blocks.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 Math.round(result * 100) / 100;\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(Math.round(value * 100) / 100);\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(Math.round(value * 100) / 100);\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","http","cliProgress","MAGIC_OFFSET","VERSION_OFFSET","files","LogLevel","mapLimit","retry","cKey","eKey"],"mappings":"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"}
1
+ {"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 http from 'node:http';\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 http.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 = `http://${region}.patch.battle.net:1119/${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 = `http://${region}.patch.battle.net:1119/${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 = 0;\n let localeFlags = 0;\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(`http://${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) => `http://${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 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 if (sizeBytes <= 6) {\n // safe to be number\n const rawValue = buffer.readUIntLE(offsetBytes, sizeBytes);\n return Number(\n signed\n ? BigInt.asIntN(fieldSizeBits, BigInt(rawValue >>> bitOffset))\n : BigInt.asUintN(fieldSizeBits, BigInt(rawValue >>> bitOffset)),\n );\n }\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 return signed\n ? BigInt.asIntN(fieldSizeBits, value >> BigInt(bitOffset))\n : BigInt.asUintN(fieldSizeBits, value >> BigInt(bitOffset));\n};\n/* eslint-enable no-bitwise */\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(buffer: Buffer, blocks: MissingKeyBlock[] = [], adb?: ADBReader) {\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 = blocks.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 Math.round(result * 100) / 100;\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(Math.round(value * 100) / 100);\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(Math.round(value * 100) / 100);\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","http","cliProgress","MAGIC_OFFSET","VERSION_OFFSET","files","LogLevel","mapLimit","retry","cKey","eKey"],"mappings":"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"}