mono-pub
Version:
Simple tool for publishing your npm packages that live in a monorepo
1 lines • 37 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/utils/path.ts","../src/logger.ts","../src/utils/deps.ts","../src/utils/versions.ts","../src/utils/plugins.ts"],"sourcesContent":["import get from 'lodash/get'\nimport isEqual from 'lodash/isEqual'\nimport { getAllPackages } from '@/utils/path'\nimport getLogger from '@/logger'\nimport { CombinedPlugin } from '@/utils/plugins'\nimport { getDependencies, getExecutionOrder, patchPackageDeps } from '@/utils/deps'\nimport { getNewVersion, versionToString, isPackageChanged } from '@/utils/versions'\n\nimport type {\n MonoPubPlugin,\n MonoPubContext,\n MonoPubOptions,\n PackageInfoWithDependencies,\n ReleaseType,\n CommitInfo,\n BumpedDep,\n ReleasedPackageInfo,\n BasePackageInfo,\n LatestReleasedVersion,\n} from '@/types'\n\nexport type * from '@/types'\n\n/**\n *\n * @param paths {Array<string>} List of globes or paths to packages that need to be released\n * @param plugins {Array<string>} List\n * @param options\n */\nexport default async function publish(\n paths: Array<string>,\n plugins: Array<MonoPubPlugin>,\n options: MonoPubOptions = {}\n) {\n const { stdout = process.stdout, stderr = process.stderr, ignoreDependencies, ...restOptions } = options\n const logger = getLogger({ stdout, stderr })\n const context: MonoPubContext = {\n cwd: process.cwd(),\n env: process.env,\n ignoreDependencies: ignoreDependencies || {},\n ...restOptions,\n logger,\n }\n\n logger.info('Starting releasing process...')\n const packages = await getAllPackages(paths, context.cwd)\n const packagesInfo: Record<string, BasePackageInfo> = Object.assign(\n {},\n ...packages.map((pkg) => ({ [pkg.name]: pkg }))\n )\n if (!packages.length) {\n logger.success('No matching packages found. Exiting...')\n return\n }\n const scopedContexts: Record<string, MonoPubContext> = Object.assign(\n {},\n ...packages.map((pkg) => ({\n [pkg.name]: {\n ...context,\n logger: logger.scope(pkg.name),\n },\n }))\n )\n\n logger.success(\n `Found ${packages.length} packages to release: [${packages.map((pkg) => `\"${pkg.name}\"`).join(', ')}]`\n )\n logger.log('Calculating release order based on packages dependencies and devDependencies...')\n let packagesWithDeps: Record<string, PackageInfoWithDependencies> = {}\n let releaseOrder: Array<BasePackageInfo> = []\n\n try {\n packagesWithDeps = await getDependencies(packages)\n releaseOrder = getExecutionOrder(Object.values(packagesWithDeps), { ignoreDependencies })\n } catch (err) {\n if (err instanceof Error) {\n logger.error(err.message)\n }\n throw err\n }\n\n logger.success(`Packages release order: [${releaseOrder.map((pkg) => `\"${pkg.name}\"`).join(', ')}]`)\n\n logger.success(\n `Found ${plugins.length} plugins to form release chain: [${plugins\n .map((plugin) => `\"${plugin.name}\"`)\n .join(', ')}]`\n )\n logger.log('Starting the process of assembling the release chain')\n const releaseChain = new CombinedPlugin(plugins)\n const success = await releaseChain.setup(context)\n if (!success) {\n throw new Error('Setup was not successful')\n }\n logger.log('Searching for the latest releases...')\n const latestReleases = await releaseChain.getLastRelease(packages, context)\n for (const [packageName, release] of Object.entries(latestReleases)) {\n if (!release) {\n scopedContexts[packageName].logger.log('No previous releases found...')\n } else {\n scopedContexts[packageName].logger.log(\n `Found latest release version: ${release.major}.${release.minor}.${release.patch}`\n )\n }\n }\n\n const newCommits: Record<string, Array<CommitInfo>> = {}\n const releaseTypes: Record<string, ReleaseType> = {}\n const newVersions: Record<string, LatestReleasedVersion> = {}\n\n for (const { name: pkgName } of releaseOrder) {\n const scopedLogger = scopedContexts[pkgName].logger\n\n const latestRelease = get(latestReleases, pkgName, null)\n const commits = await releaseChain.extractCommits(\n { ...packagesInfo[pkgName], latestRelease },\n scopedContexts[pkgName]\n )\n scopedLogger.info(`Found ${commits.length} commits since last release`)\n newCommits[pkgName] = commits\n\n const isDepsChanged = packagesWithDeps[pkgName].dependsOn.some((dep) => releaseTypes[dep.name] !== 'none')\n\n const releaseType = await releaseChain.getReleaseType(commits, isDepsChanged, scopedContexts[pkgName])\n const newVersion = getNewVersion(latestRelease, releaseType)\n releaseTypes[pkgName] = releaseType\n newVersions[pkgName] = newVersion\n\n if (!newVersion || releaseType === 'none') {\n scopedLogger.info(\"There are no relevant changes found, so no new version won't be released\")\n } else if (latestRelease) {\n scopedLogger.info(\n `Found \"${releaseType}\" relevant changes since latest released version (\"${versionToString(\n latestRelease\n )}\"). So the next version of the package is \"${versionToString(newVersion)}\"`\n )\n } else {\n scopedLogger.info(\n `Package has no previous releases, but \"${releaseType}\" relevant changes found, that's why package will be released under \"${versionToString(\n newVersion\n )} version\"`\n )\n }\n }\n\n for (const pkg of Object.values(packagesWithDeps)) {\n if (releaseTypes[pkg.name] === 'none') {\n continue\n }\n scopedContexts[pkg.name].logger.log('Patching package.json with a new version criteria')\n await patchPackageDeps(pkg, newVersions, latestReleases)\n }\n\n const foundPackages = Object.values(packagesWithDeps)\n const changedPackages = foundPackages.filter(({ name }) => {\n const newVersion = newVersions[name]\n const releaseType = releaseTypes[name]\n const oldVersion = latestReleases[name]\n\n return isPackageChanged(newVersion, oldVersion, releaseType)\n })\n\n await releaseChain.prepareAll(\n {\n foundPackages,\n changedPackages,\n },\n context\n )\n\n for (const { name: packageName } of releaseOrder) {\n const newVersion = newVersions[packageName]\n const releaseType = releaseTypes[packageName]\n const oldVersion = latestReleases[packageName]\n if (!isPackageChanged(newVersion, oldVersion, releaseType)) {\n continue\n }\n\n await releaseChain.publish(packagesInfo[packageName], scopedContexts[packageName])\n\n const bumpedDeps: Array<BumpedDep> = []\n\n for (const dep of packagesWithDeps[packageName].dependsOn) {\n const depOldVersion = latestReleases[dep.name]\n const depNewVersion = newVersions[dep.name]\n const depReleaseType = releaseTypes[dep.name]\n if (!depNewVersion || isEqual(depNewVersion, depOldVersion) || depReleaseType === 'none') {\n continue\n }\n bumpedDeps.push({\n ...packagesInfo[dep.name],\n oldVersion: depOldVersion,\n newVersion: depNewVersion,\n releaseType: depReleaseType,\n })\n }\n\n const releasedPackageInfo: ReleasedPackageInfo = {\n ...packagesInfo[packageName],\n oldVersion,\n newVersion,\n releaseType,\n commits: newCommits[packageName],\n bumpedDeps,\n }\n await releaseChain.postPublish(releasedPackageInfo, scopedContexts[packageName])\n scopedContexts[packageName].logger.success('Package is successfully published!')\n }\n}\n","import path from 'path'\nimport fs, { promises as fsPromises } from 'fs'\nimport globby from 'globby'\nimport uniq from 'lodash/uniq'\nimport get from 'lodash/get'\nimport type { BasePackageInfo } from '@/types'\n\ninterface PackageScanInfo {\n name: string | null\n private: boolean\n}\n\nasync function _scanPackage(filePath: string): Promise<PackageScanInfo> {\n const content = await fsPromises.readFile(filePath)\n const pkg = JSON.parse(content.toString())\n const name = get(pkg, 'name', null)\n const privateFieldValue = get(pkg, 'private', false)\n const isPrivate = privateFieldValue === 'true' || privateFieldValue === true\n\n return { private: isPrivate, name }\n}\n\nexport async function getAllPackages(paths: Array<string>, cwd: string): Promise<Array<BasePackageInfo>> {\n const matches = await globby(paths, {\n cwd,\n expandDirectories: false,\n onlyFiles: false,\n absolute: true,\n objectMode: true,\n })\n\n const fileNames: Array<string> = []\n for (const match of matches) {\n if (match.dirent.isFile() && path.basename(match.name) === 'package.json') {\n fileNames.push(match.path)\n } else if (match.dirent.isDirectory()) {\n const fullPath = match.path\n // NOTE: Repo traversal is a part of package logic\n // nosemgrep: javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal\n const pkgPath = path.join(fullPath, 'package.json')\n if (fs.existsSync(pkgPath)) {\n fileNames.push(pkgPath)\n }\n }\n }\n\n const uniqPkgFileNames = uniq(fileNames)\n const packagesInfo = await Promise.all(uniqPkgFileNames.map(_scanPackage))\n\n const result: Array<BasePackageInfo> = []\n\n uniqPkgFileNames.forEach((filename, idx) => {\n const info = packagesInfo[idx]\n if (!info.private && info.name) {\n result.push({ name: info.name, location: filename })\n }\n })\n\n return result\n}\n","import { Signale } from 'signale'\n\ntype GetLoggerLoggerOptions = {\n stdout: NodeJS.WriteStream\n stderr: NodeJS.WriteStream\n}\n\nexport default function getLogger({ stdout, stderr }: GetLoggerLoggerOptions) {\n return new Signale({\n config: { displayTimestamp: true, displayLabel: false },\n types: {\n error: { color: 'red', label: '', stream: [stderr], badge: '✖' },\n log: { color: 'magenta', label: '', stream: [stdout], badge: '•' },\n success: { color: 'green', label: '', stream: [stdout], badge: '✔' },\n info: { color: 'blue', label: '', stream: [stdout], badge: 'ℹ' },\n },\n })\n}\n","import { promises as fsPromises } from 'fs'\nimport get from 'lodash/get'\nimport set from 'lodash/set'\nimport { versionToString, getVersionCriteria } from '@/utils/versions'\n\nimport type {\n BasePackageInfo,\n PackageInfoWithDependencies,\n DependencyInfo,\n LatestPackagesReleases,\n IgnoringDependencies,\n} from '@/types'\n\nexport async function getDependencies(\n packages: Array<BasePackageInfo>\n): Promise<Record<string, PackageInfoWithDependencies>> {\n const packagesNames = packages.map((pkg) => pkg.name)\n const result: Record<string, PackageInfoWithDependencies> = Object.assign(\n {},\n ...packages.map((pkg) => ({ [pkg.name]: { ...pkg, dependsOn: [] } }))\n )\n\n for (const pkg of Object.values(result)) {\n const content = await fsPromises.readFile(pkg.location)\n const json = JSON.parse(content.toString())\n\n const deps = get(json, 'dependencies', {})\n const depsInfo: Array<DependencyInfo> = Object.keys(deps)\n .filter((dep) => packagesNames.includes(dep))\n .map((dep) => ({ name: dep, type: 'dep', value: deps[dep] }))\n pkg.dependsOn.push(...depsInfo)\n\n const devDeps = get(json, 'devDependencies', {})\n const devDepsInfo: Array<DependencyInfo> = Object.keys(devDeps)\n .filter((dep) => packagesNames.includes(dep))\n .map((dep) => ({ name: dep, type: 'devDep', value: devDeps[dep] }))\n pkg.dependsOn.push(...devDepsInfo)\n }\n\n return result\n}\n\ntype ExecutionOrder<T extends boolean | undefined> = T extends true\n ? Array<Array<BasePackageInfo>>\n : Array<BasePackageInfo>\n\ntype TaskPlanningOptions<T extends boolean | undefined> = {\n batching?: T\n ignoreDependencies?: IgnoringDependencies\n}\n\nexport function getExecutionOrder<T extends boolean | undefined = undefined>(\n packages: Array<PackageInfoWithDependencies>,\n options?: TaskPlanningOptions<T>\n): ExecutionOrder<T> {\n const batches: Array<Array<BasePackageInfo>> = []\n const pkgMap = Object.fromEntries(packages.map((pkg) => [pkg.name, pkg]))\n const ignoreDependencies = options?.ignoreDependencies || {}\n\n const dependencies = new Map<string, Array<string>>()\n for (const pkg of packages) {\n const packageIgnoreList = ignoreDependencies[pkg.name] || []\n\n dependencies.set(\n pkg.name,\n pkg.dependsOn.map((dep) => dep.name).filter((name) => !packageIgnoreList.includes(name))\n )\n }\n\n while (dependencies.size > 0) {\n const batch: Array<BasePackageInfo> = []\n for (const [pkgName, pkgDeps] of dependencies) {\n if (pkgDeps.length === 0) {\n batch.push({ name: pkgName, location: pkgMap[pkgName].location })\n dependencies.delete(pkgName)\n }\n }\n\n if (batch.length === 0) {\n throw new Error('The release cannot be done because of cyclic dependencies')\n }\n\n batches.push(batch)\n const includedPackages = batch.map((pkg) => pkg.name)\n for (const [pkgName, pkgDeps] of dependencies) {\n dependencies.set(\n pkgName,\n pkgDeps.filter((depName) => !includedPackages.includes(depName))\n )\n }\n }\n\n if (options?.batching) {\n return batches as ExecutionOrder<T>\n }\n\n return batches.flat() as ExecutionOrder<T>\n}\n\nexport async function patchPackageDeps(\n pkg: PackageInfoWithDependencies,\n newVersions: LatestPackagesReleases,\n latestReleases: LatestPackagesReleases\n): Promise<void> {\n const file = await fsPromises.readFile(pkg.location)\n const packageJson = JSON.parse(file.toString())\n\n const version = newVersions[pkg.name] || latestReleases[pkg.name]\n\n if (!version) {\n throw new TypeError(\n `Unable to patch package version (\"${pkg.name}\"), since it wasn't released before and no relevant changes were introduced`\n )\n }\n\n set(packageJson, 'version', versionToString(version))\n\n for (const dep of pkg.dependsOn) {\n const depsGroup = dep.type === 'dep' ? 'dependencies' : 'devDependencies'\n const depVersion = newVersions[dep.name] ?? latestReleases[dep.name]\n if (!depVersion) {\n throw new TypeError(\n `Unable to patch package dependency (\"${dep.name}\"), since it has no previous versions and relevant changes`\n )\n }\n set(packageJson, [depsGroup, dep.name], getVersionCriteria(dep.value, versionToString(depVersion)))\n }\n\n await fsPromises.writeFile(pkg.location, JSON.stringify(packageJson, null, 2))\n}\n","import isEqual from 'lodash/isEqual'\nimport type { LatestReleasedVersion, ReleaseType, PackageVersion } from '@/types'\n\nconst PATCH_REGEX = /\\d+.\\d+.x/i\nconst MINOR_REGEX = /(?<!\\d+.)\\d+.x/i\n\nexport function versionToString(version: PackageVersion): string {\n return `${version.major}.${version.minor}.${version.patch}`\n}\n\nexport function getNewVersion(latestRelease: LatestReleasedVersion, releaseType: ReleaseType): LatestReleasedVersion {\n if (releaseType === 'none') {\n return latestRelease\n } else if (!latestRelease) {\n return { major: 1, minor: 0, patch: 0 }\n } else if (releaseType === 'major') {\n return { major: latestRelease.major + 1, minor: 0, patch: 0 }\n } else if (releaseType === 'minor') {\n return { major: latestRelease.major, minor: latestRelease.minor + 1, patch: 0 }\n } else {\n return { ...latestRelease, patch: latestRelease.patch + 1 }\n }\n}\n\nexport function getVersionCriteria(currentVersion: string, newVersion: string) {\n if (currentVersion.includes('~') || PATCH_REGEX.test(currentVersion)) {\n return `~${newVersion}`\n }\n if (currentVersion.includes('^') || MINOR_REGEX.test(currentVersion)) {\n return `^${newVersion}`\n }\n return newVersion\n}\n\nexport function isPackageChanged(\n newVersion: LatestReleasedVersion,\n oldVersion: LatestReleasedVersion,\n releaseType: ReleaseType\n): newVersion is NonNullable<PackageVersion> {\n return !(releaseType === 'none' || !newVersion || isEqual(newVersion, oldVersion))\n}\n","import { getExecutionOrder } from '@/utils'\n\nimport type {\n MonoPubPlugin,\n MonoPubContext,\n BasePackageInfo,\n LatestPackagesReleases,\n PackageInfoWithLatestRelease,\n ReleaseType,\n CommitInfo,\n ReleasedPackageInfo,\n PrepareAllInfo,\n} from '@/types'\n\ntype WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] }\ntype WithSetup = WithRequired<MonoPubPlugin, 'setup'>\ntype WithGetLastRelease = WithRequired<MonoPubPlugin, 'getLastRelease'>\ntype WithExtractor = WithRequired<MonoPubPlugin, 'extractCommits'>\ntype WithAnalyzer = WithRequired<MonoPubPlugin, 'getReleaseType'>\ntype WithPrepare = WithRequired<MonoPubPlugin, 'prepareAll'> | WithRequired<MonoPubPlugin, 'prepareSingle'>\ntype WithPublish = WithRequired<MonoPubPlugin, 'publish'>\ntype WithPostPublish = WithRequired<MonoPubPlugin, 'postPublish'>\n\nexport class CombinedPlugin implements MonoPubPlugin {\n name = 'CombinedPlugin'\n allPlugins: Array<MonoPubPlugin>\n versionGetter?: WithGetLastRelease\n extractor?: WithExtractor\n analyzer?: WithAnalyzer\n neededSetup: Array<WithSetup> = []\n preparers: Array<WithPrepare> = []\n publishers: Array<WithPublish> = []\n postPublishers: Array<WithPostPublish> = []\n\n constructor(plugins: Array<MonoPubPlugin>) {\n this.allPlugins = plugins\n }\n\n _getStepMessage(step: string, plugin: MonoPubPlugin, prev?: MonoPubPlugin): string {\n if (prev) {\n return `Found \"${step}\" step of \"${plugin.name}\" plugin. Overriding previous one from \"${prev.name}\"`\n }\n return `Found \"${step}\" step of \"${plugin.name}\" plugin.`\n }\n\n async setup(ctx: MonoPubContext): Promise<boolean> {\n const logger = ctx.logger\n logger.log('Scanning received plugins')\n\n for (const plugin of this.allPlugins) {\n logger.log(`Scanning ${plugin.name} plugin`)\n\n if (plugin.setup) {\n logger.log(this._getStepMessage('setup', plugin))\n this.neededSetup.push(plugin as WithSetup)\n }\n if (plugin.getLastRelease) {\n logger.log(this._getStepMessage('getLastRelease', plugin, this.versionGetter))\n this.versionGetter = plugin as WithGetLastRelease\n }\n\n if (plugin.extractCommits) {\n logger.log(this._getStepMessage('extractCommits', plugin, this.extractor))\n this.extractor = plugin as WithExtractor\n }\n\n if (plugin.getReleaseType) {\n logger.log(this._getStepMessage('getReleaseType', plugin, this.analyzer))\n this.analyzer = plugin as WithAnalyzer\n }\n\n if (plugin.prepareAll || plugin.prepareSingle) {\n if (plugin.prepareAll && plugin.prepareSingle) {\n logger.warn(\n `Plugin \"${plugin.name}\" implements both \"prepareAll\" and \"prepareSingle\" methods, so only \"prepareAll\" be executed`\n )\n } else if (plugin.prepareAll) {\n logger.info(this._getStepMessage('prepareAll', plugin))\n } else {\n logger.info(this._getStepMessage('prepareSingle', plugin))\n }\n\n this.preparers.push(plugin as WithPrepare)\n }\n\n if (plugin.publish) {\n logger.log(this._getStepMessage('publish', plugin))\n this.publishers.push(plugin as WithPublish)\n }\n\n if (plugin.postPublish) {\n logger.log(this._getStepMessage('postPublish', plugin))\n this.postPublishers.push(plugin as WithPostPublish)\n }\n }\n\n if (!this.versionGetter) {\n logger.error('No plugins with \"getLastRelease\" step found')\n return false\n }\n\n if (!this.extractor) {\n logger.error('No plugins with \"extractCommits\" step found')\n return false\n }\n\n if (!this.analyzer) {\n logger.error('No plugins with \"getReleaseType\" step found')\n return false\n }\n\n for (const plugin of this.neededSetup) {\n logger.log(`Running \"setup\" step of \"${plugin.name}\" plugin`)\n const success = await plugin.setup(ctx)\n if (!success) {\n logger.error(`Conditions for setting up plugin ${plugin.name} have not been met. Aborting`)\n return false\n }\n }\n\n logger.success('All plugins are set up and ready to use')\n\n return true\n }\n\n async getLastRelease(packages: Array<BasePackageInfo>, ctx: MonoPubContext): Promise<LatestPackagesReleases> {\n if (!this.versionGetter) {\n throw new Error('No versionGetter found. You should run setup step before this')\n }\n ctx.logger.info(`Running \"getLastRelease\" of \"${this.versionGetter.name}\" plugin`)\n return this.versionGetter.getLastRelease(packages, ctx)\n }\n\n async extractCommits(pkgInfo: PackageInfoWithLatestRelease, ctx: MonoPubContext): Promise<Array<CommitInfo>> {\n if (!this.extractor) {\n throw new Error('No extractor found. You should run setup step before this')\n }\n ctx.logger.log(`Running \"extractCommits\" of \"${this.extractor.name}\" plugin`)\n return this.extractor.extractCommits(pkgInfo, ctx)\n }\n\n async getReleaseType(\n commits: Array<CommitInfo>,\n isDepsChanged: boolean,\n ctx: MonoPubContext\n ): Promise<ReleaseType> {\n if (!this.analyzer) {\n throw new Error('No analyzer found. You should run setup step before this')\n }\n ctx.logger.log(`Running \"getReleaseType\" step of \"${this.analyzer.name}\" plugin`)\n return this.analyzer.getReleaseType(commits, isDepsChanged, ctx)\n }\n\n async prepareAll(info: PrepareAllInfo, ctx: MonoPubContext): Promise<void> {\n const executionOrder = getExecutionOrder(info.foundPackages, {\n ignoreDependencies: ctx.ignoreDependencies,\n })\n\n for (const plugin of this.preparers) {\n if (plugin.prepareAll) {\n ctx.logger.log(`Running \"prepareAll\" step of \"${plugin.name}\" plugin`)\n await plugin.prepareAll(info, ctx)\n } else if (plugin.prepareSingle) {\n for (const pkg of executionOrder) {\n const scopedLogger = ctx.logger.scope(pkg.name)\n const scopedContext = { ...ctx, logger: scopedLogger }\n\n scopedLogger.log(`Running \"prepareSingle\" step of \"${plugin.name}\" plugin`)\n await plugin.prepareSingle({ ...info, targetPackage: pkg }, scopedContext)\n }\n }\n }\n }\n\n async publish(packageInfo: BasePackageInfo, ctx: MonoPubContext): Promise<void> {\n ctx.logger.log('Starting to publish a package')\n for (const plugin of this.publishers) {\n ctx.logger.log(`Running \"publish\" step of \"${plugin.name}\" plugin`)\n await plugin.publish(packageInfo, ctx)\n }\n }\n\n async postPublish(packageInfo: ReleasedPackageInfo, ctx: MonoPubContext): Promise<void> {\n ctx.logger.log('Running postPublish side effects')\n for (const plugin of this.postPublishers) {\n ctx.logger.log(`Running \"postPublish\" step of \"${plugin.name}\" plugin`)\n await plugin.postPublish(packageInfo, ctx)\n }\n }\n}\n"],"mappings":";AAAA,OAAOA,UAAS;AAChB,OAAOC,cAAa;;;ACDpB,OAAO,UAAU;AACjB,OAAO,MAAM,YAAY,kBAAkB;AAC3C,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,SAAS;AAQhB,eAAe,aAAa,UAA4C;AACpE,QAAM,UAAU,MAAM,WAAW,SAAS,QAAQ;AAClD,QAAM,MAAM,KAAK,MAAM,QAAQ,SAAS,CAAC;AACzC,QAAM,OAAO,IAAI,KAAK,QAAQ,IAAI;AAClC,QAAM,oBAAoB,IAAI,KAAK,WAAW,KAAK;AACnD,QAAM,YAAY,sBAAsB,UAAU,sBAAsB;AAExE,SAAO,EAAE,SAAS,WAAW,KAAK;AACtC;AAEA,eAAsB,eAAe,OAAsB,KAA8C;AACrG,QAAM,UAAU,MAAM,OAAO,OAAO;AAAA,IAChC;AAAA,IACA,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,EAChB,CAAC;AAED,QAAM,YAA2B,CAAC;AAClC,aAAW,SAAS,SAAS;AACzB,QAAI,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,MAAM,IAAI,MAAM,gBAAgB;AACvE,gBAAU,KAAK,MAAM,IAAI;AAAA,IAC7B,WAAW,MAAM,OAAO,YAAY,GAAG;AACnC,YAAM,WAAW,MAAM;AAGvB,YAAM,UAAU,KAAK,KAAK,UAAU,cAAc;AAClD,UAAI,GAAG,WAAW,OAAO,GAAG;AACxB,kBAAU,KAAK,OAAO;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,mBAAmB,KAAK,SAAS;AACvC,QAAM,eAAe,MAAM,QAAQ,IAAI,iBAAiB,IAAI,YAAY,CAAC;AAEzE,QAAM,SAAiC,CAAC;AAExC,mBAAiB,QAAQ,CAAC,UAAU,QAAQ;AACxC,UAAM,OAAO,aAAa,GAAG;AAC7B,QAAI,CAAC,KAAK,WAAW,KAAK,MAAM;AAC5B,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,UAAU,SAAS,CAAC;AAAA,IACvD;AAAA,EACJ,CAAC;AAED,SAAO;AACX;;;AC3DA,SAAS,eAAe;AAOT,SAAR,UAA2B,EAAE,QAAQ,OAAO,GAA2B;AAC1E,SAAO,IAAI,QAAQ;AAAA,IACf,QAAQ,EAAE,kBAAkB,MAAM,cAAc,MAAM;AAAA,IACtD,OAAO;AAAA,MACH,OAAO,EAAE,OAAO,OAAO,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,SAAI;AAAA,MAC/D,KAAK,EAAE,OAAO,WAAW,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,SAAI;AAAA,MACjE,SAAS,EAAE,OAAO,SAAS,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,SAAI;AAAA,MACnE,MAAM,EAAE,OAAO,QAAQ,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,SAAI;AAAA,IACnE;AAAA,EACJ,CAAC;AACL;;;ACjBA,SAAS,YAAYC,mBAAkB;AACvC,OAAOC,UAAS;AAChB,OAAO,SAAS;;;ACFhB,OAAO,aAAa;AAGpB,IAAM,cAAc;AACpB,IAAM,cAAc;AAEb,SAAS,gBAAgB,SAAiC;AAC7D,SAAO,GAAG,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,KAAK;AAC7D;AAEO,SAAS,cAAc,eAAsC,aAAiD;AACjH,MAAI,gBAAgB,QAAQ;AACxB,WAAO;AAAA,EACX,WAAW,CAAC,eAAe;AACvB,WAAO,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,EAAE;AAAA,EAC1C,WAAW,gBAAgB,SAAS;AAChC,WAAO,EAAE,OAAO,cAAc,QAAQ,GAAG,OAAO,GAAG,OAAO,EAAE;AAAA,EAChE,WAAW,gBAAgB,SAAS;AAChC,WAAO,EAAE,OAAO,cAAc,OAAO,OAAO,cAAc,QAAQ,GAAG,OAAO,EAAE;AAAA,EAClF,OAAO;AACH,WAAO,EAAE,GAAG,eAAe,OAAO,cAAc,QAAQ,EAAE;AAAA,EAC9D;AACJ;AAEO,SAAS,mBAAmB,gBAAwB,YAAoB;AAC3E,MAAI,eAAe,SAAS,GAAG,KAAK,YAAY,KAAK,cAAc,GAAG;AAClE,WAAO,IAAI,UAAU;AAAA,EACzB;AACA,MAAI,eAAe,SAAS,GAAG,KAAK,YAAY,KAAK,cAAc,GAAG;AAClE,WAAO,IAAI,UAAU;AAAA,EACzB;AACA,SAAO;AACX;AAEO,SAAS,iBACZ,YACA,YACA,aACyC;AACzC,SAAO,EAAE,gBAAgB,UAAU,CAAC,cAAc,QAAQ,YAAY,UAAU;AACpF;;;AD3BA,eAAsB,gBAClB,UACoD;AACpD,QAAM,gBAAgB,SAAS,IAAI,CAAC,QAAQ,IAAI,IAAI;AACpD,QAAM,SAAsD,OAAO;AAAA,IAC/D,CAAC;AAAA,IACD,GAAG,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,KAAK,WAAW,CAAC,EAAE,EAAE,EAAE;AAAA,EACxE;AAEA,aAAW,OAAO,OAAO,OAAO,MAAM,GAAG;AACrC,UAAM,UAAU,MAAMC,YAAW,SAAS,IAAI,QAAQ;AACtD,UAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,CAAC;AAE1C,UAAM,OAAOC,KAAI,MAAM,gBAAgB,CAAC,CAAC;AACzC,UAAM,WAAkC,OAAO,KAAK,IAAI,EACnD,OAAO,CAAC,QAAQ,cAAc,SAAS,GAAG,CAAC,EAC3C,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,EAAE,EAAE;AAChE,QAAI,UAAU,KAAK,GAAG,QAAQ;AAE9B,UAAM,UAAUA,KAAI,MAAM,mBAAmB,CAAC,CAAC;AAC/C,UAAM,cAAqC,OAAO,KAAK,OAAO,EACzD,OAAO,CAAC,QAAQ,cAAc,SAAS,GAAG,CAAC,EAC3C,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,UAAU,OAAO,QAAQ,GAAG,EAAE,EAAE;AACtE,QAAI,UAAU,KAAK,GAAG,WAAW;AAAA,EACrC;AAEA,SAAO;AACX;AAWO,SAAS,kBACZ,UACA,SACiB;AACjB,QAAM,UAAyC,CAAC;AAChD,QAAM,SAAS,OAAO,YAAY,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AACxE,QAAM,sBAAqB,mCAAS,uBAAsB,CAAC;AAE3D,QAAM,eAAe,oBAAI,IAA2B;AACpD,aAAW,OAAO,UAAU;AACxB,UAAM,oBAAoB,mBAAmB,IAAI,IAAI,KAAK,CAAC;AAE3D,iBAAa;AAAA,MACT,IAAI;AAAA,MACJ,IAAI,UAAU,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,kBAAkB,SAAS,IAAI,CAAC;AAAA,IAC3F;AAAA,EACJ;AAEA,SAAO,aAAa,OAAO,GAAG;AAC1B,UAAM,QAAgC,CAAC;AACvC,eAAW,CAAC,SAAS,OAAO,KAAK,cAAc;AAC3C,UAAI,QAAQ,WAAW,GAAG;AACtB,cAAM,KAAK,EAAE,MAAM,SAAS,UAAU,OAAO,OAAO,EAAE,SAAS,CAAC;AAChE,qBAAa,OAAO,OAAO;AAAA,MAC/B;AAAA,IACJ;AAEA,QAAI,MAAM,WAAW,GAAG;AACpB,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC/E;AAEA,YAAQ,KAAK,KAAK;AAClB,UAAM,mBAAmB,MAAM,IAAI,CAAC,QAAQ,IAAI,IAAI;AACpD,eAAW,CAAC,SAAS,OAAO,KAAK,cAAc;AAC3C,mBAAa;AAAA,QACT;AAAA,QACA,QAAQ,OAAO,CAAC,YAAY,CAAC,iBAAiB,SAAS,OAAO,CAAC;AAAA,MACnE;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,mCAAS,UAAU;AACnB,WAAO;AAAA,EACX;AAEA,SAAO,QAAQ,KAAK;AACxB;AAEA,eAAsB,iBAClB,KACA,aACA,gBACa;AACb,QAAM,OAAO,MAAMD,YAAW,SAAS,IAAI,QAAQ;AACnD,QAAM,cAAc,KAAK,MAAM,KAAK,SAAS,CAAC;AAE9C,QAAM,UAAU,YAAY,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI;AAEhE,MAAI,CAAC,SAAS;AACV,UAAM,IAAI;AAAA,MACN,qCAAqC,IAAI,IAAI;AAAA,IACjD;AAAA,EACJ;AAEA,MAAI,aAAa,WAAW,gBAAgB,OAAO,CAAC;AAEpD,aAAW,OAAO,IAAI,WAAW;AAC7B,UAAM,YAAY,IAAI,SAAS,QAAQ,iBAAiB;AACxD,UAAM,aAAa,YAAY,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI;AACnE,QAAI,CAAC,YAAY;AACb,YAAM,IAAI;AAAA,QACN,wCAAwC,IAAI,IAAI;AAAA,MACpD;AAAA,IACJ;AACA,QAAI,aAAa,CAAC,WAAW,IAAI,IAAI,GAAG,mBAAmB,IAAI,OAAO,gBAAgB,UAAU,CAAC,CAAC;AAAA,EACtG;AAEA,QAAMA,YAAW,UAAU,IAAI,UAAU,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AACjF;;;AE1GO,IAAM,iBAAN,MAA8C;AAAA,EACjD,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAgC,CAAC;AAAA,EACjC,YAAgC,CAAC;AAAA,EACjC,aAAiC,CAAC;AAAA,EAClC,iBAAyC,CAAC;AAAA,EAE1C,YAAY,SAA+B;AACvC,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,gBAAgB,MAAc,QAAuB,MAA8B;AAC/E,QAAI,MAAM;AACN,aAAO,UAAU,IAAI,cAAc,OAAO,IAAI,2CAA2C,KAAK,IAAI;AAAA,IACtG;AACA,WAAO,UAAU,IAAI,cAAc,OAAO,IAAI;AAAA,EAClD;AAAA,EAEA,MAAM,MAAM,KAAuC;AAC/C,UAAM,SAAS,IAAI;AACnB,WAAO,IAAI,2BAA2B;AAEtC,eAAW,UAAU,KAAK,YAAY;AAClC,aAAO,IAAI,YAAY,OAAO,IAAI,SAAS;AAE3C,UAAI,OAAO,OAAO;AACd,eAAO,IAAI,KAAK,gBAAgB,SAAS,MAAM,CAAC;AAChD,aAAK,YAAY,KAAK,MAAmB;AAAA,MAC7C;AACA,UAAI,OAAO,gBAAgB;AACvB,eAAO,IAAI,KAAK,gBAAgB,kBAAkB,QAAQ,KAAK,aAAa,CAAC;AAC7E,aAAK,gBAAgB;AAAA,MACzB;AAEA,UAAI,OAAO,gBAAgB;AACvB,eAAO,IAAI,KAAK,gBAAgB,kBAAkB,QAAQ,KAAK,SAAS,CAAC;AACzE,aAAK,YAAY;AAAA,MACrB;AAEA,UAAI,OAAO,gBAAgB;AACvB,eAAO,IAAI,KAAK,gBAAgB,kBAAkB,QAAQ,KAAK,QAAQ,CAAC;AACxE,aAAK,WAAW;AAAA,MACpB;AAEA,UAAI,OAAO,cAAc,OAAO,eAAe;AAC3C,YAAI,OAAO,cAAc,OAAO,eAAe;AAC3C,iBAAO;AAAA,YACH,WAAW,OAAO,IAAI;AAAA,UAC1B;AAAA,QACJ,WAAW,OAAO,YAAY;AAC1B,iBAAO,KAAK,KAAK,gBAAgB,cAAc,MAAM,CAAC;AAAA,QAC1D,OAAO;AACH,iBAAO,KAAK,KAAK,gBAAgB,iBAAiB,MAAM,CAAC;AAAA,QAC7D;AAEA,aAAK,UAAU,KAAK,MAAqB;AAAA,MAC7C;AAEA,UAAI,OAAO,SAAS;AAChB,eAAO,IAAI,KAAK,gBAAgB,WAAW,MAAM,CAAC;AAClD,aAAK,WAAW,KAAK,MAAqB;AAAA,MAC9C;AAEA,UAAI,OAAO,aAAa;AACpB,eAAO,IAAI,KAAK,gBAAgB,eAAe,MAAM,CAAC;AACtD,aAAK,eAAe,KAAK,MAAyB;AAAA,MACtD;AAAA,IACJ;AAEA,QAAI,CAAC,KAAK,eAAe;AACrB,aAAO,MAAM,6CAA6C;AAC1D,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,KAAK,WAAW;AACjB,aAAO,MAAM,6CAA6C;AAC1D,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,KAAK,UAAU;AAChB,aAAO,MAAM,6CAA6C;AAC1D,aAAO;AAAA,IACX;AAEA,eAAW,UAAU,KAAK,aAAa;AACnC,aAAO,IAAI,4BAA4B,OAAO,IAAI,UAAU;AAC5D,YAAM,UAAU,MAAM,OAAO,MAAM,GAAG;AACtC,UAAI,CAAC,SAAS;AACV,eAAO,MAAM,oCAAoC,OAAO,IAAI,8BAA8B;AAC1F,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,WAAO,QAAQ,yCAAyC;AAExD,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,eAAe,UAAkC,KAAsD;AACzG,QAAI,CAAC,KAAK,eAAe;AACrB,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACnF;AACA,QAAI,OAAO,KAAK,gCAAgC,KAAK,cAAc,IAAI,UAAU;AACjF,WAAO,KAAK,cAAc,eAAe,UAAU,GAAG;AAAA,EAC1D;AAAA,EAEA,MAAM,eAAe,SAAuC,KAAiD;AACzG,QAAI,CAAC,KAAK,WAAW;AACjB,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC/E;AACA,QAAI,OAAO,IAAI,gCAAgC,KAAK,UAAU,IAAI,UAAU;AAC5E,WAAO,KAAK,UAAU,eAAe,SAAS,GAAG;AAAA,EACrD;AAAA,EAEA,MAAM,eACF,SACA,eACA,KACoB;AACpB,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC9E;AACA,QAAI,OAAO,IAAI,qCAAqC,KAAK,SAAS,IAAI,UAAU;AAChF,WAAO,KAAK,SAAS,eAAe,SAAS,eAAe,GAAG;AAAA,EACnE;AAAA,EAEA,MAAM,WAAW,MAAsB,KAAoC;AACvE,UAAM,iBAAiB,kBAAkB,KAAK,eAAe;AAAA,MACzD,oBAAoB,IAAI;AAAA,IAC5B,CAAC;AAED,eAAW,UAAU,KAAK,WAAW;AACjC,UAAI,OAAO,YAAY;AACnB,YAAI,OAAO,IAAI,iCAAiC,OAAO,IAAI,UAAU;AACrE,cAAM,OAAO,WAAW,MAAM,GAAG;AAAA,MACrC,WAAW,OAAO,eAAe;AAC7B,mBAAW,OAAO,gBAAgB;AAC9B,gBAAM,eAAe,IAAI,OAAO,MAAM,IAAI,IAAI;AAC9C,gBAAM,gBAAgB,EAAE,GAAG,KAAK,QAAQ,aAAa;AAErD,uBAAa,IAAI,oCAAoC,OAAO,IAAI,UAAU;AAC1E,gBAAM,OAAO,cAAc,EAAE,GAAG,MAAM,eAAe,IAAI,GAAG,aAAa;AAAA,QAC7E;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ,aAA8B,KAAoC;AAC5E,QAAI,OAAO,IAAI,+BAA+B;AAC9C,eAAW,UAAU,KAAK,YAAY;AAClC,UAAI,OAAO,IAAI,8BAA8B,OAAO,IAAI,UAAU;AAClE,YAAM,OAAO,QAAQ,aAAa,GAAG;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,aAAkC,KAAoC;AACpF,QAAI,OAAO,IAAI,kCAAkC;AACjD,eAAW,UAAU,KAAK,gBAAgB;AACtC,UAAI,OAAO,IAAI,kCAAkC,OAAO,IAAI,UAAU;AACtE,YAAM,OAAO,YAAY,aAAa,GAAG;AAAA,IAC7C;AAAA,EACJ;AACJ;;;ALhKA,eAAO,QACH,OACA,SACA,UAA0B,CAAC,GAC7B;AACE,QAAM,EAAE,SAAS,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,oBAAoB,GAAG,YAAY,IAAI;AACjG,QAAM,SAAS,UAAU,EAAE,QAAQ,OAAO,CAAC;AAC3C,QAAM,UAA0B;AAAA,IAC5B,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,QAAQ;AAAA,IACb,oBAAoB,sBAAsB,CAAC;AAAA,IAC3C,GAAG;AAAA,IACH;AAAA,EACJ;AAEA,SAAO,KAAK,+BAA+B;AAC3C,QAAM,WAAW,MAAM,eAAe,OAAO,QAAQ,GAAG;AACxD,QAAM,eAAgD,OAAO;AAAA,IACzD,CAAC;AAAA,IACD,GAAG,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,EAClD;AACA,MAAI,CAAC,SAAS,QAAQ;AAClB,WAAO,QAAQ,wCAAwC;AACvD;AAAA,EACJ;AACA,QAAM,iBAAiD,OAAO;AAAA,IAC1D,CAAC;AAAA,IACD,GAAG,SAAS,IAAI,CAAC,SAAS;AAAA,MACtB,CAAC,IAAI,IAAI,GAAG;AAAA,QACR,GAAG;AAAA,QACH,QAAQ,OAAO,MAAM,IAAI,IAAI;AAAA,MACjC;AAAA,IACJ,EAAE;AAAA,EACN;AAEA,SAAO;AAAA,IACH,SAAS,SAAS,MAAM,0BAA0B,SAAS,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,EACvG;AACA,SAAO,IAAI,iFAAiF;AAC5F,MAAI,mBAAgE,CAAC;AACrE,MAAI,eAAuC,CAAC;AAE5C,MAAI;AACA,uBAAmB,MAAM,gBAAgB,QAAQ;AACjD,mBAAe,kBAAkB,OAAO,OAAO,gBAAgB,GAAG,EAAE,mBAAmB,CAAC;AAAA,EAC5F,SAAS,KAAK;AACV,QAAI,eAAe,OAAO;AACtB,aAAO,MAAM,IAAI,OAAO;AAAA,IAC5B;AACA,UAAM;AAAA,EACV;AAEA,SAAO,QAAQ,4BAA4B,aAAa,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG;AAEnG,SAAO;AAAA,IACH,SAAS,QAAQ,MAAM,oCAAoC,QACtD,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,GAAG,EAClC,KAAK,IAAI,CAAC;AAAA,EACnB;AACA,SAAO,IAAI,sDAAsD;AACjE,QAAM,eAAe,IAAI,eAAe,OAAO;AAC/C,QAAM,UAAU,MAAM,aAAa,MAAM,OAAO;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AACA,SAAO,IAAI,sCAAsC;AACjD,QAAM,iBAAiB,MAAM,aAAa,eAAe,UAAU,OAAO;AAC1E,aAAW,CAAC,aAAa,OAAO,KAAK,OAAO,QAAQ,cAAc,GAAG;AACjE,QAAI,CAAC,SAAS;AACV,qBAAe,WAAW,EAAE,OAAO,IAAI,+BAA+B;AAAA,IAC1E,OAAO;AACH,qBAAe,WAAW,EAAE,OAAO;AAAA,QAC/B,iCAAiC,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,KAAK;AAAA,MACpF;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,aAAgD,CAAC;AACvD,QAAM,eAA4C,CAAC;AACnD,QAAM,cAAqD,CAAC;AAE5D,aAAW,EAAE,MAAM,QAAQ,KAAK,cAAc;AAC1C,UAAM,eAAe,eAAe,OAAO,EAAE;AAE7C,UAAM,gBAAgBE,KAAI,gBAAgB,SAAS,IAAI;AACvD,UAAM,UAAU,MAAM,aAAa;AAAA,MAC/B,EAAE,GAAG,aAAa,OAAO,GAAG,cAAc;AAAA,MAC1C,eAAe,OAAO;AAAA,IAC1B;AACA,iBAAa,KAAK,SAAS,QAAQ,MAAM,6BAA6B;AACtE,eAAW,OAAO,IAAI;AAEtB,UAAM,gBAAgB,iBAAiB,OAAO,EAAE,UAAU,KAAK,CAAC,QAAQ,aAAa,IAAI,IAAI,MAAM,MAAM;AAEzG,UAAM,cAAc,MAAM,aAAa,eAAe,SAAS,eAAe,eAAe,OAAO,CAAC;AACrG,UAAM,aAAa,cAAc,eAAe,WAAW;AAC3D,iBAAa,OAAO,IAAI;AACxB,gBAAY,OAAO,IAAI;AAEvB,QAAI,CAAC,cAAc,gBAAgB,QAAQ;AACvC,mBAAa,KAAK,0EAA0E;AAAA,IAChG,WAAW,eAAe;AACtB,mBAAa;AAAA,QACT,UAAU,WAAW,sDAAsD;AAAA,UACvE;AAAA,QACJ,CAAC,8CAA8C,gBAAgB,UAAU,CAAC;AAAA,MAC9E;AAAA,IACJ,OAAO;AACH,mBAAa;AAAA,QACT,0CAA0C,WAAW,wEAAwE;AAAA,UACzH;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,aAAW,OAAO,OAAO,OAAO,gBAAgB,GAAG;AAC/C,QAAI,aAAa,IAAI,IAAI,MAAM,QAAQ;AACnC;AAAA,IACJ;AACA,mBAAe,IAAI,IAAI,EAAE,OAAO,IAAI,mDAAmD;AACvF,UAAM,iBAAiB,KAAK,aAAa,cAAc;AAAA,EAC3D;AAEA,QAAM,gBAAgB,OAAO,OAAO,gBAAgB;AACpD,QAAM,kBAAkB,cAAc,OAAO,CAAC,EAAE,KAAK,MAAM;AACvD,UAAM,aAAa,YAAY,IAAI;AACnC,UAAM,cAAc,aAAa,IAAI;AACrC,UAAM,aAAa,eAAe,IAAI;AAEtC,WAAO,iBAAiB,YAAY,YAAY,WAAW;AAAA,EAC/D,CAAC;AAED,QAAM,aAAa;AAAA,IACf;AAAA,MACI;AAAA,MACA;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,aAAW,EAAE,MAAM,YAAY,KAAK,cAAc;AAC9C,UAAM,aAAa,YAAY,WAAW;AAC1C,UAAM,cAAc,aAAa,WAAW;AAC5C,UAAM,aAAa,eAAe,WAAW;AAC7C,QAAI,CAAC,iBAAiB,YAAY,YAAY,WAAW,GAAG;AACxD;AAAA,IACJ;AAEA,UAAM,aAAa,QAAQ,aAAa,WAAW,GAAG,eAAe,WAAW,CAAC;AAEjF,UAAM,aAA+B,CAAC;AAEtC,eAAW,OAAO,iBAAiB,WAAW,EAAE,WAAW;AACvD,YAAM,gBAAgB,eAAe,IAAI,IAAI;AAC7C,YAAM,gBAAgB,YAAY,IAAI,IAAI;AAC1C,YAAM,iBAAiB,aAAa,IAAI,IAAI;AAC5C,UAAI,CAAC,iBAAiBC,SAAQ,eAAe,aAAa,KAAK,mBAAmB,QAAQ;AACtF;AAAA,MACJ;AACA,iBAAW,KAAK;AAAA,QACZ,GAAG,aAAa,IAAI,IAAI;AAAA,QACxB,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,aAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAEA,UAAM,sBAA2C;AAAA,MAC7C,GAAG,aAAa,WAAW;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,WAAW,WAAW;AAAA,MAC/B;AAAA,IACJ;AACA,UAAM,aAAa,YAAY,qBAAqB,eAAe,WAAW,CAAC;AAC/E,mBAAe,WAAW,EAAE,OAAO,QAAQ,oCAAoC;AAAA,EACnF;AACJ;","names":["get","isEqual","fsPromises","get","fsPromises","get","get","isEqual"]}