{"version":3,"sources":["../../../../src/classes/ribbon/codecs/teto-pack.ts"],"sourcesContent":["import { version } from \"../../../utils\";\nimport { basic } from \"../../../utils/api/basic\";\nimport { type Server } from \"../../../utils/api/server\";\n\nimport fsSync from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nimport chalk from \"chalk\";\n\nlet Amadeus: Awaited<ReturnType<typeof tetoPack>> | null = null;\n\nconst log = (\n  msg: string,\n  { level = \"info\" }: { level: \"info\" | \"warning\" | \"error\" } = {\n    level: \"info\"\n  }\n) => {\n  const func =\n    level === \"info\"\n      ? chalk.blue\n      : level === \"warning\"\n        ? chalk.yellow\n        : chalk.red;\n  console.log(`${func(\"[🎀\\u2009Ribbon]\")}: ${msg}`);\n};\n\nconst extractPacker = (text: string) => {\n  const trace = (\n    text: string,\n    start: number,\n    openStr = \"{\",\n    closeStr = \"}\"\n  ) => {\n    let i = start;\n    let brace = 1;\n    while (brace > 0 && i < text.length) {\n      if (text[i] === openStr) brace++;\n      if (text[i] === closeStr) brace--;\n      i++;\n    }\n    return i;\n  };\n\n  let libraries = text.slice(\n    \"(() => {\\n\".length,\n    text.indexOf('(function(){\"use strict\";')\n  );\n\n  const bufferStart = libraries.indexOf(\"e=function(){\");\n  const bufferEnd =\n    trace(libraries, bufferStart + \"e=function(){\".length) + \"()\".length;\n  libraries =\n    libraries.slice(0, bufferStart) + \"e=Buffer\" + libraries.slice(bufferEnd);\n\n  const pixiStart = libraries.search(\n    /[A-Za-z]{1}=function\\([A-Za-z]{1}\\)\\{\"use strict\";var [A-Za-z]{1}=setTimeout;/\n  );\n  let pixiEnd = trace(\n    libraries,\n    trace(libraries, pixiStart + \"e=(function(t){\".length) +\n      '({}),s=function(t,e,r,n,i,o,s,a){\"use strict\";'.length\n  );\n  pixiEnd = libraries.indexOf(\";\", pixiEnd);\n  libraries =\n    libraries.slice(0, pixiStart - 1) +\n    libraries.slice(pixiEnd) +\n    \"/*LIBRARY_CUTOFF*/\";\n  libraries = libraries.replace(\"o.filters\", \"{}\");\n  const assignIndex = libraries.search(/Object\\.assign\\(\\{\\},[A-Za-z]\\);/);\n  libraries =\n    libraries.slice(0, assignIndex) +\n    libraries.slice(assignIndex + \"Object.assign({},s);\".length);\n\n  const mainStart = text.search(\n    /class\\s+[A-Za-z]{2}\\s+extends\\s+[A-Za-z]\\{static\\s+OptionsList/\n  );\n\n  const parentName = text.slice(\n    mainStart + \"class ge extends \".length,\n    mainStart + \"class ge extends \".length + 1\n  );\n\n  const parentStart = text.search(\n    new RegExp(\n      `class ${parentName}\\\\{constructor\\\\((.)\\\\)\\\\{this\\\\.self=\\\\1\\\\}`\n    )\n  );\n  const parentEnd = trace(text, parentStart + \"class k{\".length);\n  const parentBody = text.slice(parentStart, parentEnd);\n\n  const zenithStaticStart = text.search(\n    new RegExp(\n      `class [A-Za-z]{2} extends ${parentName}\\\\{\\\\s*static FloorDistance`\n    )\n  );\n  const zenithStaticEnd = text.indexOf(\n    \"static GetSpeedCap(\",\n    zenithStaticStart\n  );\n  const zenithStaticBody = text.slice(zenithStaticStart, zenithStaticEnd) + \"}\";\n\n  const bagStart = text.search(\n    new RegExp(`class [A-Za-z]{1} extends ${parentName}\\\\{\\\\s*static BagList`)\n  );\n\n  const bagEnd = trace(text, bagStart + \"class F extends k{\".length);\n  let bagBody = text.slice(bagStart, bagEnd);\n  bagBody = bagBody.slice(0, bagBody.indexOf(\"];\") + 2) + \"}\";\n\n  const counterStart = text.search(\n    new RegExp(\n      `class [A-Za-z]{1} extends ${parentName}\\\\{\\\\s*static DisplayCounters`\n    )\n  );\n  const counterEnd = trace(text, counterStart + \"class O extends k{\".length);\n  let counterBody = text.slice(counterStart, counterEnd);\n  const counterEndStr = \"Object.keys(this.DisplayCounters);\";\n  counterBody =\n    counterBody.slice(\n      0,\n      counterBody.indexOf(counterEndStr) + counterEndStr.length\n    ) + \"}\";\n\n  const engineStart = text.search(\n    new RegExp(\n      `class [A-Za-z]{1} extends ${parentName}\\\\{\\\\s*static init\\\\(\\\\)\\\\{this\\\\.ROTATION_LEFT=1`\n    )\n  );\n  const engineName = text.slice(\n    engineStart + \"class \".length,\n    engineStart + \"class \".length + 1\n  );\n  const engineEnd = trace(\n    text,\n    engineStart + \"class H extends k{static init(){\".length\n  );\n  const engineBody =\n    text.slice(engineStart, engineEnd) + \"}\" + engineName + \".init();\";\n\n  const constantsStart = text.indexOf(\"={minotypes:\") - 7;\n  const constantsEnd = trace(\n    text,\n    constantsStart + \"const w={minotypes:\".length\n  );\n  const constantsBody = text.slice(constantsStart, constantsEnd) + \";\";\n\n  const cacheBody = `function b(e){const t=Object.prototype.toString.call(e);return b.cached[t]?b.cached[t]:(b.cached[t] = t.substring(8, t.length - 1).toLowerCase());}b.cached={};`;\n\n  const versionString = \"version:{default:\";\n  const versionStart = text.indexOf(versionString, mainStart);\n  const versionVar =\n    \"const \" +\n    text.slice(\n      versionStart + versionString.length,\n      versionStart + versionString.length + 1\n    ) +\n    \"=11;\";\n  const version2String = 'gameModes:{\"40l\":{version:';\n  const version2Start = text.indexOf(version2String);\n  const version2Var =\n    \"const \" +\n    text.slice(\n      version2Start + version2String.length,\n      version2Start + version2String.length + 1\n    ) +\n    \"=19;\";\n\n  const spinRulesStart = text.indexOf(\".SpinRules=[\") - 2;\n  const spinRulesName = text.slice(spinRulesStart, spinRulesStart + 2);\n  const spinRulesBody =\n    \"class \" +\n    spinRulesName +\n    \"{}\" +\n    text.slice(spinRulesStart, text.indexOf(\"];\", spinRulesStart) + 2);\n\n  // search for the start of obfuscation\n  text = text.slice(mainStart).trim();\n\n  // const internalName = text.slice(text.indexOf(\"return\") + 7, text.indexOf(\"return\") + 9);\n  // const functionStart = text.indexOf(\"function \" + internalName);\n  // const functionEnd = trace(text, functionStart + \"function Te(e, t){\".length);\n  // const functionBody = text\n  //   .slice(functionStart, functionEnd)\n  //   .replaceAll(\"\\n\", \"\")\n  //   .replaceAll(\"  \", \"\")\n  //   .replaceAll(\" = \", \"=\")\n  //   .replace(\" () \", \"()\");\n  // const dictName = functionBody.slice(\n  //   functionBody.indexOf(\"const \") + 8,\n  //   functionBody.indexOf(\"const \") + 10\n  // );\n\n  // const dictStart = text.indexOf(\"function \" + dictName + \"() {\");\n  // const dictEnd = trace(text, dictStart + (\"function \" + dictName + \"() {\").length);\n  // const dictBody = text\n  //   .slice(dictStart, dictEnd)\n  //   .replaceAll(\"\\n\", \"\")\n  //   .replaceAll(\"  \", \"\")\n  //   .replaceAll(\" = \", \"=\");\n\n  const obfuscationEnd = text.search(/class\\s[a-z]{2}{/);\n\n  const classNameStart = text.search(/const\\s+(\\S{2})=new\\s+class/);\n\n  const className = text.slice(classNameStart + 6, classNameStart + 8);\n\n  // let deobfuscator =\n  //   dictBody +\n  //   \"\\n\" +\n  //   functionBody +\n  //   \"\\n\" +\n  //   text.slice(0, functionStart) +\n  //   text.slice(functionEnd, dictStart) +\n  //   text.slice(dictEnd, obfuscationEnd);\n  return (\n    `(() => { ` +\n    libraries +\n    parentBody +\n    versionVar +\n    version2Var +\n    zenithStaticBody +\n    bagBody +\n    counterBody +\n    cacheBody +\n    constantsBody +\n    spinRulesBody +\n    engineBody +\n    text.slice(0, obfuscationEnd) +\n    `return ${className}})();`\n  );\n};\nexport const tetoPack = (\n  userAgent: string,\n  options: {\n    global: boolean;\n  } = { global: false }\n): Promise<{\n  encode: (msg: string, data?: any) => Buffer;\n  decode: (data: Buffer) => any;\n}> => {\n  if (Amadeus && options.global) return Promise.resolve(Amadeus);\n\n  return new Promise(async (resolve) => {\n    const serverVersion = await basic({\n      userAgent,\n      token: \"\",\n      turnstile: null\n    }).get<Server.Environment>({\n      uri: \"server/environment\"\n    });\n    if (serverVersion.success === false) {\n      throw new Error(serverVersion.error.msg);\n    }\n\n    const triangleDir = path.join(homedir(), \".trianglejs\");\n    const fileName = `tetrio-${version}-${serverVersion.signature.client.build.id}.js`;\n\n    let tetrioOverride: string;\n    try {\n      tetrioOverride = await fs.readFile(\n        path.join(triangleDir, fileName),\n        \"utf-8\"\n      );\n    } catch {\n      log(\"TETR.IO update found. Extracting new packer...\", {\n        level: \"warning\"\n      });\n      if (!fsSync.existsSync(triangleDir)) {\n        await fs.mkdir(triangleDir, { recursive: true });\n      }\n\n      // empty triangle folder\n      const files = await fs.readdir(triangleDir);\n      for (const file of files) {\n        await fs.rm(path.join(triangleDir, file), {\n          recursive: true,\n          force: true\n        });\n      }\n\n      const response = await fetch(\"https://tetr.io/js/tetrio.js\");\n      const buffer = Buffer.from(await response.arrayBuffer());\n      tetrioOverride = buffer.toString();\n\n      tetrioOverride = extractPacker(tetrioOverride);\n      await fs.writeFile(path.join(triangleDir, fileName), tetrioOverride);\n\n      log(\n        `tetrio.js @${serverVersion.signature.version}-${serverVersion.signature.client.build.id} patched`\n      );\n    }\n\n    const tetrio = (0, eval)(tetrioOverride);\n\n    Amadeus = {\n      encode: (msg: string, data?: any) => {\n        const encoded: number[] = tetrio.Encode(msg, data).toJSON().data;\n        return Buffer.from([...encoded]);\n      },\n      decode: (data: Buffer) => {\n        const decoded = tetrio.Decode(data);\n        if (decoded.command === \"packets\") {\n          decoded.data.packets = decoded.data.packets.map((packet: any) =>\n            Buffer.from([...packet])\n          );\n        }\n        return decoded;\n      }\n    };\n    resolve(Amadeus);\n  });\n};\n"],"names":["version","basic","fsSync","fs","homedir","path","chalk","Amadeus","log","msg","level","func","blue","yellow","red","console","extractPacker","text","trace","start","openStr","closeStr","i","brace","length","libraries","slice","indexOf","bufferStart","bufferEnd","pixiStart","search","pixiEnd","replace","assignIndex","mainStart","parentName","parentStart","RegExp","parentEnd","parentBody","zenithStaticStart","zenithStaticEnd","zenithStaticBody","bagStart","bagEnd","bagBody","counterStart","counterEnd","counterBody","counterEndStr","engineStart","engineName","engineEnd","engineBody","constantsStart","constantsEnd","constantsBody","cacheBody","versionString","versionStart","versionVar","version2String","version2Start","version2Var","spinRulesStart","spinRulesName","spinRulesBody","trim","obfuscationEnd","classNameStart","className","tetoPack","userAgent","options","global","Promise","resolve","serverVersion","token","turnstile","get","uri","success","Error","error","triangleDir","join","fileName","signature","client","build","id","tetrioOverride","readFile","existsSync","mkdir","recursive","files","readdir","file","rm","force","response","fetch","buffer","Buffer","from","arrayBuffer","toString","writeFile","tetrio","eval","encode","data","encoded","Encode","toJSON","decode","decoded","Decode","command","packets","map","packet"],"mappings":"AAAA,SAASA,OAAO,QAAQ,iBAAiB;AACzC,SAASC,KAAK,QAAQ,2BAA2B;AAGjD,OAAOC,YAAY,UAAU;AAC7B,OAAOC,QAAQ,mBAAmB;AAClC,SAASC,OAAO,QAAQ,UAAU;AAClC,OAAOC,UAAU,YAAY;AAE7B,OAAOC,WAAW,QAAQ;AAE1B,IAAIC,UAAuD;AAE3D,MAAMC,MAAM,CACVC,KACA,EAAEC,QAAQ,MAAM,EAA2C,GAAG;IAC5DA,OAAO;AACT,CAAC;IAED,MAAMC,OACJD,UAAU,SACNJ,MAAMM,IAAI,GACVF,UAAU,YACRJ,MAAMO,MAAM,GACZP,MAAMQ,GAAG;IACjBC,QAAQP,GAAG,CAAC,GAAGG,KAAK,oBAAoB,EAAE,EAAEF,KAAK;AACnD;AAEA,MAAMO,gBAAgB,CAACC;IACrB,MAAMC,QAAQ,CACZD,MACAE,OACAC,UAAU,GAAG,EACbC,WAAW,GAAG;QAEd,IAAIC,IAAIH;QACR,IAAII,QAAQ;QACZ,MAAOA,QAAQ,KAAKD,IAAIL,KAAKO,MAAM,CAAE;YACnC,IAAIP,IAAI,CAACK,EAAE,KAAKF,SAASG;YACzB,IAAIN,IAAI,CAACK,EAAE,KAAKD,UAAUE;YAC1BD;QACF;QACA,OAAOA;IACT;IAEA,IAAIG,YAAYR,KAAKS,KAAK,CACxB,aAAaF,MAAM,EACnBP,KAAKU,OAAO,CAAC;IAGf,MAAMC,cAAcH,UAAUE,OAAO,CAAC;IACtC,MAAME,YACJX,MAAMO,WAAWG,cAAc,gBAAgBJ,MAAM,IAAI,KAAKA,MAAM;IACtEC,YACEA,UAAUC,KAAK,CAAC,GAAGE,eAAe,aAAaH,UAAUC,KAAK,CAACG;IAEjE,MAAMC,YAAYL,UAAUM,MAAM,CAChC;IAEF,IAAIC,UAAUd,MACZO,WACAP,MAAMO,WAAWK,YAAY,kBAAkBN,MAAM,IACnD,iDAAiDA,MAAM;IAE3DQ,UAAUP,UAAUE,OAAO,CAAC,KAAKK;IACjCP,YACEA,UAAUC,KAAK,CAAC,GAAGI,YAAY,KAC/BL,UAAUC,KAAK,CAACM,WAChB;IACFP,YAAYA,UAAUQ,OAAO,CAAC,aAAa;IAC3C,MAAMC,cAAcT,UAAUM,MAAM,CAAC;IACrCN,YACEA,UAAUC,KAAK,CAAC,GAAGQ,eACnBT,UAAUC,KAAK,CAACQ,cAAc,uBAAuBV,MAAM;IAE7D,MAAMW,YAAYlB,KAAKc,MAAM,CAC3B;IAGF,MAAMK,aAAanB,KAAKS,KAAK,CAC3BS,YAAY,oBAAoBX,MAAM,EACtCW,YAAY,oBAAoBX,MAAM,GAAG;IAG3C,MAAMa,cAAcpB,KAAKc,MAAM,CAC7B,IAAIO,OACF,CAAC,MAAM,EAAEF,WAAW,4CAA4C,CAAC;IAGrE,MAAMG,YAAYrB,MAAMD,MAAMoB,cAAc,WAAWb,MAAM;IAC7D,MAAMgB,aAAavB,KAAKS,KAAK,CAACW,aAAaE;IAE3C,MAAME,oBAAoBxB,KAAKc,MAAM,CACnC,IAAIO,OACF,CAAC,0BAA0B,EAAEF,WAAW,2BAA2B,CAAC;IAGxE,MAAMM,kBAAkBzB,KAAKU,OAAO,CAClC,uBACAc;IAEF,MAAME,mBAAmB1B,KAAKS,KAAK,CAACe,mBAAmBC,mBAAmB;IAE1E,MAAME,WAAW3B,KAAKc,MAAM,CAC1B,IAAIO,OAAO,CAAC,0BAA0B,EAAEF,WAAW,qBAAqB,CAAC;IAG3E,MAAMS,SAAS3B,MAAMD,MAAM2B,WAAW,qBAAqBpB,MAAM;IACjE,IAAIsB,UAAU7B,KAAKS,KAAK,CAACkB,UAAUC;IACnCC,UAAUA,QAAQpB,KAAK,CAAC,GAAGoB,QAAQnB,OAAO,CAAC,QAAQ,KAAK;IAExD,MAAMoB,eAAe9B,KAAKc,MAAM,CAC9B,IAAIO,OACF,CAAC,0BAA0B,EAAEF,WAAW,6BAA6B,CAAC;IAG1E,MAAMY,aAAa9B,MAAMD,MAAM8B,eAAe,qBAAqBvB,MAAM;IACzE,IAAIyB,cAAchC,KAAKS,KAAK,CAACqB,cAAcC;IAC3C,MAAME,gBAAgB;IACtBD,cACEA,YAAYvB,KAAK,CACf,GACAuB,YAAYtB,OAAO,CAACuB,iBAAiBA,cAAc1B,MAAM,IACvD;IAEN,MAAM2B,cAAclC,KAAKc,MAAM,CAC7B,IAAIO,OACF,CAAC,0BAA0B,EAAEF,WAAW,iDAAiD,CAAC;IAG9F,MAAMgB,aAAanC,KAAKS,KAAK,CAC3ByB,cAAc,SAAS3B,MAAM,EAC7B2B,cAAc,SAAS3B,MAAM,GAAG;IAElC,MAAM6B,YAAYnC,MAChBD,MACAkC,cAAc,mCAAmC3B,MAAM;IAEzD,MAAM8B,aACJrC,KAAKS,KAAK,CAACyB,aAAaE,aAAa,MAAMD,aAAa;IAE1D,MAAMG,iBAAiBtC,KAAKU,OAAO,CAAC,kBAAkB;IACtD,MAAM6B,eAAetC,MACnBD,MACAsC,iBAAiB,sBAAsB/B,MAAM;IAE/C,MAAMiC,gBAAgBxC,KAAKS,KAAK,CAAC6B,gBAAgBC,gBAAgB;IAEjE,MAAME,YAAY,CAAC,+JAA+J,CAAC;IAEnL,MAAMC,gBAAgB;IACtB,MAAMC,eAAe3C,KAAKU,OAAO,CAACgC,eAAexB;IACjD,MAAM0B,aACJ,WACA5C,KAAKS,KAAK,CACRkC,eAAeD,cAAcnC,MAAM,EACnCoC,eAAeD,cAAcnC,MAAM,GAAG,KAExC;IACF,MAAMsC,iBAAiB;IACvB,MAAMC,gBAAgB9C,KAAKU,OAAO,CAACmC;IACnC,MAAME,cACJ,WACA/C,KAAKS,KAAK,CACRqC,gBAAgBD,eAAetC,MAAM,EACrCuC,gBAAgBD,eAAetC,MAAM,GAAG,KAE1C;IAEF,MAAMyC,iBAAiBhD,KAAKU,OAAO,CAAC,kBAAkB;IACtD,MAAMuC,gBAAgBjD,KAAKS,KAAK,CAACuC,gBAAgBA,iBAAiB;IAClE,MAAME,gBACJ,WACAD,gBACA,OACAjD,KAAKS,KAAK,CAACuC,gBAAgBhD,KAAKU,OAAO,CAAC,MAAMsC,kBAAkB;IAElE,sCAAsC;IACtChD,OAAOA,KAAKS,KAAK,CAACS,WAAWiC,IAAI;IAEjC,2FAA2F;IAC3F,kEAAkE;IAClE,gFAAgF;IAChF,4BAA4B;IAC5B,uCAAuC;IACvC,0BAA0B;IAC1B,0BAA0B;IAC1B,4BAA4B;IAC5B,4BAA4B;IAC5B,uCAAuC;IACvC,wCAAwC;IACxC,wCAAwC;IACxC,KAAK;IAEL,mEAAmE;IACnE,qFAAqF;IACrF,wBAAwB;IACxB,+BAA+B;IAC/B,0BAA0B;IAC1B,0BAA0B;IAC1B,6BAA6B;IAE7B,MAAMC,iBAAiBpD,KAAKc,MAAM,CAAC;IAEnC,MAAMuC,iBAAiBrD,KAAKc,MAAM,CAAC;IAEnC,MAAMwC,YAAYtD,KAAKS,KAAK,CAAC4C,iBAAiB,GAAGA,iBAAiB;IAElE,qBAAqB;IACrB,eAAe;IACf,WAAW;IACX,mBAAmB;IACnB,WAAW;IACX,mCAAmC;IACnC,yCAAyC;IACzC,yCAAyC;IACzC,OACE,CAAC,SAAS,CAAC,GACX7C,YACAe,aACAqB,aACAG,cACArB,mBACAG,UACAG,cACAS,YACAD,gBACAU,gBACAb,aACArC,KAAKS,KAAK,CAAC,GAAG2C,kBACd,CAAC,OAAO,EAAEE,UAAU,KAAK,CAAC;AAE9B;AACA,OAAO,MAAMC,WAAW,CACtBC,WACAC,UAEI;IAAEC,QAAQ;AAAM,CAAC;IAKrB,IAAIpE,WAAWmE,QAAQC,MAAM,EAAE,OAAOC,QAAQC,OAAO,CAACtE;IAEtD,OAAO,IAAIqE,QAAQ,OAAOC;QACxB,MAAMC,gBAAgB,MAAM7E,MAAM;YAChCwE;YACAM,OAAO;YACPC,WAAW;QACb,GAAGC,GAAG,CAAqB;YACzBC,KAAK;QACP;QACA,IAAIJ,cAAcK,OAAO,KAAK,OAAO;YACnC,MAAM,IAAIC,MAAMN,cAAcO,KAAK,CAAC5E,GAAG;QACzC;QAEA,MAAM6E,cAAcjF,KAAKkF,IAAI,CAACnF,WAAW;QACzC,MAAMoF,WAAW,CAAC,OAAO,EAAExF,QAAQ,CAAC,EAAE8E,cAAcW,SAAS,CAACC,MAAM,CAACC,KAAK,CAACC,EAAE,CAAC,GAAG,CAAC;QAElF,IAAIC;QACJ,IAAI;YACFA,iBAAiB,MAAM1F,GAAG2F,QAAQ,CAChCzF,KAAKkF,IAAI,CAACD,aAAaE,WACvB;QAEJ,EAAE,OAAM;YACNhF,IAAI,kDAAkD;gBACpDE,OAAO;YACT;YACA,IAAI,CAACR,OAAO6F,UAAU,CAACT,cAAc;gBACnC,MAAMnF,GAAG6F,KAAK,CAACV,aAAa;oBAAEW,WAAW;gBAAK;YAChD;YAEA,wBAAwB;YACxB,MAAMC,QAAQ,MAAM/F,GAAGgG,OAAO,CAACb;YAC/B,KAAK,MAAMc,QAAQF,MAAO;gBACxB,MAAM/F,GAAGkG,EAAE,CAAChG,KAAKkF,IAAI,CAACD,aAAac,OAAO;oBACxCH,WAAW;oBACXK,OAAO;gBACT;YACF;YAEA,MAAMC,WAAW,MAAMC,MAAM;YAC7B,MAAMC,SAASC,OAAOC,IAAI,CAAC,MAAMJ,SAASK,WAAW;YACrDf,iBAAiBY,OAAOI,QAAQ;YAEhChB,iBAAiB7E,cAAc6E;YAC/B,MAAM1F,GAAG2G,SAAS,CAACzG,KAAKkF,IAAI,CAACD,aAAaE,WAAWK;YAErDrF,IACE,CAAC,WAAW,EAAEsE,cAAcW,SAAS,CAACzF,OAAO,CAAC,CAAC,EAAE8E,cAAcW,SAAS,CAACC,MAAM,CAACC,KAAK,CAACC,EAAE,CAAC,QAAQ,CAAC;QAEtG;QAEA,MAAMmB,SAAS,AAAC,CAAA,GAAGC,IAAG,EAAGnB;QAEzBtF,UAAU;YACR0G,QAAQ,CAACxG,KAAayG;gBACpB,MAAMC,UAAoBJ,OAAOK,MAAM,CAAC3G,KAAKyG,MAAMG,MAAM,GAAGH,IAAI;gBAChE,OAAOR,OAAOC,IAAI,CAAC;uBAAIQ;iBAAQ;YACjC;YACAG,QAAQ,CAACJ;gBACP,MAAMK,UAAUR,OAAOS,MAAM,CAACN;gBAC9B,IAAIK,QAAQE,OAAO,KAAK,WAAW;oBACjCF,QAAQL,IAAI,CAACQ,OAAO,GAAGH,QAAQL,IAAI,CAACQ,OAAO,CAACC,GAAG,CAAC,CAACC,SAC/ClB,OAAOC,IAAI,CAAC;+BAAIiB;yBAAO;gBAE3B;gBACA,OAAOL;YACT;QACF;QACA1C,QAAQtE;IACV;AACF,EAAE"}