{"version":3,"file":"index.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["import assert from 'node:assert';\nimport path from 'node:path';\nimport { Predicate } from 'effect';\nimport fs from 'fs-extra';\nimport globby from 'globby';\n\nimport { concat, mergeDeepRight } from 'ramda';\nimport type Serverless from 'serverless';\nimport type ServerlessPlugin from 'serverless/classes/Plugin';\nimport chokidar from 'chokidar';\nimport anymatch from 'anymatch';\n\nimport {\n  asArray,\n  assertIsString,\n  assertIsSupportedRuntime,\n  buildServerlessV3LoggerFromLegacyLogger,\n  extractFunctionEntries,\n  isNodeMatcherKey,\n  providerRuntimeMatcher,\n} from './helper';\nimport { packExternalModules } from './pack-externals';\nimport { pack, copyPreBuiltResources } from './pack';\nimport { preOffline } from './pre-offline';\nimport { preLocal } from './pre-local';\nimport { bundle } from './bundle';\nimport { BUILD_FOLDER, ONLY_PREFIX, SERVERLESS_FOLDER, WORK_FOLDER } from './constants';\nimport type {\n  ConfigFn,\n  Configuration,\n  SwcFunctionDefinitionHandler,\n  FileBuildResult,\n  FunctionBuildResult,\n  ImprovedServerlessOptions,\n  Plugins,\n  ReturnPluginsFn,\n  ESMPluginsModule,\n} from './types';\nimport { isESMModule } from './utils';\n\nfunction updateFile(op: string, src: string, dest: string) {\n  if (['add', 'change', 'addDir'].includes(op)) {\n    fs.copySync(src, dest, {\n      dereference: true,\n      errorOnExist: false,\n      preserveTimestamps: true,\n      recursive: true,\n    });\n\n    return;\n  }\n\n  if (['unlink', 'unlinkDir'].includes(op)) {\n    fs.removeSync(dest);\n  }\n}\n\nclass SwcServerlessPlugin implements ServerlessPlugin {\n  serviceDirPath: string;\n\n  outputWorkFolder: string | undefined;\n\n  workDirPath: string | undefined;\n\n  outputBuildFolder: string | undefined;\n\n  buildDirPath: string | undefined;\n\n  packageOutputPath: string = SERVERLESS_FOLDER;\n\n  log: ServerlessPlugin.Logging['log'];\n\n  serverless: Serverless;\n\n  options: ImprovedServerlessOptions;\n\n  hooks: ServerlessPlugin.Hooks;\n\n  buildOptions: Configuration | undefined;\n\n  buildResults: FunctionBuildResult[] | undefined;\n\n  /** Used for storing previous swc build results so we can rebuild more efficiently */\n  buildCache: Record<string, FileBuildResult> = {};\n\n  // These are bound to imported functions.\n  packExternalModules: typeof packExternalModules;\n\n  pack: typeof pack;\n\n  copyPreBuiltResources: typeof copyPreBuiltResources;\n\n  preOffline: typeof preOffline;\n\n  preLocal: typeof preLocal;\n\n  bundle: typeof bundle;\n\n  constructor(serverless: Serverless, options: ImprovedServerlessOptions, logging?: ServerlessPlugin.Logging) {\n    this.serverless = serverless;\n    this.options = options;\n    this.log = logging?.log || buildServerlessV3LoggerFromLegacyLogger(this.serverless.cli, this.options.verbose);\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore old versions use servicePath, new versions serviceDir. Types will use only one of them\n    this.serviceDirPath = this.serverless.config.serviceDir || this.serverless.config.servicePath;\n\n    this.packExternalModules = packExternalModules.bind(this);\n    this.pack = pack.bind(this);\n    this.copyPreBuiltResources = copyPreBuiltResources.bind(this);\n    this.preOffline = preOffline.bind(this);\n    this.preLocal = preLocal.bind(this);\n    this.bundle = bundle.bind(this);\n\n    // This tells serverless that this skipSwc property can exist in a function definition, but isn't required.\n    // That way a user could skip a function if they have defined their own artifact, for example.\n    this.serverless.configSchemaHandler.defineFunctionProperties(this.serverless.service.provider.name, {\n      properties: {\n        skipSwc: { type: 'boolean' },\n      },\n    });\n\n    this.hooks = {\n      initialize: async () => {\n        this.init();\n        if (this.buildOptions?.skipBuild) {\n          this.prepare();\n          await this.copyPreBuiltResources();\n        }\n      },\n      'before:run:run': async () => {\n        this.log.verbose('before:run:run');\n        await this.bundle();\n        await this.packExternalModules();\n        await this.copyExtras();\n      },\n      'before:offline:start': async () => {\n        this.log.verbose('before:offline:start');\n        await this.bundle();\n        await this.packExternalModules();\n        await this.copyExtras();\n        await this.preOffline();\n        this.watch();\n      },\n      'before:offline:start:init': async () => {\n        this.log.verbose('before:offline:start:init');\n        await this.bundle();\n        await this.packExternalModules();\n        await this.copyExtras();\n        await this.preOffline();\n        this.watch();\n      },\n      'before:package:createDeploymentArtifacts': async () => {\n        this.log.verbose('before:package:createDeploymentArtifacts');\n        if (this.functionEntries?.length > 0) {\n          await this.bundle();\n          await this.packExternalModules();\n          await this.copyExtras();\n          await this.pack();\n        }\n      },\n      'after:package:createDeploymentArtifacts': async () => {\n        this.log.verbose('after:package:createDeploymentArtifacts');\n        await this.cleanup();\n      },\n      'before:deploy:function:packageFunction': async () => {\n        this.log.verbose('after:deploy:function:packageFunction');\n        await this.bundle();\n        await this.packExternalModules();\n        await this.copyExtras();\n        await this.pack();\n      },\n      'after:deploy:function:packageFunction': async () => {\n        this.log.verbose('after:deploy:function:packageFunction');\n        await this.cleanup();\n      },\n      'before:invoke:local:invoke': async () => {\n        this.log.verbose('before:invoke:local:invoke');\n        await this.bundle();\n        await this.packExternalModules();\n        await this.copyExtras();\n        await this.preLocal();\n      },\n      'after:invoke:local:invoke': async () => {},\n    };\n  }\n\n  private init() {\n    this.buildOptions = this.getBuildOptions();\n    this.outputWorkFolder = this.buildOptions.outputWorkFolder || WORK_FOLDER;\n    this.outputBuildFolder = this.buildOptions.outputBuildFolder || BUILD_FOLDER;\n    this.packageOutputPath = this.options.package || SERVERLESS_FOLDER;\n    this.workDirPath = path.join(this.serviceDirPath, this.outputWorkFolder);\n    this.buildDirPath = path.join(this.workDirPath, this.outputBuildFolder);\n  }\n\n  /**\n   * Checks if the runtime for the given function is nodejs.\n   * If the runtime is not set , checks the global runtime.\n   * @param {Serverless.FunctionDefinitionHandler} func the function to be checked\n   * @returns {boolean} true if the function/global runtime is nodejs; false, otherwise\n   */\n  private isNodeFunction(func: Serverless.FunctionDefinitionHandler): boolean {\n    const runtime = func.runtime || this.serverless.service.provider.runtime;\n    const runtimeMatcher = providerRuntimeMatcher[this.serverless.service.provider.name];\n\n    return isNodeMatcherKey(runtime) && typeof runtimeMatcher?.[runtime] === 'string';\n  }\n\n  /**\n   * Checks if the function has a handler\n   * @param {Serverless.FunctionDefinitionHandler | Serverless.FunctionDefinitionImage} func the function to be checked\n   * @returns {boolean} true if the function has a handler\n   */\n  private isFunctionDefinitionHandler(\n    func: Serverless.FunctionDefinitionHandler | Serverless.FunctionDefinitionImage\n  ): func is Serverless.FunctionDefinitionHandler {\n    return Boolean((func as Serverless.FunctionDefinitionHandler)?.handler);\n  }\n\n  get functions(): Record<string, Serverless.FunctionDefinitionHandler> {\n    const functions = this.options.function\n      ? {\n          [this.options.function]: this.serverless.service.getFunction(this.options.function),\n        }\n      : this.serverless.service.functions;\n\n    const buildOptions = this.getBuildOptions();\n    // ignore all functions with a different runtime than nodejs:\n    const nodeFunctions: Record<string, Serverless.FunctionDefinitionHandler> = {};\n\n    for (const [functionAlias, fn] of Object.entries(functions)) {\n      const currFn = fn as SwcFunctionDefinitionHandler;\n      if (this.isFunctionDefinitionHandler(currFn) && this.isNodeFunction(currFn)) {\n        if (buildOptions.skipBuild && !buildOptions.skipBuildExcludeFns?.includes(functionAlias)) {\n          currFn.skipSwc = true;\n        }\n\n        nodeFunctions[functionAlias] = currFn;\n      }\n    }\n\n    return nodeFunctions;\n  }\n\n  get plugins(): Plugins {\n    if (!this.buildOptions?.plugins) {\n      return [];\n    }\n\n    if (Array.isArray(this.buildOptions.plugins)) {\n      return this.buildOptions.plugins;\n    }\n\n    let plugins: Plugins | ReturnPluginsFn | ESMPluginsModule = require(path.join(\n      this.serviceDirPath,\n      this.buildOptions.plugins\n    ));\n\n    if (isESMModule(plugins)) {\n      plugins = plugins.default;\n    }\n\n    if (typeof plugins === 'function') {\n      return plugins(this.serverless);\n    }\n\n    return plugins;\n  }\n\n  get packagePatterns() {\n    const { service } = this.serverless;\n    const patterns: string[] = [];\n    const ignored: string[] = [];\n\n    for (const pattern of service.package.patterns) {\n      if (pattern.startsWith('!')) {\n        ignored.push(pattern.slice(1));\n      } else {\n        patterns.push(pattern);\n      }\n    }\n\n    for (const fn of Object.values(this.functions)) {\n      const fnPatterns = asArray(fn.package?.patterns).filter(Predicate.isString);\n\n      for (const pattern of fnPatterns) {\n        if (pattern.startsWith('!')) {\n          ignored.push(pattern.slice(1));\n        } else {\n          patterns.push(pattern);\n        }\n      }\n    }\n\n    return { patterns, ignored };\n  }\n\n  private getBuildOptions() {\n    if (this.buildOptions) return this.buildOptions;\n\n    const DEFAULT_BUILD_OPTIONS: Partial<Configuration> = {\n      concurrency: Infinity,\n      zipConcurrency: Infinity,\n      target: 'node',\n      external: [],\n      exclude: ['aws-sdk'],\n      nativeZip: false,\n      packager: 'npm',\n      packagerOptions: {\n        noInstall: false,\n        ignoreLockfile: false,\n      },\n      installExtraArgs: [],\n      watch: {\n        pattern: './**/*.(js|ts)',\n        ignore: [WORK_FOLDER, 'dist', 'node_modules', BUILD_FOLDER],\n        chokidar: {\n          ignoreInitial: true,\n        },\n      },\n      keepOutputDirectory: false,\n      outputFileExtension: '.js',\n      skipBuild: false,\n      skipBuildExcludeFns: [],\n      stripEntryResolveExtensions: false,\n    };\n\n    const providerRuntime = this.serverless.service.provider.runtime;\n\n    assertIsSupportedRuntime(providerRuntime);\n\n    const resolvedOptions = {};\n    const withDefaultOptions = mergeDeepRight(DEFAULT_BUILD_OPTIONS);\n    const withResolvedOptions = mergeDeepRight(withDefaultOptions(resolvedOptions));\n\n    const configPath: string | undefined =\n      this.serverless.service.custom?.swc?.config || this.serverless.service.custom?.swc?.config;\n\n    const config: ConfigFn | undefined = configPath ? require(path.join(this.serviceDirPath, configPath)) : undefined;\n\n    return withResolvedOptions<Configuration>(\n      config\n        ? config(this.serverless)\n        : this.serverless.service.custom?.swc ?? this.serverless.service.custom?.swc ?? {}\n    ) as Configuration;\n  }\n\n  get functionEntries() {\n    return extractFunctionEntries(\n      this.serviceDirPath,\n      this.serverless.service.provider.name,\n      this.functions,\n      this.buildOptions?.resolveExtensions\n    );\n  }\n\n  watch(): void {\n    assert(this.buildOptions, 'buildOptions is not defined');\n\n    const defaultPatterns = asArray(this.buildOptions.watch.pattern).filter(Predicate.isString);\n    const defaultIgnored = asArray(this.buildOptions.watch.ignore).filter(Predicate.isString);\n\n    const { patterns, ignored } = this.packagePatterns;\n\n    const allPatterns: string[] = [...defaultPatterns, ...patterns];\n    const allIgnored: string[] = [...defaultIgnored, ...ignored];\n\n    const options = {\n      ignored: allIgnored,\n      ...this.buildOptions.watch.chokidar,\n    };\n\n    chokidar.watch(allPatterns, options).on('all', (eventName, srcPath) =>\n      this.bundle()\n        .then(() => this.updateFile(eventName, srcPath))\n        .then(() => this.notifyServerlessOffline())\n        .then(() => this.log.verbose('Watching files for changes...'))\n        .catch(() => this.log.error('Bundle error, waiting for a file change to reload...'))\n    );\n  }\n\n  prepare() {\n    assertIsString(this.buildDirPath, 'buildDirPath is not a string');\n    assertIsString(this.workDirPath, 'workDirPath is not a string');\n\n    fs.mkdirpSync(this.buildDirPath);\n    fs.mkdirpSync(path.join(this.workDirPath, SERVERLESS_FOLDER));\n    // exclude serverless-swc\n    this.serverless.service.package = {\n      ...(this.serverless.service.package || {}),\n      patterns: [\n        ...new Set([\n          ...(this.serverless.service.package?.include || []),\n          ...(this.serverless.service.package?.exclude || []).map(concat('!')),\n          ...(this.serverless.service.package?.patterns || []),\n          '!node_modules/serverless-swc',\n        ]),\n      ],\n    };\n\n    for (const fn of Object.values(this.functions)) {\n      const patterns = [\n        ...new Set([\n          ...(fn.package?.include || []),\n          ...(fn.package?.exclude || []).map(concat('!')),\n          ...(fn.package?.patterns || []),\n        ]),\n      ];\n\n      fn.package = {\n        ...(fn.package || {}),\n        ...(patterns.length && { patterns }),\n      };\n    }\n  }\n\n  notifyServerlessOffline() {\n    this.serverless.pluginManager.spawn('offline:functionsUpdated');\n  }\n\n  async updateFile(op: string, filename: string) {\n    assertIsString(this.buildDirPath, 'buildDirPath is not a string');\n\n    const { service } = this.serverless;\n\n    const patterns = asArray(service.package.patterns).filter(Predicate.isString);\n\n    if (\n      !0 ||\n      (patterns.length > 0 &&\n        anymatch(\n          patterns.filter((pattern) => !pattern.startsWith('!')),\n          filename\n        ))\n    ) {\n      const destFileName = path.resolve(path.join(this.buildDirPath, filename));\n\n      updateFile(op, path.resolve(filename), destFileName);\n\n      return;\n    }\n\n    for (const [functionAlias, fn] of Object.entries(this.functions)) {\n      if (fn.package?.patterns?.length === 0) {\n        continue;\n      }\n\n      if (\n        anymatch(\n          asArray(fn.package?.patterns)\n            .filter(Predicate.isString)\n            .filter((pattern) => !pattern.startsWith('!')),\n          filename\n        )\n      ) {\n        const destFileName = path.resolve(path.join(this.buildDirPath, `${ONLY_PREFIX}${functionAlias}`, filename));\n\n        updateFile(op, path.resolve(filename), destFileName);\n\n        return;\n      }\n    }\n  }\n\n  /** Link or copy extras such as node_modules or package.patterns definitions */\n  async copyExtras() {\n    assertIsString(this.buildDirPath, 'buildDirPath is not a string');\n\n    const { service } = this.serverless;\n\n    const packagePatterns = asArray(service.package.patterns).filter(Predicate.isString);\n\n    // include any \"extras\" from the \"patterns\" section\n    if (packagePatterns.length) {\n      const files = await globby(packagePatterns);\n\n      for (const filename of files) {\n        const destFileName = path.resolve(path.join(this.buildDirPath, filename));\n\n        updateFile('add', path.resolve(filename), destFileName);\n      }\n    }\n\n    // include any \"extras\" from the individual function \"patterns\" section\n    for (const [functionAlias, fn] of Object.entries(this.functions)) {\n      const patterns = asArray(fn.package?.patterns).filter(Predicate.isString);\n\n      if (!patterns.length) {\n        continue;\n      }\n\n      const files = await globby(patterns);\n\n      for (const filename of files) {\n        const destFileName = path.resolve(path.join(this.buildDirPath, `${ONLY_PREFIX}${functionAlias}`, filename));\n\n        updateFile('add', path.resolve(filename), destFileName);\n      }\n    }\n  }\n\n  /**\n   * Move built code to the serverless folder, taking into account individual\n   * packaging preferences.\n   */\n  async moveArtifacts(): Promise<void> {\n    assertIsString(this.workDirPath, 'workDirPath is not a string');\n\n    const { service } = this.serverless;\n\n    await fs.copy(path.join(this.workDirPath, SERVERLESS_FOLDER), path.join(this.serviceDirPath, SERVERLESS_FOLDER));\n\n    if (service.package.individually === true || this.options.function) {\n      Object.values(this.functions).forEach((func) => {\n        if (func.package?.artifact) {\n          // eslint-disable-next-line no-param-reassign\n          func.package.artifact = path.join(SERVERLESS_FOLDER, path.basename(func.package.artifact));\n        }\n      });\n\n      return;\n    }\n\n    service.package.artifact = path.join(SERVERLESS_FOLDER, path.basename(service.package.artifact));\n  }\n\n  async cleanup(): Promise<void> {\n    await this.moveArtifacts();\n\n    // Remove temp build folder\n    if (!this.buildOptions?.keepOutputDirectory) {\n      assertIsString(this.workDirPath, 'workDirPath is not a string');\n\n      fs.removeSync(path.join(this.workDirPath));\n    }\n  }\n}\n\nexport = SwcServerlessPlugin;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;cAoBkB;sBACqC;YACF;mBACV;iBACJ;cACL;iBACsD;aAYlD;CAEtC,SAAS,WAAW,IAAY,KAAa,MAAc;AACzD,MAAI;GAAC;GAAO;GAAU;GAAS,CAAC,SAAS,GAAG,EAAE;AAC5C,MAAG,SAAS,KAAK,MAAM;IACrB,aAAa;IACb,cAAc;IACd,oBAAoB;IACpB,WAAW;IACZ,CAAC;AAEF;;AAGF,MAAI,CAAC,UAAU,YAAY,CAAC,SAAS,GAAG,CACtC,IAAG,WAAW,KAAK;;CAIvB,IAAM,sBAAN,MAAsD;EAyCpD,YAAY,YAAwB,SAAoC,SAAoC;4BA9BhF;qBAekB,EAAE;AAgB9C,QAAK,aAAa;AAClB,QAAK,UAAU;AACf,QAAK,MAAM,SAAS,OAAO,wCAAwC,KAAK,WAAW,KAAK,KAAK,QAAQ,QAAQ;AAG7G,QAAK,iBAAiB,KAAK,WAAW,OAAO,cAAc,KAAK,WAAW,OAAO;AAElF,QAAK,sBAAsB,oBAAoB,KAAK,KAAK;AACzD,QAAK,OAAO,KAAK,KAAK,KAAK;AAC3B,QAAK,wBAAwB,sBAAsB,KAAK,KAAK;AAC7D,QAAK,aAAa,WAAW,KAAK,KAAK;AACvC,QAAK,WAAW,SAAS,KAAK,KAAK;AACnC,QAAK,SAAS,OAAO,KAAK,KAAK;AAI/B,QAAK,WAAW,oBAAoB,yBAAyB,KAAK,WAAW,QAAQ,SAAS,MAAM,EAClG,YAAY,EACV,SAAS,EAAE,MAAM,WAAW,EAC7B,EACF,CAAC;AAEF,QAAK,QAAQ;IACX,YAAY,YAAY;AACtB,UAAK,MAAM;AACX,SAAI,KAAK,cAAc,WAAW;AAChC,WAAK,SAAS;AACd,YAAM,KAAK,uBAAuB;;;IAGtC,kBAAkB,YAAY;AAC5B,UAAK,IAAI,QAAQ,iBAAiB;AAClC,WAAM,KAAK,QAAQ;AACnB,WAAM,KAAK,qBAAqB;AAChC,WAAM,KAAK,YAAY;;IAEzB,wBAAwB,YAAY;AAClC,UAAK,IAAI,QAAQ,uBAAuB;AACxC,WAAM,KAAK,QAAQ;AACnB,WAAM,KAAK,qBAAqB;AAChC,WAAM,KAAK,YAAY;AACvB,WAAM,KAAK,YAAY;AACvB,UAAK,OAAO;;IAEd,6BAA6B,YAAY;AACvC,UAAK,IAAI,QAAQ,4BAA4B;AAC7C,WAAM,KAAK,QAAQ;AACnB,WAAM,KAAK,qBAAqB;AAChC,WAAM,KAAK,YAAY;AACvB,WAAM,KAAK,YAAY;AACvB,UAAK,OAAO;;IAEd,4CAA4C,YAAY;AACtD,UAAK,IAAI,QAAQ,2CAA2C;AAC5D,SAAI,KAAK,iBAAiB,SAAS,GAAG;AACpC,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,qBAAqB;AAChC,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,MAAM;;;IAGrB,2CAA2C,YAAY;AACrD,UAAK,IAAI,QAAQ,0CAA0C;AAC3D,WAAM,KAAK,SAAS;;IAEtB,0CAA0C,YAAY;AACpD,UAAK,IAAI,QAAQ,wCAAwC;AACzD,WAAM,KAAK,QAAQ;AACnB,WAAM,KAAK,qBAAqB;AAChC,WAAM,KAAK,YAAY;AACvB,WAAM,KAAK,MAAM;;IAEnB,yCAAyC,YAAY;AACnD,UAAK,IAAI,QAAQ,wCAAwC;AACzD,WAAM,KAAK,SAAS;;IAEtB,8BAA8B,YAAY;AACxC,UAAK,IAAI,QAAQ,6BAA6B;AAC9C,WAAM,KAAK,QAAQ;AACnB,WAAM,KAAK,qBAAqB;AAChC,WAAM,KAAK,YAAY;AACvB,WAAM,KAAK,UAAU;;IAEvB,6BAA6B,YAAY;IAC1C;;EAGH,AAAQ,OAAO;AACb,QAAK,eAAe,KAAK,iBAAiB;AAC1C,QAAK,mBAAmB,KAAK,aAAa,oBAAoB;AAC9D,QAAK,oBAAoB,KAAK,aAAa,qBAAqB;AAChE,QAAK,oBAAoB,KAAK,QAAQ,WAAW;AACjD,QAAK,cAAc,KAAK,KAAK,KAAK,gBAAgB,KAAK,iBAAiB;AACxE,QAAK,eAAe,KAAK,KAAK,KAAK,aAAa,KAAK,kBAAkB;;;;;;;;EASzE,AAAQ,eAAe,MAAqD;GAC1E,MAAM,UAAU,KAAK,WAAW,KAAK,WAAW,QAAQ,SAAS;GACjE,MAAM,iBAAiB,uBAAuB,KAAK,WAAW,QAAQ,SAAS;AAE/E,UAAO,iBAAiB,QAAQ,IAAI,OAAO,iBAAiB,aAAa;;;;;;;EAQ3E,AAAQ,4BACN,MAC8C;AAC9C,UAAO,QAAS,MAA+C,QAAQ;;EAGzE,IAAI,YAAkE;GACpE,MAAM,YAAY,KAAK,QAAQ,WAC3B,GACG,KAAK,QAAQ,WAAW,KAAK,WAAW,QAAQ,YAAY,KAAK,QAAQ,SAAS,EACpF,GACD,KAAK,WAAW,QAAQ;GAE5B,MAAM,eAAe,KAAK,iBAAiB;GAE3C,MAAM,gBAAsE,EAAE;AAE9E,QAAK,MAAM,CAAC,eAAe,OAAO,OAAO,QAAQ,UAAU,EAAE;IAC3D,MAAM,SAAS;AACf,QAAI,KAAK,4BAA4B,OAAO,IAAI,KAAK,eAAe,OAAO,EAAE;AAC3E,SAAI,aAAa,aAAa,CAAC,aAAa,qBAAqB,SAAS,cAAc,CACtF,QAAO,UAAU;AAGnB,mBAAc,iBAAiB;;;AAInC,UAAO;;EAGT,IAAI,UAAmB;AACrB,OAAI,CAAC,KAAK,cAAc,QACtB,QAAO,EAAE;AAGX,OAAI,MAAM,QAAQ,KAAK,aAAa,QAAQ,CAC1C,QAAO,KAAK,aAAa;GAG3B,IAAI,oBAAgE,KAAK,KACvE,KAAK,gBACL,KAAK,aAAa,QACnB,CAAC;AAEF,OAAI,YAAY,QAAQ,CACtB,WAAU,QAAQ;AAGpB,OAAI,OAAO,YAAY,WACrB,QAAO,QAAQ,KAAK,WAAW;AAGjC,UAAO;;EAGT,IAAI,kBAAkB;GACpB,MAAM,EAAE,YAAY,KAAK;GACzB,MAAM,WAAqB,EAAE;GAC7B,MAAM,UAAoB,EAAE;AAE5B,QAAK,MAAM,WAAW,QAAQ,QAAQ,SACpC,KAAI,QAAQ,WAAW,IAAI,CACzB,SAAQ,KAAK,QAAQ,MAAM,EAAE,CAAC;OAE9B,UAAS,KAAK,QAAQ;AAI1B,QAAK,MAAM,MAAM,OAAO,OAAO,KAAK,UAAU,EAAE;IAC9C,MAAM,aAAa,QAAQ,GAAG,SAAS,SAAS,CAAC,OAAO,UAAU,SAAS;AAE3E,SAAK,MAAM,WAAW,WACpB,KAAI,QAAQ,WAAW,IAAI,CACzB,SAAQ,KAAK,QAAQ,MAAM,EAAE,CAAC;QAE9B,UAAS,KAAK,QAAQ;;AAK5B,UAAO;IAAE;IAAU;IAAS;;EAG9B,AAAQ,kBAAkB;AACxB,OAAI,KAAK,aAAc,QAAO,KAAK;GAEnC,MAAM,wBAAgD;IACpD,aAAa;IACb,gBAAgB;IAChB,QAAQ;IACR,UAAU,EAAE;IACZ,SAAS,CAAC,UAAU;IACpB,WAAW;IACX,UAAU;IACV,iBAAiB;KACf,WAAW;KACX,gBAAgB;KACjB;IACD,kBAAkB,EAAE;IACpB,OAAO;KACL,SAAS;KACT,QAAQ;MAAC;MAAa;MAAQ;MAAgB;MAAa;KAC3D,UAAU,EACR,eAAe,MAChB;KACF;IACD,qBAAqB;IACrB,qBAAqB;IACrB,WAAW;IACX,qBAAqB,EAAE;IACvB,6BAA6B;IAC9B;GAED,MAAM,kBAAkB,KAAK,WAAW,QAAQ,SAAS;AAEzD,4BAAyB,gBAAgB;GAIzC,MAAM,sBAAsB,eADD,eAAe,sBAAsB,CADxC,EAAE,CAEoD,CAAC;GAE/E,MAAM,aACJ,KAAK,WAAW,QAAQ,QAAQ,KAAK,UAAU,KAAK,WAAW,QAAQ,QAAQ,KAAK;GAEtF,MAAM,SAA+B,uBAAqB,KAAK,KAAK,KAAK,gBAAgB,WAAW,CAAC,GAAG;AAExG,UAAO,oBACL,SACI,OAAO,KAAK,WAAW,GACvB,KAAK,WAAW,QAAQ,QAAQ,OAAO,KAAK,WAAW,QAAQ,QAAQ,OAAO,EAAE,CACrF;;EAGH,IAAI,kBAAkB;AACpB,UAAO,uBACL,KAAK,gBACL,KAAK,WAAW,QAAQ,SAAS,MACjC,KAAK,WACL,KAAK,cAAc,kBACpB;;EAGH,QAAc;AACZ,UAAO,KAAK,cAAc,8BAA8B;GAExD,MAAM,kBAAkB,QAAQ,KAAK,aAAa,MAAM,QAAQ,CAAC,OAAO,UAAU,SAAS;GAC3F,MAAM,iBAAiB,QAAQ,KAAK,aAAa,MAAM,OAAO,CAAC,OAAO,UAAU,SAAS;GAEzF,MAAM,EAAE,UAAU,YAAY,KAAK;GAEnC,MAAM,cAAwB,CAAC,GAAG,iBAAiB,GAAG,SAAS;GAG/D,MAAM,UAAU;IACd,SAH2B,CAAC,GAAG,gBAAgB,GAAG,QAAQ;IAI1D,GAAG,KAAK,aAAa,MAAM;IAC5B;AAED,YAAS,MAAM,aAAa,QAAQ,CAAC,GAAG,QAAQ,WAAW,YACzD,KAAK,QAAQ,CACV,WAAW,KAAK,WAAW,WAAW,QAAQ,CAAC,CAC/C,WAAW,KAAK,yBAAyB,CAAC,CAC1C,WAAW,KAAK,IAAI,QAAQ,gCAAgC,CAAC,CAC7D,YAAY,KAAK,IAAI,MAAM,uDAAuD,CAAC,CACvF;;EAGH,UAAU;AACR,kBAAe,KAAK,cAAc,+BAA+B;AACjE,kBAAe,KAAK,aAAa,8BAA8B;AAE/D,MAAG,WAAW,KAAK,aAAa;AAChC,MAAG,WAAW,KAAK,KAAK,KAAK,aAAa,kBAAkB,CAAC;AAE7D,QAAK,WAAW,QAAQ,UAAU;IAChC,GAAI,KAAK,WAAW,QAAQ,WAAW,EAAE;IACzC,UAAU,CACR,GAAG,IAAI,IAAI;KACT,GAAI,KAAK,WAAW,QAAQ,SAAS,WAAW,EAAE;KAClD,IAAI,KAAK,WAAW,QAAQ,SAAS,WAAW,EAAE,EAAE,IAAI,OAAO,IAAI,CAAC;KACpE,GAAI,KAAK,WAAW,QAAQ,SAAS,YAAY,EAAE;KACnD;KACD,CAAC,CACH;IACF;AAED,QAAK,MAAM,MAAM,OAAO,OAAO,KAAK,UAAU,EAAE;IAC9C,MAAM,WAAW,CACf,GAAG,IAAI,IAAI;KACT,GAAI,GAAG,SAAS,WAAW,EAAE;KAC7B,IAAI,GAAG,SAAS,WAAW,EAAE,EAAE,IAAI,OAAO,IAAI,CAAC;KAC/C,GAAI,GAAG,SAAS,YAAY,EAAE;KAC/B,CAAC,CACH;AAED,OAAG,UAAU;KACX,GAAI,GAAG,WAAW,EAAE;KACpB,GAAI,SAAS,UAAU,EAAE,UAAU;KACpC;;;EAIL,0BAA0B;AACxB,QAAK,WAAW,cAAc,MAAM,2BAA2B;;EAGjE,MAAM,WAAW,IAAY,UAAkB;AAC7C,kBAAe,KAAK,cAAc,+BAA+B;GAEjE,MAAM,EAAE,YAAY,KAAK;AAER,WAAQ,QAAQ,QAAQ,SAAS,CAAC,OAAO,UAAU,SAAS;GAS3E;IACA,MAAM,eAAe,KAAK,QAAQ,KAAK,KAAK,KAAK,cAAc,SAAS,CAAC;AAEzE,eAAW,IAAI,KAAK,QAAQ,SAAS,EAAE,aAAa;AAEpD;;AAGF,QAAK,MAAM,CAAC,eAAe,OAAO,OAAO,QAAQ,KAAK,UAAU,EAAE;AAChE,QAAI,GAAG,SAAS,UAAU,WAAW,EACnC;AAGF,QACE,SACE,QAAQ,GAAG,SAAS,SAAS,CAC1B,OAAO,UAAU,SAAS,CAC1B,QAAQ,YAAY,CAAC,QAAQ,WAAW,IAAI,CAAC,EAChD,SACD,EACD;KACA,MAAM,eAAe,KAAK,QAAQ,KAAK,KAAK,KAAK,cAAc,GAAG,cAAc,iBAAiB,SAAS,CAAC;AAE3G,gBAAW,IAAI,KAAK,QAAQ,SAAS,EAAE,aAAa;AAEpD;;;;;EAMN,MAAM,aAAa;AACjB,kBAAe,KAAK,cAAc,+BAA+B;GAEjE,MAAM,EAAE,YAAY,KAAK;GAEzB,MAAM,kBAAkB,QAAQ,QAAQ,QAAQ,SAAS,CAAC,OAAO,UAAU,SAAS;AAGpF,OAAI,gBAAgB,QAAQ;IAC1B,MAAM,QAAQ,MAAM,OAAO,gBAAgB;AAE3C,SAAK,MAAM,YAAY,OAAO;KAC5B,MAAM,eAAe,KAAK,QAAQ,KAAK,KAAK,KAAK,cAAc,SAAS,CAAC;AAEzE,gBAAW,OAAO,KAAK,QAAQ,SAAS,EAAE,aAAa;;;AAK3D,QAAK,MAAM,CAAC,eAAe,OAAO,OAAO,QAAQ,KAAK,UAAU,EAAE;IAChE,MAAM,WAAW,QAAQ,GAAG,SAAS,SAAS,CAAC,OAAO,UAAU,SAAS;AAEzE,QAAI,CAAC,SAAS,OACZ;IAGF,MAAM,QAAQ,MAAM,OAAO,SAAS;AAEpC,SAAK,MAAM,YAAY,OAAO;KAC5B,MAAM,eAAe,KAAK,QAAQ,KAAK,KAAK,KAAK,cAAc,GAAG,cAAc,iBAAiB,SAAS,CAAC;AAE3G,gBAAW,OAAO,KAAK,QAAQ,SAAS,EAAE,aAAa;;;;;;;;EAS7D,MAAM,gBAA+B;AACnC,kBAAe,KAAK,aAAa,8BAA8B;GAE/D,MAAM,EAAE,YAAY,KAAK;AAEzB,SAAM,GAAG,KAAK,KAAK,KAAK,KAAK,aAAa,kBAAkB,EAAE,KAAK,KAAK,KAAK,gBAAgB,kBAAkB,CAAC;AAEhH,OAAI,QAAQ,QAAQ,iBAAiB,QAAQ,KAAK,QAAQ,UAAU;AAClE,WAAO,OAAO,KAAK,UAAU,CAAC,SAAS,SAAS;AAC9C,SAAI,KAAK,SAAS,SAEhB,MAAK,QAAQ,WAAW,KAAK,KAAK,mBAAmB,KAAK,SAAS,KAAK,QAAQ,SAAS,CAAC;MAE5F;AAEF;;AAGF,WAAQ,QAAQ,WAAW,KAAK,KAAK,mBAAmB,KAAK,SAAS,QAAQ,QAAQ,SAAS,CAAC;;EAGlG,MAAM,UAAyB;AAC7B,SAAM,KAAK,eAAe;AAG1B,OAAI,CAAC,KAAK,cAAc,qBAAqB;AAC3C,mBAAe,KAAK,aAAa,8BAA8B;AAE/D,OAAG,WAAW,KAAK,KAAK,KAAK,YAAY,CAAC;;;;kBAKvC"}