{"version":3,"file":"patch.mjs","names":["findIndex","findExact","data","find","from","index","findFuzzy","until","backward","end","length","add","stop","i","found","j","b","findFuzzyOnce","fuzzy","r","writeFuzzy","offset","patchGroupOffsets","patches","offsets","count","push","patchOnce","type","foundOffsets","foundGroup","group","Error","replace","slider","amount","size","u32","le","v","getUint32","setUint32"],"sources":["../../../src/util/internal/patch.ts"],"sourcesContent":["import {findIndex} from './data.ts';\n\n/**\n * Find exact matches in data.\n *\n * @param data Data to search.\n * @param find Search for.\n * @param from Search from.\n * @yields Index.\n */\nexport function* findExact(\n\tdata: Readonly<Uint8Array>,\n\tfind: Readonly<Uint8Array>,\n\tfrom = 0\n) {\n\tfor (let index = from - 1; ; ) {\n\t\tindex = findIndex(data, find, index + 1);\n\t\tif (index < 0) {\n\t\t\tbreak;\n\t\t}\n\t\tyield index;\n\t}\n}\n\n/**\n * Find similar matches in data.\n *\n * @param data Data to search.\n * @param find Search for.\n * @param from Search from.\n * @param until Search until.\n * @param backward Search backwards.\n * @yields Index.\n */\nexport function* findFuzzy(\n\tdata: Readonly<Uint8Array>,\n\tfind: readonly number[],\n\tfrom = 0,\n\tuntil = -1,\n\tbackward = false\n) {\n\tconst end = (until < 0 ? data.length : until) - find.length;\n\tconst add = backward ? -1 : 1;\n\tconst stop = backward ? -1 : end + 1;\n\tfor (let i = backward ? end : from; i !== stop; i += add) {\n\t\tlet found = true;\n\t\tconst {length} = find;\n\t\tfor (let j = 0; j < length; j++) {\n\t\t\tconst b = find[j];\n\t\t\tif (!(b < 0) && data[i + j] !== b) {\n\t\t\t\tfound = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (found) {\n\t\t\tyield i;\n\t\t}\n\t}\n}\n\n/**\n * Fuzzy find once, null if multiple.\n *\n * @param data Data.\n * @param fuzzy Fuzzy data.\n * @returns Index or null.\n */\nexport function findFuzzyOnce(\n\tdata: Readonly<Uint8Array>,\n\tfuzzy: readonly number[]\n) {\n\tlet r = null;\n\tfor (const found of findFuzzy(data, fuzzy)) {\n\t\tif (r !== null) {\n\t\t\treturn null;\n\t\t}\n\t\tr = found;\n\t}\n\treturn r;\n}\n\n/**\n * Write similar match in data.\n *\n * @param data Data to write into.\n * @param offset Offset to write at.\n * @param fuzzy The similar data.\n */\nexport function writeFuzzy(\n\tdata: Uint8Array,\n\toffset: number,\n\tfuzzy: readonly number[]\n) {\n\tconst {length} = fuzzy;\n\tfor (let i = 0; i < length; i++) {\n\t\tconst b = fuzzy[i];\n\t\tif (!(b < 0)) {\n\t\t\tdata[offset + i] = b;\n\t\t}\n\t}\n}\n\n/**\n * Find the offsets for the patches in a group.\n *\n * @param data Data buffer.\n * @param patches Patches group.\n * @returns The offsets or null.\n */\nexport function patchGroupOffsets(\n\tdata: Readonly<Uint8Array>,\n\tpatches: {\n\t\tcount: number;\n\t\tfind: readonly number[];\n\t\treplace: readonly number[];\n\t}[]\n) {\n\tconst offsets = [];\n\tfor (const {find, count} of patches) {\n\t\tconst found = [...findFuzzy(data, find)];\n\t\tif (found.length !== count) {\n\t\t\treturn null;\n\t\t}\n\t\toffsets.push(found);\n\t}\n\treturn offsets;\n}\n\n/**\n * Patch one group and only from list of patch groups.\n *\n * @param data Data to be patched.\n * @param patches Patches list.\n * @param type Patch type.\n */\nexport function patchOnce(\n\tdata: Uint8Array,\n\tpatches: {\n\t\tcount: number;\n\t\tfind: readonly number[];\n\t\treplace: readonly number[];\n\t}[][],\n\ttype: string\n) {\n\t// Search the buffer for patch candidates.\n\tlet foundOffsets = null;\n\tlet foundGroup = null;\n\tfor (const group of patches) {\n\t\tconst offsets = patchGroupOffsets(data, group);\n\t\tif (!offsets) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (foundOffsets) {\n\t\t\tthrow new Error(`Multiple patch candidates for: ${type}`);\n\t\t}\n\t\tfoundOffsets = offsets;\n\t\tfoundGroup = group;\n\t}\n\tif (!foundGroup || !foundOffsets) {\n\t\tthrow new Error(`No patch candidates for: ${type}`);\n\t}\n\n\t// Apply the patches to the buffer.\n\tconst {length} = foundGroup;\n\tfor (let i = 0; i < length; i++) {\n\t\tfor (const offset of foundOffsets[i]) {\n\t\t\twriteFuzzy(data, offset, foundGroup[i].replace);\n\t\t}\n\t}\n}\n\n/**\n * A utility to slide values within a window.\n *\n * @param amount The amount to slide.\n * @param offset Window offset.\n * @param size Window size.\n * @returns Sliding functions.\n */\nexport function slider(amount: number, offset: number, size: number) {\n\tconst end = offset + size;\n\treturn {\n\t\t/**\n\t\t * For UINT32.\n\t\t *\n\t\t * @param data Data view.\n\t\t * @param i Integer offset.\n\t\t * @param le Little endian if true.\n\t\t */\n\t\tu32: (data: DataView, i: number, le: boolean) => {\n\t\t\tconst v = data.getUint32(i, le);\n\t\t\tif (v >= offset && v <= end) {\n\t\t\t\tdata.setUint32(i, v + amount, le);\n\t\t\t}\n\t\t}\n\t};\n}\n"],"mappings":"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","ignoreList":[]}