{"version":3,"file":"index.mjs","sources":["../src/context.ts","../src/tokenizer/tokenizer.ts","../src/file.ts","../src/episodes.ts","../src/keyword.ts","../src/title.ts","../src/fansub.ts","../src/parser.ts"],"sourcesContent":["import type { FileInfo, ParseOptions, ParseResult } from './types.js';\n\nimport { Token } from './tokenizer/index.js';\n\n// MARK: 上下文\nexport class Context {\n  // Left cursor for consumed tokens (inclusive)\n  public left = 0;\n\n  // Right cursor for consumed tokens (inclusive)\n  public right;\n\n  public tokens: Token[];\n\n  public options: ParseOptions;\n\n  public result: Partial<ParseResult>;\n\n  public tags: string[];\n\n  public constructor(tokens: Token[], options: ParseOptions) {\n    this.tokens = tokens;\n    this.options = options;\n    this.right = tokens.length - 1;\n    this.tags = [];\n    this.result = {};\n    if (options.fansub) {\n      this.result.fansub = { name: options.fansub };\n    }\n  }\n\n  public update<K1 extends keyof ParseResult>(key: K1, value: ParseResult[K1]) {\n    this.result[key] = value;\n  }\n\n  public update2<\n    K1 extends keyof Required<ParseResult>,\n    K2 extends keyof Required<ParseResult>[K1]\n  >(key1: K1, key2: K2, value: Required<ParseResult>[K1][K2]) {\n    if (!this.result[key1]) {\n      // @ts-expect-error\n      this.result[key1] = {};\n    }\n    // @ts-expect-error\n    this.result[key1][key2] = value;\n  }\n\n  public update3<\n    K1 extends keyof Required<ParseResult>,\n    K2 extends keyof Required<ParseResult>[K1],\n    K3 extends keyof Required<Required<ParseResult>[K1]>[K2]\n  >(key1: K1, key2: K2, key3: K3, value: Required<Required<ParseResult>[K1]>[K2][K3]) {\n    if (!this.result[key1]) {\n      // @ts-expect-error\n      this.result[key1] = {};\n    }\n    // @ts-expect-error\n    if (!this.result[key1][key2]) {\n      // @ts-expect-error\n      this.result[key1][key2] = {};\n    }\n    // @ts-expect-error\n    this.result[key1][key2][key3] = value;\n  }\n\n  public get hasEpisode() {\n    return this.result.episode || this.result.episodes || this.result.episodesRange;\n  }\n\n  public normalize(): ParseResult | undefined {\n    if (this.tags.length > 0) {\n      this.result.tags = [...new Set([...(this.result.tags ?? []), ...this.tags])];\n    }\n\n    if (this.result.subtitle?.languages) {\n      const languages = this.result.subtitle?.languages;\n      this.result.subtitle.languages = normalizeLanguages(languages);\n    }\n\n    if (this.result.subtitle?.format) {\n      this.result.subtitle.format = normalizeSubtitleFormat(this.result.subtitle.format);\n    }\n\n    if (this.result.subtitle?.encoding) {\n      this.result.subtitle.encoding = normalizeSubtitleEncoding(this.result.subtitle.encoding);\n    }\n\n    if (this.result.subtitle?.encodings) {\n      this.result.subtitle.encodings = normalizeSubtitleEncodings(this.result.subtitle.encodings);\n    }\n\n    if (this.result.file) {\n      normalizeFileInfo(this.result.file);\n    }\n\n    if (this.result.variants) {\n      this.result.variants = [...new Set(this.result.variants)];\n    }\n\n    if (this.result.title && this.result.title.length > 0) {\n      return this.result as ParseResult;\n    }\n\n    return undefined;\n  }\n}\n\n// MARK: 字幕类型归一化\n\nfunction normalizeSubtitleFormat(format: string): string {\n  const trimmed = format.trim();\n  const upper = normalizeUpperTag(trimmed);\n\n  // 字幕类型使用简体中文的常用发布术语；ASS/SRT 是字幕格式名，保留标准大写。\n  //\n  // @example \"HARDSUB\" -> \"内嵌字幕\"\n  // @example \"SOFTSUB\" -> \"软字幕\"\n  // @example \"內封字幕\" -> \"内封字幕\"\n  // @example \"SRTx2\" -> \"SRT字幕×2\"\n  {\n    const res = /^(ASS|SRT)(?:[Xx×](\\d+))?$/i.exec(trimmed);\n    if (res) {\n      return res[2] ? `${res[1].toUpperCase()}字幕×${res[2]}` : `${res[1].toUpperCase()}字幕`;\n    }\n  }\n\n  if (/^HARDSUBS?$/.test(upper) || /^(内嵌|內嵌)(字幕)?$/.test(trimmed)) {\n    return '内嵌字幕';\n  }\n\n  if (/^SOFTSUBS?$/.test(upper)) {\n    return '软字幕';\n  }\n\n  if (/^(内封|內封)(字幕)?$/.test(trimmed)) {\n    return '内封字幕';\n  }\n\n  if (/^(外挂|外掛)(字幕)?$/.test(trimmed)) {\n    return '外挂字幕';\n  }\n\n  if (/^(内挂|內掛)(字幕)?$/.test(trimmed)) {\n    return '内挂字幕';\n  }\n\n  if (/^(SUB|SUBBED|SUBTITLED)$/.test(upper) || trimmed === '字幕') {\n    return '字幕';\n  }\n\n  return trimmed.replaceAll('內', '内').replaceAll('掛', '挂');\n}\n\nfunction normalizeSubtitleEncoding(encoding: string): string {\n  const upper = normalizeUpperTag(encoding);\n\n  // Keep release-scene shorthand instead of expanding to a specific code page,\n  // because \"GB\" may mean GB2312, GBK, or a broader simplified Chinese package.\n  //\n  // @example \"gb\" -> \"GB\"\n  // @example \"big5\" -> \"BIG5\"\n  if (upper === 'GB' || upper === 'BIG5') {\n    return upper;\n  }\n\n  return upper;\n}\n\nfunction normalizeSubtitleEncodings(encodings: string[]): string[] {\n  const normalized = new Set(encodings.map(normalizeSubtitleEncoding));\n  const order = ['GB', 'BIG5'];\n\n  // Multi-encoding subtitle packages use a stable canonical order in snapshots\n  // and API output, regardless of source order such as \"BIG5&GB\".\n  //\n  // @example [\"BIG5\", \"GB\"] -> [\"GB\", \"BIG5\"]\n  // @example [\"GB\", \"BIG5\", \"GB\"] -> [\"GB\", \"BIG5\"]\n  return [\n    ...order.filter((encoding) => normalized.delete(encoding)),\n    ...encodings.map(normalizeSubtitleEncoding).filter((encoding) => normalized.delete(encoding))\n  ];\n}\n\n// MARK: 媒体信息归一化\n\nfunction normalizeFileInfo(file: FileInfo) {\n  if (file.audio) {\n    normalizeAudioInfo(file.audio);\n  }\n\n  if (file.video) {\n    normalizeVideoInfo(file.video);\n  }\n}\n\nfunction normalizeAudioInfo(audio: NonNullable<FileInfo['audio']>) {\n  if (audio.channels) {\n    audio.channels = normalizeAudioChannels(audio.channels);\n  }\n\n  if (audio.codec) {\n    audio.codec = normalizeAudioCodec(audio.codec);\n  }\n\n  if (audio.language) {\n    audio.language = normalizeAudioLanguage(audio.language);\n  }\n}\n\nfunction normalizeVideoInfo(video: NonNullable<FileInfo['video']>) {\n  if (video.bitDepth) {\n    video.bitDepth = normalizeBitDepth(video.bitDepth);\n  }\n\n  if (video.codec) {\n    video.codec = normalizeVideoCodec(video.codec);\n  }\n\n  if (video.enhancement) {\n    video.enhancement = normalizeUpperTag(video.enhancement);\n  }\n\n  if (video.format) {\n    video.format = normalizeUpperTag(video.format);\n  }\n\n  if (video.fps) {\n    video.fps = normalizeFrameRate(video.fps);\n  }\n\n  if (video.quality) {\n    video.quality = normalizeUpperTag(video.quality);\n  }\n\n  if (video.resolution) {\n    video.resolution = normalizeVideoResolution(video.resolution);\n  }\n}\n\nfunction normalizeUpperTag(value: string): string {\n  return value.trim().toUpperCase();\n}\n\nfunction normalizeLowerTag(value: string): string {\n  return value.trim().toLowerCase();\n}\n\nfunction normalizeAudioCodec(codec: string): string {\n  const upper = normalizeUpperTag(codec);\n\n  // Audio codecs follow their common published names. Acronyms stay uppercase,\n  // product-style names keep their usual casing, and descriptive tags use lowercase.\n  //\n  // @example \"EAC3\" -> \"E-AC-3\"\n  // @example \"OPUS\" -> \"Opus\"\n  // @example \"QAAC\" -> \"qaac\"\n  const codecs = new Map([\n    ['AAC', 'AAC'],\n    ['AC3', 'AC-3'],\n    ['AC-3', 'AC-3'],\n    ['DTS', 'DTS'],\n    ['DTS-ES', 'DTS-ES'],\n    ['EAC3', 'E-AC-3'],\n    ['E-AC-3', 'E-AC-3'],\n    ['EAC3&AAC', 'E-AC-3+AAC'],\n    ['FLAC', 'FLAC'],\n    ['FLAC/AC3', 'FLAC+AC-3'],\n    ['LOSSLESS', 'lossless'],\n    ['MP3', 'MP3'],\n    ['OGG', 'Ogg'],\n    ['OPUS', 'Opus'],\n    ['QAAC', 'qaac'],\n    ['TRUEHD', 'TrueHD'],\n    ['VORBIS', 'Vorbis'],\n    ['WAV', 'WAV']\n  ]);\n\n  return codecs.get(upper) ?? normalizeLowerTag(codec);\n}\n\nfunction normalizeVideoCodec(codec: string): string {\n  const upper = normalizeUpperTag(codec);\n\n  // Video codecs are normalized to widely used codec-family names from release\n  // metadata and media specs.\n  //\n  // @example \"H.264\" -> \"AVC\"\n  // @example \"x265\" -> \"HEVC\"\n  // @example \"DIVX5\" -> \"DivX\"\n  if (/^(H\\.?264|X\\.?264|AVC)$/.test(upper)) {\n    return 'AVC';\n  }\n  if (/^(H\\.?265|X\\.?265|HEVC2?|HVC1)$/.test(upper)) {\n    return 'HEVC';\n  }\n  if (/^DIVX\\d*$/.test(upper)) {\n    return 'DivX';\n  }\n  if (upper === 'XVID') {\n    return 'Xvid';\n  }\n  if (/^HI10P?$/.test(upper)) {\n    return 'Hi10P';\n  }\n  if (/^HI444P*$/.test(upper)) {\n    return upper.replace('HI', 'Hi');\n  }\n\n  return normalizeLowerTag(codec);\n}\n\nfunction normalizeAudioChannels(channels: string): string {\n  const upper = normalizeUpperTag(channels);\n\n  // Channel layouts are represented without the optional \"ch\" suffix because\n  // \"2.0\" and \"5.1\" are the common layout names in media tooling.\n  //\n  // @example \"2CH\" -> \"2.0\"\n  // @example \"5.1CH\" -> \"5.1\"\n  if (upper === '2CH') {\n    return '2.0';\n  }\n  if (upper === '5.1CH') {\n    return '5.1';\n  }\n\n  return upper.replace(/CH$/, '');\n}\n\nfunction normalizeAudioLanguage(language: string): string {\n  const upper = normalizeUpperTag(language);\n\n  // No formal casing exists for this marker, so use lowercase words.\n  //\n  // @example \"DUALAUDIO\" -> \"dual audio\"\n  // @example \"DUAL AUDIO\" -> \"dual audio\"\n  if (upper === 'DUALAUDIO' || upper === 'DUAL AUDIO') {\n    return 'dual audio';\n  }\n\n  return normalizeLowerTag(language);\n}\n\nfunction normalizeBitDepth(bitDepth: string): string {\n  const upper = normalizeUpperTag(bitDepth);\n  const res = /^(\\d+)[-_ ]?BITS?$/.exec(upper);\n\n  // Bit depth is conventionally hyphenated in technical copy.\n  //\n  // @example \"10BIT\" -> \"10-bit\"\n  // @example \"8 bits\" -> \"8-bit\"\n  if (res) {\n    return `${res[1]}-bit`;\n  }\n\n  return normalizeLowerTag(bitDepth);\n}\n\nfunction normalizeFrameRate(fps: string): string {\n  const upper = normalizeUpperTag(fps);\n  const res = /^(\\d+(?:\\.\\d+)?)\\s*FPS$/.exec(upper);\n\n  // \"fps\" is a unit-like abbreviation in this schema, so use lowercase.\n  //\n  // @example \"23.976FPS\" -> \"23.976fps\"\n  // @example \"60 fps\" -> \"60fps\"\n  return res ? `${res[1]}fps` : normalizeLowerTag(fps);\n}\n\nfunction normalizeVideoResolution(resolution: string): string {\n  const trimmed = resolution.trim();\n  const upper = trimmed.toUpperCase();\n\n  // P-height resolutions keep the conventional lowercase \"p\".\n  //\n  // @example \"1080P\" -> \"1080p\"\n  // @example \"2160p\" -> \"2160p\"\n  {\n    const res = /^(\\d{3,4})P$/i.exec(trimmed);\n    if (res) {\n      return `${res[1]}p`;\n    }\n  }\n\n  // Pixel dimensions use a lowercase \"x\" regardless of source separator.\n  //\n  // @example \"1920X1080\" -> \"1920x1080\"\n  // @example \"3840×2160\" -> \"3840x2160\"\n  {\n    const res = /^(\\d{3,5})[Xx×](\\d{3,5})$/.exec(trimmed);\n    if (res) {\n      return `${res[1]}x${res[2]}`;\n    }\n  }\n\n  if (/^\\d+K$/.test(upper)) {\n    return upper;\n  }\n\n  return trimmed;\n}\n\n// MARK: 字幕语言归一化\n\nconst NormalizedLanguages = ['简', '繁', '粤', '日', '英', '泰'] as const;\n\nfunction normalizeLanguage(language: string): string[] | undefined {\n  const trimmed = language.trim();\n  const upper = trimmed.toUpperCase();\n\n  if (/^(CN|CHINESE|ZH|中|中文|中字|国语中字|國語中字)$/.test(upper)) {\n    return undefined;\n  }\n\n  const languages: string[] = [];\n  const matches = {\n    简: /(^|[^A-Z])CHS($|[^A-Z])|ZH[-_]?HANS|简|簡|简体|簡體|简中|簡中/i.test(trimmed),\n    繁: /(^|[^A-Z])CHT($|[^A-Z])|ZH[-_]?HANT|繁|繁体|繁體|繁中|BIG5/i.test(trimmed),\n    粤: /(^|[^A-Z])YUE($|[^A-Z])|粤|粵|广东话|廣東話|CANTONESE/i.test(trimmed),\n    日: /(^|[^A-Z])(JP|JPN|JA)($|[^A-Z])|日|日本|JAPANESE/i.test(trimmed),\n    英: /(^|[^A-Z])(EN|ENG)($|[^A-Z])|英|ENGLISH/i.test(trimmed),\n    泰: /(^|[^A-Z])(TH|THA)($|[^A-Z])|泰|THAI/i.test(trimmed)\n  };\n\n  if (/[中华華]/.test(trimmed) && !matches.简 && !matches.繁 && !matches.粤) {\n    return undefined;\n  }\n\n  for (const language of NormalizedLanguages) {\n    if (matches[language]) {\n      languages.push(language);\n    }\n  }\n\n  return languages.length > 0 ? languages : undefined;\n}\n\nfunction normalizeLanguages(languages: string[]): string[] {\n  const normalized = new Set<string>();\n  const unknown: string[] = [];\n\n  for (const language of languages) {\n    const parts = normalizeLanguage(language);\n    if (parts) {\n      parts.forEach((part) => normalized.add(part));\n    } else if (!unknown.includes(language)) {\n      unknown.push(language);\n    }\n  }\n\n  return [...NormalizedLanguages.filter((language) => normalized.has(language)), ...unknown];\n}\n","export class Token {\n  public readonly text: string;\n\n  public readonly left: string | undefined;\n\n  public readonly right: string | undefined;\n\n  public constructor(text: string, left?: string, right?: string) {\n    this.text = text;\n    this.left = left;\n    this.right = right;\n  }\n\n  public get isWrapped() {\n    return this.left && this.right;\n  }\n\n  public slice(start: number, end?: number) {\n    const text = this.text.slice(start, end);\n    return new Token(text, this.left, this.right);\n  }\n\n  public trim() {\n    const text = this.text.trim();\n    return new Token(text, this.left, this.right);\n  }\n\n  public toString() {\n    return `${this.left ?? ''}${this.text}${this.right ?? ''}`;\n  }\n}\n\nexport const Wrappers = new Map([\n  ['[', ']'],\n  ['【', '】'],\n  ['(', ')'],\n  ['（', '）'],\n  ['{', '}']\n]);\n\nexport const RevWrappers = new Map([...Wrappers.entries()].map(([k, v]) => [v, k]));\n\nexport function tokenize(text: string) {\n  const tokens: Token[] = [];\n\n  let cursor = 0;\n  let cur = '';\n  let left: string | undefined = undefined;\n  let right: string | undefined = undefined;\n  while (cursor < text.length) {\n    const char = text[cursor];\n    if (Wrappers.has(char)) {\n      if (!left) {\n        if (cur) {\n          tokens.push(new Token(cur));\n          cur = '';\n        }\n        left = char;\n        right = Wrappers.get(char)!;\n      } else {\n        // nest wrapper\n        cur += char;\n      }\n    } else if (left && right && char === right) {\n      tokens.push(new Token(cur, left, right));\n      cur = '';\n      left = undefined;\n      right = undefined;\n    } else {\n      cur += char;\n    }\n    cursor += 1;\n  }\n  if (cur) {\n    tokens.push(new Token(cur));\n  }\n\n  return tokens.filter((t) => t.text);\n}\n","export const FileExtensions = new Set([\n  '3GP',\n  'AVI',\n  'DIVX',\n  'FLV',\n  'M2TS',\n  'MKV',\n  'MOV',\n  'MP4',\n  'MPG',\n  'OGM',\n  'RM',\n  'RMVB',\n  'TS',\n  'WEBM',\n  'WMV'\n]);\n\nexport function parseFileExtension(title: string) {\n  const match = /\\.([^.\\/\\s]+)\\s*$/.exec(title);\n  if (!match) return { title };\n\n  const extension = match[1].toUpperCase();\n  if (!FileExtensions.has(extension)) return { title };\n\n  return {\n    title: title.slice(0, match.index).trimEnd(),\n    extension\n  };\n}\n","import type { Context } from './context.js';\n\nimport { Token } from './tokenizer/index.js';\n\nconst WrappedEpisodeRE1 =\n  /^(?<type>TV|OVA|OAD|SP)?(?<ep1>\\d+)(?:\\.(?<sub>\\d))?(?:[vV](?<version>\\d+))?(?:(?:\\s+|_|-)?(?<ep_type>[^\\d集]+))?$|^第(?<ep2>\\d+)[集话話]$|^S(?<season>\\d+)E(?<ep3>\\d+)((?:[_|（])?(?<ep_type>[^\\d][^）]*)(?:）)?)?$/;\nconst WrappedEpisodeRE2 = /^(?<ep1>\\d+)(?:\\+(?<type>[^\\d]+)|,|&|、)(?<ep2>\\d+)$/;\nconst WrappedSeasonRE = /^(?:S|Season)(\\d+)\\s*(Fin|End)?$/;\nconst WrappedMovieRE = /^Movie [vV](\\d+)$/;\n\nconst WrappedEpisodesRange1 =\n  /^(?<type>TV|OVA|OAD|SP)?(?<ep1>\\d+)(?:\\.(?<sub1>\\d))?[-~](?<ep2>\\d+)(?:\\.(?<sub2>\\d))?\\s*[_]?(?<range_type>.*)$/;\nconst WrappedEpisodesRange2 = /^全(\\d+)集$/;\n\nconst WrappedSeasonsRE = /^S(?<season1>\\d)\\+S(?<season2>\\d)$/;\nconst WrappedSeasonsRangeRE = /^S(?<season1>\\d)-S(?<season2>\\d)$/;\n\nconst WrappedVolumeRE = /^(?:Vol|vol|Volume|volume)\\.?\\s*(?<vol>\\d+)$/;\nconst WrappedVolumesRangeRE =\n  /^(?:Vol|vol|Volume|volume)\\.?\\s*(?<vol1>\\d+)-(?<vol2>\\d+)\\s+(?<type>.*)$/;\n\nexport function matchEpiodes(ctx: Context, text: string) {\n  text = text.trimEnd();\n\n  // 1. Single episode\n  {\n    const res = WrappedEpisodeRE1.exec(text);\n    if (res) {\n      const epText = res.groups?.ep1! || res.groups?.ep2! || res.groups?.ep3!;\n      const ep = +epText;\n      if (!Number.isNaN(ep)) {\n        // Handle year: [2024]\n        if (1949 <= ep && ep <= 2099 && text === epText && ctx.hasEpisode) {\n          ctx.update('year', ep);\n          return true;\n        }\n\n        ctx.update2('episode', 'number', ep);\n\n        // 1.5\n        if (res.groups?.sub && !Number.isNaN(+res.groups.sub)) {\n          ctx.update2('episode', 'numberSub', +res.groups.sub);\n        }\n\n        // 3v2\n        if (res.groups?.version && !Number.isNaN(+res.groups.version)) {\n          ctx.update('version', +res.groups.version);\n        }\n\n        // SP01 OVA01\n        if (res.groups?.type) {\n          const type = res.groups.type.trim();\n          ctx.update('type', type);\n        }\n\n        // 01 END\n        if (res.groups?.ep_type) {\n          const type = res.groups.ep_type.trim();\n          ctx.update2('episode', 'type', type);\n        }\n\n        // S01E01\n        if (res.groups?.season && !Number.isNaN(+res.groups.season)) {\n          const season = +res.groups.season;\n          ctx.update2('season', 'number', season);\n        }\n\n        return true;\n      }\n    }\n  }\n  {\n    // 06,07 07+ES07\n    const res = WrappedEpisodeRE2.exec(text);\n    if (res) {\n      const ep1 = res.groups?.ep1 ? +res.groups.ep1 : NaN;\n      const ep2 = res.groups?.ep2 ? +res.groups.ep2 : NaN;\n      const type = res.groups?.type;\n      if (!Number.isNaN(ep1) && !Number.isNaN(ep2)) {\n        if (type) {\n          ctx.update2('episode', 'number', ep1);\n          ctx.update('episodes', [\n            {\n              number: ep2,\n              type\n            }\n          ]);\n        } else {\n          ctx.update('episodes', [\n            {\n              number: ep1\n            },\n            {\n              number: ep2\n            }\n          ]);\n        }\n        return true;\n      }\n    }\n  }\n  {\n    // [Movie] / [Movie v2]\n    const res = WrappedMovieRE.exec(text);\n    if (res) {\n      if (res[1] && !Number.isNaN(res[1])) {\n        ctx.update('version', +res[1]);\n      }\n      ctx.update('type', 'Movie');\n      return true;\n    }\n  }\n\n  // 2. Episodes range\n  {\n    // 01-26\n    const res = WrappedEpisodesRange1.exec(text);\n    if (res) {\n      const from = res.groups?.ep1 ? +res.groups.ep1 : NaN;\n      const to = res.groups?.ep2 ? +res.groups.ep2 : NaN;\n      if (!Number.isNaN(from) && !Number.isNaN(to)) {\n        ctx.update2('episodesRange', 'from', from);\n        ctx.update2('episodesRange', 'to', to);\n\n        const type = res.groups?.type ? res.groups.type.trim() : undefined;\n        if (type) {\n          ctx.update('type', type);\n        }\n\n        const episodesRangeType = res.groups?.range_type ? res.groups.range_type.trim() : undefined;\n        if (episodesRangeType) {\n          const exec2 = /[vV](\\d+)$/.exec(episodesRangeType);\n\n          if (exec2) {\n            const version = +exec2[1];\n            if (!Number.isNaN(version)) {\n              ctx.update('version', version);\n              ctx.update2(\n                'episodesRange',\n                'type',\n                episodesRangeType.slice(0, episodesRangeType.length - exec2[0].length)\n              );\n            } else {\n              ctx.update2('episodesRange', 'type', episodesRangeType);\n            }\n          } else {\n            ctx.update2('episodesRange', 'type', episodesRangeType);\n          }\n        }\n\n        // 12.5-23\n        const sub1 = res.groups?.sub1 ? +res.groups?.sub1 : NaN;\n        const sub2 = res.groups?.sub2 ? +res.groups?.sub2 : NaN;\n        if (!Number.isNaN(sub1)) {\n          ctx.update2('episodesRange', 'fromSub', sub1);\n        }\n        if (!Number.isNaN(sub2)) {\n          ctx.update2('episodesRange', 'toSub', sub2);\n        }\n\n        return true;\n      }\n    }\n  }\n  {\n    // 全26集\n    const res = WrappedEpisodesRange2.exec(text);\n    if (res) {\n      const to = +res[1];\n      if (!Number.isNaN(to)) {\n        ctx.update2('episodesRange', 'from', 1);\n        ctx.update2('episodesRange', 'to', to);\n        return true;\n      }\n    }\n  }\n\n  // 3. Season\n  {\n    const res = WrappedSeasonRE.exec(text);\n    if (res) {\n      const season = +res[1];\n      if (!Number.isNaN(season)) {\n        ctx.update2('season', 'number', season);\n\n        const tag = res[2];\n        if (tag) {\n          ctx.tags.push(tag.trim());\n        }\n        return true;\n      }\n    }\n  }\n\n  // 4. Seasons Range\n  {\n    const res = WrappedSeasonsRE.exec(text);\n    if (res) {\n      const season1 = res.groups?.season1 ? +res.groups.season1 : NaN;\n      const season2 = res.groups?.season2 ? +res.groups.season2 : NaN;\n      if (!Number.isNaN(season1) && !Number.isNaN(season2)) {\n        ctx.update('seasons', [{ number: season1 }, { number: season2 }]);\n      }\n      return true;\n    }\n  }\n  {\n    // Vol.1-4 Fin\n    const res = WrappedSeasonsRangeRE.exec(text);\n    if (res) {\n      const season1 = res.groups?.season1 ? +res.groups.season1 : NaN;\n      const season2 = res.groups?.season2 ? +res.groups.season2 : NaN;\n      if (!Number.isNaN(season1) && !Number.isNaN(season2)) {\n        ctx.update2('seasonsRange', 'from', season1);\n        ctx.update2('seasonsRange', 'to', season2);\n      }\n      return true;\n    }\n  }\n\n  // 5. Volume\n  {\n    const res = WrappedVolumeRE.exec(text);\n    if (res) {\n      const vol = res.groups?.vol ? +res.groups.vol : NaN;\n      if (!Number.isNaN(vol)) {\n        ctx.update2('volume', 'number', vol);\n        return true;\n      }\n    }\n  }\n  {\n    const res = WrappedVolumesRangeRE.exec(text);\n    if (res) {\n      const vol1 = res.groups?.vol1 ? +res.groups.vol1 : NaN;\n      const vol2 = res.groups?.vol2 ? +res.groups.vol2 : NaN;\n      const type = res.groups?.type;\n      if (!Number.isNaN(vol1) && !Number.isNaN(vol2)) {\n        ctx.update2('volumesRange', 'from', vol1);\n        ctx.update2('volumesRange', 'to', vol1);\n        if (type) {\n          ctx.update2('volumesRange', 'type', type);\n        }\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nexport function parseWrappedEpisodes(ctx: Context) {\n  if (ctx.hasEpisode) {\n    return true;\n  }\n\n  const token = ctx.tokens[ctx.right];\n  if (token.isWrapped && matchEpiodes(ctx, token.text)) {\n    ctx.right -= 1;\n    return true;\n  }\n\n  return false;\n}\n\nconst SuffixEpisodeRE = [\n  /\\s*- (?<type>SP|OVA)?(?<ep1>\\d+)(?:\\.(?<sub>\\d))?(?:[vV](?<version>\\d+))?(?<ep_type>\\s+[^\\-]*)?(?:\\s*-)?$/,\n  /\\s+S(?<season>\\d+)E(?<ep1>\\d+)$/,\n  /\\s*第(?<ep1>\\d+)(?:\\.(?<sub>\\d))?[集话話]$/,\n  /\\s+S(?<season1>\\d+)-S(?<season2>\\d+)$/\n];\nconst SuffixepisodesRangeRE = /- (?<from>\\d+)-(?<to>\\d+)(?:\\s+(?<type>.+))?$/;\n\nexport const Types = new Set([\n  'GEKIJOUBAN',\n  'MOVIE',\n  'OAD',\n  'OAV',\n  'ONA',\n  'OVA',\n  'SPECIAL',\n  'SPECIALS',\n  'TV',\n  '开播纪念特别篇',\n  '開播紀念特別篇',\n  '开篇纪念特别篇',\n  '開篇紀念特別篇',\n  '特别篇',\n  '特別篇',\n  '特別編',\n  '特别话',\n  '特別话',\n  '特別話',\n  '番外篇',\n  '番外編',\n  '剧场版',\n  '劇場版',\n  '总集篇',\n  '總集篇',\n  //\n  '广播剧',\n  '朗读剧',\n  //\n  'SP',\n  //\n  'ED',\n  'ENDING',\n  'NCED',\n  'NCOP',\n  'OP',\n  'OPENING',\n  'PREVIEW',\n  'PV',\n  '特别篇PV',\n  //\n  '合集',\n  '修正合集'\n]);\n\nexport function parseSuffixTextInlineEpisodes(ctx: Context, text: string) {\n  if (ctx.hasEpisode) {\n    return text;\n  }\n\n  text = text.trimEnd();\n\n  // - 01-24 修正合集\n  {\n    const res = SuffixepisodesRangeRE.exec(text);\n    if (res) {\n      const from = res.groups?.from ? +res.groups.from : NaN;\n      const to = res.groups?.to ? +res.groups.to : NaN;\n      if (!Number.isNaN(from) && !Number.isNaN(to)) {\n        ctx.update2('episodesRange', 'from', from);\n        ctx.update2('episodesRange', 'to', to);\n\n        const type = res.groups?.type?.trim();\n        if (type) {\n          const version = /[vV](\\d+)$/.exec(type);\n          if (version) {\n            const versionNumber = +version[1];\n            if (!Number.isNaN(versionNumber)) {\n              ctx.update('version', versionNumber);\n              const typeWithoutVersion = type.slice(0, type.length - version[0].length).trim();\n              if (typeWithoutVersion) {\n                ctx.update2('episodesRange', 'type', typeWithoutVersion);\n              }\n            } else {\n              ctx.update2('episodesRange', 'type', type);\n            }\n          } else {\n            ctx.update2('episodesRange', 'type', type);\n          }\n        }\n\n        return text.slice(0, text.length - res[0].length).trimEnd();\n      }\n    }\n  }\n\n  // episodes\n  for (const RE of SuffixEpisodeRE) {\n    const res = RE.exec(text);\n    if (res) {\n      const ep = res.groups?.ep1 ? +res.groups?.ep1 : NaN;\n      if (!Number.isNaN(ep)) {\n        if (res.groups?.type) {\n          ctx.update('type', res.groups.type);\n        }\n\n        ctx.update2('episode', 'number', ep);\n\n        // 1.5\n        const numberSub = res.groups?.sub ? +res.groups?.sub : NaN;\n        if (numberSub && !Number.isNaN(numberSub)) {\n          ctx.update2('episode', 'numberSub', numberSub);\n        }\n\n        // v2\n        const version = res.groups?.version ? +res.groups.version : NaN;\n        if (version && !Number.isNaN(version)) {\n          ctx.update('version', version);\n        }\n\n        // S02Exx\n        const season = res.groups?.season ? +res.groups.season : NaN;\n        if (!Number.isNaN(season)) {\n          ctx.update2('season', 'number', season);\n        }\n\n        // Remove token suffix\n        return text.slice(0, text.length - res[0].length).trimEnd();\n      }\n\n      // S1-S2\n      {\n        const season1 = res.groups?.season1 ? +res.groups.season1 : NaN;\n        const season2 = res.groups?.season2 ? +res.groups.season2 : NaN;\n        if (!Number.isNaN(season1) && !Number.isNaN(season2) && season1 < season2) {\n          ctx.update2('seasonsRange', 'from', season1);\n          ctx.update2('seasonsRange', 'to', season2);\n\n          // Remove token suffix\n          return text.slice(0, text.length - res[0].length).trimEnd();\n        }\n      }\n    }\n  }\n\n  // - 特别篇\n  for (const type of Types) {\n    const toMatch = ` - ${type}`;\n    if (text.endsWith(toMatch)) {\n      ctx.update('type', type);\n\n      // Remove token suffix\n      return text.slice(0, text.length - toMatch.length).trimEnd();\n    }\n  }\n\n  return text;\n}\n\nexport function parseSuffixEpisodes(ctx: Context) {\n  if (ctx.hasEpisode) {\n    return true;\n  }\n\n  const token = ctx.tokens[ctx.right];\n  const text = token.text.trimEnd();\n\n  if (token.isWrapped) {\n    return parseWrappedEpisodes(ctx);\n  } else {\n    const trimmed = parseSuffixTextInlineEpisodes(ctx, text);\n    if (trimmed !== text) {\n      ctx.tokens[ctx.right] = new Token(trimmed, token.left, token.right);\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// Season regexp\nconst SuffixSeasonOrEpisodesRes: Array<[RegExp, (res: RegExpExecArray, ctx: Context) => boolean]> =\n  [\n    [\n      /Parts? (\\d+)$/,\n      (res, ctx) => {\n        const part = +res[1];\n        if (!Number.isNaN(part)) {\n          ctx.update2('part', 'number', part);\n          return true;\n        }\n        return false;\n      }\n    ],\n    [\n      /第\\s*(\\d+)\\s*部分$/,\n      (res, ctx) => {\n        const part = +res[1];\n        if (!Number.isNaN(part)) {\n          ctx.update2('part', 'number', part);\n          return true;\n        }\n        return false;\n      }\n    ],\n    [\n      /(?:S|Season\\s?)(\\d+)$/,\n      (res, ctx) => {\n        const season = +res[1];\n        if (!Number.isNaN(season)) {\n          if (!ctx.result.season?.number || ctx.result.season.number === season) {\n            ctx.update2('season', 'number', season);\n            return true;\n          }\n        }\n        return false;\n      }\n    ],\n    [\n      /(1st|2nd|3rd|[456789]th) Season$/,\n      (res, ctx) => {\n        const season = Number.parseInt(res[1]);\n        if (!Number.isNaN(season)) {\n          if (!ctx.result.season?.number || ctx.result.season.number === season) {\n            ctx.update2('season', 'number', season);\n            return true;\n          }\n        }\n        return false;\n      }\n    ],\n    [\n      /(?:-\\s+)(Third) Season$/,\n      (res, ctx) => {\n        const season = { Third: 3 }[res[1]];\n        if (season && !Number.isNaN(season)) {\n          if (!ctx.result.season?.number || ctx.result.season.number === season) {\n            ctx.update2('season', 'number', season);\n            return true;\n          }\n        }\n        return false;\n      }\n    ],\n    [\n      /第?(\\d+)[季期]$/,\n      (res, ctx) => {\n        const season = +res[1];\n        if (!Number.isNaN(season)) {\n          if (!ctx.result.season?.number || ctx.result.season.number === season) {\n            ctx.update2('season', 'number', season);\n            return true;\n          }\n        }\n        return false;\n      }\n    ],\n    [\n      /第?((?:[零一二三四五六七八九]十)?[零一二三四五六七八九])[季期]$/,\n      (res, ctx) => {\n        const text = res[1];\n        const map = {\n          零: 0,\n          一: 1,\n          二: 2,\n          三: 3,\n          四: 4,\n          五: 5,\n          六: 6,\n          七: 7,\n          八: 8,\n          九: 9\n        };\n        const base =\n          text.length === 2 && text[0] === '十'\n            ? 1\n            : text.length === 3\n              ? map[text[0] as keyof typeof map]!\n              : 0;\n        const offset = map[text[text.length - 1] as keyof typeof map];\n        const season = base * 10 + offset;\n        if (!ctx.result.season?.number || ctx.result.season.number === season) {\n          ctx.update2('season', 'number', season);\n          return true;\n        }\n        return false;\n      }\n    ],\n    [\n      /(?:Vol|vol|Volume|volume)\\.?\\s*(?<vol>\\d+)$/,\n      (res, ctx) => {\n        const vol = res.groups?.vol ? +res.groups.vol : NaN;\n        if (!Number.isNaN(vol)) {\n          ctx.update2('volume', 'number', vol);\n          return true;\n        }\n        return false;\n      }\n    ],\n    [\n      /\\s+[vV](\\d+)$/,\n      (res, ctx) => {\n        const version = +res[1];\n        if (!Number.isNaN(version)) {\n          ctx.update('version', version);\n          return true;\n        }\n        return false;\n      }\n    ],\n    [\n      /\\s+(?<ep1>\\d+)$|\\((?<ep2>\\d+)\\)$/,\n      (res, ctx) => {\n        const text = res.groups?.ep1 ?? res.groups?.ep2;\n        const season = text !== undefined ? +text : NaN;\n        if (!Number.isNaN(season) && ctx.hasEpisode) {\n          if (!ctx.result.season?.number || ctx.result.season.number === season) {\n            ctx.update2('season', 'number', season);\n            return true;\n          } else if (\n            (!ctx.result.year || ctx.result.year === season) &&\n            1949 <= season &&\n            season <= 2099\n          ) {\n            ctx.update('year', season);\n            return true;\n          }\n        }\n        return false;\n      }\n    ]\n  ];\n\nexport function parseSuffixTextInlineSeason(ctx: Context, text: string) {\n  let changed = false;\n  do {\n    changed = false;\n    text = text.trimEnd();\n    for (const [re, fn] of SuffixSeasonOrEpisodesRes) {\n      const res = re.exec(text);\n      if (res && fn(res, ctx)) {\n        changed = true;\n        text = text.slice(0, text.length - res[0].length).trimEnd();\n      }\n    }\n  } while (changed);\n  return text;\n}\n","import type { Context } from './context.js';\nimport type { FileInfo } from './types.js';\n\nimport { FileExtensions } from './file.js';\nimport { Token, tokenize } from './tokenizer/index.js';\nimport { Types, matchEpiodes } from './episodes.js';\n\n// MARK: audio / video\n\ntype AudioInfo = NonNullable<FileInfo['audio']>;\n\ntype VideoInfo = NonNullable<FileInfo['video']>;\n\nconst AudioChannels = new Set(['2.0CH', '2CH', '5.1', '5.1CH']);\n\nconst AudioCompoundTerms = new Map<string, AudioInfo>([\n  ['DTS5.1', { codec: 'DTS', channels: '5.1' }],\n  ['TRUEHD5.1', { codec: 'TRUEHD', channels: '5.1' }],\n  ['AACX2', { codec: 'AAC', trackCount: 2 }],\n  ['AAC×2', { codec: 'AAC', trackCount: 2 }],\n  ['AACX3', { codec: 'AAC', trackCount: 3 }],\n  ['AAC×3', { codec: 'AAC', trackCount: 3 }],\n  ['AACX4', { codec: 'AAC', trackCount: 4 }],\n  ['AAC×4', { codec: 'AAC', trackCount: 4 }],\n  ['FLACX2', { codec: 'FLAC', trackCount: 2 }],\n  ['FLAC×2', { codec: 'FLAC', trackCount: 2 }],\n  ['FLACX3', { codec: 'FLAC', trackCount: 3 }],\n  ['FLAC×3', { codec: 'FLAC', trackCount: 3 }],\n  ['FLACX4', { codec: 'FLAC', trackCount: 4 }],\n  ['FLAC×4', { codec: 'FLAC', trackCount: 4 }]\n]);\n\nconst AudioCodecs = new Set([\n  'DTS',\n  'DTS-ES',\n  'EAC3&AAC',\n  'AAC',\n  'QAAC',\n  'AC3',\n  'EAC3',\n  'E-AC-3',\n  'FLAC',\n  'FLAC/AC3', // TODO: split\n  'LOSSLESS',\n  'MP3',\n  'WAV',\n  'OGG',\n  'VORBIS',\n  'OPUS'\n]);\n\nconst AudioLanguages = new Set(['DUALAUDIO', 'DUAL AUDIO']);\n\nconst VideoBitDepths = new Set(['8BIT', '8-BIT', '10BIT', '10BITS', '10-BIT', '10-BITS']);\n\nconst VideoCodecs = new Set([\n  'HI10',\n  'HI10P',\n  'HI444',\n  'HI444P',\n  'HI444PP',\n  'H264',\n  'H265',\n  'H.264',\n  'H.265',\n  'X264',\n  'X265',\n  'X.264',\n  'AVC',\n  'HEVC',\n  'HEVC2',\n  'DIVX',\n  'DIVX5',\n  'DIVX6',\n  'XVID'\n]);\n\nconst VideoFormats = new Set(['AVI', 'RMVB', 'WMV', 'WMV3', 'WMV9']);\n\nconst VideoQualities = new Set(['HDR', 'HQ', 'LQ']);\n\nconst VideoResolutionTerms = new Set(['HD', 'SD']);\n\nconst VideoCompoundTerms = new Map<string, VideoInfo & { audioCodec?: string }>([\n  ['AVC-8BIT', { codec: 'AVC', bitDepth: '8BIT' }],\n  ['HEVC_OPUS', { codec: 'HEVC', audioCodec: 'OPUS' }],\n  ['HEVC-10BIT', { codec: 'HEVC', bitDepth: '10BIT' }],\n  ['HEVC-10BIT-1440P', { codec: 'HEVC', bitDepth: '10BIT', resolution: '1440P' }],\n  ['HEVC-10BIT-2160P', { codec: 'HEVC', bitDepth: '10BIT', resolution: '2160P' }],\n  ['HEVC_10BIT', { codec: 'HEVC', bitDepth: '10BIT' }],\n  ['HEVC-8BIT', { codec: 'HEVC', bitDepth: '8BIT' }],\n  ['HEVC_8BIT', { codec: 'HEVC', bitDepth: '8BIT' }]\n]);\n\nconst VideoFrameRates = new Set(['23.976FPS', '24FPS', '29.97FPS', '30FPS', '60FPS', '120FPS']);\n\nconst VideoResolutions = new Set(['2K', '4K']);\n\nconst Source = new Set([\n  'BD',\n  'BDRIP',\n  'BLURAY',\n  'BLU-RAY',\n  'BDREMUX',\n  'UHDBDRIP',\n  'DVD',\n  'DVD5',\n  'DVD9',\n  'DVD-R2J',\n  'DVDRIP',\n  'DVD-RIP',\n  'R2DVD',\n  'R2J',\n  'R2JDVD',\n  'R2JDVDRIP',\n  'HDTV',\n  'HDTVRIP',\n  'TVRIP',\n  'TV-RIP',\n  'WEB',\n  'WEBCAST',\n  'WEBDL',\n  'WEB-DL',\n  'WEBRIP',\n  'WEB-RIP',\n  'WEB-MKV',\n  'MASTERRIP',\n  'DISC1', // TODO: volume [雪飄工作室][アイカツプラネット！/Aikatsu_Planet!/偶像活動星球][BDrip][Disc1](檢索:偶活/愛活)\n  'DISC2',\n  'DISC3',\n  'DISC4',\n  'DISC5',\n  'DISC6',\n  'DISC7',\n  'DISC8',\n  'DISC9'\n]);\n\n// MARK: 语言,字幕等\n\nconst Platfroms = new Set([\n  'Baha',\n  'Bili',\n  'Bilibili',\n  'BiliBili',\n  'B-Global',\n  'ABEMA',\n  'CR',\n  'AT-X',\n  'AT-X版',\n  'ViuTV',\n  'AMZN',\n  'ADN',\n  'Sentai',\n  'Netflix',\n  'NF'\n]);\n\nconst Variants = new Set([\n  '日配版',\n  '中配版',\n  '日文配音',\n  '中文配音',\n  'Chinese Audio',\n  'Japanese Audio',\n  'JPN Audio',\n  'Japanese Dub',\n  'JP Dub',\n  'English Audio',\n  'English Dub'\n]);\n\nconst SubtitleFormatTerms = new Map([\n  ['ASS', 'ASS'],\n  ['ASSX2', 'ASSx2'],\n  ['ASSX3', 'ASSx3'],\n  ['ASSX4', 'ASSx4'],\n  ['HARDSUB', 'HARDSUB'],\n  ['HARDSUBS', 'HARDSUB'],\n  ['SOFTSUB', 'SOFTSUB'],\n  ['SOFTSUBS', 'SOFTSUB'],\n  ['SUB', 'SUB'],\n  ['SUBBED', 'SUB'],\n  ['SUBTITLED', 'SUB'],\n  ['SRT', 'SRT'],\n  ['SRTX2', 'SRTx2'],\n  ['SRTX3', 'SRTx3'],\n  ['SRTX4', 'SRTx4']\n]);\n\nconst SubtitleEncodingTerms = new Map<\n  string,\n  { format?: string; encoding?: string; encodings?: string[] }\n>([\n  ['GB&BIG5', { encodings: ['GB', 'BIG5'] }],\n  ['BIG5&GB', { encodings: ['BIG5', 'GB'] }],\n  ['外挂GB/BIG5', { format: '外挂', encodings: ['GB', 'BIG5'] }],\n  ['GB/BIG5', { encodings: ['GB', 'BIG5'] }],\n  ['GB', { encoding: 'GB' }],\n  ['BIG5', { encoding: 'BIG5' }]\n]);\n\nconst PlatformLanguageTerms = new Map([\n  ['ViuTV粵語', ['ViuTV', '粵語']],\n  ['TVB粵語', ['TVB', '粵語']]\n]);\n\nconst LanguageSubtitleFormatTerms = new Map<string, { language: string; format?: string }>([\n  ['代理商粵語', { language: '粵語' }],\n  ['粵日雙語+內封繁體中文字幕', { language: '繁體中文', format: '內封字幕' }],\n  ['粵語+無對白字幕', { language: '粵語+無對白' }]\n]);\n\nconst SubtitleLanguageTerms = new Map([\n  ['CN', 'CN'],\n  ['CHS', 'CHS'],\n  ['CHT', 'CHT'],\n  ['YUE', 'YUE'],\n  ['JPN', 'JPN'],\n  ['JP', 'JP'],\n  ['简体', '简体'],\n  ['简/繁·日', '简/繁·日'],\n  ['繁/體', '繁/體'],\n  ['简繁', '简繁'],\n  ['国语中字', '国语中字'],\n  ['繁體', '繁體'],\n  ['中日双语', '中日双语'],\n  ['繁日双语', '繁日双语'],\n  ['简日双语', '简日双语'],\n  ['繁日雙語', '繁日雙語'],\n  ['HOY粵語', 'HOY粵語'],\n  ['外挂CHS/CHT', 'CHS/CHT'],\n  ['外挂繁简日字幕', '繁简日']\n]);\n\nconst SubtitleLanguagePrefixes = [\n  '简繁日双语',\n  '简繁日语',\n  '简繁英日',\n  '简繁日英',\n  '简繁日',\n  '简日双语',\n  '简/繁',\n  '简繁英',\n  '简繁泰',\n  '繁简日',\n  '中日英',\n  '简日',\n  '简繁',\n  '簡繁',\n  '简英',\n  '繁體',\n  '繁体',\n  '繁日',\n  '繁英',\n  '英文',\n  '简体',\n  '简',\n  '繁',\n  '英'\n];\n\nconst SubtitleFormatSuffixTerms = new Map([\n  ['内嵌字幕', '内嵌字幕'],\n  ['内嵌', '内嵌'],\n  ['內嵌', '內嵌'],\n  ['内封字幕', '内封字幕'],\n  ['内封', '内封'],\n  ['內封', '內封'],\n  ['外挂字幕', '外挂字幕'],\n  ['外挂', '外挂'],\n  ['外掛', '外掛'],\n  ['内挂', '内挂'],\n  ['字幕', undefined]\n]);\n\n// MARK; 其他标签\n\nconst OtherTags = new Set([\n  //\n  'RAW',\n  'DUB',\n  'DUBBED',\n  'retake',\n  'SNS',\n  //\n  '全歌曲特效',\n  '无水印',\n  '含副音轨',\n  '特典',\n  'LIVE纯享',\n  '无损重制',\n  '广播剧_Dream☆Arch', // TODO: no hardcode\n  //\n  '国漫',\n  'Donghua',\n  //\n  '特別版',\n  '先行版',\n  '先行版本',\n  '正片先行版',\n  '正式版',\n  '正式版本',\n  '放送版',\n  '修订版',\n  '修訂版',\n  'On-air version',\n  //\n  '年齡限制版',\n  //\n  'Ani-One',\n  //\n  '僅限港澳台',\n  '僅限港澳台地區',\n  '僅限港澳臺地區',\n  '仅限港澳台',\n  '仅限港澳台地区',\n  //\n  '重播',\n  //\n  'End',\n  'END',\n  'TV + Movie Fin',\n  'FIN',\n  'Fin'\n]);\n\n// Prefix\nconst SearchPrefix = [\n  '检索:',\n  '检索：',\n  '檢索:',\n  '檢索：',\n  '检索用:',\n  '检索用：',\n  '檢索用:',\n  '檢索用：'\n];\n\nconst HiringPrefix = ['招募', '急募', '字幕社招人', '字幕社招人'];\n\nconst OtherPrefix = ['▶'];\n\nconst Ignores = new Set(['务必查看bt站简介', '请看bt站简介', '添加日语', '添加日語']);\n\n// MARK: 解析逻辑\n\nexport function matchSingleTag(ctx: Context, text: string) {\n  text = text.trim();\n\n  const upper = text.toUpperCase();\n\n  // Match keywords\n  {\n    const info = AudioCompoundTerms.get(upper);\n    if (info) {\n      if (info.codec) {\n        ctx.update3('file', 'audio', 'codec', info.codec);\n      }\n      if (info.channels) {\n        ctx.update3('file', 'audio', 'channels', info.channels);\n      }\n      if (info.trackCount) {\n        ctx.update3('file', 'audio', 'trackCount', info.trackCount);\n      }\n      return true;\n    }\n  }\n  if (AudioChannels.has(upper)) {\n    ctx.update3('file', 'audio', 'channels', text);\n    return true;\n  }\n  if (AudioCodecs.has(upper)) {\n    ctx.update3('file', 'audio', 'codec', text);\n    return true;\n  }\n  if (AudioLanguages.has(upper)) {\n    ctx.update3('file', 'audio', 'language', text);\n    return true;\n  }\n  {\n    const info = VideoCompoundTerms.get(upper);\n    if (info) {\n      if (info.codec) {\n        ctx.update3('file', 'video', 'codec', info.codec);\n      }\n      if (info.bitDepth) {\n        ctx.update3('file', 'video', 'bitDepth', info.bitDepth);\n      }\n      if (info.resolution) {\n        ctx.update3('file', 'video', 'resolution', info.resolution);\n      }\n      if (info.audioCodec) {\n        ctx.update3('file', 'audio', 'codec', info.audioCodec);\n      }\n      return true;\n    }\n  }\n  if (VideoCodecs.has(upper)) {\n    ctx.update3('file', 'video', 'codec', text);\n    return true;\n  }\n  if (VideoBitDepths.has(upper)) {\n    ctx.update3('file', 'video', 'bitDepth', text);\n    return true;\n  }\n  if (VideoFormats.has(upper)) {\n    ctx.update3('file', 'video', 'format', text);\n    return true;\n  }\n  if (VideoQualities.has(upper)) {\n    ctx.update3('file', 'video', 'quality', text);\n    return true;\n  }\n  if (VideoResolutionTerms.has(upper)) {\n    ctx.update3('file', 'video', 'resolution', text);\n    return true;\n  }\n  if (VideoFrameRates.has(upper)) {\n    ctx.update3('file', 'video', 'fps', text);\n    return true;\n  }\n  {\n    const res = /^(AI)(\\d{3,4}[Pp])$/i.exec(text);\n    if (res) {\n      ctx.update3('file', 'video', 'enhancement', res[1]);\n      ctx.update3('file', 'video', 'resolution', res[2]);\n      return true;\n    }\n  }\n  {\n    const res = /^(\\d{3,5}(?:[Pp]|[Xx×]\\d{3,5}))@(\\d+(?:\\.\\d+)?FPS)$/i.exec(text);\n    if (res) {\n      ctx.update3('file', 'video', 'resolution', res[1]);\n      ctx.update3('file', 'video', 'fps', res[2]);\n      return true;\n    }\n  }\n  {\n    const res = /^(\\d{3,4}P)(高帧率)$/i.exec(text);\n    if (res) {\n      ctx.update3('file', 'video', 'resolution', res[1]);\n      ctx.update3('file', 'video', 'frameRateMode', res[2]);\n      return true;\n    }\n  }\n  if (/^\\d{3,4}P$/i.test(text) || /^\\d{3,5}[Xx×]\\d{3,5}$/.test(text)) {\n    ctx.update3('file', 'video', 'resolution', text);\n    return true;\n  }\n  if (VideoResolutions.has(upper)) {\n    ctx.update3('file', 'video', 'resolution', text);\n    return true;\n  }\n  if (Source.has(upper)) {\n    ctx.update('source', text);\n    return true;\n  }\n  if (Platfroms.has(text)) {\n    ctx.update('platform', text);\n    return true;\n  }\n  if (Types.has(upper)) {\n    ctx.update('type', text);\n    return true;\n  }\n  if (Variants.has(text)) {\n    const variants = [...(ctx.result.variants ?? []), text];\n    ctx.update('variants', variants);\n    return true;\n  }\n  if (FileExtensions.has(upper)) {\n    ctx.update2('file', 'extension', text);\n    return true;\n  }\n  if (OtherTags.has(text)) {\n    ctx.tags.push(text.trim());\n    return true;\n  }\n  if (text.endsWith('.ver')) {\n    ctx.tags.push(text.trim());\n    return true;\n  }\n  if (text.startsWith('Bloomy_Cafe')) {\n    ctx.tags.push(text.trim());\n    return true;\n  }\n  if (Ignores.has(text)) {\n    return true;\n  }\n\n  // tmdbid=1406607\n  {\n    const res = /^tmdbid=(.+)$/.exec(text);\n    if (res) {\n      ctx.update('tmdbId', res[1]);\n      return true;\n    }\n  }\n\n  // 抚物语 ...\n  {\n    const res = /^.+(物语|物語)$/.exec(text);\n    if (res) {\n      ctx.tags.push(text);\n      return true;\n    }\n  }\n\n  // Match language and subtitles\n  {\n    const appendSubtitleLanguage = (language: string) => {\n      const languages = [...(ctx.result.subtitle?.languages ?? []), language];\n      ctx.update2('subtitle', 'languages', languages);\n    };\n\n    const updateSubtitleFormat = (format: string | undefined, overwrite = false) => {\n      if (format && (overwrite || !ctx.result.subtitle?.format)) {\n        ctx.update2('subtitle', 'format', format);\n      }\n    };\n\n    const updateSubtitleEncoding = (encoding: string | undefined) => {\n      if (encoding && !ctx.result.subtitle?.encoding && !ctx.result.subtitle?.encodings) {\n        ctx.update2('subtitle', 'encoding', encoding);\n      }\n    };\n\n    const updateSubtitleEncodings = (encodings: string[] | undefined) => {\n      if (!encodings) {\n        return;\n      }\n      const values = [...(ctx.result.subtitle?.encodings ?? []), ...encodings];\n      ctx.update2('subtitle', 'encodings', values);\n      if (ctx.result.subtitle?.encoding) {\n        delete ctx.result.subtitle.encoding;\n      }\n    };\n\n    const language = SubtitleLanguageTerms.get(upper) ?? SubtitleLanguageTerms.get(text);\n    if (language) {\n      appendSubtitleLanguage(language);\n      return true;\n    }\n\n    const format = SubtitleFormatTerms.get(upper);\n    if (format) {\n      updateSubtitleFormat(format);\n      return true;\n    }\n\n    const encodingInfo = SubtitleEncodingTerms.get(upper) ?? SubtitleEncodingTerms.get(text);\n    if (encodingInfo) {\n      updateSubtitleFormat(encodingInfo.format, true);\n      updateSubtitleEncoding(encodingInfo.encoding);\n      updateSubtitleEncodings(encodingInfo.encodings);\n      return true;\n    }\n\n    const languageWithFormat = LanguageSubtitleFormatTerms.get(text);\n    if (languageWithFormat) {\n      appendSubtitleLanguage(languageWithFormat.language);\n      updateSubtitleFormat(languageWithFormat.format);\n      return true;\n    }\n\n    const platformLanguage = PlatformLanguageTerms.get(text);\n    if (platformLanguage) {\n      const [platform, language] = platformLanguage;\n      ctx.update('platform', platform);\n      appendSubtitleLanguage(language);\n      return true;\n    }\n\n    for (const prefix of SubtitleLanguagePrefixes) {\n      if (text.startsWith(prefix)) {\n        const suffix = text.slice(prefix.length);\n        if (suffix === '' || SubtitleFormatSuffixTerms.has(suffix)) {\n          appendSubtitleLanguage(prefix);\n          updateSubtitleFormat(SubtitleFormatSuffixTerms.get(suffix));\n          return true;\n        }\n      }\n    }\n  }\n\n  // Match regex\n  {\n    {\n      // 2024年10月番\n      const match = /^(\\d\\d\\d\\d)年(\\d\\d?)月新?番$/.exec(text);\n      if (match) {\n        const year = +match[1];\n        const month = +match[2];\n        if (1949 <= year && year <= 2099) {\n          ctx.update('year', year);\n        }\n        if (1 <= month && month <= 12) {\n          ctx.update('month', month);\n        }\n        return true;\n      }\n    }\n    {\n      // ★10月新番 ★04月新番★\n      const match = /^★?(\\d{1,2})月新?番★?$/.exec(text);\n      if (match) {\n        const month = +match[1];\n        if (1 <= month && month <= 12) {\n          ctx.update('month', month);\n        }\n        return true;\n      }\n    }\n    {\n      // [2024.12.15]\n      const match = /^(\\d\\d\\d\\d)\\.(\\d?\\d)\\.(\\d?\\d)$/.exec(text);\n      if (match) {\n        const year = +match[1];\n        const month = +match[2];\n        if (1949 <= year && year <= 2099) {\n          ctx.update('year', year);\n        }\n        if (1 <= month && month <= 12) {\n          ctx.update('month', month);\n        }\n        return true;\n      }\n    }\n    {\n      // [2024SP]\n      const match = /^(\\d\\d\\d\\d)(SP)$/.exec(text);\n      if (match) {\n        const year = +match[1];\n        const type = match[2];\n        if (1949 <= year && year <= 2099) {\n          ctx.update('year', year);\n        }\n        ctx.update('type', type);\n        return true;\n      }\n    }\n    {\n      // v2\n      const match = /^[vV](\\d+)$/.exec(text);\n      if (match) {\n        const version = +match[1];\n        ctx.update('version', version);\n        return true;\n      }\n    }\n  }\n\n  // Match prefix\n  {\n    for (const prefix of SearchPrefix) {\n      if (text.startsWith(prefix)) {\n        const title = text.slice(prefix.length).trim();\n        ctx.update(\n          'search',\n          title\n            .split('/')\n            .map((t) => t.trim())\n            .filter(Boolean)\n        );\n        return true;\n      }\n    }\n    for (const prefix of HiringPrefix) {\n      if (text.startsWith(prefix)) {\n        return true;\n      }\n    }\n    for (const prefix of OtherPrefix) {\n      if (text.startsWith(prefix)) {\n        ctx.tags.push(text.trim());\n        return true;\n      }\n    }\n  }\n\n  // Match vol.1\n  {\n    const res = /^(?:Vol|vol|Volume|volume)\\.?\\s*(?<vol>\\d+)$/.exec(text);\n    if (res) {\n      const vol = res.groups?.vol ? +res.groups.vol : NaN;\n      if (!Number.isNaN(vol)) {\n        ctx.update2('volume', 'number', vol);\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nexport function matchMultipleTags(\n  ctx: Context,\n  text: string,\n  TagSeperators = [' ', '_', '&', '+']\n) {\n  for (const sep of TagSeperators) {\n    const parts = text.split(sep);\n    if (parts.length <= 1) continue;\n    let matched = true;\n    for (let i = 0; i < parts.length; i += 1) {\n      const part = parts[i];\n      if (!matchSingleTag(ctx, part)) {\n        matched = false;\n      }\n    }\n    if (matched) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction parseWrappedTag(ctx: Context, token: Token) {\n  if (token.isWrapped) {\n    const text = token.text;\n    if (matchSingleTag(ctx, text)) {\n      return true;\n    }\n    if (matchEpiodes(ctx, text)) {\n      return true;\n    }\n    if (matchMultipleTags(ctx, text)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport function parsePrefixWrappedTags(ctx: Context) {\n  while (ctx.left < ctx.right) {\n    if (parseWrappedTag(ctx, ctx.tokens[ctx.left])) {\n      ctx.left += 1;\n    } else if (ctx.tokens[ctx.left].trim().toString() === '') {\n      ctx.left += 1;\n    } else {\n      break;\n    }\n  }\n}\n\nexport function parseSuffixWrappedTags(ctx: Context) {\n  while (ctx.left < ctx.right) {\n    if (parseWrappedTag(ctx, ctx.tokens[ctx.right])) {\n      ctx.right -= 1;\n    } else if (ctx.tokens[ctx.right].trim().toString() === '') {\n      ctx.right -= 1;\n    } else {\n      // Unknown tags\n      const isIgnoreLast = () => {\n        const token = ctx.tokens[ctx.tokens.length - 1];\n        if (SearchPrefix.some((prefix) => token.text.startsWith(prefix))) {\n          return true;\n        }\n        if (HiringPrefix.some((prefix) => token.text.startsWith(prefix))) {\n          return true;\n        }\n        if (Ignores.has(token.text)) {\n          return true;\n        }\n        return false;\n      };\n\n      if (\n        // xxx [未知标签]\n        (ctx.left + 2 < ctx.right && ctx.right === ctx.tokens.length - 1) ||\n        // xxx [未知标签](检索用)\n        (ctx.right === ctx.tokens.length - 2 && isIgnoreLast())\n      ) {\n        ctx.tags.push(ctx.tokens[ctx.right].text.trim());\n        ctx.right -= 1;\n      } else {\n        break;\n      }\n    }\n  }\n}\n\nexport function parsePrefixTextTags(ctx: Context) {\n  if (ctx.left > ctx.right) return false;\n\n  const token = ctx.tokens[ctx.left];\n  const trimmed = parsePrefixTextInlineTags(ctx, token.text);\n\n  if (trimmed !== token.text) {\n    if (trimmed) {\n      ctx.tokens[ctx.left] = new Token(trimmed, token.left, token.right);\n    } else {\n      ctx.left += 1;\n    }\n    return true;\n  }\n\n  return false;\n}\n\nexport function parsePrefixTextInlineTags(ctx: Context, text: string) {\n  text = text.trim();\n  {\n    // ★10月新番\n    const match = /^★?(\\d\\d?)月新?番★?/.exec(text);\n    if (match) {\n      const matched = match[0];\n      const month = +match[1];\n      ctx.update('month', month);\n      text = text.slice(matched.length);\n    }\n  }\n  {\n    // ★剧场版★\n    const match = /^★?(剧场版|劇場版)★?/.exec(text);\n    if (match) {\n      const matched = match[0];\n      const type = match[1];\n      ctx.update('type', type);\n      text = text.slice(matched.length);\n    }\n  }\n  {\n    // ★老番★\n    const match = /^★?(老番)★?/.exec(text);\n    if (match) {\n      const matched = match[0];\n      // const type = match[1];\n      text = text.slice(matched.length);\n    }\n  }\n  return text;\n}\n\nexport function parseSuffixTextInlineTags(ctx: Context, text: string) {\n  let changed = 0;\n\n  const tokens = tokenize(text);\n\n  while (tokens.length > 1) {\n    const token = tokens[tokens.length - 1].trim();\n    if (parseWrappedTag(ctx, token)) {\n      changed += 1;\n      tokens.pop();\n    } else {\n      break;\n    }\n  }\n\n  if (changed) {\n    return tokens.map((t) => t.toString()).join('');\n  }\n\n  return text;\n}\n\n/**\n * Handle inline space splitted tags:\n *\n * @example【極影字幕社】★10月新番 在地下城尋求邂逅是否搞錯了什麼 第五季 豐饒的女神篇 第06話 BIG5 1080P MP4（字幕社招人內詳）\n */\nexport function parseSuffixTextInlineMultipleTags(\n  ctx: Context,\n  text: string,\n  separators = [' ', '★']\n) {\n  text = text.trim();\n  {\n    for (const sep of separators) {\n      const parts = text.split(sep);\n      if (parts.length > 1) {\n        let changed = 0;\n        while (parts.length > 1) {\n          const part = parts[parts.length - 1];\n          // Skip single number\n          if (/^\\d+$/.test(part)) {\n            break;\n          }\n          if (\n            matchSingleTag(ctx, part) ||\n            matchEpiodes(ctx, part) ||\n            matchMultipleTags(ctx, part)\n          ) {\n            changed++;\n            parts.pop();\n          } else {\n            break;\n          }\n        }\n        if (changed > 1) {\n          const trimmed = parts.join(sep);\n          text = trimmed;\n        }\n        if (changed > 0) {\n          break;\n        }\n      }\n    }\n  }\n  return text;\n}\n","import type { Context } from './context.js';\n\nimport { parseSuffixTextInlineTags } from './keyword.js';\nimport { parseSuffixTextInlineSeason } from './episodes.js';\n\ninterface SplitOptions {\n  // /**\n  //  * @default false\n  //  */\n  // nest?: boolean;\n\n  /**\n   * @default true\n   */\n  space?: boolean;\n\n  /**\n   * @default \"['/', '-']\"\n   */\n  separators?: string[];\n}\n\nfunction splitMultipleTitles(ctx: Context, options?: SplitOptions) {\n  const { space = true, separators = ['/', '-'] } = options ?? {};\n\n  const rest = ctx.tokens.slice(ctx.left, ctx.right + 1);\n  if (rest.length === 0) return [];\n\n  // [xxx][yyy] 已经被分割好了\n  if (rest.length > 1 && rest.every((t) => t.isWrapped)) {\n    return rest.map((r) => r.text.trim());\n  }\n\n  // \"xxx\" 或者 \"[xxx]\" 内的内容为一个整体 或者 \"xxx [yyy] zzz\" 被当成一个整体\n  const fullText =\n    rest.length === 1\n      ? rest[0].text.trim()\n      : rest\n          .map((t) => t.toString())\n          .join('')\n          .trim();\n\n  if (!fullText) return [];\n\n  for (const separator of separators) {\n    const parts = space ? fullText.split(` ${separator} `) : fullText.split(separator);\n    const result: string[] = [];\n\n    if (fullText.startsWith(separator) && parts.length > 0) {\n      parts[0] += separator;\n    }\n    if (fullText.endsWith(separator) && parts.length > 0) {\n      parts[parts.length - 1] += separator;\n    }\n\n    for (let i = 0; i < parts.length; i += 1) {\n      if (!space && separator === '/' && i + 1 < parts.length) {\n        if (\n          // Fate/Grand Order 命运/冠位指定\n          parts[i].toUpperCase().endsWith('FATE') ||\n          parts[i].toUpperCase().endsWith('命运') ||\n          parts[i].toUpperCase().endsWith('命運') ||\n          // Ramma 1/2 22/7\n          (/\\d$/.test(parts[i]) && /^\\d/.test(parts[i + 1]))\n        ) {\n          result.push(parts[i] + separator + parts[i + 1]);\n          i += 1;\n          continue;\n        }\n      }\n\n      result.push(parts[i]);\n    }\n\n    if (result.length > 1) {\n      return result.map((t) => t.trim());\n    }\n  }\n\n  return [fullText.trim()];\n}\n\nexport function parseSingleTitleText(ctx: Context, text: string) {\n  // [ANi]  ATRI -My Dear Moments-（僅限港澳台） - 07 [1080P][Bilibili][WEB-DL][AAC AVC][CHT CHS][MP4]\n  text = parseSuffixTextInlineTags(ctx, text).trimEnd();\n  text = parseSuffixTextInlineSeason(ctx, text).trimEnd();\n  text = parseSuffixTextInlineTags(ctx, text).trimEnd();\n  return text;\n}\n\nexport function parseMultipleTitles(ctx: Context, options?: SplitOptions) {\n  const titles = splitMultipleTitles(ctx, options);\n  if (titles.length === 0) return [];\n\n  const trimmedTitles = titles.map((t) => parseSingleTitleText(ctx, t)).filter(Boolean);\n  const trimmedTitle = trimmedTitles[0];\n\n  ctx.update('title', trimmedTitle);\n\n  const otherTitles = [...new Set(trimmedTitles)].filter((t) => t !== trimmedTitle);\n  if (otherTitles.length > 0) {\n    ctx.update('titles', otherTitles);\n  }\n\n  return [trimmedTitle, ...otherTitles];\n}\n\nexport function parseSingleTitle(ctx: Context) {\n  const rest = ctx.tokens.slice(ctx.left, ctx.right + 1);\n  if (rest.length === 0) return '';\n\n  const fullText =\n    rest.length === 1\n      ? rest[0].text.trim()\n      : rest\n          .map((t) => t.toString())\n          .join('')\n          .trim();\n\n  const title = parseSingleTitleText(ctx, fullText);\n  if (title) {\n    ctx.update('title', title);\n  }\n\n  return title;\n}\n","import type { Context } from './context.js';\n\nconst FansubTags = new Set(['個人製作合集', '代发', '羊圈个人译制']);\n\nexport const enum Fansub {\n  Kirara_Fantasia = 'Kirara Fantasia',\n  ANi = 'ANi',\n  LoliHouse = 'LoliHouse',\n  绿茶字幕组 = '绿茶字幕组',\n  桜都字幕组 = '桜都字幕组',\n  Prejudice_Studio = 'Prejudice-Studio',\n  沸班亚马制作组 = '沸班亚马制作组',\n  喵萌奶茶屋 = '喵萌奶茶屋',\n  猎户发布组 = '猎户发布组',\n  爱恋字幕社 = '爱恋字幕社',\n  拨雪寻春 = '拨雪寻春',\n  雪飄工作室 = '雪飄工作室(FLsnow)',\n  幻樱字幕组 = '幻樱字幕组',\n  GMTeam = 'GMTeam',\n  三明治摆烂组 = '三明治摆烂组',\n  星空字幕组 = '星空字幕组',\n  北宇治字幕组 = '北宇治字幕组',\n  极影字幕社 = '极影字幕社',\n  MingYSub = 'MingYSub',\n  黑白字幕组 = '黑白字幕组',\n  S1百综字幕组 = 'S1百综字幕组'\n}\n\nexport function parseFansub(ctx: Context) {\n  // [個人製作合集][fansub] ...\n  const tags: string[] = [];\n  while (ctx.left <= ctx.right && FansubTags.has(ctx.tokens[ctx.left].text)) {\n    tags.push(ctx.tokens[ctx.left].text);\n    ctx.left += 1;\n  }\n  if (tags.length > 0) {\n    ctx.update2('fansub', 'tags', tags);\n  }\n\n  if (ctx.left + 1 > ctx.right) {\n    return false;\n  }\n\n  // [fansub] ...\n  const token = ctx.tokens[ctx.left];\n  if (token.isWrapped) {\n    const text = token.text;\n\n    // @hack jibaketa\n    if (text.startsWith('jibaketa合成&') || text === 'jibaketa') {\n      ctx.update2('fansub', 'name', 'jibaketa');\n      if (text !== 'jibaketa') {\n        ctx.update2('fansub', 'alias', text);\n      }\n      ctx.left += 1;\n      return true;\n    }\n\n    let found = false;\n    const seps = ['&', '＆', '·'];\n    for (const sep of seps) {\n      const [name, ...collab] = text\n        .split(sep)\n        .map((t) => t.trim())\n        .filter(Boolean);\n\n      if (collab.length > 0) {\n        found = true;\n        if (\n          ctx.result.fansub?.name &&\n          ctx.result.fansub.name !== name &&\n          !collab.includes(ctx.result.fansub.name)\n        ) {\n          ctx.update2('fansub', 'alias', name);\n        } else {\n          ctx.update2('fansub', 'name', name);\n        }\n        ctx.update2('fansub', 'collab', collab);\n        break;\n      }\n    }\n\n    if (!found) {\n      if (ctx.result.fansub?.name && ctx.result.fansub.name !== text) {\n        ctx.update2('fansub', 'alias', text);\n      } else {\n        ctx.update2('fansub', 'name', text);\n      }\n    }\n\n    ctx.left += 1;\n\n    return true;\n  }\n\n  return false;\n}\n","import type { ParseOptions, ParseResult } from './types.js';\n\nimport { Context } from './context.js';\nimport { tokenize } from './tokenizer/index.js';\nimport { parseFileExtension } from './file.js';\nimport { parseMultipleTitles } from './title.js';\nimport { Fansub, parseFansub } from './fansub.js';\nimport { parseSuffixEpisodes } from './episodes.js';\nimport { parsePrefixTextTags, parsePrefixWrappedTags, parseSuffixWrappedTags } from './keyword.js';\n\nconst parsers: Record<string, (context: Context) => ParseResult | undefined> = {\n  [Fansub.Kirara_Fantasia]: (ctx) => {\n    // [黒ネズミたち] 關於我在無意間被隔壁的天使變成廢柴這件事 2 / Otonari no Tenshi-sama 2 - 01 (Baha 1920x1080 AVC AAC MP4)\n    parseFansub(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n    parseMultipleTitles(ctx);\n    return ctx.normalize();\n  },\n  [Fansub.ANi]: (ctx) => {\n    // [ANi] Classroom of the Elite S2 -  歡迎來到實力至上主義的教室 第二季 - 02 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]\n    // [ANi] Tasogare Out Focus /  黃昏光影 - 08 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]\n    parseFansub(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n\n    const titles = parseMultipleTitles(ctx);\n    if (titles.length === 2) {\n      ctx.update('title', titles[1]);\n      ctx.update('titles', [titles[0]]);\n    }\n\n    return ctx.normalize();\n  },\n  [Fansub.LoliHouse]: (ctx) => {\n    parseFansub(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n    parseMultipleTitles(ctx, { space: false, separators: ['/'] });\n\n    // Postprocess\n\n    if (ctx.result.titles && ctx.result.episodesRange) {\n      const title = ctx.result.titles.at(-1);\n      if (title && title.endsWith(' -')) {\n        ctx.result.titles[ctx.result.titles.length - 1] = title.slice(0, title.length - 2);\n      }\n    }\n\n    // 在地下城寻求邂逅是否搞错了什么2 + season 2 -> 在地下城寻求邂逅是否搞错了什么\n    if (ctx.result.title && ctx.result.season?.number) {\n      const title = ctx.result.title;\n      const season = ctx.result.season.number;\n      if (\n        title.length >= 2 &&\n        +title[title.length - 1] === season &&\n        !/\\d/.test(title[title.length - 2])\n      ) {\n        ctx.result.title = ctx.result.title.slice(0, title.length - `${season}`.length);\n      }\n    }\n\n    // [花语字幕组&LoliHouse][清恋][Seiren][07][WebRip 1920x1080 HEVC AAC][繁日外挂字幕] v2\n    if (ctx.tags) {\n      ctx.tags.filter((tag) => {\n        const res = /^[vV](\\d+)$/.exec(tag)?.[1];\n        if (res) {\n          ctx.update('version', +res);\n          return false;\n        } else {\n          return true;\n        }\n      });\n    }\n\n    return ctx.normalize();\n  },\n  [Fansub.绿茶字幕组]: (ctx) => {\n    parseFansub(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n    parseMultipleTitles(ctx, { space: false, separators: ['/'] });\n    return ctx.normalize();\n  },\n  [Fansub.桜都字幕组]: (ctx) => {\n    parseFansub(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n    parseMultipleTitles(ctx, { space: false });\n    return ctx.normalize();\n  },\n  [Fansub.Prejudice_Studio]: (ctx) => {\n    parseFansub(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n    parseMultipleTitles(ctx, { space: false, separators: ['/'] });\n    return ctx.normalize();\n  },\n  [Fansub.喵萌奶茶屋]: (ctx) => {\n    parseFansub(ctx);\n    parsePrefixTextTags(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n    parseMultipleTitles(ctx, { space: false, separators: ['/'] });\n    return ctx.normalize();\n  },\n  [Fansub.雪飄工作室]: (ctx) => {\n    parseFansub(ctx);\n    parsePrefixWrappedTags(ctx);\n    parseSuffixWrappedTags(ctx);\n    parseSuffixEpisodes(ctx);\n    parseMultipleTitles(ctx, { space: false, separators: ['/'] });\n    return ctx.normalize();\n  },\n  [Fansub.三明治摆烂组]: (ctx) => {\n    parseFansub(ctx);\n    parseSuffixWrappedTags(ctx);\n\n    // hack: [三明治摆烂组&Pre-S] 与游戏中心的少女异文化交流的故事 / Game Center Shoujo to Ibunka Kouryuu - 06.5 总集篇(S00E01) - [繁日内嵌][H264 1080P](检索：游乐场少女的异文化交流)\n    if (\n      ctx.left <= ctx.right &&\n      ctx.tokens[ctx.right].text === ' - ' &&\n      !ctx.tokens[ctx.right].isWrapped\n    ) {\n      ctx.right -= 1;\n    }\n\n    parseSuffixEpisodes(ctx);\n\n    // hack: [三明治摆烂组&Pre-S] 与游戏中心的少女异文化交流的故事 / Game Center Shoujo to Ibunka Kouryuu - 06.5 总集篇(S00E01) - [繁日内嵌][H264 1080P](检索：游乐场少女的异文化交流)\n    if (\n      ctx.left <= ctx.right &&\n      ctx.result.episode &&\n      ctx.result.season &&\n      ctx.tokens[ctx.right].text.endsWith(' 总集篇')\n    ) {\n      const { episode, season } = ctx.result;\n      ctx.result.episode = undefined;\n      parseSuffixEpisodes(ctx);\n      ctx.result.episode = episode;\n      ctx.result.season = season;\n    }\n\n    parseMultipleTitles(ctx);\n\n    return ctx.normalize();\n  }\n};\n\nexport function parse(title: string, options: ParseOptions = {}): ParseResult | undefined {\n  if (!title) return undefined;\n\n  const file = parseFileExtension(title);\n\n  const tokens = tokenize(file.title);\n  if (tokens.length === 0) return undefined;\n\n  let fansub = options.fansub;\n\n  const ctx = new Context(tokens, options);\n  if (file.extension) {\n    ctx.update2('file', 'extension', file.extension);\n  }\n\n  const parser = fansub ? parsers[fansub] : undefined;\n\n  // Use pre-defined parser\n  if (parser) {\n    const result = parser(ctx);\n    return result;\n  }\n\n  // Fallback to default parser\n\n  // 1. Parse fansub\n  parseFansub(ctx);\n  if (!fansub) {\n    fansub = ctx.result.fansub?.name;\n  }\n  if (!fansub) {\n    return undefined;\n  }\n\n  if (parsers[fansub]) {\n    // Re-run with parser\n    return parse(title, { ...options, fansub });\n  }\n\n  // Parse left tags\n  parsePrefixWrappedTags(ctx);\n  parsePrefixTextTags(ctx);\n\n  // 2. Parse right tags\n  parseSuffixWrappedTags(ctx);\n  parseSuffixEpisodes(ctx);\n\n  // 3. Parse title\n  const titles = parseMultipleTitles(ctx);\n  if (titles.length === 0) {\n    return undefined;\n  }\n\n  // 4. Postprocess\n  const result = ctx.normalize();\n\n  return result;\n}\n"],"names":["language","format","Fansub","result"],"mappings":"AAKO,MAAM,OAAA,CAAQ;AAAA;AAAA,EAEZ,IAAA,GAAO,CAAA;AAAA;AAAA,EAGP,KAAA;AAAA,EAEA,MAAA;AAAA,EAEA,OAAA;AAAA,EAEA,MAAA;AAAA,EAEA,IAAA;AAAA,EAEA,WAAA,CAAY,QAAiB,OAAA,EAAuB;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,MAAA,GAAS,CAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,EAAC;AACb,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEO,MAAA,CAAqC,KAAS,KAAA,EAAwB;AAC3E,IAAA,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EACrB;AAAA,EAEO,OAAA,CAGL,IAAA,EAAU,IAAA,EAAU,KAAA,EAAsC;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAEtB,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAI,EAAC;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,CAAA,GAAI,KAAA;AAAA,EAC5B;AAAA,EAEO,OAAA,CAIL,IAAA,EAAU,IAAA,EAAU,IAAA,EAAU,KAAA,EAAoD;AAClF,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAEtB,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAI,EAAC;AAAA,IACvB;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAE5B,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,IAAI,EAAC;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,OAAO,IAAI,CAAA,CAAE,IAAI,CAAA,CAAE,IAAI,CAAA,GAAI,KAAA;AAAA,EAClC;AAAA,EAEA,IAAW,UAAA,GAAa;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,IAAW,KAAK,MAAA,CAAO,QAAA,IAAY,KAAK,MAAA,CAAO,aAAA;AAAA,EACpE;AAAA,EAEO,SAAA,GAAqC;AAC1C,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,OAAO,IAAA,GAAO,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,EAAC,EAAI,GAAG,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW;AACnC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,SAAA;AACxC,MAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,SAAA,GAAY,kBAAA,CAAmB,SAAS,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ;AAChC,MAAA,IAAA,CAAK,OAAO,QAAA,CAAS,MAAA,GAAS,wBAAwB,IAAA,CAAK,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,IACnF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,QAAA,EAAU;AAClC,MAAA,IAAA,CAAK,OAAO,QAAA,CAAS,QAAA,GAAW,0BAA0B,IAAA,CAAK,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,IACzF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW;AACnC,MAAA,IAAA,CAAK,OAAO,QAAA,CAAS,SAAA,GAAY,2BAA2B,IAAA,CAAK,MAAA,CAAO,SAAS,SAAS,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,IAAA,EAAM;AACpB,MAAA,iBAAA,CAAkB,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,MAAA,IAAA,CAAK,MAAA,CAAO,WAAW,CAAC,GAAG,IAAI,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,IAAS,KAAK,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACrD,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAIA,SAAS,wBAAwB,MAAA,EAAwB;AACvD,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,MAAM,KAAA,GAAQ,kBAAkB,OAAO,CAAA;AAQvC,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA;AACtD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,IAAI,CAAC,CAAA,GAAI,GAAG,GAAA,CAAI,CAAC,EAAE,WAAA,EAAa,mBAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,GAAK,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,aAAa,CAAA,YAAA,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,IAAI,cAAc,IAAA,CAAK,KAAK,KAAK,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AAC/D,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7B,IAAA,OAAO,oBAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,IAAI,0BAAA,CAA2B,IAAA,CAAK,KAAK,CAAA,IAAK,YAAY,cAAA,EAAM;AAC9D,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAQ,UAAA,CAAW,QAAA,EAAK,QAAG,CAAA,CAAE,UAAA,CAAW,UAAK,QAAG,CAAA;AACzD;AAEA,SAAS,0BAA0B,QAAA,EAA0B;AAC3D,EAAA,MAAM,KAAA,GAAQ,kBAAkB,QAAQ,CAAA;AAOxC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAQ;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,2BAA2B,SAAA,EAA+B;AACjE,EAAA,MAAM,aAAa,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,yBAAyB,CAAC,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAM,MAAM,CAAA;AAO3B,EAAA,OAAO;AAAA,IACL,GAAG,MAAM,MAAA,CAAO,CAAC,aAAa,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,IACzD,GAAG,SAAA,CAAU,GAAA,CAAI,yBAAyB,CAAA,CAAE,MAAA,CAAO,CAAC,QAAA,KAAa,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC;AAAA,GAC9F;AACF;AAIA,SAAS,kBAAkB,IAAA,EAAgB;AACzC,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,kBAAA,CAAmB,KAAK,KAAK,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,kBAAA,CAAmB,KAAK,KAAK,CAAA;AAAA,EAC/B;AACF;AAEA,SAAS,mBAAmB,KAAA,EAAuC;AACjE,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,KAAA,CAAM,QAAA,GAAW,sBAAA,CAAuB,KAAA,CAAM,QAAQ,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,KAAA,CAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAA,CAAM,KAAK,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,KAAA,CAAM,QAAA,GAAW,sBAAA,CAAuB,KAAA,CAAM,QAAQ,CAAA;AAAA,EACxD;AACF;AAEA,SAAS,mBAAmB,KAAA,EAAuC;AACjE,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,KAAA,CAAM,QAAA,GAAW,iBAAA,CAAkB,KAAA,CAAM,QAAQ,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,KAAA,CAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAA,CAAM,KAAK,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,MAAM,WAAA,EAAa;AACrB,IAAA,KAAA,CAAM,WAAA,GAAc,iBAAA,CAAkB,KAAA,CAAM,WAAW,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,KAAA,CAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,MAAM,GAAA,EAAK;AACb,IAAA,KAAA,CAAM,GAAA,GAAM,kBAAA,CAAmB,KAAA,CAAM,GAAG,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,CAAM,OAAA,GAAU,iBAAA,CAAkB,KAAA,CAAM,OAAO,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,KAAA,CAAM,UAAA,GAAa,wBAAA,CAAyB,KAAA,CAAM,UAAU,CAAA;AAAA,EAC9D;AACF;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAClC;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAClC;AAEA,SAAS,oBAAoB,KAAA,EAAuB;AAClD,EAAA,MAAM,KAAA,GAAQ,kBAAkB,KAAK,CAAA;AAQrC,EAAA,MAAM,MAAA,uBAAa,GAAA,CAAI;AAAA,IACrB,CAAC,OAAO,KAAK,CAAA;AAAA,IACb,CAAC,OAAO,MAAM,CAAA;AAAA,IACd,CAAC,QAAQ,MAAM,CAAA;AAAA,IACf,CAAC,OAAO,KAAK,CAAA;AAAA,IACb,CAAC,UAAU,QAAQ,CAAA;AAAA,IACnB,CAAC,QAAQ,QAAQ,CAAA;AAAA,IACjB,CAAC,UAAU,QAAQ,CAAA;AAAA,IACnB,CAAC,YAAY,YAAY,CAAA;AAAA,IACzB,CAAC,QAAQ,MAAM,CAAA;AAAA,IACf,CAAC,YAAY,WAAW,CAAA;AAAA,IACxB,CAAC,YAAY,UAAU,CAAA;AAAA,IACvB,CAAC,OAAO,KAAK,CAAA;AAAA,IACb,CAAC,OAAO,KAAK,CAAA;AAAA,IACb,CAAC,QAAQ,MAAM,CAAA;AAAA,IACf,CAAC,QAAQ,MAAM,CAAA;AAAA,IACf,CAAC,UAAU,QAAQ,CAAA;AAAA,IACnB,CAAC,UAAU,QAAQ,CAAA;AAAA,IACnB,CAAC,OAAO,KAAK;AAAA,GACd,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,IAAK,kBAAkB,KAAK,CAAA;AACrD;AAEA,SAAS,oBAAoB,KAAA,EAAuB;AAClD,EAAA,MAAM,KAAA,GAAQ,kBAAkB,KAAK,CAAA;AAQrC,EAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,KAAK,CAAA,EAAG;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,kBAAkB,KAAK,CAAA;AAChC;AAEA,SAAS,uBAAuB,QAAA,EAA0B;AACxD,EAAA,MAAM,KAAA,GAAQ,kBAAkB,QAAQ,CAAA;AAOxC,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;AAEA,SAAS,uBAAuB,QAAA,EAA0B;AACxD,EAAA,MAAM,KAAA,GAAQ,kBAAkB,QAAQ,CAAA;AAMxC,EAAA,IAAI,KAAA,KAAU,WAAA,IAAe,KAAA,KAAU,YAAA,EAAc;AACnD,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,OAAO,kBAAkB,QAAQ,CAAA;AACnC;AAEA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,MAAM,KAAA,GAAQ,kBAAkB,QAAQ,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,IAAA,CAAK,KAAK,CAAA;AAM3C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,OAAO,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,IAAA,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,kBAAkB,QAAQ,CAAA;AACnC;AAEA,SAAS,mBAAmB,GAAA,EAAqB;AAC/C,EAAA,MAAM,KAAA,GAAQ,kBAAkB,GAAG,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,yBAAA,CAA0B,IAAA,CAAK,KAAK,CAAA;AAMhD,EAAA,OAAO,MAAM,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,GAAA,CAAA,GAAQ,kBAAkB,GAAG,CAAA;AACrD;AAEA,SAAS,yBAAyB,UAAA,EAA4B;AAC5D,EAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAMlC,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AACxC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAClB;AAAA,EACF;AAMA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA;AACpD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,GAAG,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAIA,MAAM,sBAAsB,CAAC,QAAA,EAAK,UAAK,QAAA,EAAK,QAAA,EAAK,UAAK,QAAG,CAAA;AAEzD,SAAS,kBAAkB,QAAA,EAAwC;AACjE,EAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAElC,EAAA,IAAI,qCAAA,CAAsC,IAAA,CAAK,KAAK,CAAA,EAAG;AACrD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,EAAG,sDAAA,CAAuD,IAAA,CAAK,OAAO,CAAA;AAAA,IACtE,MAAA,EAAG,sDAAA,CAAuD,IAAA,CAAK,OAAO,CAAA;AAAA,IACtE,MAAA,EAAG,gDAAA,CAAiD,IAAA,CAAK,OAAO,CAAA;AAAA,IAChE,MAAA,EAAG,gDAAA,CAAiD,IAAA,CAAK,OAAO,CAAA;AAAA,IAChE,MAAA,EAAG,yCAAA,CAA0C,IAAA,CAAK,OAAO,CAAA;AAAA,IACzD,MAAA,EAAG,sCAAA,CAAuC,IAAA,CAAK,OAAO;AAAA,GACxD;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,CAAC,OAAA,CAAQ,MAAA,IAAK,CAAC,OAAA,CAAQ,MAAA,IAAK,CAAC,OAAA,CAAQ,MAAA,EAAG;AACnE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAWA,aAAY,mBAAA,EAAqB;AAC1C,IAAA,IAAI,OAAA,CAAQA,SAAQ,CAAA,EAAG;AACrB,MAAA,SAAA,CAAU,KAAKA,SAAQ,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAC5C;AAEA,SAAS,mBAAmB,SAAA,EAA+B;AACzD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,KAAA,GAAQ,kBAAkB,QAAQ,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,QAAQ,CAAC,IAAA,KAAS,UAAA,CAAW,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AACtC,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,mBAAA,CAAoB,MAAA,CAAO,CAAC,QAAA,KAAa,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA,EAAG,GAAG,OAAO,CAAA;AAC3F;;ACncO,MAAM,KAAA,CAAM;AAAA,EACD,IAAA;AAAA,EAEA,IAAA;AAAA,EAEA,KAAA;AAAA,EAET,WAAA,CAAY,IAAA,EAAc,IAAA,EAAe,KAAA,EAAgB;AAC9D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,IAAW,SAAA,GAAY;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EAC3B;AAAA,EAEO,KAAA,CAAM,OAAe,GAAA,EAAc;AACxC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACvC,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEO,IAAA,GAAO;AACZ,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEO,QAAA,GAAW;AAChB,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,EAAG,KAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,CAAA;AAAA,EAC1D;AACF;AAEO,MAAM,QAAA,uBAAe,GAAA,CAAI;AAAA,EAC9B,CAAC,KAAK,GAAG,CAAA;AAAA,EACT,CAAC,UAAK,QAAG,CAAA;AAAA,EACT,CAAC,KAAK,GAAG,CAAA;AAAA,EACT,CAAC,UAAK,QAAG,CAAA;AAAA,EACT,CAAC,KAAK,GAAG;AACX,CAAC,CAAA;AAE0B,IAAI,GAAA,CAAI,CAAC,GAAG,QAAA,CAAS,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC;AAE3E,SAAS,SAAS,IAAA,EAAc;AACrC,EAAA,MAAM,SAAkB,EAAC;AAEzB,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,IAAA,GAA2B,MAAA;AAC/B,EAAA,IAAI,KAAA,GAA4B,MAAA;AAChC,EAAA,OAAO,MAAA,GAAS,KAAK,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAA,GAAO,KAAK,MAAM,CAAA;AACxB,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAA,CAAO,IAAA,CAAK,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAC1B,UAAA,GAAA,GAAM,EAAA;AAAA,QACR;AACA,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,KAAA,GAAQ,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,MAC3B,CAAA,MAAO;AAEL,QAAA,GAAA,IAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,IAAQ,KAAA,IAAS,IAAA,KAAS,KAAA,EAAO;AAC1C,MAAA,MAAA,CAAO,KAAK,IAAI,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AACvC,MAAA,GAAA,GAAM,EAAA;AACN,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,KAAA,GAAQ,MAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAA,IAAU,CAAA;AAAA,EACZ;AACA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAA,CAAO,IAAA,CAAK,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpC;;AC9EO,MAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EACpC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,mBAAmB,KAAA,EAAe;AAChD,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,KAAA,EAAM;AAE3B,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AACvC,EAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,EAAG,OAAO,EAAE,KAAA,EAAM;AAEnD,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,KAAA,CAAM,GAAG,KAAA,CAAM,KAAK,EAAE,OAAA,EAAQ;AAAA,IAC3C;AAAA,GACF;AACF;;ACzBA,MAAM,iBAAA,GACJ,8MAAA;AACF,MAAM,iBAAA,GAAoB,qDAAA;AAC1B,MAAM,eAAA,GAAkB,kCAAA;AACxB,MAAM,cAAA,GAAiB,mBAAA;AAEvB,MAAM,qBAAA,GACJ,iHAAA;AACF,MAAM,qBAAA,GAAwB,WAAA;AAE9B,MAAM,gBAAA,GAAmB,oCAAA;AACzB,MAAM,qBAAA,GAAwB,mCAAA;AAE9B,MAAM,eAAA,GAAkB,8CAAA;AACxB,MAAM,qBAAA,GACJ,0EAAA;AAEK,SAAS,YAAA,CAAa,KAAc,IAAA,EAAc;AACvD,EAAA,IAAA,GAAO,KAAK,OAAA,EAAQ;AAGpB,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,MAAA,GAAS,IAAI,MAAA,EAAQ,GAAA,IAAQ,IAAI,MAAA,EAAQ,GAAA,IAAQ,IAAI,MAAA,EAAQ,GAAA;AACnE,MAAA,MAAM,KAAK,CAAC,MAAA;AACZ,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AAErB,QAAA,IAAI,QAAQ,EAAA,IAAM,EAAA,IAAM,QAAQ,IAAA,KAAS,MAAA,IAAU,IAAI,UAAA,EAAY;AACjE,UAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AACrB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,EAAE,CAAA;AAGnC,QAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,GAAA,IAAO,CAAC,MAAA,CAAO,MAAM,CAAC,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAG;AACrD,UAAA,GAAA,CAAI,QAAQ,SAAA,EAAW,WAAA,EAAa,CAAC,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,QACrD;AAGA,QAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,OAAA,IAAW,CAAC,MAAA,CAAO,MAAM,CAAC,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AAC7D,UAAA,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,CAAC,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,QAC3C;AAGA,QAAA,IAAI,GAAA,CAAI,QAAQ,IAAA,EAAM;AACpB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK;AAClC,UAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,QACzB;AAGA,QAAA,IAAI,GAAA,CAAI,QAAQ,OAAA,EAAS;AACvB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK;AACrC,UAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,QACrC;AAGA,QAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,IAAU,CAAC,MAAA,CAAO,MAAM,CAAC,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,EAAG;AAC3D,UAAA,MAAM,MAAA,GAAS,CAAC,GAAA,CAAI,MAAA,CAAO,MAAA;AAC3B,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAAA,QACxC;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA;AAEE,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,OAAO,GAAA,GAAM,GAAA;AAChD,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,OAAO,GAAA,GAAM,GAAA;AAChD,MAAA,MAAM,IAAA,GAAO,IAAI,MAAA,EAAQ,IAAA;AACzB,MAAA,IAAI,CAAC,OAAO,KAAA,CAAM,GAAG,KAAK,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AAC5C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,GAAG,CAAA;AACpC,UAAA,GAAA,CAAI,OAAO,UAAA,EAAY;AAAA,YACrB;AAAA,cACE,MAAA,EAAQ,GAAA;AAAA,cACR;AAAA;AACF,WACD,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,OAAO,UAAA,EAAY;AAAA,YACrB;AAAA,cACE,MAAA,EAAQ;AAAA,aACV;AAAA,YACA;AAAA,cACE,MAAA,EAAQ;AAAA;AACV,WACD,CAAA;AAAA,QACH;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA;AAEE,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAI,GAAA,CAAI,CAAC,CAAA,IAAK,CAAC,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AACnC,QAAA,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,CAAC,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,MAC/B;AACA,MAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,OAAO,CAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA;AAEE,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,OAAO,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,OAAO,GAAA,GAAM,GAAA;AACjD,MAAA,MAAM,KAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,OAAO,GAAA,GAAM,GAAA;AAC/C,MAAA,IAAI,CAAC,OAAO,KAAA,CAAM,IAAI,KAAK,CAAC,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AAC5C,QAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AACzC,QAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,IAAA,EAAM,EAAE,CAAA;AAErC,QAAA,MAAM,IAAA,GAAO,IAAI,MAAA,EAAQ,IAAA,GAAO,IAAI,MAAA,CAAO,IAAA,CAAK,MAAK,GAAI,MAAA;AACzD,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,QACzB;AAEA,QAAA,MAAM,iBAAA,GAAoB,IAAI,MAAA,EAAQ,UAAA,GAAa,IAAI,MAAA,CAAO,UAAA,CAAW,MAAK,GAAI,MAAA;AAClF,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,iBAAiB,CAAA;AAEjD,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,OAAA,GAAU,CAAC,KAAA,CAAM,CAAC,CAAA;AACxB,YAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAC1B,cAAA,GAAA,CAAI,MAAA,CAAO,WAAW,OAAO,CAAA;AAC7B,cAAA,GAAA,CAAI,OAAA;AAAA,gBACF,eAAA;AAAA,gBACA,MAAA;AAAA,gBACA,iBAAA,CAAkB,MAAM,CAAA,EAAG,iBAAA,CAAkB,SAAS,KAAA,CAAM,CAAC,EAAE,MAAM;AAAA,eACvE;AAAA,YACF,CAAA,MAAO;AACL,cAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,iBAAiB,CAAA;AAAA,YACxD;AAAA,UACF,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,iBAAiB,CAAA;AAAA,UACxD;AAAA,QACF;AAGA,QAAA,MAAM,OAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAC,GAAA,CAAI,QAAQ,IAAA,GAAO,GAAA;AACpD,QAAA,MAAM,OAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAC,GAAA,CAAI,QAAQ,IAAA,GAAO,GAAA;AACpD,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACvB,UAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,SAAA,EAAW,IAAI,CAAA;AAAA,QAC9C;AACA,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACvB,UAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,OAAA,EAAS,IAAI,CAAA;AAAA,QAC5C;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA;AAEE,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,EAAA,GAAK,CAAC,GAAA,CAAI,CAAC,CAAA;AACjB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,CAAC,CAAA;AACtC,QAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,IAAA,EAAM,EAAE,CAAA;AACrC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,MAAA,GAAS,CAAC,GAAA,CAAI,CAAC,CAAA;AACrB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAEtC,QAAA,MAAM,GAAA,GAAM,IAAI,CAAC,CAAA;AACjB,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA;AAAA,QAC1B;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,UAAU,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,GAAA,CAAI,OAAO,OAAA,GAAU,GAAA;AAC5D,MAAA,MAAM,UAAU,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,GAAA,CAAI,OAAO,OAAA,GAAU,GAAA;AAC5D,MAAA,IAAI,CAAC,OAAO,KAAA,CAAM,OAAO,KAAK,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AACpD,QAAA,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,CAAC,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAG,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAC,CAAA;AAAA,MAClE;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA;AAEE,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,UAAU,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,GAAA,CAAI,OAAO,OAAA,GAAU,GAAA;AAC5D,MAAA,MAAM,UAAU,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,GAAA,CAAI,OAAO,OAAA,GAAU,GAAA;AAC5D,MAAA,IAAI,CAAC,OAAO,KAAA,CAAM,OAAO,KAAK,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AACpD,QAAA,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,MAAA,EAAQ,OAAO,CAAA;AAC3C,QAAA,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,IAAA,EAAM,OAAO,CAAA;AAAA,MAC3C;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,OAAO,GAAA,GAAM,GAAA;AAChD,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,GAAG,CAAA;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,OAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAC,GAAA,CAAI,OAAO,IAAA,GAAO,GAAA;AACnD,MAAA,MAAM,OAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAC,GAAA,CAAI,OAAO,IAAA,GAAO,GAAA;AACnD,MAAA,MAAM,IAAA,GAAO,IAAI,MAAA,EAAQ,IAAA;AACzB,MAAA,IAAI,CAAC,OAAO,KAAA,CAAM,IAAI,KAAK,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9C,QAAA,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AACxC,QAAA,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,IAAA,EAAM,IAAI,CAAA;AACtC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,QAC1C;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,qBAAqB,GAAA,EAAc;AACjD,EAAA,IAAI,IAAI,UAAA,EAAY;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAClC,EAAA,IAAI,MAAM,SAAA,IAAa,YAAA,CAAa,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACpD,IAAA,GAAA,CAAI,KAAA,IAAS,CAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,MAAM,eAAA,GAAkB;AAAA,EACtB,2GAAA;AAAA,EACA,iCAAA;AAAA,EACA,wCAAA;AAAA,EACA;AACF,CAAA;AACA,MAAM,qBAAA,GAAwB,+CAAA;AAEvB,MAAM,KAAA,uBAAY,GAAA,CAAI;AAAA,EAC3B,YAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,4CAAA;AAAA,EACA,4CAAA;AAAA,EACA,4CAAA;AAAA,EACA,4CAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAEA,oBAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,sBAAA;AAAA;AAAA,EAEA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,6BAAA,CAA8B,KAAc,IAAA,EAAc;AACxE,EAAA,IAAI,IAAI,UAAA,EAAY;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAA,GAAO,KAAK,OAAA,EAAQ;AAGpB,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,OAAO,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAC,GAAA,CAAI,OAAO,IAAA,GAAO,GAAA;AACnD,MAAA,MAAM,KAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,GAAA,CAAI,OAAO,EAAA,GAAK,GAAA;AAC7C,MAAA,IAAI,CAAC,OAAO,KAAA,CAAM,IAAI,KAAK,CAAC,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AAC5C,QAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AACzC,QAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,IAAA,EAAM,EAAE,CAAA;AAErC,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AACpC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACtC,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,CAAQ,CAAC,CAAA;AAChC,YAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,EAAG;AAChC,cAAA,GAAA,CAAI,MAAA,CAAO,WAAW,aAAa,CAAA;AACnC,cAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAK;AAC/E,cAAA,IAAI,kBAAA,EAAoB;AACtB,gBAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,kBAAkB,CAAA;AAAA,cACzD;AAAA,YACF,CAAA,MAAO;AACL,cAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,YAC3C;AAAA,UACF,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,UAC3C;AAAA,QACF;AAEA,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,MAAM,eAAA,EAAiB;AAChC,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AACxB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,KAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,QAAQ,GAAA,GAAM,GAAA;AAChD,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AACrB,QAAA,IAAI,GAAA,CAAI,QAAQ,IAAA,EAAM;AACpB,UAAA,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,QACpC;AAEA,QAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAU,EAAE,CAAA;AAGnC,QAAA,MAAM,YAAY,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,QAAQ,GAAA,GAAM,GAAA;AACvD,QAAA,IAAI,SAAA,IAAa,CAAC,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACzC,UAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,WAAA,EAAa,SAAS,CAAA;AAAA,QAC/C;AAGA,QAAA,MAAM,UAAU,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,GAAA,CAAI,OAAO,OAAA,GAAU,GAAA;AAC5D,QAAA,IAAI,OAAA,IAAW,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,UAAA,GAAA,CAAI,MAAA,CAAO,WAAW,OAAO,CAAA;AAAA,QAC/B;AAGA,QAAA,MAAM,SAAS,GAAA,CAAI,MAAA,EAAQ,SAAS,CAAC,GAAA,CAAI,OAAO,MAAA,GAAS,GAAA;AACzD,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAAA,QACxC;AAGA,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,MAC5D;AAGA,MAAA;AACE,QAAA,MAAM,UAAU,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,GAAA,CAAI,OAAO,OAAA,GAAU,GAAA;AAC5D,QAAA,MAAM,UAAU,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,GAAA,CAAI,OAAO,OAAA,GAAU,GAAA;AAC5D,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,IAAK,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,IAAK,OAAA,GAAU,OAAA,EAAS;AACzE,UAAA,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,MAAA,EAAQ,OAAO,CAAA;AAC3C,UAAA,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB,IAAA,EAAM,OAAO,CAAA;AAGzC,UAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAI,CAAA,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AAGvB,MAAA,OAAO,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAM,EAAE,OAAA,EAAQ;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,oBAAoB,GAAA,EAAc;AAChD,EAAA,IAAI,IAAI,UAAA,EAAY;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAQ;AAEhC,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,OAAO,qBAAqB,GAAG,CAAA;AAAA,EACjC,CAAA,MAAO;AACL,IAAA,MAAM,OAAA,GAAU,6BAAA,CAA8B,GAAA,EAAK,IAAI,CAAA;AACvD,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,IAAI,MAAM,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AAClE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAGA,MAAM,yBAAA,GACJ;AAAA,EACE;AAAA,IACE,eAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,IAAA,GAAO,CAAC,GAAA,CAAI,CAAC,CAAA;AACnB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACvB,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,IAAI,CAAA;AAClC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,iBAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,IAAA,GAAO,CAAC,GAAA,CAAI,CAAC,CAAA;AACnB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACvB,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,IAAI,CAAA;AAClC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,uBAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,MAAA,GAAS,CAAC,GAAA,CAAI,CAAC,CAAA;AACrB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,QAAA,IAAI,CAAC,IAAI,MAAA,CAAO,MAAA,EAAQ,UAAU,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ;AACrE,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,kCAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA;AACrC,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,QAAA,IAAI,CAAC,IAAI,MAAA,CAAO,MAAA,EAAQ,UAAU,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ;AACrE,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,yBAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,SAAS,EAAE,KAAA,EAAO,GAAE,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA;AAClC,MAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACnC,QAAA,IAAI,CAAC,IAAI,MAAA,CAAO,MAAA,EAAQ,UAAU,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ;AACrE,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,cAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,MAAA,GAAS,CAAC,GAAA,CAAI,CAAC,CAAA;AACrB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,QAAA,IAAI,CAAC,IAAI,MAAA,CAAO,MAAA,EAAQ,UAAU,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ;AACrE,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,yCAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG,CAAA;AAAA,QACH,MAAA,EAAG;AAAA,OACL;AACA,MAAA,MAAM,OACJ,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,GAC7B,CAAA,GACA,IAAA,CAAK,WAAW,CAAA,GACd,GAAA,CAAI,IAAA,CAAK,CAAC,CAAqB,CAAA,GAC/B,CAAA;AACR,MAAA,MAAM,SAAS,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAqB,CAAA;AAC5D,MAAA,MAAM,MAAA,GAAS,OAAO,EAAA,GAAK,MAAA;AAC3B,MAAA,IAAI,CAAC,IAAI,MAAA,CAAO,MAAA,EAAQ,UAAU,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ;AACrE,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,6CAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,OAAO,GAAA,GAAM,GAAA;AAChD,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,GAAG,CAAA;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,eAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,OAAA,GAAU,CAAC,GAAA,CAAI,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAC1B,QAAA,GAAA,CAAI,MAAA,CAAO,WAAW,OAAO,CAAA;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,kCAAA;AAAA,IACA,CAAC,KAAK,GAAA,KAAQ;AACZ,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,EAAQ,GAAA,IAAO,IAAI,MAAA,EAAQ,GAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,IAAA,KAAS,MAAA,GAAY,CAAC,IAAA,GAAO,GAAA;AAC5C,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,IAAK,IAAI,UAAA,EAAY;AAC3C,QAAA,IAAI,CAAC,IAAI,MAAA,CAAO,MAAA,EAAQ,UAAU,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ;AACrE,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtC,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,MAAA,IAAA,CACG,CAAC,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,KAAS,MAAA,KACzC,IAAA,IAAQ,MAAA,IACR,MAAA,IAAU,IAAA,EACV;AACA,UAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAM,CAAA;AACzB,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA;AAEJ,CAAA;AAEK,SAAS,2BAAA,CAA4B,KAAc,IAAA,EAAc;AACtE,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,GAAG;AACD,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,IAAA,GAAO,KAAK,OAAA,EAAQ;AACpB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,yBAAA,EAA2B;AAChD,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AACxB,MAAA,IAAI,GAAA,IAAO,EAAA,CAAG,GAAA,EAAK,GAAG,CAAA,EAAG;AACvB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,CAAA,QAAS,OAAA;AACT,EAAA,OAAO,IAAA;AACT;;ACtlBA,MAAM,aAAA,uBAAoB,GAAA,CAAI,CAAC,SAAS,KAAA,EAAO,KAAA,EAAO,OAAO,CAAC,CAAA;AAE9D,MAAM,kBAAA,uBAAyB,GAAA,CAAuB;AAAA,EACpD,CAAC,QAAA,EAAU,EAAE,OAAO,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,EAC5C,CAAC,WAAA,EAAa,EAAE,OAAO,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AAAA,EAClD,CAAC,OAAA,EAAS,EAAE,OAAO,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EACzC,CAAC,UAAA,EAAS,EAAE,OAAO,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EACzC,CAAC,OAAA,EAAS,EAAE,OAAO,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EACzC,CAAC,UAAA,EAAS,EAAE,OAAO,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EACzC,CAAC,OAAA,EAAS,EAAE,OAAO,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EACzC,CAAC,UAAA,EAAS,EAAE,OAAO,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EACzC,CAAC,QAAA,EAAU,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,GAAG,CAAA;AAAA,EAC3C,CAAC,WAAA,EAAU,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,GAAG,CAAA;AAAA,EAC3C,CAAC,QAAA,EAAU,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,GAAG,CAAA;AAAA,EAC3C,CAAC,WAAA,EAAU,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,GAAG,CAAA;AAAA,EAC3C,CAAC,QAAA,EAAU,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,GAAG,CAAA;AAAA,EAC3C,CAAC,WAAA,EAAU,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,GAAG;AAC7C,CAAC,CAAA;AAED,MAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,EAC1B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAE1D,MAAM,cAAA,mBAAiB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,SAAS,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,SAAS,CAAC,CAAA;AAExF,MAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,EAC1B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,YAAA,uBAAmB,GAAA,CAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnE,MAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,IAAA,EAAM,IAAI,CAAC,CAAA;AAElD,MAAM,uCAAuB,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAEjD,MAAM,kBAAA,uBAAyB,GAAA,CAAiD;AAAA,EAC9E,CAAC,UAAA,EAAY,EAAE,OAAO,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC/C,CAAC,WAAA,EAAa,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA;AAAA,EACnD,CAAC,YAAA,EAAc,EAAE,OAAO,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAA;AAAA,EACnD,CAAC,oBAAoB,EAAE,KAAA,EAAO,QAAQ,QAAA,EAAU,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,EAC9E,CAAC,oBAAoB,EAAE,KAAA,EAAO,QAAQ,QAAA,EAAU,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,EAC9E,CAAC,YAAA,EAAc,EAAE,OAAO,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAA;AAAA,EACnD,CAAC,WAAA,EAAa,EAAE,OAAO,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AAAA,EACjD,CAAC,WAAA,EAAa,EAAE,OAAO,MAAA,EAAQ,QAAA,EAAU,QAAQ;AACnD,CAAC,CAAA;AAED,MAAM,eAAA,mBAAkB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,SAAS,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AAE9F,MAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAE7C,MAAM,MAAA,uBAAa,GAAA,CAAI;AAAA,EACrB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAID,MAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,QAAA,uBAAe,GAAA,CAAI;AAAA,EACvB,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,CAAC,OAAO,KAAK,CAAA;AAAA,EACb,CAAC,SAAS,OAAO,CAAA;AAAA,EACjB,CAAC,SAAS,OAAO,CAAA;AAAA,EACjB,CAAC,SAAS,OAAO,CAAA;AAAA,EACjB,CAAC,WAAW,SAAS,CAAA;AAAA,EACrB,CAAC,YAAY,SAAS,CAAA;AAAA,EACtB,CAAC,WAAW,SAAS,CAAA;AAAA,EACrB,CAAC,YAAY,SAAS,CAAA;AAAA,EACtB,CAAC,OAAO,KAAK,CAAA;AAAA,EACb,CAAC,UAAU,KAAK,CAAA;AAAA,EAChB,CAAC,aAAa,KAAK,CAAA;AAAA,EACnB,CAAC,OAAO,KAAK,CAAA;AAAA,EACb,CAAC,SAAS,OAAO,CAAA;AAAA,EACjB,CAAC,SAAS,OAAO,CAAA;AAAA,EACjB,CAAC,SAAS,OAAO;AACnB,CAAC,CAAA;AAED,MAAM,qBAAA,uBAA4B,GAAA,CAGhC;AAAA,EACA,CAAC,WAAW,EAAE,SAAA,EAAW,CAAC,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,EACzC,CAAC,WAAW,EAAE,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAI,GAAG,CAAA;AAAA,EACzC,CAAC,qBAAA,EAAa,EAAE,MAAA,EAAQ,cAAA,EAAM,WAAW,CAAC,IAAA,EAAM,MAAM,CAAA,EAAG,CAAA;AAAA,EACzD,CAAC,WAAW,EAAE,SAAA,EAAW,CAAC,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,EACzC,CAAC,IAAA,EAAM,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EACzB,CAAC,MAAA,EAAQ,EAAE,QAAA,EAAU,QAAQ;AAC/B,CAAC,CAAA;AAED,MAAM,qBAAA,uBAA4B,GAAA,CAAI;AAAA,EACpC,CAAC,mBAAA,EAAW,CAAC,OAAA,EAAS,cAAI,CAAC,CAAA;AAAA,EAC3B,CAAC,iBAAA,EAAS,CAAC,KAAA,EAAO,cAAI,CAAC;AACzB,CAAC,CAAA;AAED,MAAM,2BAAA,uBAAkC,GAAA,CAAmD;AAAA,EACzF,CAAC,gCAAA,EAAS,EAAE,QAAA,EAAU,gBAAM,CAAA;AAAA,EAC5B,CAAC,2EAAA,EAAiB,EAAE,UAAU,0BAAA,EAAQ,MAAA,EAAQ,4BAAQ,CAAA;AAAA,EACtD,CAAC,6CAAA,EAAY,EAAE,QAAA,EAAU,mCAAU;AACrC,CAAC,CAAA;AAED,MAAM,qBAAA,uBAA4B,GAAA,CAAI;AAAA,EACpC,CAAC,MAAM,IAAI,CAAA;AAAA,EACX,CAAC,OAAO,KAAK,CAAA;AAAA,EACb,CAAC,OAAO,KAAK,CAAA;AAAA,EACb,CAAC,OAAO,KAAK,CAAA;AAAA,EACb,CAAC,OAAO,KAAK,CAAA;AAAA,EACb,CAAC,MAAM,IAAI,CAAA;AAAA,EACX,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,2BAAS,yBAAO,CAAA;AAAA,EACjB,CAAC,iBAAO,eAAK,CAAA;AAAA,EACb,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,mBAAS,iBAAO,CAAA;AAAA,EACjB,CAAC,uBAAa,SAAS,CAAA;AAAA,EACvB,CAAC,8CAAW,oBAAK;AACnB,CAAC,CAAA;AAED,MAAM,wBAAA,GAA2B;AAAA,EAC/B,gCAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,yBAAA,uBAAgC,GAAA,CAAI;AAAA,EACxC,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,4BAAQ,0BAAM,CAAA;AAAA,EACf,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,gBAAM,cAAI,CAAA;AAAA,EACX,CAAC,gBAAM,MAAS;AAClB,CAAC,CAAA;AAID,MAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA;AAAA,EAExB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAEA,gCAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,oCAAA;AAAA;AAAA;AAAA,EAEA,cAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA,gCAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA;AAAA,EAEA,gCAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,gCAAA;AAAA,EACA,4CAAA;AAAA,EACA,4CAAA;AAAA,EACA,gCAAA;AAAA,EACA,4CAAA;AAAA;AAAA,EAEA,cAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,MAAM,YAAA,GAAe;AAAA,EACnB,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,cAAA,EAAM,cAAA,EAAM,kCAAS,gCAAO,CAAA;AAElD,MAAM,WAAA,GAAc,CAAC,QAAG,CAAA;AAExB,MAAM,OAAA,uBAAc,GAAA,CAAI,CAAC,gDAAa,kCAAA,EAAW,0BAAA,EAAQ,0BAAM,CAAC,CAAA;AAIzD,SAAS,cAAA,CAAe,KAAc,IAAA,EAAc;AACzD,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAEjB,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAG/B,EAAA;AACE,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,KAAK,KAAK,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,KAAK,QAAQ,CAAA;AAAA,MACxD;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,KAAK,UAAU,CAAA;AAAA,MAC5D;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,IAAI,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,IAAI,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA;AACE,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,KAAK,KAAK,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,KAAK,QAAQ,CAAA;AAAA,MACxD;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,KAAK,UAAU,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,MACvD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,IAAI,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAC3B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,IAAI,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,IAAI,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,KAAK,CAAA,EAAG;AACnC,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,QAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,MAAA,GAAA,CAAI,QAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AACjD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,sDAAA,CAAuD,IAAA,CAAK,IAAI,CAAA;AAC5E,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,QAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AACjD,MAAA,GAAA,CAAI,QAAQ,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,QAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AACjD,MAAA,GAAA,CAAI,QAAQ,MAAA,EAAQ,OAAA,EAAS,eAAA,EAAiB,GAAA,CAAI,CAAC,CAAC,CAAA;AACpD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,cAAc,IAAA,CAAK,IAAI,KAAK,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA,EAAG;AAClE,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA,EAAG;AAC/B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,UAAU,IAAI,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,MAAA,CAAO,YAAY,IAAI,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG;AACpB,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,IAAA,MAAM,QAAA,GAAW,CAAC,GAAI,GAAA,CAAI,OAAO,QAAA,IAAY,IAAK,IAAI,CAAA;AACtD,IAAA,GAAA,CAAI,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,WAAA,EAAa,IAAI,CAAA;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACzB,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG;AAClC,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,GAAA,CAAI,CAAC,CAAC,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,IAAI,CAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,sBAAA,GAAyB,CAACA,SAAAA,KAAqB;AACnD,MAAA,MAAM,SAAA,GAAY,CAAC,GAAI,GAAA,CAAI,OAAO,QAAA,EAAU,SAAA,IAAa,EAAC,EAAIA,SAAQ,CAAA;AACtE,MAAA,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,WAAA,EAAa,SAAS,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,MAAM,oBAAA,GAAuB,CAACC,OAAAA,EAA4B,SAAA,GAAY,KAAA,KAAU;AAC9E,MAAA,IAAIA,YAAW,SAAA,IAAa,CAAC,GAAA,CAAI,MAAA,CAAO,UAAU,MAAA,CAAA,EAAS;AACzD,QAAA,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,QAAA,EAAUA,OAAM,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,sBAAA,GAAyB,CAAC,QAAA,KAAiC;AAC/D,MAAA,IAAI,QAAA,IAAY,CAAC,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,YAAY,CAAC,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW;AACjF,QAAA,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,uBAAA,GAA0B,CAAC,SAAA,KAAoC;AACnE,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,CAAC,GAAI,GAAA,CAAI,MAAA,CAAO,UAAU,SAAA,IAAa,EAAC,EAAI,GAAG,SAAS,CAAA;AACvE,MAAA,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAC3C,MAAA,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,QAAA,EAAU;AACjC,QAAA,OAAO,GAAA,CAAI,OAAO,QAAA,CAAS,QAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAW,qBAAA,CAAsB,GAAA,CAAI,KAAK,CAAA,IAAK,qBAAA,CAAsB,IAAI,IAAI,CAAA;AACnF,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,sBAAA,CAAuB,QAAQ,CAAA;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,GAAA,CAAI,KAAK,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,oBAAA,CAAqB,MAAM,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAe,qBAAA,CAAsB,GAAA,CAAI,KAAK,CAAA,IAAK,qBAAA,CAAsB,IAAI,IAAI,CAAA;AACvF,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,oBAAA,CAAqB,YAAA,CAAa,QAAQ,IAAI,CAAA;AAC9C,MAAA,sBAAA,CAAuB,aAAa,QAAQ,CAAA;AAC5C,MAAA,uBAAA,CAAwB,aAAa,SAAS,CAAA;AAC9C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,kBAAA,GAAqB,2BAAA,CAA4B,GAAA,CAAI,IAAI,CAAA;AAC/D,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,sBAAA,CAAuB,mBAAmB,QAAQ,CAAA;AAClD,MAAA,oBAAA,CAAqB,mBAAmB,MAAM,CAAA;AAC9C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA;AACvD,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,CAAC,QAAA,EAAUD,SAAQ,CAAA,GAAI,gBAAA;AAC7B,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC/B,MAAA,sBAAA,CAAuBA,SAAQ,CAAA;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,KAAA,MAAW,UAAU,wBAAA,EAA0B;AAC7C,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACvC,QAAA,IAAI,MAAA,KAAW,EAAA,IAAM,yBAAA,CAA0B,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1D,UAAA,sBAAA,CAAuB,MAAM,CAAA;AAC7B,UAAA,oBAAA,CAAqB,yBAAA,CAA0B,GAAA,CAAI,MAAM,CAAC,CAAA;AAC1D,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA;AACE,IAAA;AAEE,MAAA,MAAM,KAAA,GAAQ,0BAAA,CAA2B,IAAA,CAAK,IAAI,CAAA;AAClD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,CAAC,KAAA,CAAM,CAAC,CAAA;AACrB,QAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,CAAM,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,IAAA,IAAQ,IAAA,EAAM;AAChC,UAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,CAAA,IAAK,KAAA,IAAS,KAAA,IAAS,EAAA,EAAI;AAC7B,UAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,QAC3B;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA;AAEE,MAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAC7C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,CAAM,CAAC,CAAA;AACtB,QAAA,IAAI,CAAA,IAAK,KAAA,IAAS,KAAA,IAAS,EAAA,EAAI;AAC7B,UAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,QAC3B;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA;AAEE,MAAA,MAAM,KAAA,GAAQ,gCAAA,CAAiC,IAAA,CAAK,IAAI,CAAA;AACxD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,CAAC,KAAA,CAAM,CAAC,CAAA;AACrB,QAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,CAAM,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,IAAA,IAAQ,IAAA,EAAM;AAChC,UAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,CAAA,IAAK,KAAA,IAAS,KAAA,IAAS,EAAA,EAAI;AAC7B,UAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,QAC3B;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA;AAEE,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAC1C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,CAAC,KAAA,CAAM,CAAC,CAAA;AACrB,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,IAAA,IAAQ,IAAA,EAAM;AAChC,UAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,QACzB;AACA,QAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AACvB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA;AAEE,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACrC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,OAAA,GAAU,CAAC,KAAA,CAAM,CAAC,CAAA;AACxB,QAAA,GAAA,CAAI,MAAA,CAAO,WAAW,OAAO,CAAA;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA;AACE,IAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,EAAE,IAAA,EAAK;AAC7C,QAAA,GAAA,CAAI,MAAA;AAAA,UACF,QAAA;AAAA,UACA,KAAA,CACG,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO;AAAA,SACnB;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,QAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,8CAAA,CAA+C,IAAA,CAAK,IAAI,CAAA;AACpE,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,GAAA,CAAI,OAAO,GAAA,GAAM,GAAA;AAChD,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,GAAG,CAAA;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAA,CACd,KACA,IAAA,EACA,aAAA,GAAgB,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EACnC;AACA,EAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACvB,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA,EAAG;AAC9B,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAc,KAAA,EAAc;AACnD,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,iBAAA,CAAkB,GAAA,EAAK,IAAI,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,uBAAuB,GAAA,EAAc;AACnD,EAAA,OAAO,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,KAAA,EAAO;AAC3B,IAAA,IAAI,gBAAgB,GAAA,EAAK,GAAA,CAAI,OAAO,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG;AAC9C,MAAA,GAAA,CAAI,IAAA,IAAQ,CAAA;AAAA,IACd,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,EAAE,IAAA,EAAK,CAAE,QAAA,EAAS,KAAM,EAAA,EAAI;AACxD,MAAA,GAAA,CAAI,IAAA,IAAQ,CAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,GAAA,EAAc;AACnD,EAAA,OAAO,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,KAAA,EAAO;AAC3B,IAAA,IAAI,gBAAgB,GAAA,EAAK,GAAA,CAAI,OAAO,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG;AAC/C,MAAA,GAAA,CAAI,KAAA,IAAS,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,KAAK,EAAE,IAAA,EAAK,CAAE,QAAA,EAAS,KAAM,EAAA,EAAI;AACzD,MAAA,GAAA,CAAI,KAAA,IAAS,CAAA;AAAA,IACf,CAAA,MAAO;AAEL,MAAA,MAAM,eAAe,MAAM;AACzB,QAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA;AAC9C,QAAA,IAAI,YAAA,CAAa,KAAK,CAAC,MAAA,KAAW,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AAChE,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,YAAA,CAAa,KAAK,CAAC,MAAA,KAAW,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AAChE,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC3B,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAEA,MAAA;AAAA;AAAA,QAEG,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI,SAAS,GAAA,CAAI,KAAA,KAAU,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,QAE9D,IAAI,KAAA,KAAU,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,KAAK,YAAA;AAAa,QACrD;AACA,QAAA,GAAA,CAAI,IAAA,CAAK,KAAK,GAAA,CAAI,MAAA,CAAO,IAAI,KAAK,CAAA,CAAE,IAAA,CAAK,IAAA,EAAM,CAAA;AAC/C,QAAA,GAAA,CAAI,KAAA,IAAS,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,GAAA,EAAc;AAChD,EAAA,IAAI,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,KAAA,EAAO,OAAO,KAAA;AAEjC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAEzD,EAAA,IAAI,OAAA,KAAY,MAAM,IAAA,EAAM;AAC1B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,GAAI,IAAI,MAAM,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,IAAA,IAAQ,CAAA;AAAA,IACd;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,yBAAA,CAA0B,KAAc,IAAA,EAAc;AACpE,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AACjB,EAAA;AAEE,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,CAAM,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AACzB,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA;AAEE,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AACvB,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA;AAEE,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AAEvB,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,yBAAA,CAA0B,KAAc,IAAA,EAAc;AACpE,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAE5B,EAAA,OAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,EAAE,IAAA,EAAK;AAC7C,IAAA,IAAI,eAAA,CAAgB,GAAA,EAAK,KAAK,CAAA,EAAG;AAC/B,MAAA,OAAA,IAAW,CAAA;AACX,MAAA,MAAA,CAAO,GAAA,EAAI;AAAA,IACb,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,EAAE,QAAA,EAAU,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,IAAA;AACT;;ACj0BA,SAAS,mBAAA,CAAoB,KAAc,OAAA,EAAwB;AACjE,EAAA,MAAM,EAAE,KAAA,GAAQ,IAAA,EAAM,UAAA,GAAa,CAAC,KAAK,GAAG,CAAA,EAAE,GAAI,OAAA,IAAW,EAAC;AAE9D,EAAA,MAAM,IAAA,GAAO,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,IAAA,EAAM,GAAA,CAAI,QAAQ,CAAC,CAAA;AACrD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAG/B,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA,CAAK,MAAM,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,EACtC;AAGA,EAAA,MAAM,QAAA,GACJ,KAAK,MAAA,KAAW,CAAA,GACZ,KAAK,CAAC,CAAA,CAAE,KAAK,IAAA,EAAK,GAClB,KACG,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,QAAA,EAAU,CAAA,CACvB,IAAA,CAAK,EAAE,CAAA,CACP,IAAA,EAAK;AAEd,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAG,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA;AACjF,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,SAAS,UAAA,CAAW,SAAS,CAAA,IAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AACtD,MAAA,KAAA,CAAM,CAAC,CAAA,IAAK,SAAA;AAAA,IACd;AACA,IAAA,IAAI,SAAS,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AACpD,MAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,SAAA;AAAA,IAC7B;AAEA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,MAAA,IAAI,CAAC,KAAA,IAAS,SAAA,KAAc,OAAO,CAAA,GAAI,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvD,QAAA;AAAA;AAAA,UAEE,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,GAAc,QAAA,CAAS,MAAM,CAAA,IACtC,KAAA,CAAM,CAAC,CAAA,CAAE,aAAY,CAAE,QAAA,CAAS,cAAI,CAAA,IACpC,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,cAAI,CAAA;AAAA,UAEnC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC;AAAA,UAChD;AACA,UAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA,GAAI,YAAY,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA;AAC/C,UAAA,CAAA,IAAK,CAAA;AACL,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACtB;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,OAAO,OAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,QAAA,CAAS,IAAA,EAAM,CAAA;AACzB;AAEO,SAAS,oBAAA,CAAqB,KAAc,IAAA,EAAc;AAE/D,EAAA,IAAA,GAAO,yBAAA,CAA0B,GAAA,EAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AACpD,EAAA,IAAA,GAAO,2BAAA,CAA4B,GAAA,EAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AACtD,EAAA,IAAA,GAAO,yBAAA,CAA0B,GAAA,EAAK,IAAI,CAAA,CAAE,OAAA,EAAQ;AACpD,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAA,CAAoB,KAAc,OAAA,EAAwB;AACxE,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAA;AAC/C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEjC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,oBAAA,CAAqB,GAAA,EAAK,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACpF,EAAA,MAAM,YAAA,GAAe,cAAc,CAAC,CAAA;AAEpC,EAAA,GAAA,CAAI,MAAA,CAAO,SAAS,YAAY,CAAA;AAEhC,EAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAI,GAAA,CAAI,aAAa,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,YAAY,CAAA;AAChF,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,GAAA,CAAI,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,CAAC,YAAA,EAAc,GAAG,WAAW,CAAA;AACtC;;ACvGA,MAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,sCAAA,EAAU,cAAA,EAAM,sCAAQ,CAAC,CAAA;AAE9C,IAAW,MAAA,qBAAAE,OAAAA,KAAX;AACL,EAAAA,QAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,QAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,QAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,QAAA,4CAAA,CAAA,GAAU,4CAAA;AACV,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,0BAAA,CAAA,GAAO,0BAAA;AACP,EAAAA,QAAA,gCAAA,CAAA,GAAQ,wCAAA;AACR,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,QAAA,sCAAA,CAAA,GAAS,sCAAA;AACT,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,sCAAA,CAAA,GAAS,sCAAA;AACT,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,QAAA,gCAAA,CAAA,GAAQ,gCAAA;AACR,EAAAA,QAAA,kCAAA,CAAA,GAAU,kCAAA;AArBM,EAAA,OAAAA,OAAAA;AAAA,CAAA,EAAA,MAAA,IAAA,EAAA;AAwBX,SAAS,YAAY,GAAA,EAAc;AAExC,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,OAAO,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,KAAA,IAAS,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACzE,IAAA,IAAA,CAAK,KAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,EAAE,IAAI,CAAA;AACnC,IAAA,GAAA,CAAI,IAAA,IAAQ,CAAA;AAAA,EACd;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,GAAA,CAAI,IAAA,GAAO,CAAA,GAAI,GAAA,CAAI,KAAA,EAAO;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACjC,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAGnB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,uBAAa,CAAA,IAAK,SAAS,UAAA,EAAY;AACzD,MAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA;AACxC,MAAA,IAAI,SAAS,UAAA,EAAY;AACvB,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAAA,MACrC;AACA,MAAA,GAAA,CAAI,IAAA,IAAQ,CAAA;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAK,QAAA,EAAK,MAAG,CAAA;AAC3B,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,CAAC,IAAA,EAAM,GAAG,MAAM,CAAA,GAAI,KACvB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AAEjB,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA,IACE,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,IACnB,GAAA,CAAI,OAAO,MAAA,CAAO,IAAA,KAAS,IAAA,IAC3B,CAAC,OAAO,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EACvC;AACA,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAAA,QACrC,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAAA,QACpC;AACA,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtC,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAI,GAAA,CAAI,OAAO,MAAA,EAAQ,IAAA,IAAQ,IAAI,MAAA,CAAO,MAAA,CAAO,SAAS,IAAA,EAAM;AAC9D,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,IAAA,IAAQ,CAAA;AAEZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;;ACtFA,MAAM,OAAA,GAAyE;AAAA,EAC7E,CAAC,MAAA,CAAO,eAAe,GAAG,CAAC,GAAA,KAAQ;AAEjC,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,GAAG,GAAG,CAAC,GAAA,KAAQ;AAGrB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AAEvB,IAAA,MAAM,MAAA,GAAS,oBAAoB,GAAG,CAAA;AACtC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AAC7B,MAAA,GAAA,CAAI,OAAO,QAAA,EAAU,CAAC,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,SAAS,GAAG,CAAC,GAAA,KAAQ;AAC3B,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,mBAAA,CAAoB,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,GAAG,GAAG,CAAA;AAI5D,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,GAAA,CAAI,OAAO,aAAA,EAAe;AACjD,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,GAAG,EAAE,CAAA;AACrC,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACjC,QAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MACnF;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,MAAA,CAAO,KAAA,IAAS,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACjD,MAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,KAAA;AACzB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,MAAA;AACjC,MAAA,IACE,MAAM,MAAA,IAAU,CAAA,IAChB,CAAC,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,KAAM,MAAA,IAC7B,CAAC,KAAK,IAAA,CAAK,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAC,CAAA,EAClC;AACA,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG,MAAM,CAAA;AAAA,MAChF;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,IAAA,EAAM;AACZ,MAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ;AACvB,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,GAAG,IAAI,CAAC,CAAA;AACvC,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,CAAC,GAAG,CAAA;AAC1B,UAAA,OAAO,KAAA;AAAA,QACT,CAAA,MAAO;AACL,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,8BAAK,GAAG,CAAC,GAAA,KAAQ;AACvB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,mBAAA,CAAoB,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,GAAG,GAAG,CAAA;AAC5D,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,8BAAK,GAAG,CAAC,GAAA,KAAQ;AACvB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,mBAAA,CAAoB,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA;AACzC,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,gBAAgB,GAAG,CAAC,GAAA,KAAQ;AAClC,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,mBAAA,CAAoB,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,GAAG,GAAG,CAAA;AAC5D,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,8BAAK,GAAG,CAAC,GAAA,KAAQ;AACvB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,mBAAA,CAAoB,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,GAAG,GAAG,CAAA;AAC5D,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,8BAAK,GAAG,CAAC,GAAA,KAAQ;AACvB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,IAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,IAAA,mBAAA,CAAoB,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,GAAG,GAAG,CAAA;AAC5D,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB,CAAA;AAAA,EACA,CAAC,MAAA,CAAO,oCAAM,GAAG,CAAC,GAAA,KAAQ;AACxB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,sBAAA,CAAuB,GAAG,CAAA;AAG1B,IAAA,IACE,IAAI,IAAA,IAAQ,GAAA,CAAI,KAAA,IAChB,GAAA,CAAI,OAAO,GAAA,CAAI,KAAK,CAAA,CAAE,IAAA,KAAS,SAC/B,CAAC,GAAA,CAAI,OAAO,GAAA,CAAI,KAAK,EAAE,SAAA,EACvB;AACA,MAAA,GAAA,CAAI,KAAA,IAAS,CAAA;AAAA,IACf;AAEA,IAAA,mBAAA,CAAoB,GAAG,CAAA;AAGvB,IAAA,IACE,IAAI,IAAA,IAAQ,GAAA,CAAI,SAChB,GAAA,CAAI,MAAA,CAAO,WACX,GAAA,CAAI,MAAA,CAAO,MAAA,IACX,GAAA,CAAI,OAAO,GAAA,CAAI,KAAK,EAAE,IAAA,CAAK,QAAA,CAAS,qBAAM,CAAA,EAC1C;AACA,MAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,GAAA,CAAI,MAAA;AAChC,MAAA,GAAA,CAAI,OAAO,OAAA,GAAU,MAAA;AACrB,MAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,OAAA,GAAU,OAAA;AACrB,MAAA,GAAA,CAAI,OAAO,MAAA,GAAS,MAAA;AAAA,IACtB;AAEA,IAAA,mBAAA,CAAoB,GAAG,CAAA;AAEvB,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB;AACF,CAAA;AAEO,SAAS,KAAA,CAAM,KAAA,EAAe,OAAA,GAAwB,EAAC,EAA4B;AACxF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,MAAM,IAAA,GAAO,mBAAmB,KAAK,CAAA;AAErC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAClC,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEhC,EAAA,IAAI,SAAS,OAAA,CAAQ,MAAA;AAErB,EAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AACvC,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,WAAA,EAAa,IAAA,CAAK,SAAS,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,GAAS,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAG1C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAMC,OAAAA,GAAS,OAAO,GAAG,CAAA;AACzB,IAAA,OAAOA,OAAAA;AAAA,EACT;AAKA,EAAA,WAAA,CAAY,GAAG,CAAA;AACf,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,GAAS,GAAA,CAAI,OAAO,MAAA,EAAQ,IAAA;AAAA,EAC9B;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AAEnB,IAAA,OAAO,MAAM,KAAA,EAAO,EAAE,GAAG,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC5C;AAGA,EAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,EAAA,mBAAA,CAAoB,GAAG,CAAA;AAGvB,EAAA,sBAAA,CAAuB,GAAG,CAAA;AAC1B,EAAA,mBAAA,CAAoB,GAAG,CAAA;AAGvB,EAAA,MAAM,MAAA,GAAS,oBAAoB,GAAG,CAAA;AACtC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,EAAU;AAE7B,EAAA,OAAO,MAAA;AACT;;;;"}