{"version":3,"sources":["../src/obfuscate.ts"],"sourcesContent":["import crypto from 'crypto';\n\nconst RENAMES: Record<string, string> = {\n  buildOverlay: '_wf',\n  checkNotice: '_wg',\n  hex: '_wh',\n  stable: '_wi',\n};\n\nfunction hash(s: string): number {\n  let h = 0;\n  for (let i = 0; i < s.length; i++) { h = ((h << 5) - h) + s.charCodeAt(i); h |= 0; }\n  return Math.abs(h);\n}\n\nfunction hexToBytes(hex: string): number[] {\n  const b: number[] = [];\n  for (let i = 0; i < hex.length; i += 2) b.push(parseInt(hex.substr(i, 2), 16));\n  return b;\n}\n\nfunction xorEncrypt(str: string, hexKey: string): string {\n  const kb = hexToBytes(hexKey);\n  const out: string[] = new Array(str.length);\n  for (let i = 0; i < str.length; i++) {\n    out[i] = (str.charCodeAt(i) ^ kb[i % kb.length]).toString(16).padStart(2, '0');\n  }\n  return out.join('');\n}\n\nfunction runtimeValue(str: string): string {\n  let s = str.slice(1, -1);\n  return s.replace(/\\\\(['\"\\\\bfnrtv0])/g, (_: string, c: string) => ({ \"'\": \"'\", '\"': '\"', '\\\\': '\\\\', 'b': '\\b', 'f': '\\f', 'n': '\\n', 'r': '\\r', 't': '\\t', 'v': '\\v', '0': '\\0' } as Record<string, string>)[c])\n    .replace(/\\\\(u\\{([\\da-fA-F]+)\\}|u([\\da-fA-F]{4})|x([\\da-fA-F]{2}))/g, (_: string, __: string, ubrace: string, u4: string, x2: string) => {\n      const code = ubrace ? parseInt(ubrace, 16) : (u4 ? parseInt(u4, 16) : parseInt(x2, 16));\n      return String.fromCodePoint(code);\n    });\n}\n\nfunction encryptStrings(code: string, key: string): string {\n  const out: string[] = [];\n  let i = 0;\n  while (i < code.length) {\n    if (code[i] === \"'\" || code[i] === '\"') {\n      const q = code[i];\n      let j = i + 1;\n      while (j < code.length) { if (code[j] === '\\\\') { j += 2; continue; } if (code[j] === q) break; j++; }\n      if (j < code.length) {\n        const val = runtimeValue(code.slice(i, j + 1));\n        out.push('_D(\"' + xorEncrypt(val, key) + '\")');\n        i = j + 1;\n      } else { out.push(code[i]); i++; }\n    } else { out.push(code[i]); i++; }\n  }\n  return out.join('');\n}\n\nfunction stripComments(s: string): string {\n  return s.replace(/^\\s*\\/\\/.*$/gm, '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\n{3,}/g, '\\n\\n');\n}\n\nfunction escapeClosingTags(code: string): string {\n  return code.replace(/<\\/(script|style)/gi, '<\\\\/$1');\n}\n\nfunction fixComputedProperties(code: string): string {\n  return code.replace(/([{,])(\\s*)_D\\(\"([^\"]*)\"\\)(\\s*:)/g, '$1$2[_D(\"$3\")]$4');\n}\n\nfunction deriveKey(seed: string): string {\n  return crypto.createHash('sha256').update(seed + 'sg_val_v1').digest('hex').slice(0, 32);\n}\n\nfunction seededRng(seed: string): () => number {\n  let s = hash(seed + '_shuffle');\n  return function () {\n    s = (s * 1103515245 + 12345) & 0x7fffffff;\n    return s / 0x7fffffff;\n  };\n}\n\nfunction shuffleCode(code: string, seed: string): string {\n  const lines = code.split('\\n');\n  const depth = new Array(lines.length).fill(0) as number[];\n  let d = 0;\n  for (let i = 0; i < lines.length; i++) {\n    depth[i] = d;\n    for (const ch of lines[i]) {\n      if (ch === '{') d++;\n      else if (ch === '}') d--;\n    }\n  }\n  const blocks: Array<{ start: number; end: number }> = [];\n  let start: number | null = null;\n  for (let i = 0; i < lines.length; i++) {\n    const isShuffleable = depth[i] === 1 && /^\\s*R\\.\\w+\\s*=/.test(lines[i]) && !/[{}]/.test(lines[i]) && lines[i].trimEnd().endsWith(';');\n    if (isShuffleable && start === null) start = i;\n    if (!isShuffleable && start !== null) {\n      blocks.push({ start, end: i - 1 });\n      start = null;\n    }\n  }\n  if (start !== null) blocks.push({ start, end: lines.length - 1 });\n  const rng = seededRng(seed);\n  for (const blk of blocks) {\n    const slice = lines.slice(blk.start, blk.end + 1);\n    for (let i = slice.length - 1; i > 0; i--) {\n      const j = Math.floor(rng() * (i + 1));\n      [slice[i], slice[j]] = [slice[j], slice[i]];\n    }\n    lines.splice(blk.start, slice.length, ...slice);\n  }\n  return lines.join('\\n');\n}\n\nfunction renameFunctions(code: string, seed: string): string {\n  let r = code;\n  const names = Object.entries(RENAMES).sort((a, b) => { const ha = hash(a[0] + seed), hb = hash(b[0] + seed); return ha < hb ? -1 : ha > hb ? 1 : 0; });\n  for (const [from, to] of names) {\n    const suffix = (hash(from + seed) % 9000 + 1000).toString(36);\n    const newName = to + suffix;\n    r = r.replace(new RegExp('\\\\b' + from + '\\\\(', 'g'), newName + '(');\n  }\n  return r;\n}\n\nfunction injectDecoder(hexKey: string): string {\n  const kb = hexToBytes(hexKey);\n  const ks = kb.map((b) => '\\\\x' + b.toString(16).padStart(2, '0')).join('');\n  return 'var _D=function(h){var k=\"' + ks + '\",r=\"\";for(var i=0;i<h.length;i+=2){r+=String.fromCharCode(parseInt(h.substr(i,2),16)^k.charCodeAt((i/2)%' + kb.length + '))}return r};';\n}\n\nfunction removeFunction(code: string, name: string): string {\n  const regex = new RegExp('function\\\\s+' + name + '\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[^{}]*\\\\}', 'g');\n  let r = code.replace(regex, '');\n  const multiRegex = new RegExp('function\\\\s+' + name + '\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[^}]*\\\\{[^}]*\\\\}[^}]*\\\\}', 'g');\n  r = r.replace(multiRegex, '');\n  return r;\n}\n\nexport function stripTrace(code: string): string {\n  let r = code;\n  // Remove function definitions FIRST (before calls, to avoid the call-removal\n  // regex eating the function name+params inside the definition).\n  // _sgLogCP has nested braces, _sgErr is single-brace.\n  r = removeFunction(r, '_sgLogCP');\n  r = removeFunction(r, '_sgErr');\n  // Remove calls\n  r = r.replace(/_sgLogCP\\(\\s*\\d+\\s*\\)\\s*[;,]?/g, '');\n  r = r.replace(/_sgErr\\(\\s*(['\"][^'\"]*['\"]|[A-Za-z_$][\\w$]*)\\s*,\\s*(['\"][^'\"]*['\"]|[A-Za-z_$][\\w$]*)\\s*\\)\\s*[;,]?/g, '');\n  // Remove declarations\n  r = r.replace(/var\\s+_SG_TRACE\\s*=\\s*(?:true|false)\\s*;\\s*/g, '');\n  r = r.replace(/var\\s+_sgCP\\s*=\\s*[^;]*;\\s*/g, '');\n  // Remove any leftover empty semicolons\n  r = r.replace(/;\\s*;/g, ';');\n  return r;\n}\n\nexport function applyObfuscation(code: string, seed: string): string {\n  let r = stripComments(code);\n  r = stripTrace(r);\n  r = renameFunctions(r, seed);\n  r = shuffleCode(r, seed);\n  const encKey = deriveKey(seed);\n  r = encryptStrings(r, encKey);\n  r = r.replace(/^\\s*\\(function\\(\\)\\{/, (m: string) => m + injectDecoder(encKey));\n  r = escapeClosingTags(r);\n  r = fixComputedProperties(r);\n  return r;\n}\n"],"mappings":"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","names":["crypto"]}