{"version":3,"file":"filesystem-BevZz_b4.cjs","sources":["../src/utils.ts","../src/fs/zip-archives.ts","../src/utils/publicPath.ts","../src/fs/filesystem.ts"],"sourcesContent":["// Portions of this file are Copyright 2021 Google LLC, and licensed under GPL2+. See COPYING.\n\nimport { Source } from \"./state/app-state.ts\";\n\nexport function mapObject(o: any, f: (key: string, value: any) => any, ifPred: (key: string) => boolean) {\n  const ret = [];\n  for (const key of Object.keys(o)) {\n    if (ifPred && !ifPred(key)) {\n      continue;\n    }\n    ret.push(f(key, o[key]));\n  }\n  return ret;\n}\n\ntype Killer = () => void;\nexport type AbortablePromise<T> = Promise<T> & {kill: Killer}\nexport function AbortablePromise<T>(f: (resolve: (result: T) => void, reject: (error: any) => void) => Killer): AbortablePromise<T>\n{\n  let kill: Killer;\n  const promise = new Promise<T>((res, rej) => {\n    kill = f(res, rej);\n  });\n  return Object.assign(promise, {kill: kill!});\n}\n\n// <T extends any[]>(...args: T)\nexport function turnIntoDelayableExecution<T extends any[], R>(\n    delay: number,\n    job: (...args: T) => AbortablePromise<R>) {\n  let pendingId: number | null;\n  let runningJobKillSignal: (() => void) | null;\n  // return AbortablePromise<SyntaxCheckOutput>((res, rej) => {\n  //   (async () => {\n  //     try {\n  //       const result = await job;\n  //       // console.log(result);\n\n  //       let parameterSet: ParameterSet | undefined = undefined;\n  //       if (result.outputs && result.outputs.length == 1) {\n  //         let [[, content]] = result.outputs;\n  //         content = new TextDecoder().decode(content as any);\n  //         try {\n  //           parameterSet = JSON.parse(content)\n  //           // console.log('PARAMETER SET', JSON.stringify(parameterSet, null, 2))\n  //         } catch (e) {\n  //           console.error(`Error while parsing parameter set: ${e}\\n${content}`);\n  //         }\n  //       } else {\n  //         console.error('No output from runner!');\n  //       }\n\n  //       res({\n  //         ...processMergedOutputs(result.mergedOutputs, {shiftSourceLines: {\n  //           sourcePath: sources[0].path,\n  //           skipLines: 1,\n  //         }}),\n  //         parameterSet,\n  //       });\n  //     } catch (e) {\n  //       console.error(e);\n  //       rej(e);\n  //     }\n  //   })()\n  //   return () => job.kill();\n  // });\n  //return (...args: T) => async ({now, callback}: {now: boolean, callback: (result?: R, error?: any) => void}) => {\n  return (...args: T) => ({now}: {now: boolean}) => AbortablePromise<R>((resolve, reject) => {\n    let abortablePromise: AbortablePromise<R> | undefined = undefined;\n    (async () => {\n      const doExecute = async () => {\n        if (runningJobKillSignal) {\n          runningJobKillSignal();\n          runningJobKillSignal = null;\n        }\n        abortablePromise = job(...args);\n        runningJobKillSignal = abortablePromise.kill;\n        try {\n          resolve(await abortablePromise);\n        } catch (e) {\n          reject(e);\n        } finally {\n          runningJobKillSignal = null;\n        }\n      }\n      if (pendingId) {\n        clearTimeout(pendingId);\n        pendingId = null;\n      }\n      if (now) {\n        doExecute();\n      } else {\n        pendingId = window.setTimeout(doExecute, delay);\n      }\n    })();\n    return () => abortablePromise?.kill();\n  });\n}\n\nexport function validateStringEnum<T extends string>(\n    s: T, values: T[],\n    orElse: (s: string) => T = s => { throw new Error(`Unexpected value: ${s} (valid values: ${values.join(', ')})`); }): T {\n  return values.indexOf(s) < 0 ? orElse(s) : s;\n}\nexport const validateBoolean = (s: boolean, orElse: () => boolean = () => false) => typeof s === 'boolean' ? s : orElse(); \nexport const validateString = (s: string, orElse: () => string = () => '') => s != null && typeof s === 'string' ? s : orElse();\nexport const validateArray = <T>(a: Array<T>, validateElement: (e: T) => T, orElse: () => T[] = () => []) => {\n  if (!(a instanceof Array)) return orElse();\n  return a.map(validateElement);\n};\n\nexport function formatBytes(n: number) {\n  if (n < 1024) {\n    return `${Math.floor(n)} bytes`;\n  }\n  n /= 1024;\n  if (n < 1024) {\n    return `${Math.floor(n * 10) / 10} kB`;\n  }\n  n /= 1024;\n  return `${Math.floor(n * 10) / 10} MB`;\n}\n\nexport function formatMillis(n: number) {\n  if (n < 1000)\n    return `${Math.floor(n)}ms`;\n\n  return `${Math.floor(n / 100) / 10}sec`;\n}\n\n// https://medium.com/quick-code/100vh-problem-with-ios-safari-92ab23c852a8\nexport function registerCustomAppHeightCSSProperty() {\n  const updateAppHeight = () => {\n    document.documentElement.style.setProperty('--app-height', `${window.innerHeight}px`)\n  }\n  window.addEventListener('resize', updateAppHeight)\n  updateAppHeight();\n}\n\n// In PWA mode, persist files in LocalStorage instead of the hash fragment.\nexport function isInStandaloneMode() {\n  return Boolean(('standalone' in window.navigator) && (window.navigator.standalone));\n}\n\nexport function downloadUrl(url: string, filename: string) {\n  const link = document.createElement('a');\n  link.href = url;\n  link.setAttribute('download', filename)\n  document.body.appendChild(link);\n  link.click();\n  link.parentNode?.removeChild(link);\n}\n\nexport async function fetchSource(fs: FS, {content, path, url}: Source): Promise<Uint8Array> {\n  const isText = path.endsWith('.scad') || path.endsWith('.json');\n  if (content) {\n    return new TextEncoder().encode(content);\n  } else if (url) {\n    if (isText) {\n      content = await (await fetch(url)).text();\n      return new TextEncoder().encode(content.replace(/\\r\\n/g, '\\n'));\n    } else {\n      // Fetch bytes\n      const response = await fetch(url);\n      const buffer = await response.arrayBuffer();\n      const data = new Uint8Array(buffer);\n      return data;\n    }\n  } else if (path) {\n    const data = fs.readFileSync(path);\n    return new Uint8Array('buffer' in data ? data.buffer : data);\n  } else {\n    throw new Error('Invalid source: ' + JSON.stringify({path, content, url}));\n  }\n}\n\nexport function readFileAsDataURL(file: File) {\n  // TO data URI:\n  return new Promise<string>((res, rej) => {\n    const reader = new FileReader();\n    reader.onloadend = () => {\n      res(reader.result as string);\n    }\n    reader.onerror = rej;\n    reader.readAsDataURL(file);\n  });\n  // return URL.createObjectURL(file);\n}","// Portions of this file are Copyright 2021 Google LLC, and licensed under GPL2+. See COPYING.\n\nimport { Symlinks } from \"./filesystem\";\n\nexport type ZipArchives = {\n  [name: string]: {\n    deployed?: boolean,\n    description?: string,\n    gitOrigin?: {\n      repoUrl: string,\n      branch: string,\n      include: {\n        glob: string | string[],\n        ignore?: string | string[],\n        replacePrefix?: {[path: string]: string},\n      }[]\n    }\n    symlinks?: Symlinks,\n    docs?: {[name: string]: string}\n  }\n};\n\nexport const zipArchives: ZipArchives = {\n  'fonts': {},\n  'openscad': {\n    description: 'OpenSCAD',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/openscad/openscad',\n      include: [{glob: ['examples/*.scad', 'LICENSE']}],\n    },\n    docs: {\n      'CheatSheet': 'https://openscad.org/cheatsheet/index.html',\n      'Documentation': 'https://openscad.org/documentation.html',\n    },\n  },\n  'MCAD': {\n    description: 'OpenSCAD Parametric CAD Library',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/openscad/MCAD',\n      include: [{glob: ['*.scad', 'bitmap/*.scad', 'LICENSE']}],\n    },\n  },\n  'BOSL': {\n    description: 'The Belfry OpenScad Library',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/revarbat/BOSL',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n  },\n  'BOSL2': {\n    description: 'The Belfry OpenScad Library, v2.0',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/BelfrySCAD/BOSL2',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n    docs: {\n      'CheatSheet': 'https://github.com/BelfrySCAD/BOSL2/wiki/CheatSheet',\n      'Wiki': 'https://github.com/BelfrySCAD/BOSL2/wiki',\n    },\n  },\n  'NopSCADlib': {\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/nophead/NopSCADlib',\n      include: [{\n        glob: '**/*.scad',\n        ignore: 'test/**',\n      }],\n    },\n  },\n  'boltsparts': {\n    description: 'OpenSCAD library for generating bolt/nut models',\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/boltsparts/boltsparts',\n      include: [{\n        glob: 'openscad/**/*.scad',\n        ignore: 'test/**',\n      }],\n    },\n    docs: {\n      'Usage': 'https://boltsparts.github.io/en/docs/0.3/document/openscad/usage.html',\n    },\n  },\n  'brailleSCAD': {\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/BelfrySCAD/brailleSCAD',\n      include: [{\n        glob: ['**/*.scad', 'LICENSE'],\n        ignore: 'test/**',\n      }],\n    },\n    docs: {\n      'Documentation': 'https://github.com/BelfrySCAD/brailleSCAD/wiki/TOC',\n    },\n  },\n  'FunctionalOpenSCAD': {\n    description: 'Implementing OpenSCAD in OpenSCAD',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/thehans/FunctionalOpenSCAD',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n  },\n  'OpenSCAD-Snippet': {\n    description: 'OpenSCAD Snippet Library',\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/AngeloNicoli/OpenSCAD-Snippet',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n    symlinks: {\n      'Asset_SCAD': 'Asset_SCAD',\n      'Import_Library.scad': 'Import_Library.scad',\n    },\n  },\n  'funcutils': {\n    description: 'OpenSCAD collection of functional programming utilities, making use of function-literals.',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/thehans/funcutils',\n      include: [{glob: '**/*.scad'}],\n    },\n  },\n  'smooth-prim': {\n    description: 'OpenSCAD smooth primitives library',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/rcolyer/smooth-prim',\n      include: [{glob: ['**/*.scad', 'LICENSE.txt']}],\n    },\n    symlinks: {'smooth_prim.scad': 'smooth_prim.scad'},\n  },\n  'closepoints': {\n    description: 'OpenSCAD ClosePoints Library',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/rcolyer/closepoints',\n      include: [{glob: ['**/*.scad', 'LICENSE.txt']}],\n    },\n    symlinks: {'closepoints.scad': 'closepoints.scad'},\n  },\n  'plot-function': {\n    description: 'OpenSCAD Function Plotting Library',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/colyer/plot-function',\n      include: [{glob: ['**/*.scad', 'LICENSE.txt']}],\n    },\n    symlinks: {'plot_function.scad': 'plot_function.scad'},\n  },\n  // 'threads': {\n  //   deployed: false,\n  //   gitOrigin: {\n  //     branch: 'master',\n  //     repoUrl: 'https://github.com/colyer/threads',\n  //     include: [{glob: ['**/*.scad', 'LICENSE.txt']}],\n  //   },\n  // },\n  'openscad-tray': {\n    description: 'OpenSCAD library to create rounded rectangular trays with optional subdividers.',\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/sofian/openscad-tray',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n    symlinks: {'tray.scad': 'tray.scad'},\n  },\n  'lasercut': {\n    description: 'Module for OpenSCAD, allowing 3D models to be created from 2D lasercut parts.',\n    gitOrigin: {\n      branch: 'master',\n      repoUrl: 'https://github.com/bmsleight/lasercut',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n    symlinks: {'lasercut.scad': 'lasercut.scad'},\n  },    \n  'YAPP_Box': {\n    description: 'Yet Another Parametric Projectbox Box',\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/mrWheel/YAPP_Box',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n  },\n  'Stemfie_OpenSCAD': {\n    description: 'OpenSCAD Stemfie Library',\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/Cantareus/Stemfie_OpenSCAD',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n  },\n  'UB.scad': {\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/UBaer21/UB.scad',\n      include: [{glob: ['libraries/*.scad', 'LICENSE', 'examples/UBexamples/*.scad'], replacePrefix: {\n        'libraries/': '',\n        'examples/UBexamples/': 'examples/',\n      }}],\n    },\n    symlinks: {\"ub.scad\": \"libraries/ub.scad\"}, // TODO change this after the replaces work\n  },\n  'pathbuilder': {\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/dinther/pathbuilder.git',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n  },\n  'openscad_attachable_text3d': {\n    gitOrigin: {\n      branch: 'main',\n      repoUrl: 'https://github.com/jon-gilbert/openscad_attachable_text3d.git',\n      include: [{glob: ['**/*.scad', 'LICENSE']}],\n    },\n  },\n};\n\nexport const deployedArchiveNames =\n  Object.entries(zipArchives)\n    .filter(([_, {deployed}]) => deployed == null || deployed)\n    .map(([n]) => n);\n","type GlobalWithBase = typeof globalThis & {\n  __OPENSCAD_BASE_URL__?: string;\n};\n\nfunction getGlobalBase(): string | undefined {\n  if (typeof globalThis === 'object' && globalThis) {\n    const maybeBase = (globalThis as GlobalWithBase).__OPENSCAD_BASE_URL__;\n    if (typeof maybeBase === 'string' && maybeBase.length > 0) {\n      return maybeBase;\n    }\n  }\n  return undefined;\n}\n\nfunction getImportMetaBase(): string | undefined {\n  if (typeof import.meta !== 'undefined' && (import.meta as any).env) {\n    const base = (import.meta as any).env.BASE_URL;\n    // Only return if it's a meaningful base path, not just \"/\"\n    if (typeof base === 'string' && base.length > 0 && base !== '/') {\n      return base;\n    }\n  }\n  return undefined;\n}\n\nfunction getDocumentBase(): string | undefined {\n  if (typeof document === 'undefined') {\n    return undefined;\n  }\n  const baseElement = document.querySelector('base');\n  const href = baseElement?.getAttribute('href');\n  if (href && href.length > 0) {\n    return href;\n  }\n  return undefined;\n}\n\n// For web worker context - derive base URL from worker's own location\nfunction getWorkerBase(): string | undefined {\n  // Check if we're in a worker context (no document, but self.location exists)\n  if (typeof document === 'undefined' && typeof self !== 'undefined' && self.location) {\n    const workerUrl = new URL(self.location.href);\n    let basePath = workerUrl.pathname.replace(/\\/[^/]*$/, '/'); // Remove filename\n    basePath = basePath.replace(/\\/assets\\/$/, '/'); // Remove /assets/ if present\n    return `${workerUrl.origin}${basePath}`;\n  }\n  return undefined;\n}\n\nfunction resolveBaseUrl(): string {\n  return getGlobalBase() ?? getImportMetaBase() ?? getWorkerBase() ?? getDocumentBase() ?? '/';\n}\n\nfunction trimTrailingSlash(value: string): string {\n  return value.endsWith('/') ? value.slice(0, -1) : value;\n}\n\nfunction trimLeadingSlash(value: string): string {\n  return value.startsWith('/') ? value.slice(1) : value;\n}\n\nexport function resolvePublicPath(path: string): string {\n  const baseUrl = resolveBaseUrl();\n  if (!path) return baseUrl;\n  \n  const normalizedPath = trimLeadingSlash(path);\n  \n  // If baseUrl is a full URL (from worker context), use URL constructor\n  if (baseUrl.startsWith('http://') || baseUrl.startsWith('https://')) {\n    return new URL(normalizedPath, baseUrl).toString();\n  }\n  \n  // Otherwise, simple string concatenation for path-based bases\n  const normalizedBase = baseUrl === '/' ? '' : trimTrailingSlash(baseUrl);\n  return `${normalizedBase}/${normalizedPath}`;\n}\n\nexport function resolveLibrariesAsset(path: string): string {\n  return resolvePublicPath(`libraries/${trimLeadingSlash(path)}`);\n}\n\n","// Portions of this file are Copyright 2021 Google LLC, and licensed under GPL2+. See COPYING.\n\nimport { deployedArchiveNames, zipArchives } from \"./zip-archives\";\nimport { resolveLibrariesAsset } from \"../utils/publicPath\";\n\ndeclare var BrowserFS: BrowserFSInterface\n\nexport type FSMounts = {\n  [n: string]: {fs: string, options: {zipData: Buffer}}\n}\n\nexport type Symlinks = {[alias: string]: string};\n\nexport const getParentDir = (path: string) => {\n  let d = path.split('/').slice(0, -1).join('/');\n  return d === '' ? (path.startsWith('/') ? '/' : '.') : d;\n} \n\nexport function join(a: string, b: string): string {\n  if (a === '.') return b;\n  if (a.endsWith('/')) return join(a.substring(0, a.length - 1), b);\n  return b === '.' ? a : `${a}/${b}`;\n}\n\nexport async function getBrowserFSLibrariesMounts(archiveNames: string[]) {\n  const Buffer = BrowserFS.BFSRequire('buffer').Buffer;\n  const fetchData = async (url: string) => (await fetch(url)).arrayBuffer();\n  const results: [string, ArrayBuffer][] =\n    await Promise.all(\n      archiveNames.map(async (n: string) => [n, await fetchData(resolveLibrariesAsset(`${n}.zip`))])\n    );\n  \n  const zipMounts: FSMounts = {};\n  for (const [n, zipData] of results) {\n    zipMounts[n] = {\n      fs: \"ZipFS\",\n      options: {\n        zipData: Buffer.from(zipData)\n      }\n    }\n  }\n  return zipMounts;\n}\n\nexport async function symlinkLibraries(archiveNames: string[], fs: FS, prefix='/libraries', cwd='/tmp') {\n  const createSymlink = async (target: string, source: string) => {\n    try {\n      await fs.symlink(target, source);\n    } catch (e) {\n      console.error(`symlink(${target}, ${source}) failed: `, e);\n    }\n  };\n\n  await Promise.all(archiveNames.map(n => (async () => {\n    if (!(n in zipArchives)) throw new Error(`Archive named ${n} invalid (valid ones: ${deployedArchiveNames.join(', ')})`);\n    const {symlinks} = (zipArchives)[n];\n    if (symlinks) {\n      for (const from in symlinks) {\n        const to = symlinks[from];\n        const target = to === '.' ? `${prefix}/${n}` : `${prefix}/${n}/${to}`;\n        const source = from.startsWith('/') ? from : `${cwd}/${from}`;\n        await createSymlink(target, source);\n      }\n    } else {\n      await createSymlink(`${prefix}/${n}`, `${cwd}/${n}`);\n    }\n  })()));\n}\n\nfunction configureAndInstallFS(windowOrSelf: Window, options: any) {\n  return new Promise(async (resolve, reject) => {\n    BrowserFS.install(windowOrSelf);\n    try {\n      BrowserFS.configure(options, function (e: any) {\n        if (e) reject(e);\n        else resolve(null);\n      });\n    } catch (e) {\n      console.error(e);\n      reject(e);\n    }\n  });\n}\n\nexport async function createEditorFS({prefix, allowPersistence}: {prefix: string, allowPersistence: boolean}): Promise<FS> {\n  const archiveNames = deployedArchiveNames;\n  const librariesMounts = await getBrowserFSLibrariesMounts(archiveNames);\n  const allMounts: FSMounts = {};\n  for (const n in librariesMounts) {\n    allMounts[`${prefix}${n}`] = librariesMounts[n];\n  }\n\n  await configureAndInstallFS(typeof window === 'object' && window || self, {\n    fs: \"OverlayFS\",\n    options: {\n      readable: {\n        fs: \"MountableFileSystem\",\n        options: {\n          ...allMounts,\n        }\n      },\n      writable: allowPersistence ? {\n        fs: \"LocalStorage\",\n      } : {\n        fs: \"InMemory\"\n      },\n    },\n  });\n\n  var fs = BrowserFS.BFSRequire('fs');\n\n  return fs;\n}\n"],"names":["mapObject","o","f","ifPred","ret","key","AbortablePromise","kill","promise","res","rej","turnIntoDelayableExecution","delay","job","pendingId","runningJobKillSignal","args","now","resolve","reject","abortablePromise","doExecute","e","formatBytes","n","formatMillis","registerCustomAppHeightCSSProperty","updateAppHeight","isInStandaloneMode","downloadUrl","url","filename","link","fetchSource","fs","content","path","isText","buffer","data","readFileAsDataURL","file","reader","zipArchives","deployedArchiveNames","_","deployed","getGlobalBase","maybeBase","getDocumentBase","href","getWorkerBase","workerUrl","basePath","resolveBaseUrl","trimTrailingSlash","value","trimLeadingSlash","resolvePublicPath","baseUrl","normalizedPath","resolveLibrariesAsset","getParentDir","d","join","a","b","getBrowserFSLibrariesMounts","archiveNames","Buffer","fetchData","results","zipMounts","zipData","symlinkLibraries","prefix","cwd","createSymlink","target","source","symlinks","from","to","configureAndInstallFS","windowOrSelf","options","createEditorFS","allowPersistence","librariesMounts","allMounts"],"mappings":"aAIO,SAASA,EAAUC,EAAQC,EAAqCC,EAAkC,CACvG,MAAMC,EAAM,CAAA,EACZ,UAAWC,KAAO,OAAO,KAAKJ,CAAC,EACzBE,GAAU,CAACA,EAAOE,CAAG,GAGzBD,EAAI,KAAKF,EAAEG,EAAKJ,EAAEI,CAAG,CAAC,CAAC,EAEzB,OAAOD,CACT,CAIO,SAASE,EAAoBJ,EACpC,CACE,IAAIK,EACJ,MAAMC,EAAU,IAAI,QAAW,CAACC,EAAKC,IAAQ,CAC3CH,EAAOL,EAAEO,EAAKC,CAAG,CACnB,CAAC,EACD,OAAO,OAAO,OAAOF,EAAS,CAAC,KAAAD,EAAY,CAC7C,CAGO,SAASI,EACZC,EACAC,EAA0C,CAC5C,IAAIC,EACAC,EAoCJ,MAAO,IAAIC,IAAY,CAAC,CAAC,IAAAC,KAAyBX,EAAoB,CAACY,EAASC,IAAW,CACzF,IAAIC,EACJ,OAAC,SAAY,CACX,MAAMC,EAAY,SAAY,CACxBN,IACFA,EAAA,EACAA,EAAuB,MAEzBK,EAAmBP,EAAI,GAAGG,CAAI,EAC9BD,EAAuBK,EAAiB,KACxC,GAAI,CACFF,EAAQ,MAAME,CAAgB,CAChC,OAASE,EAAG,CACVH,EAAOG,CAAC,CACV,QAAA,CACEP,EAAuB,IACzB,CACF,EACID,IACF,aAAaA,CAAS,EACtBA,EAAY,MAEVG,EACFI,EAAA,EAEAP,EAAY,OAAO,WAAWO,EAAWT,CAAK,CAElD,GAAA,EACO,IAAMQ,GAAkB,KAAA,CACjC,CAAC,CACH,CAcO,SAASG,EAAYC,EAAW,CACrC,OAAIA,EAAI,KACC,GAAG,KAAK,MAAMA,CAAC,CAAC,UAEzBA,GAAK,KACDA,EAAI,KACC,GAAG,KAAK,MAAMA,EAAI,EAAE,EAAI,EAAE,OAEnCA,GAAK,KACE,GAAG,KAAK,MAAMA,EAAI,EAAE,EAAI,EAAE,OACnC,CAEO,SAASC,EAAaD,EAAW,CACtC,OAAIA,EAAI,IACC,GAAG,KAAK,MAAMA,CAAC,CAAC,KAElB,GAAG,KAAK,MAAMA,EAAI,GAAG,EAAI,EAAE,KACpC,CAGO,SAASE,GAAqC,CACnD,MAAMC,EAAkB,IAAM,CAC5B,SAAS,gBAAgB,MAAM,YAAY,eAAgB,GAAG,OAAO,WAAW,IAAI,CACtF,EACA,OAAO,iBAAiB,SAAUA,CAAe,EACjDA,EAAA,CACF,CAGO,SAASC,GAAqB,CACnC,MAAO,GAAS,eAAgB,OAAO,WAAe,OAAO,UAAU,WACzE,CAEO,SAASC,EAAYC,EAAaC,EAAkB,CACzD,MAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOF,EACZE,EAAK,aAAa,WAAYD,CAAQ,EACtC,SAAS,KAAK,YAAYC,CAAI,EAC9BA,EAAK,MAAA,EACLA,EAAK,YAAY,YAAYA,CAAI,CACnC,CAEA,eAAsBC,EAAYC,EAAQ,CAAC,QAAAC,EAAS,KAAAC,EAAM,IAAAN,GAAmC,CAC3F,MAAMO,EAASD,EAAK,SAAS,OAAO,GAAKA,EAAK,SAAS,OAAO,EAC9D,GAAID,EACF,OAAO,IAAI,YAAA,EAAc,OAAOA,CAAO,KAC9BL,EAAK,CACd,GAAIO,EACF,OAAAF,EAAU,MAAO,MAAM,MAAML,CAAG,GAAG,KAAA,EAC5B,IAAI,cAAc,OAAOK,EAAQ,QAAQ,QAAS;AAAA,CAAI,CAAC,EACzD,CAGL,MAAMG,EAAS,MADE,MAAM,MAAMR,CAAG,GACF,YAAA,EAE9B,OADa,IAAI,WAAWQ,CAAM,CAEpC,CACF,SAAWF,EAAM,CACf,MAAMG,EAAOL,EAAG,aAAaE,CAAI,EACjC,OAAO,IAAI,WAAW,WAAYG,EAAOA,EAAK,OAASA,CAAI,CAC7D,KACE,OAAM,IAAI,MAAM,mBAAqB,KAAK,UAAU,CAAC,KAAAH,EAAM,QAAAD,EAAS,IAAAL,CAAA,CAAI,CAAC,CAE7E,CAEO,SAASU,EAAkBC,EAAY,CAE5C,OAAO,IAAI,QAAgB,CAAChC,EAAKC,IAAQ,CACvC,MAAMgC,EAAS,IAAI,WACnBA,EAAO,UAAY,IAAM,CACvBjC,EAAIiC,EAAO,MAAgB,CAC7B,EACAA,EAAO,QAAUhC,EACjBgC,EAAO,cAAcD,CAAI,CAC3B,CAAC,CAEH,CCrKO,MAAME,EAA2B,CACtC,MAAS,CAAA,EACT,SAAY,CACV,YAAa,WACb,UAAW,CACT,OAAQ,SACR,QAAS,uCACT,QAAS,CAAC,CAAC,KAAM,CAAC,kBAAmB,SAAS,EAAE,CAAA,EAElD,KAAM,CACJ,WAAc,6CACd,cAAiB,yCAAA,CACnB,EAEF,KAAQ,CACN,YAAa,kCACb,UAAW,CACT,OAAQ,SACR,QAAS,mCACT,QAAS,CAAC,CAAC,KAAM,CAAC,SAAU,gBAAiB,SAAS,CAAA,CAAE,CAAA,CAC1D,EAEF,KAAQ,CACN,YAAa,8BACb,UAAW,CACT,OAAQ,SACR,QAAS,mCACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,CAC5C,EAEF,MAAS,CACP,YAAa,oCACb,UAAW,CACT,OAAQ,SACR,QAAS,sCACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,EAE5C,KAAM,CACJ,WAAc,sDACd,KAAQ,0CAAA,CACV,EAEF,WAAc,CACZ,UAAW,CACT,OAAQ,SACR,QAAS,wCACT,QAAS,CAAC,CACR,KAAM,YACN,OAAQ,SAAA,CACT,CAAA,CACH,EAEF,WAAc,CACZ,YAAa,kDACb,UAAW,CACT,OAAQ,OACR,QAAS,2CACT,QAAS,CAAC,CACR,KAAM,qBACN,OAAQ,SAAA,CACT,CAAA,EAEH,KAAM,CACJ,MAAS,uEAAA,CACX,EAEF,YAAe,CACb,UAAW,CACT,OAAQ,OACR,QAAS,4CACT,QAAS,CAAC,CACR,KAAM,CAAC,YAAa,SAAS,EAC7B,OAAQ,SAAA,CACT,CAAA,EAEH,KAAM,CACJ,cAAiB,oDAAA,CACnB,EAEF,mBAAsB,CACpB,YAAa,oCACb,UAAW,CACT,OAAQ,SACR,QAAS,gDACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,CAC5C,EAEF,mBAAoB,CAClB,YAAa,2BACb,UAAW,CACT,OAAQ,OACR,QAAS,mDACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,EAE5C,SAAU,CACR,WAAc,aACd,sBAAuB,qBAAA,CACzB,EAEF,UAAa,CACX,YAAa,4FACb,UAAW,CACT,OAAQ,SACR,QAAS,uCACT,QAAS,CAAC,CAAC,KAAM,YAAY,CAAA,CAC/B,EAEF,cAAe,CACb,YAAa,qCACb,UAAW,CACT,OAAQ,SACR,QAAS,yCACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,aAAa,EAAE,CAAA,EAEhD,SAAU,CAAC,mBAAoB,kBAAA,CAAkB,EAEnD,YAAe,CACb,YAAa,+BACb,UAAW,CACT,OAAQ,SACR,QAAS,yCACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,aAAa,EAAE,CAAA,EAEhD,SAAU,CAAC,mBAAoB,kBAAA,CAAkB,EAEnD,gBAAiB,CACf,YAAa,qCACb,UAAW,CACT,OAAQ,SACR,QAAS,0CACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,aAAa,EAAE,CAAA,EAEhD,SAAU,CAAC,qBAAsB,oBAAA,CAAoB,EAUvD,gBAAiB,CACf,YAAa,kFACb,UAAW,CACT,OAAQ,OACR,QAAS,0CACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,EAE5C,SAAU,CAAC,YAAa,WAAA,CAAW,EAErC,SAAY,CACV,YAAa,gFACb,UAAW,CACT,OAAQ,SACR,QAAS,wCACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,EAE5C,SAAU,CAAC,gBAAiB,eAAA,CAAe,EAE7C,SAAY,CACV,YAAa,wCACb,UAAW,CACT,OAAQ,OACR,QAAS,sCACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,CAC5C,EAEF,iBAAoB,CAClB,YAAa,2BACb,UAAW,CACT,OAAQ,OACR,QAAS,gDACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,CAC5C,EAEF,UAAW,CACT,UAAW,CACT,OAAQ,OACR,QAAS,qCACT,QAAS,CAAC,CAAC,KAAM,CAAC,mBAAoB,UAAW,4BAA4B,EAAG,cAAe,CAC7F,aAAc,GACd,uBAAwB,WAAA,EACxB,CAAA,EAEJ,SAAU,CAAC,UAAW,mBAAA,CAAmB,EAE3C,YAAe,CACb,UAAW,CACT,OAAQ,OACR,QAAS,6CACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,CAC5C,EAEF,2BAA8B,CAC5B,UAAW,CACT,OAAQ,OACR,QAAS,gEACT,QAAS,CAAC,CAAC,KAAM,CAAC,YAAa,SAAS,EAAE,CAAA,CAC5C,CAEJ,EAEaC,EACX,OAAO,QAAQD,CAAW,EACvB,OAAO,CAAC,CAACE,EAAG,CAAC,SAAAC,CAAA,CAAS,IAAMA,GAAY,MAAQA,CAAQ,EACxD,IAAI,CAAC,CAACtB,CAAC,IAAMA,CAAC,EChOnB,SAASuB,GAAoC,CAC3C,GAAI,OAAO,YAAe,UAAY,WAAY,CAChD,MAAMC,EAAa,WAA8B,sBACjD,GAAI,OAAOA,GAAc,UAAYA,EAAU,OAAS,EACtD,OAAOA,CAEX,CAEF,CAaA,SAASC,GAAsC,CAC7C,GAAI,OAAO,SAAa,IACtB,OAGF,MAAMC,EADc,SAAS,cAAc,MAAM,GACvB,aAAa,MAAM,EAC7C,GAAIA,GAAQA,EAAK,OAAS,EACxB,OAAOA,CAGX,CAGA,SAASC,GAAoC,CAE3C,GAAI,OAAO,SAAa,KAAe,OAAO,KAAS,KAAe,KAAK,SAAU,CACnF,MAAMC,EAAY,IAAI,IAAI,KAAK,SAAS,IAAI,EAC5C,IAAIC,EAAWD,EAAU,SAAS,QAAQ,WAAY,GAAG,EACzD,OAAAC,EAAWA,EAAS,QAAQ,cAAe,GAAG,EACvC,GAAGD,EAAU,MAAM,GAAGC,CAAQ,EACvC,CAEF,CAEA,SAASC,GAAyB,CAChC,OAAOP,KAAmB,QAAuBI,EAAA,GAAmBF,KAAqB,GAC3F,CAEA,SAASM,EAAkBC,EAAuB,CAChD,OAAOA,EAAM,SAAS,GAAG,EAAIA,EAAM,MAAM,EAAG,EAAE,EAAIA,CACpD,CAEA,SAASC,EAAiBD,EAAuB,CAC/C,OAAOA,EAAM,WAAW,GAAG,EAAIA,EAAM,MAAM,CAAC,EAAIA,CAClD,CAEO,SAASE,EAAkBtB,EAAsB,CACtD,MAAMuB,EAAUL,EAAA,EAChB,GAAI,CAAClB,EAAM,OAAOuB,EAElB,MAAMC,EAAiBH,EAAiBrB,CAAI,EAG5C,OAAIuB,EAAQ,WAAW,SAAS,GAAKA,EAAQ,WAAW,UAAU,EACzD,IAAI,IAAIC,EAAgBD,CAAO,EAAE,SAAA,EAKnC,GADgBA,IAAY,IAAM,GAAKJ,EAAkBI,CAAO,CAC/C,IAAIC,CAAc,EAC5C,CAEO,SAASC,EAAsBzB,EAAsB,CAC1D,OAAOsB,EAAkB,aAAaD,EAAiBrB,CAAI,CAAC,EAAE,CAChE,CClEO,MAAM0B,EAAgB1B,GAAiB,CAC5C,IAAI2B,EAAI3B,EAAK,MAAM,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EAC7C,OAAO2B,IAAM,GAAM3B,EAAK,WAAW,GAAG,EAAI,IAAM,IAAO2B,CACzD,EAEO,SAASC,EAAKC,EAAWC,EAAmB,CACjD,OAAID,IAAM,IAAYC,EAClBD,EAAE,SAAS,GAAG,EAAUD,EAAKC,EAAE,UAAU,EAAGA,EAAE,OAAS,CAAC,EAAGC,CAAC,EACzDA,IAAM,IAAMD,EAAI,GAAGA,CAAC,IAAIC,CAAC,EAClC,CAEA,eAAsBC,EAA4BC,EAAwB,CACxE,MAAMC,EAAS,UAAU,WAAW,QAAQ,EAAE,OACxCC,EAAY,MAAOxC,IAAiB,MAAM,MAAMA,CAAG,GAAG,YAAA,EACtDyC,EACJ,MAAM,QAAQ,IACZH,EAAa,IAAI,MAAO,GAAc,CAAC,EAAG,MAAME,EAAUT,EAAsB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,EAG3FW,EAAsB,CAAA,EAC5B,SAAW,CAAC,EAAGC,CAAO,IAAKF,EACzBC,EAAU,CAAC,EAAI,CACb,GAAI,QACJ,QAAS,CACP,QAASH,EAAO,KAAKI,CAAO,CAAA,CAC9B,EAGJ,OAAOD,CACT,CAEA,eAAsBE,EAAiBN,EAAwBlC,EAAQyC,EAAO,aAAcC,EAAI,OAAQ,CACtG,MAAMC,EAAgB,MAAOC,EAAgBC,IAAmB,CAC9D,GAAI,CACF,MAAM7C,EAAG,QAAQ4C,EAAQC,CAAM,CACjC,OAASzD,EAAG,CACV,QAAQ,MAAM,WAAWwD,CAAM,KAAKC,CAAM,aAAczD,CAAC,CAC3D,CACF,EAEA,MAAM,QAAQ,IAAI8C,EAAa,QAAU,SAAY,CACnD,GAAI,EAAE,KAAKzB,GAAc,MAAM,IAAI,MAAM,iBAAiB,CAAC,yBAAyBC,EAAqB,KAAK,IAAI,CAAC,GAAG,EACtH,KAAM,CAAC,SAAAoC,CAAA,EAAarC,EAAa,CAAC,EAClC,GAAIqC,EACF,UAAWC,KAAQD,EAAU,CAC3B,MAAME,EAAKF,EAASC,CAAI,EAClBH,EAASI,IAAO,IAAM,GAAGP,CAAM,IAAI,CAAC,GAAK,GAAGA,CAAM,IAAI,CAAC,IAAIO,CAAE,GAC7DH,EAASE,EAAK,WAAW,GAAG,EAAIA,EAAO,GAAGL,CAAG,IAAIK,CAAI,GAC3D,MAAMJ,EAAcC,EAAQC,CAAM,CACpC,MAEA,MAAMF,EAAc,GAAGF,CAAM,IAAI,CAAC,GAAI,GAAGC,CAAG,IAAI,CAAC,EAAE,CAEvD,GAAA,CAAI,CAAC,CACP,CAEA,SAASO,EAAsBC,EAAsBC,EAAc,CACjE,OAAO,IAAI,QAAQ,MAAOnE,EAASC,IAAW,CAC5C,UAAU,QAAQiE,CAAY,EAC9B,GAAI,CACF,UAAU,UAAUC,EAAS,SAAU/D,EAAQ,CACzCA,IAAUA,CAAC,IACF,IAAI,CACnB,CAAC,CACH,OAASA,EAAG,CACV,QAAQ,MAAMA,CAAC,EACfH,EAAOG,CAAC,CACV,CACF,CAAC,CACH,CAEA,eAAsBgE,EAAe,CAAC,OAAAX,EAAQ,iBAAAY,GAA6E,CAEzH,MAAMC,EAAkB,MAAMrB,EADTvB,CACiD,EAChE6C,EAAsB,CAAA,EAC5B,UAAWjE,KAAKgE,EACdC,EAAU,GAAGd,CAAM,GAAGnD,CAAC,EAAE,EAAIgE,EAAgBhE,CAAC,EAGhD,MAAM2D,EAAsB,OAAO,QAAW,UAAY,QAAU,KAAM,CACxE,GAAI,YACJ,QAAS,CACP,SAAU,CACR,GAAI,sBACJ,QAAS,CACP,GAAGM,CAAA,CACL,EAEF,SAEI,CACF,GAAI,UAAA,CACN,CACF,CACD,EAED,IAAIvD,EAAK,UAAU,WAAW,IAAI,EAElC,OAAOA,CACT"}