@milaboratories/pl-middle-layer 1.27.13 → 1.27.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/dev_env/util.ts","../src/dev_env/index.ts","../src/block_registry/registry.ts","../src/block_registry/registry-v2-provider.ts","../src/block_registry/well_known_registries.ts","../src/model/project_model.ts","../src/middle_layer/project_list.ts","../src/mutator/template/render_template.ts","../src/mutator/template/render_block.ts","../src/mutator/template/direct_template_loader.ts","../src/mutator/template/template_loading.ts","../src/model/block_pack_spec.ts","../src/mutator/block-pack/frontend.ts","../src/mutator/block-pack/block_pack.ts","../src/model/args.ts","../src/model/project_model_util.ts","../src/mutator/context_export.ts","../src/mutator/project.ts","../src/pool/data.ts","../src/pool/p_object_collection.ts","../src/pool/result_pool.ts","../src/middle_layer/block_ctx.ts","../src/cfg_render/traverse.ts","../src/cfg_render/util.ts","../src/cfg_render/renderer.ts","../src/middle_layer/block_ctx_unsafe.ts","../src/cfg_render/executor.ts","../src/js_render/context.ts","../src/middle_layer/util.ts","../src/js_render/index.ts","../src/middle_layer/render.ts","../src/middle_layer/project_overview.ts","../src/middle_layer/frontend_path.ts","../src/middle_layer/block.ts","../src/middle_layer/active_cfg.ts","../src/middle_layer/navigation_states.ts","../src/middle_layer/project.ts","../src/middle_layer/ops.ts","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/constants.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/debug.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/re.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/parse-options.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/identifiers.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/semver.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/parse.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/valid.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/clean.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/inc.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/diff.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/major.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/minor.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/patch.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/prerelease.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rcompare.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-loose.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-build.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/sort.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rsort.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gt.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lt.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/eq.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/neq.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gte.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lte.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/cmp.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/coerce.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/lrucache.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/range.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/comparator.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/satisfies.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/to-comparators.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/max-satisfying.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-satisfying.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-version.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/valid.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/outside.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/gtr.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/ltr.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/intersects.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/simplify.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/subset.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/index.js","../src/block_registry/watcher.ts","../src/pool/ref_count_pool.ts","../src/debug/index.ts","../src/pool/driver.ts","../src/middle_layer/driver_kit.ts","../src/middle_layer/middle_layer.ts","../src/network_check.ts"],"sourcesContent":["import { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n","import { RegistryV1 } from '@platforma-sdk/block-tools';\nimport path from 'path';\nimport { tryStat } from './util';\nimport { tryResolve } from '@milaboratories/resolve-helper';\n\nexport const LegacyDevBlockPackMetaYaml = [RegistryV1.PlPackageYamlConfigFile];\nexport const LegacyDevBlockPackMetaJson = [RegistryV1.PlPackageJsonConfigFile];\nexport const LegacyDevBlockPackTemplate = ['backend', 'dist', 'tengo', 'tpl', 'main.plj.gz'];\nexport const LegacyDevBlockPackConfig = ['config', 'dist', 'config.json'];\nexport const LegacyDevBlockPackFrontendFolder = ['frontend', 'dist'];\n\nexport const CanonicalBlockWorkflowRequest = 'block-workflow/dist/tengo/tpl/main.plj.gz';\nexport const CanonicalBlockConfigRequest = 'block-model/dist/config.json';\nexport const CanonicalBlockUiRequestPackageJson = 'block-ui/package.json';\n\nexport const LegacyDevBlockPackFiles = [\n LegacyDevBlockPackTemplate,\n LegacyDevBlockPackConfig,\n LegacyDevBlockPackMetaYaml,\n LegacyDevBlockPackMetaJson,\n LegacyDevBlockPackFrontendFolder\n];\n\nexport type DevPacketPaths = {\n /** main.plj.gz */\n readonly workflow: string;\n /** config.json */\n readonly config: string;\n /** ui dist folder */\n readonly ui: string;\n};\n\nexport async function isLegacyDevPackage(packageRoot: string): Promise<boolean> {\n return (\n (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackConfig))) !== undefined ||\n (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackTemplate))) !== undefined\n );\n}\n\nfunction mustResolve(root: string, request: string): string {\n const res = tryResolve(root, request);\n if (res === undefined) throw new Error(`Can't resolve ${request} against ${root}`);\n return res;\n}\n\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: true\n): Promise<DevPacketPaths | undefined>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: false\n): Promise<DevPacketPaths>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: boolean\n): Promise<DevPacketPaths | undefined> {\n if (!path.isAbsolute(packageRoot)) packageRoot = path.resolve(packageRoot);\n if (await isLegacyDevPackage(packageRoot))\n return {\n workflow: path.join(packageRoot, ...LegacyDevBlockPackTemplate),\n config: path.join(packageRoot, ...LegacyDevBlockPackConfig),\n ui: path.join(packageRoot, ...LegacyDevBlockPackFrontendFolder)\n };\n if (ignoreErrors) {\n const workflow = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (workflow === undefined) return undefined;\n const config = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (config === undefined) return undefined;\n const uiPackageJson = tryResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n if (uiPackageJson === undefined) return undefined;\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n } else {\n const workflow = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const config = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const uiPackageJson = mustResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport {\n BlockPackDescriptionAbsolute,\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport { V2RegistryProvider } from './registry-v2-provider';\nimport {\n AnyChannel,\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n StableChannel\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: latestMeta['title'] ?? 'No title',\n description: latestMeta['description'] ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com'\n }\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url\n }\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] }))\n });\n }\n return result;\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) =>\n e.latestByChannel[StableChannel]\n ? {\n ...e,\n registryId: regEntry.id\n }\n : {\n ...e,\n latestByChannel: {\n ...e.latestByChannel,\n [StableChannel]: ((s: SingleBlockPackOverview) => {\n if (s.spec.type === 'from-registry-v2') {\n return {...s, spec: {...s.spec, channel: StableChannel}};\n }\n\n return s;\n })(e.latestByChannel[AnyChannel])\n },\n registryId: regEntry.id\n }\n );\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile)\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV'\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com'\n }\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime\n }\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview\n },\n allVersions: []\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime\n }\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview\n },\n allVersions: []\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n","import { folderReaderByUrl, RegistryV2Reader } from '@platforma-sdk/block-tools';\nimport { Dispatcher } from 'undici';\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n","import { RegistrySpec } from '@milaboratories/pl-model-middle-layer';\n\nexport const CentralBlockRegistry: RegistrySpec = {\n type: 'remote-v2',\n url: 'https://blocks.pl-open.science/'\n};\n\nexport const V1CentralRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/releases'\n};\n\nexport const V1CentralDevSnapshotRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/dev'\n};\n","import { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta\n} from '@milaboratories/pl-model-middle-layer';\nimport { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }]\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: []\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project'\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const SchemaVersionCurrent = '1';\n\nexport const ProjectCreatedTimestamp = 'ProjectCreated';\nexport const ProjectLastModifiedTimestamp = 'ProjectLastModified';\nexport const ProjectMetaKey = 'ProjectMeta';\nexport const ProjectStructureKey = 'ProjectStructure';\nexport const BlockRenderingStateKey = 'BlockRenderingState';\n\nexport const BlockFrontendStateKeyPrefix = 'BlockFrontendState/';\nexport const BlockFrontendStateKeyPattern = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKey(blockId: string): string {\n return `${BlockFrontendStateKeyPrefix}${blockId}`;\n}\n\nexport const BlockArgsAuthorKeyPrefix = 'BlockArgsAuthor/';\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = 'ProjectStructureAuthor';\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKey(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPattern);\n if (match === null) return undefined;\n return match.groups!['blockid'];\n}\n\nexport const ServiceTemplateCacheFieldPrefix = '__serviceTemplate_';\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | 'blockPack'\n | 'blockSettings'\n | 'prodArgs'\n | 'currentArgs'\n | 'prodCtx'\n | 'prodUiCtx'\n | 'prodOutput'\n | 'prodCtxPrevious'\n | 'prodUiCtxPrevious'\n | 'prodOutputPrevious'\n | 'stagingCtx'\n | 'stagingUiCtx'\n | 'stagingOutput'\n | 'stagingCtxPrevious'\n | 'stagingUiCtxPrevious'\n | 'stagingOutputPrevious';\n}\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern =\n /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|prodArgs|currentArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n","import { PruningFunction, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { PlClient, ResourceId, ResourceType, resourceTypesEqual } from '@milaboratories/pl-client';\nimport { TreeAndComputableU } from './types';\nimport { Computable, WatchableValue } from '@milaboratories/computable';\nimport {\n ProjectCreatedTimestamp,\n ProjectLastModifiedTimestamp,\n ProjectListEntry,\n ProjectMetaKey\n} from '../model/project_model';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { ProjectMeta } from '@milaboratories/pl-model-middle-layer';\n\nexport const ProjectsField = 'projects';\nexport const ProjectsResourceType: ResourceType = { name: 'Projects', version: '1' };\n\nexport const ProjectsListTreePruningFunction: PruningFunction = (resource) => {\n if (!resourceTypesEqual(resource.type, ProjectsResourceType)) return [];\n return resource.fields;\n};\n\nexport async function createProjectList(\n pl: PlClient,\n rid: ResourceId,\n openedProjects: WatchableValue<ResourceId[]>,\n env: MiddleLayerEnvironment\n): Promise<TreeAndComputableU<ProjectListEntry[]>> {\n const tree = await SynchronizedTreeState.init(\n pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: ProjectsListTreePruningFunction\n },\n env.logger\n );\n\n const c = Computable.make((ctx) => {\n const node = ctx.accessor(tree.entry()).node();\n const oProjects = openedProjects.getValue(ctx);\n if (node === undefined) return undefined;\n const result: ProjectListEntry[] = [];\n for (const field of node.listDynamicFields()) {\n const prj = node.traverse(field);\n if (prj === undefined) continue;\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n result.push({\n id: field,\n rid: prj.id,\n created: new Date(created),\n lastModified: new Date(lastModified),\n opened: oProjects.indexOf(prj.id) >= 0,\n meta\n });\n }\n result.sort((p) => -p.lastModified.valueOf());\n return result;\n }).withStableType();\n\n return { computable: c, tree };\n}\n","import { AnyRef, field, Pl, PlTransaction } from '@milaboratories/pl-client';\nimport { ResourceType } from '@platforma-sdk/model';\n\nconst EphRenderTemplate: ResourceType = {\n name: 'EphRenderTemplate',\n version: '1'\n};\nconst RenderTemplate: ResourceType = {\n name: 'RenderTemplate',\n version: '1'\n};\n\n/**\n * Creates render template operation, for a given remplate and inputs.\n *\n * @param tx transaction to use during rendering creation\n * @param tpl reference to the template resource (see {@link loadTemplate})\n * @param ephemeral true for ephemeral templates, false for pure templates\n * @param inputs map of inputs pointing to other resources or fields\n * @param outputNames names of the outputs to collect and return from this method\n */\nexport function createRenderTemplate<O extends string>(\n tx: PlTransaction,\n tpl: AnyRef,\n ephemeral: boolean,\n inputs: Pl.PlRecord,\n outputNames: O[]\n): Record<O, AnyRef> {\n if (outputNames.length === 0) throw new Error('Zero output names provided');\n const rId = ephemeral ? tx.createEphemeral(EphRenderTemplate) : tx.createStruct(RenderTemplate);\n\n const tplField = field(rId, 'template');\n const inputsField = field(rId, 'inputs');\n\n tx.createField(tplField, 'Input', tpl);\n tx.createField(inputsField, 'Input', Pl.createPlMap(tx, inputs, ephemeral));\n tx.lockInputs(rId);\n\n return Pl.futureRecord(tx, rId, outputNames, 'Output', 'outputs/');\n}\n","import {\n AnyRef,\n field,\n PlTransaction,\n ResourceRef,\n ResourceType,\n Pl\n} from '@milaboratories/pl-client';\nimport { randomUUID } from 'node:crypto';\nimport { createRenderTemplate } from './render_template';\n\nexport const BContextEnd: ResourceType = { name: 'BContextEnd', version: '1' };\nexport const BContext: ResourceType = { name: 'BContext', version: '1' };\nexport const BContextId = 'id';\nexport const BContextParent = 'parent';\nexport const BContextMultiParentPrefix = 'parent/';\n\n// TODO: add implementation for dual context heavy block.\n// export type BlockType =\n// | 'LightBlock'\n// | 'HeavyBlock'\n// | 'DualContextHeavyBlock';\n// moved to project model ==>>>\n\nexport type HeavyBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n isProduction: AnyRef;\n context: AnyRef;\n};\n\nexport type HeavyBlockOutputs = {\n context: AnyRef;\n result: AnyRef;\n};\n\nexport const HeavyBlockOutputNames: (keyof HeavyBlockOutputs)[] = ['context', 'result'];\n\nexport function createRenderHeavyBlock(\n tx: PlTransaction,\n tpl: AnyRef,\n inputs: HeavyBlockInputs\n): HeavyBlockOutputs {\n return createRenderTemplate(tx, tpl, true, inputs, HeavyBlockOutputNames);\n}\n\nexport type LightBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n stagingContext: AnyRef;\n productionContext: AnyRef;\n};\n\nexport type LightBlockOutput = {\n result: AnyRef;\n};\n\nexport const LightBlockOutputNames: (keyof LightBlockOutput)[] = ['result'];\n\nexport function createRenderLightBlock(\n tx: PlTransaction,\n tpl: ResourceRef,\n inputs: LightBlockInputs\n): LightBlockOutput {\n return createRenderTemplate(tx, tpl, true, inputs, LightBlockOutputNames);\n}\n\nexport function createBContextEnd(tx: PlTransaction): ResourceRef {\n const ctx = tx.createEphemeral(BContextEnd);\n tx.lock(ctx);\n return ctx;\n}\n\nexport function createBContextFromUpstreams(tx: PlTransaction, upstreamCtxs: AnyRef[]): AnyRef {\n if (upstreamCtxs.length === 0) return createBContextEnd(tx);\n\n if (upstreamCtxs.length === 1) return upstreamCtxs[0];\n\n const ctx = tx.createEphemeral(BContext);\n\n // setting id\n tx.createField(field(ctx, BContextId), 'Input', Pl.createPlString(tx, randomUUID()));\n\n // setting parents\n for (let i = 0; i < upstreamCtxs.length; i++)\n tx.createField(field(ctx, `${BContextMultiParentPrefix}${i}`), 'Input', upstreamCtxs[i]);\n\n tx.lock(ctx);\n\n return ctx;\n}\n","import type { AnyRef, AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport type { ExplicitTemplate } from '../../model/template_spec';\nimport type { Hash } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport type {\n TemplateData,\n TemplateLibData,\n TemplateSoftwareData\n} from '@milaboratories/pl-model-backend';\nimport {\n PlTemplateLibV1,\n PlTemplateSoftwareV1,\n PlTemplateV1,\n PlTemplateOverrideV1,\n parseTemplate\n} from '@milaboratories/pl-model-backend';\n\nexport function loadTemplateFromExplicitDirect(tx: PlTransaction, spec: ExplicitTemplate): AnyRef {\n const templateInfo: TemplateData = parseTemplate(spec.content);\n\n const templateFormat = templateInfo.type;\n switch (templateFormat) {\n case 'pl.tengo-template.v2':\n return createTemplateV2Tree(tx, templateInfo);\n default:\n assertNever(templateFormat);\n }\n}\n\ntype Renderer<T> = {\n hash: Hasher<T>;\n render: (resource: T, tx: PlTransaction, creator: Creator) => AnyResourceRef;\n};\ntype Hasher<T> = (resource: T, hash: Hash) => void;\ntype Creator = <T>(resource: T, renderer: Renderer<T>) => AnyResourceRef;\n\nconst LibRenderer: Renderer<TemplateLibData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateLibV1.type.name)\n .update(PlTemplateLibV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n return tx.createValue(\n PlTemplateLibV1.type,\n JSON.stringify(PlTemplateLibV1.fromV2Data(resource).data)\n );\n }\n};\n\nconst SoftwareInfoRenderer: Renderer<TemplateSoftwareData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateSoftwareV1.type.name)\n .update(PlTemplateSoftwareV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n const sw = PlTemplateSoftwareV1.fromV2Data(resource);\n const ref = tx.createStruct(PlTemplateSoftwareV1.type, sw.data);\n tx.setKValue(ref, PlTemplateSoftwareV1.metaNameKey, JSON.stringify(sw.name));\n tx.lock(ref);\n return ref;\n }\n};\n\nconst HashOverrideRenderer: Renderer<TemplateData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateOverrideV1.type.name)\n .update(PlTemplateOverrideV1.type.version)\n .update(resource.hashOverride ?? '');\n },\n render(resource, tx, _creator) {\n return tx.createStruct(\n PlTemplateOverrideV1.type,\n JSON.stringify(PlTemplateOverrideV1.fromV2Data(resource))\n );\n }\n};\n\nconst TemplateRenderer: Renderer<TemplateData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateV1.type.name)\n .update(PlTemplateV1.type.version)\n .update(resource.hashOverride ?? '')\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n\n const srt = <T>(entries: [string, T][]): [string, T][] => {\n entries.sort((a, b) => (a[0] === b[0] ? 0 : a[0] < b[0] ? -1 : 1));\n return entries;\n };\n\n for (const [libId, lib] of srt(Object.entries(resource.libs ?? {}))) {\n hash.update('lib:' + libId);\n LibRenderer.hash(lib, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.software ?? {}))) {\n hash.update('soft:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.assets ?? {}))) {\n hash.update('asset:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [tplId, tpl] of srt(Object.entries(resource.templates ?? {}))) {\n hash.update('tpl:' + tplId);\n this.hash(tpl, hash);\n }\n },\n render(resource, tx, _creator) {\n const tplRef = tx.createStruct(\n PlTemplateV1.type,\n JSON.stringify(PlTemplateV1.fromV2Data(resource).data)\n );\n // Render libraries\n for (const [libId, lib] of Object.entries(resource.libs ?? {})) {\n const fld = PlTemplateV1.libField(tplRef, libId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(lib, LibRenderer));\n }\n\n // Render software and assets\n for (const [swId, sw] of Object.entries(resource.software ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n for (const [swId, sw] of Object.entries(resource.assets ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n\n // Render dependency templates\n for (const [depTplId, depTpl] of Object.entries(resource.templates ?? {})) {\n const fld = PlTemplateV1.tplField(tplRef, depTplId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(depTpl, TemplateRenderer));\n }\n\n tx.lock(tplRef);\n\n if (!resource.hashOverride) return tplRef;\n\n // Override template hash with proxy resource, when hash override is configured for template\n const overrideRef = _creator(resource, HashOverrideRenderer);\n const fld = PlTemplateOverrideV1.tplField(overrideRef);\n tx.createField(fld, 'Service');\n tx.setField(fld, tplRef);\n tx.lock(tplRef);\n return overrideRef;\n }\n};\n\nfunction createTemplateV2Tree(tx: PlTransaction, tplInfo: TemplateData): AnyRef {\n const resourceCache = new Map<string, AnyResourceRef>();\n\n const createResource = <T>(resource: T, renderer: Renderer<T>): AnyResourceRef => {\n const hasher: Hash = createHash('sha256');\n renderer.hash(resource, hasher);\n\n const rKey = hasher.digest('hex');\n if (!resourceCache.has(rKey)) {\n const rId = renderer.render(resource, tx, createResource);\n resourceCache.set(rKey, rId);\n }\n\n return resourceCache.get(rKey)!;\n };\n\n return createResource(tplInfo, TemplateRenderer);\n}\n","import type { AnyRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field, Pl } from '@milaboratories/pl-client';\nimport fs from 'node:fs';\nimport type {\n ExplicitTemplate,\n TemplateFromRegistry,\n TemplateSpecAny,\n TemplateSpecPrepared,\n} from '../../model/template_spec';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { loadTemplateFromExplicitDirect } from './direct_template_loader';\n\n//\n// Resource schema\n//\n\nexport const TengoTemplateGet: ResourceType = { name: 'TengoTemplateGet', version: '1' };\nexport const TengoTemplateGetRegistry = 'registry';\nexport const TengoTemplateGetTemplateURI = 'templateURI';\nexport const TengoTemplateGetTemplate = 'template';\n\nexport const TengoTemplatePack: ResourceType = { name: 'TengoTemplatePack', version: '1' };\nexport const TengoTemplatePackConvert: ResourceType = {\n name: 'TengoTemplatePackConvert',\n version: '1',\n};\nexport const TengoTemplatePackConvertTemplatePack = 'templatePack';\nexport const TengoTemplatePackConvertTemplate = 'template';\n\nexport async function prepareTemplateSpec(tpl: TemplateSpecAny): Promise<TemplateSpecPrepared> {\n switch (tpl.type) {\n case 'from-file':\n return {\n type: 'explicit',\n content: await fs.promises.readFile(tpl.path),\n };\n case 'from-registry':\n case 'explicit':\n return tpl;\n default:\n return assertNever(tpl);\n }\n}\n\nfunction loadTemplateFromRegistry(tx: PlTransaction, spec: TemplateFromRegistry): AnyRef {\n const getTemplate = tx.createStruct(TengoTemplateGet);\n const registry = field(getTemplate, TengoTemplateGetRegistry);\n const uri = field(getTemplate, TengoTemplateGetTemplateURI);\n const templateFromRegistry = field(getTemplate, TengoTemplateGetTemplate);\n\n // Note: it has a resource schema, so platforma creates fields by itself.\n\n tx.setField(registry, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.registry))));\n tx.setField(uri, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.path))));\n\n return templateFromRegistry;\n}\n\nfunction loadTemplateFromExplicit(tx: PlTransaction, spec: ExplicitTemplate): AnyRef {\n const templatePack = tx.createValue(TengoTemplatePack, spec.content);\n const templatePackConvert = tx.createStruct(TengoTemplatePackConvert);\n const templatePackField = field(templatePackConvert, TengoTemplatePackConvertTemplatePack);\n const template = field(templatePackConvert, TengoTemplatePackConvertTemplate);\n\n tx.setField(templatePackField, templatePack);\n\n return template;\n}\n\nexport function loadTemplate(tx: PlTransaction, spec: TemplateSpecPrepared): AnyRef {\n switch (spec.type) {\n case 'from-registry':\n return loadTemplateFromRegistry(tx, spec);\n case 'explicit':\n return loadTemplateFromExplicitDirect(tx, spec);\n // return loadTemplateFromExplicit(tx, spec);\n default:\n return assertNever(spec);\n }\n}\n","import { ExplicitTemplate } from './template_spec';\nimport { ResourceType } from '@milaboratories/pl-client';\nimport { BlockConfigContainer } from '@platforma-sdk/model';\nimport { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\n\nexport type FrontendSpec = FrontendFromUrl | FrontendFromFolder;\n\nexport interface FrontendFromUrlData {\n url: string;\n}\n\nexport const FrontendFromUrlResourceType: ResourceType = { name: 'Frontend/FromUrl', version: '1' };\n\n/** Directs user of the block pack to download the contents from the URL\n * outside the pl infrastructure. */\nexport interface FrontendFromUrl extends FrontendFromUrlData {\n type: 'url';\n}\n\nexport interface FrontendFromFolderData {\n path: string;\n /** HMAC signature of the path using local secret encoded as hex. */\n signature: string;\n}\n\nexport const FrontendFromFolderResourceType: ResourceType = {\n name: 'Frontend/FromFolder',\n version: '1'\n};\n\n/** Directs user of the block pack to load frontend from specific local\n * folder. Signature allows to confirm that this is the same client who\n * added the resource. */\nexport interface FrontendFromFolder extends FrontendFromFolderData {\n type: 'local';\n}\n\n/** Direct instructions to create block-pack from client. Currently, this\n * is the only block-pack spec that can be directly materialized. */\nexport interface BlockPackExplicit {\n type: 'explicit';\n template: ExplicitTemplate;\n config: BlockConfigContainer;\n frontend: FrontendSpec;\n source: BlockPackSpec;\n}\n\n/** Block-pack spec that can be materialized in pl. */\nexport type BlockPackSpecPrepared = BlockPackExplicit;\n\n/** All block-pack specs. */\nexport type BlockPackSpecAny = BlockPackSpecPrepared | BlockPackSpec;\n","import { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport {\n FrontendFromFolderData,\n FrontendFromFolderResourceType,\n FrontendFromUrlData,\n FrontendFromUrlResourceType,\n FrontendSpec\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData)\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature\n } as FrontendFromFolderData)\n );\n default:\n return assertNever(spec);\n }\n}\n","import { AnyResourceRef, field, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport { assertNever, Signer } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport { Dispatcher, request } from 'undici';\nimport { createFrontend } from './frontend';\nimport { BlockConfig, BlockConfigContainer } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher\n ) {}\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8'\n });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'from-registry-v1': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await request(`${urlPrefix}/config.json`, httpOptions);\n\n return (await configResponse.body.json()) as BlockConfigContainer;\n }\n\n case 'from-registry-v2': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n return (await (\n await request(components.model.url, httpOptions)\n ).body.json()) as BlockConfigContainer;\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8')\n ) as BlockConfigContainer;\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath)\n },\n source: spec\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = JSON.parse(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8'\n })\n ) as BlockConfigContainer;\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath)\n },\n source\n };\n }\n\n case 'from-registry-v1': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await request(templateUrl, httpOptions);\n if (templateResponse.statusCode !== 200)\n throw new Error(\n `Block not found in registry (url = ${templateUrl} ; code = ${templateResponse.statusCode}): ` +\n JSON.stringify(spec)\n );\n const templateContent = new Uint8Array(await templateResponse.body.arrayBuffer());\n\n // config\n const configResponse = await request(`${urlPrefix}/config.json`, httpOptions);\n const config = (await configResponse.body.json()) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`\n },\n source: spec\n };\n }\n\n case 'from-registry-v2': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n (await (await request(components.model.url, httpOptions)).body.json()) as BlockConfigContainer;\n const getWorkflow = async () =>\n await (await request(components.workflow.main.url, httpOptions)).body.arrayBuffer();\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow)\n },\n config: model,\n frontend: {\n type: 'url',\n url: components.ui.url\n },\n source: spec\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackExplicit): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'explicit':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n","import { assertNever } from '@milaboratories/ts-helpers';\nimport { PlRef } from '@platforma-sdk/model';\n\nexport function outputRef(blockId: string, name: string): PlRef {\n return { __isRef: true, blockId, name };\n}\n\nexport function isBlockOutputReference(obj: any): obj is PlRef {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n obj.__isRef === true &&\n 'blockId' in obj &&\n 'name' in obj\n );\n}\n\nfunction addAllReferencedBlocks(result: BlockUpstreams, node: any, allowed?: Set<string>) {\n const type = typeof node;\n switch (type) {\n case 'function':\n case 'bigint':\n case 'number':\n case 'string':\n case 'boolean':\n case 'symbol':\n case 'undefined':\n return;\n\n case 'object':\n if (node === null) return;\n\n if (isBlockOutputReference(node)) {\n if (allowed === undefined || allowed.has(node.blockId)) result.upstreams.add(node.blockId);\n else result.missingReferences = true;\n } else if (Array.isArray(node)) {\n for (const child of node) addAllReferencedBlocks(result, child, allowed);\n } else {\n for (const [, child] of Object.entries(node as object))\n addAllReferencedBlocks(result, child, allowed);\n }\n\n return;\n\n default:\n assertNever(type);\n }\n}\n\nexport interface BlockUpstreams {\n /** Direct block dependencies */\n upstreams: Set<string>;\n /** True if not-allowed references was encountered */\n missingReferences: boolean;\n}\n\n/** Extracts all resource ids referenced by args object. */\nexport function inferAllReferencedBlocks(args: any, allowed?: Set<string>): BlockUpstreams {\n const result = { upstreams: new Set<string>(), missingReferences: false };\n addAllReferencedBlocks(result, args, allowed);\n return result;\n}\n","import { Block, ProjectStructure } from './project_model';\nimport { Optional, Writable } from 'utility-types';\nimport { inferAllReferencedBlocks } from './args';\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n }\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Direct upstreams */\n readonly upstream: Set<string>;\n /** Direct downstreams */\n readonly downstream: Set<string>;\n}\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(direction: 'upstream' | 'downstream', ...rootBlockIds: string[]): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: 'upstream' | 'downstream',\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: 'upstream' | 'downstream',\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n let nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction]!.forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, 'upstream' | 'downstream'>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false\n };\n result.set(id, current);\n if (previous === undefined) {\n current.upstream = new Set<string>();\n } else {\n current.upstream = new Set<string>([previous.id]);\n previous.downstream = new Set<string>([current.id]);\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport function productionGraph(\n structure: ProjectStructure,\n argsProvider: (blockId: string) => any | undefined\n): BlockGraph {\n const result = new Map<string, BlockGraphNode>();\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const possibleUpstreams = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const args = argsProvider(id);\n\n // skipping those blocks for which we don't have args\n if (args === undefined) continue;\n\n const upstreams = inferAllReferencedBlocks(args, possibleUpstreams);\n const node: BlockGraphNode = {\n id,\n missingReferences: upstreams.missingReferences,\n upstream: upstreams.upstreams,\n downstream: new Set<string>() // will be populated from downstream blocks\n };\n result.set(id, node);\n upstreams.upstreams.forEach((dep) => result.get(dep)!.downstream.add(id));\n possibleUpstreams.add(id);\n }\n\n return new BlockGraph(result);\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n let matched = 0;\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n","import { AnyRef, PlTransaction } from '@milaboratories/pl-client';\nimport { createRenderTemplate } from './template/render_template';\nimport { prepareTemplateSpec } from './template/template_loading';\nimport { TemplateSpecPrepared } from '../model/template_spec';\nimport { createHash } from 'crypto';\nimport { createRequire } from 'node:module';\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from '@platforma-sdk/workflow-tengo';\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(SdkTemplates['pframes.export-pframe']);\n if (preparedTemplate.type !== 'explicit') throw new Error('Unexpected prepared template type.');\n const hash = createHash('sha256').update(preparedTemplate.content).digest('hex');\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, ['result']).result;\n}\n","import {\n AnyRef,\n AnyResourceRef,\n BasicResourceData,\n ensureResourceIdNotNull,\n field,\n isNotNullResourceId,\n isNullResourceId,\n isResource,\n isResourceRef,\n Pl,\n PlClient,\n PlTransaction,\n ResourceId,\n ResourceRef\n} from '@milaboratories/pl-client';\nimport { createRenderHeavyBlock, createBContextFromUpstreams } from './template/render_block';\nimport {\n Block,\n BlockRenderingStateKey,\n ProjectStructure,\n ProjectStructureKey,\n parseProjectField,\n ProjectField,\n projectFieldName,\n ProjectRenderingState,\n SchemaVersionCurrent,\n SchemaVersionKey,\n ProjectResourceType,\n InitialBlockStructure,\n InitialProjectRenderingState,\n ProjectMetaKey,\n InitialBlockMeta,\n parseBlockFrontendStateKey,\n blockFrontendStateKey,\n blockArgsAuthorKey,\n ProjectLastModifiedTimestamp,\n ProjectCreatedTimestamp,\n ProjectStructureAuthorKey,\n getServiceTemplateField\n} from '../model/project_model';\nimport { BlockPackTemplateField, createBlockPack } from './block-pack/block_pack';\nimport {\n allBlocks,\n BlockGraph,\n graphDiff,\n productionGraph,\n stagingGraph\n} from '../model/project_model_util';\nimport { BlockPackSpecPrepared } from '../model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport {\n AuthorMarker,\n BlockSettings,\n InitialBlockSettings,\n ProjectMeta\n} from '@milaboratories/pl-model-middle-layer';\nimport Denque from 'denque';\nimport { exportContext, getPreparedExportTemplateEnvelope } from './context_export';\nimport { loadTemplate } from './template/template_loading';\n\ntype FieldStatus = 'NotReady' | 'Ready' | 'Error';\n\ninterface BlockFieldState {\n modCount: number;\n ref?: AnyRef;\n status?: FieldStatus;\n value?: Uint8Array;\n}\n\ntype BlockFieldStates = Partial<Record<ProjectField['fieldName'], BlockFieldState>>;\ntype BlockFieldStateValue = Omit<BlockFieldState, 'modCount'>;\n\ninterface BlockInfoState {\n readonly id: string;\n readonly fields: BlockFieldStates;\n}\n\nfunction cached<ModId, T>(modIdCb: () => ModId, valueCb: () => T): () => T {\n let initialized = false;\n let lastModId: ModId | undefined = undefined;\n let value: T | undefined = undefined;\n return () => {\n if (!initialized) {\n initialized = true;\n lastModId = modIdCb();\n value = valueCb();\n return value as T;\n }\n const currentModId = modIdCb();\n if (lastModId !== currentModId) {\n lastModId = currentModId;\n value = valueCb();\n }\n return valueCb() as T;\n };\n}\n\nclass BlockInfo {\n constructor(\n public readonly id: string,\n public readonly fields: BlockFieldStates\n ) {}\n\n public check() {\n // state assertions\n\n if ((this.fields.prodOutput === undefined) !== (this.fields.prodCtx === undefined))\n throw new Error('inconsistent prod fields');\n\n if ((this.fields.stagingOutput === undefined) !== (this.fields.stagingCtx === undefined))\n throw new Error('inconsistent stage fields');\n\n if (\n (this.fields.prodOutputPrevious === undefined) !==\n (this.fields.prodCtxPrevious === undefined)\n )\n throw new Error('inconsistent prod cache fields');\n\n if (\n (this.fields.stagingOutputPrevious === undefined) !==\n (this.fields.stagingCtxPrevious === undefined)\n )\n throw new Error('inconsistent stage cache fields');\n\n if (this.fields.blockPack === undefined) throw new Error('no block pack field');\n\n if (this.fields.currentArgs === undefined) throw new Error('no current args field');\n }\n\n private readonly currentInputsC = cached(\n () => this.fields.currentArgs!.modCount,\n () => JSON.parse(Buffer.from(this.fields.currentArgs!.value!).toString())\n );\n private readonly actualProductionInputsC = cached(\n () => this.fields.prodArgs?.modCount,\n () => {\n const bin = this.fields.prodArgs?.value;\n if (bin === undefined) return undefined;\n return JSON.parse(Buffer.from(bin).toString());\n }\n );\n\n get currentInputs(): any {\n return this.currentInputsC();\n }\n\n get stagingRendered(): boolean {\n return this.fields.stagingCtx !== undefined;\n }\n\n get productionRendered(): boolean {\n return this.fields.prodCtx !== undefined;\n }\n\n get productionHasErrors(): boolean {\n return this.fields.prodUiCtx?.status === 'Error';\n }\n\n private readonly productionStaleC: () => boolean = cached(\n () => `${this.fields.currentArgs!.modCount}_${this.fields.prodArgs?.modCount}`,\n () =>\n this.fields.prodArgs === undefined ||\n Buffer.compare(this.fields.currentArgs!.value!, this.fields.prodArgs.value!) !== 0\n );\n\n // get productionStale(): boolean {\n // return this.productionRendered && this.productionStaleC() && ;\n // }\n\n get requireProductionRendering(): boolean {\n return !this.productionRendered || this.productionStaleC() || this.productionHasErrors;\n }\n\n get actualProductionInputs(): any | undefined {\n return this.actualProductionInputsC();\n }\n\n public getTemplate(tx: PlTransaction): AnyRef {\n return tx.getFutureFieldValue(\n Pl.unwrapHolder(tx, this.fields.blockPack!.ref!),\n BlockPackTemplateField,\n 'Input'\n );\n }\n}\n\nexport interface NewBlockSpec {\n blockPack: BlockPackSpecPrepared;\n args: string;\n uiState: string;\n}\n\nconst NoNewBlocks = (blockId: string) => {\n throw new Error(`No new block info for ${blockId}`);\n};\n\nexport interface SetArgsRequest {\n blockId: string;\n args: string;\n}\n\ntype GraphInfoFields =\n | 'stagingUpstream'\n | 'stagingDownstream'\n | 'futureProductionUpstream'\n | 'futureProductionDownstream'\n | 'actualProductionUpstream'\n | 'actualProductionDownstream';\n\nexport class ProjectMutator {\n private globalModCount = 0;\n private fieldsChanged: boolean = false;\n\n //\n // Change trackers\n //\n\n private lastModifiedChanged = false;\n private structureChanged = false;\n private metaChanged = false;\n private renderingStateChanged = false;\n private readonly changedBlockFrontendStates = new Set<string>();\n\n /** Set blocks will be assigned current mutator author marker on save */\n private readonly blocksWithChangedInputs = new Set<string>();\n\n constructor(\n public readonly rid: ResourceId,\n private readonly tx: PlTransaction,\n private readonly author: AuthorMarker | undefined,\n private readonly schema: string,\n private lastModified: number,\n private meta: ProjectMeta,\n private struct: ProjectStructure,\n private readonly renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>,\n private readonly blocksInLimbo: Set<string>,\n private readonly blockInfos: Map<string, BlockInfo>,\n private readonly blockFrontendStates: Map<string, string>,\n private readonly ctxExportTplHolder: AnyResourceRef\n ) {}\n\n private fixProblemsAndMigrate() {\n // Fixing problems introduced by old code\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodArgs === undefined ||\n blockInfo.fields.prodOutput === undefined ||\n blockInfo.fields.prodCtx === undefined\n )\n this.deleteBlockFields(blockInfo.id, 'prodArgs', 'prodOutput', 'prodCtx');\n });\n\n // Migration for addition of block settings field\n let initialBlockSettings: Omit<BlockFieldState, 'modCount'> | undefined;\n this.blockInfos.forEach((blockInfo) => {\n if (blockInfo.fields.blockSettings === undefined) {\n if (initialBlockSettings === undefined)\n initialBlockSettings = this.createJsonFieldValue(InitialBlockSettings);\n this.setBlockFieldObj(blockInfo.id, 'blockSettings', initialBlockSettings);\n }\n });\n }\n\n get wasModified(): boolean {\n return (\n this.lastModifiedChanged ||\n this.structureChanged ||\n this.fieldsChanged ||\n this.metaChanged ||\n this.renderingStateChanged ||\n this.changedBlockFrontendStates.size > 0\n );\n }\n\n get structure(): ProjectStructure {\n // clone\n return JSON.parse(JSON.stringify(this.struct));\n }\n\n //\n // Graph calculation\n //\n\n private stagingGraph: BlockGraph | undefined = undefined;\n private pendingProductionGraph: BlockGraph | undefined = undefined;\n private actualProductionGraph: BlockGraph | undefined = undefined;\n\n private getStagingGraph(): BlockGraph {\n if (this.stagingGraph === undefined) this.stagingGraph = stagingGraph(this.struct);\n return this.stagingGraph;\n }\n\n private getPendingProductionGraph(): BlockGraph {\n if (this.pendingProductionGraph === undefined)\n this.pendingProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getBlockInfo(blockId).currentInputs\n );\n return this.pendingProductionGraph;\n }\n\n private getActualProductionGraph(): BlockGraph {\n if (this.actualProductionGraph === undefined)\n this.actualProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getBlockInfo(blockId).actualProductionInputs\n );\n return this.actualProductionGraph;\n }\n\n //\n // Generic helpers to interact with project state\n //\n\n private getBlockInfo(blockId: string): BlockInfo {\n const info = this.blockInfos.get(blockId);\n if (info === undefined) throw new Error(`No such block: ${blockId}`);\n return info;\n }\n\n private createJsonFieldValueByContent(content: string): BlockFieldStateValue {\n const value = Buffer.from(content);\n const ref = this.tx.createValue(Pl.JsonObject, value);\n return { ref, value, status: 'Ready' };\n }\n\n private createJsonFieldValue(obj: unknown): BlockFieldStateValue {\n return this.createJsonFieldValueByContent(JSON.stringify(obj));\n }\n\n private getBlock(blockId: string): Block {\n for (const block of allBlocks(this.struct)) if (block.id === blockId) return block;\n throw new Error('block not found');\n }\n\n private setBlockFieldObj(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n state: BlockFieldStateValue\n ) {\n const fid = field(this.rid, projectFieldName(blockId, fieldName));\n\n if (state.ref === undefined) throw new Error(\"Can't set value with empty ref\");\n\n if (this.getBlockInfo(blockId).fields[fieldName] === undefined)\n this.tx.createField(fid, 'Dynamic', state.ref);\n else this.tx.setField(fid, state.ref);\n\n this.getBlockInfo(blockId).fields[fieldName] = {\n modCount: this.globalModCount++,\n ...state\n };\n\n this.fieldsChanged = true;\n }\n\n private setBlockField(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n ref: AnyRef,\n status: FieldStatus,\n value?: Uint8Array\n ) {\n this.setBlockFieldObj(blockId, fieldName, { ref, status, value });\n }\n\n private deleteBlockFields(blockId: string, ...fieldNames: (keyof BlockFieldStates)[]): boolean {\n let deleted = false;\n const info = this.getBlockInfo(blockId);\n for (const fieldName of fieldNames) {\n const fields = info.fields;\n if (!(fieldName in fields)) continue;\n this.tx.removeField(field(this.rid, projectFieldName(blockId, fieldName)));\n delete fields[fieldName];\n this.fieldsChanged = true;\n deleted = true;\n }\n return deleted;\n }\n\n private updateLastModified() {\n this.lastModified = Date.now();\n this.lastModifiedChanged = true;\n }\n\n //\n // Main project actions\n //\n\n private resetStagingRefreshTimestamp() {\n this.renderingState.stagingRefreshTimestamp = Date.now();\n this.renderingStateChanged = true;\n }\n\n private resetStaging(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.stagingOutput?.status === 'Ready' &&\n fields.stagingCtx?.status === 'Ready' &&\n fields.stagingUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'stagingOutputPrevious', fields.stagingOutput);\n this.setBlockFieldObj(blockId, 'stagingCtxPrevious', fields.stagingCtx);\n this.setBlockFieldObj(blockId, 'stagingUiCtxPrevious', fields.stagingUiCtx);\n }\n if (this.deleteBlockFields(blockId, 'stagingOutput', 'stagingCtx', 'stagingUiCtx'))\n this.resetStagingRefreshTimestamp();\n }\n\n private resetProduction(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.prodOutput?.status === 'Ready' &&\n fields.prodCtx?.status === 'Ready' &&\n fields.prodUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'prodOutputPrevious', fields.prodOutput);\n this.setBlockFieldObj(blockId, 'prodCtxPrevious', fields.prodCtx);\n this.setBlockFieldObj(blockId, 'prodUiCtxPrevious', fields.prodUiCtx);\n }\n this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');\n }\n\n /** Running blocks are reset, already computed moved to limbo. Returns if\n * either of the actions were actually performed. */\n private resetOrLimboProduction(blockId: string): boolean {\n const fields = this.getBlockInfo(blockId).fields;\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {\n if (this.blocksInLimbo.has(blockId))\n // we are already in limbo\n return false;\n\n // limbo\n this.blocksInLimbo.add(blockId);\n this.renderingStateChanged = true;\n\n // doing some gc\n this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');\n\n return true;\n }\n // reset\n else return this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');\n }\n\n /** Optimally sets inputs for multiple blocks in one go */\n public setArgs(requests: SetArgsRequest[]) {\n const changed: string[] = [];\n for (const { blockId, args } of requests) {\n const info = this.getBlockInfo(blockId);\n JSON.parse(args); // checking\n const binary = Buffer.from(args);\n if (Buffer.compare(info.fields.currentArgs!.value!, binary) === 0) continue;\n const argsRef = this.tx.createValue(Pl.JsonObject, binary);\n this.setBlockField(blockId, 'currentArgs', argsRef, 'Ready', binary);\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(blockId);\n changed.push(blockId);\n }\n\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', changed, ({ id }) => this.resetStaging(id));\n\n if (changed.length > 0) this.updateLastModified();\n }\n\n public setUiState(blockId: string, newState: string | undefined): void {\n if (this.blockInfos.get(blockId) === undefined) throw new Error('no such block');\n if (this.blockFrontendStates.get(blockId) === newState) return;\n if (newState === undefined) this.blockFrontendStates.delete(blockId);\n else this.blockFrontendStates.set(blockId, newState);\n this.changedBlockFrontendStates.add(blockId);\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(blockId);\n this.updateLastModified();\n }\n\n public setBlockSettings(blockId: string, newValue: BlockSettings): void {\n this.setBlockFieldObj(blockId, 'blockSettings', this.createJsonFieldValue(newValue));\n this.updateLastModified();\n }\n\n /** Update block label */\n // public setBlockLabel(blockId: string, label: string): void {\n // const newStructure = this.structure;\n // let ok = false;\n // for (const block of allBlocks(newStructure))\n // if (block.id === blockId) {\n // block.label = label;\n // ok = true;\n // break;\n // }\n // if (!ok) throw new Error(`block ${blockId} not found`);\n // this.updateStructure(newStructure);\n // this.updateLastModified();\n // }\n\n private createCtx(upstream: Set<string>, ctxField: 'stagingCtx' | 'prodCtx'): AnyRef {\n const upstreamContexts: AnyRef[] = [];\n upstream.forEach((id) => {\n const info = this.getBlockInfo(id);\n if (info.fields[ctxField] === undefined || info.fields[ctxField]!.ref === undefined)\n throw new Error('One of the upstreams staging is not rendered.');\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields[ctxField]!.ref!));\n });\n return createBContextFromUpstreams(this.tx, upstreamContexts);\n }\n\n private exportCtx(ctx: AnyRef): AnyRef {\n return exportContext(this.tx, Pl.unwrapHolder(this.tx, this.ctxExportTplHolder), ctx);\n }\n\n private renderStagingFor(blockId: string) {\n this.resetStaging(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createCtx(this.getStagingGraph().nodes.get(blockId)!.upstream, 'stagingCtx');\n\n if (this.getBlock(blockId).renderingMode !== 'Heavy') throw new Error('not supported yet');\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(false)),\n context: ctx\n });\n\n this.setBlockField(\n blockId,\n 'stagingCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady'\n );\n\n this.setBlockField(blockId, 'stagingUiCtx', this.exportCtx(results.context), 'NotReady');\n\n this.setBlockField(blockId, 'stagingOutput', results.result, 'NotReady');\n }\n\n private renderProductionFor(blockId: string) {\n this.resetProduction(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createCtx(\n this.getPendingProductionGraph().nodes.get(blockId)!.upstream,\n 'prodCtx'\n );\n\n if (this.getBlock(blockId).renderingMode === 'Light')\n throw new Error(\"Can't render production for light block.\");\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(true)),\n context: ctx\n });\n this.setBlockField(\n blockId,\n 'prodCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady'\n );\n this.setBlockField(blockId, 'prodUiCtx', this.exportCtx(results.context), 'NotReady');\n this.setBlockField(blockId, 'prodOutput', results.result, 'NotReady');\n\n // saving inputs for which we rendered the production\n this.setBlockFieldObj(blockId, 'prodArgs', info.fields.currentArgs!);\n\n // removing block from limbo as we juts rendered fresh production for it\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n }\n\n //\n // Structure changes\n //\n\n /** Very generic method, better check for more specialized case-specific methods first. */\n public updateStructure(\n newStructure: ProjectStructure,\n newBlockSpecProvider: (blockId: string) => NewBlockSpec = NoNewBlocks\n ): void {\n const currentStagingGraph = this.getStagingGraph();\n const currentActualProductionGraph = this.getActualProductionGraph();\n\n const newStagingGraph = stagingGraph(newStructure);\n\n // new actual production graph without new blocks\n const newActualProductionGraph = productionGraph(\n newStructure,\n (blockId) => this.blockInfos.get(blockId)?.actualProductionInputs\n );\n\n const stagingDiff = graphDiff(currentStagingGraph, newStagingGraph);\n const prodDiff = graphDiff(currentActualProductionGraph, newActualProductionGraph);\n\n // removing blocks\n for (const blockId of stagingDiff.onlyInA) {\n const { fields } = this.getBlockInfo(blockId);\n this.deleteBlockFields(blockId, ...(Object.keys(fields) as ProjectField['fieldName'][]));\n this.blockInfos.delete(blockId);\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n if (this.blockFrontendStates.delete(blockId)) this.changedBlockFrontendStates.add(blockId);\n }\n\n // creating new blocks\n for (const blockId of stagingDiff.onlyInB) {\n const info = new BlockInfo(blockId, {});\n this.blockInfos.set(blockId, info);\n const spec = newBlockSpecProvider(blockId);\n\n // block pack\n const bp = createBlockPack(this.tx, spec.blockPack);\n this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');\n\n // settings\n this.setBlockFieldObj(\n blockId,\n 'blockSettings',\n this.createJsonFieldValue(InitialBlockSettings)\n );\n\n // args\n this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));\n\n // uiState\n if (spec.uiState /* this check is for compatibility with old configs */) {\n this.blockFrontendStates.set(blockId, spec.uiState);\n this.changedBlockFrontendStates.add(blockId);\n }\n\n // checking structure\n info.check();\n }\n\n // resetting stagings affected by topology change\n for (const blockId of stagingDiff.different) this.resetStaging(blockId);\n\n // applying changes due to topology change in production to affected nodes and\n // all their downstreams\n currentActualProductionGraph.traverse('downstream', [...prodDiff.different], (node) => {\n this.resetOrLimboProduction(node.id);\n });\n\n if (\n stagingDiff.onlyInB.size > 0 ||\n stagingDiff.onlyInA.size > 0 ||\n stagingDiff.different.size > 0\n )\n this.resetStagingRefreshTimestamp();\n\n this.struct = newStructure;\n this.structureChanged = true;\n this.stagingGraph = undefined;\n this.pendingProductionGraph = undefined;\n this.actualProductionGraph = undefined;\n\n this.updateLastModified();\n }\n\n //\n // Structure change helpers\n //\n\n public addBlock(block: Block, spec: NewBlockSpec, before?: string): void {\n const newStruct = this.structure; // copy current structure\n if (before === undefined) {\n // adding as a very last block\n newStruct.groups[newStruct.groups.length - 1].blocks.push(block);\n } else {\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === before);\n if (idx < 0) continue;\n group.blocks.splice(idx, 0, block);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${before}`);\n }\n this.updateStructure(newStruct, (blockId) => {\n if (blockId !== block.id) throw new Error('Unexpected');\n return spec;\n });\n }\n\n public deleteBlock(blockId: string): void {\n const newStruct = this.structure; // copy current structure\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === blockId);\n if (idx < 0) continue;\n group.blocks.splice(idx, 1);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${blockId}`);\n this.updateStructure(newStruct);\n }\n\n //\n // Block-pack migration\n //\n\n public migrateBlockPack(blockId: string, spec: BlockPackSpecPrepared, newArgs?: string): void {\n const info = this.getBlockInfo(blockId);\n\n this.setBlockField(\n blockId,\n 'blockPack',\n Pl.wrapInHolder(this.tx, createBlockPack(this.tx, spec)),\n 'NotReady'\n );\n\n if (newArgs !== undefined) {\n // this will also reset all downstream stagings\n this.setArgs([{ blockId, args: newArgs }]);\n // reset UI state along with args\n this.setUiState(blockId, undefined);\n }\n // resetting staging outputs for all downstream blocks\n else\n this.getStagingGraph().traverse('downstream', [blockId], ({ id }) => this.resetStaging(id));\n\n // also reset or limbo all downstream productions\n if (info.productionRendered)\n this.getActualProductionGraph().traverse('downstream', [blockId], ({ id }) =>\n this.resetOrLimboProduction(id)\n );\n\n this.updateLastModified();\n }\n\n //\n // Render\n //\n\n public renderProduction(blockIds: string[], addUpstreams: boolean = false): Set<string> {\n const blockIdsSet = new Set(blockIds);\n\n const prodGraph = this.getPendingProductionGraph();\n if (addUpstreams)\n // adding all upstreams automatically\n prodGraph.traverse('upstream', blockIds, (node) => {\n blockIdsSet.add(node.id);\n });\n // checking that targets contain all upstreams\n else\n for (const blockId of blockIdsSet) {\n const node = prodGraph.nodes.get(blockId);\n if (node === undefined) throw new Error(`Can't find block with id: ${blockId}`);\n for (const upstream of node.upstream)\n if (!blockIdsSet.has(upstream))\n throw new Error(\"Can't render blocks not including all upstreams.\");\n }\n\n // traversing in topological order and rendering target blocks\n const rendered = new Set<string>();\n for (const block of allBlocks(this.structure)) {\n if (!blockIdsSet.has(block.id)) continue;\n\n let render =\n this.getBlockInfo(block.id).requireProductionRendering || this.blocksInLimbo.has(block.id);\n\n if (!render)\n for (const upstream of prodGraph.nodes.get(block.id)!.upstream)\n if (rendered.has(upstream)) {\n render = true;\n break;\n }\n\n if (render) {\n this.renderProductionFor(block.id);\n rendered.add(block.id);\n }\n }\n\n // sending to limbo all downstream blocks\n prodGraph.traverse('downstream', [...rendered], (node) => {\n if (rendered.has(node.id))\n // don't send to limbo blocks that were just rendered\n return;\n this.resetOrLimboProduction(node.id);\n });\n\n if (rendered.size > 0) this.updateLastModified();\n\n return rendered;\n }\n\n /** Stops running blocks from the list and modify states of other blocks\n * accordingly */\n public stopProduction(...blockIds: string[]) {\n const activeProdGraph = this.getActualProductionGraph();\n\n // we will stop all blocks listed in request and all their downstreams\n const queue = new Denque(blockIds);\n const queued = new Set(blockIds);\n const stopped: string[] = [];\n\n while (!queue.isEmpty()) {\n const blockId = queue.shift()!;\n const fields = this.getBlockInfo(blockId).fields;\n\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready')\n // skipping finished blocks\n continue;\n\n if (this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs')) {\n // was actually stopped\n stopped.push(blockId);\n\n // will try to stop all its downstreams\n for (const downstream of activeProdGraph.traverseIdsExcludingRoots('downstream', blockId)) {\n if (queued.has(downstream)) continue;\n queue.push(downstream);\n queued.add(downstream);\n }\n }\n }\n\n // blocks under stopped blocks, but still having results, goes to limbo\n for (const blockId of activeProdGraph.traverseIdsExcludingRoots('downstream', ...stopped))\n this.resetOrLimboProduction(blockId);\n }\n\n private traverseWithStagingLag(cb: (blockId: string, lag: number) => void) {\n const lags = new Map<string, number>();\n const stagingGraph = this.getStagingGraph();\n stagingGraph.nodes.forEach((node) => {\n const info = this.getBlockInfo(node.id);\n let lag = info.stagingRendered ? 0 : 1;\n node.upstream.forEach((upstream) => {\n const upstreamLag = lags.get(upstream)!;\n if (upstreamLag === 0) return;\n lag = Math.max(upstreamLag + 1, lag);\n });\n cb(node.id, lag);\n lags.set(node.id, lag);\n });\n }\n\n /** @param stagingRenderingRate rate in blocks per second */\n private refreshStagings(stagingRenderingRate?: number) {\n const elapsed = Date.now() - this.renderingState.stagingRefreshTimestamp;\n const lagThreshold =\n stagingRenderingRate === undefined\n ? undefined\n : 1 + Math.max(0, (elapsed * stagingRenderingRate) / 1000);\n let rendered = 0;\n this.traverseWithStagingLag((blockId, lag) => {\n if (lag === 0)\n // meaning staging already rendered\n return;\n if (lagThreshold === undefined || lag <= lagThreshold) {\n this.renderStagingFor(blockId);\n rendered++;\n }\n });\n if (rendered > 0) this.resetStagingRefreshTimestamp();\n }\n\n //\n // Meta\n //\n\n /** Updates project metadata */\n public setMeta(meta: ProjectMeta): void {\n this.meta = meta;\n this.metaChanged = true;\n this.updateLastModified();\n }\n\n //\n // Maintenance\n //\n\n /** @param stagingRenderingRate rate in blocks per second */\n public doRefresh(stagingRenderingRate?: number) {\n this.refreshStagings(stagingRenderingRate);\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodCtx?.status === 'Ready' &&\n blockInfo.fields.prodOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious'\n );\n if (\n blockInfo.fields.stagingCtx?.status === 'Ready' &&\n blockInfo.fields.stagingOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'stagingOutputPrevious',\n 'stagingCtxPrevious',\n 'stagingUiCtxPrevious'\n );\n });\n }\n\n private assignAuthorMarkers() {\n const markerStr = this.author ? JSON.stringify(this.author) : undefined;\n\n for (const blockId of this.blocksWithChangedInputs)\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, blockArgsAuthorKey(blockId));\n else this.tx.setKValue(this.rid, blockArgsAuthorKey(blockId), markerStr);\n\n if (this.metaChanged || this.structureChanged) {\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, ProjectStructureAuthorKey);\n else this.tx.setKValue(this.rid, ProjectStructureAuthorKey, markerStr);\n }\n }\n\n public save() {\n if (!this.wasModified) return;\n\n if (this.lastModifiedChanged)\n this.tx.setKValue(this.rid, ProjectLastModifiedTimestamp, JSON.stringify(this.lastModified));\n\n if (this.structureChanged)\n this.tx.setKValue(this.rid, ProjectStructureKey, JSON.stringify(this.struct));\n\n if (this.renderingStateChanged)\n this.tx.setKValue(\n this.rid,\n BlockRenderingStateKey,\n JSON.stringify({\n ...this.renderingState,\n blocksInLimbo: [...this.blocksInLimbo]\n } as ProjectRenderingState)\n );\n\n if (this.metaChanged) this.tx.setKValue(this.rid, ProjectMetaKey, JSON.stringify(this.meta));\n\n for (const blockId of this.changedBlockFrontendStates) {\n const uiState = this.blockFrontendStates.get(blockId);\n if (uiState === undefined) this.tx.deleteKValue(this.rid, blockFrontendStateKey(blockId));\n else this.tx.setKValue(this.rid, blockFrontendStateKey(blockId), uiState);\n }\n\n this.assignAuthorMarkers();\n }\n\n public static async load(\n tx: PlTransaction,\n rid: ResourceId,\n author?: AuthorMarker\n ): Promise<ProjectMutator> {\n const fullResourceStateP = tx.getResourceData(rid, true);\n const schemaP = tx.getKValueJson<string>(rid, SchemaVersionKey);\n const lastModifiedP = tx.getKValueJson<number>(rid, ProjectLastModifiedTimestamp);\n const metaP = tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey);\n const structureP = tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey);\n const renderingStateP = tx.getKValueJson<ProjectRenderingState>(rid, BlockRenderingStateKey);\n\n const allKVP = tx.listKeyValuesString(rid);\n\n // loading jsons\n const [\n fullResourceState,\n schema,\n lastModified,\n meta,\n structure,\n { stagingRefreshTimestamp, blocksInLimbo },\n allKV\n ] = await Promise.all([\n fullResourceStateP,\n schemaP,\n lastModifiedP,\n metaP,\n structureP,\n renderingStateP,\n allKVP\n ]);\n if (schema !== SchemaVersionCurrent)\n throw new Error(\n `Can't act on this project resource because it has a wrong schema version: ${schema}`\n );\n\n // loading field information\n const blockInfoStates = new Map<string, BlockInfoState>();\n for (const f of fullResourceState.fields) {\n const projectField = parseProjectField(f.name);\n\n // processing only fields with known structure\n if (projectField === undefined) continue;\n\n let info = blockInfoStates.get(projectField.blockId);\n if (info === undefined) {\n info = {\n id: projectField.blockId,\n fields: {}\n };\n blockInfoStates.set(projectField.blockId, info);\n }\n\n info.fields[projectField.fieldName] = isNullResourceId(f.value)\n ? { modCount: 0 }\n : { modCount: 0, ref: f.value };\n }\n\n // loading ctx export template to check if we already have cached materialized template in our project\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n\n // expected field name\n const ctxExportTplCacheFieldName = getServiceTemplateField(ctxExportTplEnvelope.hash);\n const ctxExportTplField = fullResourceState.fields.find(\n (f) => f.name === ctxExportTplCacheFieldName\n );\n let ctxExportTplHolder: AnyResourceRef;\n if (ctxExportTplField !== undefined)\n ctxExportTplHolder = ensureResourceIdNotNull(ctxExportTplField.value);\n else {\n ctxExportTplHolder = Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec));\n tx.createField(\n field(rid, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n ctxExportTplHolder\n );\n }\n\n const renderingState = { stagingRefreshTimestamp };\n const blocksInLimboSet = new Set(blocksInLimbo);\n\n const blockFrontendStates = new Map<string, string>();\n for (const kv of allKV) {\n const blockId = parseBlockFrontendStateKey(kv.key);\n if (blockId === undefined) continue;\n blockFrontendStates.set(blockId, kv.value);\n }\n\n const requests: [BlockFieldState, Promise<BasicResourceData>][] = [];\n blockInfoStates!.forEach(({ id, fields }) => {\n for (const [, state] of Object.entries(fields)) {\n if (state.ref === undefined) continue;\n if (!isResource(state.ref) || isResourceRef(state.ref))\n throw new Error('unexpected behaviour');\n requests.push([state, tx.getResourceData(state.ref, false)]);\n }\n });\n for (const [state, response] of requests) {\n const result = await response;\n state.value = result.data;\n if (isNotNullResourceId(result.error)) state.status = 'Error';\n else if (result.resourceReady || isNotNullResourceId(result.originalResourceId))\n state.status = 'Ready';\n else state.status = 'NotReady';\n }\n\n const blockInfos = new Map<string, BlockInfo>();\n blockInfoStates.forEach(({ id, fields }) => blockInfos.set(id, new BlockInfo(id, fields)));\n\n // check consistency of project state\n const blockInStruct = new Set<string>();\n for (const b of allBlocks(structure)) {\n if (!blockInfos.has(b.id))\n throw new Error(`Inconsistent project structure: no inputs for ${b.id}`);\n blockInStruct.add(b.id);\n }\n blockInfos.forEach((info) => {\n if (!blockInStruct.has(info.id))\n throw new Error(`Inconsistent project structure: no structure entry for ${info.id}`);\n // checking structure\n info.check();\n });\n\n const prj = new ProjectMutator(\n rid,\n tx,\n author,\n schema,\n lastModified,\n meta,\n structure,\n renderingState,\n blocksInLimboSet,\n blockInfos,\n blockFrontendStates,\n ctxExportTplHolder\n );\n\n prj.fixProblemsAndMigrate();\n\n return prj;\n }\n}\n\nexport interface ProjectState {\n schema: string;\n structure: ProjectStructure;\n renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>;\n blocksInLimbo: Set<string>;\n blockInfos: Map<string, BlockInfo>;\n}\n\nexport async function createProject(\n tx: PlTransaction,\n meta: ProjectMeta = InitialBlockMeta\n): Promise<AnyResourceRef> {\n const prj = tx.createEphemeral(ProjectResourceType);\n tx.lock(prj);\n const ts = String(Date.now());\n tx.setKValue(prj, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n tx.setKValue(prj, ProjectCreatedTimestamp, ts);\n tx.setKValue(prj, ProjectLastModifiedTimestamp, ts);\n tx.setKValue(prj, ProjectMetaKey, JSON.stringify(meta));\n tx.setKValue(prj, ProjectStructureKey, JSON.stringify(InitialBlockStructure));\n tx.setKValue(prj, BlockRenderingStateKey, JSON.stringify(InitialProjectRenderingState));\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n tx.createField(\n field(prj, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec))\n );\n return prj;\n}\n\nexport async function withProject<T>(\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n cb: (p: ProjectMutator) => T | Promise<T>\n): Promise<T> {\n return withProjectAuthored(txOrPl, rid, undefined, cb);\n}\n\nexport async function withProjectAuthored<T>(\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n author: AuthorMarker | undefined,\n cb: (p: ProjectMutator) => T | Promise<T>\n): Promise<T> {\n if (txOrPl instanceof PlClient) {\n return await txOrPl.withWriteTx('ProjectAction', async (tx) => {\n const mut = await ProjectMutator.load(tx, rid, author);\n const result = await cb(mut);\n if (!mut.wasModified)\n // skipping save and commit altogether if no modifications were\n // actually made\n return result;\n mut.save();\n await tx.commit();\n return result;\n });\n } else {\n const mut = await ProjectMutator.load(txOrPl, rid, author);\n const result = await cb(mut);\n mut.save();\n return result;\n }\n}\n","import type { PColumnSpec, PColumnValues, PlRef, PObjectId, PObjectSpec } from '@platforma-sdk/model';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport {\n isNullResourceId,\n resourceType,\n resourceTypeToString,\n resourceTypesEqual,\n} from '@milaboratories/pl-client';\nimport type { Writable } from 'utility-types';\nimport { createHash } from 'node:crypto';\n\nexport function* allBlobs<B>(data: PFrameInternal.DataInfo<B>): Generator<B> {\n switch (data.type) {\n case 'Json':\n return;\n case 'JsonPartitioned':\n for (const [, blob] of Object.entries(data.parts)) yield blob;\n return;\n case 'BinaryPartitioned':\n for (const [, { index, values }] of Object.entries(data.parts)) {\n yield index;\n yield values;\n }\n return;\n default:\n assertNever(data);\n }\n}\n\nfunction mapValues<T extends object, TResult>(\n obj: T,\n callback: (v: T[keyof T], key: keyof T) => TResult,\n): { [K in keyof T]: TResult } {\n return Object.fromEntries(\n (Object.entries(obj) as { [K in keyof T]: [K, T[K]]; }[keyof T][])\n .map(([key, value]) => [key, callback(value, key)]),\n ) as { [K in keyof T]: TResult };\n}\n\nexport function mapBlobs<B1, B2>(\n data: PFrameInternal.DataInfo<B1>,\n mapping: (blob: B1) => B2,\n): PFrameInternal.DataInfo<B2> {\n switch (data.type) {\n case 'Json':\n return { ...data };\n case 'JsonPartitioned':\n return { ...data, parts: mapValues(data.parts, mapping) };\n case 'BinaryPartitioned':\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: mapping(v.index),\n values: mapping(v.values),\n })),\n };\n default:\n assertNever(data);\n }\n}\n\nexport const PColumnDataJsonPartitioned = resourceType('PColumnData/JsonPartitioned', '1');\nexport const PColumnDataJsonSuperPartitioned = resourceType(\n 'PColumnData/Partitioned/JsonPartitioned',\n '1',\n);\nexport const PColumnDataBinaryPartitioned = resourceType('PColumnData/BinaryPartitioned', '1');\nexport const PColumnDataBinarySuperPartitioned = resourceType(\n 'PColumnData/Partitioned/BinaryPartitioned',\n '1',\n);\nexport const PColumnDataJson = resourceType('PColumnData/Json', '1');\n\nexport type PColumnDataJsonResourceValue = {\n keyLength: number;\n data: Record<string, PFrameInternal.JsonDataValue>;\n};\n\nexport type PColumnDataPartitionedResourceValue = {\n partitionKeyLength: number;\n};\n\nexport type PColumnDataSuperPartitionedResourceValue = {\n superPartitionKeyLength: number;\n partitionKeyLength: number;\n};\n\nexport function parseDataInfoResource(\n data: PlTreeNodeAccessor,\n): PFrameInternal.DataInfo<ResourceInfo> {\n if (!data.getIsReadyOrError()) throw new Error('Data not ready.');\n\n const resourceData = data.getDataAsJson();\n if (resourceData === undefined)\n throw new Error('unexpected data info structure, no resource data');\n\n if (resourceTypesEqual(data.resourceType, PColumnDataJson)) {\n const dataContent = resourceData as PColumnDataJsonResourceValue;\n\n return {\n type: 'Json',\n keyLength: dataContent.keyLength,\n data: dataContent.data,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts = Object.fromEntries(\n data\n .listInputFields()\n .map((field) => [field, data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo]),\n );\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonSuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<string, ResourceInfo> = {};\n for (const superKey of data.listInputFields()) {\n const superPart = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superPart.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const key of keys) {\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],\n ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);\n parts[partKey] = superPart.traverse({ field: key, errorIfFieldNotSet: true }).resourceInfo;\n }\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinaryPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<PFrameInternal.BinaryChunkInfo<ResourceInfo>>>\n > = {};\n\n // parsing the structure\n for (const field of data.listInputFields()) {\n if (field.endsWith('.index')) {\n const partKey = field.slice(0, field.length - 6);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.index = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const partKey = field.slice(0, field.length - 7);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.values = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n\n // structure validation\n for (const [key, part] of Object.entries(parts)) {\n if (part.index === undefined) throw new Error(`no index for part ${key}`);\n if (part.values === undefined) throw new Error(`no values for part ${key}`);\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinarySuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<PFrameInternal.BinaryChunkInfo<ResourceInfo>>>\n > = {};\n for (const superKey of data.listInputFields()) {\n const superData = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superData.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const field of keys) {\n if (field.endsWith('.index')) {\n const key = field.slice(0, field.length - 6);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],\n ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].index = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const key = field.slice(0, field.length - 7);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],\n ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].values = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>,\n };\n }\n\n throw new Error(`unsupported resource type: ${resourceTypeToString(data.resourceType)}`);\n}\n\nexport function makeDataInfoResource(\n spec: PColumnSpec,\n data: PColumnValues,\n): PFrameInternal.DataInfo<ResourceInfo> {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PFrameInternal.JsonDataValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength)\n throw new Error(`inline column key length ${key.length} differs from axes count ${keyLength}`);\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: 'Json',\n keyLength,\n data: jsonData,\n };\n}\n\nexport function deriveLegacyPObjectId(spec: PObjectSpec, data: PlTreeNodeAccessor): PObjectId {\n const hash = createHash('sha256');\n hash.update(canonicalize(spec)!);\n hash.update(String(!isNullResourceId(data.originalId) ? data.originalId : data.id));\n return hash.digest().toString('hex') as PObjectId;\n}\n\nexport function deriveGlobalPObjectId(blockId: string, exportName: string): PObjectId {\n return canonicalize({ __isRef: true, blockId, name: exportName } satisfies PlRef)! as PObjectId;\n}\n\nexport function deriveLocalPObjectId(resolvePath: string[], outputName: string): PObjectId {\n return canonicalize({ resolvePath, name: outputName })! as PObjectId;\n}\n","import { PlError, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { PObject, PObjectId, PObjectSpec, ValueOrError } from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport assert from 'assert';\nimport { Writable } from 'utility-types';\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from './data';\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, string> | undefined;\n}\n\nconst BContextValuePrefix = 'values/';\nconst BContextValueSpecSuffix = '.spec';\nconst BContextValueDataSuffix = '.data';\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = ''\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as 'spec' | 'data';\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case 'spec':\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors\n })\n ?.getDataAsJson();\n break;\n case 'data':\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors\n });\n default:\n // other value types planned\n continue;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = '',\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error('resource is not ready');\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw new PlError(data.error);\n collection[outputName] = {\n id: resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value\n };\n }\n return collection;\n}\n","import { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError,\n executePSpecPredicate,\n mapValueInVOE\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { outputRef } from '../model/args';\nimport {\n Block,\n ProjectStructure,\n ProjectStructureKey,\n projectFieldName\n} from '../model/project_model';\nimport { allBlocks, stagingGraph } from '../model/project_model_util';\nimport { Optional } from 'utility-types';\nimport { deriveGlobalPObjectId } from './data';\nimport {\n RawPObjectCollection,\n RawPObjectEntry,\n parseRawPObjectCollection\n} from './p_object_collection';\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, 'blockId' | 'name'>;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n if (block.staging === undefined) this.ctx.markUnstable(`staging_not_rendered:${blockId}`);\n else if (!block.staging.locked) this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string\n ): ValueOrError<PObject<PlTreeNodeAccessor>, string> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName);\n let data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result!.spec!,\n data: value\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value\n }\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, string>>, 'id'>\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, string>>, 'id'>\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data\n }\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec\n });\n exportsProcessed.add(exportName);\n }\n } else markUnstable(`staging_not_rendered:${blockId}`); // because staging will be inevitably rendered soon\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n const ret: ExtendedOption[] = [];\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + ' / ' + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds('upstream', rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'prodCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'prodUiCtx'),\n stableIfNotFound: true\n })\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'stagingCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'stagingUiCtx')\n })\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, string> | undefined\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n","import { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { Optional } from 'utility-types';\nimport {\n Block,\n ProjectStructure,\n ProjectStructureKey,\n blockFrontendStateKey,\n projectFieldName\n} from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { ResultPool } from '../pool/result_pool';\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly uiState: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n};\n\nexport type BlockContextAny = Optional<BlockContextFull, 'prod' | 'staging' | 'getResultsPool'>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) =>\n notEmpty(\n cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'currentArgs'),\n errorIfFieldNotSet: true\n })\n .getDataAsString()\n );\n const activeArgs = (cCtx: ComputableCtx) =>\n cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'prodArgs'),\n stableIfNotFound: true\n })\n ?.getDataAsString();\n const uiState = (cCtx: ComputableCtx) =>\n cCtx.accessor(projectEntry).node().getKeyValueAsString(blockFrontendStateKey(blockId));\n return {\n blockId,\n args,\n activeArgs,\n uiState,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n }\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'prodOutput'),\n stableIfNotFound: true,\n ignoreError: true\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'stagingOutput'),\n ignoreError: true\n })\n ?.persist();\n if (result === undefined) cCtx.markUnstable('staging_not_rendered');\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId)\n };\n}\n","import { Cfg } from '@platforma-sdk/model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function* traverseCfg(cfg: Cfg, guide?: (cfg: Cfg) => boolean): Generator<Cfg> {\n yield cfg;\n if (guide !== undefined && !guide(cfg)) return;\n switch (cfg.type) {\n case 'GetFromCtx':\n case 'Immediate':\n return;\n case 'Isolate':\n yield* traverseCfg(cfg.cfg);\n return;\n case 'MakeObject':\n for (const [, child] of Object.entries(cfg.template)) yield* traverseCfg(child);\n return;\n case 'MakeArray':\n for (const child of cfg.template) yield* traverseCfg(child);\n return;\n case 'GetJsonField':\n case 'GetResourceField':\n yield* traverseCfg(cfg.source);\n yield* traverseCfg(cfg.field);\n return;\n case 'MapRecordValues':\n case 'MapArrayValues':\n case 'MapResourceFields':\n yield* traverseCfg(cfg.source);\n yield* traverseCfg(cfg.mapping);\n return;\n case 'Flatten':\n case 'GetResourceValueAsJson':\n case 'GetBlobContent':\n case 'ExtractArchiveAndGetURL':\n case 'GetBlobContentAsString':\n case 'GetBlobContentAsJson':\n case 'GetDownloadedBlobContent':\n case 'GetOnDemandBlobContent':\n case 'GetImportProgress':\n case 'GetLastLogs':\n case 'GetProgressLog':\n case 'GetProgressLogWithInfo':\n case 'GetLogHandle':\n yield* traverseCfg(cfg.source);\n return;\n case 'IsEmpty':\n yield* traverseCfg(cfg.arg);\n return;\n case 'Not':\n yield* traverseCfg(cfg.operand);\n return;\n case 'And':\n case 'Or':\n yield* traverseCfg(cfg.operand1);\n yield* traverseCfg(cfg.operand2);\n return;\n default:\n assertNever(cfg);\n }\n}\n","import { Cfg } from '@platforma-sdk/model';\nimport { traverseCfg } from './traverse';\n\nexport function mapRecord<T1, T2, Key extends string>(\n obj: Record<Key, T1>,\n mapper: (value: T1) => T2\n): Record<Key, T2> {\n const result = {} as Record<Key, T2>;\n for (const [key, value] of Object.entries(obj)) result[key as Key] = mapper(value as T1);\n return result;\n}\n\nexport function ifNotUndef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\nfunction isActiveCfg(cfg: Cfg): boolean {\n switch (cfg.type) {\n case 'GetImportProgress':\n return true;\n default:\n return false;\n }\n}\n\nexport function hasActiveCfgComponents(cfg: Cfg): boolean {\n for (const nested of traverseCfg(cfg)) if (isActiveCfg(nested)) return true;\n return false;\n}\n","import {\n ArchiveFormat,\n Cfg,\n CfgMapArrayValues,\n CfgMapRecordValues,\n CfgMapResourceFields\n} from '@platforma-sdk/model';\nimport { ArgumentRequests, Operation, OperationAction, Subroutine } from './operation';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { mapRecord } from './util';\nimport { computableFromCfgUnsafe } from './executor';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { Computable } from '@milaboratories/computable';\n\nfunction res(result: unknown): OperationAction {\n return {\n type: 'ReturnResult',\n result: result\n };\n}\n\nexport function resOp(result: unknown): Operation {\n return () => res(result);\n}\n\n//\n// Subroutines\n//\n\nconst SRMakeObject: Subroutine = (args) => {\n const result: Record<string | symbol, any> = {};\n for (const [k, v] of Object.entries(args)) result[k] = v;\n return resOp(result);\n};\n\nconst SRFlatten: Subroutine = (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n const result: unknown[] = [];\n for (const nested of source) {\n if (nested instanceof Array) result.push(...nested);\n else result.push(nested);\n }\n return resOp(result);\n};\n\nconst SRGetResourceField: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return ({ cCtx }) => {\n return res(cCtx.accessor(source).node().traverse(field)?.persist());\n };\n};\n\nfunction mapArrayToRecord<T, R>(elements: T[], cb: (e: T) => R): Record<string, R> {\n const result: Record<string, R> = {};\n const length = elements.length;\n for (let i = 0; i < length; i++) result[String(i)] = cb(elements[i]);\n return result;\n}\n\nfunction SRMapArrayValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapArrayValues, 'itVar' | 'mapping'>\n): Subroutine {\n return (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(source.length),\n args: mapArrayToRecord(source, (e) => renderCfg({ ...ctx, [ops.itVar]: e }, ops.mapping))\n });\n };\n}\n\nfunction SRCollectArrayFromArgs(length: number): Subroutine {\n return (args) => {\n const result: unknown[] = [];\n for (let i = 0; i < length; i++) result.push(args[String(i)]);\n return resOp(result);\n };\n}\n\nfunction SRMapRecordValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapRecordValues, 'itVar' | 'mapping'>\n): Subroutine {\n return (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n if (source === undefined) return resOp(undefined);\n const nextArgs: ArgumentRequests = {};\n for (const [k, v] of Object.entries(source)) {\n const newCtx = { ...ctx, [ops.itVar]: v };\n nextArgs[k] = renderCfg(newCtx, ops.mapping);\n }\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues2,\n args: nextArgs\n });\n };\n}\n\nconst SRMapRecordValues2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRIsEmpty: Subroutine = (args) => {\n const arg = args.arg as unknown[] | string | undefined;\n if (arg === undefined) return resOp(undefined);\n return resOp(arg.length === 0);\n};\n\nconst SRNot: Subroutine = (args) => {\n const operand = args.operand as boolean | undefined;\n if (operand === undefined) return resOp(undefined);\n return resOp(!operand);\n};\n\nconst SRAnd: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 && operand2);\n};\n\nconst SROr: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 || operand2);\n};\n\nconst SRResourceValueAsJson: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n return ({ cCtx }) => res(cCtx.accessor(source).node()?.getDataAsJson());\n};\n\nconst SRGetJsonField: Subroutine = (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return resOp(source[field]);\n};\n\nfunction SRMapResourceFields1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapResourceFields, 'itVar' | 'mapping'>\n): Subroutine {\n return (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx }) => {\n const node = cCtx.accessor(source).node();\n\n const nextArgs: ArgumentRequests = {};\n for (const fieldName of node.listInputFields()) {\n const res = node.traverse(fieldName);\n if (res === undefined) nextArgs[fieldName] = resOp(undefined);\n else {\n const newCtx = { ...ctx, [ops.itVar]: res.persist() };\n nextArgs[fieldName] = renderCfg(newCtx, ops.mapping);\n }\n }\n\n return {\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields2,\n args: nextArgs\n };\n };\n };\n}\n\nconst SRMapResourceFields2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRGetBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (ctx) => {\n return drivers.blobDriver.getDownloadedBlob(ctx.accessor(source).node().resourceInfo);\n },\n {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return await drivers.blobDriver.getContent(value.handle);\n }\n }\n )\n };\n };\n};\n\nconst SRGetBlobContentAsString: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx, drivers }) => {\n // getting target resource id and type\n const resourceInfo = cCtx.accessor(source).node().resourceInfo;\n\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(() => drivers.blobDriver.getDownloadedBlob(resourceInfo), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle);\n return content.toString();\n }\n })\n };\n };\n};\n\nconst SRGetBlobContentAsJson: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (c) => drivers.blobDriver.getDownloadedBlob(c.accessor(source).node().resourceInfo),\n {\n postprocessValue: async (value) => {\n if (value == undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle);\n if (content == undefined) return undefined;\n return JSON.parse(Buffer.from(content).toString());\n }\n }\n )\n };\n };\n};\n\nconst SRGetDownloadedBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobDriver.getDownloadedBlob(source)\n };\n };\n};\n\nconst SRGetOnDemandBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobDriver.getOnDemandBlob(source)\n };\n };\n};\n\nconst SRExtractArchiveAndGetURL: (format: ArchiveFormat) => Subroutine = (format) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobToURLDriver.extractArchiveAndGetURL(source, format)\n };\n };\n};\n\nconst SRGetImportProgress: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.uploadDriver.getProgressId(source)\n };\n };\n};\n\nconst SRGetLastLogs: (lines: number) => Subroutine = (lines) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLastLogs(source, lines)\n };\n };\n};\n\nconst SRGetProgressLog: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLog(source, patternToSearch)\n };\n };\n};\n\nconst SRGetProgressLogWithInfo: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLogWithInfo(source, patternToSearch)\n };\n };\n};\n\nconst SRGetLogHandle: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLogHandle(source)\n };\n };\n};\n\n/** Renders configuration into executor's Operation */\nexport function renderCfg(ctx: Record<string, unknown>, cfg: Cfg): Operation {\n switch (cfg.type) {\n case 'GetFromCtx':\n const ctxValue = ctx[cfg.variable];\n if (typeof ctxValue === 'function') return (e) => res(ctxValue(e.cCtx));\n else return resOp(ctxValue);\n\n case 'Isolate':\n return ({ drivers }) => ({\n type: 'ScheduleComputable',\n computable: computableFromCfgUnsafe(drivers, ctx, cfg.cfg)\n });\n\n case 'Immediate':\n return resOp(cfg.value);\n\n case 'GetJsonField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetJsonField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field)\n }\n });\n\n case 'MapArrayValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapArrayValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'MapRecordValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'MakeObject':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMakeObject,\n args: mapRecord(cfg.template, (c) => renderCfg(ctx, c))\n });\n\n case 'MakeArray':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(cfg.template.length),\n args: mapArrayToRecord(cfg.template, (e) => renderCfg(ctx, e))\n });\n\n case 'Flatten':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRFlatten,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'IsEmpty':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRIsEmpty,\n args: {\n arg: renderCfg(ctx, cfg.arg)\n }\n });\n\n case 'Not':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRNot,\n args: {\n operand: renderCfg(ctx, cfg.operand)\n }\n });\n\n case 'And':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRAnd,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2)\n }\n });\n\n case 'Or':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SROr,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2)\n }\n });\n\n case 'MapResourceFields':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetResourceField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetResourceField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field)\n }\n });\n\n case 'GetResourceValueAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRResourceValueAsJson,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContentAsString':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsString,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContentAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsJson,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetDownloadedBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetDownloadedBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetOnDemandBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetOnDemandBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'ExtractArchiveAndGetURL':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRExtractArchiveAndGetURL(cfg.format),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetImportProgress':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetImportProgress,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetLastLogs':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLastLogs(cfg.lines),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetProgressLog':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLog(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetProgressLogWithInfo':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLogWithInfo(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetLogHandle':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLogHandle,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n default:\n return assertNever(cfg);\n }\n}\n","import { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { PlResourceEntry, StdCtx } from '@platforma-sdk/model';\nimport { BlockContextAny } from './block_ctx';\n\ntype SC = StdCtx<unknown, unknown>;\ntype SCAO = Pick<SC, '$blockId' | '$ui' | '$args'>;\nexport type MatStdCtxArgsOnly = {\n [Var in keyof SCAO]: SCAO[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SCAO[Var];\n};\nexport type MatStdCtx = {\n [Var in keyof SC]: SC[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SC[Var];\n};\n\nexport const NonKeyCtxFields = ['$prod', '$staging'];\n\nexport function toCfgContext(ctx: BlockContextAny): MatStdCtx {\n return {\n $blockId: ctx.blockId,\n $args: (cCtx: ComputableCtx) => JSON.parse(ctx.args(cCtx)),\n $ui: (cCtx: ComputableCtx) => {\n const uiState = ctx.uiState(cCtx);\n return uiState !== undefined ? JSON.parse(uiState) : undefined;\n },\n $prod: ctx.prod,\n $staging: ctx.staging\n };\n}\n","import {\n ArgumentKey,\n ArgumentValues,\n ExecutionEnvironment,\n Operation,\n Subroutine\n} from './operation';\nimport Denque from 'denque';\nimport { assertNever, notEmpty } from '@milaboratories/ts-helpers';\nimport { Computable, ComputableCtx, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Cfg } from '@platforma-sdk/model';\nimport { renderCfg, resOp } from './renderer';\nimport canonicalize from 'canonicalize';\nimport { BlockContextAny } from '../middle_layer/block_ctx';\nimport { MiddleLayerDriverKit } from '../middle_layer/driver_kit';\nimport { NonKeyCtxFields, toCfgContext } from '../middle_layer/block_ctx_unsafe';\n\n/** Addresses pending subroutines inside the stack */\ntype SubroutineKey = symbol;\n\n/** Represents destination of the result of an operation. I.e. when sequence of\n * subroutine invocations, and computables terminates with result, this object\n * determines to which argument of which pending subroutine it should be delivered.\n * See special value for delivery of the final \"return\" result. */\ntype Destination = {\n op: SubroutineKey;\n arg: ArgumentKey;\n};\n\n/** Special address of operation, see below. */\nconst ReturnOpKey: unique symbol = Symbol();\n/** The same, but for the argument part of destination, see below. */\nconst ReturnArgKey = 'return';\n\n/** Special destination, telling the executor that corresponding result should\n * be exposed as a final result, and execution terminate at this point. */\nconst ReturnDestination = { op: ReturnOpKey, arg: ReturnArgKey } as Destination;\n\nfunction isReturnDestination(destination: Destination): Boolean {\n return destination.op == ReturnOpKey && destination.arg == ReturnArgKey;\n}\n\n/** Queued operation, used inside the executor */\ntype QueuedOperation = {\n operation: Operation;\n destination: Destination;\n};\n\n/** Queued computation, returned by the first round of config execution. Such\n * computables should be returned in the intermediate representation of the\n * enclosing computable, and after they are resolved and passed to the\n * postprocessing routine, should be injected into the execution stack to\n * finalize the computation. */\ntype ScheduledComputable = {\n destination: Destination;\n computable: Computable<unknown>;\n};\n\n/** This is what ScheduledComputable transforms from intermediate\n * representation to post-processing. */\ntype MaterializedComputable = {\n destination: Destination;\n computable: unknown;\n};\n\n/** Main entry inside the execution stack. */\ntype PendingSubroutine = {\n subroutine: Subroutine;\n destination: Destination;\n argCounter: number;\n args: ArgumentValues;\n};\n\n/** Execution stack. The closest concept that this object along with enclosed\n * {@link PendingSubroutine}s represent is a Continuation.\n * https://en.wikipedia.org/wiki/Continuation */\ntype ExecutionStack = {\n result?: unknown;\n pendingSubroutines: Map<SubroutineKey, PendingSubroutine>;\n};\n\n/** Returns initial stack value. */\nfunction zeroStack(): ExecutionStack {\n return { pendingSubroutines: new Map<SubroutineKey, PendingSubroutine>() };\n}\n\n/** Implements main executor mechanism.\n * @param env to be passed to while executing operations\n * @param stack execution stack to continue execution from\n * @param operations operations to initiate the execution process\n * @param allowComputables if false, scheduling of async computables will result in error\n * */\nfunction execute(\n env: ExecutionEnvironment,\n stack: ExecutionStack,\n operations: QueuedOperation[],\n allowComputables: boolean\n): ScheduledComputable[] {\n const operationQueue = new Denque<QueuedOperation>(operations);\n\n /** Returns false if final result is set as result of this operation,\n * true if we should continue processing. */\n const deliverResult = (destination: Destination, result: unknown): boolean => {\n if (isReturnDestination(destination)) {\n stack.result = result;\n return false;\n }\n\n const pending = notEmpty(stack.pendingSubroutines.get(destination.op));\n if (destination.arg in pending.args) throw new Error('argument already set');\n pending.args[destination.arg] = result;\n pending.argCounter--;\n if (pending.argCounter === 0) {\n stack.pendingSubroutines.delete(destination.op);\n operationQueue.push({\n destination: pending.destination,\n operation: pending.subroutine(pending.args)\n });\n }\n\n return true;\n };\n\n // computables, scheduled during computation, are aggregated in this array,\n // and returned from the function in the end\n const computables: ScheduledComputable[] = [];\n\n // each loop = execution of a single queued operation\n mainLoop: while (operationQueue.length > 0) {\n const op = operationQueue.shift()!;\n const action = op.operation(env);\n switch (action.type) {\n case 'ReturnResult':\n if (!deliverResult(op.destination, action.result)) break mainLoop; // this terminates execution\n break; // switch\n\n case 'ScheduleSubroutine':\n const newOpKey = Symbol();\n\n const argRequests = Object.entries(action.args);\n const initialArgCounter = argRequests.length;\n\n if (initialArgCounter === 0)\n // if no pending arguments\n operationQueue.push({\n destination: op.destination,\n operation: action.subroutine({})\n });\n else {\n for (const [arg, operation] of argRequests)\n operationQueue.push({\n destination: { op: newOpKey, arg },\n operation\n });\n\n stack.pendingSubroutines.set(newOpKey, {\n argCounter: initialArgCounter,\n args: {},\n subroutine: action.subroutine,\n destination: op.destination\n });\n }\n\n break;\n\n case 'ScheduleComputable':\n if (!allowComputables)\n throw new Error('asynchronous operations are forbidden in this context');\n computables.push({\n destination: op.destination,\n computable: action.computable\n });\n break;\n\n default:\n assertNever(action);\n }\n }\n\n return computables;\n}\n\n//\n// Computable\n//\n\n/** Main method to render configurations */\nexport function computableFromCfg(\n drivers: MiddleLayerDriverKit,\n bCtx: BlockContextAny,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n return computableFromCfgUnsafe(drivers, toCfgContext(bCtx), cfg, ops);\n}\n\nexport function computableFromCfgUnsafe(\n drivers: MiddleLayerDriverKit,\n ctx: Record<string, unknown>,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n const key =\n `${ctx.blockId}#` +\n canonicalize({\n ctx: Object.fromEntries(\n Object.entries(ctx).filter(([k]) => NonKeyCtxFields.indexOf(k) === -1)\n ),\n cfg: cfg\n })!;\n return Computable.makeRaw(\n (c) => {\n const env: ExecutionEnvironment = { drivers, cCtx: c };\n const stack = zeroStack();\n const computables = execute(\n env,\n stack,\n [\n {\n destination: ReturnDestination,\n operation: renderCfg(ctx, cfg)\n }\n ],\n true\n );\n return {\n ir: computables,\n async postprocessValue(value: MaterializedComputable[]): Promise<unknown> {\n const resolvedOps: QueuedOperation[] = [];\n for (const mc of value)\n resolvedOps.push({ destination: mc.destination, operation: resOp(mc.computable) });\n const postEnv: ExecutionEnvironment = {\n drivers,\n get cCtx(): ComputableCtx {\n throw new Error('asynchronous operations are forbidden in this context');\n }\n };\n\n // Post process can be called several times, that's why it must be a side-effect-free function.\n // But `execute` modifies a stack, so we have to defensively copy it here.\n const copyOfPendingSubrotines = new Map<SubroutineKey, PendingSubroutine>();\n for (const [key, value] of stack.pendingSubroutines)\n copyOfPendingSubrotines.set(key, { ...value, args: { ...value.args } });\n const copiedStack: ExecutionStack = {\n result: stack.result,\n pendingSubroutines: copyOfPendingSubrotines\n };\n execute(postEnv, copiedStack, resolvedOps, false);\n if (!('result' in copiedStack))\n throw new Error('illegal cfg rendering stack state, no result');\n return copiedStack.result;\n }\n };\n },\n { ...ops, key }\n );\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type {\n ArchiveFormat,\n CommonFieldTraverseOps as CommonFieldTraverseOpsFromSDK,\n FieldTraversalStep as FieldTraversalStepFromSDK,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n ProgressLogWithInfo,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n ResourceType as ResourceTypeFromSDK,\n ResultCollection,\n ValueOrError\n} from '@platforma-sdk/model';\nimport {\n JsRenderInternal,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport type { QuickJSContext, QuickJSHandle, VmFunctionImplementation } from 'quickjs-emscripten';\nimport { Scope } from 'quickjs-emscripten';\nimport type { Optional } from 'utility-types';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport type { Block } from '../model/project_model';\nimport { parseFinalPObjectCollection } from '../pool/p_object_collection';\nimport type { ResultPool } from '../pool/result_pool';\n\nfunction isArrayBufferOrView(obj: unknown): obj is ArrayBufferLike {\n return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);\n}\n\nfunction bytesToBase64(data: Uint8Array | undefined): string | undefined {\n return data !== undefined ? Buffer.from(data).toString('base64') : undefined;\n}\n\nexport class JsExecutionContext\n implements JsRenderInternal.GlobalCfgRenderCtxMethods<string, string>\n{\n private readonly callbackRegistry: QuickJSHandle;\n private readonly fnJSONStringify: QuickJSHandle;\n private readonly fnJSONParse: QuickJSHandle;\n\n public readonly computablesToResolve: Record<string, Computable<any>> = {};\n\n private computableCtx: ComputableCtx | undefined;\n private readonly accessors = new Map<string, PlTreeNodeAccessor | undefined>();\n\n private readonly meta: Map<string, Block>;\n\n constructor(\n private readonly scope: Scope,\n private readonly vm: QuickJSContext,\n private readonly blockCtx: BlockContextAny,\n private readonly env: MiddleLayerEnvironment,\n computableCtx: ComputableCtx\n ) {\n this.computableCtx = computableCtx;\n this.callbackRegistry = this.scope.manage(this.vm.newObject());\n\n this.fnJSONStringify = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'stringify'))\n );\n if (vm.typeof(this.fnJSONStringify) !== 'function')\n throw new Error(`JSON.stringify() not found.`);\n\n this.fnJSONParse = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'parse'))\n );\n if (vm.typeof(this.fnJSONParse) !== 'function') throw new Error(`JSON.parse() not found.`);\n\n this.meta = blockCtx.blockMeta(computableCtx);\n\n this.injectCtx();\n }\n\n public resetComputableCtx() {\n this.computableCtx = undefined;\n this.accessors.clear();\n }\n\n private static cleanErrorContext(error: unknown): void {\n if (typeof error === 'object' && error !== null && 'context' in error) delete error['context'];\n }\n\n public evaluateBundle(code: string) {\n try {\n this.vm.unwrapResult(this.vm.evalCode(code, 'bundle.js', { type: 'global' })).dispose();\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n }\n }\n\n public runCallback(cbName: string, ...args: unknown[]): QuickJSHandle {\n try {\n return Scope.withScope((localScope) => {\n const targetCallback = localScope.manage(this.vm.getProp(this.callbackRegistry, cbName));\n\n if (this.vm.typeof(targetCallback) !== 'function')\n throw new Error(`No such callback: ${cbName}`);\n\n return this.scope.manage(\n this.vm.unwrapResult(\n this.vm.callFunction(\n targetCallback,\n this.vm.undefined,\n ...args.map((arg) => this.exportObjectUniversal(arg, localScope))\n )\n )\n );\n });\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n }\n }\n\n //\n // Methods for injected ctx object\n //\n\n getAccessorHandleByName(name: string): string | undefined {\n if (this.computableCtx === undefined)\n throw new Error(\"Accessors can't be used in this context\");\n const wellKnownAccessor = (name: string, ctxKey: 'staging' | 'prod'): string | undefined => {\n if (!this.accessors.has(name)) {\n const lambda = this.blockCtx[ctxKey];\n if (lambda === undefined) throw new Error('Staging context not available');\n const entry = lambda(this.computableCtx!);\n if (!entry) this.accessors.set(name, undefined);\n else\n this.accessors.set(name, this.computableCtx!.accessor(entry).node({ ignoreError: true }));\n }\n return this.accessors.get(name) ? name : undefined;\n };\n if (name === 'staging') return wellKnownAccessor('staging', 'staging');\n else if (name === 'main') return wellKnownAccessor('main', 'prod');\n return undefined;\n }\n\n //\n // Accessors\n //\n\n resolveWithCommon(\n handle: string,\n commonOptions: CommonFieldTraverseOpsFromSDK,\n ...steps: (FieldTraversalStepFromSDK | string)[]\n ): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).traverseWithCommon(commonOptions, ...steps));\n }\n\n getResourceType(handle: string): ResourceTypeFromSDK {\n return this.getAccessor(handle).resourceType;\n }\n\n getInputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getInputsLocked();\n }\n\n getOutputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getOutputsLocked();\n }\n\n getIsReadyOrError(handle: string): boolean {\n return this.getAccessor(handle).getIsReadyOrError();\n }\n\n getIsFinal(handle: string): boolean {\n return this.getAccessor(handle).getIsFinal();\n }\n\n getError(handle: string): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).getError());\n }\n\n listInputFields(handle: string): string[] {\n return this.getAccessor(handle).listInputFields();\n }\n\n listOutputFields(handle: string): string[] {\n return this.getAccessor(handle).listOutputFields();\n }\n\n listDynamicFields(handle: string): string[] {\n return this.getAccessor(handle).listDynamicFields();\n }\n\n getKeyValueBase64(handle: string, key: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getKeyValue(key));\n }\n\n getKeyValueAsString(handle: string, key: string): string | undefined {\n return this.getAccessor(handle).getKeyValueAsString(key);\n }\n\n getDataBase64(handle: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getData());\n }\n\n getDataAsString(handle: string): string | undefined {\n return this.getAccessor(handle).getDataAsString();\n }\n\n //\n // Accessor helpers\n //\n\n parsePObjectCollection(\n handle: string,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolveSteps: string[]\n ): Record<string, PObject<string>> | undefined {\n const acc = this.getAccessor(handle);\n if (!acc.getIsReadyOrError()) return undefined;\n const accResult = parseFinalPObjectCollection(acc, errorOnUnknownField, prefix, resolveSteps);\n const result: Record<string, PObject<string>> = {};\n for (const [key, obj] of Object.entries(accResult)) {\n result[key] = mapPObjectData(obj, (d) => this.wrapAccessor(d));\n }\n return result;\n }\n\n //\n // Blobs\n //\n\n private registerComputable(hPrefix: string, computable: Computable<unknown>): string {\n const fHandle = `${hPrefix}_${randomUUID()}`;\n this.computablesToResolve[fHandle] = computable;\n return fHandle;\n }\n\n public getBlobContentAsString(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsString',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle)).toString(\n 'utf-8'\n );\n }\n })\n );\n }\n\n public getBlobContentAsBase64(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsBase64',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle)).toString(\n 'base64'\n );\n }\n })\n );\n }\n\n public getDownloadedBlobContentHandle(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getDownloadedBlobContentHandle',\n this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo)\n );\n }\n\n public getOnDemandBlobContentHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getOnDemandBlobContentHandle',\n this.env.driverKit.blobDriver.getOnDemandBlob(resource)\n );\n }\n\n //\n // Blobs to URLs\n //\n\n public extractArchiveAndGetURL(handle: string, format: ArchiveFormat): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'extractArchiveAndGetURL',\n this.env.driverKit.blobToURLDriver.extractArchiveAndGetURL(resource, format)\n );\n }\n\n //\n // Import progress\n //\n\n getImportProgress(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getImportProgress',\n this.env.driverKit.uploadDriver.getProgressId(resource)\n );\n }\n\n //\n // Logs\n //\n\n getLastLogs(handle: string, nLines: number): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLastLogs',\n this.env.driverKit.logDriver.getLastLogs(resource, nLines)\n );\n }\n\n getProgressLog(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLog',\n this.env.driverKit.logDriver.getProgressLog(resource, patternToSearch)\n );\n }\n\n getProgressLogWithInfo(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLogWithInfo',\n this.env.driverKit.logDriver.getProgressLogWithInfo(resource, patternToSearch)\n );\n }\n\n getLogHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLogHandle',\n this.env.driverKit.logDriver.getLogHandle(resource)\n );\n }\n\n //\n // Blocks\n //\n\n public getBlockLabel(blockId: string): string {\n const b = this.meta.get(blockId);\n if (b === undefined) throw new Error(`Block ${blockId} not found.`);\n return b.label;\n }\n\n //\n // Result Pool\n //\n\n private _resultPool: ResultPool | undefined = undefined;\n private get resultPool(): ResultPool {\n if (this._resultPool === undefined) {\n if (this.computableCtx === undefined)\n throw new Error(\n \"can't use result pool in this context (most porbably called from the future mapper)\"\n );\n this._resultPool = notEmpty(\n this.blockCtx.getResultsPool,\n 'getResultsPool'\n )(this.computableCtx);\n }\n return this._resultPool;\n }\n\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.resultPool.calculateOptions(predicate);\n }\n\n public getDataFromResultPool(): ResultCollection<PObject<string>> {\n const collection = this.resultPool.getData();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: mapPObjectData(e.obj, (d) => this.wrapAccessor(d))\n }))\n };\n }\n\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<string, string>>, 'id'>\n > {\n const collection = this.resultPool.getDataWithErrors();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: {\n id: e.obj.id,\n spec: e.obj.spec,\n data: mapValueInVOE(e.obj.data, (d) => this.wrapAccessor(d))\n }\n }))\n };\n }\n\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n const specs = this.resultPool.getSpecs();\n if (specs.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`specs_from_pool_incomplete:${specs.instabilityMarker}`);\n return specs;\n }\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n return this.resultPool.getSpecByRef(blockId, exportName);\n }\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<string> | undefined {\n return mapPObjectData(this.resultPool.getDataByRef(blockId, exportName), (acc) =>\n this.wrapAccessor(acc)\n );\n }\n\n //\n // PFrames / PTables\n //\n\n public createPFrame(def: PFrameDef<string | PColumnValues>): PFrameHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n \"can't instantiate PFrames from this context (most porbably called from the future mapper)\"\n );\n return this.env.driverKit.pFrameDriver.createPFrame(\n def.map((c) => mapPObjectData(c, (d) => (typeof d === 'string' ? this.getAccessor(d) : d))),\n this.computableCtx\n );\n }\n\n public createPTable(def: PTableDef<PColumn<string | PColumnValues>>): PTableHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n \"can't instantiate PTable from this context (most porbably called from the future mapper)\"\n );\n return this.env.driverKit.pFrameDriver.createPTable(\n mapPTableDef(def, (c) =>\n mapPObjectData(c, (d) => (typeof d === 'string' ? this.getAccessor(d) : d))\n ),\n this.computableCtx\n );\n }\n\n //\n // Computable\n //\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.computableCtx?.unstableMarker;\n }\n\n //\n // Helpers\n //\n\n private getAccessor(handle: string): PlTreeNodeAccessor {\n const accessor = this.accessors.get(handle);\n if (accessor === undefined) throw new Error('No such accessor');\n return accessor;\n }\n\n private wrapAccessor(accessor: PlTreeNodeAccessor): string;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined {\n if (accessor === undefined) return undefined;\n else {\n const nextHandle = randomUUID();\n this.accessors.set(nextHandle, accessor);\n return nextHandle;\n }\n }\n\n //\n // QuickJS Helpers\n //\n\n private exportSingleValue(\n obj: boolean | number | string | null | ArrayBuffer | undefined,\n scope: Scope | undefined\n ): QuickJSHandle {\n const result = this.tryExportSingleValue(obj, scope);\n if (result === undefined) throw new Error(`Can't export value: ${obj}`);\n return result;\n }\n\n private tryExportSingleValue(obj: unknown, scope: Scope | undefined): QuickJSHandle | undefined {\n let handle: QuickJSHandle;\n let manage = false;\n switch (typeof obj) {\n case 'string':\n handle = this.vm.newString(obj);\n manage = true;\n break;\n case 'number':\n handle = this.vm.newNumber(obj);\n manage = true;\n break;\n case 'undefined':\n handle = this.vm.undefined;\n break;\n case 'boolean':\n handle = obj ? this.vm.true : this.vm.false;\n break;\n default:\n if (obj === null) {\n handle = this.vm.null;\n break;\n }\n if (isArrayBufferOrView(obj)) {\n handle = this.vm.newArrayBuffer(obj);\n manage = true;\n break;\n }\n return undefined;\n }\n return manage && scope != undefined ? scope.manage(handle) : handle;\n }\n\n public exportObjectUniversal(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const simpleHandle = this.tryExportSingleValue(obj, scope);\n if (simpleHandle !== undefined) return simpleHandle;\n return this.exportObjectViaJson(obj, scope);\n }\n\n public exportObjectViaJson(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const result = this.vm\n .newString(JSON.stringify(obj))\n .consume((json) =>\n this.vm.unwrapResult(this.vm.callFunction(this.fnJSONParse, this.vm.undefined, json))\n );\n return scope !== undefined ? scope.manage(result) : result;\n }\n\n public importObjectUniversal(handle: QuickJSHandle): unknown {\n switch (this.vm.typeof(handle)) {\n case 'undefined':\n return undefined;\n case 'boolean':\n case 'number':\n case 'string':\n return this.vm.dump(handle);\n default:\n return this.importObjectViaJson(handle);\n }\n }\n\n public importObjectViaJson(handle: QuickJSHandle): unknown {\n const text = this.vm\n .unwrapResult(this.vm.callFunction(this.fnJSONStringify, this.vm.undefined, handle))\n .consume((strHandle) => this.vm.getString(strHandle));\n if (text === 'undefined')\n // special case with futures\n return undefined;\n return JSON.parse(text);\n }\n\n private injectCtx() {\n Scope.withScope((localScope) => {\n const configCtx = localScope.manage(this.vm.newObject());\n\n // Exporting props\n\n const args = this.blockCtx.args(this.computableCtx!);\n const activeArgs = this.blockCtx.activeArgs(this.computableCtx!);\n const uiState = this.blockCtx.uiState(this.computableCtx!);\n this.vm.setProp(configCtx, 'args', localScope.manage(this.vm.newString(args)));\n if (uiState !== undefined)\n this.vm.setProp(configCtx, 'uiState', localScope.manage(this.vm.newString(uiState)));\n if (activeArgs !== undefined)\n this.vm.setProp(configCtx, 'activeArgs', localScope.manage(this.vm.newString(activeArgs)));\n this.vm.setProp(configCtx, 'callbackRegistry', this.callbackRegistry);\n this.vm.setProp(\n configCtx,\n 'featureFlags',\n this.exportObjectUniversal(JsRenderInternal.GlobalCfgRenderCtxFeatureFlags, localScope)\n );\n\n // Exporting methods\n\n const exportCtxFunction = (\n name: string,\n fn: VmFunctionImplementation<QuickJSHandle>\n ): void => {\n this.vm.newFunction(name, fn).consume((fnh) => this.vm.setProp(configCtx, name, fnh));\n };\n\n //\n // Methods for injected ctx object\n //\n\n exportCtxFunction('getAccessorHandleByName', (name) => {\n return this.exportSingleValue(\n this.getAccessorHandleByName(this.vm.getString(name)),\n undefined\n );\n });\n\n //\n // Accessors\n //\n\n exportCtxFunction('resolveWithCommon', (handle, commonOptions, ...steps) => {\n return this.exportSingleValue(\n this.resolveWithCommon(\n this.vm.getString(handle),\n this.importObjectViaJson(commonOptions) as CommonFieldTraverseOpsFromSDK,\n ...steps.map(\n (step) => this.importObjectViaJson(step) as FieldTraversalStepFromSDK | string\n )\n ),\n undefined\n );\n });\n\n exportCtxFunction('getResourceType', (handle) => {\n return this.exportObjectViaJson(this.getResourceType(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getInputsLocked', (handle) => {\n return this.exportSingleValue(this.getInputsLocked(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getOutputsLocked', (handle) => {\n return this.exportSingleValue(this.getOutputsLocked(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsReadyOrError', (handle) => {\n return this.exportSingleValue(this.getIsReadyOrError(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsFinal', (handle) => {\n return this.exportSingleValue(this.getIsFinal(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getError', (handle) => {\n return this.exportSingleValue(this.getError(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listInputFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listOutputFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listDynamicFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getKeyValueBase64', (handle, key) => {\n return this.exportSingleValue(\n this.getKeyValueBase64(this.vm.getString(handle), this.vm.getString(key)),\n undefined\n );\n });\n\n exportCtxFunction('getKeyValueAsString', (handle, key) => {\n return this.exportSingleValue(\n this.getKeyValueAsString(this.vm.getString(handle), this.vm.getString(key)),\n undefined\n );\n });\n\n exportCtxFunction('getDataBase64', (handle) => {\n return this.exportSingleValue(this.getDataBase64(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getDataAsString', (handle) => {\n return this.exportSingleValue(this.getDataAsString(this.vm.getString(handle)), undefined);\n });\n\n //\n // Accessor helpers\n //\n\n exportCtxFunction(\n 'parsePObjectCollection',\n (handle, errorOnUnknownField, prefix, ...resolveSteps) => {\n return this.exportObjectUniversal(\n this.parsePObjectCollection(\n this.vm.getString(handle),\n this.vm.dump(errorOnUnknownField) as boolean,\n this.vm.getString(prefix),\n ...resolveSteps.map(this.vm.getString)\n ),\n undefined\n );\n }\n );\n\n //\n // Blobs\n //\n\n exportCtxFunction('getBlobContentAsBase64', (handle) => {\n return this.exportSingleValue(\n this.getBlobContentAsBase64(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getBlobContentAsString', (handle) => {\n return this.exportSingleValue(\n this.getBlobContentAsString(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getDownloadedBlobContentHandle', (handle) => {\n return this.exportSingleValue(\n this.getDownloadedBlobContentHandle(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getOnDemandBlobContentHandle', (handle) => {\n return this.exportSingleValue(\n this.getOnDemandBlobContentHandle(this.vm.getString(handle)),\n undefined\n );\n });\n\n //\n // Blobs to URLs\n //\n\n exportCtxFunction('extractArchiveAndGetURL', (handle, format) => {\n return this.exportSingleValue(\n this.extractArchiveAndGetURL(this.vm.getString(handle), this.vm.getString(format) as ArchiveFormat),\n undefined)\n })\n\n //\n // ImportProgress\n //\n\n exportCtxFunction('getImportProgress', (handle) => {\n return this.exportSingleValue(this.getImportProgress(this.vm.getString(handle)), undefined);\n });\n\n //\n // Logs\n //\n\n exportCtxFunction('getLastLogs', (handle, nLines) => {\n return this.exportSingleValue(\n this.getLastLogs(this.vm.getString(handle), this.vm.getNumber(nLines)),\n undefined\n );\n });\n\n exportCtxFunction('getProgressLog', (handle, patternToSearch) => {\n return this.exportSingleValue(\n this.getProgressLog(this.vm.getString(handle), this.vm.getString(patternToSearch)),\n undefined\n );\n });\n\n exportCtxFunction('getProgressLogWithInfo', (handle, patternToSearch) => {\n return this.exportSingleValue(\n this.getProgressLogWithInfo(this.vm.getString(handle), this.vm.getString(patternToSearch)),\n undefined\n );\n });\n\n exportCtxFunction('getLogHandle', (handle) => {\n return this.exportSingleValue(this.getLogHandle(this.vm.getString(handle)), undefined);\n });\n\n //\n // Blocks\n //\n\n exportCtxFunction('getBlockLabel', (blockId) => {\n return this.exportSingleValue(this.getBlockLabel(this.vm.getString(blockId)), undefined);\n });\n\n //\n // Result pool\n //\n\n exportCtxFunction('getDataFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getDataFromResultPool(), undefined);\n });\n\n exportCtxFunction('getDataWithErrorsFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getDataWithErrorsFromResultPool(), undefined);\n });\n\n exportCtxFunction('getSpecsFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getSpecsFromResultPool(), undefined);\n });\n\n exportCtxFunction('calculateOptions', (predicate) => {\n return this.exportObjectUniversal(\n this.calculateOptions(this.importObjectViaJson(predicate) as PSpecPredicate),\n undefined\n );\n });\n\n exportCtxFunction('getSpecFromResultPoolByRef', (blockId, exportName) => {\n return this.exportObjectUniversal(\n this.getSpecFromResultPoolByRef(\n this.vm.getString(blockId),\n this.vm.getString(exportName)\n ),\n undefined\n );\n });\n\n exportCtxFunction('getDataFromResultPoolByRef', (blockId, exportName) => {\n return this.exportObjectUniversal(\n this.getDataFromResultPoolByRef(\n this.vm.getString(blockId),\n this.vm.getString(exportName)\n ),\n undefined\n );\n });\n\n //\n // PFrames / PTables\n //\n\n exportCtxFunction('createPFrame', (def) => {\n return this.exportSingleValue(\n this.createPFrame(this.importObjectViaJson(def) as PFrameDef<string | PColumnValues>),\n undefined\n );\n });\n\n exportCtxFunction('createPTable', (def) => {\n return this.exportSingleValue(\n this.createPTable(\n this.importObjectViaJson(def) as PTableDef<PColumn<string | PColumnValues>>\n ),\n undefined\n );\n });\n\n //\n // Computable\n //\n\n exportCtxFunction('getCurrentUnstableMarker', () => {\n return this.exportSingleValue(this.getCurrentUnstableMarker(), undefined);\n });\n\n this.vm.setProp(this.vm.global, 'cfgRenderCtx', configCtx);\n });\n }\n}\n","import { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { projectFieldName } from '../model/project_model';\nimport { Pl } from '@milaboratories/pl-client';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { BlockConfig, extractConfig } from '@platforma-sdk/model';\n\nexport type BlockPackInfoAndId = {\n /** To be added to computable keys, to force reload on config change */\n readonly bpId: string;\n /** Full block-pack info */\n readonly info: BlockPackInfo;\n /** Config extracted from the info */\n readonly cfg: BlockConfig;\n};\n\n/** Returns block pack info along with string representation of block-pack resource id */\nexport function getBlockPackInfo(\n prj: PlTreeNodeAccessor,\n blockId: string\n): BlockPackInfoAndId | undefined {\n return ifNotUndef(\n prj.traverse(\n {\n field: projectFieldName(blockId, 'blockPack'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true }\n ),\n (bpAcc) => {\n const info = bpAcc.getDataAsJson<BlockPackInfo>()!;\n const cfg = extractConfig(info.config);\n return { bpId: bpAcc.resourceInfo.id.toString(), info, cfg };\n }\n );\n}\n\nexport const LogOutputStatus = process.env.MI_LOG_OUTPUT_STATUS;\n","import { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport { Code, ConfigRenderLambda } from '@platforma-sdk/model';\nimport { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Scope } from 'quickjs-emscripten';\nimport { JsExecutionContext } from './context';\nimport { BlockContextAny } from '../middle_layer/block_ctx';\nimport { LogOutputStatus } from '../middle_layer/util';\n\nexport function computableFromRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n fh: ConfigRenderLambda,\n code: Code,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n // adding configKey to reload all outputs on block-pack update\n const key = `${ctx.blockId}#lambda#${configKey}#${fh.handle}`;\n ops = { ...ops, key };\n if (ops.mode === undefined && fh.retentive === true) ops.mode = 'StableOnlyRetentive';\n return Computable.makeRaw((cCtx) => {\n const scope = new Scope();\n cCtx.addOnDestroy(() => scope.dispose());\n\n const runtime = scope.manage(env.quickJs.newRuntime());\n runtime.setMemoryLimit(1024 * 640);\n runtime.setMaxStackSize(1024 * 320);\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(scope, vm, ctx, env, cCtx);\n\n rCtx.evaluateBundle(code.content);\n const result = rCtx.runCallback(fh.handle);\n\n rCtx.resetComputableCtx();\n\n let recalculationCounter = 0;\n\n if (LogOutputStatus && LogOutputStatus !== 'unstable-only')\n console.log(`Output ${fh.handle} scaffold calculated.`);\n\n return {\n ir: rCtx.computablesToResolve,\n postprocessValue: async (resolved: Record<string, unknown>, { unstableMarker, stable }) => {\n // resolving futures\n for (const [handle, value] of Object.entries(resolved)) rCtx.runCallback(handle, value);\n\n // rendering result\n const renderedResult = rCtx.importObjectUniversal(result);\n\n // logging\n recalculationCounter++;\n if (LogOutputStatus && (LogOutputStatus !== 'unstable-only' || !stable)) {\n if (stable)\n console.log(\n `Stable output ${fh.handle} calculated ${renderedResult !== undefined ? 'defined' : 'undefined'}; (#${recalculationCounter})`\n );\n else\n console.log(\n `Unstable output ${fh.handle}; marker = ${unstableMarker}; ${renderedResult !== undefined ? 'defined' : 'undefined'} (#${recalculationCounter})`\n );\n }\n\n return renderedResult;\n }\n };\n }, ops);\n}\n","import { Code, isConfigLambda, TypedConfigOrConfigLambda } from '@platforma-sdk/model';\nimport { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { computableFromCfg } from '../cfg_render/executor';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { computableFromRF } from '../js_render';\nimport { BlockContextAny } from './block_ctx';\nimport { hasActiveCfgComponents } from '../cfg_render/util';\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n code: Code | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (code === undefined) throw new Error('No code bundle.');\n return computableFromRF(env, ctx, cfgOrFh, code, configKey, ops);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n","import { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectRenderingState,\n ProjectStructure,\n ProjectStructureAuthorKey,\n ProjectStructureKey\n} from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { allBlocks, productionGraph } from '../model/project_model_util';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n BlockStateOverview,\n ProjectMeta,\n ProjectOverview\n} from '@milaboratories/pl-model-middle-layer';\nimport { constructBlockContextArgsOnly } from './block_ctx';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { BlockSection, extractConfig } from '@platforma-sdk/model';\nimport { computableFromCfgOrRF } from './render';\nimport { NavigationStates } from './navigation_states';\nimport { getBlockPackInfo } from './util';\n\ntype BlockInfo = {\n currentArguments: any;\n prod?: ProdState;\n};\n\ntype CalculationStatus = 'Running' | 'Done';\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: any;\n};\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey)\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, 'currentArgs'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n });\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, 'prodArgs'),\n assertFieldType: 'Dynamic',\n stableIfNotFound: true\n });\n if (rInputs !== undefined) {\n const result = prj.getField({\n field: projectFieldName(id, 'prodOutput'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true\n });\n const ctx = prj.getField({\n field: projectFieldName(id, 'prodUiCtx'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true\n });\n prod = {\n arguments: rInputs.getDataAsJson(),\n stale: cInputs.id !== rInputs.id,\n outputError:\n result.error !== undefined ||\n ctx.error !== undefined ||\n result.value?.getError() !== undefined ||\n ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError()) ||\n (result.error !== undefined && result.error.getIsReadyOrError())) &&\n ((ctx.value !== undefined && ctx.value.getIsReadyOrError()) ||\n (ctx.error !== undefined && ctx.error.getIsReadyOrError()))\n };\n }\n\n infos.set(id, { currentArguments: cInputs.getDataAsJson(), prod });\n }\n\n const currentGraph = productionGraph(structure, (id) => infos.get(id)!.currentArguments);\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = 'NotCalculated';\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = 'Limbo';\n else calculationStatus = info.prod.finished ? 'Done' : 'Running';\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const { sections, title, inputsValid, sdkVersion } =\n ifNotUndef(bp, ({ bpId, cfg, info }) => {\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n return {\n sections: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.sections,\n cfg.code,\n bpId\n ) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n title,\n cfg.code,\n bpId\n ) as ComputableStableDefined<string>\n ),\n inputsValid: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n cfg.code,\n bpId\n ) as ComputableStableDefined<boolean>,\n sdkVersion: cfg.sdkVersion\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, 'blockSettings'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n })\n .getDataAsJson() as BlockSettings;\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings })\n );\n\n return {\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === 'Limbo',\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots('upstream', id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots('downstream', id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n navigationState: navigationStates.getState(id)\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun =\n (stale || b.outputErrors) &&\n Boolean(b.inputsValid) &&\n !b.missingReference &&\n b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion\n };\n delete bb['updates'];\n return bb;\n })\n };\n }\n }\n ).withStableType();\n}\n","import { PlTreeEntry, PlTreeEntryAccessor } from '@milaboratories/pl-tree';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport { Pl, resourceTypesEqual } from '@milaboratories/pl-client';\nimport {\n FrontendFromFolderData,\n FrontendFromFolderResourceType,\n FrontendFromUrlData,\n FrontendFromUrlResourceType\n} from '../model';\nimport { PathResult } from '@milaboratories/pl-drivers';\nimport { projectFieldName } from '../model/project_model';\nimport { BlockPackFrontendField } from '../mutator/block-pack/block_pack';\nimport { getBlockPackInfo } from './util';\nimport { FrontendData } from '../model/frontend';\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment\n): undefined | string | ComputableStableDefined<PathResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getPath(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendPathComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === 'string') return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.path;\n }\n }\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, 'blockPack'),\n assertFieldType: 'Dynamic'\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: 'Input' }\n )\n ?.persist();\n return {\n path: frontendPathComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion\n };\n },\n { mode: 'StableOnlyLive' }\n ) as ComputableStableDefined<FrontendData>;\n}\n","import { PlTreeEntry } from '@milaboratories/pl-tree';\nimport {\n Computable,\n ComputableCtx,\n ComputableStableDefined,\n ComputableValueOrErrors\n} from '@milaboratories/computable';\nimport { constructBlockContext, constructBlockContextArgsOnly } from './block_ctx';\nimport { blockArgsAuthorKey } from '../model/project_model';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { getBlockPackInfo } from './util';\nimport { AuthorMarker, BlockStateInternal } from '@milaboratories/pl-model-middle-layer';\nimport { computableFromCfgOrRF } from './render';\nimport { resourceIdToString } from '@milaboratories/pl-client';\n\nexport type BlockArgsAndUiState = Omit<BlockStateInternal, 'outputs' | 'navigationState'>;\n\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string\n): Computable<BlockArgsAndUiState>;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx: ComputableCtx\n): BlockArgsAndUiState;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx?: ComputableCtx\n): BlockArgsAndUiState | Computable<BlockArgsAndUiState> {\n if (cCtx === undefined)\n return Computable.make((c) => blockArgsAndUiState(projectEntry, blockId, c), {\n key: `inputs#${resourceIdToString(projectEntry.rid)}#${blockId}`\n });\n\n const prj = cCtx.accessor(projectEntry).node();\n const ctx = constructBlockContextArgsOnly(projectEntry, blockId);\n const uiState = ctx.uiState(cCtx);\n return {\n author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(blockId)),\n args: JSON.parse(ctx.args(cCtx)),\n ui: uiState !== undefined ? JSON.parse(uiState) : undefined\n };\n}\n\nexport function blockOutputs(\n projectEntry: PlTreeEntry,\n blockId: string,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<Record<string, ComputableValueOrErrors<unknown>>> {\n return Computable.make(\n (c) => {\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContext(projectEntry, blockId);\n\n return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId }) => {\n const outputs: Record<string, Computable<any>> = {};\n for (const [cellId, cellCfg] of Object.entries(cfg.outputs)) {\n const computableOutput = computableFromCfgOrRF(env, ctx, cellCfg, cfg.code, bpId);\n outputs[cellId] = Computable.wrapError(computableOutput);\n }\n return outputs;\n });\n },\n { key: 'outputs#' + resourceIdToString(projectEntry.rid) + '#' + blockId }\n ).withStableType();\n}\n","import { notEmpty } from '@milaboratories/ts-helpers';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable } from '@milaboratories/computable';\nimport { projectFieldName, ProjectStructure, ProjectStructureKey } from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { Pl } from '@milaboratories/pl-client';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { extractConfig, TypedConfigOrConfigLambda } from '@platforma-sdk/model';\nimport { constructBlockContext } from './block_ctx';\nimport { computableFromCfgOrRF, isActive } from './render';\nimport { getBlockPackInfo } from './util';\n\n/** Returns derived general project state form the project resource */\nexport function activeConfigs(\n prjEntry: PlTreeEntry,\n env: MiddleLayerEnvironment\n): Computable<unknown[]> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const ret: Computable<unknown>[] = [];\n for (const { id, renderingMode } of allBlocks(structure)) {\n const bp = getBlockPackInfo(prj, id);\n if (bp === undefined) continue;\n\n const activeOutputConfigs = Object.entries(bp.cfg.outputs)\n .map(([, cfg]) => cfg)\n .filter((cfg) => isActive(cfg))\n .map((cfg) => cfg as TypedConfigOrConfigLambda);\n\n if (activeOutputConfigs.length === 0) continue;\n\n const blockCtx = constructBlockContext(prj.persist(), id);\n\n for (const cfg of activeOutputConfigs)\n ret.push(\n Computable.wrapError(computableFromCfgOrRF(env, blockCtx, cfg, bp.cfg.code, bp.bpId))\n );\n }\n\n return ret;\n });\n}\n","import { ChangeSource, Computable, ComputableCtx } from '@milaboratories/computable';\nimport { NavigationState, DefaultNavigationState } from '@platforma-sdk/model';\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged();\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` }\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged();\n }\n }\n}\n","import { MiddleLayerEnvironment } from './middle_layer';\nimport {\n ensureResourceIdNotNull,\n field,\n FieldData,\n isNotFoundError,\n isTimeoutOrCancelError,\n Pl,\n ResourceId\n} from '@milaboratories/pl-client';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport { projectOverview } from './project_overview';\nimport { BlockPackSpecAny } from '../model';\nimport { randomUUID } from 'node:crypto';\nimport { ProjectMutator, withProject, withProjectAuthored } from '../mutator/project';\nimport { ExtendedResourceData, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { setTimeout } from 'node:timers/promises';\nimport { frontendData } from './frontend_path';\nimport { NavigationState } from '@milaboratories/pl-model-common';\nimport { blockArgsAndUiState, blockOutputs } from './block';\nimport { FrontendData } from '../model/frontend';\nimport { projectFieldName, ProjectStructure } from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { BlockPackInfo } from '../model/block_pack';\nimport {\n ProjectOverview,\n AuthorMarker,\n BlockStateInternal,\n BlockSettings\n} from '@milaboratories/pl-model-middle-layer';\nimport { activeConfigs } from './active_cfg';\nimport { NavigationStates } from './navigation_states';\nimport { extractConfig } from '@platforma-sdk/model';\n\ntype BlockStateComputables = {\n readonly fullState: Computable<BlockStateInternal>;\n};\n\n/** Data access object, to manipulate and read single opened (!) project data. */\nexport class Project {\n /** Underlying pl resource id */\n public readonly rid: ResourceId;\n\n /** Data for the left panel, contain basic information about block status. */\n public readonly overview: ComputableStableDefined<ProjectOverview>;\n\n private readonly navigationStates = new NavigationStates();\n private readonly blockComputables = new Map<string, BlockStateComputables>();\n\n private readonly blockFrontends = new Map<string, ComputableStableDefined<FrontendData>>();\n private readonly activeConfigs: Computable<unknown[]>;\n private readonly refreshLoopResult: Promise<void>;\n\n private readonly abortController = new AbortController();\n private destroyed = false;\n\n constructor(\n private readonly env: MiddleLayerEnvironment,\n rid: ResourceId,\n private readonly projectTree: SynchronizedTreeState\n ) {\n this.overview = projectOverview(\n projectTree.entry(),\n this.navigationStates,\n env\n ).withPreCalculatedValueTree();\n this.rid = rid;\n this.refreshLoopResult = this.refreshLoop();\n this.activeConfigs = activeConfigs(projectTree.entry(), env);\n }\n\n private async refreshLoop(): Promise<void> {\n while (!this.destroyed) {\n try {\n await withProject(this.env.pl, this.rid, (prj) => {\n prj.doRefresh(this.env.ops.stagingRenderingRate);\n });\n await this.activeConfigs.getValue();\n await setTimeout(this.env.ops.projectRefreshInterval, this.abortController.signal);\n } catch (e: any) {\n if (isNotFoundError(e)) {\n console.warn(\n 'project refresh routine terminated, because project was externally deleted'\n );\n break;\n } else if (!isTimeoutOrCancelError(e))\n throw new Error('Unexpected exception', { cause: e });\n }\n }\n }\n\n /**\n * Adds new block to the project.\n *\n * @param blockLabel block label / title visible to the user\n * @param blockPackSpec object describing the \"block type\", read more in the type docs\n * @param before id of the block to insert new block before\n * @param blockId internal id to be assigned for the block, this arg can be omitted\n * then, randomly generated UUID will be assigned automatically\n *\n * @return returns newly created block id\n * */\n public async addBlock(\n blockLabel: string,\n blockPackSpec: BlockPackSpecAny,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n blockId: string = randomUUID()\n ): Promise<string> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfgContainer = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n const blockCfg = extractConfig(blockCfgContainer); // full content of this var should never be persisted\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.addBlock(\n {\n id: blockId,\n label: blockLabel,\n renderingMode: blockCfg.renderingMode\n },\n {\n args: JSON.stringify(blockCfg.initialArgs),\n uiState: JSON.stringify(blockCfg.initialUiState),\n blockPack: preparedBp\n },\n before\n )\n );\n await this.projectTree.refreshState();\n\n return blockId;\n }\n\n /**\n * Update block to new block pack, optionally resetting args and ui state to\n * initial values\n * */\n public async updateBlockPack(\n blockId: string,\n blockPackSpec: BlockPackSpecAny,\n resetArgs: boolean = false,\n author?: AuthorMarker\n ): Promise<void> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfg = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.migrateBlockPack(\n blockId,\n preparedBp,\n resetArgs ? JSON.stringify(blockCfg.initialArgs) : undefined\n )\n );\n await this.projectTree.refreshState();\n }\n\n /** Deletes a block with all associated data. */\n public async deleteBlock(blockId: string, author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId));\n this.navigationStates.deleteBlock(blockId);\n await this.projectTree.refreshState();\n }\n\n /**\n * Updates block order according to the given array of block ids.\n *\n * Provided array must contain exactly the same set of ids current project cosists of,\n * an error will be thrown instead.\n */\n public async reorderBlocks(blocks: string[], author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n const currentStructure = mut.structure;\n if (currentStructure.groups.length !== 1)\n throw new Error('Unexpected project structure, non-sinular block group');\n const currentGroup = currentStructure.groups[0];\n if (currentGroup.blocks.length !== blocks.length)\n throw new Error(`Lengh mismatch: ${currentGroup.blocks.length} !== ${blocks.length}`);\n if (new Set<string>(blocks).size !== blocks.length) throw new Error(`Repeated block ids`);\n const newStructure: ProjectStructure = {\n groups: [\n {\n id: currentGroup.id,\n label: currentGroup.label,\n blocks: blocks.map((blockId) => {\n const block = currentGroup.blocks.find((b) => b.id === blockId);\n if (block === undefined) throw new Error(`Can't find block: ${blockId}`);\n return block;\n })\n }\n ]\n };\n mut.updateStructure(newStructure);\n });\n await this.projectTree.refreshState();\n }\n\n /**\n * Renders production part of the block starting all connected heavy computations.\n * Upstream blocks of the specified block will be started automatically if in\n * stale state.\n * */\n public async runBlock(blockId: string): Promise<void> {\n await withProject(this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true));\n await this.projectTree.refreshState();\n }\n\n /**\n * Stops the block if it is running by destroying its production state. All\n * its downstreams will also be destroyed or moved to limbo if already\n * calculated.\n * */\n public async stopBlock(blockId: string): Promise<void> {\n await withProject(this.env.pl, this.rid, (mut) => mut.stopProduction(blockId));\n await this.projectTree.refreshState();\n }\n\n // /** Update block label. */\n // public async setBlockLabel(blockId: string, label: string, author?: AuthorMarker) {\n // await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n // mut.setBlockLabel(blockId, label);\n // });\n // await this.projectTree.refreshState();\n // }\n\n /**\n * Sets block args, and changes whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgs(blockId: string, args: any, author?: AuthorMarker) {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.setArgs([{ blockId, args: JSON.stringify(args) }])\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets ui block state associated with the block.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setUiState(blockId: string, uiState: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.setUiState(blockId, uiState === undefined ? undefined : JSON.stringify(uiState))\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets navigation state.\n * */\n public async setNavigationState(blockId: string, state: NavigationState): Promise<void> {\n this.navigationStates.setState(blockId, state);\n }\n\n /**\n * Sets block args and ui state, and changes the whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgsAndUiState(\n blockId: string,\n args: unknown,\n uiState: unknown,\n author?: AuthorMarker\n ) {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n mut.setArgs([{ blockId, args: JSON.stringify(args) }]);\n mut.setUiState(blockId, JSON.stringify(uiState));\n });\n await this.projectTree.refreshState();\n }\n\n /** Update block settings */\n public async setBlockSettings(blockId: string, newValue: BlockSettings) {\n await withProjectAuthored(this.env.pl, this.rid, undefined, (mut) => {\n mut.setBlockSettings(blockId, newValue);\n });\n await this.projectTree.refreshState();\n }\n\n /** Resets arguments and ui state of the block to initial state */\n public async resetBlockArgsAndUiState(blockId: string, author?: AuthorMarker): Promise<void> {\n await this.env.pl.withWriteTx('BlockInputsReset', async (tx) => {\n // reading default arg values from block pack\n const bpHolderRid = ensureResourceIdNotNull(\n (await tx.getField(field(this.rid, projectFieldName(blockId, 'blockPack')))).value\n );\n const bpRid = ensureResourceIdNotNull(\n (await tx.getField(field(bpHolderRid, Pl.HolderRefField))).value\n );\n const bpData = await tx.getResourceData(bpRid, false);\n const bpInfo = JSON.parse(\n Buffer.from(notEmpty(bpData.data)).toString('utf-8')\n ) as BlockPackInfo;\n await withProjectAuthored(tx, this.rid, author, (prj) => {\n prj.setArgs([{ blockId, args: JSON.stringify(bpInfo.config.initialArgs) }]);\n prj.setUiState(blockId, undefined);\n });\n await tx.commit();\n });\n await this.projectTree.refreshState();\n }\n\n private getBlockComputables(blockId: string): BlockStateComputables {\n const cached = this.blockComputables.get(blockId);\n if (cached === undefined) {\n // state consists of inputs (args + ui state) and outputs\n const outputs = blockOutputs(this.projectTree.entry(), blockId, this.env);\n const fullState = Computable.make(\n (ctx) => ({\n argsAndUiState: blockArgsAndUiState(this.projectTree.entry(), blockId, ctx),\n outputs,\n navigationState: this.navigationStates.getState(blockId)\n }),\n {\n postprocessValue: (v) =>\n ({\n ...v.argsAndUiState,\n outputs: v.outputs,\n navigationState: v.navigationState\n }) as BlockStateInternal\n }\n );\n\n const computables: BlockStateComputables = {\n fullState: fullState.withPreCalculatedValueTree()\n };\n\n this.blockComputables.set(blockId, computables);\n\n return computables;\n }\n return cached;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch full block state,\n * including outputs, arguments, ui state.\n * */\n public getBlockState(blockId: string): Computable<BlockStateInternal> {\n return this.getBlockComputables(blockId).fullState;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch path of the\n * folder containing frontend code.\n * */\n public getBlockFrontend(blockId: string): ComputableStableDefined<FrontendData> {\n const cached = this.blockFrontends.get(blockId);\n if (cached === undefined) {\n const fd = frontendData(\n this.projectTree.entry(),\n blockId,\n this.env\n ).withPreCalculatedValueTree();\n this.blockFrontends.set(blockId, fd);\n return fd;\n }\n return cached;\n }\n\n /** Called by middle layer on close */\n public async destroy(): Promise<void> {\n // terminating the project service loop\n this.destroyed = true;\n this.abortController.abort();\n await this.refreshLoopResult;\n\n // terminating the synchronized project tree\n await this.projectTree.terminate();\n\n // the following will deregister all external resource holders, like\n // downloaded files, running uploads and alike\n this.overview.resetState();\n this.blockFrontends.forEach((c) => c.resetState());\n this.blockComputables.forEach((c) => {\n c.fullState.resetState();\n });\n this.activeConfigs.resetState();\n }\n\n /** @deprecated */\n public async destroyAndAwaitTermination(): Promise<void> {\n await this.destroy();\n }\n\n public static async init(env: MiddleLayerEnvironment, rid: ResourceId): Promise<Project> {\n // Doing a no-op mutation to apply all migration and schema fixes\n await withProject(env.pl, rid, (_) => {});\n\n // Loading project tree\n const projectTree = await SynchronizedTreeState.init(\n env.pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: projectTreePruning\n },\n env.logger\n );\n \n return new Project(env, rid, projectTree);\n }\n}\n\nfunction projectTreePruning(r: ExtendedResourceData): FieldData[] {\n // console.log(\n // JSON.stringify(\n // { ...r, kv: [], data: undefined } satisfies ExtendedResourceData,\n // (_, v) => {\n // if (typeof v === 'bigint') return v.toString();\n // return v;\n // }\n // )\n // );\n switch (r.type.name) {\n case 'BlockPackCustom':\n return r.fields.filter((f) => f.name !== 'template');\n case 'UserProject':\n return r.fields.filter((f) => !f.name.startsWith('__serviceTemplate'));\n case 'Blob':\n return [];\n default:\n return r.fields;\n }\n}\n","import { TemporalSynchronizedTreeOps } from './types';\nimport {\n DefaultVirtualLocalStorages,\n DownloadBlobToURLDriverOps,\n DownloadDriverOps,\n OpenFileDialogCallback,\n VirtualLocalStorageSpec\n} from '@milaboratories/pl-drivers';\nimport { UploadDriverOps } from '@milaboratories/pl-drivers';\nimport { LogsStreamDriverOps } from '@milaboratories/pl-drivers';\nimport { ConsoleLoggerAdapter, MiLogger } from '@milaboratories/ts-helpers';\nimport { LocalStorageProjection } from '@milaboratories/pl-drivers';\nimport path from 'node:path';\n\n/** Paths part of {@link DriverKitOps}. */\nexport type DriverKitOpsPaths = {\n /** Common root where to put downloaded blobs / downloaded blob cache */\n readonly blobDownloadPath: string;\n\n /** Common root where to put downloaded blobs with */\n readonly downloadBlobToURLPath: string;\n\n /**\n * List of pl storages that have projections in local file system.\n *\n * This option affect two drivers:\n *\n * (1) LS driver generates \"index\" handles instead of \"upload\" for paths inside those locations\n *\n * (2) Download driver directly serves content retrieval requests for blobs from listed storages,\n * and don't apply any caching for such blobs (i.e. preventing duplication of files for Downloaded\n * type handles, making OnDemand and Downloaded handles equivalent)\n *\n * */\n readonly localProjections: LocalStorageProjection[];\n\n /**\n * List of virtual storages that will allow homogeneous access to local FSs through LS API.\n * If undefined, default list will be created.\n * */\n readonly virtualLocalStoragesOverride?: VirtualLocalStorageSpec[];\n};\n\n/** Options required to initialize full set of middle layer driver kit */\nexport type DriverKitOpsSettings = {\n //\n // Common\n //\n\n readonly logger: MiLogger;\n\n //\n // Signer\n //\n\n /**\n * Local secret, that is used to sign and verify different pieces of information\n * that can be used to access local data, like local paths for ongoing uploads.\n *\n * Use {@link MiddleLayer.generateLocalSecret} to generate sufficiently random string.\n * */\n readonly localSecret: string;\n\n //\n // Blob Driver\n //\n\n /**\n * Settings related to the download driver making operations with blobs. This driver is also used\n * to download logs when source process terminates and log terns into a blob\n */\n readonly blobDriverOps: DownloadDriverOps;\n\n //\n // Blob To URL Driver\n //\n\n readonly downloadBlobToURLDriverOps: DownloadBlobToURLDriverOps;\n\n //\n // Upload Driver\n //\n\n /**\n * Settings related to the upload driver that actually performs upload and helps render upload\n * and indexing progresses from related pl resources.\n * */\n readonly uploadDriverOps: UploadDriverOps;\n\n //\n // Log streaming ops\n // (static logs are served via the blob driver)\n //\n\n /** Settings related to the streaming log driver */\n readonly logStreamDriverOps: LogsStreamDriverOps;\n\n //\n // LS Driver\n //\n\n /**\n * Callback to access system file open dialog, must be provided by the environment,\n * to allow for {@link showOpenSingleFileDialog} / {@link showOpenMultipleFilesDialog}\n * calls from the UI.\n */\n readonly openFileDialogCallback: OpenFileDialogCallback;\n};\n\nexport type DriverKitOps = DriverKitOpsPaths & DriverKitOpsSettings;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultDriverKitOpsSettings: Pick<\n DriverKitOpsSettings,\n | 'logger'\n | 'blobDriverOps'\n | 'downloadBlobToURLDriverOps'\n | 'uploadDriverOps'\n | 'logStreamDriverOps'\n> = {\n logger: new ConsoleLoggerAdapter(),\n blobDriverOps: {\n cacheSoftSizeBytes: 100 * 1024 * 1024, // 100MB\n nConcurrentDownloads: 10\n },\n downloadBlobToURLDriverOps: {\n cacheSoftSizeBytes: 100 * 1024 * 1024, // 100MB\n nConcurrentDownloads: 10\n },\n uploadDriverOps: {\n nConcurrentPartUploads: 10,\n nConcurrentGetProgresses: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000\n },\n logStreamDriverOps: {\n nConcurrentGetLogs: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000\n }\n};\n\nexport function DefaultDriverKitOpsPaths(\n workDir: string\n): Pick<DriverKitOpsPaths,\n | 'blobDownloadPath'\n | 'downloadBlobToURLPath'> {\n return {\n blobDownloadPath: path.join(workDir, 'download'),\n downloadBlobToURLPath: path.join(workDir, 'downloadToURL')\n };\n}\n\n/** Fields with default values are marked as optional here. */\n// prettier-ignore\nexport type DriverKitOpsConstructor =\n Omit<DriverKitOpsSettings, keyof typeof DefaultDriverKitOpsSettings>\n & Partial<typeof DefaultDriverKitOpsSettings>\n & Omit<DriverKitOpsPaths, keyof ReturnType<typeof DefaultDriverKitOpsPaths>>\n & Partial<ReturnType<typeof DefaultDriverKitOpsPaths>>;\n\nexport type MiddleLayerOpsPaths = DriverKitOpsPaths & {\n /** Common root where to put frontend code. */\n readonly frontendDownloadPath: string;\n};\n\n/** Configuration controlling different aspects of middle layer behaviour. */\nexport type MiddleLayerOpsSettings = DriverKitOpsSettings & {\n /** Contain temporal options controlling how often should pl trees be\n * synchronized with the pl server. */\n readonly defaultTreeOptions: TemporalSynchronizedTreeOps;\n\n /** Defines interval in milliseconds for running periodic project maintenance job.\n * Project maintenance includes gradual staging rendering and cached outputs cleanup. */\n readonly projectRefreshInterval: number;\n\n /** This controls average number of block staging states that are rendered per\n * second during project maintenance job execution. */\n readonly stagingRenderingRate: number;\n\n /** How often to check for dev block updates */\n readonly devBlockUpdateRecheckInterval: number;\n\n /** Prioritize this channel if update is available in this block */\n readonly preferredUpdateChannel?: string;\n};\n\nexport type MiddleLayerOps = MiddleLayerOpsSettings & MiddleLayerOpsPaths;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultMiddleLayerOpsSettings: Pick<\n MiddleLayerOps,\n | keyof typeof DefaultDriverKitOpsSettings\n | 'defaultTreeOptions'\n | 'projectRefreshInterval'\n | 'stagingRenderingRate'\n | 'devBlockUpdateRecheckInterval'\n> = {\n ...DefaultDriverKitOpsSettings,\n defaultTreeOptions: {\n pollingInterval: 350,\n stopPollingDelay: 2500\n },\n devBlockUpdateRecheckInterval: 1000,\n projectRefreshInterval: 700,\n stagingRenderingRate: 5\n};\n\nexport function DefaultMiddleLayerOpsPaths(\n workDir: string\n): Pick<\n MiddleLayerOpsPaths,\n keyof ReturnType<typeof DefaultDriverKitOpsPaths> | 'frontendDownloadPath'\n> {\n return {\n ...DefaultDriverKitOpsPaths(workDir),\n frontendDownloadPath: path.join(workDir, 'frontend')\n };\n}\n\nexport type MiddleLayerOpsConstructor = Omit<\n MiddleLayerOpsSettings,\n keyof typeof DefaultMiddleLayerOpsSettings\n> &\n Partial<typeof DefaultMiddleLayerOpsSettings> &\n Omit<MiddleLayerOpsPaths, keyof Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>> &\n Partial<Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>>;\n","// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","const {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","const SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","const parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","const parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","const SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","const parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // Otherwise it can be determined by checking the high version\n\n if (highVersion.patch) {\n // anything higher than a patch bump would result in the wrong version\n return 'patch'\n }\n\n if (highVersion.minor) {\n // anything higher than a minor bump would result in the wrong version\n return 'minor'\n }\n\n // bumping major/minor/patch all have same result\n return 'major'\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","const SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","const SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","const SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","const parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","const compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","const compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","const SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","const compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","const compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","const eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","const SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","class LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","const SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","const ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","const Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","const Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","const Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","const SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","const outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","const Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","const Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","import { PollComputablePool, PollPoolOps } from '@milaboratories/computable';\nimport {\n AnyChannel,\n BlockPackFromRegistryV2,\n blockPackIdToString,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions,\n StableChannel\n} from '@milaboratories/pl-model-middle-layer';\nimport { Dispatcher } from 'undici';\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from './registry';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport { MiLogger } from '@milaboratories/ts-helpers';\nimport { V2RegistryProvider } from './registry-v2-provider';\nimport semver from 'semver';\nimport canonicalize from 'canonicalize';\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = '__no_updates__';\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {}\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case 'dev-v1':\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'dev-v2':\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'from-registry-v2':\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case 'dev-v1': {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'dev-v2': {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'from-registry-v2': {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === 'patch') return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let spec: BlockPackSpec | undefined;\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case 'major':\n vMainSuggestion = vSuggestions.find((v) => v.type !== 'major')?.update;\n break;\n case 'minor':\n vMainSuggestion = vSuggestions.find((v) => v.type === 'patch')?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } }\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion }\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n","/**\n * Function associated with particular entry from the RefCountResourcePool.\n *\n * Calling the function will release the reference acquired when object was\n * retieved from the pool.\n */\nexport type UnrefFn = () => void;\n\nexport interface PollResource<R> {\n /** Resource itself */\n readonly resource: R;\n\n /** Resource key, calculated using provided */\n readonly key: string;\n\n /** Callback to be called when requested resource can be disposed. */\n readonly unref: UnrefFn;\n}\n\nexport abstract class RefCountResourcePool<P, R> {\n private readonly resources = new Map<string, RefCountEnvelop<R>>();\n protected abstract createNewResource(params: P): R;\n protected abstract calculateParamsKey(params: P): string;\n\n private check(key: string) {\n const envelop = this.resources.get(key);\n if (envelop === undefined) throw new Error('Unexpected state.');\n if (envelop.refCount === 0) {\n this.resources.delete(key);\n\n // TODO: we can postpone this operation, and run it in the background\n const res: any = envelop.resource;\n if (res !== undefined && res !== null && typeof res[Symbol.dispose] === 'function')\n res[Symbol.dispose]();\n }\n }\n\n public acquire(params: P): PollResource<R> {\n const key = this.calculateParamsKey(params);\n let envelop = this.resources.get(key);\n if (envelop === undefined) {\n envelop = { refCount: 0, resource: this.createNewResource(params) };\n this.resources.set(key, envelop);\n }\n\n // adding ref count\n envelop.refCount++;\n\n let unrefereced = false;\n return {\n resource: envelop.resource,\n key,\n unref: () => {\n if (unrefereced) return; // unref is idempotent, calling it many times have no effect\n // subtracting ref count\n envelop.refCount--;\n unrefereced = true;\n this.check(key);\n }\n };\n }\n\n public getByKey(key: string): R {\n if (!this.resources.has(key)) throw new Error(`resource not found, key = ${key}`);\n return this.resources.get(key)!.resource;\n }\n\n public tryGetByKey(key: string): R | undefined {\n return this.resources.get(key)?.resource;\n }\n}\n\ntype RefCountEnvelop<R> = {\n refCount: number;\n readonly resource: R;\n};\n","export type MlDebugFlags = {\n logPFrameRequests: boolean;\n usePFrameRs: boolean;\n logTreeStats?: 'cumulative' | 'per-request';\n};\n\nlet flags: MlDebugFlags | undefined = undefined;\nexport function getDebugFlags() {\n if (flags) return flags;\n flags = {\n logPFrameRequests: process.env.MI_LOG_PFRAMES !== undefined,\n usePFrameRs: process.env.MI_USE_PFRAMES_RS !== undefined,\n };\n if (process.env.MI_LOG_TREE_STAT)\n flags.logTreeStats\n = process.env.MI_LOG_TREE_STAT === 'cumulative' ? 'cumulative' : 'per-request';\n return flags;\n}\n","import type { DownloadDriver } from '@milaboratories/pl-drivers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { isPlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type { ComputableCtx, ComputableStableDefined } from '@milaboratories/computable';\nimport type {\n CalculateTableDataRequest,\n CalculateTableDataResponse,\n FindColumnsRequest,\n FindColumnsResponse,\n LocalBlobHandleAndSize,\n PColumnIdAndSpec,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n PTableColumnSpec,\n PTableHandle,\n PTableShape,\n PTableVector,\n TableRange,\n UniqueValuesRequest,\n UniqueValuesResponse,\n PFrameDriver as SdkPFrameDriver,\n PColumn,\n PFrameDef,\n JoinEntry,\n PTableDef,\n ValueType,\n PTableRecordSingleValueFilterV2,\n PTableRecordFilter,\n PColumnValues } from '@platforma-sdk/model';\nimport {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n} from '@platforma-sdk/model';\nimport { RefCountResourcePool } from './ref_count_pool';\nimport { allBlobs, makeDataInfoResource, mapBlobs, parseDataInfoResource } from './data';\nimport { createHash } from 'node:crypto';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport { PFrame } from '@milaboratories/pframes-node';\nimport { PFrame as PFrameRs } from '@milaboratories/pframes-rs-node';\nimport * as fsp from 'node:fs/promises';\nimport { LRUCache } from 'lru-cache';\nimport { ConcurrencyLimitingExecutor } from '@milaboratories/ts-helpers';\nimport { getDebugFlags } from '../debug';\n\nfunction blobKey(res: ResourceInfo): string {\n return String(res.id);\n}\n\ntype InternalPFrameData = PFrameDef<PFrameInternal.DataInfo<ResourceInfo>>;\n\nconst valueTypes: ValueType[] = ['Int', 'Long', 'Float', 'Double', 'String', 'Bytes'] as const;\n\nfunction migrateFilters(filters: PTableRecordFilter[]): PTableRecordSingleValueFilterV2[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === 'bySingleColumn') {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: 'bySingleColumnV2',\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n console.warn(\n `type overriten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filters;\n}\n\nconst bigintReplacer = (_: string, v: unknown) => (typeof v === 'bigint' ? v.toString() : v);\n\nclass PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {\n public readonly rustPFrame: PFrameInternal.PFrameV2;\n public readonly specPFrame: PFrameInternal.PFrameV2;\n private readonly blobIdToResource = new Map<string, ResourceInfo>();\n private readonly blobHandleComputables = new Map<\n string,\n ComputableStableDefined<LocalBlobHandleAndSize>\n >();\n\n private readonly createDataPFrame: () => PFrameInternal.PFrameV2;\n public get disposableDataPFrame() {\n const dataPFrame = this.createDataPFrame();\n return {\n dataPFrame,\n [Symbol.dispose]: () => {\n dataPFrame.dispose();\n },\n };\n }\n\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly blobContentCache: LRUCache<string, Uint8Array>,\n columns: InternalPFrameData,\n ) {\n const logFunc: PFrameInternal.Logger = (level: 'info' | 'warn' | 'error', message: string) => {\n switch (level) {\n default:\n case 'info':\n return this.logger.info(message);\n case 'warn':\n return this.logger.warn(message);\n case 'error':\n return this.logger.error(message);\n }\n };\n\n for (const column of columns) {\n for (const blob of allBlobs(column.data)) {\n this.blobIdToResource.set(blobKey(blob), blob);\n }\n }\n const distinct_columns = [\n ...new Map(columns.map((column) => ({\n ...column,\n data: mapBlobs(column.data, blobKey),\n })).map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ];\n\n this.rustPFrame = ((): PFrameInternal.PFrameV2 => {\n try {\n const pFrame = new PFrameRs(getDebugFlags().logPFrameRequests ? logFunc : undefined);\n pFrame.setDataSource(this);\n for (const column of distinct_columns) {\n pFrame.addColumnSpec(column.id, column.spec);\n pFrame.setColumnData(column.id, column.data);\n }\n return pFrame;\n } catch (err: unknown) {\n throw new Error(\n `Rust PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,\n );\n }\n })();\n\n this.specPFrame = ((): PFrameInternal.PFrameV2 => {\n try {\n const pFrame = getDebugFlags().logPFrameRequests ? new PFrame(logFunc) : new PFrame();\n for (const column of distinct_columns) {\n try {\n pFrame.addColumnSpec(column.id, column.spec);\n } catch (err: unknown) {\n throw new Error(\n `Adding column ${column.id} to PFrame failed: ${err as Error}; Spec: ${JSON.stringify(column.spec)}.`,\n );\n }\n }\n return pFrame;\n } catch (err: unknown) {\n throw new Error(\n `Spec PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,\n );\n }\n })();\n\n this.createDataPFrame = (): PFrameInternal.PFrameV2 => {\n try {\n const pFrame = getDebugFlags().logPFrameRequests ? new PFrame(logFunc) : new PFrame();\n pFrame.setDataSource(this);\n for (const column of distinct_columns) {\n try {\n pFrame.addColumnSpec(column.id, column.spec);\n pFrame.setColumnData(column.id, column.data);\n } catch (err: unknown) {\n throw new Error(\n `Adding column ${column.id} to PFrame failed: ${err as Error}; Spec: ${JSON.stringify(column.spec)}, DataInfo: ${JSON.stringify(column.data)}.`,\n );\n }\n }\n return pFrame;\n } catch (err: unknown) {\n throw new Error(\n `Data PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,\n );\n }\n };\n }\n\n private getOrCreateComputableForBlob(blobId: string) {\n let computable = this.blobHandleComputables.get(blobId);\n if (computable !== undefined) return computable;\n\n const blobResource = this.blobIdToResource.get(blobId);\n if (blobResource === undefined) throw new Error(`Blob with id ${blobId} not found.`);\n\n // precalculation of value tree will trigger the download proecess right away\n computable = this.blobDriver.getDownloadedBlob(blobResource).withPreCalculatedValueTree();\n\n this.blobHandleComputables.set(blobId, computable);\n\n return computable;\n }\n\n public readonly preloadBlob = async (blobIds: string[]): Promise<void> => {\n const computables = blobIds.map((blobId) => this.getOrCreateComputableForBlob(blobId));\n for (const computable of computables) await computable.awaitStableFullValue();\n };\n\n public readonly resolveBlob = async (blobId: string): Promise<string> => {\n const computable = this.getOrCreateComputableForBlob(blobId);\n return this.blobDriver.getLocalPath((await computable.awaitStableValue()).handle);\n };\n\n public readonly resolveBlobContent = async (blobId: string): Promise<Uint8Array> => {\n try {\n const computable = this.getOrCreateComputableForBlob(blobId);\n const path = this.blobDriver.getLocalPath((await computable.awaitStableValue()).handle);\n return await this.blobContentCache.forceFetch(path);\n } catch (err: unknown) {\n const error = JSON.stringify(err);\n console.log(`resolveBlobContent catched error: ${error}`);\n throw err;\n }\n };\n\n [Symbol.dispose](): void {\n for (const computable of this.blobHandleComputables.values()) computable.resetState();\n this.rustPFrame.dispose();\n this.specPFrame.dispose();\n }\n}\n\ntype FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport class PFrameDriver implements SdkPFrameDriver {\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>;\n private readonly pTables: RefCountResourcePool<FullPTableDef, Promise<PFrameInternal.PTableV2>>;\n private readonly blobContentCache: LRUCache<string, Uint8Array>;\n /** Limits concurrent requests to PFrame API to prevent deadlock with Node's IO threads */\n private readonly concurrencyLimiter: ConcurrencyLimitingExecutor;\n\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n ) {\n const blobContentCache = new LRUCache<string, Uint8Array>({\n maxSize: 1_000_000_000, // 1Gb\n fetchMethod: async (key) => await fsp.readFile(key),\n sizeCalculation: (v) => v.length,\n });\n this.blobContentCache = blobContentCache;\n\n const concurrencyLimiter = new ConcurrencyLimitingExecutor(1);\n this.concurrencyLimiter = concurrencyLimiter;\n\n this.pFrames = new (class extends RefCountResourcePool<InternalPFrameData, PFrameHolder> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n ) {\n super();\n }\n\n protected createNewResource(params: InternalPFrameData): PFrameHolder {\n if (getDebugFlags().logPFrameRequests)\n logger.info(\n `PFrame creation (pFrameHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n return new PFrameHolder(this.blobDriver, this.logger, blobContentCache, params);\n }\n\n protected calculateParamsKey(params: InternalPFrameData): string {\n return stableKeyFromPFrameData(params);\n }\n })(this.blobDriver, this.logger);\n\n this.pTables = new (class extends RefCountResourcePool<\n FullPTableDef,\n Promise<PFrameInternal.PTableV2>\n > {\n constructor(\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>,\n ) {\n super();\n }\n\n protected async createNewResource(params: FullPTableDef): Promise<PFrameInternal.PTableV2> {\n const handle: PFrameHandle = params.pFrameHandle;\n const rawPTable = await concurrencyLimiter.run(async () => {\n if (getDebugFlags().logPFrameRequests)\n logger.info(\n `PTable creation (pTableHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;\n return await disposableDataPFrame.dataPFrame.createTable({\n src: joinEntryToInternal(params.def.src),\n filters: migrateFilters(params.def.filters),\n });\n });\n return params.def.sorting.length !== 0 ? rawPTable.sort(params.def.sorting) : rawPTable;\n }\n\n protected calculateParamsKey(params: FullPTableDef): string {\n return stableKeyFromFullPTableDef(params);\n }\n })(this.pFrames);\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(\n def: PFrameDef<PlTreeNodeAccessor | PColumnValues>,\n ctx: ComputableCtx,\n ): PFrameHandle {\n const internalData = def\n .filter((c) => valueTypes.find((t) => t === c.spec.valueType))\n .map((c) =>\n mapPObjectData(c, (d) =>\n isPlTreeNodeAccessor(d) ? parseDataInfoResource(d) : makeDataInfoResource(c.spec, d),\n ),\n );\n const res = this.pFrames.acquire(internalData);\n ctx.addOnDestroy(res.unref);\n return res.key as PFrameHandle;\n }\n\n public createPTable(\n def: PTableDef<PColumn<PlTreeNodeAccessor | PColumnValues>>,\n ctx: ComputableCtx,\n ): PTableHandle {\n const pFrameHandle = this.createPFrame(extractAllColumns(def.src), ctx);\n const defIds = mapPTableDef(def, (c) => c.id);\n const res = this.pTables.acquire({ def: defIds, pFrameHandle });\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Create PTable call (pFrameHandle = ${pFrameHandle}; pTableHandle = ${JSON.stringify(res)}): ${JSON.stringify(\n mapPTableDef(def, (c) => c.spec),\n bigintReplacer,\n )}`,\n );\n ctx.addOnDestroy(res.unref); // in addition to pframe unref added in createPFrame above\n return res.key as PTableHandle;\n }\n\n //\n // PFrame istance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [{\n axesSpec: [\n ...new Map(request.compatibleWith.map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ],\n qualifications: [],\n }]\n : [],\n };\n const responce = getDebugFlags().usePFrameRs\n ? await this.pFrames.getByKey(handle).rustPFrame.findColumns(iRequest)\n : await this.concurrencyLimiter.run(\n async () => await this.pFrames.getByKey(handle).specPFrame.findColumns(iRequest),\n );\n return {\n hits: responce.hits\n .filter((h) => // only exactly matching columns\n h.mappingVariants.length === 0\n || h.mappingVariants.some((v) =>\n v.qualifications.forHit.length === 0\n && v.qualifications.forQueries.every((q) => q.length === 0)))\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(handle: PFrameHandle, columnId: PObjectId): Promise<PColumnSpec> {\n return getDebugFlags().usePFrameRs\n ? await this.pFrames.getByKey(handle).rustPFrame.getColumnSpec(columnId)\n : await this.concurrencyLimiter.run(\n async () => await this.pFrames.getByKey(handle).specPFrame.getColumnSpec(columnId),\n );\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n return getDebugFlags().usePFrameRs\n ? await this.pFrames.getByKey(handle).rustPFrame.listColumns()\n : await this.concurrencyLimiter.run(\n async () => await this.pFrames.getByKey(handle).specPFrame.listColumns(),\n );\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n ): Promise<CalculateTableDataResponse> {\n let table = await this.concurrencyLimiter.run(async () => {\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;\n return await disposableDataPFrame.dataPFrame.createTable({\n src: joinEntryToInternal(request.src),\n filters: migrateFilters(request.filters),\n });\n });\n\n if (request.sorting.length > 0) {\n const sortedTable = await this.concurrencyLimiter.run(\n async () => await table.sort(request.sorting),\n );\n table.dispose();\n table = sortedTable;\n }\n\n const spec = table.getSpec();\n const data = await this.concurrencyLimiter.run(\n async () => await table.getData([...spec.keys()]),\n );\n table.dispose();\n\n return spec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n ): Promise<UniqueValuesResponse> {\n return await this.concurrencyLimiter.run(async () => {\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;\n return await disposableDataPFrame.dataPFrame.getUniqueValues({\n ...request,\n filters: migrateFilters(request.filters),\n });\n });\n }\n\n //\n // PTable istance methods\n //\n\n public async getShape(handle: PTableHandle): Promise<PTableShape> {\n const pTable = await this.pTables.getByKey(handle); // internally concurrency limited\n return pTable.getShape();\n }\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const pTable = await this.pTables.getByKey(handle); // internally concurrency limited\n return pTable.getSpec(); // sync operation\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range?: TableRange,\n ): Promise<PTableVector[]> {\n const pTable = await this.pTables.getByKey(handle); // internally concurrency limited\n return await this.concurrencyLimiter.run(\n async () => await pTable.getData(columnIndices, range),\n );\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntry {\n switch (entry.type) {\n case 'column':\n return {\n type: 'column',\n columnId: entry.column,\n qualifications: [],\n };\n case 'inner':\n case 'full':\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case 'outer':\n return {\n type: 'outer',\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction stableKeyFromFullPTableDef(data: FullPTableDef): string {\n const hash = createHash('sha256');\n hash.update(canonicalize(data)!);\n return hash.digest().toString('hex');\n}\n\nfunction stableKeyFromPFrameData(data: PColumn<PFrameInternal.DataInfo<ResourceInfo>>[]): string {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case 'Json':\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case 'JsonPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: blobKey(info),\n })),\n };\n break;\n case 'BinaryPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [blobKey(info.index), blobKey(info.values)] as const,\n })),\n };\n break;\n default:\n throw Error(`unsupported resource type: ${JSON.stringify(type satisfies never)}`);\n }\n result.payload.sort((lhs, rhs) => lhs.key.localeCompare(rhs.key));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => lhs.id.localeCompare(rhs.id));\n\n const hash = createHash('sha256');\n hash.update(canonicalize(orderedData)!);\n return hash.digest().toString('hex');\n}\n","import { PlClient } from '@milaboratories/pl-client';\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n InternalLsDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver\n} from '@milaboratories/pl-drivers';\nimport * as Sdk from '@milaboratories/pl-model-common';\nimport { HmacSha256Signer, MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport * as os from 'node:os';\nimport { PFrameDriver } from '../pool';\nimport {\n DefaultDriverKitOpsPaths,\n DefaultDriverKitOpsSettings,\n DriverKitOps,\n DriverKitOpsConstructor\n} from './ops';\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit {\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: PFrameDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n _ops: DriverKitOpsConstructor\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = new DownloadDriver(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n signer,\n ops.blobDriverOps\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride\n );\n\n const pFrameDriver = new PFrameDriver(blobDriver, ops.logger);\n\n return {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver\n };\n}\n","import {\n field,\n isNullResourceId,\n PlClient,\n ResourceId,\n toGlobalResourceId\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProject, withProjectAuthored } from '../mutator/project';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport { HmacSha256Signer, MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { ComputableStableDefined, WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n MiddleLayerOps,\n MiddleLayerOpsConstructor\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport { ProjectListEntry } from '../model';\nimport { AuthorMarker, ProjectMeta } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport { getQuickJS, QuickJSWASMModule } from 'quickjs-emscripten';\nimport { initDriverKit, MiddleLayerDriverKit } from './driver_kit';\nimport { DriverKit } from '@platforma-sdk/model';\nimport { DefaultVirtualLocalStorages, DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport { Dispatcher, RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\n\nexport interface MiddleLayerEnvironment {\n readonly pl: PlClient;\n readonly logger: MiLogger;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker\n ): Promise<void> {\n await withProjectAuthored(this.pl, rid, author, async (prj) => {\n prj.setMeta(meta);\n });\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx('MLRemoveProject', async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx('Project id to resource id', async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error('Unexpected project list structure.');\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === 'string') return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them. */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.retryHttpDispatcher.destroy();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops\n };\n\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher, {\n minTimeout: 250,\n maxRetries: 4\n });\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher\n );\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n logger,\n pl.httpDispatcher,\n ops.frontendDownloadPath\n );\n\n const env: MiddleLayerEnvironment = {\n pl,\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher: retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel\n }),\n quickJs: await getQuickJS()\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable\n );\n }\n}\n","/** A utility to check network problems and gather statistics.\n * It's useful when we cannot connect to the server of a company\n * because of security reasons,\n * but they can send us and their DevOps team this report. */\n\nimport { UnauthenticatedPlClient, plAddressToConfig } from '@milaboratories/pl-client';\nimport { ValueOrError } from '@milaboratories/ts-helpers';\nimport { setTimeout } from 'timers/promises';\nimport { Dispatcher, request } from 'undici';\nimport { channel } from 'diagnostics_channel';\n\n/** All reports we need to collect. */\ninterface networkReports {\n plPings: networkReport<string>[];\n\n blockRegistryOverviewChecks: httpNetworkReport[];\n blockGARegistryOverviewChecks: httpNetworkReport[];\n blockRegistryUiChecks: httpNetworkReport[];\n blockGARegistryUiChecks: httpNetworkReport[];\n\n autoUpdateCdnChecks: httpNetworkReport[];\n}\n\nexport interface CheckNetworkOpts {\n /** Platforma Backend pings options. */\n pingCheckDurationMs: number;\n pingTimeoutMs: number;\n maxPingsPerSecond: number;\n\n /** An options for CDN and block registry. */\n httpTimeoutMs: number;\n\n /** Block registry pings options. */\n blockRegistryDurationMs: number;\n maxRegistryChecksPerSecond: number;\n blockRegistryUrl: string;\n blockGARegistryUrl: string;\n blockOverviewPath: string;\n blockUiPath: string;\n\n /** CDN for auto-update pings options. */\n autoUpdateCdnDurationMs: number;\n maxAutoUpdateCdnChecksPerSecond: number;\n autoUpdateCdnUrl: string;\n\n bodyLimit: number;\n}\n\n/** A report about one concrete ping to the service. */\ninterface networkReport<T> {\n elapsedMs: number;\n response: ValueOrError<T>;\n}\n\ntype httpNetworkReport = networkReport<{\n statusCode: number;\n beginningOfBody: string;\n}>;\n\n// List of Undici diagnostic channels\nconst undiciEvents: string[] = [\n 'undici:request:create', // When a new request is created\n 'undici:request:bodySent', // When the request body is sent\n 'undici:request:headers', // When request headers are sent\n 'undici:request:error', // When a request encounters an error\n 'undici:request:trailers', // When a response completes.\n\n 'undici:client:sendHeaders',\n 'undici:client:beforeConnect',\n 'undici:client:connected',\n 'undici:client:connectError',\n \n 'undici:socket:close', // When a socket is closed\n 'undici:socket:connect', // When a socket connects\n 'undici:socket:error', // When a socket encounters an error\n\n 'undici:pool:request', // When a request is added to the pool\n 'undici:pool:connect', // When a pool creates a new connection\n 'undici:pool:disconnect', // When a pool connection is closed\n 'undici:pool:destroy', // When a pool is destroyed\n 'undici:dispatcher:request', // When a dispatcher processes a request\n 'undici:dispatcher:connect', // When a dispatcher connects\n 'undici:dispatcher:disconnect', // When a dispatcher disconnects\n 'undici:dispatcher:retry' // When a dispatcher retries a request\n];\n\n/** Checks connectivity to Platforma Backend, to block registry\n * and to auto-update CDN,\n * and generates a string report. */\nexport async function checkNetwork(\n plCredentials: string,\n optsOverrides: Partial<CheckNetworkOpts> = {}\n): Promise<string> {\n const ops: CheckNetworkOpts = {\n pingCheckDurationMs: 10000,\n pingTimeoutMs: 3000,\n maxPingsPerSecond: 50,\n\n httpTimeoutMs: 3000,\n\n blockRegistryDurationMs: 3000,\n maxRegistryChecksPerSecond: 1,\n\n blockRegistryUrl: 'https://blocks.pl-open.science',\n blockGARegistryUrl: 'https://blocks-ga.pl-open.science',\n blockOverviewPath: 'v2/overview.json',\n blockUiPath: 'v2/milaboratories/samples-and-data/1.7.0/ui.tgz',\n\n autoUpdateCdnDurationMs: 5000,\n maxAutoUpdateCdnChecksPerSecond: 1,\n autoUpdateCdnUrl:\n 'https://cdn.platforma.bio/software/platforma-desktop-v2/windows/amd64/latest.yml',\n\n bodyLimit: 300,\n\n ...optsOverrides\n };\n\n const undiciLogs: any[] = [];\n // Subscribe to all Undici diagnostic events\n undiciEvents.forEach((event) => {\n const diagnosticChannel = channel(event);\n diagnosticChannel.subscribe((message: any) => {\n const timestamp = new Date().toISOString();\n if (message?.response?.headers)\n message.response.headers = message.response.headers.map((h: any) => h.toString());\n\n undiciLogs.push(\n JSON.stringify({\n timestamp,\n event,\n data: message\n })\n );\n });\n });\n\n const report: networkReports = {\n plPings: [],\n blockRegistryOverviewChecks: [],\n blockGARegistryOverviewChecks: [],\n blockRegistryUiChecks: [],\n blockGARegistryUiChecks: [],\n\n autoUpdateCdnChecks: []\n };\n\n const plConfig = plAddressToConfig(plCredentials, { defaultRequestTimeout: ops.pingTimeoutMs });\n\n report.plPings = await recordPings(ops.pingCheckDurationMs, ops.maxPingsPerSecond, async () => {\n const uaClient = new UnauthenticatedPlClient(plConfig);\n const response = await uaClient.ping();\n return JSON.stringify(response).slice(0, ops.bodyLimit) + '...';\n });\n\n const uaClient = new UnauthenticatedPlClient(plConfig);\n const httpClient = uaClient.ll.httpDispatcher;\n\n report.blockRegistryOverviewChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () =>\n await requestUrl(new URL(ops.blockOverviewPath, ops.blockRegistryUrl), ops, httpClient)\n );\n\n report.blockGARegistryOverviewChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () =>\n await requestUrl(new URL(ops.blockOverviewPath, ops.blockGARegistryUrl), ops, httpClient)\n );\n\n report.blockRegistryUiChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockRegistryUrl), ops, httpClient)\n );\n\n report.blockGARegistryUiChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockGARegistryUrl), ops, httpClient)\n );\n\n report.autoUpdateCdnChecks = await recordPings(\n ops.autoUpdateCdnDurationMs,\n ops.maxAutoUpdateCdnChecksPerSecond,\n async () => await requestUrl(ops.autoUpdateCdnUrl, ops, httpClient)\n );\n\n return reportsToString(report, plCredentials, ops, undiciLogs);\n}\n\n/** Executes a body several times per second up to the given duration,\n * and returns results and elapsed time for every result. */\nasync function recordPings<T>(\n pingCheckDurationMs: number,\n maxPingsPerSecond: number,\n body: () => Promise<T>\n): Promise<networkReport<T>[]> {\n const startPings = nowMs();\n const reports: networkReport<T>[] = [];\n\n while (elapsed(startPings) < pingCheckDurationMs) {\n const startPing = nowMs();\n let response: ValueOrError<T>;\n try {\n response = { ok: true, value: await body() };\n } catch (e) {\n response = { ok: false, error: e };\n }\n const elapsedPing = elapsed(startPing);\n\n reports.push({\n elapsedMs: elapsedPing,\n response\n });\n\n const sleepBetweenPings = 1000 / maxPingsPerSecond - elapsedPing;\n\n if (sleepBetweenPings > 0) await setTimeout(sleepBetweenPings);\n }\n\n return reports;\n}\n\nasync function requestUrl(url: string | URL, ops: CheckNetworkOpts, httpClient: Dispatcher) {\n const { body: rawBody, statusCode } = await request(url, {\n dispatcher: httpClient,\n headersTimeout: ops.httpTimeoutMs,\n bodyTimeout: ops.httpTimeoutMs\n });\n const body = await rawBody.text();\n\n return {\n statusCode: statusCode,\n beginningOfBody: body.slice(0, ops.bodyLimit) + '...'\n };\n}\n\nfunction reportsToString(\n report: networkReports,\n plEndpoint: string,\n opts: CheckNetworkOpts,\n undiciLogs: any[]\n): string {\n const successPings = report.plPings.filter((p) => p.response.ok);\n const failedPings = report.plPings.filter((p) => !p.response.ok);\n const successPingsBodies = [\n ...new Set(successPings.map((p) => JSON.stringify((p.response as any).value)))\n ];\n\n return `\nNetwork report:\npl endpoint: ${plEndpoint};\noptions: ${JSON.stringify(opts, null, 2)}.\n\nPlatforma pings: ${reportToString(report.plPings)}\n\nBlock registry overview responses: ${reportToString(report.blockRegistryOverviewChecks)}\n\nBlock ga registry overview responses: ${reportToString(report.blockGARegistryOverviewChecks)}\n\nBlock registry ui responses: ${reportToString(report.blockRegistryUiChecks)}\n\nBlock ga registry ui responses: ${reportToString(report.blockGARegistryUiChecks)}\n\nAuto-update CDN responses: ${reportToString(report.autoUpdateCdnChecks)}\n\nBlock registry overview dumps:\n${JSON.stringify(report.blockRegistryOverviewChecks, null, 2)}\n\nBlock ga registry overview dumps:\n${JSON.stringify(report.blockGARegistryOverviewChecks, null, 2)}\n\nBlock registry ui dumps:\n${JSON.stringify(report.blockRegistryUiChecks, null, 2)}\n\nBlock ga registry ui dumps:\n${JSON.stringify(report.blockGARegistryUiChecks, null, 2)}\n\nAuto-update CDN dumps:\n${JSON.stringify(report.autoUpdateCdnChecks, null, 2)}\n\nPlatforma pings error dumps:\n${JSON.stringify(failedPings, null, 2)}\n\nPlatforma pings success dump examples:\n${JSON.stringify(successPingsBodies, null, 2)}\n\nUndici logs:\n${undiciLogs.join('\\n')}\n`;\n}\n\nfunction reportToString<T>(report: networkReport<T>[]): string {\n const successes = report.filter((r) => r.response.ok);\n const { mean: mean, median: median } = elapsedStat(report);\n\n return `\ntotal: ${report.length};\nsuccesses: ${successes.length};\nerrors: ${report.length - successes.length};\nmean in ms: ${mean};\nmedian in ms: ${median};\n`;\n}\n\nfunction elapsedStat(reports: { elapsedMs: number }[]) {\n const checks = reports.map((p) => p.elapsedMs);\n const mean = checks.reduce((sum, p) => sum + p) / checks.length;\n\n let median = undefined;\n if (checks.length > 0) {\n const mid = Math.floor(checks.length / 2);\n median = checks.length % 2 ? checks[mid] : (checks[mid - 1] + checks[mid]) / 2;\n }\n\n return { mean, median };\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction elapsed(startMs: number): number {\n return nowMs() - startMs;\n}\n"],"names":["tryStat","path","fsp","error","LegacyDevBlockPackMetaYaml","RegistryV1","LegacyDevBlockPackMetaJson","LegacyDevBlockPackTemplate","LegacyDevBlockPackConfig","LegacyDevBlockPackFrontendFolder","CanonicalBlockConfigRequest","CanonicalBlockUiRequestPackageJson","LegacyDevBlockPackFiles","isLegacyDevPackage","packageRoot","mustResolve","root","request","res","tryResolve","resolveDevPacket","ignoreErrors","workflow","config","uiPackageJson","getFileContent","fs","getFileStat","getDevV1PacketMtime","devPath","mtime","f","fullPath","stat","getDevV2PacketMtime","description","wfStats","modelStats","BlockPackRegistry","v2Provider","registries","http","regEntry","result","regSpec","httpOptions","overview","overviewEntry","organization","pkg","latestMeta","latestVersion","id","latestOverview","AnyChannel","StableChannel","v","e","s","entry","legacyYamlContent","YAML","actualDevPath","v2Description","tryLoadPackDescription","bpSubfolder","BlockPackMetaEmbedAbsoluteBytes","assertNever","blockPacks","regSpecs","registryId","blockId","channel","_a","reg","V2RegistryProvider","__publicField","url","fromCache","newRegistry","RegistryV2Reader","folderReaderByUrl","CentralBlockRegistry","V1CentralRegistry","V1CentralDevSnapshotRegistry","InitialBlockStructure","InitialProjectRenderingState","InitialBlockMeta","ProjectResourceType","SchemaVersionKey","SchemaVersionCurrent","ProjectCreatedTimestamp","ProjectLastModifiedTimestamp","ProjectMetaKey","ProjectStructureKey","BlockRenderingStateKey","BlockFrontendStateKeyPrefix","BlockFrontendStateKeyPattern","blockFrontendStateKey","BlockArgsAuthorKeyPrefix","blockArgsAuthorKey","ProjectStructureAuthorKey","parseBlockFrontendStateKey","key","match","ServiceTemplateCacheFieldPrefix","getServiceTemplateField","hash","projectFieldName","fieldName","projectFieldPattern","parseProjectField","name","ProjectsField","ProjectsResourceType","ProjectsListTreePruningFunction","resource","resourceTypesEqual","createProjectList","pl","rid","openedProjects","env","tree","SynchronizedTreeState","Computable","ctx","node","oProjects","field","prj","meta","notEmpty","created","lastModified","p","EphRenderTemplate","RenderTemplate","createRenderTemplate","tx","tpl","ephemeral","inputs","outputNames","rId","tplField","inputsField","Pl","BContextEnd","BContext","BContextId","BContextMultiParentPrefix","HeavyBlockOutputNames","createRenderHeavyBlock","createBContextEnd","createBContextFromUpstreams","upstreamCtxs","randomUUID","i","loadTemplateFromExplicitDirect","spec","templateInfo","parseTemplate","templateFormat","createTemplateV2Tree","LibRenderer","PlTemplateLibV1","_creator","SoftwareInfoRenderer","PlTemplateSoftwareV1","sw","ref","HashOverrideRenderer","PlTemplateOverrideV1","TemplateRenderer","PlTemplateV1","srt","entries","a","b","libId","lib","swId","tplId","tplRef","fld","depTplId","depTpl","overrideRef","tplInfo","resourceCache","createResource","renderer","hasher","createHash","rKey","TengoTemplateGet","TengoTemplateGetRegistry","TengoTemplateGetTemplateURI","TengoTemplateGetTemplate","TengoTemplatePack","TengoTemplatePackConvert","TengoTemplatePackConvertTemplatePack","TengoTemplatePackConvertTemplate","prepareTemplateSpec","loadTemplateFromRegistry","getTemplate","registry","uri","templateFromRegistry","loadTemplate","FrontendFromUrlResourceType","FrontendFromFolderResourceType","createFrontend","BlockPackCustomType","BlockPackTemplateField","BlockPackFrontendField","tSlash","str","BlockPackPreparer","v2RegistryProvider","signer","devPaths","configContent","loadPackDescription","urlPrefix","components","templateContent","frontendPath","workflowContent","source","templateUrl","templateResponse","getModel","getWorkflow","model","createCustomBlockPack","blockPackInfo","bp","createBlockPack","outputRef","isBlockOutputReference","obj","addAllReferencedBlocks","allowed","type","child","inferAllReferencedBlocks","args","allBlocks","structure","g","BlockGraph","nodes","direction","rootBlockIds","all","r","cb","unprocessed","queued","nextUnprocessed","info","stagingGraph","previous","current","productionGraph","argsProvider","possibleUpstreams","upstreams","dep","setsEqual","intersects","graphDiff","onlyInA","onlyInB","different","fromA","fromB","preparedTemplateEnvelop","getPreparedExportTemplateEnvelope","preparedTemplate","SdkTemplates","exportContext","exportTpl","cached","modIdCb","valueCb","initialized","lastModId","value","currentModId","BlockInfo","fields","bin","NoNewBlocks","ProjectMutator","author","schema","struct","renderingState","blocksInLimbo","blockInfos","blockFrontendStates","ctxExportTplHolder","blockInfo","initialBlockSettings","InitialBlockSettings","content","block","state","fid","status","fieldNames","deleted","_b","_c","requests","changed","binary","argsRef","newState","newValue","upstream","ctxField","upstreamContexts","results","newStructure","newBlockSpecProvider","currentStagingGraph","currentActualProductionGraph","newStagingGraph","newActualProductionGraph","stagingDiff","prodDiff","before","newStruct","done","group","idx","newArgs","blockIds","addUpstreams","blockIdsSet","prodGraph","rendered","render","activeProdGraph","queue","Denque","stopped","downstream","lags","lag","upstreamLag","stagingRenderingRate","elapsed","lagThreshold","_d","markerStr","uiState","fullResourceStateP","schemaP","lastModifiedP","metaP","structureP","renderingStateP","allKVP","fullResourceState","stagingRefreshTimestamp","allKV","blockInfoStates","projectField","isNullResourceId","ctxExportTplEnvelope","ctxExportTplCacheFieldName","ctxExportTplField","ensureResourceIdNotNull","blocksInLimboSet","kv","isResource","isResourceRef","response","isNotNullResourceId","blockInStruct","createProject","ts","withProject","txOrPl","withProjectAuthored","PlClient","mut","allBlobs","data","blob","index","values","mapValues","callback","mapBlobs","mapping","PColumnDataJsonPartitioned","resourceType","PColumnDataJsonSuperPartitioned","PColumnDataBinaryPartitioned","PColumnDataBinarySuperPartitioned","PColumnDataJson","parseDataInfoResource","resourceData","dataContent","parts","superKey","superPart","keys","partKey","part","superData","resourceTypeToString","makeDataInfoResource","keyLength","jsonData","val","deriveLegacyPObjectId","canonicalize","deriveGlobalPObjectId","exportName","deriveLocalPObjectId","resolvePath","outputName","parseRawPObjectCollection","errorOnUnknownField","ignoreFieldErrors","prefix","entryPattern","locked","parseFinalPObjectCollection","rawCollection","assert","collection","PlError","ResultPool","blocks","allSpecsAvailable","outer","_f","_e","mapValueInVOE","resultWithErrors","isComplete","instabilityMarker","markUnstable","marker","tryAddEntry","exportsProcessed","predicate","found","exportsChecked","addToFound","executePSpecPredicate","prjEntry","rootBlockId","targetBlocks","prod","loadCtx","staging","calculated","ctxAccessor","constructBlockContextArgsOnly","projectEntry","cCtx","constructBlockContext","traverseCfg","cfg","guide","mapRecord","mapper","ifNotUndef","isActiveCfg","hasActiveCfgComponents","nested","resOp","SRMakeObject","k","SRFlatten","SRGetResourceField","mapArrayToRecord","elements","length","SRMapArrayValues1","ops","SRCollectArrayFromArgs","renderCfg","SRMapRecordValues1","nextArgs","newCtx","SRMapRecordValues2","SRIsEmpty","arg","SRNot","operand","SRAnd","operand1","operand2","SROr","SRResourceValueAsJson","SRGetJsonField","SRMapResourceFields1","SRMapResourceFields2","SRGetBlobContent","drivers","SRGetBlobContentAsString","resourceInfo","SRGetBlobContentAsJson","c","SRGetDownloadedBlobContent","SRGetOnDemandBlobContent","SRExtractArchiveAndGetURL","format","SRGetImportProgress","SRGetLastLogs","lines","SRGetProgressLog","patternToSearch","SRGetProgressLogWithInfo","SRGetLogHandle","ctxValue","computableFromCfgUnsafe","NonKeyCtxFields","toCfgContext","ReturnOpKey","ReturnArgKey","ReturnDestination","isReturnDestination","destination","zeroStack","execute","stack","operations","allowComputables","operationQueue","deliverResult","pending","computables","mainLoop","op","action","newOpKey","argRequests","initialArgCounter","operation","computableFromCfg","bCtx","resolvedOps","mc","postEnv","copyOfPendingSubrotines","copiedStack","isArrayBufferOrView","bytesToBase64","JsExecutionContext","scope","vm","blockCtx","computableCtx","json","code","err","cbName","Scope","localScope","targetCallback","wellKnownAccessor","ctxKey","lambda","handle","commonOptions","steps","resolveSteps","acc","accResult","mapPObjectData","d","hPrefix","computable","fHandle","nLines","specs","def","mapPTableDef","accessor","nextHandle","manage","simpleHandle","text","strHandle","configCtx","activeArgs","JsRenderInternal","exportCtxFunction","fn","fnh","step","getBlockPackInfo","bpAcc","extractConfig","LogOutputStatus","computableFromRF","fh","configKey","runtime","rCtx","recalculationCounter","resolved","unstableMarker","stable","renderedResult","isActive","isConfigLambda","computableFromCfgOrRF","cfgOrFh","projectOverview","navigationStates","infos","cInputs","rInputs","currentGraph","limbo","defaultLabel","renderingMode","gNode","calculationStatus","sections","title","inputsValid","sdkVersion","bpId","blockCtxArgsOnly","settings","updates","cantRun","staleBlocks","stale","u","canRun","bb","kernel","frontendRes","frontendPathComputable","frontendData","frontendEntry","blockArgsAndUiState","resourceIdToString","blockOutputs","outputs","cellId","cellCfg","computableOutput","activeConfigs","ret","activeOutputConfigs","NavigationStates","ChangeSource","DefaultNavigationState","Project","projectTree","setTimeout","isNotFoundError","isTimeoutOrCancelError","blockLabel","blockPackSpec","preparedBp","blockCfgContainer","blockCfg","resetArgs","currentStructure","currentGroup","bpHolderRid","bpRid","bpData","bpInfo","fd","_","projectTreePruning","DefaultDriverKitOpsSettings","ConsoleLoggerAdapter","DefaultDriverKitOpsPaths","workDir","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","SEMVER_SPEC_VERSION","MAX_LENGTH","MAX_SAFE_INTEGER","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","RELEASE_TYPES","constants","debug","debug_1","require$$0","require$$1","exports","module","re","safeRe","src","t","R","LETTERDASHNUMBER","safeRegexReplacements","makeSafeRegex","token","max","createToken","isGlobal","safe","looseOption","emptyOpts","parseOptions","options","parseOptions_1","numeric","compareIdentifiers","anum","bnum","rcompareIdentifiers","identifiers","require$$2","require$$3","require$$4","SemVer$d","SemVer","version","m","num","other","release","identifier","identifierBase","base","prerelease","semver","parse","throwErrors","er","parse_1","valid","valid_1","clean","clean_1","inc","inc_1","diff","version1","version2","v1","v2","comparison","v1Higher","highVersion","lowVersion","highHasPre","diff_1","major","loose","major_1","minor","minor_1","patch","patch_1","parsed","prerelease_1","compare","compare_1","rcompare","rcompare_1","compareLoose","compareLoose_1","compareBuild","versionA","versionB","compareBuild_1","sort","list","sort_1","rsort","rsort_1","gt","gt_1","lt","lt_1","eq","eq_1","neq","neq_1","gte","gte_1","lte","lte_1","require$$5","cmp","cmp_1","coerce","coerceRtlRegex","next","build","coerce_1","LRUCache","firstKey","lrucache","SPACE_CHARACTERS","Range","range","Comparator","first","isNullSet","isAny","comps","memoKey","FLAG_INCLUDE_PRERELEASE","FLAG_LOOSE","cache","hr","hyphenReplace","comparatorTrimReplace","tildeTrimReplace","caretTrimReplace","rangeList","comp","parseComparator","replaceGTE0","rangeMap","comparators","thisComparators","isSatisfiable","rangeComparators","thisComparator","rangeComparator","testSet","LRU","require$$6","remainingComparators","testComparator","otherComparator","replaceCarets","replaceTildes","replaceXRanges","replaceStars","isX","replaceTilde","M","pr","replaceCaret","z","replaceXRange","gtlt","xM","xm","xp","anyX","incPr","$0","from","fM","fm","fp","fpr","fb","to","tM","tm","tp","tpr","set","ANY","comparator","satisfies","satisfies_1","toComparators","toComparators_1","maxSatisfying","versions","maxSV","rangeObj","maxSatisfying_1","minSatisfying","min","minSV","minSatisfying_1","minVersion","minver","setMin","compver","minVersion_1","validRange","require$$7","outside","hilo","gtfn","ltefn","ltfn","ecomp","high","low","outside_1","gtr","gtr_1","ltr","ltr_1","r1","r2","intersects_1","simplify","prev","ranges","simplified","original","subset","sub","dom","sawNonNull","OUTER","simpleSub","simpleDom","isSub","simpleSubset","minimumVersionWithPreRelease","minimumVersion","eqSet","higherGT","lowerLT","gtltComp","higher","lower","hasDomLT","hasDomGT","needDomLTPre","needDomGTPre","subset_1","internalRe","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","simplifyRange","require$$39","require$$40","DefaultBlockUpdateWatcherOps","NoUpdatesKey","BlockUpdateWatcher","PollComputablePool","registryProvider","logger","req","cSpec","versionLock","skipVersion","blockPackIdToString","vSuggestions","vMainSuggestion","suggestions","update","mainSuggestion","res1","res2","RefCountResourcePool","envelop","params","unrefereced","flags","getDebugFlags","blobKey","valueTypes","migrateFilters","filters","filtersV1","filtersV2","filter","filtersV1Json","bigintReplacer","PFrameHolder","blobDriver","blobContentCache","columns","blobIds","blobId","logFunc","level","message","column","distinct_columns","item","pFrame","PFrameRs","PFrame","dataPFrame","blobResource","PFrameDriver","concurrencyLimiter","ConcurrencyLimitingExecutor","stableKeyFromPFrameData","pFrames","rawPTable","_stack","disposableDataPFrame","__using","joinEntryToInternal","_error","_hasError","__callDispose","stableKeyFromFullPTableDef","internalData","isPlTreeNodeAccessor","pFrameHandle","extractAllColumns","defIds","iRequest","h","q","columnId","table","sortedTable","columnIndices","pTable","col","orderedData","lhs","rhs","initDriverKit","workdir","_ops","HmacSha256Signer","downloadClient","createDownloadClient","logsClient","createLogsClient","uploadBlobClient","createUploadBlobClient","uploadProgressClient","createUploadProgressClient","DownloadDriver","blobToURLDriver","DownloadBlobToURLDriver","uploadDriver","UploadDriver","logsStreamDriver","LogsStreamDriver","logDriver","LogsDriver","lsDriver","LsDriver","pFrameDriver","MiddleLayer","driverKit","projectListResourceId","openedProjectsList","projectListTree","blockRegistryProvider","projectList","toGlobalResourceId","projects","projectsField","projectsFieldData","retryHttpDispatcher","RetryAgent","bpPreparer","frontendDownloadDriver","DownloadUrlDriver","getQuickJS","WatchableValue","projectListTC","undiciEvents","checkNetwork","plCredentials","optsOverrides","undiciLogs","event","timestamp","report","plConfig","plAddressToConfig","recordPings","UnauthenticatedPlClient","httpClient","requestUrl","reportsToString","pingCheckDurationMs","maxPingsPerSecond","body","startPings","nowMs","reports","startPing","elapsedPing","sleepBetweenPings","rawBody","statusCode","plEndpoint","opts","successPings","failedPings","successPingsBodies","reportToString","successes","mean","median","elapsedStat","checks","sum","mid","startMs"],"mappings":"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","x_google_ignoreList":[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82]}
1
+ {"version":3,"file":"index.js","sources":["../src/dev_env/util.ts","../src/dev_env/index.ts","../src/block_registry/registry.ts","../src/block_registry/registry-v2-provider.ts","../src/block_registry/well_known_registries.ts","../src/model/project_model.ts","../src/middle_layer/project_list.ts","../src/mutator/template/render_template.ts","../src/mutator/template/render_block.ts","../src/mutator/template/direct_template_loader.ts","../src/mutator/template/template_loading.ts","../src/model/block_pack_spec.ts","../src/mutator/block-pack/frontend.ts","../src/mutator/block-pack/block_pack.ts","../src/model/args.ts","../src/model/project_model_util.ts","../src/mutator/context_export.ts","../src/mutator/project.ts","../src/pool/data.ts","../src/pool/p_object_collection.ts","../src/pool/result_pool.ts","../src/middle_layer/block_ctx.ts","../src/cfg_render/traverse.ts","../src/cfg_render/util.ts","../src/cfg_render/renderer.ts","../src/middle_layer/block_ctx_unsafe.ts","../src/cfg_render/executor.ts","../src/js_render/context.ts","../src/middle_layer/util.ts","../src/js_render/index.ts","../src/middle_layer/render.ts","../src/middle_layer/project_overview.ts","../src/middle_layer/frontend_path.ts","../src/middle_layer/block.ts","../src/middle_layer/active_cfg.ts","../src/middle_layer/navigation_states.ts","../src/middle_layer/project.ts","../src/middle_layer/ops.ts","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/constants.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/debug.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/re.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/parse-options.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/identifiers.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/semver.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/parse.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/valid.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/clean.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/inc.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/diff.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/major.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/minor.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/patch.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/prerelease.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rcompare.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-loose.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/compare-build.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/sort.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/rsort.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gt.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lt.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/eq.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/neq.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/gte.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/lte.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/cmp.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/coerce.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/internal/lrucache.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/range.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/classes/comparator.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/functions/satisfies.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/to-comparators.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/max-satisfying.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-satisfying.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/min-version.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/valid.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/outside.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/gtr.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/ltr.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/intersects.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/simplify.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/ranges/subset.js","../../../../node_modules/.pnpm/semver@7.6.3/node_modules/semver/index.js","../src/block_registry/watcher.ts","../src/pool/ref_count_pool.ts","../src/debug/index.ts","../src/pool/driver.ts","../src/middle_layer/driver_kit.ts","../src/middle_layer/middle_layer.ts","../src/network_check.ts"],"sourcesContent":["import { BigIntStats } from 'node:fs';\nimport * as fsp from 'node:fs/promises';\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n","import { RegistryV1 } from '@platforma-sdk/block-tools';\nimport path from 'path';\nimport { tryStat } from './util';\nimport { tryResolve } from '@milaboratories/resolve-helper';\n\nexport const LegacyDevBlockPackMetaYaml = [RegistryV1.PlPackageYamlConfigFile];\nexport const LegacyDevBlockPackMetaJson = [RegistryV1.PlPackageJsonConfigFile];\nexport const LegacyDevBlockPackTemplate = ['backend', 'dist', 'tengo', 'tpl', 'main.plj.gz'];\nexport const LegacyDevBlockPackConfig = ['config', 'dist', 'config.json'];\nexport const LegacyDevBlockPackFrontendFolder = ['frontend', 'dist'];\n\nexport const CanonicalBlockWorkflowRequest = 'block-workflow/dist/tengo/tpl/main.plj.gz';\nexport const CanonicalBlockConfigRequest = 'block-model/dist/config.json';\nexport const CanonicalBlockUiRequestPackageJson = 'block-ui/package.json';\n\nexport const LegacyDevBlockPackFiles = [\n LegacyDevBlockPackTemplate,\n LegacyDevBlockPackConfig,\n LegacyDevBlockPackMetaYaml,\n LegacyDevBlockPackMetaJson,\n LegacyDevBlockPackFrontendFolder\n];\n\nexport type DevPacketPaths = {\n /** main.plj.gz */\n readonly workflow: string;\n /** config.json */\n readonly config: string;\n /** ui dist folder */\n readonly ui: string;\n};\n\nexport async function isLegacyDevPackage(packageRoot: string): Promise<boolean> {\n return (\n (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackConfig))) !== undefined ||\n (await tryStat(path.join(packageRoot, ...LegacyDevBlockPackTemplate))) !== undefined\n );\n}\n\nfunction mustResolve(root: string, request: string): string {\n const res = tryResolve(root, request);\n if (res === undefined) throw new Error(`Can't resolve ${request} against ${root}`);\n return res;\n}\n\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: true\n): Promise<DevPacketPaths | undefined>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: false\n): Promise<DevPacketPaths>;\nexport async function resolveDevPacket(\n packageRoot: string,\n ignoreErrors: boolean\n): Promise<DevPacketPaths | undefined> {\n if (!path.isAbsolute(packageRoot)) packageRoot = path.resolve(packageRoot);\n if (await isLegacyDevPackage(packageRoot))\n return {\n workflow: path.join(packageRoot, ...LegacyDevBlockPackTemplate),\n config: path.join(packageRoot, ...LegacyDevBlockPackConfig),\n ui: path.join(packageRoot, ...LegacyDevBlockPackFrontendFolder)\n };\n if (ignoreErrors) {\n const workflow = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (workflow === undefined) return undefined;\n const config = tryResolve(packageRoot, CanonicalBlockConfigRequest);\n if (config === undefined) return undefined;\n const uiPackageJson = tryResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n if (uiPackageJson === undefined) return undefined;\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n } else {\n const workflow = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const config = mustResolve(packageRoot, CanonicalBlockConfigRequest);\n const uiPackageJson = mustResolve(packageRoot, CanonicalBlockUiRequestPackageJson);\n return { workflow, config, ui: path.resolve(uiPackageJson, '..', 'dist') };\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport {\n BlockPackDescriptionAbsolute,\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport { V2RegistryProvider } from './registry-v2-provider';\nimport {\n AnyChannel,\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview,\n StableChannel\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: latestMeta['title'] ?? 'No title',\n description: latestMeta['description'] ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com'\n }\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url\n }\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] }))\n });\n }\n return result;\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks()).map((e) =>\n e.latestByChannel[StableChannel]\n ? {\n ...e,\n registryId: regEntry.id\n }\n : {\n ...e,\n latestByChannel: {\n ...e.latestByChannel,\n [StableChannel]: ((s: SingleBlockPackOverview) => {\n if (s.spec.type === 'from-registry-v2') {\n return {...s, spec: {...s.spec, channel: StableChannel}};\n }\n\n return s;\n })(e.latestByChannel[AnyChannel])\n },\n registryId: regEntry.id\n }\n );\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile)\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV'\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com'\n }\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime\n }\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview\n },\n allVersions: []\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime\n }\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview\n },\n allVersions: []\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n","import { folderReaderByUrl, RegistryV2Reader } from '@platforma-sdk/block-tools';\nimport { Dispatcher } from 'undici';\n\nexport class V2RegistryProvider {\n private readonly registries = new Map<string, RegistryV2Reader>();\n\n constructor(private readonly http: Dispatcher) {}\n\n public getRegistry(url: string): RegistryV2Reader {\n const fromCache = this.registries.get(url);\n if (fromCache) return fromCache;\n const newRegistry = new RegistryV2Reader(folderReaderByUrl(url, this.http));\n this.registries.set(url, newRegistry);\n return newRegistry;\n }\n}\n","import { RegistrySpec } from '@milaboratories/pl-model-middle-layer';\n\nexport const CentralBlockRegistry: RegistrySpec = {\n type: 'remote-v2',\n url: 'https://blocks.pl-open.science/'\n};\n\nexport const V1CentralRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/releases'\n};\n\nexport const V1CentralDevSnapshotRegistry: RegistrySpec = {\n type: 'remote-v1',\n url: 'https://block.registry.platforma.bio/dev'\n};\n","import { ResourceId, ResourceType } from '@milaboratories/pl-client';\nimport {\n ProjectListEntry as ProjectListEntryFromModel,\n ProjectMeta\n} from '@milaboratories/pl-model-middle-layer';\nimport { BlockRenderingMode } from '@platforma-sdk/model';\n\nexport interface ProjectListEntry extends ProjectListEntryFromModel {\n /** Project resource ID. */\n rid: ResourceId;\n}\n\n/** Entry representing a single block in block structure */\nexport interface Block {\n /** Unique block id */\n readonly id: string;\n\n /**\n * Label shown to the user\n * @deprecated\n * */\n label: string;\n\n /** How to approach block rendering */\n renderingMode: BlockRenderingMode;\n}\n\n/** Block group in block structure */\nexport interface BlockGroup {\n /** Unique group id */\n readonly id: string;\n\n /** Label shown to the user */\n label: string;\n\n /** Blocks */\n blocks: Block[];\n}\n\n/** Root of block structure value */\nexport interface ProjectStructure {\n /** The structure */\n readonly groups: BlockGroup[];\n}\n\nexport const InitialBlockStructure: ProjectStructure = {\n groups: [{ id: 'default', label: 'Default', blocks: [] }]\n};\n\n/** Root of project rendering state */\nexport interface ProjectRenderingState {\n /** Timestamp of last staging rendering event */\n stagingRefreshTimestamp: number;\n\n /** Blocks with detached production state, i.e. some of the dependencies of\n * such blocks were re-rendered, but their state was left \"as is\". */\n blocksInLimbo: string[];\n}\n\nexport const InitialProjectRenderingState: ProjectRenderingState = {\n stagingRefreshTimestamp: 0,\n blocksInLimbo: []\n};\n\nexport const InitialBlockMeta: ProjectMeta = {\n label: 'New Project'\n};\n\n//\n// Pl Model\n//\n\nexport const ProjectResourceType: ResourceType = { name: 'UserProject', version: '2' };\n\nexport const SchemaVersionKey = 'SchemaVersion';\nexport const SchemaVersionCurrent = '1';\n\nexport const ProjectCreatedTimestamp = 'ProjectCreated';\nexport const ProjectLastModifiedTimestamp = 'ProjectLastModified';\nexport const ProjectMetaKey = 'ProjectMeta';\nexport const ProjectStructureKey = 'ProjectStructure';\nexport const BlockRenderingStateKey = 'BlockRenderingState';\n\nexport const BlockFrontendStateKeyPrefix = 'BlockFrontendState/';\nexport const BlockFrontendStateKeyPattern = /^BlockFrontendState\\/(?<blockid>.*)$/;\n\nexport function blockFrontendStateKey(blockId: string): string {\n return `${BlockFrontendStateKeyPrefix}${blockId}`;\n}\n\nexport const BlockArgsAuthorKeyPrefix = 'BlockArgsAuthor/';\nexport const BlockArgsAuthorKeyPattern = /^BlockArgsAuthor\\/(?<blockid>.*)$/;\n\nexport function blockArgsAuthorKey(blockId: string): string {\n return `${BlockArgsAuthorKeyPrefix}${blockId}`;\n}\n\nexport const ProjectStructureAuthorKey = 'ProjectStructureAuthor';\n\n/** Returns block id, or undefined if key does not match the pattern. */\nexport function parseBlockFrontendStateKey(key: string): string | undefined {\n const match = key.match(BlockFrontendStateKeyPattern);\n if (match === null) return undefined;\n return match.groups!['blockid'];\n}\n\nexport const ServiceTemplateCacheFieldPrefix = '__serviceTemplate_';\n\nexport function getServiceTemplateField(hash: string): string {\n return `${ServiceTemplateCacheFieldPrefix}${hash}`;\n}\n\nexport interface ProjectField {\n blockId: string;\n fieldName:\n | 'blockPack'\n | 'blockSettings'\n | 'prodArgs'\n | 'currentArgs'\n | 'prodCtx'\n | 'prodUiCtx'\n | 'prodOutput'\n | 'prodCtxPrevious'\n | 'prodUiCtxPrevious'\n | 'prodOutputPrevious'\n | 'stagingCtx'\n | 'stagingUiCtx'\n | 'stagingOutput'\n | 'stagingCtxPrevious'\n | 'stagingUiCtxPrevious'\n | 'stagingOutputPrevious';\n}\n\nexport function projectFieldName(blockId: string, fieldName: ProjectField['fieldName']): string {\n return `${blockId}-${fieldName}`;\n}\n\nconst projectFieldPattern =\n /^(?<blockId>.*)-(?<fieldName>blockPack|blockSettings|prodArgs|currentArgs|prodCtx|prodUiCtx|prodOutput|prodCtxPrevious|prodUiCtxPrevious|prodOutputPrevious|stagingCtx|stagingUiCtx|stagingOutput|stagingCtxPrevious|stagingUiCtxPrevious|stagingOutputPrevious)$/;\n\nexport function parseProjectField(name: string): ProjectField | undefined {\n const match = name.match(projectFieldPattern);\n if (match === null) return undefined;\n const { blockId, fieldName } = match.groups!;\n return { blockId, fieldName } as ProjectField;\n}\n","import { PruningFunction, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { PlClient, ResourceId, ResourceType, resourceTypesEqual } from '@milaboratories/pl-client';\nimport { TreeAndComputableU } from './types';\nimport { Computable, WatchableValue } from '@milaboratories/computable';\nimport {\n ProjectCreatedTimestamp,\n ProjectLastModifiedTimestamp,\n ProjectListEntry,\n ProjectMetaKey\n} from '../model/project_model';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { ProjectMeta } from '@milaboratories/pl-model-middle-layer';\n\nexport const ProjectsField = 'projects';\nexport const ProjectsResourceType: ResourceType = { name: 'Projects', version: '1' };\n\nexport const ProjectsListTreePruningFunction: PruningFunction = (resource) => {\n if (!resourceTypesEqual(resource.type, ProjectsResourceType)) return [];\n return resource.fields;\n};\n\nexport async function createProjectList(\n pl: PlClient,\n rid: ResourceId,\n openedProjects: WatchableValue<ResourceId[]>,\n env: MiddleLayerEnvironment\n): Promise<TreeAndComputableU<ProjectListEntry[]>> {\n const tree = await SynchronizedTreeState.init(\n pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: ProjectsListTreePruningFunction\n },\n env.logger\n );\n\n const c = Computable.make((ctx) => {\n const node = ctx.accessor(tree.entry()).node();\n const oProjects = openedProjects.getValue(ctx);\n if (node === undefined) return undefined;\n const result: ProjectListEntry[] = [];\n for (const field of node.listDynamicFields()) {\n const prj = node.traverse(field);\n if (prj === undefined) continue;\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n result.push({\n id: field,\n rid: prj.id,\n created: new Date(created),\n lastModified: new Date(lastModified),\n opened: oProjects.indexOf(prj.id) >= 0,\n meta\n });\n }\n result.sort((p) => -p.lastModified.valueOf());\n return result;\n }).withStableType();\n\n return { computable: c, tree };\n}\n","import { AnyRef, field, Pl, PlTransaction } from '@milaboratories/pl-client';\nimport { ResourceType } from '@platforma-sdk/model';\n\nconst EphRenderTemplate: ResourceType = {\n name: 'EphRenderTemplate',\n version: '1'\n};\nconst RenderTemplate: ResourceType = {\n name: 'RenderTemplate',\n version: '1'\n};\n\n/**\n * Creates render template operation, for a given remplate and inputs.\n *\n * @param tx transaction to use during rendering creation\n * @param tpl reference to the template resource (see {@link loadTemplate})\n * @param ephemeral true for ephemeral templates, false for pure templates\n * @param inputs map of inputs pointing to other resources or fields\n * @param outputNames names of the outputs to collect and return from this method\n */\nexport function createRenderTemplate<O extends string>(\n tx: PlTransaction,\n tpl: AnyRef,\n ephemeral: boolean,\n inputs: Pl.PlRecord,\n outputNames: O[]\n): Record<O, AnyRef> {\n if (outputNames.length === 0) throw new Error('Zero output names provided');\n const rId = ephemeral ? tx.createEphemeral(EphRenderTemplate) : tx.createStruct(RenderTemplate);\n\n const tplField = field(rId, 'template');\n const inputsField = field(rId, 'inputs');\n\n tx.createField(tplField, 'Input', tpl);\n tx.createField(inputsField, 'Input', Pl.createPlMap(tx, inputs, ephemeral));\n tx.lockInputs(rId);\n\n return Pl.futureRecord(tx, rId, outputNames, 'Output', 'outputs/');\n}\n","import {\n AnyRef,\n field,\n PlTransaction,\n ResourceRef,\n ResourceType,\n Pl\n} from '@milaboratories/pl-client';\nimport { randomUUID } from 'node:crypto';\nimport { createRenderTemplate } from './render_template';\n\nexport const BContextEnd: ResourceType = { name: 'BContextEnd', version: '1' };\nexport const BContext: ResourceType = { name: 'BContext', version: '1' };\nexport const BContextId = 'id';\nexport const BContextParent = 'parent';\nexport const BContextMultiParentPrefix = 'parent/';\n\n// TODO: add implementation for dual context heavy block.\n// export type BlockType =\n// | 'LightBlock'\n// | 'HeavyBlock'\n// | 'DualContextHeavyBlock';\n// moved to project model ==>>>\n\nexport type HeavyBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n isProduction: AnyRef;\n context: AnyRef;\n};\n\nexport type HeavyBlockOutputs = {\n context: AnyRef;\n result: AnyRef;\n};\n\nexport const HeavyBlockOutputNames: (keyof HeavyBlockOutputs)[] = ['context', 'result'];\n\nexport function createRenderHeavyBlock(\n tx: PlTransaction,\n tpl: AnyRef,\n inputs: HeavyBlockInputs\n): HeavyBlockOutputs {\n return createRenderTemplate(tx, tpl, true, inputs, HeavyBlockOutputNames);\n}\n\nexport type LightBlockInputs = {\n args: AnyRef;\n blockId: AnyRef;\n stagingContext: AnyRef;\n productionContext: AnyRef;\n};\n\nexport type LightBlockOutput = {\n result: AnyRef;\n};\n\nexport const LightBlockOutputNames: (keyof LightBlockOutput)[] = ['result'];\n\nexport function createRenderLightBlock(\n tx: PlTransaction,\n tpl: ResourceRef,\n inputs: LightBlockInputs\n): LightBlockOutput {\n return createRenderTemplate(tx, tpl, true, inputs, LightBlockOutputNames);\n}\n\nexport function createBContextEnd(tx: PlTransaction): ResourceRef {\n const ctx = tx.createEphemeral(BContextEnd);\n tx.lock(ctx);\n return ctx;\n}\n\nexport function createBContextFromUpstreams(tx: PlTransaction, upstreamCtxs: AnyRef[]): AnyRef {\n if (upstreamCtxs.length === 0) return createBContextEnd(tx);\n\n if (upstreamCtxs.length === 1) return upstreamCtxs[0];\n\n const ctx = tx.createEphemeral(BContext);\n\n // setting id\n tx.createField(field(ctx, BContextId), 'Input', Pl.createPlString(tx, randomUUID()));\n\n // setting parents\n for (let i = 0; i < upstreamCtxs.length; i++)\n tx.createField(field(ctx, `${BContextMultiParentPrefix}${i}`), 'Input', upstreamCtxs[i]);\n\n tx.lock(ctx);\n\n return ctx;\n}\n","import type { AnyRef, AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport type { ExplicitTemplate } from '../../model/template_spec';\nimport type { Hash } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport type {\n TemplateData,\n TemplateLibData,\n TemplateSoftwareData\n} from '@milaboratories/pl-model-backend';\nimport {\n PlTemplateLibV1,\n PlTemplateSoftwareV1,\n PlTemplateV1,\n PlTemplateOverrideV1,\n parseTemplate\n} from '@milaboratories/pl-model-backend';\n\nexport function loadTemplateFromExplicitDirect(tx: PlTransaction, spec: ExplicitTemplate): AnyRef {\n const templateInfo: TemplateData = parseTemplate(spec.content);\n\n const templateFormat = templateInfo.type;\n switch (templateFormat) {\n case 'pl.tengo-template.v2':\n return createTemplateV2Tree(tx, templateInfo);\n default:\n assertNever(templateFormat);\n }\n}\n\ntype Renderer<T> = {\n hash: Hasher<T>;\n render: (resource: T, tx: PlTransaction, creator: Creator) => AnyResourceRef;\n};\ntype Hasher<T> = (resource: T, hash: Hash) => void;\ntype Creator = <T>(resource: T, renderer: Renderer<T>) => AnyResourceRef;\n\nconst LibRenderer: Renderer<TemplateLibData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateLibV1.type.name)\n .update(PlTemplateLibV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n return tx.createValue(\n PlTemplateLibV1.type,\n JSON.stringify(PlTemplateLibV1.fromV2Data(resource).data)\n );\n }\n};\n\nconst SoftwareInfoRenderer: Renderer<TemplateSoftwareData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateSoftwareV1.type.name)\n .update(PlTemplateSoftwareV1.type.version)\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n },\n render(resource, tx, _creator) {\n const sw = PlTemplateSoftwareV1.fromV2Data(resource);\n const ref = tx.createStruct(PlTemplateSoftwareV1.type, sw.data);\n tx.setKValue(ref, PlTemplateSoftwareV1.metaNameKey, JSON.stringify(sw.name));\n tx.lock(ref);\n return ref;\n }\n};\n\nconst HashOverrideRenderer: Renderer<TemplateData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateOverrideV1.type.name)\n .update(PlTemplateOverrideV1.type.version)\n .update(resource.hashOverride ?? '');\n },\n render(resource, tx, _creator) {\n return tx.createStruct(\n PlTemplateOverrideV1.type,\n JSON.stringify(PlTemplateOverrideV1.fromV2Data(resource))\n );\n }\n};\n\nconst TemplateRenderer: Renderer<TemplateData> = {\n hash(resource, hash) {\n hash\n .update(PlTemplateV1.type.name)\n .update(PlTemplateV1.type.version)\n .update(resource.hashOverride ?? '')\n .update(resource.name)\n .update(resource.version)\n .update(resource.src);\n\n const srt = <T>(entries: [string, T][]): [string, T][] => {\n entries.sort((a, b) => (a[0] === b[0] ? 0 : a[0] < b[0] ? -1 : 1));\n return entries;\n };\n\n for (const [libId, lib] of srt(Object.entries(resource.libs ?? {}))) {\n hash.update('lib:' + libId);\n LibRenderer.hash(lib, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.software ?? {}))) {\n hash.update('soft:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [swId, sw] of srt(Object.entries(resource.assets ?? {}))) {\n hash.update('asset:' + swId);\n SoftwareInfoRenderer.hash(sw, hash);\n }\n for (const [tplId, tpl] of srt(Object.entries(resource.templates ?? {}))) {\n hash.update('tpl:' + tplId);\n this.hash(tpl, hash);\n }\n },\n render(resource, tx, _creator) {\n const tplRef = tx.createStruct(\n PlTemplateV1.type,\n JSON.stringify(PlTemplateV1.fromV2Data(resource).data)\n );\n // Render libraries\n for (const [libId, lib] of Object.entries(resource.libs ?? {})) {\n const fld = PlTemplateV1.libField(tplRef, libId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(lib, LibRenderer));\n }\n\n // Render software and assets\n for (const [swId, sw] of Object.entries(resource.software ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n for (const [swId, sw] of Object.entries(resource.assets ?? {})) {\n const fld = PlTemplateV1.swField(tplRef, swId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(sw, SoftwareInfoRenderer));\n }\n\n // Render dependency templates\n for (const [depTplId, depTpl] of Object.entries(resource.templates ?? {})) {\n const fld = PlTemplateV1.tplField(tplRef, depTplId);\n tx.createField(fld, 'Input');\n tx.setField(fld, _creator(depTpl, TemplateRenderer));\n }\n\n tx.lock(tplRef);\n\n if (!resource.hashOverride) return tplRef;\n\n // Override template hash with proxy resource, when hash override is configured for template\n const overrideRef = _creator(resource, HashOverrideRenderer);\n const fld = PlTemplateOverrideV1.tplField(overrideRef);\n tx.createField(fld, 'Service');\n tx.setField(fld, tplRef);\n tx.lock(tplRef);\n return overrideRef;\n }\n};\n\nfunction createTemplateV2Tree(tx: PlTransaction, tplInfo: TemplateData): AnyRef {\n const resourceCache = new Map<string, AnyResourceRef>();\n\n const createResource = <T>(resource: T, renderer: Renderer<T>): AnyResourceRef => {\n const hasher: Hash = createHash('sha256');\n renderer.hash(resource, hasher);\n\n const rKey = hasher.digest('hex');\n if (!resourceCache.has(rKey)) {\n const rId = renderer.render(resource, tx, createResource);\n resourceCache.set(rKey, rId);\n }\n\n return resourceCache.get(rKey)!;\n };\n\n return createResource(tplInfo, TemplateRenderer);\n}\n","import type { AnyRef, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { field, Pl } from '@milaboratories/pl-client';\nimport fs from 'node:fs';\nimport type {\n ExplicitTemplate,\n TemplateFromRegistry,\n TemplateSpecAny,\n TemplateSpecPrepared,\n} from '../../model/template_spec';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { loadTemplateFromExplicitDirect } from './direct_template_loader';\n\n//\n// Resource schema\n//\n\nexport const TengoTemplateGet: ResourceType = { name: 'TengoTemplateGet', version: '1' };\nexport const TengoTemplateGetRegistry = 'registry';\nexport const TengoTemplateGetTemplateURI = 'templateURI';\nexport const TengoTemplateGetTemplate = 'template';\n\nexport const TengoTemplatePack: ResourceType = { name: 'TengoTemplatePack', version: '1' };\nexport const TengoTemplatePackConvert: ResourceType = {\n name: 'TengoTemplatePackConvert',\n version: '1',\n};\nexport const TengoTemplatePackConvertTemplatePack = 'templatePack';\nexport const TengoTemplatePackConvertTemplate = 'template';\n\nexport async function prepareTemplateSpec(tpl: TemplateSpecAny): Promise<TemplateSpecPrepared> {\n switch (tpl.type) {\n case 'from-file':\n return {\n type: 'explicit',\n content: await fs.promises.readFile(tpl.path),\n };\n case 'from-registry':\n case 'explicit':\n return tpl;\n default:\n return assertNever(tpl);\n }\n}\n\nfunction loadTemplateFromRegistry(tx: PlTransaction, spec: TemplateFromRegistry): AnyRef {\n const getTemplate = tx.createStruct(TengoTemplateGet);\n const registry = field(getTemplate, TengoTemplateGetRegistry);\n const uri = field(getTemplate, TengoTemplateGetTemplateURI);\n const templateFromRegistry = field(getTemplate, TengoTemplateGetTemplate);\n\n // Note: it has a resource schema, so platforma creates fields by itself.\n\n tx.setField(registry, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.registry))));\n tx.setField(uri, tx.createValue(Pl.JsonString, Buffer.from(JSON.stringify(spec.path))));\n\n return templateFromRegistry;\n}\n\nfunction loadTemplateFromExplicit(tx: PlTransaction, spec: ExplicitTemplate): AnyRef {\n const templatePack = tx.createValue(TengoTemplatePack, spec.content);\n const templatePackConvert = tx.createStruct(TengoTemplatePackConvert);\n const templatePackField = field(templatePackConvert, TengoTemplatePackConvertTemplatePack);\n const template = field(templatePackConvert, TengoTemplatePackConvertTemplate);\n\n tx.setField(templatePackField, templatePack);\n\n return template;\n}\n\nexport function loadTemplate(tx: PlTransaction, spec: TemplateSpecPrepared): AnyRef {\n switch (spec.type) {\n case 'from-registry':\n return loadTemplateFromRegistry(tx, spec);\n case 'explicit':\n return loadTemplateFromExplicitDirect(tx, spec);\n // return loadTemplateFromExplicit(tx, spec);\n default:\n return assertNever(spec);\n }\n}\n","import { ExplicitTemplate } from './template_spec';\nimport { ResourceType } from '@milaboratories/pl-client';\nimport { BlockConfigContainer } from '@platforma-sdk/model';\nimport { BlockPackSpec } from '@milaboratories/pl-model-middle-layer';\n\nexport type FrontendSpec = FrontendFromUrl | FrontendFromFolder;\n\nexport interface FrontendFromUrlData {\n url: string;\n}\n\nexport const FrontendFromUrlResourceType: ResourceType = { name: 'Frontend/FromUrl', version: '1' };\n\n/** Directs user of the block pack to download the contents from the URL\n * outside the pl infrastructure. */\nexport interface FrontendFromUrl extends FrontendFromUrlData {\n type: 'url';\n}\n\nexport interface FrontendFromFolderData {\n path: string;\n /** HMAC signature of the path using local secret encoded as hex. */\n signature: string;\n}\n\nexport const FrontendFromFolderResourceType: ResourceType = {\n name: 'Frontend/FromFolder',\n version: '1'\n};\n\n/** Directs user of the block pack to load frontend from specific local\n * folder. Signature allows to confirm that this is the same client who\n * added the resource. */\nexport interface FrontendFromFolder extends FrontendFromFolderData {\n type: 'local';\n}\n\n/** Direct instructions to create block-pack from client. Currently, this\n * is the only block-pack spec that can be directly materialized. */\nexport interface BlockPackExplicit {\n type: 'explicit';\n template: ExplicitTemplate;\n config: BlockConfigContainer;\n frontend: FrontendSpec;\n source: BlockPackSpec;\n}\n\n/** Block-pack spec that can be materialized in pl. */\nexport type BlockPackSpecPrepared = BlockPackExplicit;\n\n/** All block-pack specs. */\nexport type BlockPackSpecAny = BlockPackSpecPrepared | BlockPackSpec;\n","import { AnyResourceRef, PlTransaction } from '@milaboratories/pl-client';\nimport {\n FrontendFromFolderData,\n FrontendFromFolderResourceType,\n FrontendFromUrlData,\n FrontendFromUrlResourceType,\n FrontendSpec\n} from '../../model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {\n switch (spec.type) {\n case 'url':\n return tx.createValue(\n FrontendFromUrlResourceType,\n JSON.stringify({ url: spec.url } as FrontendFromUrlData)\n );\n case 'local':\n return tx.createValue(\n FrontendFromFolderResourceType,\n JSON.stringify({\n path: spec.path,\n signature: spec.signature\n } as FrontendFromFolderData)\n );\n default:\n return assertNever(spec);\n }\n}\n","import { AnyResourceRef, field, PlTransaction, ResourceType } from '@milaboratories/pl-client';\nimport { loadTemplate } from '../template/template_loading';\nimport { BlockPackExplicit, BlockPackSpecAny, BlockPackSpecPrepared } from '../../model';\nimport { assertNever, Signer } from '@milaboratories/ts-helpers';\nimport fs from 'node:fs';\nimport { Dispatcher, request } from 'undici';\nimport { createFrontend } from './frontend';\nimport { BlockConfig, BlockConfigContainer } from '@platforma-sdk/model';\nimport { loadPackDescription, RegistryV1 } from '@platforma-sdk/block-tools';\nimport { BlockPackInfo } from '../../model/block_pack';\nimport { resolveDevPacket } from '../../dev_env';\nimport { getDevV2PacketMtime } from '../../block_registry';\nimport { V2RegistryProvider } from '../../block_registry/registry-v2-provider';\n\nexport const BlockPackCustomType: ResourceType = { name: 'BlockPackCustom', version: '1' };\nexport const BlockPackTemplateField = 'template';\nexport const BlockPackFrontendField = 'frontend';\n\n/** Ensure trailing slash */\nfunction tSlash(str: string): string {\n if (str.endsWith('/')) return str;\n else return `${str}/`;\n}\n\nexport class BlockPackPreparer {\n constructor(\n private readonly v2RegistryProvider: V2RegistryProvider,\n private readonly signer: Signer,\n private readonly http?: Dispatcher\n ) {}\n\n public async getBlockConfigContainer(spec: BlockPackSpecAny): Promise<BlockConfigContainer> {\n switch (spec.type) {\n case 'explicit':\n return spec.config;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n const configContent = await fs.promises.readFile(devPaths.config, { encoding: 'utf-8' });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const configContent = await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8'\n });\n return JSON.parse(configContent) as BlockConfigContainer;\n }\n\n case 'from-registry-v1': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const configResponse = await request(`${urlPrefix}/config.json`, httpOptions);\n\n return (await configResponse.body.json()) as BlockConfigContainer;\n }\n\n case 'from-registry-v2': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n return (await (\n await request((components.model as any).url as string, httpOptions)\n ).body.json()) as BlockConfigContainer;\n }\n\n default:\n return assertNever(spec);\n }\n }\n\n public async prepare(spec: BlockPackSpecAny): Promise<BlockPackSpecPrepared> {\n switch (spec.type) {\n case 'explicit':\n return spec;\n\n case 'dev-v1': {\n const devPaths = await resolveDevPacket(spec.folder, false);\n\n // template\n const templateContent = await fs.promises.readFile(devPaths.workflow);\n\n // config\n const config = JSON.parse(\n await fs.promises.readFile(devPaths.config, 'utf-8')\n ) as BlockConfigContainer;\n\n // frontend\n const frontendPath = devPaths.ui;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath)\n },\n source: spec\n };\n }\n\n case 'dev-v2': {\n const description = await loadPackDescription(spec.folder);\n const config = JSON.parse(\n await fs.promises.readFile(description.components.model.file, {\n encoding: 'utf-8'\n })\n ) as BlockConfigContainer;\n const workflowContent = await fs.promises.readFile(\n description.components.workflow.main.file\n );\n const frontendPath = description.components.ui.folder;\n const source = { ...spec };\n if (spec.mtime === undefined)\n // if absent, calculating the mtime here, so the block will correctly show whether it can be updated\n source.mtime = await getDevV2PacketMtime(description);\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: workflowContent\n },\n config,\n frontend: {\n type: 'local',\n path: frontendPath,\n signature: this.signer.sign(frontendPath)\n },\n source\n };\n }\n\n case 'from-registry-v1': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;\n\n const templateUrl = `${urlPrefix}/template.plj.gz`;\n // template\n const templateResponse = await request(templateUrl, httpOptions);\n if (templateResponse.statusCode !== 200)\n throw new Error(\n `Block not found in registry (url = ${templateUrl} ; code = ${templateResponse.statusCode}): ` +\n JSON.stringify(spec)\n );\n const templateContent = new Uint8Array(await templateResponse.body.arrayBuffer());\n\n // config\n const configResponse = await request(`${urlPrefix}/config.json`, httpOptions);\n const config = (await configResponse.body.json()) as BlockConfigContainer;\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: templateContent\n },\n config,\n frontend: {\n type: 'url',\n url: `${urlPrefix}/frontend.tgz`\n },\n source: spec\n };\n }\n\n case 'from-registry-v2': {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n const registry = this.v2RegistryProvider.getRegistry(spec.registryUrl);\n const components = await registry.getComponents(spec.id);\n const getModel = async () =>\n (await (await request((components.model as any).url, httpOptions)).body.json()) as BlockConfigContainer;\n const getWorkflow = async () =>\n await (await request((components.workflow.main as any).url, httpOptions)).body.arrayBuffer();\n\n const [model, workflow] = await Promise.all([getModel(), getWorkflow()]);\n\n return {\n type: 'explicit',\n template: {\n type: 'explicit',\n content: Buffer.from(workflow)\n },\n config: model,\n frontend: {\n type: 'url',\n url: (components.ui as any).url\n },\n source: spec\n };\n }\n\n default:\n return assertNever(spec);\n }\n }\n}\n\nfunction createCustomBlockPack(tx: PlTransaction, spec: BlockPackExplicit): AnyResourceRef {\n const blockPackInfo: BlockPackInfo = { config: spec.config, source: spec.source };\n const bp = tx.createStruct(BlockPackCustomType, JSON.stringify(blockPackInfo));\n tx.createField(field(bp, BlockPackTemplateField), 'Input', loadTemplate(tx, spec.template));\n tx.createField(field(bp, BlockPackFrontendField), 'Input', createFrontend(tx, spec.frontend));\n tx.lock(bp);\n\n return bp;\n}\n\nexport function createBlockPack(tx: PlTransaction, spec: BlockPackSpecPrepared): AnyResourceRef {\n switch (spec.type) {\n case 'explicit':\n return createCustomBlockPack(tx, spec);\n default:\n return assertNever(spec.type);\n }\n}\n","import { assertNever } from '@milaboratories/ts-helpers';\nimport { PlRef } from '@platforma-sdk/model';\n\nexport function outputRef(blockId: string, name: string): PlRef {\n return { __isRef: true, blockId, name };\n}\n\nexport function isBlockOutputReference(obj: any): obj is PlRef {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n obj.__isRef === true &&\n 'blockId' in obj &&\n 'name' in obj\n );\n}\n\nfunction addAllReferencedBlocks(result: BlockUpstreams, node: any, allowed?: Set<string>) {\n const type = typeof node;\n switch (type) {\n case 'function':\n case 'bigint':\n case 'number':\n case 'string':\n case 'boolean':\n case 'symbol':\n case 'undefined':\n return;\n\n case 'object':\n if (node === null) return;\n\n if (isBlockOutputReference(node)) {\n if (allowed === undefined || allowed.has(node.blockId)) result.upstreams.add(node.blockId);\n else result.missingReferences = true;\n } else if (Array.isArray(node)) {\n for (const child of node) addAllReferencedBlocks(result, child, allowed);\n } else {\n for (const [, child] of Object.entries(node as object))\n addAllReferencedBlocks(result, child, allowed);\n }\n\n return;\n\n default:\n assertNever(type);\n }\n}\n\nexport interface BlockUpstreams {\n /** Direct block dependencies */\n upstreams: Set<string>;\n /** True if not-allowed references was encountered */\n missingReferences: boolean;\n}\n\n/** Extracts all resource ids referenced by args object. */\nexport function inferAllReferencedBlocks(args: any, allowed?: Set<string>): BlockUpstreams {\n const result = { upstreams: new Set<string>(), missingReferences: false };\n addAllReferencedBlocks(result, args, allowed);\n return result;\n}\n","import { Block, ProjectStructure } from './project_model';\nimport { Optional, Writable } from 'utility-types';\nimport { inferAllReferencedBlocks } from './args';\n\nexport function allBlocks(structure: ProjectStructure): Iterable<Block> {\n return {\n *[Symbol.iterator]() {\n for (const g of structure.groups) for (const b of g.blocks) yield b;\n }\n };\n}\n\nexport interface BlockGraphNode {\n readonly id: string;\n readonly missingReferences: boolean;\n /** Direct upstreams */\n readonly upstream: Set<string>;\n /** Direct downstreams */\n readonly downstream: Set<string>;\n}\n\nexport class BlockGraph {\n /** Nodes are stored in the map in topological order */\n public readonly nodes: Map<string, BlockGraphNode>;\n\n constructor(nodes: Map<string, BlockGraphNode>) {\n this.nodes = nodes;\n }\n\n public traverseIds(direction: 'upstream' | 'downstream', ...rootBlockIds: string[]): Set<string> {\n const all = new Set<string>();\n this.traverse(direction, rootBlockIds, (node) => all.add(node.id));\n return all;\n }\n\n public traverseIdsExcludingRoots(\n direction: 'upstream' | 'downstream',\n ...rootBlockIds: string[]\n ): Set<string> {\n const result = this.traverseIds(direction, ...rootBlockIds);\n for (const r of rootBlockIds) result.delete(r);\n return result;\n }\n\n public traverse(\n direction: 'upstream' | 'downstream',\n rootBlockIds: string[],\n cb: (node: BlockGraphNode) => void\n ): void {\n let unprocessed = [...rootBlockIds];\n // used to deduplicate possible downstream / upstream blocks and process them only once\n const queued = new Set<string>(unprocessed);\n while (unprocessed.length > 0) {\n let nextUnprocessed: string[] = [];\n for (const blockId of unprocessed) {\n const info = this.nodes.get(blockId)!;\n cb(info);\n info[direction]!.forEach((v) => {\n if (!queued.has(v)) {\n queued.add(v);\n nextUnprocessed.push(v);\n }\n });\n }\n unprocessed = nextUnprocessed;\n }\n }\n}\n\nexport function stagingGraph(structure: ProjectStructure) {\n type WNode = Optional<Writable<BlockGraphNode>, 'upstream' | 'downstream'>;\n const result = new Map<string, WNode>();\n\n // Simple dependency graph from previous to next\n //\n // more complicated patterns to be implemented later\n // (i.e. groups with specific behaviours for total outputs and inputs)\n //\n let previous: WNode | undefined = undefined;\n for (const { id } of allBlocks(structure)) {\n const current: WNode = {\n id: id,\n missingReferences: false\n };\n result.set(id, current);\n if (previous === undefined) {\n current.upstream = new Set<string>();\n } else {\n current.upstream = new Set<string>([previous.id]);\n previous.downstream = new Set<string>([current.id]);\n }\n\n previous = current;\n }\n if (previous !== undefined) previous.downstream = new Set<string>();\n\n return new BlockGraph(result as Map<string, BlockGraphNode>);\n}\n\nexport function productionGraph(\n structure: ProjectStructure,\n argsProvider: (blockId: string) => any | undefined\n): BlockGraph {\n const result = new Map<string, BlockGraphNode>();\n\n // traversing blocks in topological order defined by the project structure\n // and keeping possibleUpstreams set on each step, to consider only\n // those dependencies that are possible under current topology\n const possibleUpstreams = new Set<string>();\n for (const { id } of allBlocks(structure)) {\n const args = argsProvider(id);\n\n // skipping those blocks for which we don't have args\n if (args === undefined) continue;\n\n const upstreams = inferAllReferencedBlocks(args, possibleUpstreams);\n const node: BlockGraphNode = {\n id,\n missingReferences: upstreams.missingReferences,\n upstream: upstreams.upstreams,\n downstream: new Set<string>() // will be populated from downstream blocks\n };\n result.set(id, node);\n upstreams.upstreams.forEach((dep) => result.get(dep)!.downstream.add(id));\n possibleUpstreams.add(id);\n }\n\n return new BlockGraph(result);\n}\n\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const e of a) if (!b.has(e)) return false;\n return true;\n}\n\nfunction intersects<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size > b.size) return intersects(b, a);\n for (const e of a) if (b.has(e)) return true;\n return false;\n}\n\nexport interface GraphDiff {\n onlyInA: Set<string>;\n /** Nodes that changed the list of their upstreams,\n * and all their downstreams */\n different: Set<string>;\n onlyInB: Set<string>;\n}\n\nexport function graphDiff(a: BlockGraph, b: BlockGraph): GraphDiff {\n let matched = 0;\n const onlyInA = new Set<string>();\n const onlyInB = new Set<string>();\n const different = new Set<string>();\n a.nodes.forEach((fromA) => {\n const fromB = b.nodes.get(fromA.id);\n if (fromB === undefined) onlyInA.add(fromA.id);\n else if (!setsEqual(fromA.upstream, fromB.upstream) || intersects(fromA.upstream, different))\n different.add(fromA.id);\n });\n\n b.nodes.forEach((fromB) => {\n if (!a.nodes.has(fromB.id)) onlyInB.add(fromB.id);\n else if (intersects(fromB.upstream, different)) different.add(fromB.id);\n });\n\n return { onlyInA, onlyInB, different };\n}\n","import { AnyRef, PlTransaction } from '@milaboratories/pl-client';\nimport { createRenderTemplate } from './template/render_template';\nimport { prepareTemplateSpec } from './template/template_loading';\nimport { TemplateSpecPrepared } from '../model/template_spec';\nimport { createHash } from 'crypto';\nimport { createRequire } from 'node:module';\n\n// Workaround to prevent bundling of @platforma-sdk/workflow-tengo\n// if bundling happens import.meta.dirname will be transfered as is without transferring corresponding assets\n// Construct like new URL(…, import.meta.url) also does not work properly.\n// const require = createRequire(import.meta.url);\n// const SdkTemplates = require('@platforma-sdk/workflow-tengo').Templates;\n\nimport { Templates as SdkTemplates } from '@platforma-sdk/workflow-tengo';\n\nexport type TemplateEnvelop = { spec: TemplateSpecPrepared; hash: string };\n\nlet preparedTemplateEnvelop: TemplateEnvelop | undefined;\n\nexport async function getPreparedExportTemplateEnvelope(): Promise<TemplateEnvelop> {\n if (preparedTemplateEnvelop === undefined) {\n // (await import('@platforma-sdk/workflow-tengo')).Templates['pframes.export-pframe']\n const preparedTemplate = await prepareTemplateSpec(SdkTemplates['pframes.export-pframe']);\n if (preparedTemplate.type !== 'explicit') throw new Error('Unexpected prepared template type.');\n const hash = createHash('sha256').update(preparedTemplate.content).digest('hex');\n preparedTemplateEnvelop = { spec: preparedTemplate, hash };\n }\n\n return preparedTemplateEnvelop;\n}\n\nexport function exportContext(tx: PlTransaction, exportTpl: AnyRef, ctx: AnyRef) {\n return createRenderTemplate(tx, exportTpl, true, { pf: ctx }, ['result']).result;\n}\n","import {\n AnyRef,\n AnyResourceRef,\n BasicResourceData,\n ensureResourceIdNotNull,\n field,\n isNotNullResourceId,\n isNullResourceId,\n isResource,\n isResourceRef,\n Pl,\n PlClient,\n PlTransaction,\n ResourceId,\n ResourceRef\n} from '@milaboratories/pl-client';\nimport { createRenderHeavyBlock, createBContextFromUpstreams } from './template/render_block';\nimport {\n Block,\n BlockRenderingStateKey,\n ProjectStructure,\n ProjectStructureKey,\n parseProjectField,\n ProjectField,\n projectFieldName,\n ProjectRenderingState,\n SchemaVersionCurrent,\n SchemaVersionKey,\n ProjectResourceType,\n InitialBlockStructure,\n InitialProjectRenderingState,\n ProjectMetaKey,\n InitialBlockMeta,\n parseBlockFrontendStateKey,\n blockFrontendStateKey,\n blockArgsAuthorKey,\n ProjectLastModifiedTimestamp,\n ProjectCreatedTimestamp,\n ProjectStructureAuthorKey,\n getServiceTemplateField\n} from '../model/project_model';\nimport { BlockPackTemplateField, createBlockPack } from './block-pack/block_pack';\nimport {\n allBlocks,\n BlockGraph,\n graphDiff,\n productionGraph,\n stagingGraph\n} from '../model/project_model_util';\nimport { BlockPackSpecPrepared } from '../model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport {\n AuthorMarker,\n BlockSettings,\n InitialBlockSettings,\n ProjectMeta\n} from '@milaboratories/pl-model-middle-layer';\nimport Denque from 'denque';\nimport { exportContext, getPreparedExportTemplateEnvelope } from './context_export';\nimport { loadTemplate } from './template/template_loading';\n\ntype FieldStatus = 'NotReady' | 'Ready' | 'Error';\n\ninterface BlockFieldState {\n modCount: number;\n ref?: AnyRef;\n status?: FieldStatus;\n value?: Uint8Array;\n}\n\ntype BlockFieldStates = Partial<Record<ProjectField['fieldName'], BlockFieldState>>;\ntype BlockFieldStateValue = Omit<BlockFieldState, 'modCount'>;\n\ninterface BlockInfoState {\n readonly id: string;\n readonly fields: BlockFieldStates;\n}\n\nfunction cached<ModId, T>(modIdCb: () => ModId, valueCb: () => T): () => T {\n let initialized = false;\n let lastModId: ModId | undefined = undefined;\n let value: T | undefined = undefined;\n return () => {\n if (!initialized) {\n initialized = true;\n lastModId = modIdCb();\n value = valueCb();\n return value as T;\n }\n const currentModId = modIdCb();\n if (lastModId !== currentModId) {\n lastModId = currentModId;\n value = valueCb();\n }\n return valueCb() as T;\n };\n}\n\nclass BlockInfo {\n constructor(\n public readonly id: string,\n public readonly fields: BlockFieldStates\n ) {}\n\n public check() {\n // state assertions\n\n if ((this.fields.prodOutput === undefined) !== (this.fields.prodCtx === undefined))\n throw new Error('inconsistent prod fields');\n\n if ((this.fields.stagingOutput === undefined) !== (this.fields.stagingCtx === undefined))\n throw new Error('inconsistent stage fields');\n\n if (\n (this.fields.prodOutputPrevious === undefined) !==\n (this.fields.prodCtxPrevious === undefined)\n )\n throw new Error('inconsistent prod cache fields');\n\n if (\n (this.fields.stagingOutputPrevious === undefined) !==\n (this.fields.stagingCtxPrevious === undefined)\n )\n throw new Error('inconsistent stage cache fields');\n\n if (this.fields.blockPack === undefined) throw new Error('no block pack field');\n\n if (this.fields.currentArgs === undefined) throw new Error('no current args field');\n }\n\n private readonly currentInputsC = cached(\n () => this.fields.currentArgs!.modCount,\n () => JSON.parse(Buffer.from(this.fields.currentArgs!.value!).toString())\n );\n private readonly actualProductionInputsC = cached(\n () => this.fields.prodArgs?.modCount,\n () => {\n const bin = this.fields.prodArgs?.value;\n if (bin === undefined) return undefined;\n return JSON.parse(Buffer.from(bin).toString());\n }\n );\n\n get currentInputs(): any {\n return this.currentInputsC();\n }\n\n get stagingRendered(): boolean {\n return this.fields.stagingCtx !== undefined;\n }\n\n get productionRendered(): boolean {\n return this.fields.prodCtx !== undefined;\n }\n\n get productionHasErrors(): boolean {\n return this.fields.prodUiCtx?.status === 'Error';\n }\n\n private readonly productionStaleC: () => boolean = cached(\n () => `${this.fields.currentArgs!.modCount}_${this.fields.prodArgs?.modCount}`,\n () =>\n this.fields.prodArgs === undefined ||\n Buffer.compare(this.fields.currentArgs!.value!, this.fields.prodArgs.value!) !== 0\n );\n\n // get productionStale(): boolean {\n // return this.productionRendered && this.productionStaleC() && ;\n // }\n\n get requireProductionRendering(): boolean {\n return !this.productionRendered || this.productionStaleC() || this.productionHasErrors;\n }\n\n get actualProductionInputs(): any | undefined {\n return this.actualProductionInputsC();\n }\n\n public getTemplate(tx: PlTransaction): AnyRef {\n return tx.getFutureFieldValue(\n Pl.unwrapHolder(tx, this.fields.blockPack!.ref!),\n BlockPackTemplateField,\n 'Input'\n );\n }\n}\n\nexport interface NewBlockSpec {\n blockPack: BlockPackSpecPrepared;\n args: string;\n uiState: string;\n}\n\nconst NoNewBlocks = (blockId: string) => {\n throw new Error(`No new block info for ${blockId}`);\n};\n\nexport interface SetArgsRequest {\n blockId: string;\n args: string;\n}\n\ntype GraphInfoFields =\n | 'stagingUpstream'\n | 'stagingDownstream'\n | 'futureProductionUpstream'\n | 'futureProductionDownstream'\n | 'actualProductionUpstream'\n | 'actualProductionDownstream';\n\nexport class ProjectMutator {\n private globalModCount = 0;\n private fieldsChanged: boolean = false;\n\n //\n // Change trackers\n //\n\n private lastModifiedChanged = false;\n private structureChanged = false;\n private metaChanged = false;\n private renderingStateChanged = false;\n private readonly changedBlockFrontendStates = new Set<string>();\n\n /** Set blocks will be assigned current mutator author marker on save */\n private readonly blocksWithChangedInputs = new Set<string>();\n\n constructor(\n public readonly rid: ResourceId,\n private readonly tx: PlTransaction,\n private readonly author: AuthorMarker | undefined,\n private readonly schema: string,\n private lastModified: number,\n private meta: ProjectMeta,\n private struct: ProjectStructure,\n private readonly renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>,\n private readonly blocksInLimbo: Set<string>,\n private readonly blockInfos: Map<string, BlockInfo>,\n private readonly blockFrontendStates: Map<string, string>,\n private readonly ctxExportTplHolder: AnyResourceRef\n ) {}\n\n private fixProblemsAndMigrate() {\n // Fixing problems introduced by old code\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodArgs === undefined ||\n blockInfo.fields.prodOutput === undefined ||\n blockInfo.fields.prodCtx === undefined\n )\n this.deleteBlockFields(blockInfo.id, 'prodArgs', 'prodOutput', 'prodCtx');\n });\n\n // Migration for addition of block settings field\n let initialBlockSettings: Omit<BlockFieldState, 'modCount'> | undefined;\n this.blockInfos.forEach((blockInfo) => {\n if (blockInfo.fields.blockSettings === undefined) {\n if (initialBlockSettings === undefined)\n initialBlockSettings = this.createJsonFieldValue(InitialBlockSettings);\n this.setBlockFieldObj(blockInfo.id, 'blockSettings', initialBlockSettings);\n }\n });\n }\n\n get wasModified(): boolean {\n return (\n this.lastModifiedChanged ||\n this.structureChanged ||\n this.fieldsChanged ||\n this.metaChanged ||\n this.renderingStateChanged ||\n this.changedBlockFrontendStates.size > 0\n );\n }\n\n get structure(): ProjectStructure {\n // clone\n return JSON.parse(JSON.stringify(this.struct));\n }\n\n //\n // Graph calculation\n //\n\n private stagingGraph: BlockGraph | undefined = undefined;\n private pendingProductionGraph: BlockGraph | undefined = undefined;\n private actualProductionGraph: BlockGraph | undefined = undefined;\n\n private getStagingGraph(): BlockGraph {\n if (this.stagingGraph === undefined) this.stagingGraph = stagingGraph(this.struct);\n return this.stagingGraph;\n }\n\n private getPendingProductionGraph(): BlockGraph {\n if (this.pendingProductionGraph === undefined)\n this.pendingProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getBlockInfo(blockId).currentInputs\n );\n return this.pendingProductionGraph;\n }\n\n private getActualProductionGraph(): BlockGraph {\n if (this.actualProductionGraph === undefined)\n this.actualProductionGraph = productionGraph(\n this.struct,\n (blockId) => this.getBlockInfo(blockId).actualProductionInputs\n );\n return this.actualProductionGraph;\n }\n\n //\n // Generic helpers to interact with project state\n //\n\n private getBlockInfo(blockId: string): BlockInfo {\n const info = this.blockInfos.get(blockId);\n if (info === undefined) throw new Error(`No such block: ${blockId}`);\n return info;\n }\n\n private createJsonFieldValueByContent(content: string): BlockFieldStateValue {\n const value = Buffer.from(content);\n const ref = this.tx.createValue(Pl.JsonObject, value);\n return { ref, value, status: 'Ready' };\n }\n\n private createJsonFieldValue(obj: unknown): BlockFieldStateValue {\n return this.createJsonFieldValueByContent(JSON.stringify(obj));\n }\n\n private getBlock(blockId: string): Block {\n for (const block of allBlocks(this.struct)) if (block.id === blockId) return block;\n throw new Error('block not found');\n }\n\n private setBlockFieldObj(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n state: BlockFieldStateValue\n ) {\n const fid = field(this.rid, projectFieldName(blockId, fieldName));\n\n if (state.ref === undefined) throw new Error(\"Can't set value with empty ref\");\n\n if (this.getBlockInfo(blockId).fields[fieldName] === undefined)\n this.tx.createField(fid, 'Dynamic', state.ref);\n else this.tx.setField(fid, state.ref);\n\n this.getBlockInfo(blockId).fields[fieldName] = {\n modCount: this.globalModCount++,\n ...state\n };\n\n this.fieldsChanged = true;\n }\n\n private setBlockField(\n blockId: string,\n fieldName: keyof BlockFieldStates,\n ref: AnyRef,\n status: FieldStatus,\n value?: Uint8Array\n ) {\n this.setBlockFieldObj(blockId, fieldName, { ref, status, value });\n }\n\n private deleteBlockFields(blockId: string, ...fieldNames: (keyof BlockFieldStates)[]): boolean {\n let deleted = false;\n const info = this.getBlockInfo(blockId);\n for (const fieldName of fieldNames) {\n const fields = info.fields;\n if (!(fieldName in fields)) continue;\n this.tx.removeField(field(this.rid, projectFieldName(blockId, fieldName)));\n delete fields[fieldName];\n this.fieldsChanged = true;\n deleted = true;\n }\n return deleted;\n }\n\n private updateLastModified() {\n this.lastModified = Date.now();\n this.lastModifiedChanged = true;\n }\n\n //\n // Main project actions\n //\n\n private resetStagingRefreshTimestamp() {\n this.renderingState.stagingRefreshTimestamp = Date.now();\n this.renderingStateChanged = true;\n }\n\n private resetStaging(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.stagingOutput?.status === 'Ready' &&\n fields.stagingCtx?.status === 'Ready' &&\n fields.stagingUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'stagingOutputPrevious', fields.stagingOutput);\n this.setBlockFieldObj(blockId, 'stagingCtxPrevious', fields.stagingCtx);\n this.setBlockFieldObj(blockId, 'stagingUiCtxPrevious', fields.stagingUiCtx);\n }\n if (this.deleteBlockFields(blockId, 'stagingOutput', 'stagingCtx', 'stagingUiCtx'))\n this.resetStagingRefreshTimestamp();\n }\n\n private resetProduction(blockId: string): void {\n const fields = this.getBlockInfo(blockId).fields;\n if (\n fields.prodOutput?.status === 'Ready' &&\n fields.prodCtx?.status === 'Ready' &&\n fields.prodUiCtx?.status === 'Ready'\n ) {\n this.setBlockFieldObj(blockId, 'prodOutputPrevious', fields.prodOutput);\n this.setBlockFieldObj(blockId, 'prodCtxPrevious', fields.prodCtx);\n this.setBlockFieldObj(blockId, 'prodUiCtxPrevious', fields.prodUiCtx);\n }\n this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');\n }\n\n /** Running blocks are reset, already computed moved to limbo. Returns if\n * either of the actions were actually performed. */\n private resetOrLimboProduction(blockId: string): boolean {\n const fields = this.getBlockInfo(blockId).fields;\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready') {\n if (this.blocksInLimbo.has(blockId))\n // we are already in limbo\n return false;\n\n // limbo\n this.blocksInLimbo.add(blockId);\n this.renderingStateChanged = true;\n\n // doing some gc\n this.deleteBlockFields(blockId, 'prodOutputPrevious', 'prodCtxPrevious', 'prodUiCtxPrevious');\n\n return true;\n }\n // reset\n else return this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs');\n }\n\n /** Optimally sets inputs for multiple blocks in one go */\n public setArgs(requests: SetArgsRequest[]) {\n const changed: string[] = [];\n for (const { blockId, args } of requests) {\n const info = this.getBlockInfo(blockId);\n JSON.parse(args); // checking\n const binary = Buffer.from(args);\n if (Buffer.compare(info.fields.currentArgs!.value!, binary) === 0) continue;\n const argsRef = this.tx.createValue(Pl.JsonObject, binary);\n this.setBlockField(blockId, 'currentArgs', argsRef, 'Ready', binary);\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(blockId);\n changed.push(blockId);\n }\n\n // resetting staging outputs for all downstream blocks\n this.getStagingGraph().traverse('downstream', changed, ({ id }) => this.resetStaging(id));\n\n if (changed.length > 0) this.updateLastModified();\n }\n\n public setUiState(blockId: string, newState: string | undefined): void {\n if (this.blockInfos.get(blockId) === undefined) throw new Error('no such block');\n if (this.blockFrontendStates.get(blockId) === newState) return;\n if (newState === undefined) this.blockFrontendStates.delete(blockId);\n else this.blockFrontendStates.set(blockId, newState);\n this.changedBlockFrontendStates.add(blockId);\n // will be assigned our author marker\n this.blocksWithChangedInputs.add(blockId);\n this.updateLastModified();\n }\n\n public setBlockSettings(blockId: string, newValue: BlockSettings): void {\n this.setBlockFieldObj(blockId, 'blockSettings', this.createJsonFieldValue(newValue));\n this.updateLastModified();\n }\n\n /** Update block label */\n // public setBlockLabel(blockId: string, label: string): void {\n // const newStructure = this.structure;\n // let ok = false;\n // for (const block of allBlocks(newStructure))\n // if (block.id === blockId) {\n // block.label = label;\n // ok = true;\n // break;\n // }\n // if (!ok) throw new Error(`block ${blockId} not found`);\n // this.updateStructure(newStructure);\n // this.updateLastModified();\n // }\n\n private createCtx(upstream: Set<string>, ctxField: 'stagingCtx' | 'prodCtx'): AnyRef {\n const upstreamContexts: AnyRef[] = [];\n upstream.forEach((id) => {\n const info = this.getBlockInfo(id);\n if (info.fields[ctxField] === undefined || info.fields[ctxField]!.ref === undefined)\n throw new Error('One of the upstreams staging is not rendered.');\n upstreamContexts.push(Pl.unwrapHolder(this.tx, info.fields[ctxField]!.ref!));\n });\n return createBContextFromUpstreams(this.tx, upstreamContexts);\n }\n\n private exportCtx(ctx: AnyRef): AnyRef {\n return exportContext(this.tx, Pl.unwrapHolder(this.tx, this.ctxExportTplHolder), ctx);\n }\n\n private renderStagingFor(blockId: string) {\n this.resetStaging(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createCtx(this.getStagingGraph().nodes.get(blockId)!.upstream, 'stagingCtx');\n\n if (this.getBlock(blockId).renderingMode !== 'Heavy') throw new Error('not supported yet');\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(false)),\n context: ctx\n });\n\n this.setBlockField(\n blockId,\n 'stagingCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady'\n );\n\n this.setBlockField(blockId, 'stagingUiCtx', this.exportCtx(results.context), 'NotReady');\n\n this.setBlockField(blockId, 'stagingOutput', results.result, 'NotReady');\n }\n\n private renderProductionFor(blockId: string) {\n this.resetProduction(blockId);\n\n const info = this.getBlockInfo(blockId);\n\n const ctx = this.createCtx(\n this.getPendingProductionGraph().nodes.get(blockId)!.upstream,\n 'prodCtx'\n );\n\n if (this.getBlock(blockId).renderingMode === 'Light')\n throw new Error(\"Can't render production for light block.\");\n\n const tpl = info.getTemplate(this.tx);\n\n const results = createRenderHeavyBlock(this.tx, tpl, {\n args: info.fields.currentArgs!.ref!,\n blockId: this.tx.createValue(Pl.JsonString, JSON.stringify(blockId)),\n isProduction: this.tx.createValue(Pl.JsonBool, JSON.stringify(true)),\n context: ctx\n });\n this.setBlockField(\n blockId,\n 'prodCtx',\n Pl.wrapInEphHolder(this.tx, results.context),\n 'NotReady'\n );\n this.setBlockField(blockId, 'prodUiCtx', this.exportCtx(results.context), 'NotReady');\n this.setBlockField(blockId, 'prodOutput', results.result, 'NotReady');\n\n // saving inputs for which we rendered the production\n this.setBlockFieldObj(blockId, 'prodArgs', info.fields.currentArgs!);\n\n // removing block from limbo as we juts rendered fresh production for it\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n }\n\n //\n // Structure changes\n //\n\n /** Very generic method, better check for more specialized case-specific methods first. */\n public updateStructure(\n newStructure: ProjectStructure,\n newBlockSpecProvider: (blockId: string) => NewBlockSpec = NoNewBlocks\n ): void {\n const currentStagingGraph = this.getStagingGraph();\n const currentActualProductionGraph = this.getActualProductionGraph();\n\n const newStagingGraph = stagingGraph(newStructure);\n\n // new actual production graph without new blocks\n const newActualProductionGraph = productionGraph(\n newStructure,\n (blockId) => this.blockInfos.get(blockId)?.actualProductionInputs\n );\n\n const stagingDiff = graphDiff(currentStagingGraph, newStagingGraph);\n const prodDiff = graphDiff(currentActualProductionGraph, newActualProductionGraph);\n\n // removing blocks\n for (const blockId of stagingDiff.onlyInA) {\n const { fields } = this.getBlockInfo(blockId);\n this.deleteBlockFields(blockId, ...(Object.keys(fields) as ProjectField['fieldName'][]));\n this.blockInfos.delete(blockId);\n if (this.blocksInLimbo.delete(blockId)) this.renderingStateChanged = true;\n if (this.blockFrontendStates.delete(blockId)) this.changedBlockFrontendStates.add(blockId);\n }\n\n // creating new blocks\n for (const blockId of stagingDiff.onlyInB) {\n const info = new BlockInfo(blockId, {});\n this.blockInfos.set(blockId, info);\n const spec = newBlockSpecProvider(blockId);\n\n // block pack\n const bp = createBlockPack(this.tx, spec.blockPack);\n this.setBlockField(blockId, 'blockPack', Pl.wrapInHolder(this.tx, bp), 'NotReady');\n\n // settings\n this.setBlockFieldObj(\n blockId,\n 'blockSettings',\n this.createJsonFieldValue(InitialBlockSettings)\n );\n\n // args\n this.setBlockFieldObj(blockId, 'currentArgs', this.createJsonFieldValueByContent(spec.args));\n\n // uiState\n if (spec.uiState /* this check is for compatibility with old configs */) {\n this.blockFrontendStates.set(blockId, spec.uiState);\n this.changedBlockFrontendStates.add(blockId);\n }\n\n // checking structure\n info.check();\n }\n\n // resetting stagings affected by topology change\n for (const blockId of stagingDiff.different) this.resetStaging(blockId);\n\n // applying changes due to topology change in production to affected nodes and\n // all their downstreams\n currentActualProductionGraph.traverse('downstream', [...prodDiff.different], (node) => {\n this.resetOrLimboProduction(node.id);\n });\n\n if (\n stagingDiff.onlyInB.size > 0 ||\n stagingDiff.onlyInA.size > 0 ||\n stagingDiff.different.size > 0\n )\n this.resetStagingRefreshTimestamp();\n\n this.struct = newStructure;\n this.structureChanged = true;\n this.stagingGraph = undefined;\n this.pendingProductionGraph = undefined;\n this.actualProductionGraph = undefined;\n\n this.updateLastModified();\n }\n\n //\n // Structure change helpers\n //\n\n public addBlock(block: Block, spec: NewBlockSpec, before?: string): void {\n const newStruct = this.structure; // copy current structure\n if (before === undefined) {\n // adding as a very last block\n newStruct.groups[newStruct.groups.length - 1].blocks.push(block);\n } else {\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === before);\n if (idx < 0) continue;\n group.blocks.splice(idx, 0, block);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${before}`);\n }\n this.updateStructure(newStruct, (blockId) => {\n if (blockId !== block.id) throw new Error('Unexpected');\n return spec;\n });\n }\n\n public deleteBlock(blockId: string): void {\n const newStruct = this.structure; // copy current structure\n let done = false;\n for (const group of newStruct.groups) {\n const idx = group.blocks.findIndex((b) => b.id === blockId);\n if (idx < 0) continue;\n group.blocks.splice(idx, 1);\n done = true;\n break;\n }\n if (!done) throw new Error(`Can't find element with id: ${blockId}`);\n this.updateStructure(newStruct);\n }\n\n //\n // Block-pack migration\n //\n\n public migrateBlockPack(blockId: string, spec: BlockPackSpecPrepared, newArgs?: string): void {\n const info = this.getBlockInfo(blockId);\n\n this.setBlockField(\n blockId,\n 'blockPack',\n Pl.wrapInHolder(this.tx, createBlockPack(this.tx, spec)),\n 'NotReady'\n );\n\n if (newArgs !== undefined) {\n // this will also reset all downstream stagings\n this.setArgs([{ blockId, args: newArgs }]);\n // reset UI state along with args\n this.setUiState(blockId, undefined);\n }\n // resetting staging outputs for all downstream blocks\n else\n this.getStagingGraph().traverse('downstream', [blockId], ({ id }) => this.resetStaging(id));\n\n // also reset or limbo all downstream productions\n if (info.productionRendered)\n this.getActualProductionGraph().traverse('downstream', [blockId], ({ id }) =>\n this.resetOrLimboProduction(id)\n );\n\n this.updateLastModified();\n }\n\n //\n // Render\n //\n\n public renderProduction(blockIds: string[], addUpstreams: boolean = false): Set<string> {\n const blockIdsSet = new Set(blockIds);\n\n const prodGraph = this.getPendingProductionGraph();\n if (addUpstreams)\n // adding all upstreams automatically\n prodGraph.traverse('upstream', blockIds, (node) => {\n blockIdsSet.add(node.id);\n });\n // checking that targets contain all upstreams\n else\n for (const blockId of blockIdsSet) {\n const node = prodGraph.nodes.get(blockId);\n if (node === undefined) throw new Error(`Can't find block with id: ${blockId}`);\n for (const upstream of node.upstream)\n if (!blockIdsSet.has(upstream))\n throw new Error(\"Can't render blocks not including all upstreams.\");\n }\n\n // traversing in topological order and rendering target blocks\n const rendered = new Set<string>();\n for (const block of allBlocks(this.structure)) {\n if (!blockIdsSet.has(block.id)) continue;\n\n let render =\n this.getBlockInfo(block.id).requireProductionRendering || this.blocksInLimbo.has(block.id);\n\n if (!render)\n for (const upstream of prodGraph.nodes.get(block.id)!.upstream)\n if (rendered.has(upstream)) {\n render = true;\n break;\n }\n\n if (render) {\n this.renderProductionFor(block.id);\n rendered.add(block.id);\n }\n }\n\n // sending to limbo all downstream blocks\n prodGraph.traverse('downstream', [...rendered], (node) => {\n if (rendered.has(node.id))\n // don't send to limbo blocks that were just rendered\n return;\n this.resetOrLimboProduction(node.id);\n });\n\n if (rendered.size > 0) this.updateLastModified();\n\n return rendered;\n }\n\n /** Stops running blocks from the list and modify states of other blocks\n * accordingly */\n public stopProduction(...blockIds: string[]) {\n const activeProdGraph = this.getActualProductionGraph();\n\n // we will stop all blocks listed in request and all their downstreams\n const queue = new Denque(blockIds);\n const queued = new Set(blockIds);\n const stopped: string[] = [];\n\n while (!queue.isEmpty()) {\n const blockId = queue.shift()!;\n const fields = this.getBlockInfo(blockId).fields;\n\n if (fields.prodOutput?.status === 'Ready' && fields.prodCtx?.status === 'Ready')\n // skipping finished blocks\n continue;\n\n if (this.deleteBlockFields(blockId, 'prodOutput', 'prodCtx', 'prodUiCtx', 'prodArgs')) {\n // was actually stopped\n stopped.push(blockId);\n\n // will try to stop all its downstreams\n for (const downstream of activeProdGraph.traverseIdsExcludingRoots('downstream', blockId)) {\n if (queued.has(downstream)) continue;\n queue.push(downstream);\n queued.add(downstream);\n }\n }\n }\n\n // blocks under stopped blocks, but still having results, goes to limbo\n for (const blockId of activeProdGraph.traverseIdsExcludingRoots('downstream', ...stopped))\n this.resetOrLimboProduction(blockId);\n }\n\n private traverseWithStagingLag(cb: (blockId: string, lag: number) => void) {\n const lags = new Map<string, number>();\n const stagingGraph = this.getStagingGraph();\n stagingGraph.nodes.forEach((node) => {\n const info = this.getBlockInfo(node.id);\n let lag = info.stagingRendered ? 0 : 1;\n node.upstream.forEach((upstream) => {\n const upstreamLag = lags.get(upstream)!;\n if (upstreamLag === 0) return;\n lag = Math.max(upstreamLag + 1, lag);\n });\n cb(node.id, lag);\n lags.set(node.id, lag);\n });\n }\n\n /** @param stagingRenderingRate rate in blocks per second */\n private refreshStagings(stagingRenderingRate?: number) {\n const elapsed = Date.now() - this.renderingState.stagingRefreshTimestamp;\n const lagThreshold =\n stagingRenderingRate === undefined\n ? undefined\n : 1 + Math.max(0, (elapsed * stagingRenderingRate) / 1000);\n let rendered = 0;\n this.traverseWithStagingLag((blockId, lag) => {\n if (lag === 0)\n // meaning staging already rendered\n return;\n if (lagThreshold === undefined || lag <= lagThreshold) {\n this.renderStagingFor(blockId);\n rendered++;\n }\n });\n if (rendered > 0) this.resetStagingRefreshTimestamp();\n }\n\n //\n // Meta\n //\n\n /** Updates project metadata */\n public setMeta(meta: ProjectMeta): void {\n this.meta = meta;\n this.metaChanged = true;\n this.updateLastModified();\n }\n\n //\n // Maintenance\n //\n\n /** @param stagingRenderingRate rate in blocks per second */\n public doRefresh(stagingRenderingRate?: number) {\n this.refreshStagings(stagingRenderingRate);\n this.blockInfos.forEach((blockInfo) => {\n if (\n blockInfo.fields.prodCtx?.status === 'Ready' &&\n blockInfo.fields.prodOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'prodOutputPrevious',\n 'prodCtxPrevious',\n 'prodUiCtxPrevious'\n );\n if (\n blockInfo.fields.stagingCtx?.status === 'Ready' &&\n blockInfo.fields.stagingOutput?.status === 'Ready'\n )\n this.deleteBlockFields(\n blockInfo.id,\n 'stagingOutputPrevious',\n 'stagingCtxPrevious',\n 'stagingUiCtxPrevious'\n );\n });\n }\n\n private assignAuthorMarkers() {\n const markerStr = this.author ? JSON.stringify(this.author) : undefined;\n\n for (const blockId of this.blocksWithChangedInputs)\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, blockArgsAuthorKey(blockId));\n else this.tx.setKValue(this.rid, blockArgsAuthorKey(blockId), markerStr);\n\n if (this.metaChanged || this.structureChanged) {\n if (markerStr === undefined) this.tx.deleteKValue(this.rid, ProjectStructureAuthorKey);\n else this.tx.setKValue(this.rid, ProjectStructureAuthorKey, markerStr);\n }\n }\n\n public save() {\n if (!this.wasModified) return;\n\n if (this.lastModifiedChanged)\n this.tx.setKValue(this.rid, ProjectLastModifiedTimestamp, JSON.stringify(this.lastModified));\n\n if (this.structureChanged)\n this.tx.setKValue(this.rid, ProjectStructureKey, JSON.stringify(this.struct));\n\n if (this.renderingStateChanged)\n this.tx.setKValue(\n this.rid,\n BlockRenderingStateKey,\n JSON.stringify({\n ...this.renderingState,\n blocksInLimbo: [...this.blocksInLimbo]\n } as ProjectRenderingState)\n );\n\n if (this.metaChanged) this.tx.setKValue(this.rid, ProjectMetaKey, JSON.stringify(this.meta));\n\n for (const blockId of this.changedBlockFrontendStates) {\n const uiState = this.blockFrontendStates.get(blockId);\n if (uiState === undefined) this.tx.deleteKValue(this.rid, blockFrontendStateKey(blockId));\n else this.tx.setKValue(this.rid, blockFrontendStateKey(blockId), uiState);\n }\n\n this.assignAuthorMarkers();\n }\n\n public static async load(\n tx: PlTransaction,\n rid: ResourceId,\n author?: AuthorMarker\n ): Promise<ProjectMutator> {\n const fullResourceStateP = tx.getResourceData(rid, true);\n const schemaP = tx.getKValueJson<string>(rid, SchemaVersionKey);\n const lastModifiedP = tx.getKValueJson<number>(rid, ProjectLastModifiedTimestamp);\n const metaP = tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey);\n const structureP = tx.getKValueJson<ProjectStructure>(rid, ProjectStructureKey);\n const renderingStateP = tx.getKValueJson<ProjectRenderingState>(rid, BlockRenderingStateKey);\n\n const allKVP = tx.listKeyValuesString(rid);\n\n // loading jsons\n const [\n fullResourceState,\n schema,\n lastModified,\n meta,\n structure,\n { stagingRefreshTimestamp, blocksInLimbo },\n allKV\n ] = await Promise.all([\n fullResourceStateP,\n schemaP,\n lastModifiedP,\n metaP,\n structureP,\n renderingStateP,\n allKVP\n ]);\n if (schema !== SchemaVersionCurrent)\n throw new Error(\n `Can't act on this project resource because it has a wrong schema version: ${schema}`\n );\n\n // loading field information\n const blockInfoStates = new Map<string, BlockInfoState>();\n for (const f of fullResourceState.fields) {\n const projectField = parseProjectField(f.name);\n\n // processing only fields with known structure\n if (projectField === undefined) continue;\n\n let info = blockInfoStates.get(projectField.blockId);\n if (info === undefined) {\n info = {\n id: projectField.blockId,\n fields: {}\n };\n blockInfoStates.set(projectField.blockId, info);\n }\n\n info.fields[projectField.fieldName] = isNullResourceId(f.value)\n ? { modCount: 0 }\n : { modCount: 0, ref: f.value };\n }\n\n // loading ctx export template to check if we already have cached materialized template in our project\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n\n // expected field name\n const ctxExportTplCacheFieldName = getServiceTemplateField(ctxExportTplEnvelope.hash);\n const ctxExportTplField = fullResourceState.fields.find(\n (f) => f.name === ctxExportTplCacheFieldName\n );\n let ctxExportTplHolder: AnyResourceRef;\n if (ctxExportTplField !== undefined)\n ctxExportTplHolder = ensureResourceIdNotNull(ctxExportTplField.value);\n else {\n ctxExportTplHolder = Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec));\n tx.createField(\n field(rid, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n ctxExportTplHolder\n );\n }\n\n const renderingState = { stagingRefreshTimestamp };\n const blocksInLimboSet = new Set(blocksInLimbo);\n\n const blockFrontendStates = new Map<string, string>();\n for (const kv of allKV) {\n const blockId = parseBlockFrontendStateKey(kv.key);\n if (blockId === undefined) continue;\n blockFrontendStates.set(blockId, kv.value);\n }\n\n const requests: [BlockFieldState, Promise<BasicResourceData>][] = [];\n blockInfoStates!.forEach(({ id, fields }) => {\n for (const [, state] of Object.entries(fields)) {\n if (state.ref === undefined) continue;\n if (!isResource(state.ref) || isResourceRef(state.ref))\n throw new Error('unexpected behaviour');\n requests.push([state, tx.getResourceData(state.ref, false)]);\n }\n });\n for (const [state, response] of requests) {\n const result = await response;\n state.value = result.data;\n if (isNotNullResourceId(result.error)) state.status = 'Error';\n else if (result.resourceReady || isNotNullResourceId(result.originalResourceId))\n state.status = 'Ready';\n else state.status = 'NotReady';\n }\n\n const blockInfos = new Map<string, BlockInfo>();\n blockInfoStates.forEach(({ id, fields }) => blockInfos.set(id, new BlockInfo(id, fields)));\n\n // check consistency of project state\n const blockInStruct = new Set<string>();\n for (const b of allBlocks(structure)) {\n if (!blockInfos.has(b.id))\n throw new Error(`Inconsistent project structure: no inputs for ${b.id}`);\n blockInStruct.add(b.id);\n }\n blockInfos.forEach((info) => {\n if (!blockInStruct.has(info.id))\n throw new Error(`Inconsistent project structure: no structure entry for ${info.id}`);\n // checking structure\n info.check();\n });\n\n const prj = new ProjectMutator(\n rid,\n tx,\n author,\n schema,\n lastModified,\n meta,\n structure,\n renderingState,\n blocksInLimboSet,\n blockInfos,\n blockFrontendStates,\n ctxExportTplHolder\n );\n\n prj.fixProblemsAndMigrate();\n\n return prj;\n }\n}\n\nexport interface ProjectState {\n schema: string;\n structure: ProjectStructure;\n renderingState: Omit<ProjectRenderingState, 'blocksInLimbo'>;\n blocksInLimbo: Set<string>;\n blockInfos: Map<string, BlockInfo>;\n}\n\nexport async function createProject(\n tx: PlTransaction,\n meta: ProjectMeta = InitialBlockMeta\n): Promise<AnyResourceRef> {\n const prj = tx.createEphemeral(ProjectResourceType);\n tx.lock(prj);\n const ts = String(Date.now());\n tx.setKValue(prj, SchemaVersionKey, JSON.stringify(SchemaVersionCurrent));\n tx.setKValue(prj, ProjectCreatedTimestamp, ts);\n tx.setKValue(prj, ProjectLastModifiedTimestamp, ts);\n tx.setKValue(prj, ProjectMetaKey, JSON.stringify(meta));\n tx.setKValue(prj, ProjectStructureKey, JSON.stringify(InitialBlockStructure));\n tx.setKValue(prj, BlockRenderingStateKey, JSON.stringify(InitialProjectRenderingState));\n const ctxExportTplEnvelope = await getPreparedExportTemplateEnvelope();\n tx.createField(\n field(prj, getServiceTemplateField(ctxExportTplEnvelope.hash)),\n 'Dynamic',\n Pl.wrapInHolder(tx, loadTemplate(tx, ctxExportTplEnvelope.spec))\n );\n return prj;\n}\n\nexport async function withProject<T>(\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n cb: (p: ProjectMutator) => T | Promise<T>\n): Promise<T> {\n return withProjectAuthored(txOrPl, rid, undefined, cb);\n}\n\nexport async function withProjectAuthored<T>(\n txOrPl: PlTransaction | PlClient,\n rid: ResourceId,\n author: AuthorMarker | undefined,\n cb: (p: ProjectMutator) => T | Promise<T>\n): Promise<T> {\n if (txOrPl instanceof PlClient) {\n return await txOrPl.withWriteTx('ProjectAction', async (tx) => {\n const mut = await ProjectMutator.load(tx, rid, author);\n const result = await cb(mut);\n if (!mut.wasModified)\n // skipping save and commit altogether if no modifications were\n // actually made\n return result;\n mut.save();\n await tx.commit();\n return result;\n });\n } else {\n const mut = await ProjectMutator.load(txOrPl, rid, author);\n const result = await cb(mut);\n mut.save();\n return result;\n }\n}\n","import type { PColumnSpec, PColumnValues, PlRef, PObjectId, PObjectSpec } from '@platforma-sdk/model';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport {\n isNullResourceId,\n resourceType,\n resourceTypeToString,\n resourceTypesEqual,\n} from '@milaboratories/pl-client';\nimport type { Writable } from 'utility-types';\nimport { createHash } from 'node:crypto';\n\nexport function* allBlobs<B>(data: PFrameInternal.DataInfo<B>): Generator<B> {\n switch (data.type) {\n case 'Json':\n return;\n case 'JsonPartitioned':\n for (const [, blob] of Object.entries(data.parts)) yield blob;\n return;\n case 'BinaryPartitioned':\n for (const [, { index, values }] of Object.entries(data.parts)) {\n yield index;\n yield values;\n }\n return;\n default:\n assertNever(data);\n }\n}\n\nfunction mapValues<T extends object, TResult>(\n obj: T,\n callback: (v: T[keyof T], key: keyof T) => TResult,\n): { [K in keyof T]: TResult } {\n return Object.fromEntries(\n (Object.entries(obj) as { [K in keyof T]: [K, T[K]]; }[keyof T][])\n .map(([key, value]) => [key, callback(value, key)]),\n ) as { [K in keyof T]: TResult };\n}\n\nexport function mapBlobs<B1, B2>(\n data: PFrameInternal.DataInfo<B1>,\n mapping: (blob: B1) => B2,\n): PFrameInternal.DataInfo<B2> {\n switch (data.type) {\n case 'Json':\n return { ...data };\n case 'JsonPartitioned':\n return { ...data, parts: mapValues(data.parts, mapping) };\n case 'BinaryPartitioned':\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: mapping(v.index),\n values: mapping(v.values),\n })),\n };\n default:\n assertNever(data);\n }\n}\n\nexport const PColumnDataJsonPartitioned = resourceType('PColumnData/JsonPartitioned', '1');\nexport const PColumnDataJsonSuperPartitioned = resourceType(\n 'PColumnData/Partitioned/JsonPartitioned',\n '1',\n);\nexport const PColumnDataBinaryPartitioned = resourceType('PColumnData/BinaryPartitioned', '1');\nexport const PColumnDataBinarySuperPartitioned = resourceType(\n 'PColumnData/Partitioned/BinaryPartitioned',\n '1',\n);\nexport const PColumnDataJson = resourceType('PColumnData/Json', '1');\n\nexport type PColumnDataJsonResourceValue = {\n keyLength: number;\n data: Record<string, PFrameInternal.JsonDataValue>;\n};\n\nexport type PColumnDataPartitionedResourceValue = {\n partitionKeyLength: number;\n};\n\nexport type PColumnDataSuperPartitionedResourceValue = {\n superPartitionKeyLength: number;\n partitionKeyLength: number;\n};\n\nexport function parseDataInfoResource(\n data: PlTreeNodeAccessor,\n): PFrameInternal.DataInfo<ResourceInfo> {\n if (!data.getIsReadyOrError()) throw new Error('Data not ready.');\n\n const resourceData = data.getDataAsJson();\n if (resourceData === undefined)\n throw new Error('unexpected data info structure, no resource data');\n\n if (resourceTypesEqual(data.resourceType, PColumnDataJson)) {\n const dataContent = resourceData as PColumnDataJsonResourceValue;\n\n return {\n type: 'Json',\n keyLength: dataContent.keyLength,\n data: dataContent.data,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts = Object.fromEntries(\n data\n .listInputFields()\n .map((field) => [field, data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo]),\n );\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonSuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<string, ResourceInfo> = {};\n for (const superKey of data.listInputFields()) {\n const superPart = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superPart.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const key of keys) {\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],\n ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);\n parts[partKey] = superPart.traverse({ field: key, errorIfFieldNotSet: true }).resourceInfo;\n }\n }\n\n return {\n type: 'JsonPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinaryPartitioned)) {\n const meta = resourceData as PColumnDataPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<PFrameInternal.BinaryChunkInfo<ResourceInfo>>>\n > = {};\n\n // parsing the structure\n for (const field of data.listInputFields()) {\n if (field.endsWith('.index')) {\n const partKey = field.slice(0, field.length - 6);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.index = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const partKey = field.slice(0, field.length - 7);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n part.values = data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n\n // structure validation\n for (const [key, part] of Object.entries(parts)) {\n if (part.index === undefined) throw new Error(`no index for part ${key}`);\n if (part.values === undefined) throw new Error(`no values for part ${key}`);\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.partitionKeyLength,\n parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>,\n };\n } else if (resourceTypesEqual(data.resourceType, PColumnDataBinarySuperPartitioned)) {\n const meta = resourceData as PColumnDataSuperPartitionedResourceValue;\n\n const parts: Record<\n string,\n Partial<Writable<PFrameInternal.BinaryChunkInfo<ResourceInfo>>>\n > = {};\n for (const superKey of data.listInputFields()) {\n const superData = data.traverse({ field: superKey, errorIfFieldNotSet: true });\n const keys = superData.listInputFields();\n if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);\n\n for (const field of keys) {\n if (field.endsWith('.index')) {\n const key = field.slice(0, field.length - 6);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],\n ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].index = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else if (field.endsWith('.values')) {\n const key = field.slice(0, field.length - 7);\n\n const partKey = JSON.stringify([\n ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],\n ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);\n let part = parts[partKey];\n if (part === undefined) {\n part = {};\n parts[partKey] = part;\n }\n parts[partKey].values = superData.traverse({\n field,\n errorIfFieldNotSet: true,\n }).resourceInfo;\n } else throw new Error(`unrecognized part field name: ${field}`);\n }\n }\n\n return {\n type: 'BinaryPartitioned',\n partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,\n parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>,\n };\n }\n\n throw new Error(`unsupported resource type: ${resourceTypeToString(data.resourceType)}`);\n}\n\nexport function makeDataInfoResource(\n spec: PColumnSpec,\n data: PColumnValues,\n): PFrameInternal.DataInfo<ResourceInfo> {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PFrameInternal.JsonDataValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength)\n throw new Error(`inline column key length ${key.length} differs from axes count ${keyLength}`);\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: 'Json',\n keyLength,\n data: jsonData,\n };\n}\n\nexport function deriveLegacyPObjectId(spec: PObjectSpec, data: PlTreeNodeAccessor): PObjectId {\n const hash = createHash('sha256');\n hash.update(canonicalize(spec)!);\n hash.update(String(!isNullResourceId(data.originalId) ? data.originalId : data.id));\n return hash.digest().toString('hex') as PObjectId;\n}\n\nexport function deriveGlobalPObjectId(blockId: string, exportName: string): PObjectId {\n return canonicalize({ __isRef: true, blockId, name: exportName } satisfies PlRef)! as PObjectId;\n}\n\nexport function deriveLocalPObjectId(resolvePath: string[], outputName: string): PObjectId {\n return canonicalize({ resolvePath, name: outputName })! as PObjectId;\n}\n","import { PlError, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { PObject, PObjectId, PObjectSpec, ValueOrError } from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport assert from 'assert';\nimport { Writable } from 'utility-types';\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from './data';\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, string> | undefined;\n}\n\nconst BContextValuePrefix = 'values/';\nconst BContextValueSpecSuffix = '.spec';\nconst BContextValueDataSuffix = '.data';\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = ''\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as 'spec' | 'data';\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case 'spec':\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors\n })\n ?.getDataAsJson();\n break;\n case 'data':\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors\n });\n default:\n // other value types planned\n continue;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = '',\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error('resource is not ready');\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw new PlError(data.error);\n collection[outputName] = {\n id: resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value\n };\n }\n return collection;\n}\n","import { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError,\n executePSpecPredicate,\n mapValueInVOE\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { outputRef } from '../model/args';\nimport {\n Block,\n ProjectStructure,\n ProjectStructureKey,\n projectFieldName\n} from '../model/project_model';\nimport { allBlocks, stagingGraph } from '../model/project_model_util';\nimport { Optional } from 'utility-types';\nimport { deriveGlobalPObjectId } from './data';\nimport {\n RawPObjectCollection,\n RawPObjectEntry,\n parseRawPObjectCollection\n} from './p_object_collection';\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, 'blockId' | 'name'>;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n if (block.staging === undefined) this.ctx.markUnstable(`staging_not_rendered:${blockId}`);\n else if (!block.staging.locked) this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string\n ): ValueOrError<PObject<PlTreeNodeAccessor>, string> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName);\n let data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result!.spec!,\n data: value\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value\n }\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, string>>, 'id'>\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, string>>, 'id'>\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data\n }\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec\n });\n exportsProcessed.add(exportName);\n }\n } else markUnstable(`staging_not_rendered:${blockId}`); // because staging will be inevitably rendered soon\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n const ret: ExtendedOption[] = [];\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + ' / ' + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds('upstream', rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'prodCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'prodUiCtx'),\n stableIfNotFound: true\n })\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, 'stagingCtx'),\n ignoreError: true,\n pureFieldErrorToUndefined: true\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, 'stagingUiCtx')\n })\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, string> | undefined\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n","import { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry, PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { Optional } from 'utility-types';\nimport {\n Block,\n ProjectStructure,\n ProjectStructureKey,\n blockFrontendStateKey,\n projectFieldName\n} from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { ResultPool } from '../pool/result_pool';\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly uiState: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n};\n\nexport type BlockContextAny = Optional<BlockContextFull, 'prod' | 'staging' | 'getResultsPool'>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) =>\n notEmpty(\n cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'currentArgs'),\n errorIfFieldNotSet: true\n })\n .getDataAsString()\n );\n const activeArgs = (cCtx: ComputableCtx) =>\n cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, 'prodArgs'),\n stableIfNotFound: true\n })\n ?.getDataAsString();\n const uiState = (cCtx: ComputableCtx) =>\n cCtx.accessor(projectEntry).node().getKeyValueAsString(blockFrontendStateKey(blockId));\n return {\n blockId,\n args,\n activeArgs,\n uiState,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n }\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'prodOutput'),\n stableIfNotFound: true,\n ignoreError: true\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, 'stagingOutput'),\n ignoreError: true\n })\n ?.persist();\n if (result === undefined) cCtx.markUnstable('staging_not_rendered');\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId)\n };\n}\n","import { Cfg } from '@platforma-sdk/model';\nimport { assertNever } from '@milaboratories/ts-helpers';\n\nexport function* traverseCfg(cfg: Cfg, guide?: (cfg: Cfg) => boolean): Generator<Cfg> {\n yield cfg;\n if (guide !== undefined && !guide(cfg)) return;\n switch (cfg.type) {\n case 'GetFromCtx':\n case 'Immediate':\n return;\n case 'Isolate':\n yield* traverseCfg(cfg.cfg);\n return;\n case 'MakeObject':\n for (const [, child] of Object.entries(cfg.template)) yield* traverseCfg(child);\n return;\n case 'MakeArray':\n for (const child of cfg.template) yield* traverseCfg(child);\n return;\n case 'GetJsonField':\n case 'GetResourceField':\n yield* traverseCfg(cfg.source);\n yield* traverseCfg(cfg.field);\n return;\n case 'MapRecordValues':\n case 'MapArrayValues':\n case 'MapResourceFields':\n yield* traverseCfg(cfg.source);\n yield* traverseCfg(cfg.mapping);\n return;\n case 'Flatten':\n case 'GetResourceValueAsJson':\n case 'GetBlobContent':\n case 'ExtractArchiveAndGetURL':\n case 'GetBlobContentAsString':\n case 'GetBlobContentAsJson':\n case 'GetDownloadedBlobContent':\n case 'GetOnDemandBlobContent':\n case 'GetImportProgress':\n case 'GetLastLogs':\n case 'GetProgressLog':\n case 'GetProgressLogWithInfo':\n case 'GetLogHandle':\n yield* traverseCfg(cfg.source);\n return;\n case 'IsEmpty':\n yield* traverseCfg(cfg.arg);\n return;\n case 'Not':\n yield* traverseCfg(cfg.operand);\n return;\n case 'And':\n case 'Or':\n yield* traverseCfg(cfg.operand1);\n yield* traverseCfg(cfg.operand2);\n return;\n default:\n assertNever(cfg);\n }\n}\n","import { Cfg } from '@platforma-sdk/model';\nimport { traverseCfg } from './traverse';\n\nexport function mapRecord<T1, T2, Key extends string>(\n obj: Record<Key, T1>,\n mapper: (value: T1) => T2\n): Record<Key, T2> {\n const result = {} as Record<Key, T2>;\n for (const [key, value] of Object.entries(obj)) result[key as Key] = mapper(value as T1);\n return result;\n}\n\nexport function ifNotUndef<T, R>(value: T | undefined, cb: (value: T) => R): R | undefined {\n return value === undefined ? undefined : cb(value);\n}\n\nfunction isActiveCfg(cfg: Cfg): boolean {\n switch (cfg.type) {\n case 'GetImportProgress':\n return true;\n default:\n return false;\n }\n}\n\nexport function hasActiveCfgComponents(cfg: Cfg): boolean {\n for (const nested of traverseCfg(cfg)) if (isActiveCfg(nested)) return true;\n return false;\n}\n","import {\n ArchiveFormat,\n Cfg,\n CfgMapArrayValues,\n CfgMapRecordValues,\n CfgMapResourceFields\n} from '@platforma-sdk/model';\nimport { ArgumentRequests, Operation, OperationAction, Subroutine } from './operation';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { mapRecord } from './util';\nimport { computableFromCfgUnsafe } from './executor';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { Computable } from '@milaboratories/computable';\n\nfunction res(result: unknown): OperationAction {\n return {\n type: 'ReturnResult',\n result: result\n };\n}\n\nexport function resOp(result: unknown): Operation {\n return () => res(result);\n}\n\n//\n// Subroutines\n//\n\nconst SRMakeObject: Subroutine = (args) => {\n const result: Record<string | symbol, any> = {};\n for (const [k, v] of Object.entries(args)) result[k] = v;\n return resOp(result);\n};\n\nconst SRFlatten: Subroutine = (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n const result: unknown[] = [];\n for (const nested of source) {\n if (nested instanceof Array) result.push(...nested);\n else result.push(nested);\n }\n return resOp(result);\n};\n\nconst SRGetResourceField: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return ({ cCtx }) => {\n return res(cCtx.accessor(source).node().traverse(field)?.persist());\n };\n};\n\nfunction mapArrayToRecord<T, R>(elements: T[], cb: (e: T) => R): Record<string, R> {\n const result: Record<string, R> = {};\n const length = elements.length;\n for (let i = 0; i < length; i++) result[String(i)] = cb(elements[i]);\n return result;\n}\n\nfunction SRMapArrayValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapArrayValues, 'itVar' | 'mapping'>\n): Subroutine {\n return (args) => {\n const source = args.source as unknown[] | undefined;\n if (source === undefined) return resOp(undefined);\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(source.length),\n args: mapArrayToRecord(source, (e) => renderCfg({ ...ctx, [ops.itVar]: e }, ops.mapping))\n });\n };\n}\n\nfunction SRCollectArrayFromArgs(length: number): Subroutine {\n return (args) => {\n const result: unknown[] = [];\n for (let i = 0; i < length; i++) result.push(args[String(i)]);\n return resOp(result);\n };\n}\n\nfunction SRMapRecordValues1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapRecordValues, 'itVar' | 'mapping'>\n): Subroutine {\n return (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n if (source === undefined) return resOp(undefined);\n const nextArgs: ArgumentRequests = {};\n for (const [k, v] of Object.entries(source)) {\n const newCtx = { ...ctx, [ops.itVar]: v };\n nextArgs[k] = renderCfg(newCtx, ops.mapping);\n }\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues2,\n args: nextArgs\n });\n };\n}\n\nconst SRMapRecordValues2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRIsEmpty: Subroutine = (args) => {\n const arg = args.arg as unknown[] | string | undefined;\n if (arg === undefined) return resOp(undefined);\n return resOp(arg.length === 0);\n};\n\nconst SRNot: Subroutine = (args) => {\n const operand = args.operand as boolean | undefined;\n if (operand === undefined) return resOp(undefined);\n return resOp(!operand);\n};\n\nconst SRAnd: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 && operand2);\n};\n\nconst SROr: Subroutine = (args) => {\n const operand1 = args.operand1 as boolean | undefined;\n const operand2 = args.operand2 as boolean | undefined;\n if (operand1 === undefined || operand2 === undefined) return resOp(undefined);\n return resOp(operand1 || operand2);\n};\n\nconst SRResourceValueAsJson: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n return ({ cCtx }) => res(cCtx.accessor(source).node()?.getDataAsJson());\n};\n\nconst SRGetJsonField: Subroutine = (args) => {\n const source = args.source as Record<string, unknown> | undefined;\n const field = args.field as string | undefined;\n if (source === undefined || field === undefined) return resOp(undefined);\n return resOp(source[field]);\n};\n\nfunction SRMapResourceFields1(\n ctx: Record<string, unknown>,\n ops: Pick<CfgMapResourceFields, 'itVar' | 'mapping'>\n): Subroutine {\n return (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx }) => {\n const node = cCtx.accessor(source).node();\n\n const nextArgs: ArgumentRequests = {};\n for (const fieldName of node.listInputFields()) {\n const res = node.traverse(fieldName);\n if (res === undefined) nextArgs[fieldName] = resOp(undefined);\n else {\n const newCtx = { ...ctx, [ops.itVar]: res.persist() };\n nextArgs[fieldName] = renderCfg(newCtx, ops.mapping);\n }\n }\n\n return {\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields2,\n args: nextArgs\n };\n };\n };\n}\n\nconst SRMapResourceFields2: Subroutine = (args) => {\n return resOp(args);\n};\n\nconst SRGetBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (ctx) => {\n return drivers.blobDriver.getDownloadedBlob(ctx.accessor(source).node().resourceInfo);\n },\n {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return await drivers.blobDriver.getContent(value.handle);\n }\n }\n )\n };\n };\n};\n\nconst SRGetBlobContentAsString: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ cCtx, drivers }) => {\n // getting target resource id and type\n const resourceInfo = cCtx.accessor(source).node().resourceInfo;\n\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(() => drivers.blobDriver.getDownloadedBlob(resourceInfo), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle);\n return content.toString();\n }\n })\n };\n };\n};\n\nconst SRGetBlobContentAsJson: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: Computable.make(\n (c) => drivers.blobDriver.getDownloadedBlob(c.accessor(source).node().resourceInfo),\n {\n postprocessValue: async (value) => {\n if (value == undefined) return undefined;\n const content = await drivers.blobDriver.getContent(value.handle);\n if (content == undefined) return undefined;\n return JSON.parse(Buffer.from(content).toString());\n }\n }\n )\n };\n };\n};\n\nconst SRGetDownloadedBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobDriver.getDownloadedBlob(source)\n };\n };\n};\n\nconst SRGetOnDemandBlobContent: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobDriver.getOnDemandBlob(source)\n };\n };\n};\n\nconst SRExtractArchiveAndGetURL: (format: ArchiveFormat) => Subroutine = (format) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.blobToURLDriver.extractArchiveAndGetURL(source, format)\n };\n };\n};\n\nconst SRGetImportProgress: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.uploadDriver.getProgressId(source)\n };\n };\n};\n\nconst SRGetLastLogs: (lines: number) => Subroutine = (lines) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLastLogs(source, lines)\n };\n };\n};\n\nconst SRGetProgressLog: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLog(source, patternToSearch)\n };\n };\n};\n\nconst SRGetProgressLogWithInfo: (patternToSearch: string) => Subroutine = (patternToSearch) => (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getProgressLogWithInfo(source, patternToSearch)\n };\n };\n};\n\nconst SRGetLogHandle: Subroutine = (args) => {\n const source = args.source as PlTreeEntry | undefined;\n if (source === undefined) return resOp(undefined);\n\n return ({ drivers }) => {\n return {\n type: 'ScheduleComputable',\n computable: drivers.logDriver.getLogHandle(source)\n };\n };\n};\n\n/** Renders configuration into executor's Operation */\nexport function renderCfg(ctx: Record<string, unknown>, cfg: Cfg): Operation {\n switch (cfg.type) {\n case 'GetFromCtx':\n const ctxValue = ctx[cfg.variable];\n if (typeof ctxValue === 'function') return (e) => res(ctxValue(e.cCtx));\n else return resOp(ctxValue);\n\n case 'Isolate':\n return ({ drivers }) => ({\n type: 'ScheduleComputable',\n computable: computableFromCfgUnsafe(drivers, ctx, cfg.cfg)\n });\n\n case 'Immediate':\n return resOp(cfg.value);\n\n case 'GetJsonField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetJsonField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field)\n }\n });\n\n case 'MapArrayValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapArrayValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'MapRecordValues':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapRecordValues1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'MakeObject':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMakeObject,\n args: mapRecord(cfg.template, (c) => renderCfg(ctx, c))\n });\n\n case 'MakeArray':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRCollectArrayFromArgs(cfg.template.length),\n args: mapArrayToRecord(cfg.template, (e) => renderCfg(ctx, e))\n });\n\n case 'Flatten':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRFlatten,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'IsEmpty':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRIsEmpty,\n args: {\n arg: renderCfg(ctx, cfg.arg)\n }\n });\n\n case 'Not':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRNot,\n args: {\n operand: renderCfg(ctx, cfg.operand)\n }\n });\n\n case 'And':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRAnd,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2)\n }\n });\n\n case 'Or':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SROr,\n args: {\n operand1: renderCfg(ctx, cfg.operand1),\n operand2: renderCfg(ctx, cfg.operand2)\n }\n });\n\n case 'MapResourceFields':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRMapResourceFields1(ctx, cfg),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetResourceField':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetResourceField,\n args: {\n source: renderCfg(ctx, cfg.source),\n field: renderCfg(ctx, cfg.field)\n }\n });\n\n case 'GetResourceValueAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRResourceValueAsJson,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContentAsString':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsString,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetBlobContentAsJson':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetBlobContentAsJson,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetDownloadedBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetDownloadedBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetOnDemandBlobContent':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetOnDemandBlobContent,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'ExtractArchiveAndGetURL':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRExtractArchiveAndGetURL(cfg.format),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetImportProgress':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetImportProgress,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetLastLogs':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLastLogs(cfg.lines),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetProgressLog':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLog(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetProgressLogWithInfo':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetProgressLogWithInfo(cfg.patternToSearch),\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n case 'GetLogHandle':\n return () => ({\n type: 'ScheduleSubroutine',\n subroutine: SRGetLogHandle,\n args: {\n source: renderCfg(ctx, cfg.source)\n }\n });\n\n default:\n return assertNever(cfg);\n }\n}\n","import { ComputableCtx } from '@milaboratories/computable';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { PlResourceEntry, StdCtx } from '@platforma-sdk/model';\nimport { BlockContextAny } from './block_ctx';\n\ntype SC = StdCtx<unknown, unknown>;\ntype SCAO = Pick<SC, '$blockId' | '$ui' | '$args'>;\nexport type MatStdCtxArgsOnly = {\n [Var in keyof SCAO]: SCAO[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SCAO[Var];\n};\nexport type MatStdCtx = {\n [Var in keyof SC]: SC[Var] extends PlResourceEntry\n ? PlTreeEntry | ((cCtx: ComputableCtx) => PlTreeEntry | undefined) | undefined\n : SC[Var];\n};\n\nexport const NonKeyCtxFields = ['$prod', '$staging'];\n\nexport function toCfgContext(ctx: BlockContextAny): MatStdCtx {\n return {\n $blockId: ctx.blockId,\n $args: (cCtx: ComputableCtx) => JSON.parse(ctx.args(cCtx)),\n $ui: (cCtx: ComputableCtx) => {\n const uiState = ctx.uiState(cCtx);\n return uiState !== undefined ? JSON.parse(uiState) : undefined;\n },\n $prod: ctx.prod,\n $staging: ctx.staging\n };\n}\n","import {\n ArgumentKey,\n ArgumentValues,\n ExecutionEnvironment,\n Operation,\n Subroutine\n} from './operation';\nimport Denque from 'denque';\nimport { assertNever, notEmpty } from '@milaboratories/ts-helpers';\nimport { Computable, ComputableCtx, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Cfg } from '@platforma-sdk/model';\nimport { renderCfg, resOp } from './renderer';\nimport canonicalize from 'canonicalize';\nimport { BlockContextAny } from '../middle_layer/block_ctx';\nimport { MiddleLayerDriverKit } from '../middle_layer/driver_kit';\nimport { NonKeyCtxFields, toCfgContext } from '../middle_layer/block_ctx_unsafe';\n\n/** Addresses pending subroutines inside the stack */\ntype SubroutineKey = symbol;\n\n/** Represents destination of the result of an operation. I.e. when sequence of\n * subroutine invocations, and computables terminates with result, this object\n * determines to which argument of which pending subroutine it should be delivered.\n * See special value for delivery of the final \"return\" result. */\ntype Destination = {\n op: SubroutineKey;\n arg: ArgumentKey;\n};\n\n/** Special address of operation, see below. */\nconst ReturnOpKey: unique symbol = Symbol();\n/** The same, but for the argument part of destination, see below. */\nconst ReturnArgKey = 'return';\n\n/** Special destination, telling the executor that corresponding result should\n * be exposed as a final result, and execution terminate at this point. */\nconst ReturnDestination = { op: ReturnOpKey, arg: ReturnArgKey } as Destination;\n\nfunction isReturnDestination(destination: Destination): Boolean {\n return destination.op == ReturnOpKey && destination.arg == ReturnArgKey;\n}\n\n/** Queued operation, used inside the executor */\ntype QueuedOperation = {\n operation: Operation;\n destination: Destination;\n};\n\n/** Queued computation, returned by the first round of config execution. Such\n * computables should be returned in the intermediate representation of the\n * enclosing computable, and after they are resolved and passed to the\n * postprocessing routine, should be injected into the execution stack to\n * finalize the computation. */\ntype ScheduledComputable = {\n destination: Destination;\n computable: Computable<unknown>;\n};\n\n/** This is what ScheduledComputable transforms from intermediate\n * representation to post-processing. */\ntype MaterializedComputable = {\n destination: Destination;\n computable: unknown;\n};\n\n/** Main entry inside the execution stack. */\ntype PendingSubroutine = {\n subroutine: Subroutine;\n destination: Destination;\n argCounter: number;\n args: ArgumentValues;\n};\n\n/** Execution stack. The closest concept that this object along with enclosed\n * {@link PendingSubroutine}s represent is a Continuation.\n * https://en.wikipedia.org/wiki/Continuation */\ntype ExecutionStack = {\n result?: unknown;\n pendingSubroutines: Map<SubroutineKey, PendingSubroutine>;\n};\n\n/** Returns initial stack value. */\nfunction zeroStack(): ExecutionStack {\n return { pendingSubroutines: new Map<SubroutineKey, PendingSubroutine>() };\n}\n\n/** Implements main executor mechanism.\n * @param env to be passed to while executing operations\n * @param stack execution stack to continue execution from\n * @param operations operations to initiate the execution process\n * @param allowComputables if false, scheduling of async computables will result in error\n * */\nfunction execute(\n env: ExecutionEnvironment,\n stack: ExecutionStack,\n operations: QueuedOperation[],\n allowComputables: boolean\n): ScheduledComputable[] {\n const operationQueue = new Denque<QueuedOperation>(operations);\n\n /** Returns false if final result is set as result of this operation,\n * true if we should continue processing. */\n const deliverResult = (destination: Destination, result: unknown): boolean => {\n if (isReturnDestination(destination)) {\n stack.result = result;\n return false;\n }\n\n const pending = notEmpty(stack.pendingSubroutines.get(destination.op));\n if (destination.arg in pending.args) throw new Error('argument already set');\n pending.args[destination.arg] = result;\n pending.argCounter--;\n if (pending.argCounter === 0) {\n stack.pendingSubroutines.delete(destination.op);\n operationQueue.push({\n destination: pending.destination,\n operation: pending.subroutine(pending.args)\n });\n }\n\n return true;\n };\n\n // computables, scheduled during computation, are aggregated in this array,\n // and returned from the function in the end\n const computables: ScheduledComputable[] = [];\n\n // each loop = execution of a single queued operation\n mainLoop: while (operationQueue.length > 0) {\n const op = operationQueue.shift()!;\n const action = op.operation(env);\n switch (action.type) {\n case 'ReturnResult':\n if (!deliverResult(op.destination, action.result)) break mainLoop; // this terminates execution\n break; // switch\n\n case 'ScheduleSubroutine':\n const newOpKey = Symbol();\n\n const argRequests = Object.entries(action.args);\n const initialArgCounter = argRequests.length;\n\n if (initialArgCounter === 0)\n // if no pending arguments\n operationQueue.push({\n destination: op.destination,\n operation: action.subroutine({})\n });\n else {\n for (const [arg, operation] of argRequests)\n operationQueue.push({\n destination: { op: newOpKey, arg },\n operation\n });\n\n stack.pendingSubroutines.set(newOpKey, {\n argCounter: initialArgCounter,\n args: {},\n subroutine: action.subroutine,\n destination: op.destination\n });\n }\n\n break;\n\n case 'ScheduleComputable':\n if (!allowComputables)\n throw new Error('asynchronous operations are forbidden in this context');\n computables.push({\n destination: op.destination,\n computable: action.computable\n });\n break;\n\n default:\n assertNever(action);\n }\n }\n\n return computables;\n}\n\n//\n// Computable\n//\n\n/** Main method to render configurations */\nexport function computableFromCfg(\n drivers: MiddleLayerDriverKit,\n bCtx: BlockContextAny,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n return computableFromCfgUnsafe(drivers, toCfgContext(bCtx), cfg, ops);\n}\n\nexport function computableFromCfgUnsafe(\n drivers: MiddleLayerDriverKit,\n ctx: Record<string, unknown>,\n cfg: Cfg,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n const key =\n `${ctx.blockId}#` +\n canonicalize({\n ctx: Object.fromEntries(\n Object.entries(ctx).filter(([k]) => NonKeyCtxFields.indexOf(k) === -1)\n ),\n cfg: cfg\n })!;\n return Computable.makeRaw(\n (c) => {\n const env: ExecutionEnvironment = { drivers, cCtx: c };\n const stack = zeroStack();\n const computables = execute(\n env,\n stack,\n [\n {\n destination: ReturnDestination,\n operation: renderCfg(ctx, cfg)\n }\n ],\n true\n );\n return {\n ir: computables,\n async postprocessValue(value: MaterializedComputable[]): Promise<unknown> {\n const resolvedOps: QueuedOperation[] = [];\n for (const mc of value)\n resolvedOps.push({ destination: mc.destination, operation: resOp(mc.computable) });\n const postEnv: ExecutionEnvironment = {\n drivers,\n get cCtx(): ComputableCtx {\n throw new Error('asynchronous operations are forbidden in this context');\n }\n };\n\n // Post process can be called several times, that's why it must be a side-effect-free function.\n // But `execute` modifies a stack, so we have to defensively copy it here.\n const copyOfPendingSubrotines = new Map<SubroutineKey, PendingSubroutine>();\n for (const [key, value] of stack.pendingSubroutines)\n copyOfPendingSubrotines.set(key, { ...value, args: { ...value.args } });\n const copiedStack: ExecutionStack = {\n result: stack.result,\n pendingSubroutines: copyOfPendingSubrotines\n };\n execute(postEnv, copiedStack, resolvedOps, false);\n if (!('result' in copiedStack))\n throw new Error('illegal cfg rendering stack state, no result');\n return copiedStack.result;\n }\n };\n },\n { ...ops, key }\n );\n}\n","import type { ComputableCtx } from '@milaboratories/computable';\nimport { Computable } from '@milaboratories/computable';\nimport type { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type {\n ArchiveFormat,\n CommonFieldTraverseOps as CommonFieldTraverseOpsFromSDK,\n FieldTraversalStep as FieldTraversalStepFromSDK,\n Option,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n ProgressLogWithInfo,\n PSpecPredicate,\n PTableDef,\n PTableHandle,\n ResourceType as ResourceTypeFromSDK,\n ResultCollection,\n ValueOrError\n} from '@platforma-sdk/model';\nimport {\n JsRenderInternal,\n mapPObjectData,\n mapPTableDef,\n mapValueInVOE\n} from '@platforma-sdk/model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { randomUUID } from 'node:crypto';\nimport type { QuickJSContext, QuickJSHandle, VmFunctionImplementation } from 'quickjs-emscripten';\nimport { Scope } from 'quickjs-emscripten';\nimport type { Optional } from 'utility-types';\nimport type { BlockContextAny } from '../middle_layer/block_ctx';\nimport type { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport type { Block } from '../model/project_model';\nimport { parseFinalPObjectCollection } from '../pool/p_object_collection';\nimport type { ResultPool } from '../pool/result_pool';\n\nfunction isArrayBufferOrView(obj: unknown): obj is ArrayBufferLike {\n return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);\n}\n\nfunction bytesToBase64(data: Uint8Array | undefined): string | undefined {\n return data !== undefined ? Buffer.from(data).toString('base64') : undefined;\n}\n\nexport class JsExecutionContext\n implements JsRenderInternal.GlobalCfgRenderCtxMethods<string, string>\n{\n private readonly callbackRegistry: QuickJSHandle;\n private readonly fnJSONStringify: QuickJSHandle;\n private readonly fnJSONParse: QuickJSHandle;\n\n public readonly computablesToResolve: Record<string, Computable<any>> = {};\n\n private computableCtx: ComputableCtx | undefined;\n private readonly accessors = new Map<string, PlTreeNodeAccessor | undefined>();\n\n private readonly meta: Map<string, Block>;\n\n constructor(\n private readonly scope: Scope,\n private readonly vm: QuickJSContext,\n private readonly blockCtx: BlockContextAny,\n private readonly env: MiddleLayerEnvironment,\n computableCtx: ComputableCtx\n ) {\n this.computableCtx = computableCtx;\n this.callbackRegistry = this.scope.manage(this.vm.newObject());\n\n this.fnJSONStringify = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'stringify'))\n );\n if (vm.typeof(this.fnJSONStringify) !== 'function')\n throw new Error(`JSON.stringify() not found.`);\n\n this.fnJSONParse = scope.manage(\n vm.getProp(vm.global, 'JSON').consume((json) => vm.getProp(json, 'parse'))\n );\n if (vm.typeof(this.fnJSONParse) !== 'function') throw new Error(`JSON.parse() not found.`);\n\n this.meta = blockCtx.blockMeta(computableCtx);\n\n this.injectCtx();\n }\n\n public resetComputableCtx() {\n this.computableCtx = undefined;\n this.accessors.clear();\n }\n\n private static cleanErrorContext(error: unknown): void {\n if (typeof error === 'object' && error !== null && 'context' in error) delete error['context'];\n }\n\n public evaluateBundle(code: string) {\n try {\n this.vm.unwrapResult(this.vm.evalCode(code, 'bundle.js', { type: 'global' })).dispose();\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n }\n }\n\n public runCallback(cbName: string, ...args: unknown[]): QuickJSHandle {\n try {\n return Scope.withScope((localScope) => {\n const targetCallback = localScope.manage(this.vm.getProp(this.callbackRegistry, cbName));\n\n if (this.vm.typeof(targetCallback) !== 'function')\n throw new Error(`No such callback: ${cbName}`);\n\n return this.scope.manage(\n this.vm.unwrapResult(\n this.vm.callFunction(\n targetCallback,\n this.vm.undefined,\n ...args.map((arg) => this.exportObjectUniversal(arg, localScope))\n )\n )\n );\n });\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n }\n }\n\n //\n // Methods for injected ctx object\n //\n\n getAccessorHandleByName(name: string): string | undefined {\n if (this.computableCtx === undefined)\n throw new Error(\"Accessors can't be used in this context\");\n const wellKnownAccessor = (name: string, ctxKey: 'staging' | 'prod'): string | undefined => {\n if (!this.accessors.has(name)) {\n const lambda = this.blockCtx[ctxKey];\n if (lambda === undefined) throw new Error('Staging context not available');\n const entry = lambda(this.computableCtx!);\n if (!entry) this.accessors.set(name, undefined);\n else\n this.accessors.set(name, this.computableCtx!.accessor(entry).node({ ignoreError: true }));\n }\n return this.accessors.get(name) ? name : undefined;\n };\n if (name === 'staging') return wellKnownAccessor('staging', 'staging');\n else if (name === 'main') return wellKnownAccessor('main', 'prod');\n return undefined;\n }\n\n //\n // Accessors\n //\n\n resolveWithCommon(\n handle: string,\n commonOptions: CommonFieldTraverseOpsFromSDK,\n ...steps: (FieldTraversalStepFromSDK | string)[]\n ): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).traverseWithCommon(commonOptions, ...steps));\n }\n\n getResourceType(handle: string): ResourceTypeFromSDK {\n return this.getAccessor(handle).resourceType;\n }\n\n getInputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getInputsLocked();\n }\n\n getOutputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getOutputsLocked();\n }\n\n getIsReadyOrError(handle: string): boolean {\n return this.getAccessor(handle).getIsReadyOrError();\n }\n\n getIsFinal(handle: string): boolean {\n return this.getAccessor(handle).getIsFinal();\n }\n\n getError(handle: string): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).getError());\n }\n\n listInputFields(handle: string): string[] {\n return this.getAccessor(handle).listInputFields();\n }\n\n listOutputFields(handle: string): string[] {\n return this.getAccessor(handle).listOutputFields();\n }\n\n listDynamicFields(handle: string): string[] {\n return this.getAccessor(handle).listDynamicFields();\n }\n\n getKeyValueBase64(handle: string, key: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getKeyValue(key));\n }\n\n getKeyValueAsString(handle: string, key: string): string | undefined {\n return this.getAccessor(handle).getKeyValueAsString(key);\n }\n\n getDataBase64(handle: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getData());\n }\n\n getDataAsString(handle: string): string | undefined {\n return this.getAccessor(handle).getDataAsString();\n }\n\n //\n // Accessor helpers\n //\n\n parsePObjectCollection(\n handle: string,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolveSteps: string[]\n ): Record<string, PObject<string>> | undefined {\n const acc = this.getAccessor(handle);\n if (!acc.getIsReadyOrError()) return undefined;\n const accResult = parseFinalPObjectCollection(acc, errorOnUnknownField, prefix, resolveSteps);\n const result: Record<string, PObject<string>> = {};\n for (const [key, obj] of Object.entries(accResult)) {\n result[key] = mapPObjectData(obj, (d) => this.wrapAccessor(d));\n }\n return result;\n }\n\n //\n // Blobs\n //\n\n private registerComputable(hPrefix: string, computable: Computable<unknown>): string {\n const fHandle = `${hPrefix}_${randomUUID()}`;\n this.computablesToResolve[fHandle] = computable;\n return fHandle;\n }\n\n public getBlobContentAsString(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsString',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle)).toString(\n 'utf-8'\n );\n }\n })\n );\n }\n\n public getBlobContentAsBase64(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getBlobContentAsBase64',\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(await this.env.driverKit.blobDriver.getContent(value.handle)).toString(\n 'base64'\n );\n }\n })\n );\n }\n\n public getDownloadedBlobContentHandle(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n 'getDownloadedBlobContentHandle',\n this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo)\n );\n }\n\n public getOnDemandBlobContentHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getOnDemandBlobContentHandle',\n this.env.driverKit.blobDriver.getOnDemandBlob(resource)\n );\n }\n\n //\n // Blobs to URLs\n //\n\n public extractArchiveAndGetURL(handle: string, format: ArchiveFormat): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'extractArchiveAndGetURL',\n this.env.driverKit.blobToURLDriver.extractArchiveAndGetURL(resource, format)\n );\n }\n\n //\n // Import progress\n //\n\n getImportProgress(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getImportProgress',\n this.env.driverKit.uploadDriver.getProgressId(resource)\n );\n }\n\n //\n // Logs\n //\n\n getLastLogs(handle: string, nLines: number): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLastLogs',\n this.env.driverKit.logDriver.getLastLogs(resource, nLines)\n );\n }\n\n getProgressLog(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLog',\n this.env.driverKit.logDriver.getProgressLog(resource, patternToSearch)\n );\n }\n\n getProgressLogWithInfo(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getProgressLogWithInfo',\n this.env.driverKit.logDriver.getProgressLogWithInfo(resource, patternToSearch)\n );\n }\n\n getLogHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n 'getLogHandle',\n this.env.driverKit.logDriver.getLogHandle(resource)\n );\n }\n\n //\n // Blocks\n //\n\n public getBlockLabel(blockId: string): string {\n const b = this.meta.get(blockId);\n if (b === undefined) throw new Error(`Block ${blockId} not found.`);\n return b.label;\n }\n\n //\n // Result Pool\n //\n\n private _resultPool: ResultPool | undefined = undefined;\n private get resultPool(): ResultPool {\n if (this._resultPool === undefined) {\n if (this.computableCtx === undefined)\n throw new Error(\n \"can't use result pool in this context (most porbably called from the future mapper)\"\n );\n this._resultPool = notEmpty(\n this.blockCtx.getResultsPool,\n 'getResultsPool'\n )(this.computableCtx);\n }\n return this._resultPool;\n }\n\n public calculateOptions(predicate: PSpecPredicate): Option[] {\n return this.resultPool.calculateOptions(predicate);\n }\n\n public getDataFromResultPool(): ResultCollection<PObject<string>> {\n const collection = this.resultPool.getData();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: mapPObjectData(e.obj, (d) => this.wrapAccessor(d))\n }))\n };\n }\n\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<string, string>>, 'id'>\n > {\n const collection = this.resultPool.getDataWithErrors();\n if (collection.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`incomplete_result_pool:${collection.instabilityMarker}`);\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: {\n id: e.obj.id,\n spec: e.obj.spec,\n data: mapValueInVOE(e.obj.data, (d) => this.wrapAccessor(d))\n }\n }))\n };\n }\n\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n const specs = this.resultPool.getSpecs();\n if (specs.instabilityMarker !== undefined)\n this.computableCtx!.markUnstable(`specs_from_pool_incomplete:${specs.instabilityMarker}`);\n return specs;\n }\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n return this.resultPool.getSpecByRef(blockId, exportName);\n }\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<string> | undefined {\n return mapPObjectData(this.resultPool.getDataByRef(blockId, exportName), (acc) =>\n this.wrapAccessor(acc)\n );\n }\n\n //\n // PFrames / PTables\n //\n\n public createPFrame(def: PFrameDef<string | PColumnValues>): PFrameHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n \"can't instantiate PFrames from this context (most porbably called from the future mapper)\"\n );\n return this.env.driverKit.pFrameDriver.createPFrame(\n def.map((c) => mapPObjectData(c, (d) => (typeof d === 'string' ? this.getAccessor(d) : d))),\n this.computableCtx\n );\n }\n\n public createPTable(def: PTableDef<PColumn<string | PColumnValues>>): PTableHandle {\n if (this.computableCtx === undefined)\n throw new Error(\n \"can't instantiate PTable from this context (most porbably called from the future mapper)\"\n );\n return this.env.driverKit.pFrameDriver.createPTable(\n mapPTableDef(def, (c) =>\n mapPObjectData(c, (d) => (typeof d === 'string' ? this.getAccessor(d) : d))\n ),\n this.computableCtx\n );\n }\n\n //\n // Computable\n //\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.computableCtx?.unstableMarker;\n }\n\n //\n // Helpers\n //\n\n private getAccessor(handle: string): PlTreeNodeAccessor {\n const accessor = this.accessors.get(handle);\n if (accessor === undefined) throw new Error('No such accessor');\n return accessor;\n }\n\n private wrapAccessor(accessor: PlTreeNodeAccessor): string;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined {\n if (accessor === undefined) return undefined;\n else {\n const nextHandle = randomUUID();\n this.accessors.set(nextHandle, accessor);\n return nextHandle;\n }\n }\n\n //\n // QuickJS Helpers\n //\n\n private exportSingleValue(\n obj: boolean | number | string | null | ArrayBuffer | undefined,\n scope: Scope | undefined\n ): QuickJSHandle {\n const result = this.tryExportSingleValue(obj, scope);\n if (result === undefined) throw new Error(`Can't export value: ${obj}`);\n return result;\n }\n\n private tryExportSingleValue(obj: unknown, scope: Scope | undefined): QuickJSHandle | undefined {\n let handle: QuickJSHandle;\n let manage = false;\n switch (typeof obj) {\n case 'string':\n handle = this.vm.newString(obj);\n manage = true;\n break;\n case 'number':\n handle = this.vm.newNumber(obj);\n manage = true;\n break;\n case 'undefined':\n handle = this.vm.undefined;\n break;\n case 'boolean':\n handle = obj ? this.vm.true : this.vm.false;\n break;\n default:\n if (obj === null) {\n handle = this.vm.null;\n break;\n }\n if (isArrayBufferOrView(obj)) {\n handle = this.vm.newArrayBuffer(obj);\n manage = true;\n break;\n }\n return undefined;\n }\n return manage && scope != undefined ? scope.manage(handle) : handle;\n }\n\n public exportObjectUniversal(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const simpleHandle = this.tryExportSingleValue(obj, scope);\n if (simpleHandle !== undefined) return simpleHandle;\n return this.exportObjectViaJson(obj, scope);\n }\n\n public exportObjectViaJson(obj: unknown, scope: Scope | undefined): QuickJSHandle {\n const result = this.vm\n .newString(JSON.stringify(obj))\n .consume((json) =>\n this.vm.unwrapResult(this.vm.callFunction(this.fnJSONParse, this.vm.undefined, json))\n );\n return scope !== undefined ? scope.manage(result) : result;\n }\n\n public importObjectUniversal(handle: QuickJSHandle): unknown {\n switch (this.vm.typeof(handle)) {\n case 'undefined':\n return undefined;\n case 'boolean':\n case 'number':\n case 'string':\n return this.vm.dump(handle);\n default:\n return this.importObjectViaJson(handle);\n }\n }\n\n public importObjectViaJson(handle: QuickJSHandle): unknown {\n const text = this.vm\n .unwrapResult(this.vm.callFunction(this.fnJSONStringify, this.vm.undefined, handle))\n .consume((strHandle) => this.vm.getString(strHandle));\n if (text === 'undefined')\n // special case with futures\n return undefined;\n return JSON.parse(text);\n }\n\n private injectCtx() {\n Scope.withScope((localScope) => {\n const configCtx = localScope.manage(this.vm.newObject());\n\n // Exporting props\n\n const args = this.blockCtx.args(this.computableCtx!);\n const activeArgs = this.blockCtx.activeArgs(this.computableCtx!);\n const uiState = this.blockCtx.uiState(this.computableCtx!);\n this.vm.setProp(configCtx, 'args', localScope.manage(this.vm.newString(args)));\n if (uiState !== undefined)\n this.vm.setProp(configCtx, 'uiState', localScope.manage(this.vm.newString(uiState)));\n if (activeArgs !== undefined)\n this.vm.setProp(configCtx, 'activeArgs', localScope.manage(this.vm.newString(activeArgs)));\n this.vm.setProp(configCtx, 'callbackRegistry', this.callbackRegistry);\n this.vm.setProp(\n configCtx,\n 'featureFlags',\n this.exportObjectUniversal(JsRenderInternal.GlobalCfgRenderCtxFeatureFlags, localScope)\n );\n\n // Exporting methods\n\n const exportCtxFunction = (\n name: string,\n fn: VmFunctionImplementation<QuickJSHandle>\n ): void => {\n this.vm.newFunction(name, fn).consume((fnh) => this.vm.setProp(configCtx, name, fnh));\n };\n\n //\n // Methods for injected ctx object\n //\n\n exportCtxFunction('getAccessorHandleByName', (name) => {\n return this.exportSingleValue(\n this.getAccessorHandleByName(this.vm.getString(name)),\n undefined\n );\n });\n\n //\n // Accessors\n //\n\n exportCtxFunction('resolveWithCommon', (handle, commonOptions, ...steps) => {\n return this.exportSingleValue(\n this.resolveWithCommon(\n this.vm.getString(handle),\n this.importObjectViaJson(commonOptions) as CommonFieldTraverseOpsFromSDK,\n ...steps.map(\n (step) => this.importObjectViaJson(step) as FieldTraversalStepFromSDK | string\n )\n ),\n undefined\n );\n });\n\n exportCtxFunction('getResourceType', (handle) => {\n return this.exportObjectViaJson(this.getResourceType(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getInputsLocked', (handle) => {\n return this.exportSingleValue(this.getInputsLocked(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getOutputsLocked', (handle) => {\n return this.exportSingleValue(this.getOutputsLocked(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsReadyOrError', (handle) => {\n return this.exportSingleValue(this.getIsReadyOrError(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getIsFinal', (handle) => {\n return this.exportSingleValue(this.getIsFinal(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getError', (handle) => {\n return this.exportSingleValue(this.getError(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listInputFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listOutputFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('listDynamicFields', (handle) => {\n return this.exportObjectViaJson(this.listInputFields(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getKeyValueBase64', (handle, key) => {\n return this.exportSingleValue(\n this.getKeyValueBase64(this.vm.getString(handle), this.vm.getString(key)),\n undefined\n );\n });\n\n exportCtxFunction('getKeyValueAsString', (handle, key) => {\n return this.exportSingleValue(\n this.getKeyValueAsString(this.vm.getString(handle), this.vm.getString(key)),\n undefined\n );\n });\n\n exportCtxFunction('getDataBase64', (handle) => {\n return this.exportSingleValue(this.getDataBase64(this.vm.getString(handle)), undefined);\n });\n\n exportCtxFunction('getDataAsString', (handle) => {\n return this.exportSingleValue(this.getDataAsString(this.vm.getString(handle)), undefined);\n });\n\n //\n // Accessor helpers\n //\n\n exportCtxFunction(\n 'parsePObjectCollection',\n (handle, errorOnUnknownField, prefix, ...resolveSteps) => {\n return this.exportObjectUniversal(\n this.parsePObjectCollection(\n this.vm.getString(handle),\n this.vm.dump(errorOnUnknownField) as boolean,\n this.vm.getString(prefix),\n ...resolveSteps.map(this.vm.getString)\n ),\n undefined\n );\n }\n );\n\n //\n // Blobs\n //\n\n exportCtxFunction('getBlobContentAsBase64', (handle) => {\n return this.exportSingleValue(\n this.getBlobContentAsBase64(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getBlobContentAsString', (handle) => {\n return this.exportSingleValue(\n this.getBlobContentAsString(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getDownloadedBlobContentHandle', (handle) => {\n return this.exportSingleValue(\n this.getDownloadedBlobContentHandle(this.vm.getString(handle)),\n undefined\n );\n });\n\n exportCtxFunction('getOnDemandBlobContentHandle', (handle) => {\n return this.exportSingleValue(\n this.getOnDemandBlobContentHandle(this.vm.getString(handle)),\n undefined\n );\n });\n\n //\n // Blobs to URLs\n //\n\n exportCtxFunction('extractArchiveAndGetURL', (handle, format) => {\n return this.exportSingleValue(\n this.extractArchiveAndGetURL(this.vm.getString(handle), this.vm.getString(format) as ArchiveFormat),\n undefined)\n })\n\n //\n // ImportProgress\n //\n\n exportCtxFunction('getImportProgress', (handle) => {\n return this.exportSingleValue(this.getImportProgress(this.vm.getString(handle)), undefined);\n });\n\n //\n // Logs\n //\n\n exportCtxFunction('getLastLogs', (handle, nLines) => {\n return this.exportSingleValue(\n this.getLastLogs(this.vm.getString(handle), this.vm.getNumber(nLines)),\n undefined\n );\n });\n\n exportCtxFunction('getProgressLog', (handle, patternToSearch) => {\n return this.exportSingleValue(\n this.getProgressLog(this.vm.getString(handle), this.vm.getString(patternToSearch)),\n undefined\n );\n });\n\n exportCtxFunction('getProgressLogWithInfo', (handle, patternToSearch) => {\n return this.exportSingleValue(\n this.getProgressLogWithInfo(this.vm.getString(handle), this.vm.getString(patternToSearch)),\n undefined\n );\n });\n\n exportCtxFunction('getLogHandle', (handle) => {\n return this.exportSingleValue(this.getLogHandle(this.vm.getString(handle)), undefined);\n });\n\n //\n // Blocks\n //\n\n exportCtxFunction('getBlockLabel', (blockId) => {\n return this.exportSingleValue(this.getBlockLabel(this.vm.getString(blockId)), undefined);\n });\n\n //\n // Result pool\n //\n\n exportCtxFunction('getDataFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getDataFromResultPool(), undefined);\n });\n\n exportCtxFunction('getDataWithErrorsFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getDataWithErrorsFromResultPool(), undefined);\n });\n\n exportCtxFunction('getSpecsFromResultPool', (predicate) => {\n return this.exportObjectUniversal(this.getSpecsFromResultPool(), undefined);\n });\n\n exportCtxFunction('calculateOptions', (predicate) => {\n return this.exportObjectUniversal(\n this.calculateOptions(this.importObjectViaJson(predicate) as PSpecPredicate),\n undefined\n );\n });\n\n exportCtxFunction('getSpecFromResultPoolByRef', (blockId, exportName) => {\n return this.exportObjectUniversal(\n this.getSpecFromResultPoolByRef(\n this.vm.getString(blockId),\n this.vm.getString(exportName)\n ),\n undefined\n );\n });\n\n exportCtxFunction('getDataFromResultPoolByRef', (blockId, exportName) => {\n return this.exportObjectUniversal(\n this.getDataFromResultPoolByRef(\n this.vm.getString(blockId),\n this.vm.getString(exportName)\n ),\n undefined\n );\n });\n\n //\n // PFrames / PTables\n //\n\n exportCtxFunction('createPFrame', (def) => {\n return this.exportSingleValue(\n this.createPFrame(this.importObjectViaJson(def) as PFrameDef<string | PColumnValues>),\n undefined\n );\n });\n\n exportCtxFunction('createPTable', (def) => {\n return this.exportSingleValue(\n this.createPTable(\n this.importObjectViaJson(def) as PTableDef<PColumn<string | PColumnValues>>\n ),\n undefined\n );\n });\n\n //\n // Computable\n //\n\n exportCtxFunction('getCurrentUnstableMarker', () => {\n return this.exportSingleValue(this.getCurrentUnstableMarker(), undefined);\n });\n\n this.vm.setProp(this.vm.global, 'cfgRenderCtx', configCtx);\n });\n }\n}\n","import { PlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport { projectFieldName } from '../model/project_model';\nimport { Pl } from '@milaboratories/pl-client';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { BlockConfig, extractConfig } from '@platforma-sdk/model';\n\nexport type BlockPackInfoAndId = {\n /** To be added to computable keys, to force reload on config change */\n readonly bpId: string;\n /** Full block-pack info */\n readonly info: BlockPackInfo;\n /** Config extracted from the info */\n readonly cfg: BlockConfig;\n};\n\n/** Returns block pack info along with string representation of block-pack resource id */\nexport function getBlockPackInfo(\n prj: PlTreeNodeAccessor,\n blockId: string\n): BlockPackInfoAndId | undefined {\n return ifNotUndef(\n prj.traverse(\n {\n field: projectFieldName(blockId, 'blockPack'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true }\n ),\n (bpAcc) => {\n const info = bpAcc.getDataAsJson<BlockPackInfo>()!;\n const cfg = extractConfig(info.config);\n return { bpId: bpAcc.resourceInfo.id.toString(), info, cfg };\n }\n );\n}\n\nexport const LogOutputStatus = process.env.MI_LOG_OUTPUT_STATUS;\n","import { MiddleLayerEnvironment } from '../middle_layer/middle_layer';\nimport { Code, ConfigRenderLambda } from '@platforma-sdk/model';\nimport { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { Scope } from 'quickjs-emscripten';\nimport { JsExecutionContext } from './context';\nimport { BlockContextAny } from '../middle_layer/block_ctx';\nimport { LogOutputStatus } from '../middle_layer/util';\n\nexport function computableFromRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n fh: ConfigRenderLambda,\n code: Code,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n // adding configKey to reload all outputs on block-pack update\n const key = `${ctx.blockId}#lambda#${configKey}#${fh.handle}`;\n ops = { ...ops, key };\n if (ops.mode === undefined && fh.retentive === true) ops.mode = 'StableOnlyRetentive';\n return Computable.makeRaw((cCtx) => {\n const scope = new Scope();\n cCtx.addOnDestroy(() => scope.dispose());\n\n const runtime = scope.manage(env.quickJs.newRuntime());\n runtime.setMemoryLimit(1024 * 640);\n runtime.setMaxStackSize(1024 * 320);\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(scope, vm, ctx, env, cCtx);\n\n rCtx.evaluateBundle(code.content);\n const result = rCtx.runCallback(fh.handle);\n\n rCtx.resetComputableCtx();\n\n let recalculationCounter = 0;\n\n if (LogOutputStatus && LogOutputStatus !== 'unstable-only')\n console.log(`Output ${fh.handle} scaffold calculated.`);\n\n return {\n ir: rCtx.computablesToResolve,\n postprocessValue: async (resolved: Record<string, unknown>, { unstableMarker, stable }) => {\n // resolving futures\n for (const [handle, value] of Object.entries(resolved)) rCtx.runCallback(handle, value);\n\n // rendering result\n const renderedResult = rCtx.importObjectUniversal(result);\n\n // logging\n recalculationCounter++;\n if (LogOutputStatus && (LogOutputStatus !== 'unstable-only' || !stable)) {\n if (stable)\n console.log(\n `Stable output ${fh.handle} calculated ${renderedResult !== undefined ? 'defined' : 'undefined'}; (#${recalculationCounter})`\n );\n else\n console.log(\n `Unstable output ${fh.handle}; marker = ${unstableMarker}; ${renderedResult !== undefined ? 'defined' : 'undefined'} (#${recalculationCounter})`\n );\n }\n\n return renderedResult;\n }\n };\n }, ops);\n}\n","import { Code, isConfigLambda, TypedConfigOrConfigLambda } from '@platforma-sdk/model';\nimport { Computable, ComputableRenderingOps } from '@milaboratories/computable';\nimport { computableFromCfg } from '../cfg_render/executor';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { computableFromRF } from '../js_render';\nimport { BlockContextAny } from './block_ctx';\nimport { hasActiveCfgComponents } from '../cfg_render/util';\n\nexport function isActive(cfg: TypedConfigOrConfigLambda): boolean {\n if (isConfigLambda(cfg)) return cfg.isActive === true;\n else return hasActiveCfgComponents(cfg);\n}\n\nexport function computableFromCfgOrRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n cfgOrFh: TypedConfigOrConfigLambda,\n code: Code | undefined,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {}\n): Computable<unknown> {\n if (isConfigLambda(cfgOrFh)) {\n if (code === undefined) throw new Error('No code bundle.');\n return computableFromRF(env, ctx, cfgOrFh, code, configKey, ops);\n } else return computableFromCfg(env.driverKit, ctx, cfgOrFh, ops);\n}\n","import { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport {\n BlockRenderingStateKey,\n ProjectCreatedTimestamp,\n projectFieldName,\n ProjectLastModifiedTimestamp,\n ProjectMetaKey,\n ProjectRenderingState,\n ProjectStructure,\n ProjectStructureAuthorKey,\n ProjectStructureKey\n} from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { allBlocks, productionGraph } from '../model/project_model_util';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport {\n AuthorMarker,\n BlockCalculationStatus,\n BlockSettings,\n BlockStateOverview,\n ProjectMeta,\n ProjectOverview\n} from '@milaboratories/pl-model-middle-layer';\nimport { constructBlockContextArgsOnly } from './block_ctx';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { BlockSection, extractConfig } from '@platforma-sdk/model';\nimport { computableFromCfgOrRF } from './render';\nimport { NavigationStates } from './navigation_states';\nimport { getBlockPackInfo } from './util';\n\ntype BlockInfo = {\n currentArguments: any;\n prod?: ProdState;\n};\n\ntype CalculationStatus = 'Running' | 'Done';\n\ntype ProdState = {\n finished: boolean;\n\n outputError: boolean;\n\n outputsError?: string;\n\n exportsError?: string;\n\n stale: boolean;\n\n /** Arguments current production was rendered with. */\n arguments: any;\n};\n\n/** Returns derived general project state form the project resource */\nexport function projectOverview(\n prjEntry: PlTreeEntry,\n navigationStates: NavigationStates,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<ProjectOverview> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const created = notEmpty(prj.getKeyValueAsJson<number>(ProjectCreatedTimestamp));\n const lastModified = notEmpty(prj.getKeyValueAsJson<number>(ProjectLastModifiedTimestamp));\n\n const meta = notEmpty(prj.getKeyValueAsJson<ProjectMeta>(ProjectMetaKey));\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const renderingState = notEmpty(\n prj.getKeyValueAsJson<ProjectRenderingState>(BlockRenderingStateKey)\n );\n\n const infos = new Map<string, BlockInfo>();\n for (const { id } of allBlocks(structure)) {\n const cInputs = prj.traverse({\n field: projectFieldName(id, 'currentArgs'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n });\n\n let prod: ProdState | undefined = undefined;\n\n const rInputs = prj.traverse({\n field: projectFieldName(id, 'prodArgs'),\n assertFieldType: 'Dynamic',\n stableIfNotFound: true\n });\n if (rInputs !== undefined) {\n const result = prj.getField({\n field: projectFieldName(id, 'prodOutput'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true\n });\n const ctx = prj.getField({\n field: projectFieldName(id, 'prodUiCtx'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotFound: true\n });\n prod = {\n arguments: rInputs.getDataAsJson(),\n stale: cInputs.id !== rInputs.id,\n outputError:\n result.error !== undefined ||\n ctx.error !== undefined ||\n result.value?.getError() !== undefined ||\n ctx.value?.getError() !== undefined,\n outputsError:\n result.error?.getDataAsString() ?? result.value?.getError()?.getDataAsString(),\n exportsError: ctx.error?.getDataAsString() ?? ctx.value?.getError()?.getDataAsString(),\n finished:\n ((result.value !== undefined && result.value.getIsReadyOrError()) ||\n (result.error !== undefined && result.error.getIsReadyOrError())) &&\n ((ctx.value !== undefined && ctx.value.getIsReadyOrError()) ||\n (ctx.error !== undefined && ctx.error.getIsReadyOrError()))\n };\n }\n\n infos.set(id, { currentArguments: cInputs.getDataAsJson(), prod });\n }\n\n const currentGraph = productionGraph(structure, (id) => infos.get(id)!.currentArguments);\n\n const limbo = new Set(renderingState.blocksInLimbo);\n\n const blocks = [...allBlocks(structure)].map(({ id, label: defaultLabel, renderingMode }) => {\n const info = notEmpty(infos.get(id));\n const gNode = notEmpty(currentGraph.nodes.get(id));\n let calculationStatus: BlockCalculationStatus = 'NotCalculated';\n if (info.prod !== undefined) {\n if (limbo.has(id)) calculationStatus = 'Limbo';\n else calculationStatus = info.prod.finished ? 'Done' : 'Running';\n }\n\n const bp = getBlockPackInfo(prj, id);\n\n const { sections, title, inputsValid, sdkVersion } =\n ifNotUndef(bp, ({ bpId, cfg, info }) => {\n const blockCtxArgsOnly = constructBlockContextArgsOnly(prjEntry, id);\n return {\n sections: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.sections,\n cfg.code,\n bpId\n ) as ComputableStableDefined<BlockSection[]>,\n title: ifNotUndef(\n cfg.title,\n (title) =>\n computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n title,\n cfg.code,\n bpId\n ) as ComputableStableDefined<string>\n ),\n inputsValid: computableFromCfgOrRF(\n env,\n blockCtxArgsOnly,\n cfg.inputsValid,\n cfg.code,\n bpId\n ) as ComputableStableDefined<boolean>,\n sdkVersion: cfg.sdkVersion\n };\n }) || {};\n\n const settings = prj\n .traverse({\n field: projectFieldName(id, 'blockSettings'),\n assertFieldType: 'Dynamic',\n errorIfFieldNotSet: true\n })\n .getDataAsJson() as BlockSettings;\n\n const updates = ifNotUndef(bp, ({ info }) =>\n env.blockUpdateWatcher.get({ currentSpec: info.source, settings })\n );\n\n return {\n id,\n label: title ?? defaultLabel,\n title: title ?? defaultLabel,\n renderingMode,\n stale: info.prod?.stale !== false || calculationStatus === 'Limbo',\n missingReference: gNode.missingReferences,\n upstreams: [...currentGraph.traverseIdsExcludingRoots('upstream', id)],\n downstreams: [...currentGraph.traverseIdsExcludingRoots('downstream', id)],\n calculationStatus,\n outputErrors: info.prod?.outputError === true,\n outputsError: info.prod?.outputsError,\n exportsError: info.prod?.exportsError,\n settings,\n sections,\n inputsValid,\n updateInfo: {},\n currentBlockPack: bp?.info?.source,\n updates,\n sdkVersion,\n navigationState: navigationStates.getState(id)\n };\n });\n\n return {\n meta,\n created: new Date(created),\n lastModified: new Date(lastModified),\n authorMarker: prj.getKeyValueAsJson<AuthorMarker>(ProjectStructureAuthorKey),\n blocks\n };\n },\n {\n postprocessValue: (value) => {\n const cantRun = new Set<string>();\n const staleBlocks = new Set<string>();\n return {\n ...value,\n blocks: value.blocks.map((b) => {\n if (!b.inputsValid) cantRun.add(b.id);\n if (b.stale) staleBlocks.add(b.id);\n const stale = b.stale || b.upstreams.findIndex((u) => staleBlocks.has(u)) !== -1;\n const canRun =\n (stale || b.outputErrors) &&\n Boolean(b.inputsValid) &&\n !b.missingReference &&\n b.upstreams.findIndex((u) => cantRun.has(u)) === -1;\n const bb = {\n ...b,\n canRun,\n stale,\n updateSuggestions: b.updates?.suggestions ?? [],\n updatedBlockPack: b.updates?.mainSuggestion\n };\n delete bb['updates'];\n return bb;\n })\n };\n }\n }\n ).withStableType();\n}\n","import { PlTreeEntry, PlTreeEntryAccessor } from '@milaboratories/pl-tree';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport { Pl, resourceTypesEqual } from '@milaboratories/pl-client';\nimport {\n FrontendFromFolderData,\n FrontendFromFolderResourceType,\n FrontendFromUrlData,\n FrontendFromUrlResourceType\n} from '../model';\nimport { PathResult } from '@milaboratories/pl-drivers';\nimport { projectFieldName } from '../model/project_model';\nimport { BlockPackFrontendField } from '../mutator/block-pack/block_pack';\nimport { getBlockPackInfo } from './util';\nimport { FrontendData } from '../model/frontend';\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment\n): undefined | string | ComputableStableDefined<PathResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getPath(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendPathComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === 'string') return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.path;\n }\n }\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, 'blockPack'),\n assertFieldType: 'Dynamic'\n },\n { field: Pl.HolderRefField, assertFieldType: 'Input', errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: 'Input' }\n )\n ?.persist();\n return {\n path: frontendPathComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion\n };\n },\n { mode: 'StableOnlyLive' }\n ) as ComputableStableDefined<FrontendData>;\n}\n","import { PlTreeEntry } from '@milaboratories/pl-tree';\nimport {\n Computable,\n ComputableCtx,\n ComputableStableDefined,\n ComputableValueOrErrors\n} from '@milaboratories/computable';\nimport { constructBlockContext, constructBlockContextArgsOnly } from './block_ctx';\nimport { blockArgsAuthorKey } from '../model/project_model';\nimport { ifNotUndef } from '../cfg_render/util';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { getBlockPackInfo } from './util';\nimport { AuthorMarker, BlockStateInternal } from '@milaboratories/pl-model-middle-layer';\nimport { computableFromCfgOrRF } from './render';\nimport { resourceIdToString } from '@milaboratories/pl-client';\n\nexport type BlockArgsAndUiState = Omit<BlockStateInternal, 'outputs' | 'navigationState'>;\n\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string\n): Computable<BlockArgsAndUiState>;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx: ComputableCtx\n): BlockArgsAndUiState;\nexport function blockArgsAndUiState(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx?: ComputableCtx\n): BlockArgsAndUiState | Computable<BlockArgsAndUiState> {\n if (cCtx === undefined)\n return Computable.make((c) => blockArgsAndUiState(projectEntry, blockId, c), {\n key: `inputs#${resourceIdToString(projectEntry.rid)}#${blockId}`\n });\n\n const prj = cCtx.accessor(projectEntry).node();\n const ctx = constructBlockContextArgsOnly(projectEntry, blockId);\n const uiState = ctx.uiState(cCtx);\n return {\n author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(blockId)),\n args: JSON.parse(ctx.args(cCtx)),\n ui: uiState !== undefined ? JSON.parse(uiState) : undefined\n };\n}\n\nexport function blockOutputs(\n projectEntry: PlTreeEntry,\n blockId: string,\n env: MiddleLayerEnvironment\n): ComputableStableDefined<Record<string, ComputableValueOrErrors<unknown>>> {\n return Computable.make(\n (c) => {\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContext(projectEntry, blockId);\n\n return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId }) => {\n const outputs: Record<string, Computable<any>> = {};\n for (const [cellId, cellCfg] of Object.entries(cfg.outputs)) {\n const computableOutput = computableFromCfgOrRF(env, ctx, cellCfg, cfg.code, bpId);\n outputs[cellId] = Computable.wrapError(computableOutput);\n }\n return outputs;\n });\n },\n { key: 'outputs#' + resourceIdToString(projectEntry.rid) + '#' + blockId }\n ).withStableType();\n}\n","import { notEmpty } from '@milaboratories/ts-helpers';\nimport { PlTreeEntry } from '@milaboratories/pl-tree';\nimport { MiddleLayerEnvironment } from './middle_layer';\nimport { Computable } from '@milaboratories/computable';\nimport { projectFieldName, ProjectStructure, ProjectStructureKey } from '../model/project_model';\nimport { allBlocks } from '../model/project_model_util';\nimport { Pl } from '@milaboratories/pl-client';\nimport { BlockPackInfo } from '../model/block_pack';\nimport { extractConfig, TypedConfigOrConfigLambda } from '@platforma-sdk/model';\nimport { constructBlockContext } from './block_ctx';\nimport { computableFromCfgOrRF, isActive } from './render';\nimport { getBlockPackInfo } from './util';\n\n/** Returns derived general project state form the project resource */\nexport function activeConfigs(\n prjEntry: PlTreeEntry,\n env: MiddleLayerEnvironment\n): Computable<unknown[]> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const ret: Computable<unknown>[] = [];\n for (const { id, renderingMode } of allBlocks(structure)) {\n const bp = getBlockPackInfo(prj, id);\n if (bp === undefined) continue;\n\n const activeOutputConfigs = Object.entries(bp.cfg.outputs)\n .map(([, cfg]) => cfg)\n .filter((cfg) => isActive(cfg))\n .map((cfg) => cfg as TypedConfigOrConfigLambda);\n\n if (activeOutputConfigs.length === 0) continue;\n\n const blockCtx = constructBlockContext(prj.persist(), id);\n\n for (const cfg of activeOutputConfigs)\n ret.push(\n Computable.wrapError(computableFromCfgOrRF(env, blockCtx, cfg, bp.cfg.code, bp.bpId))\n );\n }\n\n return ret;\n });\n}\n","import { ChangeSource, Computable, ComputableCtx } from '@milaboratories/computable';\nimport { NavigationState, DefaultNavigationState } from '@platforma-sdk/model';\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged();\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` }\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged();\n }\n }\n}\n","import { MiddleLayerEnvironment } from './middle_layer';\nimport {\n ensureResourceIdNotNull,\n field,\n FieldData,\n isNotFoundError,\n isTimeoutOrCancelError,\n Pl,\n ResourceId\n} from '@milaboratories/pl-client';\nimport { Computable, ComputableStableDefined } from '@milaboratories/computable';\nimport { projectOverview } from './project_overview';\nimport { BlockPackSpecAny } from '../model';\nimport { randomUUID } from 'node:crypto';\nimport { ProjectMutator, withProject, withProjectAuthored } from '../mutator/project';\nimport { ExtendedResourceData, SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { setTimeout } from 'node:timers/promises';\nimport { frontendData } from './frontend_path';\nimport { NavigationState } from '@milaboratories/pl-model-common';\nimport { blockArgsAndUiState, blockOutputs } from './block';\nimport { FrontendData } from '../model/frontend';\nimport { projectFieldName, ProjectStructure } from '../model/project_model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport { BlockPackInfo } from '../model/block_pack';\nimport {\n ProjectOverview,\n AuthorMarker,\n BlockStateInternal,\n BlockSettings\n} from '@milaboratories/pl-model-middle-layer';\nimport { activeConfigs } from './active_cfg';\nimport { NavigationStates } from './navigation_states';\nimport { extractConfig } from '@platforma-sdk/model';\n\ntype BlockStateComputables = {\n readonly fullState: Computable<BlockStateInternal>;\n};\n\n/** Data access object, to manipulate and read single opened (!) project data. */\nexport class Project {\n /** Underlying pl resource id */\n public readonly rid: ResourceId;\n\n /** Data for the left panel, contain basic information about block status. */\n public readonly overview: ComputableStableDefined<ProjectOverview>;\n\n private readonly navigationStates = new NavigationStates();\n private readonly blockComputables = new Map<string, BlockStateComputables>();\n\n private readonly blockFrontends = new Map<string, ComputableStableDefined<FrontendData>>();\n private readonly activeConfigs: Computable<unknown[]>;\n private readonly refreshLoopResult: Promise<void>;\n\n private readonly abortController = new AbortController();\n private destroyed = false;\n\n constructor(\n private readonly env: MiddleLayerEnvironment,\n rid: ResourceId,\n private readonly projectTree: SynchronizedTreeState\n ) {\n this.overview = projectOverview(\n projectTree.entry(),\n this.navigationStates,\n env\n ).withPreCalculatedValueTree();\n this.rid = rid;\n this.refreshLoopResult = this.refreshLoop();\n this.activeConfigs = activeConfigs(projectTree.entry(), env);\n }\n\n private async refreshLoop(): Promise<void> {\n while (!this.destroyed) {\n try {\n await withProject(this.env.pl, this.rid, (prj) => {\n prj.doRefresh(this.env.ops.stagingRenderingRate);\n });\n await this.activeConfigs.getValue();\n await setTimeout(this.env.ops.projectRefreshInterval, this.abortController.signal);\n } catch (e: any) {\n if (isNotFoundError(e)) {\n console.warn(\n 'project refresh routine terminated, because project was externally deleted'\n );\n break;\n } else if (!isTimeoutOrCancelError(e))\n throw new Error('Unexpected exception', { cause: e });\n }\n }\n }\n\n /**\n * Adds new block to the project.\n *\n * @param blockLabel block label / title visible to the user\n * @param blockPackSpec object describing the \"block type\", read more in the type docs\n * @param before id of the block to insert new block before\n * @param blockId internal id to be assigned for the block, this arg can be omitted\n * then, randomly generated UUID will be assigned automatically\n *\n * @return returns newly created block id\n * */\n public async addBlock(\n blockLabel: string,\n blockPackSpec: BlockPackSpecAny,\n before?: string,\n author: AuthorMarker | undefined = undefined,\n blockId: string = randomUUID()\n ): Promise<string> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfgContainer = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n const blockCfg = extractConfig(blockCfgContainer); // full content of this var should never be persisted\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.addBlock(\n {\n id: blockId,\n label: blockLabel,\n renderingMode: blockCfg.renderingMode\n },\n {\n args: JSON.stringify(blockCfg.initialArgs),\n uiState: JSON.stringify(blockCfg.initialUiState),\n blockPack: preparedBp\n },\n before\n )\n );\n await this.projectTree.refreshState();\n\n return blockId;\n }\n\n /**\n * Update block to new block pack, optionally resetting args and ui state to\n * initial values\n * */\n public async updateBlockPack(\n blockId: string,\n blockPackSpec: BlockPackSpecAny,\n resetArgs: boolean = false,\n author?: AuthorMarker\n ): Promise<void> {\n const preparedBp = await this.env.bpPreparer.prepare(blockPackSpec);\n const blockCfg = await this.env.bpPreparer.getBlockConfigContainer(blockPackSpec);\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.migrateBlockPack(\n blockId,\n preparedBp,\n resetArgs ? JSON.stringify(blockCfg.initialArgs) : undefined\n )\n );\n await this.projectTree.refreshState();\n }\n\n /** Deletes a block with all associated data. */\n public async deleteBlock(blockId: string, author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) => mut.deleteBlock(blockId));\n this.navigationStates.deleteBlock(blockId);\n await this.projectTree.refreshState();\n }\n\n /**\n * Updates block order according to the given array of block ids.\n *\n * Provided array must contain exactly the same set of ids current project cosists of,\n * an error will be thrown instead.\n */\n public async reorderBlocks(blocks: string[], author?: AuthorMarker): Promise<void> {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n const currentStructure = mut.structure;\n if (currentStructure.groups.length !== 1)\n throw new Error('Unexpected project structure, non-sinular block group');\n const currentGroup = currentStructure.groups[0];\n if (currentGroup.blocks.length !== blocks.length)\n throw new Error(`Lengh mismatch: ${currentGroup.blocks.length} !== ${blocks.length}`);\n if (new Set<string>(blocks).size !== blocks.length) throw new Error(`Repeated block ids`);\n const newStructure: ProjectStructure = {\n groups: [\n {\n id: currentGroup.id,\n label: currentGroup.label,\n blocks: blocks.map((blockId) => {\n const block = currentGroup.blocks.find((b) => b.id === blockId);\n if (block === undefined) throw new Error(`Can't find block: ${blockId}`);\n return block;\n })\n }\n ]\n };\n mut.updateStructure(newStructure);\n });\n await this.projectTree.refreshState();\n }\n\n /**\n * Renders production part of the block starting all connected heavy computations.\n * Upstream blocks of the specified block will be started automatically if in\n * stale state.\n * */\n public async runBlock(blockId: string): Promise<void> {\n await withProject(this.env.pl, this.rid, (mut) => mut.renderProduction([blockId], true));\n await this.projectTree.refreshState();\n }\n\n /**\n * Stops the block if it is running by destroying its production state. All\n * its downstreams will also be destroyed or moved to limbo if already\n * calculated.\n * */\n public async stopBlock(blockId: string): Promise<void> {\n await withProject(this.env.pl, this.rid, (mut) => mut.stopProduction(blockId));\n await this.projectTree.refreshState();\n }\n\n // /** Update block label. */\n // public async setBlockLabel(blockId: string, label: string, author?: AuthorMarker) {\n // await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n // mut.setBlockLabel(blockId, label);\n // });\n // await this.projectTree.refreshState();\n // }\n\n /**\n * Sets block args, and changes whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgs(blockId: string, args: any, author?: AuthorMarker) {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.setArgs([{ blockId, args: JSON.stringify(args) }])\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets ui block state associated with the block.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setUiState(blockId: string, uiState: unknown, author?: AuthorMarker) {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) =>\n mut.setUiState(blockId, uiState === undefined ? undefined : JSON.stringify(uiState))\n );\n await this.projectTree.refreshState();\n }\n\n /**\n * Sets navigation state.\n * */\n public async setNavigationState(blockId: string, state: NavigationState): Promise<void> {\n this.navigationStates.setState(blockId, state);\n }\n\n /**\n * Sets block args and ui state, and changes the whole project state accordingly.\n * Along with setting arguments one can specify author marker, that will be\n * transactionally associated with the block, to facilitate conflict resolution\n * in collaborative editing scenario.\n * */\n public async setBlockArgsAndUiState(\n blockId: string,\n args: unknown,\n uiState: unknown,\n author?: AuthorMarker\n ) {\n await withProjectAuthored(this.env.pl, this.rid, author, (mut) => {\n mut.setArgs([{ blockId, args: JSON.stringify(args) }]);\n mut.setUiState(blockId, JSON.stringify(uiState));\n });\n await this.projectTree.refreshState();\n }\n\n /** Update block settings */\n public async setBlockSettings(blockId: string, newValue: BlockSettings) {\n await withProjectAuthored(this.env.pl, this.rid, undefined, (mut) => {\n mut.setBlockSettings(blockId, newValue);\n });\n await this.projectTree.refreshState();\n }\n\n /** Resets arguments and ui state of the block to initial state */\n public async resetBlockArgsAndUiState(blockId: string, author?: AuthorMarker): Promise<void> {\n await this.env.pl.withWriteTx('BlockInputsReset', async (tx) => {\n // reading default arg values from block pack\n const bpHolderRid = ensureResourceIdNotNull(\n (await tx.getField(field(this.rid, projectFieldName(blockId, 'blockPack')))).value\n );\n const bpRid = ensureResourceIdNotNull(\n (await tx.getField(field(bpHolderRid, Pl.HolderRefField))).value\n );\n const bpData = await tx.getResourceData(bpRid, false);\n const bpInfo = JSON.parse(\n Buffer.from(notEmpty(bpData.data)).toString('utf-8')\n ) as BlockPackInfo;\n await withProjectAuthored(tx, this.rid, author, (prj) => {\n prj.setArgs([{ blockId, args: JSON.stringify(bpInfo.config.initialArgs) }]);\n prj.setUiState(blockId, undefined);\n });\n await tx.commit();\n });\n await this.projectTree.refreshState();\n }\n\n private getBlockComputables(blockId: string): BlockStateComputables {\n const cached = this.blockComputables.get(blockId);\n if (cached === undefined) {\n // state consists of inputs (args + ui state) and outputs\n const outputs = blockOutputs(this.projectTree.entry(), blockId, this.env);\n const fullState = Computable.make(\n (ctx) => ({\n argsAndUiState: blockArgsAndUiState(this.projectTree.entry(), blockId, ctx),\n outputs,\n navigationState: this.navigationStates.getState(blockId)\n }),\n {\n postprocessValue: (v) =>\n ({\n ...v.argsAndUiState,\n outputs: v.outputs,\n navigationState: v.navigationState\n }) as BlockStateInternal\n }\n );\n\n const computables: BlockStateComputables = {\n fullState: fullState.withPreCalculatedValueTree()\n };\n\n this.blockComputables.set(blockId, computables);\n\n return computables;\n }\n return cached;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch full block state,\n * including outputs, arguments, ui state.\n * */\n public getBlockState(blockId: string): Computable<BlockStateInternal> {\n return this.getBlockComputables(blockId).fullState;\n }\n\n /**\n * Returns a computable, that can be used to retrieve and watch path of the\n * folder containing frontend code.\n * */\n public getBlockFrontend(blockId: string): ComputableStableDefined<FrontendData> {\n const cached = this.blockFrontends.get(blockId);\n if (cached === undefined) {\n const fd = frontendData(\n this.projectTree.entry(),\n blockId,\n this.env\n ).withPreCalculatedValueTree();\n this.blockFrontends.set(blockId, fd);\n return fd;\n }\n return cached;\n }\n\n /** Called by middle layer on close */\n public async destroy(): Promise<void> {\n // terminating the project service loop\n this.destroyed = true;\n this.abortController.abort();\n await this.refreshLoopResult;\n\n // terminating the synchronized project tree\n await this.projectTree.terminate();\n\n // the following will deregister all external resource holders, like\n // downloaded files, running uploads and alike\n this.overview.resetState();\n this.blockFrontends.forEach((c) => c.resetState());\n this.blockComputables.forEach((c) => {\n c.fullState.resetState();\n });\n this.activeConfigs.resetState();\n }\n\n /** @deprecated */\n public async destroyAndAwaitTermination(): Promise<void> {\n await this.destroy();\n }\n\n public static async init(env: MiddleLayerEnvironment, rid: ResourceId): Promise<Project> {\n // Doing a no-op mutation to apply all migration and schema fixes\n await withProject(env.pl, rid, (_) => {});\n\n // Loading project tree\n const projectTree = await SynchronizedTreeState.init(\n env.pl,\n rid,\n {\n ...env.ops.defaultTreeOptions,\n pruning: projectTreePruning\n },\n env.logger\n );\n \n return new Project(env, rid, projectTree);\n }\n}\n\nfunction projectTreePruning(r: ExtendedResourceData): FieldData[] {\n // console.log(\n // JSON.stringify(\n // { ...r, kv: [], data: undefined } satisfies ExtendedResourceData,\n // (_, v) => {\n // if (typeof v === 'bigint') return v.toString();\n // return v;\n // }\n // )\n // );\n switch (r.type.name) {\n case 'BlockPackCustom':\n return r.fields.filter((f) => f.name !== 'template');\n case 'UserProject':\n return r.fields.filter((f) => !f.name.startsWith('__serviceTemplate'));\n case 'Blob':\n return [];\n default:\n return r.fields;\n }\n}\n","import { TemporalSynchronizedTreeOps } from './types';\nimport {\n DefaultVirtualLocalStorages,\n DownloadBlobToURLDriverOps,\n DownloadDriverOps,\n OpenFileDialogCallback,\n VirtualLocalStorageSpec\n} from '@milaboratories/pl-drivers';\nimport { UploadDriverOps } from '@milaboratories/pl-drivers';\nimport { LogsStreamDriverOps } from '@milaboratories/pl-drivers';\nimport { ConsoleLoggerAdapter, MiLogger } from '@milaboratories/ts-helpers';\nimport { LocalStorageProjection } from '@milaboratories/pl-drivers';\nimport path from 'node:path';\n\n/** Paths part of {@link DriverKitOps}. */\nexport type DriverKitOpsPaths = {\n /** Common root where to put downloaded blobs / downloaded blob cache */\n readonly blobDownloadPath: string;\n\n /** Common root where to put downloaded blobs with */\n readonly downloadBlobToURLPath: string;\n\n /**\n * List of pl storages that have projections in local file system.\n *\n * This option affect two drivers:\n *\n * (1) LS driver generates \"index\" handles instead of \"upload\" for paths inside those locations\n *\n * (2) Download driver directly serves content retrieval requests for blobs from listed storages,\n * and don't apply any caching for such blobs (i.e. preventing duplication of files for Downloaded\n * type handles, making OnDemand and Downloaded handles equivalent)\n *\n * */\n readonly localProjections: LocalStorageProjection[];\n\n /**\n * List of virtual storages that will allow homogeneous access to local FSs through LS API.\n * If undefined, default list will be created.\n * */\n readonly virtualLocalStoragesOverride?: VirtualLocalStorageSpec[];\n};\n\n/** Options required to initialize full set of middle layer driver kit */\nexport type DriverKitOpsSettings = {\n //\n // Common\n //\n\n readonly logger: MiLogger;\n\n //\n // Signer\n //\n\n /**\n * Local secret, that is used to sign and verify different pieces of information\n * that can be used to access local data, like local paths for ongoing uploads.\n *\n * Use {@link MiddleLayer.generateLocalSecret} to generate sufficiently random string.\n * */\n readonly localSecret: string;\n\n //\n // Blob Driver\n //\n\n /**\n * Settings related to the download driver making operations with blobs. This driver is also used\n * to download logs when source process terminates and log terns into a blob\n */\n readonly blobDriverOps: DownloadDriverOps;\n\n //\n // Blob To URL Driver\n //\n\n readonly downloadBlobToURLDriverOps: DownloadBlobToURLDriverOps;\n\n //\n // Upload Driver\n //\n\n /**\n * Settings related to the upload driver that actually performs upload and helps render upload\n * and indexing progresses from related pl resources.\n * */\n readonly uploadDriverOps: UploadDriverOps;\n\n //\n // Log streaming ops\n // (static logs are served via the blob driver)\n //\n\n /** Settings related to the streaming log driver */\n readonly logStreamDriverOps: LogsStreamDriverOps;\n\n //\n // LS Driver\n //\n\n /**\n * Callback to access system file open dialog, must be provided by the environment,\n * to allow for {@link showOpenSingleFileDialog} / {@link showOpenMultipleFilesDialog}\n * calls from the UI.\n */\n readonly openFileDialogCallback: OpenFileDialogCallback;\n};\n\nexport type DriverKitOps = DriverKitOpsPaths & DriverKitOpsSettings;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultDriverKitOpsSettings: Pick<\n DriverKitOpsSettings,\n | 'logger'\n | 'blobDriverOps'\n | 'downloadBlobToURLDriverOps'\n | 'uploadDriverOps'\n | 'logStreamDriverOps'\n> = {\n logger: new ConsoleLoggerAdapter(),\n blobDriverOps: {\n cacheSoftSizeBytes: 100 * 1024 * 1024, // 100MB\n nConcurrentDownloads: 10\n },\n downloadBlobToURLDriverOps: {\n cacheSoftSizeBytes: 100 * 1024 * 1024, // 100MB\n nConcurrentDownloads: 10\n },\n uploadDriverOps: {\n nConcurrentPartUploads: 10,\n nConcurrentGetProgresses: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000\n },\n logStreamDriverOps: {\n nConcurrentGetLogs: 10,\n pollingInterval: 1000,\n stopPollingDelay: 1000\n }\n};\n\nexport function DefaultDriverKitOpsPaths(\n workDir: string\n): Pick<DriverKitOpsPaths,\n | 'blobDownloadPath'\n | 'downloadBlobToURLPath'> {\n return {\n blobDownloadPath: path.join(workDir, 'download'),\n downloadBlobToURLPath: path.join(workDir, 'downloadToURL')\n };\n}\n\n/** Fields with default values are marked as optional here. */\n// prettier-ignore\nexport type DriverKitOpsConstructor =\n Omit<DriverKitOpsSettings, keyof typeof DefaultDriverKitOpsSettings>\n & Partial<typeof DefaultDriverKitOpsSettings>\n & Omit<DriverKitOpsPaths, keyof ReturnType<typeof DefaultDriverKitOpsPaths>>\n & Partial<ReturnType<typeof DefaultDriverKitOpsPaths>>;\n\nexport type MiddleLayerOpsPaths = DriverKitOpsPaths & {\n /** Common root where to put frontend code. */\n readonly frontendDownloadPath: string;\n};\n\n/** Configuration controlling different aspects of middle layer behaviour. */\nexport type MiddleLayerOpsSettings = DriverKitOpsSettings & {\n /** Contain temporal options controlling how often should pl trees be\n * synchronized with the pl server. */\n readonly defaultTreeOptions: TemporalSynchronizedTreeOps;\n\n /** Defines interval in milliseconds for running periodic project maintenance job.\n * Project maintenance includes gradual staging rendering and cached outputs cleanup. */\n readonly projectRefreshInterval: number;\n\n /** This controls average number of block staging states that are rendered per\n * second during project maintenance job execution. */\n readonly stagingRenderingRate: number;\n\n /** How often to check for dev block updates */\n readonly devBlockUpdateRecheckInterval: number;\n\n /** Prioritize this channel if update is available in this block */\n readonly preferredUpdateChannel?: string;\n};\n\nexport type MiddleLayerOps = MiddleLayerOpsSettings & MiddleLayerOpsPaths;\n\n/** Some defaults fot MiddleLayerOps. */\nexport const DefaultMiddleLayerOpsSettings: Pick<\n MiddleLayerOps,\n | keyof typeof DefaultDriverKitOpsSettings\n | 'defaultTreeOptions'\n | 'projectRefreshInterval'\n | 'stagingRenderingRate'\n | 'devBlockUpdateRecheckInterval'\n> = {\n ...DefaultDriverKitOpsSettings,\n defaultTreeOptions: {\n pollingInterval: 350,\n stopPollingDelay: 2500\n },\n devBlockUpdateRecheckInterval: 1000,\n projectRefreshInterval: 700,\n stagingRenderingRate: 5\n};\n\nexport function DefaultMiddleLayerOpsPaths(\n workDir: string\n): Pick<\n MiddleLayerOpsPaths,\n keyof ReturnType<typeof DefaultDriverKitOpsPaths> | 'frontendDownloadPath'\n> {\n return {\n ...DefaultDriverKitOpsPaths(workDir),\n frontendDownloadPath: path.join(workDir, 'frontend')\n };\n}\n\nexport type MiddleLayerOpsConstructor = Omit<\n MiddleLayerOpsSettings,\n keyof typeof DefaultMiddleLayerOpsSettings\n> &\n Partial<typeof DefaultMiddleLayerOpsSettings> &\n Omit<MiddleLayerOpsPaths, keyof Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>> &\n Partial<Awaited<ReturnType<typeof DefaultMiddleLayerOpsPaths>>>;\n","// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","const {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","const SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","const parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","const parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","const SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","const parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // Otherwise it can be determined by checking the high version\n\n if (highVersion.patch) {\n // anything higher than a patch bump would result in the wrong version\n return 'patch'\n }\n\n if (highVersion.minor) {\n // anything higher than a minor bump would result in the wrong version\n return 'minor'\n }\n\n // bumping major/minor/patch all have same result\n return 'major'\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","const SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","const SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","const SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","const parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","const compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","const compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","const SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","const compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","const compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","const eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","const SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","class LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","const SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","const ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","const Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","const Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","const Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","const SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","const outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","const Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","const Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","import { PollComputablePool, PollPoolOps } from '@milaboratories/computable';\nimport {\n AnyChannel,\n BlockPackFromRegistryV2,\n blockPackIdToString,\n BlockPackSpec,\n BlockSettings,\n UpdateSuggestions,\n StableChannel\n} from '@milaboratories/pl-model-middle-layer';\nimport { Dispatcher } from 'undici';\nimport { getDevV1PacketMtime, getDevV2PacketMtime } from './registry';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport { MiLogger } from '@milaboratories/ts-helpers';\nimport { V2RegistryProvider } from './registry-v2-provider';\nimport semver from 'semver';\nimport canonicalize from 'canonicalize';\n\nexport const DefaultBlockUpdateWatcherOps: PollPoolOps = {\n minDelay: 1500\n};\n\nexport type BlockUpdateWatcherOps = Partial<PollPoolOps> & {\n readonly http?: Dispatcher;\n readonly preferredUpdateChannel?: string;\n};\n\nconst NoUpdatesKey = '__no_updates__';\n\nexport type CheckForUpdateRequest = {\n currentSpec: BlockPackSpec;\n settings: BlockSettings;\n};\n\nexport type CheckForUpdateResponse = {\n suggestions: UpdateSuggestions;\n mainSuggestion?: BlockPackSpec;\n};\n\nexport class BlockUpdateWatcher extends PollComputablePool<\n CheckForUpdateRequest,\n CheckForUpdateResponse\n> {\n private readonly http?: Dispatcher;\n private readonly preferredUpdateChannel?: string;\n\n constructor(\n private readonly registryProvider: V2RegistryProvider,\n logger: MiLogger,\n ops: BlockUpdateWatcherOps = {}\n ) {\n super({ ...ops, ...DefaultBlockUpdateWatcherOps }, logger);\n this.http = ops.http;\n this.preferredUpdateChannel = ops.preferredUpdateChannel;\n }\n\n protected getKey(req: CheckForUpdateRequest): string {\n switch (req.currentSpec.type) {\n case 'dev-v1':\n return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'dev-v2':\n return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;\n case 'from-registry-v2':\n return `from_registry_v2_${canonicalize(req)!}`;\n default:\n return NoUpdatesKey;\n }\n }\n\n protected async readValue(req: CheckForUpdateRequest): Promise<CheckForUpdateResponse> {\n try {\n const cSpec = req.currentSpec;\n switch (cSpec.type) {\n case 'dev-v1': {\n try {\n const mtime = await getDevV1PacketMtime(cSpec.folder);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'dev-v2': {\n try {\n const description = await tryLoadPackDescription(cSpec.folder, this.logger);\n if (description === undefined) return { suggestions: [] };\n const mtime = await getDevV2PacketMtime(description);\n if (mtime === cSpec.mtime) return { suggestions: [] };\n else return { mainSuggestion: { ...cSpec, mtime: mtime }, suggestions: [] };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n case 'from-registry-v2': {\n try {\n const { versionLock, skipVersion } = req.settings;\n if (versionLock === 'patch') return { suggestions: [] };\n const registry = this.registryProvider.getRegistry(cSpec.registryUrl);\n let spec: BlockPackSpec | undefined;\n let channel: string | undefined = this.preferredUpdateChannel;\n\n if (channel === undefined) {\n if (cSpec.channel === undefined) {\n const a1 = await registry.getLatestOverview(cSpec.id, StableChannel);\n if (a1) channel = StableChannel;\n else {\n // forcing update from non-existent channel to stable\n const a2 = await registry.getLatestOverview(cSpec.id, AnyChannel);\n if (a2 === undefined) {\n this.logger.error(\n `No \"any\" channel record for ${blockPackIdToString(cSpec.id)}`\n );\n return { suggestions: [] };\n }\n channel = AnyChannel;\n }\n } else channel = cSpec.channel;\n }\n\n const vSuggestions = await registry.getUpdateSuggestions(cSpec.id, channel);\n if (vSuggestions === undefined || vSuggestions.length === 0) return { suggestions: [] };\n\n // from major to patch\n vSuggestions.reverse();\n\n let vMainSuggestion: string | undefined = undefined;\n switch (versionLock) {\n case undefined:\n vMainSuggestion = vSuggestions[0].update;\n break;\n case 'major':\n vMainSuggestion = vSuggestions.find((v) => v.type !== 'major')?.update;\n break;\n case 'minor':\n vMainSuggestion = vSuggestions.find((v) => v.type === 'patch')?.update;\n break;\n }\n\n const suggestions: UpdateSuggestions = vSuggestions.map(({ type, update }) => ({\n type,\n update: { ...cSpec, id: { ...cSpec.id, version: update } }\n }));\n\n if (vMainSuggestion === undefined) return { suggestions };\n if (skipVersion !== undefined && semver.lte(vMainSuggestion, skipVersion))\n return { suggestions };\n\n const mainSuggestion: BlockPackFromRegistryV2 = {\n ...cSpec,\n id: { ...cSpec.id, version: vMainSuggestion }\n };\n\n // warming cache\n void (async () => {\n try {\n await registry.getComponents(mainSuggestion.id);\n } catch (e: unknown) {\n this.logger.warn(e);\n }\n })();\n\n return { suggestions, mainSuggestion };\n } catch (err: unknown) {\n this.logger.warn(err);\n return { suggestions: [] };\n }\n }\n\n default:\n return { suggestions: [] };\n }\n } catch (e: unknown) {\n this.logger.warn(e);\n return { suggestions: [] };\n }\n }\n\n protected resultsEqual(res1: CheckForUpdateResponse, res2: CheckForUpdateResponse): boolean {\n return canonicalize(res1) === canonicalize(res2);\n // if (res1 === undefined && res2 === undefined) return true;\n // if (res1 === undefined || res2 === undefined) return false;\n // if (res1.type !== res2.type) return false;\n // switch (res1.type) {\n // case 'from-registry-v1':\n // if (res2.type !== 'from-registry-v1') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'from-registry-v2':\n // if (res2.type !== 'from-registry-v2') return false;\n // return res1.registryUrl === res2.registryUrl && blockPackIdEquals(res1.id, res2.id);\n // case 'dev-v1':\n // if (res2.type !== 'dev-v1') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // case 'dev-v2':\n // if (res2.type !== 'dev-v2') return false;\n // return res1.folder === res2.folder && res1.mtime === res2.mtime;\n // default:\n // assertNever(res1);\n // }\n }\n}\n","/**\n * Function associated with particular entry from the RefCountResourcePool.\n *\n * Calling the function will release the reference acquired when object was\n * retieved from the pool.\n */\nexport type UnrefFn = () => void;\n\nexport interface PollResource<R> {\n /** Resource itself */\n readonly resource: R;\n\n /** Resource key, calculated using provided */\n readonly key: string;\n\n /** Callback to be called when requested resource can be disposed. */\n readonly unref: UnrefFn;\n}\n\nexport abstract class RefCountResourcePool<P, R> {\n private readonly resources = new Map<string, RefCountEnvelop<R>>();\n protected abstract createNewResource(params: P): R;\n protected abstract calculateParamsKey(params: P): string;\n\n private check(key: string) {\n const envelop = this.resources.get(key);\n if (envelop === undefined) throw new Error('Unexpected state.');\n if (envelop.refCount === 0) {\n this.resources.delete(key);\n\n // TODO: we can postpone this operation, and run it in the background\n const res: any = envelop.resource;\n if (res !== undefined && res !== null && typeof res[Symbol.dispose] === 'function')\n res[Symbol.dispose]();\n }\n }\n\n public acquire(params: P): PollResource<R> {\n const key = this.calculateParamsKey(params);\n let envelop = this.resources.get(key);\n if (envelop === undefined) {\n envelop = { refCount: 0, resource: this.createNewResource(params) };\n this.resources.set(key, envelop);\n }\n\n // adding ref count\n envelop.refCount++;\n\n let unrefereced = false;\n return {\n resource: envelop.resource,\n key,\n unref: () => {\n if (unrefereced) return; // unref is idempotent, calling it many times have no effect\n // subtracting ref count\n envelop.refCount--;\n unrefereced = true;\n this.check(key);\n }\n };\n }\n\n public getByKey(key: string): R {\n if (!this.resources.has(key)) throw new Error(`resource not found, key = ${key}`);\n return this.resources.get(key)!.resource;\n }\n\n public tryGetByKey(key: string): R | undefined {\n return this.resources.get(key)?.resource;\n }\n}\n\ntype RefCountEnvelop<R> = {\n refCount: number;\n readonly resource: R;\n};\n","export type MlDebugFlags = {\n logPFrameRequests: boolean;\n usePFrameRs: boolean;\n logTreeStats?: 'cumulative' | 'per-request';\n};\n\nlet flags: MlDebugFlags | undefined = undefined;\nexport function getDebugFlags() {\n if (flags) return flags;\n flags = {\n logPFrameRequests: process.env.MI_LOG_PFRAMES !== undefined,\n usePFrameRs: process.env.MI_USE_PFRAMES_RS !== undefined,\n };\n if (process.env.MI_LOG_TREE_STAT)\n flags.logTreeStats\n = process.env.MI_LOG_TREE_STAT === 'cumulative' ? 'cumulative' : 'per-request';\n return flags;\n}\n","import type { DownloadDriver } from '@milaboratories/pl-drivers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';\nimport { isPlTreeNodeAccessor } from '@milaboratories/pl-tree';\nimport type { ComputableCtx, ComputableStableDefined } from '@milaboratories/computable';\nimport type {\n CalculateTableDataRequest,\n CalculateTableDataResponse,\n FindColumnsRequest,\n FindColumnsResponse,\n LocalBlobHandleAndSize,\n PColumnIdAndSpec,\n PColumnSpec,\n PFrameHandle,\n PObjectId,\n PTableColumnSpec,\n PTableHandle,\n PTableShape,\n PTableVector,\n TableRange,\n UniqueValuesRequest,\n UniqueValuesResponse,\n PFrameDriver as SdkPFrameDriver,\n PColumn,\n PFrameDef,\n JoinEntry,\n PTableDef,\n ValueType,\n PTableRecordSingleValueFilterV2,\n PTableRecordFilter,\n PColumnValues } from '@platforma-sdk/model';\nimport {\n mapPObjectData,\n mapPTableDef,\n extractAllColumns,\n} from '@platforma-sdk/model';\nimport { RefCountResourcePool } from './ref_count_pool';\nimport { allBlobs, makeDataInfoResource, mapBlobs, parseDataInfoResource } from './data';\nimport { createHash } from 'node:crypto';\nimport type { MiLogger } from '@milaboratories/ts-helpers';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport canonicalize from 'canonicalize';\nimport { PFrame } from '@milaboratories/pframes-node';\nimport { PFrame as PFrameRs } from '@milaboratories/pframes-rs-node';\nimport * as fsp from 'node:fs/promises';\nimport { LRUCache } from 'lru-cache';\nimport { ConcurrencyLimitingExecutor } from '@milaboratories/ts-helpers';\nimport { getDebugFlags } from '../debug';\n\nfunction blobKey(res: ResourceInfo): string {\n return String(res.id);\n}\n\ntype InternalPFrameData = PFrameDef<PFrameInternal.DataInfo<ResourceInfo>>;\n\nconst valueTypes: ValueType[] = ['Int', 'Long', 'Float', 'Double', 'String', 'Bytes'] as const;\n\nfunction migrateFilters(filters: PTableRecordFilter[]): PTableRecordSingleValueFilterV2[] {\n const filtersV1 = [];\n const filtersV2: PTableRecordSingleValueFilterV2[] = [];\n for (const filter of filters) {\n if ((filter.type as unknown) === 'bySingleColumn') {\n filtersV1.push(filter);\n filtersV2.push({\n ...filter,\n type: 'bySingleColumnV2',\n });\n } else {\n filtersV2.push(filter);\n }\n }\n if (filtersV1.length > 0) {\n const filtersV1Json = JSON.stringify(filtersV1);\n console.warn(\n `type overriten from 'bySingleColumn' to 'bySingleColumnV2' for filters: ${filtersV1Json}`,\n );\n }\n return filters;\n}\n\nconst bigintReplacer = (_: string, v: unknown) => (typeof v === 'bigint' ? v.toString() : v);\n\nclass PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {\n public readonly rustPFrame: PFrameInternal.PFrameV2;\n public readonly specPFrame: PFrameInternal.PFrameV2;\n private readonly blobIdToResource = new Map<string, ResourceInfo>();\n private readonly blobHandleComputables = new Map<\n string,\n ComputableStableDefined<LocalBlobHandleAndSize>\n >();\n\n private readonly createDataPFrame: () => PFrameInternal.PFrameV2;\n public get disposableDataPFrame() {\n const dataPFrame = this.createDataPFrame();\n return {\n dataPFrame,\n [Symbol.dispose]: () => {\n dataPFrame.dispose();\n },\n };\n }\n\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n private readonly blobContentCache: LRUCache<string, Uint8Array>,\n columns: InternalPFrameData,\n ) {\n const logFunc: PFrameInternal.Logger = (level: 'info' | 'warn' | 'error', message: string) => {\n switch (level) {\n default:\n case 'info':\n return this.logger.info(message);\n case 'warn':\n return this.logger.warn(message);\n case 'error':\n return this.logger.error(message);\n }\n };\n\n for (const column of columns) {\n for (const blob of allBlobs(column.data)) {\n this.blobIdToResource.set(blobKey(blob), blob);\n }\n }\n const distinct_columns = [\n ...new Map(columns.map((column) => ({\n ...column,\n data: mapBlobs(column.data, blobKey),\n })).map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ];\n\n this.rustPFrame = ((): PFrameInternal.PFrameV2 => {\n try {\n const pFrame = new PFrameRs(getDebugFlags().logPFrameRequests ? logFunc : undefined);\n pFrame.setDataSource(this);\n for (const column of distinct_columns) {\n pFrame.addColumnSpec(column.id, column.spec);\n pFrame.setColumnData(column.id, column.data);\n }\n return pFrame;\n } catch (err: unknown) {\n throw new Error(\n `Rust PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,\n );\n }\n })();\n\n this.specPFrame = ((): PFrameInternal.PFrameV2 => {\n try {\n const pFrame = getDebugFlags().logPFrameRequests ? new PFrame(logFunc) : new PFrame();\n for (const column of distinct_columns) {\n try {\n pFrame.addColumnSpec(column.id, column.spec);\n } catch (err: unknown) {\n throw new Error(\n `Adding column ${column.id} to PFrame failed: ${err as Error}; Spec: ${JSON.stringify(column.spec)}.`,\n );\n }\n }\n return pFrame;\n } catch (err: unknown) {\n throw new Error(\n `Spec PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,\n );\n }\n })();\n\n this.createDataPFrame = (): PFrameInternal.PFrameV2 => {\n try {\n const pFrame = getDebugFlags().logPFrameRequests ? new PFrame(logFunc) : new PFrame();\n pFrame.setDataSource(this);\n for (const column of distinct_columns) {\n try {\n pFrame.addColumnSpec(column.id, column.spec);\n pFrame.setColumnData(column.id, column.data);\n } catch (err: unknown) {\n throw new Error(\n `Adding column ${column.id} to PFrame failed: ${err as Error}; Spec: ${JSON.stringify(column.spec)}, DataInfo: ${JSON.stringify(column.data)}.`,\n );\n }\n }\n return pFrame;\n } catch (err: unknown) {\n throw new Error(\n `Data PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,\n );\n }\n };\n }\n\n private getOrCreateComputableForBlob(blobId: string) {\n let computable = this.blobHandleComputables.get(blobId);\n if (computable !== undefined) return computable;\n\n const blobResource = this.blobIdToResource.get(blobId);\n if (blobResource === undefined) throw new Error(`Blob with id ${blobId} not found.`);\n\n // precalculation of value tree will trigger the download proecess right away\n computable = this.blobDriver.getDownloadedBlob(blobResource).withPreCalculatedValueTree();\n\n this.blobHandleComputables.set(blobId, computable);\n\n return computable;\n }\n\n public readonly preloadBlob = async (blobIds: string[]): Promise<void> => {\n const computables = blobIds.map((blobId) => this.getOrCreateComputableForBlob(blobId));\n for (const computable of computables) await computable.awaitStableFullValue();\n };\n\n public readonly resolveBlob = async (blobId: string): Promise<string> => {\n const computable = this.getOrCreateComputableForBlob(blobId);\n return this.blobDriver.getLocalPath((await computable.awaitStableValue()).handle);\n };\n\n public readonly resolveBlobContent = async (blobId: string): Promise<Uint8Array> => {\n try {\n const computable = this.getOrCreateComputableForBlob(blobId);\n const path = this.blobDriver.getLocalPath((await computable.awaitStableValue()).handle);\n return await this.blobContentCache.forceFetch(path);\n } catch (err: unknown) {\n const error = JSON.stringify(err);\n console.log(`resolveBlobContent catched error: ${error}`);\n throw err;\n }\n };\n\n [Symbol.dispose](): void {\n for (const computable of this.blobHandleComputables.values()) computable.resetState();\n this.rustPFrame.dispose();\n this.specPFrame.dispose();\n }\n}\n\ntype FullPTableDef = {\n pFrameHandle: PFrameHandle;\n def: PTableDef<PObjectId>;\n};\n\nexport class PFrameDriver implements SdkPFrameDriver {\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>;\n private readonly pTables: RefCountResourcePool<FullPTableDef, Promise<PFrameInternal.PTableV2>>;\n private readonly blobContentCache: LRUCache<string, Uint8Array>;\n /** Limits concurrent requests to PFrame API to prevent deadlock with Node's IO threads */\n private readonly concurrencyLimiter: ConcurrencyLimitingExecutor;\n\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n ) {\n const blobContentCache = new LRUCache<string, Uint8Array>({\n maxSize: 1_000_000_000, // 1Gb\n fetchMethod: async (key) => await fsp.readFile(key),\n sizeCalculation: (v) => v.length,\n });\n this.blobContentCache = blobContentCache;\n\n const concurrencyLimiter = new ConcurrencyLimitingExecutor(1);\n this.concurrencyLimiter = concurrencyLimiter;\n\n this.pFrames = new (class extends RefCountResourcePool<InternalPFrameData, PFrameHolder> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: MiLogger,\n ) {\n super();\n }\n\n protected createNewResource(params: InternalPFrameData): PFrameHolder {\n if (getDebugFlags().logPFrameRequests)\n logger.info(\n `PFrame creation (pFrameHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n return new PFrameHolder(this.blobDriver, this.logger, blobContentCache, params);\n }\n\n protected calculateParamsKey(params: InternalPFrameData): string {\n return stableKeyFromPFrameData(params);\n }\n })(this.blobDriver, this.logger);\n\n this.pTables = new (class extends RefCountResourcePool<\n FullPTableDef,\n Promise<PFrameInternal.PTableV2>\n > {\n constructor(\n private readonly pFrames: RefCountResourcePool<InternalPFrameData, PFrameHolder>,\n ) {\n super();\n }\n\n protected async createNewResource(params: FullPTableDef): Promise<PFrameInternal.PTableV2> {\n const handle: PFrameHandle = params.pFrameHandle;\n const rawPTable = await concurrencyLimiter.run(async () => {\n if (getDebugFlags().logPFrameRequests)\n logger.info(\n `PTable creation (pTableHandle = ${this.calculateParamsKey(params)}): ${JSON.stringify(params, bigintReplacer)}`,\n );\n using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;\n return await disposableDataPFrame.dataPFrame.createTable({\n src: joinEntryToInternal(params.def.src),\n filters: migrateFilters(params.def.filters),\n });\n });\n return params.def.sorting.length !== 0 ? rawPTable.sort(params.def.sorting) : rawPTable;\n }\n\n protected calculateParamsKey(params: FullPTableDef): string {\n return stableKeyFromFullPTableDef(params);\n }\n })(this.pFrames);\n }\n\n //\n // Internal / Config API Methods\n //\n\n public createPFrame(\n def: PFrameDef<PlTreeNodeAccessor | PColumnValues>,\n ctx: ComputableCtx,\n ): PFrameHandle {\n const internalData = def\n .filter((c) => valueTypes.find((t) => t === c.spec.valueType))\n .map((c) =>\n mapPObjectData(c, (d) =>\n isPlTreeNodeAccessor(d) ? parseDataInfoResource(d) : makeDataInfoResource(c.spec, d),\n ),\n );\n const res = this.pFrames.acquire(internalData);\n ctx.addOnDestroy(res.unref);\n return res.key as PFrameHandle;\n }\n\n public createPTable(\n def: PTableDef<PColumn<PlTreeNodeAccessor | PColumnValues>>,\n ctx: ComputableCtx,\n ): PTableHandle {\n const pFrameHandle = this.createPFrame(extractAllColumns(def.src), ctx);\n const defIds = mapPTableDef(def, (c) => c.id);\n const res = this.pTables.acquire({ def: defIds, pFrameHandle });\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Create PTable call (pFrameHandle = ${pFrameHandle}; pTableHandle = ${JSON.stringify(res)}): ${JSON.stringify(\n mapPTableDef(def, (c) => c.spec),\n bigintReplacer,\n )}`,\n );\n ctx.addOnDestroy(res.unref); // in addition to pframe unref added in createPFrame above\n return res.key as PTableHandle;\n }\n\n //\n // PFrame istance methods\n //\n\n public async findColumns(\n handle: PFrameHandle,\n request: FindColumnsRequest,\n ): Promise<FindColumnsResponse> {\n const iRequest: PFrameInternal.FindColumnsRequest = {\n ...request,\n compatibleWith:\n request.compatibleWith.length !== 0\n ? [{\n axesSpec: [\n ...new Map(request.compatibleWith.map(\n (item) => [canonicalize(item)!, item] as const,\n )).values(),\n ],\n qualifications: [],\n }]\n : [],\n };\n const responce = getDebugFlags().usePFrameRs\n ? await this.pFrames.getByKey(handle).rustPFrame.findColumns(iRequest)\n : await this.concurrencyLimiter.run(\n async () => await this.pFrames.getByKey(handle).specPFrame.findColumns(iRequest),\n );\n return {\n hits: responce.hits\n .filter((h) => // only exactly matching columns\n h.mappingVariants.length === 0\n || h.mappingVariants.some((v) =>\n v.qualifications.forHit.length === 0\n && v.qualifications.forQueries.every((q) => q.length === 0)))\n .map((h) => h.hit),\n };\n }\n\n public async getColumnSpec(handle: PFrameHandle, columnId: PObjectId): Promise<PColumnSpec> {\n return getDebugFlags().usePFrameRs\n ? await this.pFrames.getByKey(handle).rustPFrame.getColumnSpec(columnId)\n : await this.concurrencyLimiter.run(\n async () => await this.pFrames.getByKey(handle).specPFrame.getColumnSpec(columnId),\n );\n }\n\n public async listColumns(handle: PFrameHandle): Promise<PColumnIdAndSpec[]> {\n return getDebugFlags().usePFrameRs\n ? await this.pFrames.getByKey(handle).rustPFrame.listColumns()\n : await this.concurrencyLimiter.run(\n async () => await this.pFrames.getByKey(handle).specPFrame.listColumns(),\n );\n }\n\n public async calculateTableData(\n handle: PFrameHandle,\n request: CalculateTableDataRequest<PObjectId>,\n ): Promise<CalculateTableDataResponse> {\n let table = await this.concurrencyLimiter.run(async () => {\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Call calculateTableData, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;\n return await disposableDataPFrame.dataPFrame.createTable({\n src: joinEntryToInternal(request.src),\n filters: migrateFilters(request.filters),\n });\n });\n\n if (request.sorting.length > 0) {\n const sortedTable = await this.concurrencyLimiter.run(\n async () => await table.sort(request.sorting),\n );\n table.dispose();\n table = sortedTable;\n }\n\n const spec = table.getSpec();\n const data = await this.concurrencyLimiter.run(\n async () => await table.getData([...spec.keys()]),\n );\n table.dispose();\n\n return spec.map((spec, i) => ({\n spec: spec,\n data: data[i],\n }));\n }\n\n public async getUniqueValues(\n handle: PFrameHandle,\n request: UniqueValuesRequest,\n ): Promise<UniqueValuesResponse> {\n return await this.concurrencyLimiter.run(async () => {\n if (getDebugFlags().logPFrameRequests)\n this.logger.info(\n `Call getUniqueValues, handle = ${handle}, request = ${JSON.stringify(request, bigintReplacer)}`,\n );\n using disposableDataPFrame = this.pFrames.getByKey(handle).disposableDataPFrame;\n return await disposableDataPFrame.dataPFrame.getUniqueValues({\n ...request,\n filters: migrateFilters(request.filters),\n });\n });\n }\n\n //\n // PTable istance methods\n //\n\n public async getShape(handle: PTableHandle): Promise<PTableShape> {\n const pTable = await this.pTables.getByKey(handle); // internally concurrency limited\n return pTable.getShape();\n }\n\n public async getSpec(handle: PTableHandle): Promise<PTableColumnSpec[]> {\n const pTable = await this.pTables.getByKey(handle); // internally concurrency limited\n return pTable.getSpec(); // sync operation\n }\n\n public async getData(\n handle: PTableHandle,\n columnIndices: number[],\n range?: TableRange,\n ): Promise<PTableVector[]> {\n const pTable = await this.pTables.getByKey(handle); // internally concurrency limited\n return await this.concurrencyLimiter.run(\n async () => await pTable.getData(columnIndices, range),\n );\n }\n}\n\nfunction joinEntryToInternal(entry: JoinEntry<PObjectId>): PFrameInternal.JoinEntry {\n switch (entry.type) {\n case 'column':\n return {\n type: 'column',\n columnId: entry.column,\n qualifications: [],\n };\n case 'inner':\n case 'full':\n return {\n type: entry.type,\n entries: entry.entries.map((col) => joinEntryToInternal(col)),\n };\n case 'outer':\n return {\n type: 'outer',\n primary: joinEntryToInternal(entry.primary),\n secondary: entry.secondary.map((col) => joinEntryToInternal(col)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction stableKeyFromFullPTableDef(data: FullPTableDef): string {\n const hash = createHash('sha256');\n hash.update(canonicalize(data)!);\n return hash.digest().toString('hex');\n}\n\nfunction stableKeyFromPFrameData(data: PColumn<PFrameInternal.DataInfo<ResourceInfo>>[]): string {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case 'Json':\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case 'JsonPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: blobKey(info),\n })),\n };\n break;\n case 'BinaryPartitioned':\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [blobKey(info.index), blobKey(info.values)] as const,\n })),\n };\n break;\n default:\n throw Error(`unsupported resource type: ${JSON.stringify(type satisfies never)}`);\n }\n result.payload.sort((lhs, rhs) => lhs.key.localeCompare(rhs.key));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => lhs.id.localeCompare(rhs.id));\n\n const hash = createHash('sha256');\n hash.update(canonicalize(orderedData)!);\n return hash.digest().toString('hex');\n}\n","import { PlClient } from '@milaboratories/pl-client';\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n InternalLsDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver\n} from '@milaboratories/pl-drivers';\nimport * as Sdk from '@milaboratories/pl-model-common';\nimport { HmacSha256Signer, MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport * as os from 'node:os';\nimport { PFrameDriver } from '../pool';\nimport {\n DefaultDriverKitOpsPaths,\n DefaultDriverKitOpsSettings,\n DriverKitOps,\n DriverKitOpsConstructor\n} from './ops';\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit {\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: PFrameDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n _ops: DriverKitOpsConstructor\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = new DownloadDriver(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n signer,\n ops.blobDriverOps\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride\n );\n\n const pFrameDriver = new PFrameDriver(blobDriver, ops.logger);\n\n return {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver\n };\n}\n","import {\n field,\n isNullResourceId,\n PlClient,\n ResourceId,\n toGlobalResourceId\n} from '@milaboratories/pl-client';\nimport { createProjectList, ProjectsField, ProjectsResourceType } from './project_list';\nimport { createProject, withProject, withProjectAuthored } from '../mutator/project';\nimport { SynchronizedTreeState } from '@milaboratories/pl-tree';\nimport { BlockPackPreparer } from '../mutator/block-pack/block_pack';\nimport { HmacSha256Signer, MiLogger, Signer } from '@milaboratories/ts-helpers';\nimport { ComputableStableDefined, WatchableValue } from '@milaboratories/computable';\nimport { Project } from './project';\nimport {\n DefaultMiddleLayerOpsPaths,\n DefaultMiddleLayerOpsSettings,\n MiddleLayerOps,\n MiddleLayerOpsConstructor\n} from './ops';\nimport { randomUUID } from 'node:crypto';\nimport { ProjectListEntry } from '../model';\nimport { AuthorMarker, ProjectMeta } from '@milaboratories/pl-model-middle-layer';\nimport { BlockUpdateWatcher } from '../block_registry/watcher';\nimport { getQuickJS, QuickJSWASMModule } from 'quickjs-emscripten';\nimport { initDriverKit, MiddleLayerDriverKit } from './driver_kit';\nimport { DriverKit } from '@platforma-sdk/model';\nimport { DefaultVirtualLocalStorages, DownloadUrlDriver } from '@milaboratories/pl-drivers';\nimport { V2RegistryProvider } from '../block_registry';\nimport { Dispatcher, RetryAgent } from 'undici';\nimport { getDebugFlags } from '../debug';\n\nexport interface MiddleLayerEnvironment {\n readonly pl: PlClient;\n readonly logger: MiLogger;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n private readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx('MLCreateProject', async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), 'Dynamic', prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker\n ): Promise<void> {\n await withProjectAuthored(this.pl, rid, author, async (prj) => {\n prj.setMeta(meta);\n });\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx('MLRemoveProject', async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx('Project id to resource id', async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error('Unexpected project list structure.');\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === 'string') return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them. */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.retryHttpDispatcher.destroy();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops\n };\n\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n\n const projects = await pl.withWriteTx('MLInitialization', async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, 'Dynamic');\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher, {\n minTimeout: 250,\n maxRetries: 4\n });\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher\n );\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n logger,\n pl.httpDispatcher,\n ops.frontendDownloadPath\n );\n\n const env: MiddleLayerEnvironment = {\n pl,\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher: retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel\n }),\n quickJs: await getQuickJS()\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable\n );\n }\n}\n","/** A utility to check network problems and gather statistics.\n * It's useful when we cannot connect to the server of a company\n * because of security reasons,\n * but they can send us and their DevOps team this report. */\n\nimport { UnauthenticatedPlClient, plAddressToConfig } from '@milaboratories/pl-client';\nimport { ValueOrError } from '@milaboratories/ts-helpers';\nimport { setTimeout } from 'timers/promises';\nimport { Dispatcher, request } from 'undici';\nimport { channel } from 'diagnostics_channel';\n\n/** All reports we need to collect. */\ninterface networkReports {\n plPings: networkReport<string>[];\n\n blockRegistryOverviewChecks: httpNetworkReport[];\n blockGARegistryOverviewChecks: httpNetworkReport[];\n blockRegistryUiChecks: httpNetworkReport[];\n blockGARegistryUiChecks: httpNetworkReport[];\n\n autoUpdateCdnChecks: httpNetworkReport[];\n}\n\nexport interface CheckNetworkOpts {\n /** Platforma Backend pings options. */\n pingCheckDurationMs: number;\n pingTimeoutMs: number;\n maxPingsPerSecond: number;\n\n /** An options for CDN and block registry. */\n httpTimeoutMs: number;\n\n /** Block registry pings options. */\n blockRegistryDurationMs: number;\n maxRegistryChecksPerSecond: number;\n blockRegistryUrl: string;\n blockGARegistryUrl: string;\n blockOverviewPath: string;\n blockUiPath: string;\n\n /** CDN for auto-update pings options. */\n autoUpdateCdnDurationMs: number;\n maxAutoUpdateCdnChecksPerSecond: number;\n autoUpdateCdnUrl: string;\n\n bodyLimit: number;\n}\n\n/** A report about one concrete ping to the service. */\ninterface networkReport<T> {\n elapsedMs: number;\n response: ValueOrError<T>;\n}\n\ntype httpNetworkReport = networkReport<{\n statusCode: number;\n beginningOfBody: string;\n}>;\n\n// List of Undici diagnostic channels\nconst undiciEvents: string[] = [\n 'undici:request:create', // When a new request is created\n 'undici:request:bodySent', // When the request body is sent\n 'undici:request:headers', // When request headers are sent\n 'undici:request:error', // When a request encounters an error\n 'undici:request:trailers', // When a response completes.\n\n 'undici:client:sendHeaders',\n 'undici:client:beforeConnect',\n 'undici:client:connected',\n 'undici:client:connectError',\n \n 'undici:socket:close', // When a socket is closed\n 'undici:socket:connect', // When a socket connects\n 'undici:socket:error', // When a socket encounters an error\n\n 'undici:pool:request', // When a request is added to the pool\n 'undici:pool:connect', // When a pool creates a new connection\n 'undici:pool:disconnect', // When a pool connection is closed\n 'undici:pool:destroy', // When a pool is destroyed\n 'undici:dispatcher:request', // When a dispatcher processes a request\n 'undici:dispatcher:connect', // When a dispatcher connects\n 'undici:dispatcher:disconnect', // When a dispatcher disconnects\n 'undici:dispatcher:retry' // When a dispatcher retries a request\n];\n\n/** Checks connectivity to Platforma Backend, to block registry\n * and to auto-update CDN,\n * and generates a string report. */\nexport async function checkNetwork(\n plCredentials: string,\n optsOverrides: Partial<CheckNetworkOpts> = {}\n): Promise<string> {\n const ops: CheckNetworkOpts = {\n pingCheckDurationMs: 10000,\n pingTimeoutMs: 3000,\n maxPingsPerSecond: 50,\n\n httpTimeoutMs: 3000,\n\n blockRegistryDurationMs: 3000,\n maxRegistryChecksPerSecond: 1,\n\n blockRegistryUrl: 'https://blocks.pl-open.science',\n blockGARegistryUrl: 'https://blocks-ga.pl-open.science',\n blockOverviewPath: 'v2/overview.json',\n blockUiPath: 'v2/milaboratories/samples-and-data/1.7.0/ui.tgz',\n\n autoUpdateCdnDurationMs: 5000,\n maxAutoUpdateCdnChecksPerSecond: 1,\n autoUpdateCdnUrl:\n 'https://cdn.platforma.bio/software/platforma-desktop-v2/windows/amd64/latest.yml',\n\n bodyLimit: 300,\n\n ...optsOverrides\n };\n\n const undiciLogs: any[] = [];\n // Subscribe to all Undici diagnostic events\n undiciEvents.forEach((event) => {\n const diagnosticChannel = channel(event);\n diagnosticChannel.subscribe((message: any) => {\n const timestamp = new Date().toISOString();\n if (message?.response?.headers)\n message.response.headers = message.response.headers.map((h: any) => h.toString());\n\n undiciLogs.push(\n JSON.stringify({\n timestamp,\n event,\n data: message\n })\n );\n });\n });\n\n const report: networkReports = {\n plPings: [],\n blockRegistryOverviewChecks: [],\n blockGARegistryOverviewChecks: [],\n blockRegistryUiChecks: [],\n blockGARegistryUiChecks: [],\n\n autoUpdateCdnChecks: []\n };\n\n const plConfig = plAddressToConfig(plCredentials, { defaultRequestTimeout: ops.pingTimeoutMs });\n\n report.plPings = await recordPings(ops.pingCheckDurationMs, ops.maxPingsPerSecond, async () => {\n const uaClient = new UnauthenticatedPlClient(plConfig);\n const response = await uaClient.ping();\n return JSON.stringify(response).slice(0, ops.bodyLimit) + '...';\n });\n\n const uaClient = new UnauthenticatedPlClient(plConfig);\n const httpClient = uaClient.ll.httpDispatcher;\n\n report.blockRegistryOverviewChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () =>\n await requestUrl(new URL(ops.blockOverviewPath, ops.blockRegistryUrl), ops, httpClient)\n );\n\n report.blockGARegistryOverviewChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () =>\n await requestUrl(new URL(ops.blockOverviewPath, ops.blockGARegistryUrl), ops, httpClient)\n );\n\n report.blockRegistryUiChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockRegistryUrl), ops, httpClient)\n );\n\n report.blockGARegistryUiChecks = await recordPings(\n ops.blockRegistryDurationMs,\n ops.maxRegistryChecksPerSecond,\n async () => await requestUrl(new URL(ops.blockUiPath, ops.blockGARegistryUrl), ops, httpClient)\n );\n\n report.autoUpdateCdnChecks = await recordPings(\n ops.autoUpdateCdnDurationMs,\n ops.maxAutoUpdateCdnChecksPerSecond,\n async () => await requestUrl(ops.autoUpdateCdnUrl, ops, httpClient)\n );\n\n return reportsToString(report, plCredentials, ops, undiciLogs);\n}\n\n/** Executes a body several times per second up to the given duration,\n * and returns results and elapsed time for every result. */\nasync function recordPings<T>(\n pingCheckDurationMs: number,\n maxPingsPerSecond: number,\n body: () => Promise<T>\n): Promise<networkReport<T>[]> {\n const startPings = nowMs();\n const reports: networkReport<T>[] = [];\n\n while (elapsed(startPings) < pingCheckDurationMs) {\n const startPing = nowMs();\n let response: ValueOrError<T>;\n try {\n response = { ok: true, value: await body() };\n } catch (e) {\n response = { ok: false, error: e };\n }\n const elapsedPing = elapsed(startPing);\n\n reports.push({\n elapsedMs: elapsedPing,\n response\n });\n\n const sleepBetweenPings = 1000 / maxPingsPerSecond - elapsedPing;\n\n if (sleepBetweenPings > 0) await setTimeout(sleepBetweenPings);\n }\n\n return reports;\n}\n\nasync function requestUrl(url: string | URL, ops: CheckNetworkOpts, httpClient: Dispatcher) {\n const { body: rawBody, statusCode } = await request(url, {\n dispatcher: httpClient,\n headersTimeout: ops.httpTimeoutMs,\n bodyTimeout: ops.httpTimeoutMs\n });\n const body = await rawBody.text();\n\n return {\n statusCode: statusCode,\n beginningOfBody: body.slice(0, ops.bodyLimit) + '...'\n };\n}\n\nfunction reportsToString(\n report: networkReports,\n plEndpoint: string,\n opts: CheckNetworkOpts,\n undiciLogs: any[]\n): string {\n const successPings = report.plPings.filter((p) => p.response.ok);\n const failedPings = report.plPings.filter((p) => !p.response.ok);\n const successPingsBodies = [\n ...new Set(successPings.map((p) => JSON.stringify((p.response as any).value)))\n ];\n\n return `\nNetwork report:\npl endpoint: ${plEndpoint};\noptions: ${JSON.stringify(opts, null, 2)}.\n\nPlatforma pings: ${reportToString(report.plPings)}\n\nBlock registry overview responses: ${reportToString(report.blockRegistryOverviewChecks)}\n\nBlock ga registry overview responses: ${reportToString(report.blockGARegistryOverviewChecks)}\n\nBlock registry ui responses: ${reportToString(report.blockRegistryUiChecks)}\n\nBlock ga registry ui responses: ${reportToString(report.blockGARegistryUiChecks)}\n\nAuto-update CDN responses: ${reportToString(report.autoUpdateCdnChecks)}\n\nBlock registry overview dumps:\n${JSON.stringify(report.blockRegistryOverviewChecks, null, 2)}\n\nBlock ga registry overview dumps:\n${JSON.stringify(report.blockGARegistryOverviewChecks, null, 2)}\n\nBlock registry ui dumps:\n${JSON.stringify(report.blockRegistryUiChecks, null, 2)}\n\nBlock ga registry ui dumps:\n${JSON.stringify(report.blockGARegistryUiChecks, null, 2)}\n\nAuto-update CDN dumps:\n${JSON.stringify(report.autoUpdateCdnChecks, null, 2)}\n\nPlatforma pings error dumps:\n${JSON.stringify(failedPings, null, 2)}\n\nPlatforma pings success dump examples:\n${JSON.stringify(successPingsBodies, null, 2)}\n\nUndici logs:\n${undiciLogs.join('\\n')}\n`;\n}\n\nfunction reportToString<T>(report: networkReport<T>[]): string {\n const successes = report.filter((r) => r.response.ok);\n const { mean: mean, median: median } = elapsedStat(report);\n\n return `\ntotal: ${report.length};\nsuccesses: ${successes.length};\nerrors: ${report.length - successes.length};\nmean in ms: ${mean};\nmedian in ms: ${median};\n`;\n}\n\nfunction elapsedStat(reports: { elapsedMs: number }[]) {\n const checks = reports.map((p) => p.elapsedMs);\n const mean = checks.reduce((sum, p) => sum + p) / checks.length;\n\n let median = undefined;\n if (checks.length > 0) {\n const mid = Math.floor(checks.length / 2);\n median = checks.length % 2 ? checks[mid] : (checks[mid - 1] + checks[mid]) / 2;\n }\n\n return { mean, median };\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction elapsed(startMs: number): number {\n return nowMs() - startMs;\n}\n"],"names":["tryStat","path","fsp","error","LegacyDevBlockPackMetaYaml","RegistryV1","LegacyDevBlockPackMetaJson","LegacyDevBlockPackTemplate","LegacyDevBlockPackConfig","LegacyDevBlockPackFrontendFolder","CanonicalBlockConfigRequest","CanonicalBlockUiRequestPackageJson","LegacyDevBlockPackFiles","isLegacyDevPackage","packageRoot","mustResolve","root","request","res","tryResolve","resolveDevPacket","ignoreErrors","workflow","config","uiPackageJson","getFileContent","fs","getFileStat","getDevV1PacketMtime","devPath","mtime","f","fullPath","stat","getDevV2PacketMtime","description","wfStats","modelStats","BlockPackRegistry","v2Provider","registries","http","regEntry","result","regSpec","httpOptions","overview","overviewEntry","organization","pkg","latestMeta","latestVersion","id","latestOverview","AnyChannel","StableChannel","v","e","s","entry","legacyYamlContent","YAML","actualDevPath","v2Description","tryLoadPackDescription","bpSubfolder","BlockPackMetaEmbedAbsoluteBytes","assertNever","blockPacks","regSpecs","registryId","blockId","channel","_a","reg","V2RegistryProvider","__publicField","url","fromCache","newRegistry","RegistryV2Reader","folderReaderByUrl","CentralBlockRegistry","V1CentralRegistry","V1CentralDevSnapshotRegistry","InitialBlockStructure","InitialProjectRenderingState","InitialBlockMeta","ProjectResourceType","SchemaVersionKey","SchemaVersionCurrent","ProjectCreatedTimestamp","ProjectLastModifiedTimestamp","ProjectMetaKey","ProjectStructureKey","BlockRenderingStateKey","BlockFrontendStateKeyPrefix","BlockFrontendStateKeyPattern","blockFrontendStateKey","BlockArgsAuthorKeyPrefix","blockArgsAuthorKey","ProjectStructureAuthorKey","parseBlockFrontendStateKey","key","match","ServiceTemplateCacheFieldPrefix","getServiceTemplateField","hash","projectFieldName","fieldName","projectFieldPattern","parseProjectField","name","ProjectsField","ProjectsResourceType","ProjectsListTreePruningFunction","resource","resourceTypesEqual","createProjectList","pl","rid","openedProjects","env","tree","SynchronizedTreeState","Computable","ctx","node","oProjects","field","prj","meta","notEmpty","created","lastModified","p","EphRenderTemplate","RenderTemplate","createRenderTemplate","tx","tpl","ephemeral","inputs","outputNames","rId","tplField","inputsField","Pl","BContextEnd","BContext","BContextId","BContextMultiParentPrefix","HeavyBlockOutputNames","createRenderHeavyBlock","createBContextEnd","createBContextFromUpstreams","upstreamCtxs","randomUUID","i","loadTemplateFromExplicitDirect","spec","templateInfo","parseTemplate","templateFormat","createTemplateV2Tree","LibRenderer","PlTemplateLibV1","_creator","SoftwareInfoRenderer","PlTemplateSoftwareV1","sw","ref","HashOverrideRenderer","PlTemplateOverrideV1","TemplateRenderer","PlTemplateV1","srt","entries","a","b","libId","lib","swId","tplId","tplRef","fld","depTplId","depTpl","overrideRef","tplInfo","resourceCache","createResource","renderer","hasher","createHash","rKey","TengoTemplateGet","TengoTemplateGetRegistry","TengoTemplateGetTemplateURI","TengoTemplateGetTemplate","TengoTemplatePack","TengoTemplatePackConvert","TengoTemplatePackConvertTemplatePack","TengoTemplatePackConvertTemplate","prepareTemplateSpec","loadTemplateFromRegistry","getTemplate","registry","uri","templateFromRegistry","loadTemplate","FrontendFromUrlResourceType","FrontendFromFolderResourceType","createFrontend","BlockPackCustomType","BlockPackTemplateField","BlockPackFrontendField","tSlash","str","BlockPackPreparer","v2RegistryProvider","signer","devPaths","configContent","loadPackDescription","urlPrefix","components","templateContent","frontendPath","workflowContent","source","templateUrl","templateResponse","getModel","getWorkflow","model","createCustomBlockPack","blockPackInfo","bp","createBlockPack","outputRef","isBlockOutputReference","obj","addAllReferencedBlocks","allowed","type","child","inferAllReferencedBlocks","args","allBlocks","structure","g","BlockGraph","nodes","direction","rootBlockIds","all","r","cb","unprocessed","queued","nextUnprocessed","info","stagingGraph","previous","current","productionGraph","argsProvider","possibleUpstreams","upstreams","dep","setsEqual","intersects","graphDiff","onlyInA","onlyInB","different","fromA","fromB","preparedTemplateEnvelop","getPreparedExportTemplateEnvelope","preparedTemplate","SdkTemplates","exportContext","exportTpl","cached","modIdCb","valueCb","initialized","lastModId","value","currentModId","BlockInfo","fields","bin","NoNewBlocks","ProjectMutator","author","schema","struct","renderingState","blocksInLimbo","blockInfos","blockFrontendStates","ctxExportTplHolder","blockInfo","initialBlockSettings","InitialBlockSettings","content","block","state","fid","status","fieldNames","deleted","_b","_c","requests","changed","binary","argsRef","newState","newValue","upstream","ctxField","upstreamContexts","results","newStructure","newBlockSpecProvider","currentStagingGraph","currentActualProductionGraph","newStagingGraph","newActualProductionGraph","stagingDiff","prodDiff","before","newStruct","done","group","idx","newArgs","blockIds","addUpstreams","blockIdsSet","prodGraph","rendered","render","activeProdGraph","queue","Denque","stopped","downstream","lags","lag","upstreamLag","stagingRenderingRate","elapsed","lagThreshold","_d","markerStr","uiState","fullResourceStateP","schemaP","lastModifiedP","metaP","structureP","renderingStateP","allKVP","fullResourceState","stagingRefreshTimestamp","allKV","blockInfoStates","projectField","isNullResourceId","ctxExportTplEnvelope","ctxExportTplCacheFieldName","ctxExportTplField","ensureResourceIdNotNull","blocksInLimboSet","kv","isResource","isResourceRef","response","isNotNullResourceId","blockInStruct","createProject","ts","withProject","txOrPl","withProjectAuthored","PlClient","mut","allBlobs","data","blob","index","values","mapValues","callback","mapBlobs","mapping","PColumnDataJsonPartitioned","resourceType","PColumnDataJsonSuperPartitioned","PColumnDataBinaryPartitioned","PColumnDataBinarySuperPartitioned","PColumnDataJson","parseDataInfoResource","resourceData","dataContent","parts","superKey","superPart","keys","partKey","part","superData","resourceTypeToString","makeDataInfoResource","keyLength","jsonData","val","deriveLegacyPObjectId","canonicalize","deriveGlobalPObjectId","exportName","deriveLocalPObjectId","resolvePath","outputName","parseRawPObjectCollection","errorOnUnknownField","ignoreFieldErrors","prefix","entryPattern","locked","parseFinalPObjectCollection","rawCollection","assert","collection","PlError","ResultPool","blocks","allSpecsAvailable","outer","_f","_e","mapValueInVOE","resultWithErrors","isComplete","instabilityMarker","markUnstable","marker","tryAddEntry","exportsProcessed","predicate","found","exportsChecked","addToFound","executePSpecPredicate","prjEntry","rootBlockId","targetBlocks","prod","loadCtx","staging","calculated","ctxAccessor","constructBlockContextArgsOnly","projectEntry","cCtx","constructBlockContext","traverseCfg","cfg","guide","mapRecord","mapper","ifNotUndef","isActiveCfg","hasActiveCfgComponents","nested","resOp","SRMakeObject","k","SRFlatten","SRGetResourceField","mapArrayToRecord","elements","length","SRMapArrayValues1","ops","SRCollectArrayFromArgs","renderCfg","SRMapRecordValues1","nextArgs","newCtx","SRMapRecordValues2","SRIsEmpty","arg","SRNot","operand","SRAnd","operand1","operand2","SROr","SRResourceValueAsJson","SRGetJsonField","SRMapResourceFields1","SRMapResourceFields2","SRGetBlobContent","drivers","SRGetBlobContentAsString","resourceInfo","SRGetBlobContentAsJson","c","SRGetDownloadedBlobContent","SRGetOnDemandBlobContent","SRExtractArchiveAndGetURL","format","SRGetImportProgress","SRGetLastLogs","lines","SRGetProgressLog","patternToSearch","SRGetProgressLogWithInfo","SRGetLogHandle","ctxValue","computableFromCfgUnsafe","NonKeyCtxFields","toCfgContext","ReturnOpKey","ReturnArgKey","ReturnDestination","isReturnDestination","destination","zeroStack","execute","stack","operations","allowComputables","operationQueue","deliverResult","pending","computables","mainLoop","op","action","newOpKey","argRequests","initialArgCounter","operation","computableFromCfg","bCtx","resolvedOps","mc","postEnv","copyOfPendingSubrotines","copiedStack","isArrayBufferOrView","bytesToBase64","JsExecutionContext","scope","vm","blockCtx","computableCtx","json","code","err","cbName","Scope","localScope","targetCallback","wellKnownAccessor","ctxKey","lambda","handle","commonOptions","steps","resolveSteps","acc","accResult","mapPObjectData","d","hPrefix","computable","fHandle","nLines","specs","def","mapPTableDef","accessor","nextHandle","manage","simpleHandle","text","strHandle","configCtx","activeArgs","JsRenderInternal","exportCtxFunction","fn","fnh","step","getBlockPackInfo","bpAcc","extractConfig","LogOutputStatus","computableFromRF","fh","configKey","runtime","rCtx","recalculationCounter","resolved","unstableMarker","stable","renderedResult","isActive","isConfigLambda","computableFromCfgOrRF","cfgOrFh","projectOverview","navigationStates","infos","cInputs","rInputs","currentGraph","limbo","defaultLabel","renderingMode","gNode","calculationStatus","sections","title","inputsValid","sdkVersion","bpId","blockCtxArgsOnly","settings","updates","cantRun","staleBlocks","stale","u","canRun","bb","kernel","frontendRes","frontendPathComputable","frontendData","frontendEntry","blockArgsAndUiState","resourceIdToString","blockOutputs","outputs","cellId","cellCfg","computableOutput","activeConfigs","ret","activeOutputConfigs","NavigationStates","ChangeSource","DefaultNavigationState","Project","projectTree","setTimeout","isNotFoundError","isTimeoutOrCancelError","blockLabel","blockPackSpec","preparedBp","blockCfgContainer","blockCfg","resetArgs","currentStructure","currentGroup","bpHolderRid","bpRid","bpData","bpInfo","fd","_","projectTreePruning","DefaultDriverKitOpsSettings","ConsoleLoggerAdapter","DefaultDriverKitOpsPaths","workDir","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","SEMVER_SPEC_VERSION","MAX_LENGTH","MAX_SAFE_INTEGER","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","RELEASE_TYPES","constants","debug","debug_1","require$$0","require$$1","exports","module","re","safeRe","src","t","R","LETTERDASHNUMBER","safeRegexReplacements","makeSafeRegex","token","max","createToken","isGlobal","safe","looseOption","emptyOpts","parseOptions","options","parseOptions_1","numeric","compareIdentifiers","anum","bnum","rcompareIdentifiers","identifiers","require$$2","require$$3","require$$4","SemVer$d","SemVer","version","m","num","other","release","identifier","identifierBase","base","prerelease","semver","parse","throwErrors","er","parse_1","valid","valid_1","clean","clean_1","inc","inc_1","diff","version1","version2","v1","v2","comparison","v1Higher","highVersion","lowVersion","highHasPre","diff_1","major","loose","major_1","minor","minor_1","patch","patch_1","parsed","prerelease_1","compare","compare_1","rcompare","rcompare_1","compareLoose","compareLoose_1","compareBuild","versionA","versionB","compareBuild_1","sort","list","sort_1","rsort","rsort_1","gt","gt_1","lt","lt_1","eq","eq_1","neq","neq_1","gte","gte_1","lte","lte_1","require$$5","cmp","cmp_1","coerce","coerceRtlRegex","next","build","coerce_1","LRUCache","firstKey","lrucache","SPACE_CHARACTERS","Range","range","Comparator","first","isNullSet","isAny","comps","memoKey","FLAG_INCLUDE_PRERELEASE","FLAG_LOOSE","cache","hr","hyphenReplace","comparatorTrimReplace","tildeTrimReplace","caretTrimReplace","rangeList","comp","parseComparator","replaceGTE0","rangeMap","comparators","thisComparators","isSatisfiable","rangeComparators","thisComparator","rangeComparator","testSet","LRU","require$$6","remainingComparators","testComparator","otherComparator","replaceCarets","replaceTildes","replaceXRanges","replaceStars","isX","replaceTilde","M","pr","replaceCaret","z","replaceXRange","gtlt","xM","xm","xp","anyX","incPr","$0","from","fM","fm","fp","fpr","fb","to","tM","tm","tp","tpr","set","ANY","comparator","satisfies","satisfies_1","toComparators","toComparators_1","maxSatisfying","versions","maxSV","rangeObj","maxSatisfying_1","minSatisfying","min","minSV","minSatisfying_1","minVersion","minver","setMin","compver","minVersion_1","validRange","require$$7","outside","hilo","gtfn","ltefn","ltfn","ecomp","high","low","outside_1","gtr","gtr_1","ltr","ltr_1","r1","r2","intersects_1","simplify","prev","ranges","simplified","original","subset","sub","dom","sawNonNull","OUTER","simpleSub","simpleDom","isSub","simpleSubset","minimumVersionWithPreRelease","minimumVersion","eqSet","higherGT","lowerLT","gtltComp","higher","lower","hasDomLT","hasDomGT","needDomLTPre","needDomGTPre","subset_1","internalRe","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","simplifyRange","require$$39","require$$40","DefaultBlockUpdateWatcherOps","NoUpdatesKey","BlockUpdateWatcher","PollComputablePool","registryProvider","logger","req","cSpec","versionLock","skipVersion","blockPackIdToString","vSuggestions","vMainSuggestion","suggestions","update","mainSuggestion","res1","res2","RefCountResourcePool","envelop","params","unrefereced","flags","getDebugFlags","blobKey","valueTypes","migrateFilters","filters","filtersV1","filtersV2","filter","filtersV1Json","bigintReplacer","PFrameHolder","blobDriver","blobContentCache","columns","blobIds","blobId","logFunc","level","message","column","distinct_columns","item","pFrame","PFrameRs","PFrame","dataPFrame","blobResource","PFrameDriver","concurrencyLimiter","ConcurrencyLimitingExecutor","stableKeyFromPFrameData","pFrames","rawPTable","_stack","disposableDataPFrame","__using","joinEntryToInternal","_error","_hasError","__callDispose","stableKeyFromFullPTableDef","internalData","isPlTreeNodeAccessor","pFrameHandle","extractAllColumns","defIds","iRequest","h","q","columnId","table","sortedTable","columnIndices","pTable","col","orderedData","lhs","rhs","initDriverKit","workdir","_ops","HmacSha256Signer","downloadClient","createDownloadClient","logsClient","createLogsClient","uploadBlobClient","createUploadBlobClient","uploadProgressClient","createUploadProgressClient","DownloadDriver","blobToURLDriver","DownloadBlobToURLDriver","uploadDriver","UploadDriver","logsStreamDriver","LogsStreamDriver","logDriver","LogsDriver","lsDriver","LsDriver","pFrameDriver","MiddleLayer","driverKit","projectListResourceId","openedProjectsList","projectListTree","blockRegistryProvider","projectList","toGlobalResourceId","projects","projectsField","projectsFieldData","retryHttpDispatcher","RetryAgent","bpPreparer","frontendDownloadDriver","DownloadUrlDriver","getQuickJS","WatchableValue","projectListTC","undiciEvents","checkNetwork","plCredentials","optsOverrides","undiciLogs","event","timestamp","report","plConfig","plAddressToConfig","recordPings","UnauthenticatedPlClient","httpClient","requestUrl","reportsToString","pingCheckDurationMs","maxPingsPerSecond","body","startPings","nowMs","reports","startPing","elapsedPing","sleepBetweenPings","rawBody","statusCode","plEndpoint","opts","successPings","failedPings","successPingsBodies","reportToString","successes","mean","median","elapsedStat","checks","sum","mid","startMs"],"mappings":"opEAGA,eAAsBA,GAAQC,EAAgD,CACxE,GAAA,CACF,OAAO,MAAMC,GAAI,KAAKD,EAAM,CAAE,OAAQ,GAAM,QACrCE,EAAY,CACf,GAAAA,EAAM,OAAS,SACV,OAEH,MAAAA,CAAA,CAEV,CCPa,MAAAC,GAA6B,CAACC,EAAA,WAAW,uBAAuB,EAChEC,GAA6B,CAACD,EAAA,WAAW,uBAAuB,EAChEE,GAA6B,CAAC,UAAW,OAAQ,QAAS,MAAO,aAAa,EAC9EC,GAA2B,CAAC,SAAU,OAAQ,aAAa,EAC3DC,GAAmC,CAAC,WAAY,MAAM,EAGtDC,GAA8B,+BAC9BC,GAAqC,wBAErCC,GAA0B,CACrCL,GACAC,GACAJ,GACAE,GACAG,EACF,EAWA,eAAsBI,GAAmBC,EAAuC,CAC9E,OACG,MAAMd,GAAQC,EAAK,KAAKa,EAAa,GAAGN,EAAwB,CAAC,IAAO,QACxE,MAAMR,GAAQC,EAAK,KAAKa,EAAa,GAAGP,EAA0B,CAAC,IAAO,MAE/E,CAEA,SAASQ,GAAYC,EAAcC,EAAyB,CACpD,MAAAC,EAAMC,GAAAA,WAAWH,EAAMC,CAAO,EAChC,GAAAC,IAAQ,OAAiB,MAAA,IAAI,MAAM,iBAAiBD,CAAO,YAAYD,CAAI,EAAE,EAC1E,OAAAE,CACT,CAUsB,eAAAE,GACpBN,EACAO,EACqC,CAEjC,GADCpB,EAAK,WAAWa,CAAW,IAAiBA,EAAAb,EAAK,QAAQa,CAAW,GACrE,MAAMD,GAAmBC,CAAW,EAC/B,MAAA,CACL,SAAUb,EAAK,KAAKa,EAAa,GAAGP,EAA0B,EAC9D,OAAQN,EAAK,KAAKa,EAAa,GAAGN,EAAwB,EAC1D,GAAIP,EAAK,KAAKa,EAAa,GAAGL,EAAgC,CAChE,EASK,CACC,MAAAa,EAAWP,GAAYD,EAAaJ,EAA2B,EAC/Da,EAASR,GAAYD,EAAaJ,EAA2B,EAC7Dc,EAAgBT,GAAYD,EAAaH,EAAkC,EAC1E,MAAA,CAAE,SAAAW,EAAU,OAAAC,EAAQ,GAAItB,EAAK,QAAQuB,EAAe,KAAM,MAAM,CAAE,CAAA,CAE7E,CCtDA,eAAeC,GAAexB,EAAc,CACtC,GAAA,CACF,OAAO,MAAMyB,EAAG,SAAS,SAASzB,EAAM,MAAM,QACvCE,EAAY,CACf,GAAAA,EAAM,OAAS,SACV,OAEH,MAAAA,CAAA,CAEV,CAEA,eAAewB,GAAY1B,EAAc,CACnC,GAAA,CACK,OAAA,MAAMyB,EAAG,SAAS,KAAKzB,EAAM,CAAE,OAAQ,GAAM,QAC7CE,EAAY,CACf,GAAAA,EAAM,OAAS,SACV,OAEH,MAAAA,CAAA,CAEV,CAEA,eAAsByB,GAAoBC,EAAkC,CAC1E,IAAIC,EAAQ,GACZ,UAAWC,KAAKnB,GAAyB,CACvC,MAAMoB,EAAW/B,EAAK,KAAK4B,EAAS,GAAGE,CAAC,EAClCE,EAAO,MAAMN,GAAYK,CAAQ,EACnCC,IAAS,QACTH,EAAQG,EAAK,UAASH,EAAQG,EAAK,QAAA,CAEzC,OAAOH,EAAM,SAAS,CACxB,CAEA,eAAsBI,GACpBC,EACiB,CACX,MAAAC,EAAU,MAAMV,EAAG,SAAS,KAAKS,EAAY,WAAW,SAAS,KAAK,KAAM,CAChF,OAAQ,EAAA,CACT,EACKE,EAAa,MAAMX,EAAG,SAAS,KAAKS,EAAY,WAAW,MAAM,KAAM,CAAE,OAAQ,EAAA,CAAM,EACrF,OAAAC,EAAQ,QAAUC,EAAW,QAAUD,EAAQ,QAAUC,EAAW,SAAS,SAAS,CAChG,CAEO,MAAMC,EAAkB,CAC7B,YACmBC,EACAC,EACAC,EACjB,CAHiB,KAAA,WAAAF,EACA,KAAA,WAAAC,EACA,KAAA,KAAAC,CAAA,CAGnB,MAAc,mBAAmBC,EAAuD,CACtF,MAAMC,EAA8B,CAAC,EAC/BC,EAAUF,EAAS,KACzB,OAAQE,EAAQ,KAAM,CACpB,IAAK,YACG,MAAAC,EAAc,KAAK,OAAS,OAAY,CAAE,WAAY,KAAK,IAAK,EAAI,CAAC,EAMrEC,EAAY,MAJO,MAAM7B,GAAA,QAC7B,GAAG2B,EAAQ,GAAG,IAAIvC,aAAW,kBAAkB,GAC/CwC,CACF,GACyC,KAAK,KAAK,EACnD,UAAWE,KAAiBD,EAAU,CACpC,KAAM,CAAE,aAAAE,EAAc,QAASC,EAAK,WAAAC,EAAY,cAAAC,GAAkBJ,EAC5DK,EAAK,CACT,aAAAJ,EACA,KAAMC,EACN,QAASE,CACX,EACME,EAA0C,CAC9C,GAAAD,EACA,KAAM,CACJ,MAAOF,EAAW,OAAY,WAC9B,YAAaA,EAAW,aAAkB,iBAC1C,aAAc,CACZ,KAAMF,EACN,IAAK,qBAAA,CAET,EACA,KAAM,CACJ,KAAM,mBACN,GAAAI,EACA,YAAaR,EAAQ,GAAA,CAEzB,EACAD,EAAO,KAAK,CACV,WAAYD,EAAS,GACrB,GAAAU,EACA,gBAAiB,CACf,CAACE,EAAU,UAAA,EAAGD,EACd,CAACE,eAAa,EAAGF,CACnB,EACA,YAAaN,EAAc,YAAY,IAAKS,IAAO,CAAE,QAASA,EAAG,SAAU,CAAA,GAAK,CAAA,CACjF,CAAA,CAEI,OAAAb,EAET,IAAK,YACK,OAAA,MAAM,KAAK,WAAW,YAAYC,EAAQ,GAAG,EAAE,kBAAkB,IAAKa,GAC5EA,EAAE,gBAAgBF,EAAa,aAAA,EAC3B,CACE,GAAGE,EACH,WAAYf,EAAS,EAAA,EAEvB,CACE,GAAGe,EACH,gBAAiB,CACf,GAAGA,EAAE,gBACL,CAACF,EAAa,aAAA,GAAKG,GACbA,EAAE,KAAK,OAAS,mBACX,CAAC,GAAGA,EAAG,KAAM,CAAC,GAAGA,EAAE,KAAM,QAASH,EAAAA,cAAc,EAGlDG,GACND,EAAE,gBAAgBH,YAAU,CAAC,CAClC,EACA,WAAYZ,EAAS,EAAA,CAE7B,EAEF,IAAK,YACQ,UAAAiB,KAAS,MAAMjC,EAAG,SAAS,QAAQkB,EAAQ,KAAM,CAAE,cAAe,EAAM,CAAA,EAAG,CAChF,GAAA,CAACe,EAAM,cAAe,SAC1B,MAAM9B,EAAU5B,EAAK,KAAK2C,EAAQ,KAAMe,EAAM,IAAI,EAE5CC,EAAoB,MAAMnC,GAC9BxB,EAAK,KAAK4B,EAASxB,EAAAA,WAAW,uBAAuB,CACvD,EACA,GAAIuD,IAAsB,OAAW,CACnC,MAAMrC,EAASlB,EAAAA,WAAW,oBAAoB,MAAMwD,GAAK,MAAMD,CAAiB,CAAC,EAE3E9B,EAAQ,MAAMF,GAAoBC,CAAO,EAEzCuB,EAAK,CACT,aAAc7B,EAAO,aACrB,KAAMA,EAAO,QACb,QAAS,KACX,EAEM8B,EAA0C,CAC9C,GAAAD,EACA,KAAM,CACJ,MAAQ7B,EAAO,KAAK,OAAuB,WAC3C,YAAcA,EAAO,KAAK,aAA6B,iBACvD,aAAc,CACZ,KAAMA,EAAO,aACb,IAAK,qBAAA,CAET,EACA,KAAM,CACJ,KAAM,SACN,OAAQM,EACR,MAAAC,CAAA,CAEJ,EAEAa,EAAO,KAAK,CACV,WAAYD,EAAS,GACrB,GAAAU,EACA,gBAAiB,CACf,CAACE,EAAU,UAAA,EAAGD,EACd,CAACE,eAAa,EAAGF,CACnB,EACA,YAAa,CAAA,CAAC,CACf,CAAA,KACI,CACL,IAAIS,EAAgBjC,EAChBkC,EAAgB,MAAMC,EAAA,uBAAuBF,CAAa,EAE9D,GAAIC,IAAkB,QAEpB,UAAWE,IAAe,CAAC,QAAS,MAAM,EAGxC,GAFgBH,EAAA7D,EAAK,KAAK4B,EAASoC,CAAW,EAC9BF,EAAA,MAAMC,yBAAuBF,CAAa,EACtDC,IAAkB,OAAW,MAGrC,GAAIA,IAAkB,OAAW,CACzB,MAAAjC,EAAQ,MAAMI,GAAoB6B,CAAa,EAE/CV,EAA0C,CAC9C,GAAIU,EAAc,GAClB,KAAM,MAAMG,EAAgC,gCAAA,WAAWH,EAAc,IAAI,EACzE,KAAM,CACJ,KAAM,SACN,OAAQD,EACR,MAAAhC,CAAA,CAEJ,EAEAa,EAAO,KAAK,CACV,WAAYD,EAAS,GACrB,GAAIqB,EAAc,GAClB,gBAAiB,CACf,CAACT,EAAU,UAAA,EAAGD,EACd,CAACE,eAAa,EAAGF,CACnB,EACA,YAAa,CAAA,CAAC,CACf,CAAA,CACH,CAGF,CAEK,OAAAV,EACT,QACE,OAAOwB,EAAAA,YAAYvB,CAAO,CAAA,CAC9B,CAGF,MAAa,gBAA4C,CACvD,MAAMwB,EAAkC,CAAC,EACnC5B,EAA+B,CAAC,EAC3B,UAAA6B,KAAY,KAAK,WAC1B7B,EAAW,KAAK,CAAE,GAAG6B,EAAU,OAAQ,SAAU,EACjDD,EAAW,KAAK,GAAI,MAAM,KAAK,mBAAmBC,CAAQ,CAAE,EAEvD,MAAA,CAAE,WAAA7B,EAAY,WAAA4B,CAAW,CAAA,CAGlC,MAAa,YACXE,EACAC,EACAC,EACkC,OAC5B,MAAA5B,GAAU6B,EAAA,KAAK,WAAW,KAAMC,GAAQA,EAAI,KAAOJ,CAAU,IAAnD,YAAAG,EAAsD,KACtE,GAAI,CAAC7B,EAAS,MAAM,IAAI,MAAM,qBAAqB0B,CAAU,aAAa,EAC1E,GAAI1B,EAAQ,OAAS,YACnB,MAAM,IAAI,MACR,kFACF,EAEF,OAAO,MADK,KAAK,WAAW,YAAYA,EAAQ,GAAG,EAClC,oBAAoB2B,EAASC,CAAO,CAAA,CAEzD,CC/PO,MAAMG,EAAmB,CAG9B,YAA6BlC,EAAkB,CAF9BmC,EAAA,sBAAiB,KAEL,KAAA,KAAAnC,CAAA,CAEtB,YAAYoC,EAA+B,CAChD,MAAMC,EAAY,KAAK,WAAW,IAAID,CAAG,EACzC,GAAIC,EAAkB,OAAAA,EACtB,MAAMC,EAAc,IAAIC,mBAAiBC,EAAAA,kBAAkBJ,EAAK,KAAK,IAAI,CAAC,EACrE,YAAA,WAAW,IAAIA,EAAKE,CAAW,EAC7BA,CAAA,CAEX,CCbO,MAAMG,GAAqC,CAChD,KAAM,YACN,IAAK,iCACP,EAEaC,GAAkC,CAC7C,KAAM,YACN,IAAK,+CACP,EAEaC,GAA6C,CACxD,KAAM,YACN,IAAK,0CACP,EC8BaC,GAA0C,CACrD,OAAQ,CAAC,CAAE,GAAI,UAAW,MAAO,UAAW,OAAQ,EAAI,CAAA,CAC1D,EAYaC,GAAsD,CACjE,wBAAyB,EACzB,cAAe,CAAA,CACjB,EAEaC,GAAgC,CAC3C,MAAO,aACT,EAMaC,GAAoC,CAAE,KAAM,cAAe,QAAS,GAAI,EAExEC,GAAmB,gBACnBC,GAAuB,IAEvBC,GAA0B,iBAC1BC,GAA+B,sBAC/BC,GAAiB,cACjBC,GAAsB,mBACtBC,GAAyB,sBAEzBC,GAA8B,sBAC9BC,GAA+B,uCAErC,SAASC,GAAsB3B,EAAyB,CACtD,MAAA,GAAGyB,EAA2B,GAAGzB,CAAO,EACjD,CAEO,MAAM4B,GAA2B,mBAGjC,SAASC,GAAmB7B,EAAyB,CACnD,MAAA,GAAG4B,EAAwB,GAAG5B,CAAO,EAC9C,CAEO,MAAM8B,GAA4B,yBAGlC,SAASC,GAA2BC,EAAiC,CACpE,MAAAC,EAAQD,EAAI,MAAMN,EAA4B,EAChD,GAAAO,IAAU,KACP,OAAAA,EAAM,OAAQ,OACvB,CAEO,MAAMC,GAAkC,qBAExC,SAASC,GAAwBC,EAAsB,CACrD,MAAA,GAAGF,EAA+B,GAAGE,CAAI,EAClD,CAuBgB,SAAAC,EAAiBrC,EAAiBsC,EAA8C,CACvF,MAAA,GAAGtC,CAAO,IAAIsC,CAAS,EAChC,CAEA,MAAMC,GACJ,oQAEK,SAASC,GAAkBC,EAAwC,CAClE,MAAAR,EAAQQ,EAAK,MAAMF,EAAmB,EACxC,GAAAN,IAAU,KAAa,OAC3B,KAAM,CAAE,QAAAjC,EAAS,UAAAsC,CAAU,EAAIL,EAAM,OAC9B,MAAA,CAAE,QAAAjC,EAAS,UAAAsC,CAAU,CAC9B,CCnIO,MAAMI,GAAgB,WAChBC,GAAqC,CAAE,KAAM,WAAY,QAAS,GAAI,EAEtEC,GAAoDC,GAC1DC,EAAmB,mBAAAD,EAAS,KAAMF,EAAoB,EACpDE,EAAS,OADqD,CAAC,EAIxE,eAAsBE,GACpBC,EACAC,EACAC,EACAC,EACiD,CAC3C,MAAAC,EAAO,MAAMC,GAAAA,sBAAsB,KACvCL,EACAC,EACA,CACE,GAAGE,EAAI,IAAI,mBACX,QAASP,EACX,EACAO,EAAI,MACN,EA0BO,MAAA,CAAE,WAxBCG,EAAAA,WAAW,KAAMC,GAAQ,CACjC,MAAMC,EAAOD,EAAI,SAASH,EAAK,MAAM,CAAC,EAAE,KAAK,EACvCK,EAAYP,EAAe,SAASK,CAAG,EACzC,GAAAC,IAAS,OAAkB,OAC/B,MAAMpF,EAA6B,CAAC,EACzB,UAAAsF,KAASF,EAAK,oBAAqB,CACtC,MAAAG,EAAMH,EAAK,SAASE,CAAK,EAC/B,GAAIC,IAAQ,OAAW,SACvB,MAAMC,EAAOC,EAAA,SAASF,EAAI,kBAA+BrC,EAAc,CAAC,EAClEwC,EAAUD,EAAA,SAASF,EAAI,kBAA0BvC,EAAuB,CAAC,EACzE2C,EAAeF,EAAA,SAASF,EAAI,kBAA0BtC,EAA4B,CAAC,EACzFjD,EAAO,KAAK,CACV,GAAIsF,EACJ,IAAKC,EAAI,GACT,QAAS,IAAI,KAAKG,CAAO,EACzB,aAAc,IAAI,KAAKC,CAAY,EACnC,OAAQN,EAAU,QAAQE,EAAI,EAAE,GAAK,EACrC,KAAAC,CAAA,CACD,CAAA,CAEH,OAAAxF,EAAO,KAAM4F,GAAM,CAACA,EAAE,aAAa,SAAS,EACrC5F,CACR,CAAA,EAAE,eAAe,EAEM,KAAAgF,CAAK,CAC/B,CC5DA,MAAMa,GAAkC,CACtC,KAAM,oBACN,QAAS,GACX,EACMC,GAA+B,CACnC,KAAM,iBACN,QAAS,GACX,EAWO,SAASC,GACdC,EACAC,EACAC,EACAC,EACAC,EACmB,CACnB,GAAIA,EAAY,SAAW,EAAS,MAAA,IAAI,MAAM,4BAA4B,EACpE,MAAAC,EAAMH,EAAYF,EAAG,gBAAgBH,EAAiB,EAAIG,EAAG,aAAaF,EAAc,EAExFQ,EAAWhB,EAAAA,MAAMe,EAAK,UAAU,EAChCE,EAAcjB,EAAAA,MAAMe,EAAK,QAAQ,EAEpC,OAAAL,EAAA,YAAYM,EAAU,QAASL,CAAG,EAClCD,EAAA,YAAYO,EAAa,QAASC,EAAAA,GAAG,YAAYR,EAAIG,EAAQD,CAAS,CAAC,EAC1EF,EAAG,WAAWK,CAAG,EAEVG,EAAAA,GAAG,aAAaR,EAAIK,EAAKD,EAAa,SAAU,UAAU,CACnE,CC5BO,MAAMK,GAA4B,CAAE,KAAM,cAAe,QAAS,GAAI,EAChEC,GAAyB,CAAE,KAAM,WAAY,QAAS,GAAI,EAC1DC,GAAa,KAEbC,GAA4B,UAqB5BC,GAAqD,CAAC,UAAW,QAAQ,EAEtE,SAAAC,GACdd,EACAC,EACAE,EACmB,CACnB,OAAOJ,GAAqBC,EAAIC,EAAK,GAAME,EAAQU,EAAqB,CAC1E,CAuBO,SAASE,GAAkBf,EAAgC,CAC1D,MAAAb,EAAMa,EAAG,gBAAgBS,EAAW,EAC1C,OAAAT,EAAG,KAAKb,CAAG,EACJA,CACT,CAEgB,SAAA6B,GAA4BhB,EAAmBiB,EAAgC,CAC7F,GAAIA,EAAa,SAAW,EAAG,OAAOF,GAAkBf,CAAE,EAE1D,GAAIiB,EAAa,SAAW,EAAG,OAAOA,EAAa,CAAC,EAE9C,MAAA9B,EAAMa,EAAG,gBAAgBU,EAAQ,EAGpCV,EAAA,YAAYV,QAAMH,EAAKwB,EAAU,EAAG,QAASH,EAAAA,GAAG,eAAeR,EAAIkB,GAAAA,WAAY,CAAA,CAAC,EAGnF,QAASC,EAAI,EAAGA,EAAIF,EAAa,OAAQE,IACvCnB,EAAG,YAAYV,EAAAA,MAAMH,EAAK,GAAGyB,EAAyB,GAAGO,CAAC,EAAE,EAAG,QAASF,EAAaE,CAAC,CAAC,EAEzF,OAAAnB,EAAG,KAAKb,CAAG,EAEJA,CACT,CCxEgB,SAAAiC,GAA+BpB,EAAmBqB,EAAgC,CAC1F,MAAAC,EAA6BC,EAAAA,cAAcF,EAAK,OAAO,EAEvDG,EAAiBF,EAAa,KACpC,OAAQE,EAAgB,CACtB,IAAK,uBACI,OAAAC,GAAqBzB,EAAIsB,CAAY,EAC9C,QACE9F,EAAAA,YAAYgG,CAAc,CAAA,CAEhC,CASA,MAAME,GAAyC,CAC7C,KAAKjD,EAAUT,EAAM,CAEhBA,EAAA,OAAO2D,EAAAA,gBAAgB,KAAK,IAAI,EAChC,OAAOA,kBAAgB,KAAK,OAAO,EACnC,OAAOlD,EAAS,IAAI,EACpB,OAAOA,EAAS,OAAO,EACvB,OAAOA,EAAS,GAAG,CACxB,EACA,OAAOA,EAAUuB,EAAI4B,EAAU,CAC7B,OAAO5B,EAAG,YACR2B,EAAAA,gBAAgB,KAChB,KAAK,UAAUA,EAAAA,gBAAgB,WAAWlD,CAAQ,EAAE,IAAI,CAC1D,CAAA,CAEJ,EAEMoD,GAAuD,CAC3D,KAAKpD,EAAUT,EAAM,CAEhBA,EAAA,OAAO8D,EAAAA,qBAAqB,KAAK,IAAI,EACrC,OAAOA,uBAAqB,KAAK,OAAO,EACxC,OAAOrD,EAAS,IAAI,EACpB,OAAOA,EAAS,OAAO,EACvB,OAAOA,EAAS,GAAG,CACxB,EACA,OAAOA,EAAUuB,EAAI4B,EAAU,CACvB,MAAAG,EAAKD,EAAAA,qBAAqB,WAAWrD,CAAQ,EAC7CuD,EAAMhC,EAAG,aAAa8B,EAAqB,qBAAA,KAAMC,EAAG,IAAI,EAC3D,OAAA/B,EAAA,UAAUgC,EAAKF,uBAAqB,YAAa,KAAK,UAAUC,EAAG,IAAI,CAAC,EAC3E/B,EAAG,KAAKgC,CAAG,EACJA,CAAA,CAEX,EAEMC,GAA+C,CACnD,KAAKxD,EAAUT,EAAM,CACnBA,EACG,OAAOkE,EAAAA,qBAAqB,KAAK,IAAI,EACrC,OAAOA,EAAqB,qBAAA,KAAK,OAAO,EACxC,OAAOzD,EAAS,cAAgB,EAAE,CACvC,EACA,OAAOA,EAAUuB,EAAI4B,EAAU,CAC7B,OAAO5B,EAAG,aACRkC,EAAAA,qBAAqB,KACrB,KAAK,UAAUA,uBAAqB,WAAWzD,CAAQ,CAAC,CAC1D,CAAA,CAEJ,EAEM0D,GAA2C,CAC/C,KAAK1D,EAAUT,EAAM,CAEhBA,EAAA,OAAOoE,eAAa,KAAK,IAAI,EAC7B,OAAOA,EAAAA,aAAa,KAAK,OAAO,EAChC,OAAO3D,EAAS,cAAgB,EAAE,EAClC,OAAOA,EAAS,IAAI,EACpB,OAAOA,EAAS,OAAO,EACvB,OAAOA,EAAS,GAAG,EAEhB,MAAA4D,EAAUC,IACdA,EAAQ,KAAK,CAACC,EAAGC,IAAOD,EAAE,CAAC,IAAMC,EAAE,CAAC,EAAI,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAI,GAAK,CAAE,EAC1DF,GAGT,SAAW,CAACG,EAAOC,CAAG,IAAKL,EAAI,OAAO,QAAQ5D,EAAS,MAAQ,CAAA,CAAE,CAAC,EAC3DT,EAAA,OAAO,OAASyE,CAAK,EACdf,GAAA,KAAKgB,EAAK1E,CAAI,EAE5B,SAAW,CAAC2E,EAAMZ,CAAE,IAAKM,EAAI,OAAO,QAAQ5D,EAAS,UAAY,CAAA,CAAE,CAAC,EAC7DT,EAAA,OAAO,QAAU2E,CAAI,EACLd,GAAA,KAAKE,EAAI/D,CAAI,EAEpC,SAAW,CAAC2E,EAAMZ,CAAE,IAAKM,EAAI,OAAO,QAAQ5D,EAAS,QAAU,CAAA,CAAE,CAAC,EAC3DT,EAAA,OAAO,SAAW2E,CAAI,EACNd,GAAA,KAAKE,EAAI/D,CAAI,EAEpC,SAAW,CAAC4E,EAAO3C,CAAG,IAAKoC,EAAI,OAAO,QAAQ5D,EAAS,WAAa,CAAA,CAAE,CAAC,EAChET,EAAA,OAAO,OAAS4E,CAAK,EACrB,KAAA,KAAK3C,EAAKjC,CAAI,CAEvB,EACA,OAAOS,EAAUuB,EAAI4B,EAAU,CAC7B,MAAMiB,EAAS7C,EAAG,aAChBoC,EAAAA,aAAa,KACb,KAAK,UAAUA,EAAAA,aAAa,WAAW3D,CAAQ,EAAE,IAAI,CACvD,EAEW,SAAA,CAACgE,EAAOC,CAAG,IAAK,OAAO,QAAQjE,EAAS,MAAQ,CAAA,CAAE,EAAG,CAC9D,MAAMqE,EAAMV,EAAA,aAAa,SAASS,EAAQJ,CAAK,EAC5CzC,EAAA,YAAY8C,EAAK,OAAO,EAC3B9C,EAAG,SAAS8C,EAAKlB,EAASc,EAAKhB,EAAW,CAAC,CAAA,CAIlC,SAAA,CAACiB,EAAMZ,CAAE,IAAK,OAAO,QAAQtD,EAAS,UAAY,CAAA,CAAE,EAAG,CAChE,MAAMqE,EAAMV,EAAA,aAAa,QAAQS,EAAQF,CAAI,EAC1C3C,EAAA,YAAY8C,EAAK,OAAO,EAC3B9C,EAAG,SAAS8C,EAAKlB,EAASG,EAAIF,EAAoB,CAAC,CAAA,CAE1C,SAAA,CAACc,EAAMZ,CAAE,IAAK,OAAO,QAAQtD,EAAS,QAAU,CAAA,CAAE,EAAG,CAC9D,MAAMqE,EAAMV,EAAA,aAAa,QAAQS,EAAQF,CAAI,EAC1C3C,EAAA,YAAY8C,EAAK,OAAO,EAC3B9C,EAAG,SAAS8C,EAAKlB,EAASG,EAAIF,EAAoB,CAAC,CAAA,CAI1C,SAAA,CAACkB,EAAUC,CAAM,IAAK,OAAO,QAAQvE,EAAS,WAAa,CAAA,CAAE,EAAG,CACzE,MAAMqE,EAAMV,EAAA,aAAa,SAASS,EAAQE,CAAQ,EAC/C/C,EAAA,YAAY8C,EAAK,OAAO,EAC3B9C,EAAG,SAAS8C,EAAKlB,EAASoB,EAAQb,EAAgB,CAAC,CAAA,CAKjD,GAFJnC,EAAG,KAAK6C,CAAM,EAEV,CAACpE,EAAS,aAAqB,OAAAoE,EAG7B,MAAAI,EAAcrB,EAASnD,EAAUwD,EAAoB,EACrDa,EAAMZ,EAAAA,qBAAqB,SAASe,CAAW,EAClD,OAAAjD,EAAA,YAAY8C,EAAK,SAAS,EAC1B9C,EAAA,SAAS8C,EAAKD,CAAM,EACvB7C,EAAG,KAAK6C,CAAM,EACPI,CAAA,CAEX,EAEA,SAASxB,GAAqBzB,EAAmBkD,EAA+B,CACxE,MAAAC,MAAoB,IAEpBC,EAAiB,CAAI3E,EAAa4E,IAA0C,CAC1E,MAAAC,EAAeC,cAAW,QAAQ,EAC/BF,EAAA,KAAK5E,EAAU6E,CAAM,EAExB,MAAAE,EAAOF,EAAO,OAAO,KAAK,EAChC,GAAI,CAACH,EAAc,IAAIK,CAAI,EAAG,CAC5B,MAAMnD,EAAMgD,EAAS,OAAO5E,EAAUuB,EAAIoD,CAAc,EAC1CD,EAAA,IAAIK,EAAMnD,CAAG,CAAA,CAGtB,OAAA8C,EAAc,IAAIK,CAAI,CAC/B,EAEO,OAAAJ,EAAeF,EAASf,EAAgB,CACjD,CCrKO,MAAMsB,GAAiC,CAAE,KAAM,mBAAoB,QAAS,GAAI,EAC1EC,GAA2B,WAC3BC,GAA8B,cAC9BC,GAA2B,WAE3BC,GAAkC,CAAE,KAAM,oBAAqB,QAAS,GAAI,EAC5EC,GAAyC,CACpD,KAAM,2BACN,QAAS,GACX,EACaC,GAAuC,eACvCC,GAAmC,WAEhD,eAAsBC,GAAoBhE,EAAqD,CAC7F,OAAQA,EAAI,KAAM,CAChB,IAAK,YACI,MAAA,CACL,KAAM,WACN,QAAS,MAAMlH,EAAG,SAAS,SAASkH,EAAI,IAAI,CAC9C,EACF,IAAK,gBACL,IAAK,WACI,OAAAA,EACT,QACE,OAAOzE,EAAAA,YAAYyE,CAAG,CAAA,CAE5B,CAEA,SAASiE,GAAyBlE,EAAmBqB,EAAoC,CACjF,MAAA8C,EAAcnE,EAAG,aAAayD,EAAgB,EAC9CW,EAAW9E,EAAAA,MAAM6E,EAAaT,EAAwB,EACtDW,EAAM/E,EAAAA,MAAM6E,EAAaR,EAA2B,EACpDW,EAAuBhF,EAAAA,MAAM6E,EAAaP,EAAwB,EAIxE,OAAA5D,EAAG,SAASoE,EAAUpE,EAAG,YAAYQ,KAAG,WAAY,OAAO,KAAK,KAAK,UAAUa,EAAK,QAAQ,CAAC,CAAC,CAAC,EAC/FrB,EAAG,SAASqE,EAAKrE,EAAG,YAAYQ,KAAG,WAAY,OAAO,KAAK,KAAK,UAAUa,EAAK,IAAI,CAAC,CAAC,CAAC,EAE/EiD,CACT,CAagB,SAAAC,GAAavE,EAAmBqB,EAAoC,CAClF,OAAQA,EAAK,KAAM,CACjB,IAAK,gBACI,OAAA6C,GAAyBlE,EAAIqB,CAAI,EAC1C,IAAK,WACI,OAAAD,GAA+BpB,EAAIqB,CAAI,EAEhD,QACE,OAAO7F,EAAAA,YAAY6F,CAAI,CAAA,CAE7B,CCpEO,MAAMmD,GAA4C,CAAE,KAAM,mBAAoB,QAAS,GAAI,EAcrFC,GAA+C,CAC1D,KAAM,sBACN,QAAS,GACX,EClBgB,SAAAC,GAAe1E,EAAmBqB,EAAoC,CACpF,OAAQA,EAAK,KAAM,CACjB,IAAK,MACH,OAAOrB,EAAG,YACRwE,GACA,KAAK,UAAU,CAAE,IAAKnD,EAAK,GAA4B,CAAA,CACzD,EACF,IAAK,QACH,OAAOrB,EAAG,YACRyE,GACA,KAAK,UAAU,CACb,KAAMpD,EAAK,KACX,UAAWA,EAAK,SACS,CAAA,CAC7B,EACF,QACE,OAAO7F,EAAAA,YAAY6F,CAAI,CAAA,CAE7B,CCdO,MAAMsD,GAAoC,CAAE,KAAM,kBAAmB,QAAS,GAAI,EAC5EC,GAAyB,WACzBC,GAAyB,WAGtC,SAASC,GAAOC,EAAqB,CACnC,OAAIA,EAAI,SAAS,GAAG,EAAUA,EAClB,GAAGA,CAAG,GACpB,CAEO,MAAMC,EAAkB,CAC7B,YACmBC,EACAC,EACApL,EACjB,CAHiB,KAAA,mBAAAmL,EACA,KAAA,OAAAC,EACA,KAAA,KAAApL,CAAA,CAGnB,MAAa,wBAAwBuH,EAAuD,CAC1F,OAAQA,EAAK,KAAM,CACjB,IAAK,WACH,OAAOA,EAAK,OAEd,IAAK,SAAU,CACb,MAAM8D,EAAW,MAAM1M,GAAiB4I,EAAK,MAAa,EACpD+D,EAAgB,MAAMrM,EAAG,SAAS,SAASoM,EAAS,OAAQ,CAAE,SAAU,QAAS,EAChF,OAAA,KAAK,MAAMC,CAAa,CAAA,CAGjC,IAAK,SAAU,CACb,MAAM5L,EAAc,MAAM6L,sBAAoBhE,EAAK,MAAM,EACnD+D,EAAgB,MAAMrM,EAAG,SAAS,SAASS,EAAY,WAAW,MAAM,KAAM,CAClF,SAAU,OAAA,CACX,EACM,OAAA,KAAK,MAAM4L,CAAa,CAAA,CAGjC,IAAK,mBAAoB,CACjB,MAAAlL,EAAc,KAAK,OAAS,OAAY,CAAE,WAAY,KAAK,IAAK,EAAI,CAAC,EAErEoL,EAAY,GAAGR,GAAOzD,EAAK,WAAW,CAAC,GAAG3J,aAAW,qBAAqB,CAAE,aAAc2J,EAAK,GAAG,aAAc,QAASA,EAAK,GAAG,KAAM,QAASA,EAAK,GAAG,OAAS,CAAA,CAAC,GAIhK,OAAA,MAFe,MAAM/I,WAAQ,GAAGgN,CAAS,eAAgBpL,CAAW,GAE/C,KAAK,KAAK,CAAA,CAGzC,IAAK,mBAAoB,CACjB,MAAAA,EAAc,KAAK,OAAS,OAAY,CAAE,WAAY,KAAK,IAAK,EAAI,CAAC,EAErEqL,EAAa,MADF,KAAK,mBAAmB,YAAYlE,EAAK,WAAW,EACnC,cAAcA,EAAK,EAAE,EAC/C,OAAA,MACN,MAAM/I,GAAS,QAAAiN,EAAW,MAAc,IAAerL,CAAW,GAClE,KAAK,KAAK,CAAA,CAGd,QACE,OAAOsB,EAAAA,YAAY6F,CAAI,CAAA,CAC3B,CAGF,MAAa,QAAQA,EAAwD,CAC3E,OAAQA,EAAK,KAAM,CACjB,IAAK,WACI,OAAAA,EAET,IAAK,SAAU,CACb,MAAM8D,EAAW,MAAM1M,GAAiB4I,EAAK,MAAa,EAGpDmE,EAAkB,MAAMzM,EAAG,SAAS,SAASoM,EAAS,QAAQ,EAG9DvM,EAAS,KAAK,MAClB,MAAMG,EAAG,SAAS,SAASoM,EAAS,OAAQ,OAAO,CACrD,EAGMM,EAAeN,EAAS,GAEvB,MAAA,CACL,KAAM,WACN,SAAU,CACR,KAAM,WACN,QAASK,CACX,EACA,OAAA5M,EACA,SAAU,CACR,KAAM,QACN,KAAM6M,EACN,UAAW,KAAK,OAAO,KAAKA,CAAY,CAC1C,EACA,OAAQpE,CACV,CAAA,CAGF,IAAK,SAAU,CACb,MAAM7H,EAAc,MAAM6L,sBAAoBhE,EAAK,MAAM,EACnDzI,EAAS,KAAK,MAClB,MAAMG,EAAG,SAAS,SAASS,EAAY,WAAW,MAAM,KAAM,CAC5D,SAAU,OACX,CAAA,CACH,EACMkM,EAAkB,MAAM3M,EAAG,SAAS,SACxCS,EAAY,WAAW,SAAS,KAAK,IACvC,EACMiM,EAAejM,EAAY,WAAW,GAAG,OACzCmM,EAAS,CAAE,GAAGtE,CAAK,EACzB,OAAIA,EAAK,QAAU,SAEVsE,EAAA,MAAQ,MAAMpM,GAAoBC,CAAW,GAC/C,CACL,KAAM,WACN,SAAU,CACR,KAAM,WACN,QAASkM,CACX,EACA,OAAA9M,EACA,SAAU,CACR,KAAM,QACN,KAAM6M,EACN,UAAW,KAAK,OAAO,KAAKA,CAAY,CAC1C,EACA,OAAAE,CACF,CAAA,CAGF,IAAK,mBAAoB,CACjB,MAAAzL,EAAc,KAAK,OAAS,OAAY,CAAE,WAAY,KAAK,IAAK,EAAI,CAAC,EAErEoL,EAAY,GAAGR,GAAOzD,EAAK,WAAW,CAAC,GAAG3J,aAAW,qBAAqB,CAAE,aAAc2J,EAAK,GAAG,aAAc,QAASA,EAAK,GAAG,KAAM,QAASA,EAAK,GAAG,OAAS,CAAA,CAAC,GAElKuE,EAAc,GAAGN,CAAS,mBAE1BO,EAAmB,MAAMvN,WAAQsN,EAAa1L,CAAW,EAC/D,GAAI2L,EAAiB,aAAe,IAClC,MAAM,IAAI,MACR,sCAAsCD,CAAW,aAAaC,EAAiB,UAAU,MACvF,KAAK,UAAUxE,CAAI,CACvB,EACF,MAAMmE,EAAkB,IAAI,WAAW,MAAMK,EAAiB,KAAK,aAAa,EAI1EjN,EAAU,MADO,MAAMN,WAAQ,GAAGgN,CAAS,eAAgBpL,CAAW,GACvC,KAAK,KAAK,EAExC,MAAA,CACL,KAAM,WACN,SAAU,CACR,KAAM,WACN,QAASsL,CACX,EACA,OAAA5M,EACA,SAAU,CACR,KAAM,MACN,IAAK,GAAG0M,CAAS,eACnB,EACA,OAAQjE,CACV,CAAA,CAGF,IAAK,mBAAoB,CACjB,MAAAnH,EAAc,KAAK,OAAS,OAAY,CAAE,WAAY,KAAK,IAAK,EAAI,CAAC,EAErEqL,EAAa,MADF,KAAK,mBAAmB,YAAYlE,EAAK,WAAW,EACnC,cAAcA,EAAK,EAAE,EACjDyE,EAAW,SACd,MAAO,MAAMxN,WAASiN,EAAW,MAAc,IAAKrL,CAAW,GAAG,KAAK,KAAK,EACzE6L,EAAc,SAClB,MAAO,MAAMzN,GAAS,QAAAiN,EAAW,SAAS,KAAa,IAAKrL,CAAW,GAAG,KAAK,YAAY,EAEvF,CAAC8L,EAAOrN,CAAQ,EAAI,MAAM,QAAQ,IAAI,CAACmN,EAAS,EAAGC,EAAY,CAAC,CAAC,EAEhE,MAAA,CACL,KAAM,WACN,SAAU,CACR,KAAM,WACN,QAAS,OAAO,KAAKpN,CAAQ,CAC/B,EACA,OAAQqN,EACR,SAAU,CACR,KAAM,MACN,IAAMT,EAAW,GAAW,GAC9B,EACA,OAAQlE,CACV,CAAA,CAGF,QACE,OAAO7F,EAAAA,YAAY6F,CAAI,CAAA,CAC3B,CAEJ,CAEA,SAAS4E,GAAsBjG,EAAmBqB,EAAyC,CACzF,MAAM6E,EAA+B,CAAE,OAAQ7E,EAAK,OAAQ,OAAQA,EAAK,MAAO,EAC1E8E,EAAKnG,EAAG,aAAa2E,GAAqB,KAAK,UAAUuB,CAAa,CAAC,EAC1E,OAAAlG,EAAA,YAAYV,QAAM6G,EAAIvB,EAAsB,EAAG,QAASL,GAAavE,EAAIqB,EAAK,QAAQ,CAAC,EACvFrB,EAAA,YAAYV,QAAM6G,EAAItB,EAAsB,EAAG,QAASH,GAAe1E,EAAIqB,EAAK,QAAQ,CAAC,EAC5FrB,EAAG,KAAKmG,CAAE,EAEHA,CACT,CAEgB,SAAAC,GAAgBpG,EAAmBqB,EAA6C,CAC9F,OAAQA,EAAK,KAAM,CACjB,IAAK,WACI,OAAA4E,GAAsBjG,EAAIqB,CAAI,EACvC,QACS,OAAA7F,EAAA,YAAY6F,EAAK,IAAI,CAAA,CAElC,CC5NgB,SAAAgF,GAAUzK,EAAiByC,EAAqB,CAC9D,MAAO,CAAE,QAAS,GAAM,QAAAzC,EAAS,KAAAyC,CAAK,CACxC,CAEO,SAASiI,GAAuBC,EAAwB,CAE3D,OAAA,OAAOA,GAAQ,UACfA,IAAQ,MACRA,EAAI,UAAY,IAChB,YAAaA,GACb,SAAUA,CAEd,CAEA,SAASC,GAAuBxM,EAAwBoF,EAAWqH,EAAuB,CACxF,MAAMC,EAAO,OAAOtH,EACpB,OAAQsH,EAAM,CACZ,IAAK,WACL,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,UACL,IAAK,SACL,IAAK,YACH,OAEF,IAAK,SACH,GAAItH,IAAS,KAAM,OAEf,GAAAkH,GAAuBlH,CAAI,EACzBqH,IAAY,QAAaA,EAAQ,IAAIrH,EAAK,OAAO,EAAUpF,EAAA,UAAU,IAAIoF,EAAK,OAAO,IAC7E,kBAAoB,WACvB,MAAM,QAAQA,CAAI,EAC3B,UAAWuH,KAASvH,EAA6BoH,GAAAxM,EAAQ2M,EAAOF,CAAO,MAEvE,UAAW,CAAA,CAAGE,CAAK,IAAK,OAAO,QAAQvH,CAAc,EAC5BoH,GAAAxM,EAAQ2M,EAAOF,CAAO,EAGjD,OAEF,QACEjL,EAAAA,YAAYkL,CAAI,CAAA,CAEtB,CAUgB,SAAAE,GAAyBC,EAAWJ,EAAuC,CACzF,MAAMzM,EAAS,CAAE,cAAe,IAAe,kBAAmB,EAAM,EACjD,OAAAwM,GAAAxM,EAAQ6M,EAAMJ,CAAO,EACrCzM,CACT,CCzDO,SAAS8M,GAAUC,EAA8C,CAC/D,MAAA,CACL,EAAE,OAAO,QAAQ,GAAI,CACnB,UAAWC,KAAKD,EAAU,iBAAmBvE,KAAKwE,EAAE,OAAc,MAAAxE,CAAA,CAEtE,CACF,CAWO,MAAMyE,EAAW,CAItB,YAAYC,EAAoC,CAFhCjL,EAAA,cAGd,KAAK,MAAQiL,CAAA,CAGR,YAAYC,KAAyCC,EAAqC,CACzF,MAAAC,MAAU,IACX,YAAA,SAASF,EAAWC,EAAehI,GAASiI,EAAI,IAAIjI,EAAK,EAAE,CAAC,EAC1DiI,CAAA,CAGF,0BACLF,KACGC,EACU,CACb,MAAMpN,EAAS,KAAK,YAAYmN,EAAW,GAAGC,CAAY,EAC1D,UAAWE,KAAKF,EAAqBpN,EAAA,OAAOsN,CAAC,EACtC,OAAAtN,CAAA,CAGF,SACLmN,EACAC,EACAG,EACM,CACF,IAAAC,EAAc,CAAC,GAAGJ,CAAY,EAE5B,MAAAK,EAAS,IAAI,IAAYD,CAAW,EACnC,KAAAA,EAAY,OAAS,GAAG,CAC7B,IAAIE,EAA4B,CAAC,EACjC,UAAW9L,KAAW4L,EAAa,CACjC,MAAMG,EAAO,KAAK,MAAM,IAAI/L,CAAO,EACnC2L,EAAGI,CAAI,EACPA,EAAKR,CAAS,EAAG,QAAStM,GAAM,CACzB4M,EAAO,IAAI5M,CAAC,IACf4M,EAAO,IAAI5M,CAAC,EACZ6M,EAAgB,KAAK7M,CAAC,EACxB,CACD,CAAA,CAEW2M,EAAAE,CAAA,CAChB,CAEJ,CAEO,SAASE,GAAab,EAA6B,CAElD,MAAA/M,MAAa,IAOnB,IAAI6N,EACJ,SAAW,CAAE,GAAApN,CAAA,IAAQqM,GAAUC,CAAS,EAAG,CACzC,MAAMe,EAAiB,CACrB,GAAArN,EACA,kBAAmB,EACrB,EACOT,EAAA,IAAIS,EAAIqN,CAAO,EAClBD,IAAa,OACPC,EAAA,aAAe,KAEvBA,EAAQ,SAAe,IAAA,IAAY,CAACD,EAAS,EAAE,CAAC,EAChDA,EAAS,WAAiB,IAAA,IAAY,CAACC,EAAQ,EAAE,CAAC,GAGzCD,EAAAC,CAAA,CAEb,OAAID,IAAa,SAAoBA,EAAA,eAAiB,KAE/C,IAAIZ,GAAWjN,CAAqC,CAC7D,CAEgB,SAAA+N,GACdhB,EACAiB,EACY,CACN,MAAAhO,MAAa,IAKbiO,MAAwB,IAC9B,SAAW,CAAE,GAAAxN,CAAA,IAAQqM,GAAUC,CAAS,EAAG,CACnC,MAAAF,EAAOmB,EAAavN,CAAE,EAG5B,GAAIoM,IAAS,OAAW,SAElB,MAAAqB,EAAYtB,GAAyBC,EAAMoB,CAAiB,EAC5D7I,EAAuB,CAC3B,GAAA3E,EACA,kBAAmByN,EAAU,kBAC7B,SAAUA,EAAU,UACpB,eAAgB,GAClB,EACOlO,EAAA,IAAIS,EAAI2E,CAAI,EACT8I,EAAA,UAAU,QAASC,GAAQnO,EAAO,IAAImO,CAAG,EAAG,WAAW,IAAI1N,CAAE,CAAC,EACxEwN,EAAkB,IAAIxN,CAAE,CAAA,CAGnB,OAAA,IAAIwM,GAAWjN,CAAM,CAC9B,CAEA,SAASoO,GAAa7F,EAAWC,EAAoB,CACnD,GAAID,EAAE,OAASC,EAAE,KAAa,MAAA,GACnB,UAAA1H,KAAKyH,EAAO,GAAA,CAACC,EAAE,IAAI1H,CAAC,EAAU,MAAA,GAClC,MAAA,EACT,CAEA,SAASuN,GAAc9F,EAAWC,EAAoB,CACpD,GAAID,EAAE,KAAOC,EAAE,KAAa,OAAA6F,GAAW7F,EAAGD,CAAC,EAC3C,UAAWzH,KAAKyH,EAAG,GAAIC,EAAE,IAAI1H,CAAC,EAAU,MAAA,GACjC,MAAA,EACT,CAUgB,SAAAwN,GAAU/F,EAAeC,EAA0B,CAE3D,MAAA+F,MAAc,IACdC,MAAc,IACdC,MAAgB,IACpB,OAAAlG,EAAA,MAAM,QAASmG,GAAU,CACzB,MAAMC,EAAQnG,EAAE,MAAM,IAAIkG,EAAM,EAAE,EAC9BC,IAAU,OAAmBJ,EAAA,IAAIG,EAAM,EAAE,GACpC,CAACN,GAAUM,EAAM,SAAUC,EAAM,QAAQ,GAAKN,GAAWK,EAAM,SAAUD,CAAS,IAC/EA,EAAA,IAAIC,EAAM,EAAE,CAAA,CACzB,EAEClG,EAAA,MAAM,QAASmG,GAAU,CACpBpG,EAAE,MAAM,IAAIoG,EAAM,EAAE,EAChBN,GAAWM,EAAM,SAAUF,CAAS,GAAaA,EAAA,IAAIE,EAAM,EAAE,EAD1CH,EAAQ,IAAIG,EAAM,EAAE,CACsB,CACvE,EAEM,CAAE,QAAAJ,EAAS,QAAAC,EAAS,UAAAC,CAAU,CACvC,CCvJA,IAAIG,GAEJ,eAAsBC,IAA8D,CAClF,GAAID,KAA4B,OAAW,CAEzC,MAAME,EAAmB,MAAM7E,GAAoB8E,GAAA,UAAa,uBAAuB,CAAC,EACxF,GAAID,EAAiB,OAAS,WAAkB,MAAA,IAAI,MAAM,oCAAoC,EACxF,MAAA9K,EAAOuF,cAAW,QAAQ,EAAE,OAAOuF,EAAiB,OAAO,EAAE,OAAO,KAAK,EACrDF,GAAA,CAAE,KAAME,EAAkB,KAAA9K,CAAK,CAAA,CAGpD,OAAA4K,EACT,CAEgB,SAAAI,GAAchJ,EAAmBiJ,EAAmB9J,EAAa,CACxE,OAAAY,GAAqBC,EAAIiJ,EAAW,GAAM,CAAE,GAAI9J,GAAO,CAAC,QAAQ,CAAC,EAAE,MAC5E,CC6CA,SAAS+J,GAAiBC,EAAsBC,EAA2B,CACzE,IAAIC,EAAc,GACdC,EACAC,EACJ,MAAO,IAAM,CACX,GAAI,CAACF,EACW,OAAAA,EAAA,GACdC,EAAYH,EAAQ,EACpBI,EAAQH,EAAQ,EACTG,EAET,MAAMC,EAAeL,EAAQ,EAC7B,OAAIG,IAAcE,IACJF,EAAAE,EACZD,EAAQH,EAAQ,GAEXA,EAAQ,CACjB,CACF,CAEA,MAAMK,EAAU,CACd,YACkBhP,EACAiP,EAChB,CA4BezN,EAAA,sBAAiBiN,GAChC,IAAM,KAAK,OAAO,YAAa,SAC/B,IAAM,KAAK,MAAM,OAAO,KAAK,KAAK,OAAO,YAAa,KAAM,EAAE,SAAU,CAAA,CAC1E,GACiBjN,EAAA,+BAA0BiN,GACzC,WAAM,OAAApN,EAAA,KAAK,OAAO,WAAZ,YAAAA,EAAsB,UAC5B,IAAM,OACE,MAAA6N,GAAM7N,EAAA,KAAK,OAAO,WAAZ,YAAAA,EAAsB,MAC9B,GAAA6N,IAAQ,OACZ,OAAO,KAAK,MAAM,OAAO,KAAKA,CAAG,EAAE,UAAU,CAAA,CAEjD,GAkBiB1N,EAAA,wBAAkCiN,GACjD,IAAA,OAAM,SAAG,KAAK,OAAO,YAAa,QAAQ,KAAIpN,EAAA,KAAK,OAAO,WAAZ,YAAAA,EAAsB,QAAQ,IAC5E,IACE,KAAK,OAAO,WAAa,QACzB,OAAO,QAAQ,KAAK,OAAO,YAAa,MAAQ,KAAK,OAAO,SAAS,KAAM,IAAM,CACrF,GAhEkB,KAAA,GAAArB,EACA,KAAA,OAAAiP,CAAA,CAGX,OAAQ,CAGb,GAAK,KAAK,OAAO,aAAe,SAAgB,KAAK,OAAO,UAAY,QAChE,MAAA,IAAI,MAAM,0BAA0B,EAE5C,GAAK,KAAK,OAAO,gBAAkB,SAAgB,KAAK,OAAO,aAAe,QACtE,MAAA,IAAI,MAAM,2BAA2B,EAE7C,GACG,KAAK,OAAO,qBAAuB,SACnC,KAAK,OAAO,kBAAoB,QAE3B,MAAA,IAAI,MAAM,gCAAgC,EAElD,GACG,KAAK,OAAO,wBAA0B,SACtC,KAAK,OAAO,qBAAuB,QAE9B,MAAA,IAAI,MAAM,iCAAiC,EAEnD,GAAI,KAAK,OAAO,YAAc,OAAiB,MAAA,IAAI,MAAM,qBAAqB,EAE9E,GAAI,KAAK,OAAO,cAAgB,OAAiB,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAgBpF,IAAI,eAAqB,CACvB,OAAO,KAAK,eAAe,CAAA,CAG7B,IAAI,iBAA2B,CACtB,OAAA,KAAK,OAAO,aAAe,MAAA,CAGpC,IAAI,oBAA8B,CACzB,OAAA,KAAK,OAAO,UAAY,MAAA,CAGjC,IAAI,qBAA+B,OAC1B,QAAA5N,EAAA,KAAK,OAAO,YAAZ,YAAAA,EAAuB,UAAW,OAAA,CAc3C,IAAI,4BAAsC,CACxC,MAAO,CAAC,KAAK,oBAAsB,KAAK,iBAAA,GAAsB,KAAK,mBAAA,CAGrE,IAAI,wBAA0C,CAC5C,OAAO,KAAK,wBAAwB,CAAA,CAG/B,YAAYkE,EAA2B,CAC5C,OAAOA,EAAG,oBACRQ,KAAG,aAAaR,EAAI,KAAK,OAAO,UAAW,GAAI,EAC/C4E,GACA,OACF,CAAA,CAEJ,CAQA,MAAMgF,GAAehO,GAAoB,CACvC,MAAM,IAAI,MAAM,yBAAyBA,CAAO,EAAE,CACpD,EAeO,MAAMiO,EAAe,CAiB1B,YACkBhL,EACCmB,EACA8J,EACAC,EACTpK,EACAH,EACAwK,EACSC,EACAC,EACAC,EACAC,EACAC,EACjB,CA7BMpO,EAAA,sBAAiB,GACjBA,EAAA,qBAAyB,IAMzBA,EAAA,2BAAsB,IACtBA,EAAA,wBAAmB,IACnBA,EAAA,mBAAc,IACdA,EAAA,6BAAwB,IACfA,EAAA,sCAAiC,KAGjCA,EAAA,mCAA8B,KA2DvCA,EAAA,qBACAA,EAAA,+BACAA,EAAA,8BA1DU,KAAA,IAAA4C,EACC,KAAA,GAAAmB,EACA,KAAA,OAAA8J,EACA,KAAA,OAAAC,EACT,KAAA,aAAApK,EACA,KAAA,KAAAH,EACA,KAAA,OAAAwK,EACS,KAAA,eAAAC,EACA,KAAA,cAAAC,EACA,KAAA,WAAAC,EACA,KAAA,oBAAAC,EACA,KAAA,mBAAAC,CAAA,CAGX,uBAAwB,CAEzB,KAAA,WAAW,QAASC,GAAc,EAEnCA,EAAU,OAAO,WAAa,QAC9BA,EAAU,OAAO,aAAe,QAChCA,EAAU,OAAO,UAAY,SAE7B,KAAK,kBAAkBA,EAAU,GAAI,WAAY,aAAc,SAAS,CAAA,CAC3E,EAGG,IAAAC,EACC,KAAA,WAAW,QAASD,GAAc,CACjCA,EAAU,OAAO,gBAAkB,SACjCC,IAAyB,SACJA,EAAA,KAAK,qBAAqBC,sBAAoB,GACvE,KAAK,iBAAiBF,EAAU,GAAI,gBAAiBC,CAAoB,EAC3E,CACD,CAAA,CAGH,IAAI,aAAuB,CACzB,OACE,KAAK,qBACL,KAAK,kBACL,KAAK,eACL,KAAK,aACL,KAAK,uBACL,KAAK,2BAA2B,KAAO,CAAA,CAI3C,IAAI,WAA8B,CAEhC,OAAO,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,CAAA,CAWvC,iBAA8B,CACpC,OAAI,KAAK,eAAiB,cAAgB,aAAe3C,GAAa,KAAK,MAAM,GAC1E,KAAK,YAAA,CAGN,2BAAwC,CAC9C,OAAI,KAAK,yBAA2B,SAClC,KAAK,uBAAyBG,GAC5B,KAAK,OACJnM,GAAY,KAAK,aAAaA,CAAO,EAAE,aAC1C,GACK,KAAK,sBAAA,CAGN,0BAAuC,CAC7C,OAAI,KAAK,wBAA0B,SACjC,KAAK,sBAAwBmM,GAC3B,KAAK,OACJnM,GAAY,KAAK,aAAaA,CAAO,EAAE,sBAC1C,GACK,KAAK,qBAAA,CAON,aAAaA,EAA4B,CAC/C,MAAM+L,EAAO,KAAK,WAAW,IAAI/L,CAAO,EACxC,GAAI+L,IAAS,OAAW,MAAM,IAAI,MAAM,kBAAkB/L,CAAO,EAAE,EAC5D,OAAA+L,CAAA,CAGD,8BAA8B8C,EAAuC,CACrE,MAAAlB,EAAQ,OAAO,KAAKkB,CAAO,EAEjC,MAAO,CAAE,IADG,KAAK,GAAG,YAAYjK,EAAA,GAAG,WAAY+I,CAAK,EACtC,MAAAA,EAAO,OAAQ,OAAQ,CAAA,CAG/B,qBAAqBhD,EAAoC,CAC/D,OAAO,KAAK,8BAA8B,KAAK,UAAUA,CAAG,CAAC,CAAA,CAGvD,SAAS3K,EAAwB,CAC5B,UAAA8O,KAAS5D,GAAU,KAAK,MAAM,EAAO,GAAA4D,EAAM,KAAO9O,EAAgB,OAAA8O,EACvE,MAAA,IAAI,MAAM,iBAAiB,CAAA,CAG3B,iBACN9O,EACAsC,EACAyM,EACA,CACA,MAAMC,EAAMtL,EAAAA,MAAM,KAAK,IAAKrB,EAAiBrC,EAASsC,CAAS,CAAC,EAEhE,GAAIyM,EAAM,MAAQ,OAAiB,MAAA,IAAI,MAAM,gCAAgC,EAEzE,KAAK,aAAa/O,CAAO,EAAE,OAAOsC,CAAS,IAAM,OACnD,KAAK,GAAG,YAAY0M,EAAK,UAAWD,EAAM,GAAG,EACrC,KAAA,GAAG,SAASC,EAAKD,EAAM,GAAG,EAEpC,KAAK,aAAa/O,CAAO,EAAE,OAAOsC,CAAS,EAAI,CAC7C,SAAU,KAAK,iBACf,GAAGyM,CACL,EAEA,KAAK,cAAgB,EAAA,CAGf,cACN/O,EACAsC,EACA8D,EACA6I,EACAtB,EACA,CACA,KAAK,iBAAiB3N,EAASsC,EAAW,CAAE,IAAA8D,EAAK,OAAA6I,EAAQ,MAAAtB,EAAO,CAAA,CAG1D,kBAAkB3N,KAAoBkP,EAAiD,CAC7F,IAAIC,EAAU,GACR,MAAApD,EAAO,KAAK,aAAa/L,CAAO,EACtC,UAAWsC,KAAa4M,EAAY,CAClC,MAAMpB,EAAS/B,EAAK,OACdzJ,KAAawL,IACd,KAAA,GAAG,YAAYpK,QAAM,KAAK,IAAKrB,EAAiBrC,EAASsC,CAAS,CAAC,CAAC,EACzE,OAAOwL,EAAOxL,CAAS,EACvB,KAAK,cAAgB,GACX6M,EAAA,GAAA,CAEL,OAAAA,CAAA,CAGD,oBAAqB,CACtB,KAAA,aAAe,KAAK,IAAI,EAC7B,KAAK,oBAAsB,EAAA,CAOrB,8BAA+B,CAChC,KAAA,eAAe,wBAA0B,KAAK,IAAI,EACvD,KAAK,sBAAwB,EAAA,CAGvB,aAAanP,EAAuB,WAC1C,MAAM8N,EAAS,KAAK,aAAa9N,CAAO,EAAE,SAExCE,EAAA4N,EAAO,gBAAP,YAAA5N,EAAsB,UAAW,WACjCkP,EAAAtB,EAAO,aAAP,YAAAsB,EAAmB,UAAW,WAC9BC,EAAAvB,EAAO,eAAP,YAAAuB,EAAqB,UAAW,UAEhC,KAAK,iBAAiBrP,EAAS,wBAAyB8N,EAAO,aAAa,EAC5E,KAAK,iBAAiB9N,EAAS,qBAAsB8N,EAAO,UAAU,EACtE,KAAK,iBAAiB9N,EAAS,uBAAwB8N,EAAO,YAAY,GAExE,KAAK,kBAAkB9N,EAAS,gBAAiB,aAAc,cAAc,GAC/E,KAAK,6BAA6B,CAAA,CAG9B,gBAAgBA,EAAuB,WAC7C,MAAM8N,EAAS,KAAK,aAAa9N,CAAO,EAAE,SAExCE,EAAA4N,EAAO,aAAP,YAAA5N,EAAmB,UAAW,WAC9BkP,EAAAtB,EAAO,UAAP,YAAAsB,EAAgB,UAAW,WAC3BC,EAAAvB,EAAO,YAAP,YAAAuB,EAAkB,UAAW,UAE7B,KAAK,iBAAiBrP,EAAS,qBAAsB8N,EAAO,UAAU,EACtE,KAAK,iBAAiB9N,EAAS,kBAAmB8N,EAAO,OAAO,EAChE,KAAK,iBAAiB9N,EAAS,oBAAqB8N,EAAO,SAAS,GAEtE,KAAK,kBAAkB9N,EAAS,aAAc,UAAW,YAAa,UAAU,CAAA,CAK1E,uBAAuBA,EAA0B,SACvD,MAAM8N,EAAS,KAAK,aAAa9N,CAAO,EAAE,OAC1C,QAAIE,EAAA4N,EAAO,aAAP,YAAA5N,EAAmB,UAAW,WAAWkP,EAAAtB,EAAO,UAAP,YAAAsB,EAAgB,UAAW,QAClE,KAAK,cAAc,IAAIpP,CAAO,EAEzB,IAGJ,KAAA,cAAc,IAAIA,CAAO,EAC9B,KAAK,sBAAwB,GAG7B,KAAK,kBAAkBA,EAAS,qBAAsB,kBAAmB,mBAAmB,EAErF,IAGG,KAAK,kBAAkBA,EAAS,aAAc,UAAW,YAAa,UAAU,CAAA,CAIvF,QAAQsP,EAA4B,CACzC,MAAMC,EAAoB,CAAC,EAC3B,SAAW,CAAE,QAAAvP,EAAS,KAAAiL,CAAK,IAAKqE,EAAU,CAClC,MAAAvD,EAAO,KAAK,aAAa/L,CAAO,EACtC,KAAK,MAAMiL,CAAI,EACT,MAAAuE,EAAS,OAAO,KAAKvE,CAAI,EAC3B,GAAA,OAAO,QAAQc,EAAK,OAAO,YAAa,MAAQyD,CAAM,IAAM,EAAG,SACnE,MAAMC,EAAU,KAAK,GAAG,YAAY7K,EAAA,GAAG,WAAY4K,CAAM,EACzD,KAAK,cAAcxP,EAAS,cAAeyP,EAAS,QAASD,CAAM,EAE9D,KAAA,wBAAwB,IAAIxP,CAAO,EACxCuP,EAAQ,KAAKvP,CAAO,CAAA,CAItB,KAAK,gBAAgB,EAAE,SAAS,aAAcuP,EAAS,CAAC,CAAE,GAAA1Q,KAAS,KAAK,aAAaA,CAAE,CAAC,EAEpF0Q,EAAQ,OAAS,GAAG,KAAK,mBAAmB,CAAA,CAG3C,WAAWvP,EAAiB0P,EAAoC,CACjE,GAAA,KAAK,WAAW,IAAI1P,CAAO,IAAM,OAAW,MAAM,IAAI,MAAM,eAAe,EAC3E,KAAK,oBAAoB,IAAIA,CAAO,IAAM0P,IAC1CA,IAAa,OAAgB,KAAA,oBAAoB,OAAO1P,CAAO,EACzD,KAAA,oBAAoB,IAAIA,EAAS0P,CAAQ,EAC9C,KAAA,2BAA2B,IAAI1P,CAAO,EAEtC,KAAA,wBAAwB,IAAIA,CAAO,EACxC,KAAK,mBAAmB,EAAA,CAGnB,iBAAiBA,EAAiB2P,EAA+B,CACtE,KAAK,iBAAiB3P,EAAS,gBAAiB,KAAK,qBAAqB2P,CAAQ,CAAC,EACnF,KAAK,mBAAmB,CAAA,CAkBlB,UAAUC,EAAuBC,EAA4C,CACnF,MAAMC,EAA6B,CAAC,EAC3B,OAAAF,EAAA,QAAS/Q,GAAO,CACjB,MAAAkN,EAAO,KAAK,aAAalN,CAAE,EAC7B,GAAAkN,EAAK,OAAO8D,CAAQ,IAAM,QAAa9D,EAAK,OAAO8D,CAAQ,EAAG,MAAQ,OAClE,MAAA,IAAI,MAAM,+CAA+C,EAChDC,EAAA,KAAKlL,KAAG,aAAa,KAAK,GAAImH,EAAK,OAAO8D,CAAQ,EAAG,GAAI,CAAC,CAAA,CAC5E,EACMzK,GAA4B,KAAK,GAAI0K,CAAgB,CAAA,CAGtD,UAAUvM,EAAqB,CAC9B,OAAA6J,GAAc,KAAK,GAAIxI,KAAG,aAAa,KAAK,GAAI,KAAK,kBAAkB,EAAGrB,CAAG,CAAA,CAG9E,iBAAiBvD,EAAiB,CACxC,KAAK,aAAaA,CAAO,EAEnB,MAAA+L,EAAO,KAAK,aAAa/L,CAAO,EAEhCuD,EAAM,KAAK,UAAU,KAAK,gBAAA,EAAkB,MAAM,IAAIvD,CAAO,EAAG,SAAU,YAAY,EAExF,GAAA,KAAK,SAASA,CAAO,EAAE,gBAAkB,QAAS,MAAM,IAAI,MAAM,mBAAmB,EAEzF,MAAMqE,EAAM0H,EAAK,YAAY,KAAK,EAAE,EAE9BgE,EAAU7K,GAAuB,KAAK,GAAIb,EAAK,CACnD,KAAM0H,EAAK,OAAO,YAAa,IAC/B,QAAS,KAAK,GAAG,YAAYnH,EAAAA,GAAG,WAAY,KAAK,UAAU5E,CAAO,CAAC,EACnE,aAAc,KAAK,GAAG,YAAY4E,EAAAA,GAAG,SAAU,KAAK,UAAU,EAAK,CAAC,EACpE,QAASrB,CAAA,CACV,EAEI,KAAA,cACHvD,EACA,aACA4E,EAAAA,GAAG,gBAAgB,KAAK,GAAImL,EAAQ,OAAO,EAC3C,UACF,EAEK,KAAA,cAAc/P,EAAS,eAAgB,KAAK,UAAU+P,EAAQ,OAAO,EAAG,UAAU,EAEvF,KAAK,cAAc/P,EAAS,gBAAiB+P,EAAQ,OAAQ,UAAU,CAAA,CAGjE,oBAAoB/P,EAAiB,CAC3C,KAAK,gBAAgBA,CAAO,EAEtB,MAAA+L,EAAO,KAAK,aAAa/L,CAAO,EAEhCuD,EAAM,KAAK,UACf,KAAK,0BAA0B,EAAE,MAAM,IAAIvD,CAAO,EAAG,SACrD,SACF,EAEA,GAAI,KAAK,SAASA,CAAO,EAAE,gBAAkB,QACrC,MAAA,IAAI,MAAM,0CAA0C,EAE5D,MAAMqE,EAAM0H,EAAK,YAAY,KAAK,EAAE,EAE9BgE,EAAU7K,GAAuB,KAAK,GAAIb,EAAK,CACnD,KAAM0H,EAAK,OAAO,YAAa,IAC/B,QAAS,KAAK,GAAG,YAAYnH,EAAAA,GAAG,WAAY,KAAK,UAAU5E,CAAO,CAAC,EACnE,aAAc,KAAK,GAAG,YAAY4E,EAAAA,GAAG,SAAU,KAAK,UAAU,EAAI,CAAC,EACnE,QAASrB,CAAA,CACV,EACI,KAAA,cACHvD,EACA,UACA4E,EAAAA,GAAG,gBAAgB,KAAK,GAAImL,EAAQ,OAAO,EAC3C,UACF,EACK,KAAA,cAAc/P,EAAS,YAAa,KAAK,UAAU+P,EAAQ,OAAO,EAAG,UAAU,EACpF,KAAK,cAAc/P,EAAS,aAAc+P,EAAQ,OAAQ,UAAU,EAGpE,KAAK,iBAAiB/P,EAAS,WAAY+L,EAAK,OAAO,WAAY,EAG/D,KAAK,cAAc,OAAO/L,CAAO,SAAQ,sBAAwB,GAAA,CAQhE,gBACLgQ,EACAC,EAA0DjC,GACpD,CACA,MAAAkC,EAAsB,KAAK,gBAAgB,EAC3CC,EAA+B,KAAK,yBAAyB,EAE7DC,EAAkBpE,GAAagE,CAAY,EAG3CK,EAA2BlE,GAC/B6D,EACChQ,GAAY,OAAA,OAAAE,EAAA,KAAK,WAAW,IAAIF,CAAO,IAA3B,YAAAE,EAA8B,uBAC7C,EAEMoQ,EAAc5D,GAAUwD,EAAqBE,CAAe,EAC5DG,EAAW7D,GAAUyD,EAA8BE,CAAwB,EAGtE,UAAArQ,KAAWsQ,EAAY,QAAS,CACzC,KAAM,CAAE,OAAAxC,CAAW,EAAA,KAAK,aAAa9N,CAAO,EAC5C,KAAK,kBAAkBA,EAAS,GAAI,OAAO,KAAK8N,CAAM,CAAiC,EAClF,KAAA,WAAW,OAAO9N,CAAO,EAC1B,KAAK,cAAc,OAAOA,CAAO,SAAQ,sBAAwB,IACjE,KAAK,oBAAoB,OAAOA,CAAO,GAAQ,KAAA,2BAA2B,IAAIA,CAAO,CAAA,CAIhF,UAAAA,KAAWsQ,EAAY,QAAS,CACzC,MAAMvE,EAAO,IAAI8B,GAAU7N,EAAS,CAAA,CAAE,EACjC,KAAA,WAAW,IAAIA,EAAS+L,CAAI,EAC3B,MAAAtG,EAAOwK,EAAqBjQ,CAAO,EAGnCuK,EAAKC,GAAgB,KAAK,GAAI/E,EAAK,SAAS,EAC7C,KAAA,cAAczF,EAAS,YAAa4E,EAAA,GAAG,aAAa,KAAK,GAAI2F,CAAE,EAAG,UAAU,EAG5E,KAAA,iBACHvK,EACA,gBACA,KAAK,qBAAqB4O,EAAoB,oBAAA,CAChD,EAGA,KAAK,iBAAiB5O,EAAS,cAAe,KAAK,8BAA8ByF,EAAK,IAAI,CAAC,EAGvFA,EAAK,UACP,KAAK,oBAAoB,IAAIzF,EAASyF,EAAK,OAAO,EAC7C,KAAA,2BAA2B,IAAIzF,CAAO,GAI7C+L,EAAK,MAAM,CAAA,CAIb,UAAW/L,KAAWsQ,EAAY,UAAW,KAAK,aAAatQ,CAAO,EAIzCmQ,EAAA,SAAS,aAAc,CAAC,GAAGI,EAAS,SAAS,EAAI/M,GAAS,CAChF,KAAA,uBAAuBA,EAAK,EAAE,CAAA,CACpC,GAGC8M,EAAY,QAAQ,KAAO,GAC3BA,EAAY,QAAQ,KAAO,GAC3BA,EAAY,UAAU,KAAO,IAE7B,KAAK,6BAA6B,EAEpC,KAAK,OAASN,EACd,KAAK,iBAAmB,GACxB,KAAK,aAAe,OACpB,KAAK,uBAAyB,OAC9B,KAAK,sBAAwB,OAE7B,KAAK,mBAAmB,CAAA,CAOnB,SAASlB,EAAcrJ,EAAoB+K,EAAuB,CACvE,MAAMC,EAAY,KAAK,UACvB,GAAID,IAAW,OAEHC,EAAA,OAAOA,EAAU,OAAO,OAAS,CAAC,EAAE,OAAO,KAAK3B,CAAK,MAC1D,CACL,IAAI4B,EAAO,GACA,UAAAC,KAASF,EAAU,OAAQ,CAC9B,MAAAG,EAAMD,EAAM,OAAO,UAAW/J,GAAMA,EAAE,KAAO4J,CAAM,EACzD,GAAI,EAAAI,EAAM,GACV,CAAAD,EAAM,OAAO,OAAOC,EAAK,EAAG9B,CAAK,EAC1B4B,EAAA,GACP,MAAA,CAEF,GAAI,CAACA,EAAM,MAAM,IAAI,MAAM,+BAA+BF,CAAM,EAAE,CAAA,CAE/D,KAAA,gBAAgBC,EAAYzQ,GAAY,CAC3C,GAAIA,IAAY8O,EAAM,GAAU,MAAA,IAAI,MAAM,YAAY,EAC/C,OAAArJ,CAAA,CACR,CAAA,CAGI,YAAYzF,EAAuB,CACxC,MAAMyQ,EAAY,KAAK,UACvB,IAAIC,EAAO,GACA,UAAAC,KAASF,EAAU,OAAQ,CAC9B,MAAAG,EAAMD,EAAM,OAAO,UAAW/J,GAAMA,EAAE,KAAO5G,CAAO,EAC1D,GAAI,EAAA4Q,EAAM,GACJ,CAAAD,EAAA,OAAO,OAAOC,EAAK,CAAC,EACnBF,EAAA,GACP,MAAA,CAEF,GAAI,CAACA,EAAM,MAAM,IAAI,MAAM,+BAA+B1Q,CAAO,EAAE,EACnE,KAAK,gBAAgByQ,CAAS,CAAA,CAOzB,iBAAiBzQ,EAAiByF,EAA6BoL,EAAwB,CACtF,MAAA9E,EAAO,KAAK,aAAa/L,CAAO,EAEjC,KAAA,cACHA,EACA,YACA4E,KAAG,aAAa,KAAK,GAAI4F,GAAgB,KAAK,GAAI/E,CAAI,CAAC,EACvD,UACF,EAEIoL,IAAY,QAEd,KAAK,QAAQ,CAAC,CAAE,QAAA7Q,EAAS,KAAM6Q,CAAA,CAAS,CAAC,EAEpC,KAAA,WAAW7Q,EAAS,MAAS,GAIlC,KAAK,gBAAgB,EAAE,SAAS,aAAc,CAACA,CAAO,EAAG,CAAC,CAAE,GAAAnB,CAAG,IAAM,KAAK,aAAaA,CAAE,CAAC,EAGxFkN,EAAK,oBACP,KAAK,2BAA2B,SAAS,aAAc,CAAC/L,CAAO,EAAG,CAAC,CAAE,GAAAnB,CAAA,IACnE,KAAK,uBAAuBA,CAAE,CAChC,EAEF,KAAK,mBAAmB,CAAA,CAOnB,iBAAiBiS,EAAoBC,EAAwB,GAAoB,CAChF,MAAAC,EAAc,IAAI,IAAIF,CAAQ,EAE9BG,EAAY,KAAK,0BAA0B,EAC7C,GAAAF,EAEFE,EAAU,SAAS,WAAYH,EAAWtN,GAAS,CACrCwN,EAAA,IAAIxN,EAAK,EAAE,CAAA,CACxB,MAGD,WAAWxD,KAAWgR,EAAa,CACjC,MAAMxN,EAAOyN,EAAU,MAAM,IAAIjR,CAAO,EACxC,GAAIwD,IAAS,OAAW,MAAM,IAAI,MAAM,6BAA6BxD,CAAO,EAAE,EAC9E,UAAW4P,KAAYpM,EAAK,SACtB,GAAA,CAACwN,EAAY,IAAIpB,CAAQ,EACrB,MAAA,IAAI,MAAM,kDAAkD,CAAA,CAIpE,MAAAsB,MAAe,IACrB,UAAWpC,KAAS5D,GAAU,KAAK,SAAS,EAAG,CAC7C,GAAI,CAAC8F,EAAY,IAAIlC,EAAM,EAAE,EAAG,SAE5B,IAAAqC,EACF,KAAK,aAAarC,EAAM,EAAE,EAAE,4BAA8B,KAAK,cAAc,IAAIA,EAAM,EAAE,EAE3F,GAAI,CAACqC,GACH,UAAWvB,KAAYqB,EAAU,MAAM,IAAInC,EAAM,EAAE,EAAG,SAChD,GAAAoC,EAAS,IAAItB,CAAQ,EAAG,CACjBuB,EAAA,GACT,KAAA,EAGFA,IACG,KAAA,oBAAoBrC,EAAM,EAAE,EACxBoC,EAAA,IAAIpC,EAAM,EAAE,EACvB,CAIF,OAAAmC,EAAU,SAAS,aAAc,CAAC,GAAGC,CAAQ,EAAI1N,GAAS,CACpD0N,EAAS,IAAI1N,EAAK,EAAE,GAGnB,KAAA,uBAAuBA,EAAK,EAAE,CAAA,CACpC,EAEG0N,EAAS,KAAO,GAAG,KAAK,mBAAmB,EAExCA,CAAA,CAKF,kBAAkBJ,EAAoB,SACrC,MAAAM,EAAkB,KAAK,yBAAyB,EAGhDC,EAAQ,IAAIC,GAAOR,CAAQ,EAC3BjF,EAAS,IAAI,IAAIiF,CAAQ,EACzBS,EAAoB,CAAC,EAEpB,KAAA,CAACF,EAAM,WAAW,CACjB,MAAArR,EAAUqR,EAAM,MAAM,EACtBvD,EAAS,KAAK,aAAa9N,CAAO,EAAE,OAE1C,GAAI,IAAAE,EAAA4N,EAAO,aAAP,YAAA5N,EAAmB,UAAW,WAAWkP,EAAAtB,EAAO,UAAP,YAAAsB,EAAgB,UAAW,UAIpE,KAAK,kBAAkBpP,EAAS,aAAc,UAAW,YAAa,UAAU,EAAG,CAErFuR,EAAQ,KAAKvR,CAAO,EAGpB,UAAWwR,KAAcJ,EAAgB,0BAA0B,aAAcpR,CAAO,EAClF6L,EAAO,IAAI2F,CAAU,IACzBH,EAAM,KAAKG,CAAU,EACrB3F,EAAO,IAAI2F,CAAU,EACvB,CACF,CAIF,UAAWxR,KAAWoR,EAAgB,0BAA0B,aAAc,GAAGG,CAAO,EACtF,KAAK,uBAAuBvR,CAAO,CAAA,CAG/B,uBAAuB2L,EAA4C,CACnE,MAAA8F,MAAW,IACI,KAAK,gBAAgB,EAC7B,MAAM,QAASjO,GAAS,CAE/B,IAAAkO,EADS,KAAK,aAAalO,EAAK,EAAE,EACvB,gBAAkB,EAAI,EAChCA,EAAA,SAAS,QAASoM,GAAa,CAC5B,MAAA+B,EAAcF,EAAK,IAAI7B,CAAQ,EACjC+B,IAAgB,IACpBD,EAAM,KAAK,IAAIC,EAAc,EAAGD,CAAG,EAAA,CACpC,EACE/F,EAAAnI,EAAK,GAAIkO,CAAG,EACVD,EAAA,IAAIjO,EAAK,GAAIkO,CAAG,CAAA,CACtB,CAAA,CAIK,gBAAgBE,EAA+B,CACrD,MAAMC,EAAU,KAAK,IAAI,EAAI,KAAK,eAAe,wBAC3CC,EACJF,IAAyB,OACrB,OACA,EAAI,KAAK,IAAI,EAAIC,EAAUD,EAAwB,GAAI,EAC7D,IAAIV,EAAW,EACV,KAAA,uBAAuB,CAAClR,EAAS0R,IAAQ,CACxCA,IAAQ,IAGRI,IAAiB,QAAaJ,GAAOI,KACvC,KAAK,iBAAiB9R,CAAO,EAC7BkR,IACF,CACD,EACGA,EAAW,GAAG,KAAK,6BAA6B,CAAA,CAQ/C,QAAQtN,EAAyB,CACtC,KAAK,KAAOA,EACZ,KAAK,YAAc,GACnB,KAAK,mBAAmB,CAAA,CAQnB,UAAUgO,EAA+B,CAC9C,KAAK,gBAAgBA,CAAoB,EACpC,KAAA,WAAW,QAASlD,GAAc,eAEnCxO,EAAAwO,EAAU,OAAO,UAAjB,YAAAxO,EAA0B,UAAW,WACrCkP,EAAAV,EAAU,OAAO,aAAjB,YAAAU,EAA6B,UAAW,SAEnC,KAAA,kBACHV,EAAU,GACV,qBACA,kBACA,mBACF,IAEAW,EAAAX,EAAU,OAAO,aAAjB,YAAAW,EAA6B,UAAW,WACxC0C,EAAArD,EAAU,OAAO,gBAAjB,YAAAqD,EAAgC,UAAW,SAEtC,KAAA,kBACHrD,EAAU,GACV,wBACA,qBACA,sBACF,CAAA,CACH,CAAA,CAGK,qBAAsB,CAC5B,MAAMsD,EAAY,KAAK,OAAS,KAAK,UAAU,KAAK,MAAM,EAAI,OAE9D,UAAWhS,KAAW,KAAK,wBACrBgS,IAAc,OAAgB,KAAA,GAAG,aAAa,KAAK,IAAKnQ,GAAmB7B,CAAO,CAAC,EAClF,KAAK,GAAG,UAAU,KAAK,IAAK6B,GAAmB7B,CAAO,EAAGgS,CAAS,GAErE,KAAK,aAAe,KAAK,oBACvBA,IAAc,OAAW,KAAK,GAAG,aAAa,KAAK,IAAKlQ,EAAyB,OAC3E,GAAG,UAAU,KAAK,IAAKA,GAA2BkQ,CAAS,EACvE,CAGK,MAAO,CACR,GAAC,KAAK,YAEV,CAAI,KAAK,qBACF,KAAA,GAAG,UAAU,KAAK,IAAK3Q,GAA8B,KAAK,UAAU,KAAK,YAAY,CAAC,EAEzF,KAAK,kBACF,KAAA,GAAG,UAAU,KAAK,IAAKE,GAAqB,KAAK,UAAU,KAAK,MAAM,CAAC,EAE1E,KAAK,uBACP,KAAK,GAAG,UACN,KAAK,IACLC,GACA,KAAK,UAAU,CACb,GAAG,KAAK,eACR,cAAe,CAAC,GAAG,KAAK,aAAa,CACb,CAAA,CAC5B,EAEE,KAAK,aAAkB,KAAA,GAAG,UAAU,KAAK,IAAKF,GAAgB,KAAK,UAAU,KAAK,IAAI,CAAC,EAEhF,UAAAtB,KAAW,KAAK,2BAA4B,CACrD,MAAMiS,EAAU,KAAK,oBAAoB,IAAIjS,CAAO,EAChDiS,IAAY,OAAgB,KAAA,GAAG,aAAa,KAAK,IAAKtQ,GAAsB3B,CAAO,CAAC,EACnF,KAAK,GAAG,UAAU,KAAK,IAAK2B,GAAsB3B,CAAO,EAAGiS,CAAO,CAAA,CAG1E,KAAK,oBAAoB,EAAA,CAG3B,aAAoB,KAClB7N,EACAnB,EACAiL,EACyB,CACzB,MAAMgE,EAAqB9N,EAAG,gBAAgBnB,EAAK,EAAI,EACjDkP,EAAU/N,EAAG,cAAsBnB,EAAK/B,EAAgB,EACxDkR,EAAgBhO,EAAG,cAAsBnB,EAAK5B,EAA4B,EAC1EgR,EAAQjO,EAAG,cAA2BnB,EAAK3B,EAAc,EACzDgR,EAAalO,EAAG,cAAgCnB,EAAK1B,EAAmB,EACxEgR,EAAkBnO,EAAG,cAAqCnB,EAAKzB,EAAsB,EAErFgR,EAASpO,EAAG,oBAAoBnB,CAAG,EAGnC,CACJwP,EACAtE,EACApK,EACAH,EACAuH,EACA,CAAE,wBAAAuH,EAAyB,cAAApE,CAAc,EACzCqE,CAAA,EACE,MAAM,QAAQ,IAAI,CACpBT,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CAAA,CACD,EACD,GAAIrE,IAAWhN,GACb,MAAM,IAAI,MACR,6EAA6EgN,CAAM,EACrF,EAGI,MAAAyE,MAAsB,IACjB,UAAApV,KAAKiV,EAAkB,OAAQ,CAClC,MAAAI,EAAerQ,GAAkBhF,EAAE,IAAI,EAG7C,GAAIqV,IAAiB,OAAW,SAEhC,IAAI9G,EAAO6G,EAAgB,IAAIC,EAAa,OAAO,EAC/C9G,IAAS,SACJA,EAAA,CACL,GAAI8G,EAAa,QACjB,OAAQ,CAAA,CACV,EACgBD,EAAA,IAAIC,EAAa,QAAS9G,CAAI,GAGhDA,EAAK,OAAO8G,EAAa,SAAS,EAAIC,EAAA,iBAAiBtV,EAAE,KAAK,EAC1D,CAAE,SAAU,CACZ,EAAA,CAAE,SAAU,EAAG,IAAKA,EAAE,KAAM,CAAA,CAI5B,MAAAuV,GAAuB,MAAM9F,GAAkC,EAG/D+F,GAA6B7Q,GAAwB4Q,GAAqB,IAAI,EAC9EE,EAAoBR,EAAkB,OAAO,KAChDjV,GAAMA,EAAE,OAASwV,EACpB,EACI,IAAAvE,EACAwE,IAAsB,OACHxE,EAAAyE,EAAAA,wBAAwBD,EAAkB,KAAK,GAEpExE,EAAqB7J,EAAAA,GAAG,aAAaR,EAAIuE,GAAavE,EAAI2O,GAAqB,IAAI,CAAC,EACjF3O,EAAA,YACDV,EAAAA,MAAMT,EAAKd,GAAwB4Q,GAAqB,IAAI,CAAC,EAC7D,UACAtE,CACF,GAGI,MAAAJ,GAAiB,CAAE,wBAAAqE,CAAwB,EAC3CS,EAAmB,IAAI,IAAI7E,CAAa,EAExCE,MAA0B,IAChC,UAAW4E,KAAMT,EAAO,CAChB,MAAA3S,EAAU+B,GAA2BqR,EAAG,GAAG,EAC7CpT,IAAY,QACIwO,EAAA,IAAIxO,EAASoT,EAAG,KAAK,CAAA,CAG3C,MAAM9D,EAA4D,CAAC,EACnEsD,EAAiB,QAAQ,CAAC,CAAE,GAAA/T,EAAI,OAAAiP,KAAa,CAC3C,SAAW,CAAG,CAAAiB,CAAK,IAAK,OAAO,QAAQjB,CAAM,EACvC,GAAAiB,EAAM,MAAQ,OAClB,IAAI,CAACsE,EAAW,WAAAtE,EAAM,GAAG,GAAKuE,EAAA,cAAcvE,EAAM,GAAG,EAC7C,MAAA,IAAI,MAAM,sBAAsB,EAC/BO,EAAA,KAAK,CAACP,EAAO3K,EAAG,gBAAgB2K,EAAM,IAAK,EAAK,CAAC,CAAC,EAC7D,CACD,EACD,SAAW,CAACA,EAAOwE,CAAQ,IAAKjE,EAAU,CACxC,MAAMlR,EAAS,MAAMmV,EACrBxE,EAAM,MAAQ3Q,EAAO,KACjBoV,EAAAA,oBAAoBpV,EAAO,KAAK,IAAS,OAAS,QAC7CA,EAAO,eAAiBoV,sBAAoBpV,EAAO,kBAAkB,EAC5E2Q,EAAM,OAAS,UACN,OAAS,UAAA,CAGhB,MAAAR,MAAiB,IACvBqE,EAAgB,QAAQ,CAAC,CAAE,GAAA/T,EAAI,OAAAiP,KAAaS,EAAW,IAAI1P,EAAI,IAAIgP,GAAUhP,EAAIiP,CAAM,CAAC,CAAC,EAGnF,MAAA2F,OAAoB,IACf,UAAA7M,KAAKsE,GAAUC,CAAS,EAAG,CACpC,GAAI,CAACoD,EAAW,IAAI3H,EAAE,EAAE,EACtB,MAAM,IAAI,MAAM,iDAAiDA,EAAE,EAAE,EAAE,EAC3D6M,GAAA,IAAI7M,EAAE,EAAE,CAAA,CAEb2H,EAAA,QAASxC,GAAS,CAC3B,GAAI,CAAC0H,GAAc,IAAI1H,EAAK,EAAE,EAC5B,MAAM,IAAI,MAAM,0DAA0DA,EAAK,EAAE,EAAE,EAErFA,EAAK,MAAM,CAAA,CACZ,EAED,MAAMpI,EAAM,IAAIsK,GACdhL,EACAmB,EACA8J,EACAC,EACApK,EACAH,EACAuH,EACAkD,GACA8E,EACA5E,EACAC,EACAC,CACF,EAEA,OAAA9K,EAAI,sBAAsB,EAEnBA,CAAA,CAEX,CAUsB,eAAA+P,GACpBtP,EACAR,EAAoB5C,GACK,CACnB,MAAA2C,EAAMS,EAAG,gBAAgBnD,EAAmB,EAClDmD,EAAG,KAAKT,CAAG,EACX,MAAMgQ,EAAK,OAAO,KAAK,IAAA,CAAK,EAC5BvP,EAAG,UAAUT,EAAKzC,GAAkB,KAAK,UAAUC,EAAoB,CAAC,EACrEiD,EAAA,UAAUT,EAAKvC,GAAyBuS,CAAE,EAC1CvP,EAAA,UAAUT,EAAKtC,GAA8BsS,CAAE,EAClDvP,EAAG,UAAUT,EAAKrC,GAAgB,KAAK,UAAUsC,CAAI,CAAC,EACtDQ,EAAG,UAAUT,EAAKpC,GAAqB,KAAK,UAAUT,EAAqB,CAAC,EAC5EsD,EAAG,UAAUT,EAAKnC,GAAwB,KAAK,UAAUT,EAA4B,CAAC,EAChF,MAAAgS,EAAuB,MAAM9F,GAAkC,EAClE,OAAA7I,EAAA,YACDV,EAAAA,MAAMC,EAAKxB,GAAwB4Q,EAAqB,IAAI,CAAC,EAC7D,UACAnO,KAAG,aAAaR,EAAIuE,GAAavE,EAAI2O,EAAqB,IAAI,CAAC,CACjE,EACOpP,CACT,CAEsB,eAAAiQ,GACpBC,EACA5Q,EACA0I,EACY,CACZ,OAAOmI,GAAoBD,EAAQ5Q,EAAK,OAAW0I,CAAE,CACvD,CAEA,eAAsBmI,GACpBD,EACA5Q,EACAiL,EACAvC,EACY,CACZ,GAAIkI,aAAkBE,EAAAA,SACpB,OAAO,MAAMF,EAAO,YAAY,gBAAiB,MAAOzP,GAAO,CAC7D,MAAM4P,EAAM,MAAM/F,GAAe,KAAK7J,EAAInB,EAAKiL,CAAM,EAC/C9P,EAAS,MAAMuN,EAAGqI,CAAG,EAC3B,OAAKA,EAAI,cAITA,EAAI,KAAK,EACT,MAAM5P,EAAG,OAAO,GACThG,CAAA,CACR,EACI,CACL,MAAM4V,EAAM,MAAM/F,GAAe,KAAK4F,EAAQ5Q,EAAKiL,CAAM,EACnD9P,EAAS,MAAMuN,EAAGqI,CAAG,EAC3B,OAAAA,EAAI,KAAK,EACF5V,CAAA,CAEX,CC3nCO,SAAU6V,GAAYC,EAAgD,CAC3E,OAAQA,EAAK,KAAM,CACjB,IAAK,OACH,OACF,IAAK,kBACQ,SAAA,CAAA,CAAGC,CAAI,IAAK,OAAO,QAAQD,EAAK,KAAK,EAAS,MAAAC,EACzD,OACF,IAAK,oBACQ,SAAA,CAAA,CAAG,CAAE,MAAAC,EAAO,OAAAC,CAAQ,CAAA,IAAK,OAAO,QAAQH,EAAK,KAAK,EACrD,MAAAE,EACA,MAAAC,EAER,OACF,QACEzU,EAAAA,YAAYsU,CAAI,CAAA,CAEtB,CAEA,SAASI,GACP3J,EACA4J,EAC6B,CAC7B,OAAO,OAAO,YACX,OAAO,QAAQ5J,CAAG,EAChB,IAAI,CAAC,CAAC3I,EAAK2L,CAAK,IAAM,CAAC3L,EAAKuS,EAAS5G,EAAO3L,CAAG,CAAC,CAAC,CACtD,CACF,CAEgB,SAAAwS,GACdN,EACAO,EAC6B,CAC7B,OAAQP,EAAK,KAAM,CACjB,IAAK,OACI,MAAA,CAAE,GAAGA,CAAK,EACnB,IAAK,kBACI,MAAA,CAAE,GAAGA,EAAM,MAAOI,GAAUJ,EAAK,MAAOO,CAAO,CAAE,EAC1D,IAAK,oBACI,MAAA,CACL,GAAGP,EACH,MAAOI,GAAUJ,EAAK,MAAQjV,IAAO,CACnC,MAAOwV,EAAQxV,EAAE,KAAK,EACtB,OAAQwV,EAAQxV,EAAE,MAAM,CAAA,EACxB,CACJ,EACF,QACEW,EAAAA,YAAYsU,CAAI,CAAA,CAEtB,CAEa,MAAAQ,GAA6BC,EAAAA,aAAa,8BAA+B,GAAG,EAC5EC,GAAkCD,EAAA,aAC7C,0CACA,GACF,EACaE,GAA+BF,EAAAA,aAAa,gCAAiC,GAAG,EAChFG,GAAoCH,EAAA,aAC/C,4CACA,GACF,EACaI,GAAkBJ,EAAAA,aAAa,mBAAoB,GAAG,EAgB5D,SAASK,GACdd,EACuC,CACvC,GAAI,CAACA,EAAK,kBAAA,EAA2B,MAAA,IAAI,MAAM,iBAAiB,EAE1D,MAAAe,EAAef,EAAK,cAAc,EACxC,GAAIe,IAAiB,OACb,MAAA,IAAI,MAAM,kDAAkD,EAEpE,GAAInS,qBAAmBoR,EAAK,aAAca,EAAe,EAAG,CAC1D,MAAMG,EAAcD,EAEb,MAAA,CACL,KAAM,OACN,UAAWC,EAAY,UACvB,KAAMA,EAAY,IACpB,CACS,SAAApS,EAAAA,mBAAmBoR,EAAK,aAAcQ,EAA0B,EAAG,CAC5E,MAAM9Q,EAAOqR,EAEPE,EAAQ,OAAO,YACnBjB,EACG,gBAAgB,EAChB,IAAKxQ,GAAU,CAACA,EAAOwQ,EAAK,SAAS,CAAE,MAAAxQ,EAAO,mBAAoB,EAAM,CAAA,EAAE,YAAY,CAAC,CAC5F,EAEO,MAAA,CACL,KAAM,kBACN,mBAAoBE,EAAK,mBACzB,MAAAuR,CACF,CACS,SAAArS,EAAAA,mBAAmBoR,EAAK,aAAcU,EAA+B,EAAG,CACjF,MAAMhR,EAAOqR,EAEPE,EAAsC,CAAC,EAClC,UAAAC,KAAYlB,EAAK,kBAAmB,CACvC,MAAAmB,EAAYnB,EAAK,SAAS,CAAE,MAAOkB,EAAU,mBAAoB,GAAM,EACvEE,EAAOD,EAAU,gBAAgB,EACvC,GAAIC,IAAS,OAAW,MAAM,IAAI,MAAM,mCAAmCF,CAAQ,EAAE,EAErF,UAAWpT,KAAOsT,EAAM,CAChB,MAAAC,EAAU,KAAK,UAAU,CAC7B,GAAG,KAAK,MAAMH,CAAQ,EACtB,GAAG,KAAK,MAAMpT,CAAG,CAAA,CAAoC,EACjDmT,EAAAI,CAAO,EAAIF,EAAU,SAAS,CAAE,MAAOrT,EAAK,mBAAoB,EAAM,CAAA,EAAE,YAAA,CAChF,CAGK,MAAA,CACL,KAAM,kBACN,mBAAoB4B,EAAK,wBAA0BA,EAAK,mBACxD,MAAAuR,CACF,CACS,SAAArS,EAAAA,mBAAmBoR,EAAK,aAAcW,EAA4B,EAAG,CAC9E,MAAMjR,EAAOqR,EAEPE,EAGF,CAAC,EAGM,UAAAzR,KAASwQ,EAAK,kBACnB,GAAAxQ,EAAM,SAAS,QAAQ,EAAG,CAC5B,MAAM6R,EAAU7R,EAAM,MAAM,EAAGA,EAAM,OAAS,CAAC,EAC3C,IAAA8R,EAAOL,EAAMI,CAAO,EACpBC,IAAS,SACXA,EAAO,CAAC,EACRL,EAAMI,CAAO,EAAIC,GAEdA,EAAA,MAAQtB,EAAK,SAAS,CAAE,MAAAxQ,EAAO,mBAAoB,EAAM,CAAA,EAAE,YACvD,SAAAA,EAAM,SAAS,SAAS,EAAG,CACpC,MAAM6R,EAAU7R,EAAM,MAAM,EAAGA,EAAM,OAAS,CAAC,EAC3C,IAAA8R,EAAOL,EAAMI,CAAO,EACpBC,IAAS,SACXA,EAAO,CAAC,EACRL,EAAMI,CAAO,EAAIC,GAEdA,EAAA,OAAStB,EAAK,SAAS,CAAE,MAAAxQ,EAAO,mBAAoB,EAAM,CAAA,EAAE,iBACtD,OAAA,IAAI,MAAM,iCAAiCA,CAAK,EAAE,EAIjE,SAAW,CAAC1B,EAAKwT,CAAI,IAAK,OAAO,QAAQL,CAAK,EAAG,CAC3C,GAAAK,EAAK,QAAU,OAAW,MAAM,IAAI,MAAM,qBAAqBxT,CAAG,EAAE,EACpE,GAAAwT,EAAK,SAAW,OAAW,MAAM,IAAI,MAAM,sBAAsBxT,CAAG,EAAE,CAAA,CAGrE,MAAA,CACL,KAAM,oBACN,mBAAoB4B,EAAK,mBACzB,MAAAuR,CACF,CACS,SAAArS,EAAAA,mBAAmBoR,EAAK,aAAcY,EAAiC,EAAG,CACnF,MAAMlR,EAAOqR,EAEPE,EAGF,CAAC,EACM,UAAAC,KAAYlB,EAAK,kBAAmB,CACvC,MAAAuB,EAAYvB,EAAK,SAAS,CAAE,MAAOkB,EAAU,mBAAoB,GAAM,EACvEE,EAAOG,EAAU,gBAAgB,EACvC,GAAIH,IAAS,OAAW,MAAM,IAAI,MAAM,mCAAmCF,CAAQ,EAAE,EAErF,UAAW1R,KAAS4R,EACd,GAAA5R,EAAM,SAAS,QAAQ,EAAG,CAC5B,MAAM1B,EAAM0B,EAAM,MAAM,EAAGA,EAAM,OAAS,CAAC,EAErC6R,EAAU,KAAK,UAAU,CAC7B,GAAG,KAAK,MAAMH,CAAQ,EACtB,GAAG,KAAK,MAAMpT,CAAG,CAAA,CAAoC,EACnD,IAAAwT,EAAOL,EAAMI,CAAO,EACpBC,IAAS,SACXA,EAAO,CAAC,EACRL,EAAMI,CAAO,EAAIC,GAEnBL,EAAMI,CAAO,EAAE,MAAQE,EAAU,SAAS,CACxC,MAAA/R,EACA,mBAAoB,EACrB,CAAA,EAAE,YACM,SAAAA,EAAM,SAAS,SAAS,EAAG,CACpC,MAAM1B,EAAM0B,EAAM,MAAM,EAAGA,EAAM,OAAS,CAAC,EAErC6R,EAAU,KAAK,UAAU,CAC7B,GAAG,KAAK,MAAMH,CAAQ,EACtB,GAAG,KAAK,MAAMpT,CAAG,CAAA,CAAoC,EACnD,IAAAwT,EAAOL,EAAMI,CAAO,EACpBC,IAAS,SACXA,EAAO,CAAC,EACRL,EAAMI,CAAO,EAAIC,GAEnBL,EAAMI,CAAO,EAAE,OAASE,EAAU,SAAS,CACzC,MAAA/R,EACA,mBAAoB,EACrB,CAAA,EAAE,iBACQ,OAAA,IAAI,MAAM,iCAAiCA,CAAK,EAAE,CACjE,CAGK,MAAA,CACL,KAAM,oBACN,mBAAoBE,EAAK,wBAA0BA,EAAK,mBACxD,MAAAuR,CACF,CAAA,CAGF,MAAM,IAAI,MAAM,8BAA8BO,uBAAqBxB,EAAK,YAAY,CAAC,EAAE,CACzF,CAEgB,SAAAyB,GACdlQ,EACAyO,EACuC,CACjC,MAAA0B,EAAYnQ,EAAK,SAAS,OAC1BoQ,EAAyD,CAAC,EAChE,SAAW,CAAE,IAAA7T,EAAK,IAAA8T,CAAI,IAAK5B,EAAM,CAC/B,GAAIlS,EAAI,SAAW4T,EACjB,MAAM,IAAI,MAAM,4BAA4B5T,EAAI,MAAM,4BAA4B4T,CAAS,EAAE,EAC/FC,EAAS,KAAK,UAAU7T,CAAG,CAAC,EAAI8T,CAAA,CAG3B,MAAA,CACL,KAAM,OACN,UAAAF,EACA,KAAMC,CACR,CACF,CAEgB,SAAAE,GAAsBtQ,EAAmByO,EAAqC,CACtF,MAAA9R,EAAOuF,cAAW,QAAQ,EAC3B,OAAAvF,EAAA,OAAO4T,GAAavQ,CAAI,CAAE,EAC1BrD,EAAA,OAAO,OAAQ0Q,EAAiB,iBAAAoB,EAAK,UAAU,EAAsBA,EAAK,GAAvBA,EAAK,UAAoB,CAAC,EAC3E9R,EAAK,SAAS,SAAS,KAAK,CACrC,CAEgB,SAAA6T,GAAsBjW,EAAiBkW,EAA+B,CACpF,OAAOF,GAAa,CAAE,QAAS,GAAM,QAAAhW,EAAS,KAAMkW,EAA4B,CAClF,CAEgB,SAAAC,GAAqBC,EAAuBC,EAA+B,CACzF,OAAOL,GAAa,CAAE,YAAAI,EAAa,KAAMC,EAAY,CACvD,CCzOO,SAASC,GACd9S,EACA+S,EAA+B,GAC/BC,EAA6B,GAC7BC,EAAiB,GACK,WACtB,MAAMC,EAAe,oCACf3G,MAAc,IACT,UAAAzN,KAAakB,EAAK,kBAAmB,CACxC,MAAAvB,EAAQK,EAAU,MAAMoU,CAAY,EAC1C,GAAI,CAACzU,EAAO,CACV,GAAIsU,EAA2B,MAAA,IAAI,MAAM,yBAAyBjU,CAAS,EAAE,EACxE,QAAA,CAGP,IAAIG,EAAOoB,EAAA,UAAS3D,EAAA+B,EAAM,SAAN,YAAA/B,EAAc,IAAI,EACtC,GAAI,CAACuC,EAAK,WAAWgU,CAAM,EAAG,CAC5B,GAAIF,EAA2B,MAAA,IAAI,MAAM,yBAAyBjU,CAAS,EAAE,EACxE,QAAA,CAEAG,EAAAA,EAAK,MAAMgU,EAAO,MAAM,EAE/B,MAAM3L,EAAOjH,EAAA,UAASuL,EAAAnN,EAAM,SAAN,YAAAmN,EAAc,IAAI,EACpC,IAAAhR,EAAS2R,EAAQ,IAAItN,CAAI,EAM7B,OALIrE,IAAW,SACbA,EAAS,CAAC,EACF2R,EAAA,IAAItN,EAAMrE,CAAM,GAGlB0M,EAAM,CACZ,IAAK,OACI1M,EAAA,MAAOiR,EAAA7L,EACX,SAAS,CACR,MAAOlB,EACP,YAAakU,EACb,0BAA2BA,CAC5B,CAAA,IALW,YAAAnH,EAMV,gBACJ,MACF,IAAK,OACHjR,EAAO,QAAU,GACVA,EAAA,KAAO,IACZoF,EAAK,gBAAgB,CACnB,MAAOlB,EACP,YAAakU,CAAA,CACd,EACL,QAEE,QAAA,CACJ,CAGI,MAAAG,EAASnT,EAAK,gBAAgB,EAChC,GAAAmT,EACS,SAAA,CAAG,CAAAvY,CAAM,IAAK2R,EAAa3R,EAAO,OAAS,SAAWA,EAAO,QAAU,IAE7E,MAAA,CAAE,OAAAuY,EAAQ,QAAA5G,CAAQ,CAC3B,CAEO,SAAS6G,GACdpT,EACA+S,EAA+B,GAC/BE,EAAiB,GACjBL,EAC6C,CAC7C,GAAI,CAAC5S,EAAK,kBAAA,EAA2B,MAAA,IAAI,MAAM,uBAAuB,EACtE,MAAMqT,EAAgBP,GAA0B9S,EAAM+S,EAAqB,GAAOE,CAAM,EACxFK,GAAOD,EAAc,MAAM,EAC3B,MAAME,EAA0D,CAAC,EACjE,SAAW,CAACV,EAAYjY,CAAM,IAAKyY,EAAc,QAAS,CACpD,GAAAzY,EAAO,OAAS,OAAW,MAAM,IAAI,MAAM,mBAAmBiY,CAAU,EAAE,EAC9E,GAAIjY,EAAO,UAAY,IAAQA,EAAO,OAAS,OAC7C,MAAM,IAAI,MAAM,mBAAmBiY,CAAU,EAAE,EAC3C,MAAAnC,EAAO9V,EAAO,KAAK,EACzB,GAAI8V,IAAS,OAAW,MAAM,IAAI,MAAM,mBAAmBmC,CAAU,EAAE,EACvE,GAAI,CAACnC,EAAK,SAAU,IAAI8C,GAAA,QAAQ9C,EAAK,KAAK,EAC1C6C,EAAWV,CAAU,EAAI,CACvB,GAAID,EAAY,SAAW,EACvBL,GAAsB3X,EAAO,KAAM8V,EAAK,KAAK,EAC7CiC,GAAqBC,EAAaC,CAAU,EAChD,KAAMjY,EAAO,KACb,KAAM8V,EAAK,KACb,CAAA,CAEK,OAAA6C,CACT,CCxEO,MAAME,EAAW,CAEd,YACW1T,EACA2T,EACjB,CAJe7W,EAAA,0BAEE,KAAA,IAAAkD,EACA,KAAA,OAAA2T,EAEjB,IAAIC,EAAoB,GACxBC,EAAkB,UAAAtI,KAASoI,EAAO,OAAA,EAChC,UAAW3T,IAAO,CAACuL,EAAM,KAAMA,EAAM,OAAO,EAC1C,GAAIvL,IAAQ,OAAW,CACjB,GAAA,CAACA,EAAI,OAAQ,CACK4T,EAAA,GACd,MAAAC,CAAA,CAER,UAAWhZ,KAAUmF,EAAI,QAAQ,OAAA,EAC3B,GAAAnF,EAAO,OAAS,OAAW,CACT+Y,EAAA,GACd,MAAAC,CAAA,CAEV,CAGN,KAAK,kBAAoBD,CAAA,CAGpB,aAAanX,EAAiBkW,EAA6C,iBAChF,MAAMpH,EAAQ,KAAK,OAAO,IAAI9O,CAAO,EACjC,GAAA8O,IAAU,OAAkB,OAChC,IAAI1Q,GAASiR,GAAAD,GAAAlP,EAAA4O,EAAM,OAAN,YAAA5O,EAAY,UAAZ,YAAAkP,EAAqB,IAAI8G,KAAzB,YAAA7G,EAAsC,KAG/C,GAFAjR,IAAW,SACfA,GAASiZ,GAAAC,GAAAvF,EAAAjD,EAAM,UAAN,YAAAiD,EAAe,UAAf,YAAAuF,EAAwB,IAAIpB,KAA5B,YAAAmB,EAAyC,KAC9CjZ,IAAW,QAAkB,OAAAA,EAC7B0Q,EAAM,UAAY,OAAW,KAAK,IAAI,aAAa,wBAAwB9O,CAAO,EAAE,EAC9E8O,EAAM,QAAQ,OACfA,EAAM,OAAS,QAAa,CAACA,EAAM,KAAK,QAC/C,KAAK,IAAI,aAAa,mBAAmB9O,CAAO,EAAE,OAFf,IAAI,aAAa,sBAAsBA,CAAO,EAAE,CAI9E,CAGF,oBACLA,EACAkW,EAC+D,WAC/D,MAAMpH,EAAQ,KAAK,OAAO,IAAI9O,CAAO,EACjC,GAAA8O,IAAU,OAAkB,OAChC,IAAI1Q,GAASgR,GAAAlP,EAAA4O,EAAM,OAAN,YAAA5O,EAAY,UAAZ,YAAAkP,EAAqB,IAAI8G,GAClChC,GAAO7E,EAAAjR,GAAA,YAAAA,EAAQ,OAAR,YAAAiR,EAAA,KAAAjR,GACX,GAAIA,IAAW,QAAaA,EAAO,OAAS,QAAa8V,IAAS,OACzD,OAAAqD,EAAA,cAAcrD,EAAOvG,IAAW,CACrC,GAAIsI,GAAsBjW,EAASkW,CAAU,EAC7C,KAAM9X,EAAQ,KACd,KAAMuP,CAAA,EACN,EACAvP,IAAW,QAAgB,KAAA,IAAI,aAAa,WAAW4B,CAAO,IAAIkW,CAAU,EAAE,EAC9EpH,EAAM,OAAS,QAAa,CAACA,EAAM,KAAK,QAC1C,KAAK,IAAI,aAAa,mBAAmB9O,CAAO,EAAE,CAE7C,CAGF,aACLA,EACAkW,EACyC,CACzC,MAAMvZ,EAAM,KAAK,oBAAoBqD,EAASkW,CAAU,EACxD,GAAI,EAAAvZ,IAAQ,QAAa,CAACA,EAAI,IAC9B,OAAOA,EAAI,KAAA,CAGN,SAAiE,CAChE,MAAA6a,EAAmB,KAAK,kBAAkB,EAC1C9Q,EAA0D,CAAC,EACjE,UAAW/J,KAAO6a,EAAiB,QAC7B7a,EAAI,IAAI,KAAO,QAAaA,EAAI,IAAI,KAAK,IAC3C+J,EAAQ,KAAK,CACX,IAAK/J,EAAI,IACT,IAAK,CACH,GAAIA,EAAI,IAAI,GACZ,KAAMA,EAAI,IAAI,KACd,KAAMA,EAAI,IAAI,KAAK,KAAA,CACrB,CACD,EACE,MAAA,CACL,QAAA+J,EACA,WAAY8Q,EAAiB,WAC7B,kBAAmBA,EAAiB,iBACtC,CAAA,CAGK,mBAEL,CACA,MAAM9Q,EAEA,CAAC,EACP,IAAI+Q,EAAa,GAEbC,EACE,MAAAC,EAAgBC,GAAmB,CACnCF,IAAsB,SAA+BA,EAAAE,GAC5CH,EAAA,EACf,EAEMI,EAAc,CAAC7X,EAAiBkW,EAAoB9X,IAA4B,CAChF,GAAAA,EAAO,OAAS,QAAaA,EAAO,UAAY,IAAQA,EAAO,OAAS,OAAW,CAC/E,MAAA8V,EAAO9V,EAAO,KAAK,EACrB8V,IAAS,OACXxN,EAAQ,KAAK,CACX,IAAK+D,GAAUzK,EAASkW,CAAU,EAClC,IAAK,CACH,GAAIhC,EAAK,GAAK+B,GAAsBjW,EAASkW,CAAU,EAAI,OAC3D,KAAM9X,EAAO,KACb,KAAA8V,CAAA,CACF,CACD,EACiByD,EAAA,WAAW3X,CAAO,IAAIkW,CAAU,EAAE,CAAA,CAE1D,EAEA,SAAW,CAAClW,EAAS8O,CAAK,IAAK,KAAK,OAAQ,CACpC,MAAAgJ,MAAuB,IAEzB,GAAAhJ,EAAM,OAAS,OAAW,CACvBA,EAAM,KAAK,QAAqB6I,EAAA,mBAAmB3X,CAAO,EAAE,EACjE,SAAW,CAACkW,EAAY9X,CAAM,IAAK0Q,EAAM,KAAK,QAG5CgJ,EAAiB,IAAI5B,CAAU,EACnB2B,EAAA7X,EAASkW,EAAY9X,CAAM,CACzC,CAGE,GAAA0Q,EAAM,UAAY,OAAW,CAC1BA,EAAM,QAAQ,QAAqB6I,EAAA,sBAAsB3X,CAAO,EAAE,EAEvE,SAAW,CAACkW,EAAY9X,CAAM,IAAK0Q,EAAM,QAAQ,QAE3CgJ,EAAiB,IAAI5B,CAAU,GACvB2B,EAAA7X,EAASkW,EAAY9X,CAAM,CACzC,CACF,CAGK,MAAA,CAAE,QAAAsI,EAAS,WAAA+Q,EAAY,kBAAAC,CAAkB,CAAA,CAG3C,UAAkD,CACvD,MAAMhR,EAA0C,CAAC,EAEjD,IAAI+Q,EAAa,GAEbC,EACE,MAAAC,EAAgBC,GAAmB,CACnCF,IAAsB,SAA+BA,EAAAE,GAC5CH,EAAA,EACf,EAEA,SAAW,CAACzX,EAAS8O,CAAK,IAAK,KAAK,OAAQ,CACpC,MAAAgJ,MAAuB,IACzB,GAAAhJ,EAAM,UAAY,OAAW,CAC1BA,EAAM,QAAQ,QAAqB6I,EAAA,sBAAsB3X,CAAO,EAAE,EAEvE,SAAW,CAACkW,EAAY9X,CAAM,IAAK0Q,EAAM,QAAQ,QAC3C1Q,EAAO,OAAS,SAClBsI,EAAQ,KAAK,CACX,IAAK+D,GAAUzK,EAASkW,CAAU,EAClC,IAAK9X,EAAO,IAAA,CACb,EACD0Z,EAAiB,IAAI5B,CAAU,EAE9B,MAAAyB,EAAa,wBAAwB3X,CAAO,EAAE,EAEjD,GAAA8O,EAAM,OAAS,OAAW,CACvBA,EAAM,KAAK,QAAqB6I,EAAA,mBAAmB3X,CAAO,EAAE,EACjE,SAAW,CAACkW,EAAY9X,CAAM,IAAK0Q,EAAM,KAAK,QAExCgJ,EAAiB,IAAI5B,CAAU,GAE/B9X,EAAO,OAAS,QAClBsI,EAAQ,KAAK,CACX,IAAK+D,GAAUzK,EAASkW,CAAU,EAClC,IAAK9X,EAAO,IAAA,CACb,CAEL,CACF,CAGK,MAAA,CAAE,QAAAsI,EAAS,WAAA+Q,EAAY,kBAAAC,CAAkB,CAAA,CAG3C,iBAAiBK,EAA6C,CACnE,MAAMC,EAA0B,CAAC,EACjC,UAAWlJ,KAAS,KAAK,OAAO,OAAA,EAAU,CAClC,MAAAmJ,MAAqB,IACrBC,EAAc3U,GAA8B,CAEhD,SAAW,CAAC2S,EAAY9X,CAAM,IAAKmF,EAAI,QACjC0U,EAAe,IAAI/B,CAAU,GAAK9X,EAAO,OAAS,SACtD6Z,EAAe,IAAI/B,CAAU,EACzBiC,wBAAsBJ,EAAW3Z,EAAO,IAAI,GAC9C4Z,EAAM,KAAK,CACT,MAAOlJ,EAAM,KAAK,MAAQ,MAAQoH,EAClC,IAAKzL,GAAUqE,EAAM,KAAK,GAAIoH,CAAU,EACxC,KAAM9X,EAAO,IAAA,CACd,EAEP,EACI0Q,EAAM,UAAY,QAAWoJ,EAAWpJ,EAAM,OAAO,EACrDA,EAAM,OAAS,QAAWoJ,EAAWpJ,EAAM,IAAI,CAAA,CAE9C,OAAAkJ,CAAA,CAGT,OAAc,OAAOzU,EAAoB6U,EAAuBC,EAAiC,CAC/F,MAAM1U,EAAMJ,EAAI,SAAS6U,CAAQ,EAAE,KAAK,EAElCjN,EAAYtH,EAAA,SAASF,EAAI,kBAAoCpC,EAAmB,CAAC,EAEjF+W,EADQtM,GAAab,CAAS,EACT,YAAY,WAAYkN,CAAW,EAExDnB,MAAa,IAER,UAAAxI,KAAaxD,GAAUC,CAAS,EAAG,CAC5C,GAAI,CAACmN,EAAa,IAAI5J,EAAU,EAAE,EAAG,SAErC,MAAM6J,EAAOC,GACX7U,EAAI,SAAS,CACX,MAAOtB,EAAiBqM,EAAU,GAAI,SAAS,EAC/C,YAAa,GACb,0BAA2B,GAC3B,iBAAkB,EACnB,CAAA,IAAM,OACP/K,EAAI,gBAAgB,CAClB,MAAOtB,EAAiBqM,EAAU,GAAI,WAAW,EACjD,iBAAkB,EACnB,CAAA,CACH,EACM+J,EAAUD,GACd7U,EAAI,SAAS,CACX,MAAOtB,EAAiBqM,EAAU,GAAI,YAAY,EAClD,YAAa,GACb,0BAA2B,EAC5B,CAAA,IAAM,OACP/K,EAAI,gBAAgB,CAClB,MAAOtB,EAAiBqM,EAAU,GAAI,cAAc,CACrD,CAAA,CACH,EAEOwI,EAAA,IAAIxI,EAAU,GAAI,CAAE,KAAMA,EAAW,KAAA6J,EAAM,QAAAE,EAAS,CAAA,CAGtD,OAAA,IAAIxB,GAAW1T,EAAK2T,CAAM,CAAA,CAErC,CAGA,SAASsB,GACPE,EACAC,EACkC,CAClC,GAAIA,IAAgB,OACd,OAAAD,EAIK,CAAE,OAAQ,GAAO,QAAS,IAAI,GAAM,EACjC,OAGd,GAAIC,EAAY,GAAI,OAAOrC,GAA0BqC,EAAY,MAAO,GAAO,EAAI,CAErF,CCvSgB,SAAAC,GACdC,EACA7Y,EACsB,CAuBf,MAAA,CACL,QAAAA,EACA,KAxBY8Y,GACZjV,EAAA,SACEiV,EACG,SAASD,CAAY,EACrB,KAAA,EACA,SAAS,CACR,MAAOxW,EAAiBrC,EAAS,aAAa,EAC9C,mBAAoB,EACrB,CAAA,EACA,gBAAgB,CACrB,EAeA,WAdkB8Y,UAClB,OAAA5Y,EAAA4Y,EACG,SAASD,CAAY,EACrB,KAAK,EACL,SAAS,CACR,MAAOxW,EAAiBrC,EAAS,UAAU,EAC3C,iBAAkB,EACnB,CAAA,IANH,YAAAE,EAOI,mBAOJ,QANe4Y,GACfA,EAAK,SAASD,CAAY,EAAE,OAAO,oBAAoBlX,GAAsB3B,CAAO,CAAC,EAMrF,UAAY8Y,GAAwB,CAClC,MAAMnV,EAAMmV,EAAK,SAASD,CAAY,EAAE,KAAK,EACvC1N,EAAYtH,EAAA,SAASF,EAAI,kBAAoCpC,EAAmB,CAAC,EACjFnD,MAAa,IACR,UAAA0Q,KAAS5D,GAAUC,CAAS,IAAU,IAAI2D,EAAM,GAAIA,CAAK,EAC7D,OAAA1Q,CAAA,CAEX,CACF,CAEgB,SAAA2a,GACdF,EACA7Y,EACkB,CACX,MAAA,CACL,GAAG4Y,GAA8BC,EAAc7Y,CAAO,EACtD,KAAO8Y,GAAwB,OACtB,OAAA5Y,EAAA4Y,EACJ,SAASD,CAAY,EACrB,KAAK,CAAE,YAAa,GAAM,EAC1B,SAAS,CACR,MAAOxW,EAAiBrC,EAAS,YAAY,EAC7C,iBAAkB,GAClB,YAAa,EACd,CAAA,IAPI,YAAAE,EAQH,SACN,EACA,QAAU4Y,GAAwB,OAC1B,MAAA1a,GAAS8B,EAAA4Y,EACZ,SAASD,CAAY,EACrB,KAAK,CAAE,YAAa,GAAM,EAC1B,SAAS,CACR,MAAOxW,EAAiBrC,EAAS,eAAe,EAChD,YAAa,EACd,CAAA,IANY,YAAAE,EAOX,UACJ,OAAI9B,IAAW,QAAgB0a,EAAA,aAAa,sBAAsB,EAC3D1a,CACT,EACA,eAAiB0a,GAAwB7B,GAAW,OAAO6B,EAAMD,EAAc7Y,CAAO,CACxF,CACF,CCnGiB,SAAAgZ,EAAYC,EAAUC,EAA+C,CAGpF,OAFM,MAAAD,EAEEA,EAAI,KAAM,CAChB,IAAK,aACL,IAAK,YACH,OACF,IAAK,UACI,MAAAD,EAAYC,EAAI,GAAG,EAC1B,OACF,IAAK,aACQ,SAAA,CAAA,CAAGlO,CAAK,IAAK,OAAO,QAAQkO,EAAI,QAAQ,EAAU,MAAAD,EAAYjO,CAAK,EAC9E,OACF,IAAK,YACH,UAAWA,KAASkO,EAAI,SAAU,MAAOD,EAAYjO,CAAK,EAC1D,OACF,IAAK,eACL,IAAK,mBACI,MAAAiO,EAAYC,EAAI,MAAM,EACtB,MAAAD,EAAYC,EAAI,KAAK,EAC5B,OACF,IAAK,kBACL,IAAK,iBACL,IAAK,oBACI,MAAAD,EAAYC,EAAI,MAAM,EACtB,MAAAD,EAAYC,EAAI,OAAO,EAC9B,OACF,IAAK,UACL,IAAK,yBACL,IAAK,iBACL,IAAK,0BACL,IAAK,yBACL,IAAK,uBACL,IAAK,2BACL,IAAK,yBACL,IAAK,oBACL,IAAK,cACL,IAAK,iBACL,IAAK,yBACL,IAAK,eACI,MAAAD,EAAYC,EAAI,MAAM,EAC7B,OACF,IAAK,UACI,MAAAD,EAAYC,EAAI,GAAG,EAC1B,OACF,IAAK,MACI,MAAAD,EAAYC,EAAI,OAAO,EAC9B,OACF,IAAK,MACL,IAAK,KACI,MAAAD,EAAYC,EAAI,QAAQ,EACxB,MAAAD,EAAYC,EAAI,QAAQ,EAC/B,OACF,QACErZ,EAAAA,YAAYqZ,CAAG,CAAA,CAErB,CCxDgB,SAAAE,GACdxO,EACAyO,EACiB,CACjB,MAAMhb,EAAS,CAAC,EAChB,SAAW,CAAC4D,EAAK2L,CAAK,IAAK,OAAO,QAAQhD,CAAG,EAAUvM,EAAA4D,CAAU,EAAIoX,EAAOzL,CAAW,EAChF,OAAAvP,CACT,CAEgB,SAAAib,GAAiB1L,EAAsBhC,EAAoC,CACzF,OAAOgC,IAAU,OAAY,OAAYhC,EAAGgC,CAAK,CACnD,CAEA,SAAS2L,GAAYL,EAAmB,CACtC,OAAQA,EAAI,KAAM,CAChB,IAAK,oBACI,MAAA,GACT,QACS,MAAA,EAAA,CAEb,CAEO,SAASM,GAAuBN,EAAmB,CAC7C,UAAAO,KAAUR,EAAYC,CAAG,KAAOK,GAAYE,CAAM,EAAU,MAAA,GAChE,MAAA,EACT,CCdA,SAAS7c,GAAIyB,EAAkC,CACtC,MAAA,CACL,KAAM,eACN,OAAAA,CACF,CACF,CAEO,SAASqb,EAAMrb,EAA4B,CACzC,MAAA,IAAMzB,GAAIyB,CAAM,CACzB,CAMA,MAAMsb,GAA4BzO,GAAS,CACzC,MAAM7M,EAAuC,CAAC,EACnC,SAAA,CAACub,EAAG1a,CAAC,IAAK,OAAO,QAAQgM,CAAI,EAAU7M,EAAAub,CAAC,EAAI1a,EACvD,OAAOwa,EAAMrb,CAAM,CACrB,EAEMwb,GAAyB3O,GAAS,CACtC,MAAMlB,EAASkB,EAAK,OACpB,GAAIlB,IAAW,OAAkB,OAAA0P,EAAM,MAAS,EAChD,MAAMrb,EAAoB,CAAC,EAC3B,UAAWob,KAAUzP,EACfyP,aAAkB,MAAcpb,EAAA,KAAK,GAAGob,CAAM,EAC7Cpb,EAAO,KAAKob,CAAM,EAEzB,OAAOC,EAAMrb,CAAM,CACrB,EAEMyb,GAAkC5O,GAAS,CAC/C,MAAMlB,EAASkB,EAAK,OACdvH,EAAQuH,EAAK,MACnB,OAAIlB,IAAW,QAAarG,IAAU,OAAkB+V,EAAM,MAAS,EAChE,CAAC,CAAE,KAAAX,KAAW,OACZ,OAAAnc,IAAIuD,EAAA4Y,EAAK,SAAS/O,CAAM,EAAE,KAAK,EAAE,SAASrG,CAAK,IAA3C,YAAAxD,EAA8C,SAAS,CACpE,CACF,EAEA,SAAS4Z,GAAuBC,EAAepO,EAAoC,CACjF,MAAMvN,EAA4B,CAAC,EAC7B4b,EAASD,EAAS,OACxB,QAASxU,EAAI,EAAGA,EAAIyU,EAAQzU,IAAKnH,EAAO,OAAOmH,CAAC,CAAC,EAAIoG,EAAGoO,EAASxU,CAAC,CAAC,EAC5D,OAAAnH,CACT,CAEA,SAAS6b,GACP1W,EACA2W,EACY,CACZ,OAAQjP,GAAS,CACf,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EACzC,KAAO,CACZ,KAAM,qBACN,WAAYU,GAAuBpQ,EAAO,MAAM,EAChD,KAAM+P,GAAiB/P,EAAS7K,GAAMkb,EAAU,CAAE,GAAG7W,EAAK,CAAC2W,EAAI,KAAK,EAAGhb,GAAKgb,EAAI,OAAO,CAAC,CAAA,EAE5F,CACF,CAEA,SAASC,GAAuBH,EAA4B,CAC1D,OAAQ/O,GAAS,CACf,MAAM7M,EAAoB,CAAC,EAClB,QAAAmH,EAAI,EAAGA,EAAIyU,EAAQzU,IAAYnH,EAAA,KAAK6M,EAAK,OAAO1F,CAAC,CAAC,CAAC,EAC5D,OAAOkU,EAAMrb,CAAM,CACrB,CACF,CAEA,SAASic,GACP9W,EACA2W,EACY,CACZ,OAAQjP,GAAS,CACf,MAAMlB,EAASkB,EAAK,OACpB,GAAIlB,IAAW,OAAkB,OAAA0P,EAAM,MAAS,EAChD,MAAMa,EAA6B,CAAC,EACpC,SAAW,CAACX,EAAG1a,CAAC,IAAK,OAAO,QAAQ8K,CAAM,EAAG,CACrC,MAAAwQ,EAAS,CAAE,GAAGhX,EAAK,CAAC2W,EAAI,KAAK,EAAGjb,CAAE,EACxCqb,EAASX,CAAC,EAAIS,EAAUG,EAAQL,EAAI,OAAO,CAAA,CAE7C,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYM,GACZ,KAAMF,CAAA,EAEV,CACF,CAEA,MAAME,GAAkCvP,GAC/BwO,EAAMxO,CAAI,EAGbwP,GAAyBxP,GAAS,CACtC,MAAMyP,EAAMzP,EAAK,IACjB,OAA8BwO,EAA1BiB,IAAQ,OAAwB,OACvBA,EAAI,SAAW,CADiB,CAE/C,EAEMC,GAAqB1P,GAAS,CAClC,MAAM2P,EAAU3P,EAAK,QACrB,OAAkCwO,EAA9BmB,IAAY,OAAwB,OAC3B,CAACA,CADmC,CAEnD,EAEMC,GAAqB5P,GAAS,CAClC,MAAM6P,EAAW7P,EAAK,SAChB8P,EAAW9P,EAAK,SACtB,OAA6DwO,EAAzDqB,IAAa,QAAaC,IAAa,OAAwB,OACtDD,GAAYC,CADmD,CAE9E,EAEMC,GAAoB/P,GAAS,CACjC,MAAM6P,EAAW7P,EAAK,SAChB8P,EAAW9P,EAAK,SACtB,OAA6DwO,EAAzDqB,IAAa,QAAaC,IAAa,OAAwB,OACtDD,GAAYC,CADmD,CAE9E,EAEME,GAAqChQ,GAAS,CAClD,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EACzC,CAAC,CAAE,KAAAX,KAAW,OAAA,OAAAnc,IAAIuD,EAAA4Y,EAAK,SAAS/O,CAAM,EAAE,SAAtB,YAAA7J,EAA8B,eAAe,EACxE,EAEMgb,GAA8BjQ,GAAS,CAC3C,MAAMlB,EAASkB,EAAK,OACdvH,EAAQuH,EAAK,MACnB,OAAwDwO,EAApD1P,IAAW,QAAarG,IAAU,OAAwB,OACjDqG,EAAOrG,CAAK,CAD8C,CAEzE,EAEA,SAASyX,GACP5X,EACA2W,EACY,CACZ,OAAQjP,GAAS,CACf,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,KAAAX,KAAW,CACnB,MAAMtV,EAAOsV,EAAK,SAAS/O,CAAM,EAAE,KAAK,EAElCuQ,EAA6B,CAAC,EACzB,UAAAhY,KAAakB,EAAK,kBAAmB,CACxC7G,MAAAA,EAAM6G,EAAK,SAASlB,CAAS,EACnC,GAAI3F,IAAQ,OAAW2d,EAAShY,CAAS,EAAImX,EAAM,MAAS,MACvD,CACG,MAAAc,EAAS,CAAE,GAAGhX,EAAK,CAAC2W,EAAI,KAAK,EAAGvd,EAAI,SAAU,EACpD2d,EAAShY,CAAS,EAAI8X,EAAUG,EAAQL,EAAI,OAAO,CAAA,CACrD,CAGK,MAAA,CACL,KAAM,qBACN,WAAYkB,GACZ,KAAMd,CACR,CACF,CACF,CACF,CAEA,MAAMc,GAAoCnQ,GACjCwO,EAAMxO,CAAI,EAGboQ,GAAgCpQ,GAAS,CAC7C,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYhY,EAAW,WAAA,KACpBC,GACQ+X,EAAQ,WAAW,kBAAkB/X,EAAI,SAASwG,CAAM,EAAE,KAAK,EAAE,YAAY,EAEtF,CACE,iBAAkB,MAAO4D,GAAU,CAC7B,GAAAA,IAAU,OACd,OAAO,MAAM2N,EAAQ,WAAW,WAAW3N,EAAM,MAAM,CAAA,CACzD,CACF,CAEJ,EAEJ,EAEM4N,GAAwCtQ,GAAS,CACrD,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,KAAAX,EAAM,QAAAwC,KAAc,CAE5B,MAAME,EAAe1C,EAAK,SAAS/O,CAAM,EAAE,OAAO,aAE3C,MAAA,CACL,KAAM,qBACN,WAAYzG,aAAW,KAAK,IAAMgY,EAAQ,WAAW,kBAAkBE,CAAY,EAAG,CACpF,iBAAkB,MAAO7N,GACnBA,IAAU,OAAkB,QAChB,MAAM2N,EAAQ,WAAW,WAAW3N,EAAM,MAAM,GACjD,SAAS,CAE3B,CAAA,CACH,CACF,CACF,EAEM8N,GAAsCxQ,GAAS,CACnD,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYhY,EAAW,WAAA,KACpBoY,GAAMJ,EAAQ,WAAW,kBAAkBI,EAAE,SAAS3R,CAAM,EAAE,KAAK,EAAE,YAAY,EAClF,CACE,iBAAkB,MAAO4D,GAAU,CAC7B,GAAAA,GAAS,KAAkB,OAC/B,MAAMkB,EAAU,MAAMyM,EAAQ,WAAW,WAAW3N,EAAM,MAAM,EAC5D,GAAAkB,GAAW,KACf,OAAO,KAAK,MAAM,OAAO,KAAKA,CAAO,EAAE,UAAU,CAAA,CACnD,CACF,CAEJ,EAEJ,EAEM8M,GAA0C1Q,GAAS,CACvD,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,WAAW,kBAAkBvR,CAAM,CACzD,EAEJ,EAEM6R,GAAwC3Q,GAAS,CACrD,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,WAAW,gBAAgBvR,CAAM,CACvD,EAEJ,EAEM8R,GAAoEC,GAAY7Q,GAAS,CAC7F,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,gBAAgB,wBAAwBvR,EAAQ+R,CAAM,CAC5E,EAEJ,EAEMC,GAAmC9Q,GAAS,CAChD,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,aAAa,cAAcvR,CAAM,CACvD,EAEJ,EAEMiS,GAAgDC,GAAWhR,GAAS,CACxE,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,UAAU,YAAYvR,EAAQkS,CAAK,CACzD,EAEJ,EAEMC,GAA6DC,GAAqBlR,GAAS,CAC/F,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,UAAU,eAAevR,EAAQoS,CAAe,CACtE,EAEJ,EAEMC,GAAqED,GAAqBlR,GAAS,CACvG,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,UAAU,uBAAuBvR,EAAQoS,CAAe,CAC9E,EAEJ,EAEME,GAA8BpR,GAAS,CAC3C,MAAMlB,EAASkB,EAAK,OACpB,OAAIlB,IAAW,OAAkB0P,EAAM,MAAS,EAEzC,CAAC,CAAE,QAAA6B,MACD,CACL,KAAM,qBACN,WAAYA,EAAQ,UAAU,aAAavR,CAAM,CACnD,EAEJ,EAGgB,SAAAqQ,EAAU7W,EAA8B0V,EAAqB,CAC3E,OAAQA,EAAI,KAAM,CAChB,IAAK,aACG,MAAAqD,EAAW/Y,EAAI0V,EAAI,QAAQ,EAC7B,OAAA,OAAOqD,GAAa,WAAoBpd,GAAMvC,GAAI2f,EAASpd,EAAE,IAAI,CAAC,EAC1Dua,EAAM6C,CAAQ,EAE5B,IAAK,UACI,MAAA,CAAC,CAAE,QAAAhB,MAAe,CACvB,KAAM,qBACN,WAAYiB,GAAwBjB,EAAS/X,EAAK0V,EAAI,GAAG,CAAA,GAG7D,IAAK,YACI,OAAAQ,EAAMR,EAAI,KAAK,EAExB,IAAK,eACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYiC,GACZ,KAAM,CACJ,OAAQd,EAAU7W,EAAK0V,EAAI,MAAM,EACjC,MAAOmB,EAAU7W,EAAK0V,EAAI,KAAK,CAAA,CACjC,GAGJ,IAAK,iBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYgB,GAAkB1W,EAAK0V,CAAG,EACtC,KAAM,CACJ,OAAQmB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,kBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYoB,GAAmB9W,EAAK0V,CAAG,EACvC,KAAM,CACJ,OAAQmB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,aACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYS,GACZ,KAAMP,GAAUF,EAAI,SAAWyC,GAAMtB,EAAU7W,EAAKmY,CAAC,CAAC,CAAA,GAG1D,IAAK,YACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYvB,GAAuBlB,EAAI,SAAS,MAAM,EACtD,KAAMa,GAAiBb,EAAI,SAAW/Z,GAAMkb,EAAU7W,EAAKrE,CAAC,CAAC,CAAA,GAGjE,IAAK,UACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY0a,GACZ,KAAM,CACJ,OAAQQ,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,UACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYwB,GACZ,KAAM,CACJ,IAAKL,EAAU7W,EAAK0V,EAAI,GAAG,CAAA,CAC7B,GAGJ,IAAK,MACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY0B,GACZ,KAAM,CACJ,QAASP,EAAU7W,EAAK0V,EAAI,OAAO,CAAA,CACrC,GAGJ,IAAK,MACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY4B,GACZ,KAAM,CACJ,SAAUT,EAAU7W,EAAK0V,EAAI,QAAQ,EACrC,SAAUmB,EAAU7W,EAAK0V,EAAI,QAAQ,CAAA,CACvC,GAGJ,IAAK,KACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY+B,GACZ,KAAM,CACJ,SAAUZ,EAAU7W,EAAK0V,EAAI,QAAQ,EACrC,SAAUmB,EAAU7W,EAAK0V,EAAI,QAAQ,CAAA,CACvC,GAGJ,IAAK,oBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYkC,GAAqB5X,EAAK0V,CAAG,EACzC,KAAM,CACJ,OAAQmB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,mBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYY,GACZ,KAAM,CACJ,OAAQO,EAAU7W,EAAK0V,EAAI,MAAM,EACjC,MAAOmB,EAAU7W,EAAK0V,EAAI,KAAK,CAAA,CACjC,GAGJ,IAAK,yBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYgC,GACZ,KAAM,CACJ,OAAQb,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,iBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYoC,GACZ,KAAM,CACJ,OAAQjB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,yBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYsC,GACZ,KAAM,CACJ,OAAQnB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,uBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYwC,GACZ,KAAM,CACJ,OAAQrB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,2BACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY0C,GACZ,KAAM,CACJ,OAAQvB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,yBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY2C,GACZ,KAAM,CACJ,OAAQxB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,0BACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY4C,GAA0B5C,EAAI,MAAM,EAChD,KAAM,CACJ,OAAQmB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,oBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY8C,GACZ,KAAM,CACJ,OAAQ3B,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,cACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAY+C,GAAc/C,EAAI,KAAK,EACnC,KAAM,CACJ,OAAQmB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,iBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYiD,GAAiBjD,EAAI,eAAe,EAChD,KAAM,CACJ,OAAQmB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,yBACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYmD,GAAyBnD,EAAI,eAAe,EACxD,KAAM,CACJ,OAAQmB,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,IAAK,eACH,MAAO,KAAO,CACZ,KAAM,qBACN,WAAYoD,GACZ,KAAM,CACJ,OAAQjC,EAAU7W,EAAK0V,EAAI,MAAM,CAAA,CACnC,GAGJ,QACE,OAAOrZ,EAAAA,YAAYqZ,CAAG,CAAA,CAE5B,CCjjBa,MAAAuD,GAAkB,CAAC,QAAS,UAAU,EAE5C,SAASC,GAAalZ,EAAiC,CACrD,MAAA,CACL,SAAUA,EAAI,QACd,MAAQuV,GAAwB,KAAK,MAAMvV,EAAI,KAAKuV,CAAI,CAAC,EACzD,IAAMA,GAAwB,CACtB,MAAA7G,EAAU1O,EAAI,QAAQuV,CAAI,EAChC,OAAO7G,IAAY,OAAY,KAAK,MAAMA,CAAO,EAAI,MACvD,EACA,MAAO1O,EAAI,KACX,SAAUA,EAAI,OAChB,CACF,CCDA,MAAMmZ,GAA6B,OAAO,EAEpCC,GAAe,SAIfC,GAAoB,CAAE,GAAIF,GAAa,IAAKC,EAAa,EAE/D,SAASE,GAAoBC,EAAmC,CAC9D,OAAOA,EAAY,IAAMJ,IAAeI,EAAY,KAAOH,EAC7D,CA0CA,SAASI,IAA4B,CACnC,MAAO,CAAE,mBAAwB,IAAA,GAAwC,CAC3E,CAQA,SAASC,GACP7Z,EACA8Z,EACAC,EACAC,EACuB,CACjB,MAAAC,EAAiB,IAAI9L,GAAwB4L,CAAU,EAIvDG,EAAgB,CAACP,EAA0B1e,IAA6B,CACxE,GAAAye,GAAoBC,CAAW,EACjC,OAAAG,EAAM,OAAS7e,EACR,GAGT,MAAMkf,EAAUzZ,EAAAA,SAASoZ,EAAM,mBAAmB,IAAIH,EAAY,EAAE,CAAC,EACrE,GAAIA,EAAY,OAAOQ,EAAQ,KAAY,MAAA,IAAI,MAAM,sBAAsB,EACnE,OAAAA,EAAA,KAAKR,EAAY,GAAG,EAAI1e,EACxBkf,EAAA,aACJA,EAAQ,aAAe,IACnBL,EAAA,mBAAmB,OAAOH,EAAY,EAAE,EAC9CM,EAAe,KAAK,CAClB,YAAaE,EAAQ,YACrB,UAAWA,EAAQ,WAAWA,EAAQ,IAAI,CAAA,CAC3C,GAGI,EACT,EAIMC,EAAqC,CAAC,EAGlCC,EAAA,KAAOJ,EAAe,OAAS,GAAG,CACpC,MAAAK,EAAKL,EAAe,MAAM,EAC1BM,EAASD,EAAG,UAAUta,CAAG,EAC/B,OAAQua,EAAO,KAAM,CACnB,IAAK,eACH,GAAI,CAACL,EAAcI,EAAG,YAAaC,EAAO,MAAM,EAAS,MAAAF,EACzD,MAEF,IAAK,qBACH,MAAMG,EAAW,OAAO,EAElBC,EAAc,OAAO,QAAQF,EAAO,IAAI,EACxCG,EAAoBD,EAAY,OAEtC,GAAIC,IAAsB,EAExBT,EAAe,KAAK,CAClB,YAAaK,EAAG,YAChB,UAAWC,EAAO,WAAW,CAAE,CAAA,CAAA,CAChC,MACE,CACQ,SAAA,CAAChD,EAAKoD,CAAS,IAAKF,EAC7BR,EAAe,KAAK,CAClB,YAAa,CAAE,GAAIO,EAAU,IAAAjD,CAAI,EACjC,UAAAoD,CAAA,CACD,EAEGb,EAAA,mBAAmB,IAAIU,EAAU,CACrC,WAAYE,EACZ,KAAM,CAAC,EACP,WAAYH,EAAO,WACnB,YAAaD,EAAG,WAAA,CACjB,CAAA,CAGH,MAEF,IAAK,qBACH,GAAI,CAACN,EACG,MAAA,IAAI,MAAM,uDAAuD,EACzEI,EAAY,KAAK,CACf,YAAaE,EAAG,YAChB,WAAYC,EAAO,UAAA,CACpB,EACD,MAEF,QACE9d,EAAAA,YAAY8d,CAAM,CAAA,CACtB,CAGK,OAAAH,CACT,CAOO,SAASQ,GACdzC,EACA0C,EACA/E,EACAiB,EAAuC,CAAA,EAClB,CACrB,OAAOqC,GAAwBjB,EAASmB,GAAauB,CAAI,EAAG/E,EAAKiB,CAAG,CACtE,CAEO,SAASqC,GACdjB,EACA/X,EACA0V,EACAiB,EAAuC,CAAA,EAClB,CACrB,MAAMlY,EACJ,GAAGuB,EAAI,OAAO,IACdyS,GAAa,CACX,IAAK,OAAO,YACV,OAAO,QAAQzS,CAAG,EAAE,OAAO,CAAC,CAACoW,CAAC,IAAM6C,GAAgB,QAAQ7C,CAAC,IAAM,EAAE,CACvE,EACA,IAAAV,CAAA,CACD,EACH,OAAO3V,EAAW,WAAA,QACfoY,GAAM,CACL,MAAMvY,EAA4B,CAAE,QAAAmY,EAAS,KAAMI,CAAE,EAC/CuB,EAAQF,GAAU,EAYjB,MAAA,CACL,GAZkBC,GAClB7Z,EACA8Z,EACA,CACE,CACE,YAAaL,GACb,UAAWxC,EAAU7W,EAAK0V,CAAG,CAAA,CAEjC,EACA,EACF,EAGE,MAAM,iBAAiBtL,EAAmD,CACxE,MAAMsQ,EAAiC,CAAC,EACxC,UAAWC,KAAMvQ,EACHsQ,EAAA,KAAK,CAAE,YAAaC,EAAG,YAAa,UAAWzE,EAAMyE,EAAG,UAAU,EAAG,EACnF,MAAMC,EAAgC,CACpC,QAAA7C,EACA,IAAI,MAAsB,CAClB,MAAA,IAAI,MAAM,uDAAuD,CAAA,CAE3E,EAIM8C,MAA8B,IACpC,SAAW,CAACpc,EAAK2L,CAAK,IAAKsP,EAAM,mBACPmB,EAAA,IAAIpc,EAAK,CAAE,GAAG2L,EAAO,KAAM,CAAE,GAAGA,EAAM,IAAK,EAAG,EACxE,MAAM0Q,EAA8B,CAClC,OAAQpB,EAAM,OACd,mBAAoBmB,CACtB,EAEA,GADQpB,GAAAmB,EAASE,EAAaJ,EAAa,EAAK,EAC5C,EAAE,WAAYI,GACV,MAAA,IAAI,MAAM,8CAA8C,EAChE,OAAOA,EAAY,MAAA,CAEvB,CACF,EACA,CAAE,GAAGnE,EAAK,IAAAlY,CAAI,CAChB,CACF,CCzNA,SAASsc,GAAoB3T,EAAsC,CACjE,OAAOA,aAAe,aAAe,YAAY,OAAOA,CAAG,CAC7D,CAEA,SAAS4T,GAAcrK,EAAkD,CAChE,OAAAA,IAAS,OAAY,OAAO,KAAKA,CAAI,EAAE,SAAS,QAAQ,EAAI,MACrE,CAEO,MAAMsK,EAEb,CAYE,YACmBC,EACAC,EACAC,EACAxb,EACjByb,EACA,CAjBeve,EAAA,yBACAA,EAAA,wBACAA,EAAA,oBAEDA,EAAA,4BAAwD,CAAC,GAEjEA,EAAA,sBACSA,EAAA,qBAAgB,KAEhBA,EAAA,aAmTTA,EAAA,oBApSN,GAZiB,KAAA,MAAAoe,EACA,KAAA,GAAAC,EACA,KAAA,SAAAC,EACA,KAAA,IAAAxb,EAGjB,KAAK,cAAgByb,EACrB,KAAK,iBAAmB,KAAK,MAAM,OAAO,KAAK,GAAG,WAAW,EAE7D,KAAK,gBAAkBH,EAAM,OAC3BC,EAAG,QAAQA,EAAG,OAAQ,MAAM,EAAE,QAASG,GAASH,EAAG,QAAQG,EAAM,WAAW,CAAC,CAC/E,EACIH,EAAG,OAAO,KAAK,eAAe,IAAM,WAChC,MAAA,IAAI,MAAM,6BAA6B,EAK3C,GAHJ,KAAK,YAAcD,EAAM,OACvBC,EAAG,QAAQA,EAAG,OAAQ,MAAM,EAAE,QAASG,GAASH,EAAG,QAAQG,EAAM,OAAO,CAAC,CAC3E,EACIH,EAAG,OAAO,KAAK,WAAW,IAAM,WAAY,MAAM,IAAI,MAAM,yBAAyB,EAEpF,KAAA,KAAOC,EAAS,UAAUC,CAAa,EAE5C,KAAK,UAAU,CAAA,CAGV,oBAAqB,CAC1B,KAAK,cAAgB,OACrB,KAAK,UAAU,MAAM,CAAA,CAGvB,OAAe,kBAAkBhjB,EAAsB,CACjD,OAAOA,GAAU,UAAYA,IAAU,MAAQ,YAAaA,GAAc,OAAAA,EAAM,OAAS,CAGxF,eAAekjB,EAAc,CAC9B,GAAA,CACF,KAAK,GAAG,aAAa,KAAK,GAAG,SAASA,EAAM,YAAa,CAAE,KAAM,QAAA,CAAU,CAAC,EAAE,QAAQ,QAC/EC,EAAc,CACrB,MAAAP,GAAmB,kBAAkBO,CAAG,EAClCA,CAAA,CACR,CAGK,YAAYC,KAAmB/T,EAAgC,CAChE,GAAA,CACK,OAAAgU,GAAA,MAAM,UAAWC,GAAe,CAC/B,MAAAC,EAAiBD,EAAW,OAAO,KAAK,GAAG,QAAQ,KAAK,iBAAkBF,CAAM,CAAC,EAEvF,GAAI,KAAK,GAAG,OAAOG,CAAc,IAAM,WACrC,MAAM,IAAI,MAAM,qBAAqBH,CAAM,EAAE,EAE/C,OAAO,KAAK,MAAM,OAChB,KAAK,GAAG,aACN,KAAK,GAAG,aACNG,EACA,KAAK,GAAG,UACR,GAAGlU,EAAK,IAAKyP,GAAQ,KAAK,sBAAsBA,EAAKwE,CAAU,CAAC,CAAA,CAClE,CAEJ,CAAA,CACD,QACMH,EAAc,CACrB,MAAAP,GAAmB,kBAAkBO,CAAG,EAClCA,CAAA,CACR,CAOF,wBAAwBtc,EAAkC,CACxD,GAAI,KAAK,gBAAkB,OACnB,MAAA,IAAI,MAAM,yCAAyC,EACrD,MAAA2c,EAAoB,CAAC3c,EAAc4c,IAAmD,CAC1F,GAAI,CAAC,KAAK,UAAU,IAAI5c,CAAI,EAAG,CACvB,MAAA6c,EAAS,KAAK,SAASD,CAAM,EACnC,GAAIC,IAAW,OAAiB,MAAA,IAAI,MAAM,+BAA+B,EACnE,MAAAlgB,EAAQkgB,EAAO,KAAK,aAAc,EACnClgB,EAEH,KAAK,UAAU,IAAIqD,EAAM,KAAK,cAAe,SAASrD,CAAK,EAAE,KAAK,CAAE,YAAa,EAAM,CAAA,CAAC,EAF9E,KAAK,UAAU,IAAIqD,EAAM,MAAS,CAE4C,CAE5F,OAAO,KAAK,UAAU,IAAIA,CAAI,EAAIA,EAAO,MAC3C,EACA,GAAIA,IAAS,UAAkB,OAAA2c,EAAkB,UAAW,SAAS,EAAA,GAC5D3c,IAAS,OAAe,OAAA2c,EAAkB,OAAQ,MAAM,CAC1D,CAOT,kBACEG,EACAC,KACGC,EACiB,CACb,OAAA,KAAK,aAAa,KAAK,YAAYF,CAAM,EAAE,mBAAmBC,EAAe,GAAGC,CAAK,CAAC,CAAA,CAG/F,gBAAgBF,EAAqC,CAC5C,OAAA,KAAK,YAAYA,CAAM,EAAE,YAAA,CAGlC,gBAAgBA,EAAyB,CACvC,OAAO,KAAK,YAAYA,CAAM,EAAE,gBAAgB,CAAA,CAGlD,iBAAiBA,EAAyB,CACxC,OAAO,KAAK,YAAYA,CAAM,EAAE,iBAAiB,CAAA,CAGnD,kBAAkBA,EAAyB,CACzC,OAAO,KAAK,YAAYA,CAAM,EAAE,kBAAkB,CAAA,CAGpD,WAAWA,EAAyB,CAClC,OAAO,KAAK,YAAYA,CAAM,EAAE,WAAW,CAAA,CAG7C,SAASA,EAAoC,CAC3C,OAAO,KAAK,aAAa,KAAK,YAAYA,CAAM,EAAE,UAAU,CAAA,CAG9D,gBAAgBA,EAA0B,CACxC,OAAO,KAAK,YAAYA,CAAM,EAAE,gBAAgB,CAAA,CAGlD,iBAAiBA,EAA0B,CACzC,OAAO,KAAK,YAAYA,CAAM,EAAE,iBAAiB,CAAA,CAGnD,kBAAkBA,EAA0B,CAC1C,OAAO,KAAK,YAAYA,CAAM,EAAE,kBAAkB,CAAA,CAGpD,kBAAkBA,EAAgBvd,EAAiC,CACjE,OAAOuc,GAAc,KAAK,YAAYgB,CAAM,EAAE,YAAYvd,CAAG,CAAC,CAAA,CAGhE,oBAAoBud,EAAgBvd,EAAiC,CACnE,OAAO,KAAK,YAAYud,CAAM,EAAE,oBAAoBvd,CAAG,CAAA,CAGzD,cAAcud,EAAoC,CAChD,OAAOhB,GAAc,KAAK,YAAYgB,CAAM,EAAE,SAAS,CAAA,CAGzD,gBAAgBA,EAAoC,CAClD,OAAO,KAAK,YAAYA,CAAM,EAAE,gBAAgB,CAAA,CAOlD,uBACEA,EACAhJ,EACAE,KACGiJ,EAC0C,CACvC,MAAAC,EAAM,KAAK,YAAYJ,CAAM,EACnC,GAAI,CAACI,EAAI,kBAAkB,EAAU,OACrC,MAAMC,EAAYhJ,GAA4B+I,EAAKpJ,EAAqBE,EAAQiJ,CAAY,EACtFthB,EAA0C,CAAC,EACjD,SAAW,CAAC4D,EAAK2I,CAAG,IAAK,OAAO,QAAQiV,CAAS,EACxCxhB,EAAA4D,CAAG,EAAI6d,EAAAA,eAAelV,EAAMmV,GAAM,KAAK,aAAaA,CAAC,CAAC,EAExD,OAAA1hB,CAAA,CAOD,mBAAmB2hB,EAAiBC,EAAyC,CACnF,MAAMC,EAAU,GAAGF,CAAO,IAAIza,GAAAA,WAAY,CAAA,GACrC,YAAA,qBAAqB2a,CAAO,EAAID,EAC9BC,CAAA,CAGF,uBAAuBV,EAAwB,CACpD,MAAM/D,EAAe,KAAK,YAAY+D,CAAM,EAAE,aAC9C,OAAO,KAAK,mBACV,yBACAjc,EAAAA,WAAW,KAAMC,GAAQ,KAAK,IAAI,UAAU,WAAW,kBAAkBiY,EAAcjY,CAAG,EAAG,CAC3F,iBAAkB,MAAOoK,GAAU,CAC7B,GAAAA,IAAU,OACP,OAAA,OAAO,KAAK,MAAM,KAAK,IAAI,UAAU,WAAW,WAAWA,EAAM,MAAM,CAAC,EAAE,SAC/E,OACF,CAAA,CAEH,CAAA,CACH,CAAA,CAGK,uBAAuB4R,EAAwB,CACpD,MAAM/D,EAAe,KAAK,YAAY+D,CAAM,EAAE,aAC9C,OAAO,KAAK,mBACV,yBACAjc,EAAAA,WAAW,KAAMC,GAAQ,KAAK,IAAI,UAAU,WAAW,kBAAkBiY,EAAcjY,CAAG,EAAG,CAC3F,iBAAkB,MAAOoK,GAAU,CAC7B,GAAAA,IAAU,OACP,OAAA,OAAO,KAAK,MAAM,KAAK,IAAI,UAAU,WAAW,WAAWA,EAAM,MAAM,CAAC,EAAE,SAC/E,QACF,CAAA,CAEH,CAAA,CACH,CAAA,CAGK,+BAA+B4R,EAAwB,CAC5D,MAAM/D,EAAe,KAAK,YAAY+D,CAAM,EAAE,aAC9C,OAAO,KAAK,mBACV,iCACA,KAAK,IAAI,UAAU,WAAW,kBAAkB/D,CAAY,CAC9D,CAAA,CAGK,6BAA6B+D,EAAwB,CAC1D,MAAM1c,EAAW,KAAK,YAAY0c,CAAM,EAAE,QAAQ,EAClD,OAAO,KAAK,mBACV,+BACA,KAAK,IAAI,UAAU,WAAW,gBAAgB1c,CAAQ,CACxD,CAAA,CAOK,wBAAwB0c,EAAgBzD,EAA+B,CAC5E,MAAMjZ,EAAW,KAAK,YAAY0c,CAAM,EAAE,QAAQ,EAClD,OAAO,KAAK,mBACV,0BACA,KAAK,IAAI,UAAU,gBAAgB,wBAAwB1c,EAAUiZ,CAAM,CAC7E,CAAA,CAOF,kBAAkByD,EAAwB,CACxC,MAAM1c,EAAW,KAAK,YAAY0c,CAAM,EAAE,QAAQ,EAClD,OAAO,KAAK,mBACV,oBACA,KAAK,IAAI,UAAU,aAAa,cAAc1c,CAAQ,CACxD,CAAA,CAOF,YAAY0c,EAAgBW,EAAwB,CAClD,MAAMrd,EAAW,KAAK,YAAY0c,CAAM,EAAE,QAAQ,EAClD,OAAO,KAAK,mBACV,cACA,KAAK,IAAI,UAAU,UAAU,YAAY1c,EAAUqd,CAAM,CAC3D,CAAA,CAGF,eAAeX,EAAgBpD,EAAiC,CAC9D,MAAMtZ,EAAW,KAAK,YAAY0c,CAAM,EAAE,QAAQ,EAClD,OAAO,KAAK,mBACV,iBACA,KAAK,IAAI,UAAU,UAAU,eAAe1c,EAAUsZ,CAAe,CACvE,CAAA,CAGF,uBAAuBoD,EAAgBpD,EAAiC,CACtE,MAAMtZ,EAAW,KAAK,YAAY0c,CAAM,EAAE,QAAQ,EAClD,OAAO,KAAK,mBACV,yBACA,KAAK,IAAI,UAAU,UAAU,uBAAuB1c,EAAUsZ,CAAe,CAC/E,CAAA,CAGF,aAAaoD,EAAwB,CACnC,MAAM1c,EAAW,KAAK,YAAY0c,CAAM,EAAE,QAAQ,EAClD,OAAO,KAAK,mBACV,eACA,KAAK,IAAI,UAAU,UAAU,aAAa1c,CAAQ,CACpD,CAAA,CAOK,cAAc7C,EAAyB,CAC5C,MAAM4G,EAAI,KAAK,KAAK,IAAI5G,CAAO,EAC/B,GAAI4G,IAAM,OAAW,MAAM,IAAI,MAAM,SAAS5G,CAAO,aAAa,EAClE,OAAO4G,EAAE,KAAA,CAQX,IAAY,YAAyB,CAC/B,GAAA,KAAK,cAAgB,OAAW,CAClC,GAAI,KAAK,gBAAkB,OACzB,MAAM,IAAI,MACR,qFACF,EACF,KAAK,YAAc/C,EAAA,SACjB,KAAK,SAAS,eACd,gBAAA,EACA,KAAK,aAAa,CAAA,CAEtB,OAAO,KAAK,WAAA,CAGP,iBAAiBkU,EAAqC,CACpD,OAAA,KAAK,WAAW,iBAAiBA,CAAS,CAAA,CAG5C,uBAA2D,CAC1D,MAAAhB,EAAa,KAAK,WAAW,QAAQ,EAC3C,OAAIA,EAAW,oBAAsB,QACnC,KAAK,cAAe,aAAa,0BAA0BA,EAAW,iBAAiB,EAAE,EACpF,CACL,WAAYA,EAAW,WACvB,QAASA,EAAW,QAAQ,IAAK7X,IAAO,CACtC,IAAKA,EAAE,IACP,IAAK2gB,EAAAA,eAAe3gB,EAAE,IAAM4gB,GAAM,KAAK,aAAaA,CAAC,CAAC,CAAA,EACtD,CACJ,CAAA,CAGK,iCAEL,CACM,MAAA/I,EAAa,KAAK,WAAW,kBAAkB,EACrD,OAAIA,EAAW,oBAAsB,QACnC,KAAK,cAAe,aAAa,0BAA0BA,EAAW,iBAAiB,EAAE,EACpF,CACL,WAAYA,EAAW,WACvB,QAASA,EAAW,QAAQ,IAAK7X,IAAO,CACtC,IAAKA,EAAE,IACP,IAAK,CACH,GAAIA,EAAE,IAAI,GACV,KAAMA,EAAE,IAAI,KACZ,KAAMqY,EAAAA,cAAcrY,EAAE,IAAI,KAAO4gB,GAAM,KAAK,aAAaA,CAAC,CAAC,CAAA,CAC7D,EACA,CACJ,CAAA,CAGK,wBAAwD,CACvD,MAAAK,EAAQ,KAAK,WAAW,SAAS,EACvC,OAAIA,EAAM,oBAAsB,QAC9B,KAAK,cAAe,aAAa,8BAA8BA,EAAM,iBAAiB,EAAE,EACnFA,CAAA,CAGT,2BAA2BngB,EAAiBkW,EAA6C,CACvF,OAAO,KAAK,WAAW,aAAalW,EAASkW,CAAU,CAAA,CAGzD,2BAA2BlW,EAAiBkW,EAAiD,CACpF,OAAA2J,EAAA,eAAe,KAAK,WAAW,aAAa7f,EAASkW,CAAU,EAAIyJ,GACxE,KAAK,aAAaA,CAAG,CACvB,CAAA,CAOK,aAAaS,EAAsD,CACxE,GAAI,KAAK,gBAAkB,OACzB,MAAM,IAAI,MACR,2FACF,EACK,OAAA,KAAK,IAAI,UAAU,aAAa,aACrCA,EAAI,IAAK1E,GAAMmE,EAAAA,eAAenE,EAAIoE,GAAO,OAAOA,GAAM,SAAW,KAAK,YAAYA,CAAC,EAAIA,CAAE,CAAC,EAC1F,KAAK,aACP,CAAA,CAGK,aAAaM,EAA+D,CACjF,GAAI,KAAK,gBAAkB,OACzB,MAAM,IAAI,MACR,0FACF,EACK,OAAA,KAAK,IAAI,UAAU,aAAa,aACrCC,EAAA,aAAaD,EAAM1E,GACjBmE,EAAAA,eAAenE,EAAIoE,GAAO,OAAOA,GAAM,SAAW,KAAK,YAAYA,CAAC,EAAIA,CAAE,CAC5E,EACA,KAAK,aACP,CAAA,CAOK,0BAA+C,OACpD,OAAO5f,EAAA,KAAK,gBAAL,YAAAA,EAAoB,cAAA,CAOrB,YAAYqf,EAAoC,CACtD,MAAMe,EAAW,KAAK,UAAU,IAAIf,CAAM,EAC1C,GAAIe,IAAa,OAAiB,MAAA,IAAI,MAAM,kBAAkB,EACvD,OAAAA,CAAA,CAKD,aAAaA,EAA8D,CAC7E,GAAAA,IAAa,OACZ,CACH,MAAMC,EAAajb,GAAAA,WAAW,EACzB,YAAA,UAAU,IAAIib,EAAYD,CAAQ,EAChCC,CAAA,CACT,CAOM,kBACN5V,EACA8T,EACe,CACf,MAAMrgB,EAAS,KAAK,qBAAqBuM,EAAK8T,CAAK,EACnD,GAAIrgB,IAAW,OAAW,MAAM,IAAI,MAAM,uBAAuBuM,CAAG,EAAE,EAC/D,OAAAvM,CAAA,CAGD,qBAAqBuM,EAAc8T,EAAqD,CAC1F,IAAAc,EACAiB,EAAS,GACb,OAAQ,OAAO7V,EAAK,CAClB,IAAK,SACM4U,EAAA,KAAK,GAAG,UAAU5U,CAAG,EACrB6V,EAAA,GACT,MACF,IAAK,SACMjB,EAAA,KAAK,GAAG,UAAU5U,CAAG,EACrB6V,EAAA,GACT,MACF,IAAK,YACHjB,EAAS,KAAK,GAAG,UACjB,MACF,IAAK,UACHA,EAAS5U,EAAM,KAAK,GAAG,KAAO,KAAK,GAAG,MACtC,MACF,QACE,GAAIA,IAAQ,KAAM,CAChB4U,EAAS,KAAK,GAAG,KACjB,KAAA,CAEE,GAAAjB,GAAoB3T,CAAG,EAAG,CACnB4U,EAAA,KAAK,GAAG,eAAe5U,CAAG,EAC1B6V,EAAA,GACT,KAAA,CAEK,MAAA,CAEX,OAAOA,GAAU/B,GAAS,KAAYA,EAAM,OAAOc,CAAM,EAAIA,CAAA,CAGxD,sBAAsB5U,EAAc8T,EAAyC,CAClF,MAAMgC,EAAe,KAAK,qBAAqB9V,EAAK8T,CAAK,EACrD,OAAAgC,IAAiB,OAAkBA,EAChC,KAAK,oBAAoB9V,EAAK8T,CAAK,CAAA,CAGrC,oBAAoB9T,EAAc8T,EAAyC,CAC1E,MAAArgB,EAAS,KAAK,GACjB,UAAU,KAAK,UAAUuM,CAAG,CAAC,EAC7B,QAASkU,GACR,KAAK,GAAG,aAAa,KAAK,GAAG,aAAa,KAAK,YAAa,KAAK,GAAG,UAAWA,CAAI,CAAC,CACtF,EACF,OAAOJ,IAAU,OAAYA,EAAM,OAAOrgB,CAAM,EAAIA,CAAA,CAG/C,sBAAsBmhB,EAAgC,CAC3D,OAAQ,KAAK,GAAG,OAAOA,CAAM,EAAG,CAC9B,IAAK,YACI,OACT,IAAK,UACL,IAAK,SACL,IAAK,SACI,OAAA,KAAK,GAAG,KAAKA,CAAM,EAC5B,QACS,OAAA,KAAK,oBAAoBA,CAAM,CAAA,CAC1C,CAGK,oBAAoBA,EAAgC,CACnD,MAAAmB,EAAO,KAAK,GACf,aAAa,KAAK,GAAG,aAAa,KAAK,gBAAiB,KAAK,GAAG,UAAWnB,CAAM,CAAC,EAClF,QAASoB,GAAc,KAAK,GAAG,UAAUA,CAAS,CAAC,EACtD,GAAID,IAAS,YAGN,OAAA,KAAK,MAAMA,CAAI,CAAA,CAGhB,WAAY,CACZzB,SAAA,UAAWC,GAAe,CAC9B,MAAM0B,EAAY1B,EAAW,OAAO,KAAK,GAAG,WAAW,EAIjDjU,EAAO,KAAK,SAAS,KAAK,KAAK,aAAc,EAC7C4V,EAAa,KAAK,SAAS,WAAW,KAAK,aAAc,EACzD5O,EAAU,KAAK,SAAS,QAAQ,KAAK,aAAc,EACpD,KAAA,GAAG,QAAQ2O,EAAW,OAAQ1B,EAAW,OAAO,KAAK,GAAG,UAAUjU,CAAI,CAAC,CAAC,EACzEgH,IAAY,QACT,KAAA,GAAG,QAAQ2O,EAAW,UAAW1B,EAAW,OAAO,KAAK,GAAG,UAAUjN,CAAO,CAAC,CAAC,EACjF4O,IAAe,QACZ,KAAA,GAAG,QAAQD,EAAW,aAAc1B,EAAW,OAAO,KAAK,GAAG,UAAU2B,CAAU,CAAC,CAAC,EAC3F,KAAK,GAAG,QAAQD,EAAW,mBAAoB,KAAK,gBAAgB,EACpE,KAAK,GAAG,QACNA,EACA,eACA,KAAK,sBAAsBE,mBAAiB,+BAAgC5B,CAAU,CACxF,EAIM,MAAA6B,EAAoB,CACxBte,EACAue,IACS,CACT,KAAK,GAAG,YAAYve,EAAMue,CAAE,EAAE,QAASC,GAAQ,KAAK,GAAG,QAAQL,EAAWne,EAAMwe,CAAG,CAAC,CACtF,EAMkBF,EAAA,0BAA4Bte,GACrC,KAAK,kBACV,KAAK,wBAAwB,KAAK,GAAG,UAAUA,CAAI,CAAC,EACpD,MACF,CACD,EAMDse,EAAkB,oBAAqB,CAACxB,EAAQC,KAAkBC,IACzD,KAAK,kBACV,KAAK,kBACH,KAAK,GAAG,UAAUF,CAAM,EACxB,KAAK,oBAAoBC,CAAa,EACtC,GAAGC,EAAM,IACNyB,GAAS,KAAK,oBAAoBA,CAAI,CAAA,CAE3C,EACA,MACF,CACD,EAEiBH,EAAA,kBAAoBxB,GAC7B,KAAK,oBAAoB,KAAK,gBAAgB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAC3F,EAEiBwB,EAAA,kBAAoBxB,GAC7B,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CACzF,EAEiBwB,EAAA,mBAAqBxB,GAC9B,KAAK,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAC1F,EAEiBwB,EAAA,oBAAsBxB,GAC/B,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAC3F,EAEiBwB,EAAA,aAAexB,GACxB,KAAK,kBAAkB,KAAK,WAAW,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CACpF,EAEiBwB,EAAA,WAAaxB,GACtB,KAAK,kBAAkB,KAAK,SAAS,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAClF,EAEiBwB,EAAA,kBAAoBxB,GAC7B,KAAK,oBAAoB,KAAK,gBAAgB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAC3F,EAEiBwB,EAAA,mBAAqBxB,GAC9B,KAAK,oBAAoB,KAAK,gBAAgB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAC3F,EAEiBwB,EAAA,oBAAsBxB,GAC/B,KAAK,oBAAoB,KAAK,gBAAgB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAC3F,EAEiBwB,EAAA,oBAAqB,CAACxB,EAAQvd,IACvC,KAAK,kBACV,KAAK,kBAAkB,KAAK,GAAG,UAAUud,CAAM,EAAG,KAAK,GAAG,UAAUvd,CAAG,CAAC,EACxE,MACF,CACD,EAEiB+e,EAAA,sBAAuB,CAACxB,EAAQvd,IACzC,KAAK,kBACV,KAAK,oBAAoB,KAAK,GAAG,UAAUud,CAAM,EAAG,KAAK,GAAG,UAAUvd,CAAG,CAAC,EAC1E,MACF,CACD,EAEiB+e,EAAA,gBAAkBxB,GAC3B,KAAK,kBAAkB,KAAK,cAAc,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CACvF,EAEiBwB,EAAA,kBAAoBxB,GAC7B,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CACzF,EAMDwB,EACE,yBACA,CAACxB,EAAQhJ,EAAqBE,KAAWiJ,IAChC,KAAK,sBACV,KAAK,uBACH,KAAK,GAAG,UAAUH,CAAM,EACxB,KAAK,GAAG,KAAKhJ,CAAmB,EAChC,KAAK,GAAG,UAAUE,CAAM,EACxB,GAAGiJ,EAAa,IAAI,KAAK,GAAG,SAAS,CACvC,EACA,MACF,CAEJ,EAMkBqB,EAAA,yBAA2BxB,GACpC,KAAK,kBACV,KAAK,uBAAuB,KAAK,GAAG,UAAUA,CAAM,CAAC,EACrD,MACF,CACD,EAEiBwB,EAAA,yBAA2BxB,GACpC,KAAK,kBACV,KAAK,uBAAuB,KAAK,GAAG,UAAUA,CAAM,CAAC,EACrD,MACF,CACD,EAEiBwB,EAAA,iCAAmCxB,GAC5C,KAAK,kBACV,KAAK,+BAA+B,KAAK,GAAG,UAAUA,CAAM,CAAC,EAC7D,MACF,CACD,EAEiBwB,EAAA,+BAAiCxB,GAC1C,KAAK,kBACV,KAAK,6BAA6B,KAAK,GAAG,UAAUA,CAAM,CAAC,EAC3D,MACF,CACD,EAMiBwB,EAAA,0BAA2B,CAACxB,EAAQzD,IAC7C,KAAK,kBACV,KAAK,wBAAwB,KAAK,GAAG,UAAUyD,CAAM,EAAG,KAAK,GAAG,UAAUzD,CAAM,CAAkB,EAClG,MAAS,CACZ,EAMiBiF,EAAA,oBAAsBxB,GAC/B,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CAC3F,EAMiBwB,EAAA,cAAe,CAACxB,EAAQW,IACjC,KAAK,kBACV,KAAK,YAAY,KAAK,GAAG,UAAUX,CAAM,EAAG,KAAK,GAAG,UAAUW,CAAM,CAAC,EACrE,MACF,CACD,EAEiBa,EAAA,iBAAkB,CAACxB,EAAQpD,IACpC,KAAK,kBACV,KAAK,eAAe,KAAK,GAAG,UAAUoD,CAAM,EAAG,KAAK,GAAG,UAAUpD,CAAe,CAAC,EACjF,MACF,CACD,EAEiB4E,EAAA,yBAA0B,CAACxB,EAAQpD,IAC5C,KAAK,kBACV,KAAK,uBAAuB,KAAK,GAAG,UAAUoD,CAAM,EAAG,KAAK,GAAG,UAAUpD,CAAe,CAAC,EACzF,MACF,CACD,EAEiB4E,EAAA,eAAiBxB,GAC1B,KAAK,kBAAkB,KAAK,aAAa,KAAK,GAAG,UAAUA,CAAM,CAAC,EAAG,MAAS,CACtF,EAMiBwB,EAAA,gBAAkB/gB,GAC3B,KAAK,kBAAkB,KAAK,cAAc,KAAK,GAAG,UAAUA,CAAO,CAAC,EAAG,MAAS,CACxF,EAMiB+gB,EAAA,wBAA0BhJ,GACnC,KAAK,sBAAsB,KAAK,wBAAyB,MAAS,CAC1E,EAEiBgJ,EAAA,kCAAoChJ,GAC7C,KAAK,sBAAsB,KAAK,kCAAmC,MAAS,CACpF,EAEiBgJ,EAAA,yBAA2BhJ,GACpC,KAAK,sBAAsB,KAAK,yBAA0B,MAAS,CAC3E,EAEiBgJ,EAAA,mBAAqBhJ,GAC9B,KAAK,sBACV,KAAK,iBAAiB,KAAK,oBAAoBA,CAAS,CAAmB,EAC3E,MACF,CACD,EAEiBgJ,EAAA,6BAA8B,CAAC/gB,EAASkW,IACjD,KAAK,sBACV,KAAK,2BACH,KAAK,GAAG,UAAUlW,CAAO,EACzB,KAAK,GAAG,UAAUkW,CAAU,CAC9B,EACA,MACF,CACD,EAEiB6K,EAAA,6BAA8B,CAAC/gB,EAASkW,IACjD,KAAK,sBACV,KAAK,2BACH,KAAK,GAAG,UAAUlW,CAAO,EACzB,KAAK,GAAG,UAAUkW,CAAU,CAC9B,EACA,MACF,CACD,EAMiB6K,EAAA,eAAiBX,GAC1B,KAAK,kBACV,KAAK,aAAa,KAAK,oBAAoBA,CAAG,CAAsC,EACpF,MACF,CACD,EAEiBW,EAAA,eAAiBX,GAC1B,KAAK,kBACV,KAAK,aACH,KAAK,oBAAoBA,CAAG,CAC9B,EACA,MACF,CACD,EAMDW,EAAkB,2BAA4B,IACrC,KAAK,kBAAkB,KAAK,2BAA4B,MAAS,CACzE,EAED,KAAK,GAAG,QAAQ,KAAK,GAAG,OAAQ,eAAgBH,CAAS,CAAA,CAC1D,CAAA,CAEL,CCt1BgB,SAAAO,GACdxd,EACA3D,EACgC,CACzB,OAAAqZ,GACL1V,EAAI,SACF,CACE,MAAOtB,EAAiBrC,EAAS,WAAW,EAC5C,gBAAiB,UACjB,mBAAoB,EACtB,EACA,CAAE,MAAO4E,EAAAA,GAAG,eAAgB,gBAAiB,QAAS,qBAAsB,EAAK,CACnF,EACCwc,GAAU,CACH,MAAArV,EAAOqV,EAAM,cAA6B,EAC1CnI,EAAMoI,EAAAA,cAActV,EAAK,MAAM,EAC9B,MAAA,CAAE,KAAMqV,EAAM,aAAa,GAAG,SAAS,EAAG,KAAArV,EAAM,IAAAkN,CAAI,CAAA,CAE/D,CACF,CAEa,MAAAqI,GAAkB,QAAQ,IAAI,qBC9B3B,SAAAC,GACdpe,EACAI,EACAie,EACA1C,EACA2C,EACAvH,EAAuC,GAClB,CAEf,MAAAlY,EAAM,GAAGuB,EAAI,OAAO,WAAWke,CAAS,IAAID,EAAG,MAAM,GACrD,OAAAtH,EAAA,CAAE,GAAGA,EAAK,IAAAlY,CAAI,EAChBkY,EAAI,OAAS,QAAasH,EAAG,YAAc,OAAU,KAAO,uBACzDle,EAAA,WAAW,QAASwV,GAAS,CAC5B,MAAA2F,EAAQ,IAAIQ,SAClBnG,EAAK,aAAa,IAAM2F,EAAM,QAAA,CAAS,EAEvC,MAAMiD,EAAUjD,EAAM,OAAOtb,EAAI,QAAQ,YAAY,EAC7Cue,EAAA,eAAe,KAAO,GAAG,EACzBA,EAAA,gBAAgB,KAAO,GAAG,EAClC,MAAMhD,EAAKD,EAAM,OAAOiD,EAAQ,YAAY,EACtCC,EAAO,IAAInD,GAAmBC,EAAOC,EAAInb,EAAKJ,EAAK2V,CAAI,EAExD6I,EAAA,eAAe7C,EAAK,OAAO,EAChC,MAAM1gB,EAASujB,EAAK,YAAYH,EAAG,MAAM,EAEzCG,EAAK,mBAAmB,EAExB,IAAIC,EAAuB,EAE3B,OAAIN,IAAmBA,KAAoB,iBACzC,QAAQ,IAAI,UAAUE,EAAG,MAAM,uBAAuB,EAEjD,CACL,GAAIG,EAAK,qBACT,iBAAkB,MAAOE,EAAmC,CAAE,eAAAC,EAAgB,OAAAC,KAAa,CAE9E,SAAA,CAACxC,EAAQ5R,CAAK,IAAK,OAAO,QAAQkU,CAAQ,EAAGF,EAAK,YAAYpC,EAAQ5R,CAAK,EAGhF,MAAAqU,EAAiBL,EAAK,sBAAsBvjB,CAAM,EAGxD,OAAAwjB,IACIN,KAAoBA,KAAoB,iBAAmB,CAACS,IAEpD,QAAA,IADNA,EAEA,iBAAiBP,EAAG,MAAM,eAAeQ,IAAmB,OAAY,UAAY,WAAW,OAAOJ,CAAoB,IAI1H,mBAAmBJ,EAAG,MAAM,cAAcM,CAAc,KAAKE,IAAmB,OAAY,UAAY,WAAW,MAAMJ,CAAoB,GAH/I,EAOGI,CAAA,CAEX,GACC9H,CAAG,CACR,CC1DO,SAAS+H,GAAShJ,EAAyC,CAChE,OAAIiJ,EAAe,eAAAjJ,CAAG,EAAUA,EAAI,WAAa,GACrCM,GAAuBN,CAAG,CACxC,CAEgB,SAAAkJ,GACdhf,EACAI,EACA6e,EACAtD,EACA2C,EACAvH,EAAuC,GAClB,CACjB,GAAAgI,EAAAA,eAAeE,CAAO,EAAG,CAC3B,GAAItD,IAAS,OAAiB,MAAA,IAAI,MAAM,iBAAiB,EACzD,OAAOyC,GAAiBpe,EAAKI,EAAK6e,EAAStD,EAAM2C,EAAWvH,CAAG,CAAA,KACnD,QAAA6D,GAAkB5a,EAAI,UAAWI,EAAK6e,EAASlI,CAAG,CAClE,CC8BgB,SAAAmI,GACdjK,EACAkK,EACAnf,EAC0C,CAC1C,OAAOG,EAAW,WAAA,KACfC,GAAQ,uBACP,MAAMI,EAAMJ,EAAI,SAAS6U,CAAQ,EAAE,KAAK,EAElCtU,EAAUD,EAAA,SAASF,EAAI,kBAA0BvC,EAAuB,CAAC,EACzE2C,EAAeF,EAAA,SAASF,EAAI,kBAA0BtC,EAA4B,CAAC,EAEnFuC,EAAOC,EAAA,SAASF,EAAI,kBAA+BrC,EAAc,CAAC,EAClE6J,EAAYtH,EAAA,SAASF,EAAI,kBAAoCpC,EAAmB,CAAC,EACjF8M,EAAiBxK,EAAA,SACrBF,EAAI,kBAAyCnC,EAAsB,CACrE,EAEM+gB,MAAY,IAClB,SAAW,CAAE,GAAA1jB,CAAA,IAAQqM,GAAUC,CAAS,EAAG,CACnC,MAAAqX,EAAU7e,EAAI,SAAS,CAC3B,MAAOtB,EAAiBxD,EAAI,aAAa,EACzC,gBAAiB,UACjB,mBAAoB,EAAA,CACrB,EAED,IAAI0Z,GAEE,MAAAkK,EAAU9e,EAAI,SAAS,CAC3B,MAAOtB,EAAiBxD,EAAI,UAAU,EACtC,gBAAiB,UACjB,iBAAkB,EAAA,CACnB,EACD,GAAI4jB,IAAY,OAAW,CACnB,MAAArkB,EAASuF,EAAI,SAAS,CAC1B,MAAOtB,EAAiBxD,EAAI,YAAY,EACxC,gBAAiB,UACjB,qBAAsB,EAAA,CACvB,EACK0E,EAAMI,EAAI,SAAS,CACvB,MAAOtB,EAAiBxD,EAAI,WAAW,EACvC,gBAAiB,UACjB,qBAAsB,EAAA,CACvB,EACM0Z,GAAA,CACL,UAAWkK,EAAQ,cAAc,EACjC,MAAOD,EAAQ,KAAOC,EAAQ,GAC9B,YACErkB,EAAO,QAAU,QACjBmF,EAAI,QAAU,UACdrD,EAAA9B,EAAO,QAAP,YAAA8B,EAAc,cAAe,UAC7BqD,EAAAA,EAAI,QAAJA,YAAAA,EAAW,cAAe,OAC5B,eACE8L,EAAAjR,EAAO,QAAP,YAAAiR,EAAc,sBAAqBiI,GAAAvF,EAAA3T,EAAO,QAAP,YAAA2T,EAAc,aAAd,YAAAuF,EAA0B,mBAC/D,eAAc/T,EAAAA,EAAI,QAAJA,YAAAA,EAAW,sBAAqBA,IAAAA,GAAAA,EAAI,QAAJA,YAAAA,GAAW,aAAXA,YAAAA,GAAuB,mBACrE,UACInF,EAAO,QAAU,QAAaA,EAAO,MAAM,kBAAA,GAC1CA,EAAO,QAAU,QAAaA,EAAO,MAAM,kBAAkB,KAC9DmF,EAAI,QAAU,QAAaA,EAAI,MAAM,kBACpCA,GAAAA,EAAI,QAAU,QAAaA,EAAI,MAAM,kBAAkB,EAC9D,CAAA,CAGIgf,EAAA,IAAI1jB,EAAI,CAAE,iBAAkB2jB,EAAQ,cAAc,EAAG,KAAAjK,GAAM,CAAA,CAG7D,MAAAmK,EAAevW,GAAgBhB,EAAYtM,GAAO0jB,EAAM,IAAI1jB,CAAE,EAAG,gBAAgB,EAEjF8jB,EAAQ,IAAI,IAAItU,EAAe,aAAa,EAE5C6I,EAAS,CAAC,GAAGhM,GAAUC,CAAS,CAAC,EAAE,IAAI,CAAC,CAAE,GAAAtM,EAAI,MAAO+jB,EAAc,cAAAC,MAAoB,eAC3F,MAAM9W,EAAOlI,EAAA,SAAS0e,EAAM,IAAI1jB,CAAE,CAAC,EAC7BikB,EAAQjf,EAAAA,SAAS6e,EAAa,MAAM,IAAI7jB,CAAE,CAAC,EACjD,IAAIkkB,EAA4C,gBAC5ChX,EAAK,OAAS,SACZ4W,EAAM,IAAI9jB,CAAE,EAAuBkkB,EAAA,QACdA,EAAAhX,EAAK,KAAK,SAAW,OAAS,WAGnD,MAAAxB,EAAK4W,GAAiBxd,EAAK9E,CAAE,EAE7B,CAAE,SAAAmkB,GAAU,MAAAC,EAAO,YAAAC,EAAa,WAAAC,GACpC9J,GAAW9O,EAAI,CAAC,CAAE,KAAA6Y,EAAM,IAAAnK,EAAK,KAAAlN,MAAW,CAChC,MAAAsX,GAAmBzK,GAA8BR,EAAUvZ,CAAE,EAC5D,MAAA,CACL,SAAUsjB,GACRhf,EACAkgB,GACApK,EAAI,SACJA,EAAI,KACJmK,CACF,EACA,MAAO/J,GACLJ,EAAI,MACHgK,IACCd,GACEhf,EACAkgB,GACAJ,GACAhK,EAAI,KACJmK,CAAA,CAEN,EACA,YAAajB,GACXhf,EACAkgB,GACApK,EAAI,YACJA,EAAI,KACJmK,CACF,EACA,WAAYnK,EAAI,UAClB,CACD,CAAA,GAAK,CAAC,EAEHqK,EAAW3f,EACd,SAAS,CACR,MAAOtB,EAAiBxD,EAAI,eAAe,EAC3C,gBAAiB,UACjB,mBAAoB,EACrB,CAAA,EACA,cAAc,EAEX0kB,EAAUlK,GAAW9O,EAAI,CAAC,CAAE,KAAAwB,CAChC,IAAA5I,EAAI,mBAAmB,IAAI,CAAE,YAAa4I,EAAK,OAAQ,SAAAuX,CAAU,CAAA,CACnE,EAEO,MAAA,CACL,GAAAzkB,EACA,MAAOokB,GAASL,EAChB,MAAOK,GAASL,EAChB,cAAAC,GACA,QAAO3iB,EAAA6L,EAAK,OAAL,YAAA7L,EAAW,SAAU,IAAS6iB,IAAsB,QAC3D,iBAAkBD,EAAM,kBACxB,UAAW,CAAC,GAAGJ,EAAa,0BAA0B,WAAY7jB,CAAE,CAAC,EACrE,YAAa,CAAC,GAAG6jB,EAAa,0BAA0B,aAAc7jB,CAAE,CAAC,EACzE,kBAAAkkB,EACA,eAAc3T,EAAArD,EAAK,OAAL,YAAAqD,EAAW,eAAgB,GACzC,cAAcC,EAAAtD,EAAK,OAAL,YAAAsD,EAAW,aACzB,cAAc0C,EAAAhG,EAAK,OAAL,YAAAgG,EAAW,aACzB,SAAAuR,EACA,SAAAN,GACA,YAAAE,EACA,WAAY,CAAC,EACb,kBAAkB5L,EAAA/M,GAAA,YAAAA,EAAI,OAAJ,YAAA+M,EAAU,OAC5B,QAAAiM,EACA,WAAAJ,EACA,gBAAiBb,EAAiB,SAASzjB,CAAE,CAC/C,CAAA,CACD,EAEM,MAAA,CACL,KAAA+E,EACA,QAAS,IAAI,KAAKE,CAAO,EACzB,aAAc,IAAI,KAAKC,CAAY,EACnC,aAAcJ,EAAI,kBAAgC7B,EAAyB,EAC3E,OAAAoV,CACF,CACF,EACA,CACE,iBAAmBvJ,GAAU,CACrB,MAAA6V,MAAc,IACdC,MAAkB,IACjB,MAAA,CACL,GAAG9V,EACH,OAAQA,EAAM,OAAO,IAAK/G,GAAM,SACzBA,EAAE,aAAqB4c,EAAA,IAAI5c,EAAE,EAAE,EAChCA,EAAE,OAAmB6c,EAAA,IAAI7c,EAAE,EAAE,EACjC,MAAM8c,EAAQ9c,EAAE,OAASA,EAAE,UAAU,UAAW+c,GAAMF,EAAY,IAAIE,CAAC,CAAC,IAAM,GACxEC,GACHF,GAAS9c,EAAE,eACZ,EAAQA,EAAE,aACV,CAACA,EAAE,kBACHA,EAAE,UAAU,UAAW+c,GAAMH,EAAQ,IAAIG,CAAC,CAAC,IAAM,GAC7CE,EAAK,CACT,GAAGjd,EACH,OAAAgd,EACA,MAAAF,EACA,oBAAmBxjB,EAAA0G,EAAE,UAAF,YAAA1G,EAAW,cAAe,CAAC,EAC9C,kBAAkBkP,EAAAxI,EAAE,UAAF,YAAAwI,EAAW,cAC/B,EACA,cAAOyU,EAAG,QACHA,CACR,CAAA,CACH,CAAA,CACF,GAEF,eAAe,CACnB,CClOA,SAASC,GACPC,EACA5gB,EAC0D,CACpD,MAAAK,EAAOugB,EAAY,KAAK,EAC9B,GAAIjhB,qBAAmBU,EAAK,aAAcoF,EAA2B,EAAG,CAChE,MAAAsL,EAAO1Q,EAAK,cAAmC,EACrD,GAAI0Q,IAAS,OAAiB,MAAA,IAAI,MAAM,mBAAmB,EACpD,OAAA/Q,EAAI,uBAAuB,QAAQ,IAAI,IAAI+Q,EAAK,GAAG,CAAC,EAAE,eAAe,CACnE,SAAApR,EAAAA,mBAAmBU,EAAK,aAAcqF,EAA8B,EAAG,CAC1E,MAAAqL,EAAO1Q,EAAK,cAAsC,EACxD,GAAI0Q,IAAS,OAAiB,MAAA,IAAI,MAAM,mBAAmB,EAC3D,OAAA/Q,EAAI,OAAO,OACT+Q,EAAK,KACLA,EAAK,UACL,yCAAyCA,EAAK,IAAI,EACpD,EACOA,EAAK,IAAA,KAEN,OAAA,IAAI,MAAM,8BAA8B,KAAK,UAAU1Q,EAAK,YAAY,CAAC,EAAE,CAErF,CAEA,SAASwgB,GACP5kB,EACA+D,EAC6C,CACzC,GAAA/D,IAAU,OACd,OAAOkE,EAAW,WAAA,KACfoY,GACQoI,GAAOpI,EAAE,SAAStc,CAAK,EAAG+D,CAAG,EAEtC,CACE,iBAAmBlE,GAAM,CACnB,GAAAA,IAAM,OACN,IAAA,OAAOA,GAAM,SAAiB,OAAAA,EAClC,GAAIA,EAAE,QAAU,aAAiB,IAAI,MAAMA,EAAE,KAAK,EAClD,OAAOA,EAAE,KAAA,CACX,GAEF,eAAe,CACnB,CAEgB,SAAAglB,GACdpL,EACAha,EACAsE,EACuC,CACvC,OAAOG,EAAW,WAAA,KACfC,GAAQ,OACP,MAAMI,EAAMJ,EAAI,SAASsV,CAAY,EAAE,KAAK,EACtCtO,EAAK4W,GAAiBxd,EAAK9E,CAAE,EAC7BqlB,GAAgBhkB,EAAAyD,EACnB,SACC,CACE,MAAOtB,EAAiBxD,EAAI,WAAW,EACvC,gBAAiB,SACnB,EACA,CAAE,MAAO+F,EAAAA,GAAG,eAAgB,gBAAiB,QAAS,qBAAsB,EAAK,EACjF,CAAE,MAAOqE,GAAwB,gBAAiB,OAAQ,KAPxC,YAAA/I,EASlB,UACG,MAAA,CACL,KAAM8jB,GAAuBE,EAAe/gB,CAAG,EAC/C,WAAYoH,GAAA,YAAAA,EAAI,IAAI,UACtB,CACF,EACA,CAAE,KAAM,gBAAiB,CAC3B,CACF,CC1DgB,SAAA4Z,GACdtL,EACA7Y,EACA8Y,EACuD,CACvD,GAAIA,IAAS,OACJ,OAAAxV,EAAA,WAAW,KAAMoY,GAAMyI,GAAoBtL,EAAc7Y,EAAS0b,CAAC,EAAG,CAC3E,IAAK,UAAU0I,EAAA,mBAAmBvL,EAAa,GAAG,CAAC,IAAI7Y,CAAO,EAAA,CAC/D,EAEH,MAAM2D,EAAMmV,EAAK,SAASD,CAAY,EAAE,KAAK,EACvCtV,EAAMqV,GAA8BC,EAAc7Y,CAAO,EACzDiS,EAAU1O,EAAI,QAAQuV,CAAI,EACzB,MAAA,CACL,OAAQnV,EAAI,kBAAgC9B,GAAmB7B,CAAO,CAAC,EACvE,KAAM,KAAK,MAAMuD,EAAI,KAAKuV,CAAI,CAAC,EAC/B,GAAI7G,IAAY,OAAY,KAAK,MAAMA,CAAO,EAAI,MACpD,CACF,CAEgB,SAAAoS,GACdxL,EACA7Y,EACAmD,EAC2E,CAC3E,OAAOG,EAAW,WAAA,KACfoY,GAAM,CACL,MAAM/X,EAAM+X,EAAE,SAAS7C,CAAY,EAAE,KAAK,EACpCtV,EAAMwV,GAAsBF,EAAc7Y,CAAO,EAEhD,OAAAqZ,GAAW8H,GAAiBxd,EAAK3D,CAAO,EAAG,CAAC,CAAE,IAAAiZ,EAAK,KAAAmK,KAAW,CACnE,MAAMkB,EAA2C,CAAC,EACvC,SAAA,CAACC,EAAQC,CAAO,IAAK,OAAO,QAAQvL,EAAI,OAAO,EAAG,CAC3D,MAAMwL,EAAmBtC,GAAsBhf,EAAKI,EAAKihB,EAASvL,EAAI,KAAMmK,CAAI,EAChFkB,EAAQC,CAAM,EAAIjhB,aAAW,UAAUmhB,CAAgB,CAAA,CAElD,OAAAH,CAAA,CACR,CACH,EACA,CAAE,IAAK,WAAaF,EAAA,mBAAmBvL,EAAa,GAAG,EAAI,IAAM7Y,CAAQ,GACzE,eAAe,CACnB,CCtDgB,SAAA0kB,GACdtM,EACAjV,EACuB,CAChB,OAAAG,EAAA,WAAW,KAAMC,GAAQ,CAC9B,MAAMI,EAAMJ,EAAI,SAAS6U,CAAQ,EAAE,KAAK,EAElCjN,EAAYtH,EAAA,SAASF,EAAI,kBAAoCpC,EAAmB,CAAC,EACjFojB,EAA6B,CAAC,EACpC,SAAW,CAAE,GAAA9lB,EAAI,cAAAgkB,CAAmB,IAAA3X,GAAUC,CAAS,EAAG,CAClD,MAAAZ,EAAK4W,GAAiBxd,EAAK9E,CAAE,EACnC,GAAI0L,IAAO,OAAW,SAEhB,MAAAqa,EAAsB,OAAO,QAAQra,EAAG,IAAI,OAAO,EACtD,IAAI,CAAC,EAAG0O,CAAG,IAAMA,CAAG,EACpB,OAAQA,GAAQgJ,GAAShJ,CAAG,CAAC,EAC7B,IAAKA,GAAQA,CAAgC,EAE5C,GAAA2L,EAAoB,SAAW,EAAG,SAEtC,MAAMjG,EAAW5F,GAAsBpV,EAAI,QAAA,EAAW9E,CAAE,EAExD,UAAWoa,KAAO2L,EACZD,EAAA,KACFrhB,EAAAA,WAAW,UAAU6e,GAAsBhf,EAAKwb,EAAU1F,EAAK1O,EAAG,IAAI,KAAMA,EAAG,IAAI,CAAC,CACtF,CAAA,CAGG,OAAAoa,CAAA,CACR,CACH,CCpCO,MAAME,EAAiB,CAAvB,cACYxkB,EAAA,kBAAa,KAEvB,SAASL,EAAiB+O,EAAwB,CACvD,MAAM3P,EAAQ,KAAK,OAAO,IAAIY,CAAO,EACrC,GAAIZ,IAAU,OAAW,CAClB,KAAA,OAAO,IAAIY,EAAS,CAAE,MAAA+O,EAAO,OAAQ,IAAI+V,EAAa,aAAG,EAC9D,MAAA,CAEI1lB,EAAA,MAAQ,CAAE,GAAG2P,CAAM,EACzB3P,EAAM,OAAO,YAAY,CAAA,CAGnB,UAAUmE,EAAoBvD,EAAkC,CACtE,IAAIZ,EAAQ,KAAK,OAAO,IAAIY,CAAO,EACnC,OAAIZ,IAAU,SACJA,EAAA,CAAE,MAAO,CAAE,GAAG2lB,0BAA0B,OAAQ,IAAID,EAAAA,YAAe,EACtE,KAAA,OAAO,IAAI9kB,EAASZ,CAAK,GAE1BA,EAAA,OAAO,cAAcmE,EAAI,OAAO,EAC/BnE,EAAM,KAAA,CAGR,SAASY,EAA8C,CAC5D,OAAOsD,EAAW,WAAA,KACfC,GACQ,KAAK,UAAUA,EAAKvD,CAAO,EAEpC,CAAE,IAAK,mBAAmBA,CAAO,EAAG,CACtC,CAAA,CAGK,YAAYA,EAAiB,CAClC,MAAMZ,EAAQ,KAAK,OAAO,IAAIY,CAAO,EACjCZ,IAAU,SACP,KAAA,OAAO,OAAOY,CAAO,EAC1BZ,EAAM,OAAO,YAAY,EAC3B,CAEJ,CCRO,MAAM4lB,EAAQ,CAiBnB,YACmB7hB,EACjBF,EACiBgiB,EACjB,CAnBc5kB,EAAA,YAGAA,EAAA,iBAECA,EAAA,wBAAmB,IAAIwkB,IACvBxkB,EAAA,4BAAuB,KAEvBA,EAAA,0BAAqB,KACrBA,EAAA,sBACAA,EAAA,0BAEAA,EAAA,uBAAkB,IAAI,iBAC/BA,EAAA,iBAAY,IAGD,KAAA,IAAA8C,EAEA,KAAA,YAAA8hB,EAEjB,KAAK,SAAW5C,GACd4C,EAAY,MAAM,EAClB,KAAK,iBACL9hB,GACA,2BAA2B,EAC7B,KAAK,IAAMF,EACN,KAAA,kBAAoB,KAAK,YAAY,EAC1C,KAAK,cAAgByhB,GAAcO,EAAY,MAAA,EAAS9hB,CAAG,CAAA,CAG7D,MAAc,aAA6B,CAClC,KAAA,CAAC,KAAK,WACP,GAAA,CACF,MAAMyQ,GAAY,KAAK,IAAI,GAAI,KAAK,IAAMjQ,GAAQ,CAChDA,EAAI,UAAU,KAAK,IAAI,IAAI,oBAAoB,CAAA,CAChD,EACK,MAAA,KAAK,cAAc,SAAS,EAClC,MAAMuhB,cAAW,KAAK,IAAI,IAAI,uBAAwB,KAAK,gBAAgB,MAAM,QAC1E,EAAQ,CACX,GAAAC,EAAAA,gBAAgB,CAAC,EAAG,CACd,QAAA,KACN,4EACF,EACA,KAAA,SACS,CAACC,EAAA,uBAAuB,CAAC,EAClC,MAAM,IAAI,MAAM,uBAAwB,CAAE,MAAO,EAAG,CAAA,CAE1D,CAcF,MAAa,SACXC,EACAC,EACA9U,EACAtC,EAAmC,OACnClO,EAAkBsF,GAAAA,aACD,CACjB,MAAMigB,EAAa,MAAM,KAAK,IAAI,WAAW,QAAQD,CAAa,EAC5DE,EAAoB,MAAM,KAAK,IAAI,WAAW,wBAAwBF,CAAa,EACnFG,EAAWpE,gBAAcmE,CAAiB,EAC1C,aAAA1R,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK5F,EAAS8F,GACxDA,EAAI,SACF,CACE,GAAIhU,EACJ,MAAOqlB,EACP,cAAeI,EAAS,aAC1B,EACA,CACE,KAAM,KAAK,UAAUA,EAAS,WAAW,EACzC,QAAS,KAAK,UAAUA,EAAS,cAAc,EAC/C,UAAWF,CACb,EACA/U,CAAA,CAEJ,EACM,MAAA,KAAK,YAAY,aAAa,EAE7BxQ,CAAA,CAOT,MAAa,gBACXA,EACAslB,EACAI,EAAqB,GACrBxX,EACe,CACf,MAAMqX,EAAa,MAAM,KAAK,IAAI,WAAW,QAAQD,CAAa,EAC5DG,EAAW,MAAM,KAAK,IAAI,WAAW,wBAAwBH,CAAa,EAC1E,MAAAxR,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK5F,EAAS8F,GACxDA,EAAI,iBACFhU,EACAulB,EACAG,EAAY,KAAK,UAAUD,EAAS,WAAW,EAAI,MAAA,CAEvD,EACM,MAAA,KAAK,YAAY,aAAa,CAAA,CAItC,MAAa,YAAYzlB,EAAiBkO,EAAsC,CAC9E,MAAM4F,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK5F,EAAS8F,GAAQA,EAAI,YAAYhU,CAAO,CAAC,EACrF,KAAA,iBAAiB,YAAYA,CAAO,EACnC,MAAA,KAAK,YAAY,aAAa,CAAA,CAStC,MAAa,cAAckX,EAAkBhJ,EAAsC,CAC3E,MAAA4F,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK5F,EAAS8F,GAAQ,CAChE,MAAM2R,EAAmB3R,EAAI,UACzB,GAAA2R,EAAiB,OAAO,SAAW,EAC/B,MAAA,IAAI,MAAM,uDAAuD,EACnE,MAAAC,EAAeD,EAAiB,OAAO,CAAC,EAC1C,GAAAC,EAAa,OAAO,SAAW1O,EAAO,OAClC,MAAA,IAAI,MAAM,mBAAmB0O,EAAa,OAAO,MAAM,QAAQ1O,EAAO,MAAM,EAAE,EAClF,GAAA,IAAI,IAAYA,CAAM,EAAE,OAASA,EAAO,OAAQ,MAAM,IAAI,MAAM,oBAAoB,EACxF,MAAMlH,EAAiC,CACrC,OAAQ,CACN,CACE,GAAI4V,EAAa,GACjB,MAAOA,EAAa,MACpB,OAAQ1O,EAAO,IAAKlX,GAAY,CACxB,MAAA8O,EAAQ8W,EAAa,OAAO,KAAMhf,GAAMA,EAAE,KAAO5G,CAAO,EAC9D,GAAI8O,IAAU,OAAW,MAAM,IAAI,MAAM,qBAAqB9O,CAAO,EAAE,EAChE,OAAA8O,CACR,CAAA,CAAA,CACH,CAEJ,EACAkF,EAAI,gBAAgBhE,CAAY,CAAA,CACjC,EACK,MAAA,KAAK,YAAY,aAAa,CAAA,CAQtC,MAAa,SAAShQ,EAAgC,CACpD,MAAM4T,GAAY,KAAK,IAAI,GAAI,KAAK,IAAMI,GAAQA,EAAI,iBAAiB,CAAChU,CAAO,EAAG,EAAI,CAAC,EACjF,MAAA,KAAK,YAAY,aAAa,CAAA,CAQtC,MAAa,UAAUA,EAAgC,CAC/C,MAAA4T,GAAY,KAAK,IAAI,GAAI,KAAK,IAAMI,GAAQA,EAAI,eAAehU,CAAO,CAAC,EACvE,MAAA,KAAK,YAAY,aAAa,CAAA,CAiBtC,MAAa,aAAaA,EAAiBiL,EAAWiD,EAAuB,CACrE,MAAA4F,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK5F,EAAS8F,GACxDA,EAAI,QAAQ,CAAC,CAAE,QAAAhU,EAAS,KAAM,KAAK,UAAUiL,CAAI,EAAG,CAAC,CACvD,EACM,MAAA,KAAK,YAAY,aAAa,CAAA,CAStC,MAAa,WAAWjL,EAAiBiS,EAAkB/D,EAAuB,CAC1E,MAAA4F,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK5F,EAAS8F,GACxDA,EAAI,WAAWhU,EAASiS,IAAY,OAAY,OAAY,KAAK,UAAUA,CAAO,CAAC,CACrF,EACM,MAAA,KAAK,YAAY,aAAa,CAAA,CAMtC,MAAa,mBAAmBjS,EAAiB+O,EAAuC,CACjF,KAAA,iBAAiB,SAAS/O,EAAS+O,CAAK,CAAA,CAS/C,MAAa,uBACX/O,EACAiL,EACAgH,EACA/D,EACA,CACM,MAAA4F,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK5F,EAAS8F,GAAQ,CAC5DA,EAAA,QAAQ,CAAC,CAAE,QAAAhU,EAAS,KAAM,KAAK,UAAUiL,CAAI,CAAE,CAAC,CAAC,EACrD+I,EAAI,WAAWhU,EAAS,KAAK,UAAUiS,CAAO,CAAC,CAAA,CAChD,EACK,MAAA,KAAK,YAAY,aAAa,CAAA,CAItC,MAAa,iBAAiBjS,EAAiB2P,EAAyB,CAChE,MAAAmE,GAAoB,KAAK,IAAI,GAAI,KAAK,IAAK,OAAYE,GAAQ,CAC/DA,EAAA,iBAAiBhU,EAAS2P,CAAQ,CAAA,CACvC,EACK,MAAA,KAAK,YAAY,aAAa,CAAA,CAItC,MAAa,yBAAyB3P,EAAiBkO,EAAsC,CAC3F,MAAM,KAAK,IAAI,GAAG,YAAY,mBAAoB,MAAO9J,GAAO,CAE9D,MAAMyhB,EAAc3S,EAAA,yBACjB,MAAM9O,EAAG,SAASV,EAAAA,MAAM,KAAK,IAAKrB,EAAiBrC,EAAS,WAAW,CAAC,CAAC,GAAG,KAC/E,EACM8lB,EAAQ5S,EAAA,yBACX,MAAM9O,EAAG,SAASV,EAAAA,MAAMmiB,EAAajhB,EAAG,GAAA,cAAc,CAAC,GAAG,KAC7D,EACMmhB,EAAS,MAAM3hB,EAAG,gBAAgB0hB,EAAO,EAAK,EAC9CE,EAAS,KAAK,MAClB,OAAO,KAAKniB,WAASkiB,EAAO,IAAI,CAAC,EAAE,SAAS,OAAO,CACrD,EACA,MAAMjS,GAAoB1P,EAAI,KAAK,IAAK8J,EAASvK,GAAQ,CACvDA,EAAI,QAAQ,CAAC,CAAE,QAAA3D,EAAS,KAAM,KAAK,UAAUgmB,EAAO,OAAO,WAAW,CAAG,CAAA,CAAC,EACtEriB,EAAA,WAAW3D,EAAS,MAAS,CAAA,CAClC,EACD,MAAMoE,EAAG,OAAO,CAAA,CACjB,EACK,MAAA,KAAK,YAAY,aAAa,CAAA,CAG9B,oBAAoBpE,EAAwC,CAClE,MAAMsN,EAAS,KAAK,iBAAiB,IAAItN,CAAO,EAChD,GAAIsN,IAAW,OAAW,CAElB,MAAAgX,EAAUD,GAAa,KAAK,YAAY,QAASrkB,EAAS,KAAK,GAAG,EAiBlEud,EAAqC,CACzC,UAjBgBja,EAAAA,WAAW,KAC1BC,IAAS,CACR,eAAgB4gB,GAAoB,KAAK,YAAY,MAAM,EAAGnkB,EAASuD,CAAG,EAC1E,QAAA+gB,EACA,gBAAiB,KAAK,iBAAiB,SAAStkB,CAAO,CAAA,GAEzD,CACE,iBAAmBf,IAChB,CACC,GAAGA,EAAE,eACL,QAASA,EAAE,QACX,gBAAiBA,EAAE,eACrB,EAAA,CAEN,EAGuB,2BAA2B,CAClD,EAEK,YAAA,iBAAiB,IAAIe,EAASud,CAAW,EAEvCA,CAAA,CAEF,OAAAjQ,CAAA,CAOF,cAActN,EAAiD,CAC7D,OAAA,KAAK,oBAAoBA,CAAO,EAAE,SAAA,CAOpC,iBAAiBA,EAAwD,CAC9E,MAAMsN,EAAS,KAAK,eAAe,IAAItN,CAAO,EAC9C,GAAIsN,IAAW,OAAW,CACxB,MAAM2Y,EAAKhC,GACT,KAAK,YAAY,MAAM,EACvBjkB,EACA,KAAK,KACL,2BAA2B,EACxB,YAAA,eAAe,IAAIA,EAASimB,CAAE,EAC5BA,CAAA,CAEF,OAAA3Y,CAAA,CAIT,MAAa,SAAyB,CAEpC,KAAK,UAAY,GACjB,KAAK,gBAAgB,MAAM,EAC3B,MAAM,KAAK,kBAGL,MAAA,KAAK,YAAY,UAAU,EAIjC,KAAK,SAAS,WAAW,EACzB,KAAK,eAAe,QAASoO,GAAMA,EAAE,YAAY,EAC5C,KAAA,iBAAiB,QAASA,GAAM,CACnCA,EAAE,UAAU,WAAW,CAAA,CACxB,EACD,KAAK,cAAc,WAAW,CAAA,CAIhC,MAAa,4BAA4C,CACvD,MAAM,KAAK,QAAQ,CAAA,CAGrB,aAAoB,KAAKvY,EAA6BF,EAAmC,CAEvF,MAAM2Q,GAAYzQ,EAAI,GAAIF,EAAMijB,GAAM,CAAA,CAAE,EAGlC,MAAAjB,EAAc,MAAM5hB,GAAAA,sBAAsB,KAC9CF,EAAI,GACJF,EACA,CACE,GAAGE,EAAI,IAAI,mBACX,QAASgjB,EACX,EACAhjB,EAAI,MACN,EAEA,OAAO,IAAI6hB,GAAQ7hB,EAAKF,EAAKgiB,CAAW,CAAA,CAE5C,CAEA,SAASkB,GAAmBza,EAAsC,CAUxD,OAAAA,EAAE,KAAK,KAAM,CACnB,IAAK,kBACH,OAAOA,EAAE,OAAO,OAAQlO,GAAMA,EAAE,OAAS,UAAU,EACrD,IAAK,cACI,OAAAkO,EAAE,OAAO,OAAQlO,GAAM,CAACA,EAAE,KAAK,WAAW,mBAAmB,CAAC,EACvE,IAAK,OACH,MAAO,CAAC,EACV,QACE,OAAOkO,EAAE,MAAA,CAEf,CC3TO,MAAM0a,GAOT,CACF,OAAQ,IAAIC,EAAAA,qBACZ,cAAe,CACb,mBAAoB,IAAM,KAAO,KACjC,qBAAsB,EACxB,EACA,2BAA4B,CAC1B,mBAAoB,IAAM,KAAO,KACjC,qBAAsB,EACxB,EACA,gBAAiB,CACf,uBAAwB,GACxB,yBAA0B,GAC1B,gBAAiB,IACjB,iBAAkB,GACpB,EACA,mBAAoB,CAClB,mBAAoB,GACpB,gBAAiB,IACjB,iBAAkB,GAAA,CAEtB,EAEO,SAASC,GACdC,EAG2B,CACpB,MAAA,CACL,iBAAkB7qB,EAAK,KAAK6qB,EAAS,UAAU,EAC/C,sBAAuB7qB,EAAK,KAAK6qB,EAAS,eAAe,CAC3D,CACF,CAuCO,MAAMC,GAOT,CACF,GAAGJ,GACH,mBAAoB,CAClB,gBAAiB,IACjB,iBAAkB,IACpB,EACA,8BAA+B,IAC/B,uBAAwB,IACxB,qBAAsB,CACxB,EAEO,SAASK,GACdF,EAIA,CACO,MAAA,CACL,GAAGD,GAAyBC,CAAO,EACnC,qBAAsB7qB,EAAK,KAAK6qB,EAAS,UAAU,CACrD,CACF,0HCxNA,MAAMG,GAAsB,QAEtBC,GAAa,IACbC,GAAmB,OAAO,kBACL,iBAGrBC,GAA4B,GAI5BC,GAAwBH,GAAa,EAErCI,GAAgB,CACpB,QACA,WACA,QACA,WACA,QACA,WACA,YACF,EAEA,IAAAC,GAAiB,CACjB,WAAEL,GACA,0BAAAE,GACA,sBAAAC,GACF,iBAAEF,GACA,cAAAG,GACA,oBAAAL,GACA,wBAAyB,EACzB,WAAY,CACd,EClCA,MAAMO,GACJ,OAAO,SAAY,UACnB,QAAQ,KACR,QAAQ,IAAI,YACZ,cAAc,KAAK,QAAQ,IAAI,UAAU,EACvC,IAAIhc,IAAS,QAAQ,MAAM,SAAU,GAAGA,CAAI,EAC5C,IAAM,CAAA,EAEV,IAAAic,GAAiBD,kBCRjB,KAAM,CACJ,0BAAAJ,EACA,sBAAAC,EACA,WAAAH,CACF,EAAIQ,GACEF,EAAQG,GACdC,EAAUC,UAAiB,CAAA,EAG3B,MAAMC,EAAKF,EAAA,GAAa,CAAA,EAClBG,EAASH,EAAA,OAAiB,CAAA,EAC1BI,EAAMJ,EAAA,IAAc,CAAA,EACpBK,EAAIL,EAAA,EAAY,CAAA,EACtB,IAAIM,EAAI,EAER,MAAMC,EAAmB,eAQnBC,EAAwB,CAC5B,CAAC,MAAO,CAAC,EACT,CAAC,MAAOlB,CAAU,EAClB,CAACiB,EAAkBd,CAAqB,GAGpCgB,EAAiBna,GAAU,CAC/B,SAAW,CAACoa,EAAOC,CAAG,IAAKH,EACzBla,EAAQA,EACL,MAAM,GAAGoa,CAAK,GAAG,EAAE,KAAK,GAAGA,CAAK,MAAMC,CAAG,GAAG,EAC5C,MAAM,GAAGD,CAAK,GAAG,EAAE,KAAK,GAAGA,CAAK,MAAMC,CAAG,GAAG,EAEjD,OAAOra,GAGHsa,EAAc,CAACxlB,EAAMkL,EAAOua,IAAa,CAC7C,MAAMC,EAAOL,EAAcna,CAAK,EAC1ByG,EAAQuT,IACdV,EAAMxkB,EAAM2R,EAAOzG,CAAK,EACxB+Z,EAAEjlB,CAAI,EAAI2R,EACVqT,EAAIrT,CAAK,EAAIzG,EACb4Z,EAAGnT,CAAK,EAAI,IAAI,OAAOzG,EAAOua,EAAW,IAAM,MAAS,EACxDV,EAAOpT,CAAK,EAAI,IAAI,OAAO+T,EAAMD,EAAW,IAAM,MAAS,GAS7DD,EAAY,oBAAqB,aAAa,EAC9CA,EAAY,yBAA0B,MAAM,EAM5CA,EAAY,uBAAwB,gBAAgBL,CAAgB,GAAG,EAKvEK,EAAY,cAAe,IAAIR,EAAIC,EAAE,iBAAiB,CAAC,QAChCD,EAAIC,EAAE,iBAAiB,CAAC,QACxBD,EAAIC,EAAE,iBAAiB,CAAC,GAAG,EAElDO,EAAY,mBAAoB,IAAIR,EAAIC,EAAE,sBAAsB,CAAC,QACrCD,EAAIC,EAAE,sBAAsB,CAAC,QAC7BD,EAAIC,EAAE,sBAAsB,CAAC,GAAG,EAK5DO,EAAY,uBAAwB,MAAMR,EAAIC,EAAE,iBAAiB,CAChE,IAAGD,EAAIC,EAAE,oBAAoB,CAAC,GAAG,EAElCO,EAAY,4BAA6B,MAAMR,EAAIC,EAAE,sBAAsB,CAC1E,IAAGD,EAAIC,EAAE,oBAAoB,CAAC,GAAG,EAMlCO,EAAY,aAAc,QAAQR,EAAIC,EAAE,oBAAoB,CAC3D,SAAQD,EAAIC,EAAE,oBAAoB,CAAC,MAAM,EAE1CO,EAAY,kBAAmB,SAASR,EAAIC,EAAE,yBAAyB,CACtE,SAAQD,EAAIC,EAAE,yBAAyB,CAAC,MAAM,EAK/CO,EAAY,kBAAmB,GAAGL,CAAgB,GAAG,EAMrDK,EAAY,QAAS,UAAUR,EAAIC,EAAE,eAAe,CACnD,SAAQD,EAAIC,EAAE,eAAe,CAAC,MAAM,EAWrCO,EAAY,YAAa,KAAKR,EAAIC,EAAE,WAAW,CAC9C,GAAED,EAAIC,EAAE,UAAU,CAAC,IAClBD,EAAIC,EAAE,KAAK,CAAC,GAAG,EAEjBO,EAAY,OAAQ,IAAIR,EAAIC,EAAE,SAAS,CAAC,GAAG,EAK3CO,EAAY,aAAc,WAAWR,EAAIC,EAAE,gBAAgB,CAC1D,GAAED,EAAIC,EAAE,eAAe,CAAC,IACvBD,EAAIC,EAAE,KAAK,CAAC,GAAG,EAEjBO,EAAY,QAAS,IAAIR,EAAIC,EAAE,UAAU,CAAC,GAAG,EAE7CO,EAAY,OAAQ,cAAc,EAKlCA,EAAY,wBAAyB,GAAGR,EAAIC,EAAE,sBAAsB,CAAC,UAAU,EAC/EO,EAAY,mBAAoB,GAAGR,EAAIC,EAAE,iBAAiB,CAAC,UAAU,EAErEO,EAAY,cAAe,YAAYR,EAAIC,EAAE,gBAAgB,CAAC,WACjCD,EAAIC,EAAE,gBAAgB,CAAC,WACvBD,EAAIC,EAAE,gBAAgB,CAAC,OAC3BD,EAAIC,EAAE,UAAU,CAAC,KACrBD,EAAIC,EAAE,KAAK,CAAC,OACR,EAEzBO,EAAY,mBAAoB,YAAYR,EAAIC,EAAE,qBAAqB,CAAC,WACtCD,EAAIC,EAAE,qBAAqB,CAAC,WAC5BD,EAAIC,EAAE,qBAAqB,CAAC,OAChCD,EAAIC,EAAE,eAAe,CAAC,KAC1BD,EAAIC,EAAE,KAAK,CAAC,OACR,EAE9BO,EAAY,SAAU,IAAIR,EAAIC,EAAE,IAAI,CAAC,OAAOD,EAAIC,EAAE,WAAW,CAAC,GAAG,EACjEO,EAAY,cAAe,IAAIR,EAAIC,EAAE,IAAI,CAAC,OAAOD,EAAIC,EAAE,gBAAgB,CAAC,GAAG,EAI3EO,EAAY,cAAe,oBACDpB,CAAyB,kBACrBA,CAAyB,oBACzBA,CAAyB,MAAM,EAC7DoB,EAAY,SAAU,GAAGR,EAAIC,EAAE,WAAW,CAAC,cAAc,EACzDO,EAAY,aAAcR,EAAIC,EAAE,WAAW,EAC7B,MAAMD,EAAIC,EAAE,UAAU,CAAC,QACjBD,EAAIC,EAAE,KAAK,CAAC,gBACJ,EAC5BO,EAAY,YAAaR,EAAIC,EAAE,MAAM,EAAG,EAAI,EAC5CO,EAAY,gBAAiBR,EAAIC,EAAE,UAAU,EAAG,EAAI,EAIpDO,EAAY,YAAa,SAAS,EAElCA,EAAY,YAAa,SAASR,EAAIC,EAAE,SAAS,CAAC,OAAQ,EAAI,EAC9DL,EAAA,iBAA2B,MAE3BY,EAAY,QAAS,IAAIR,EAAIC,EAAE,SAAS,CAAC,GAAGD,EAAIC,EAAE,WAAW,CAAC,GAAG,EACjEO,EAAY,aAAc,IAAIR,EAAIC,EAAE,SAAS,CAAC,GAAGD,EAAIC,EAAE,gBAAgB,CAAC,GAAG,EAI3EO,EAAY,YAAa,SAAS,EAElCA,EAAY,YAAa,SAASR,EAAIC,EAAE,SAAS,CAAC,OAAQ,EAAI,EAC9DL,EAAA,iBAA2B,MAE3BY,EAAY,QAAS,IAAIR,EAAIC,EAAE,SAAS,CAAC,GAAGD,EAAIC,EAAE,WAAW,CAAC,GAAG,EACjEO,EAAY,aAAc,IAAIR,EAAIC,EAAE,SAAS,CAAC,GAAGD,EAAIC,EAAE,gBAAgB,CAAC,GAAG,EAG3EO,EAAY,kBAAmB,IAAIR,EAAIC,EAAE,IAAI,CAAC,QAAQD,EAAIC,EAAE,UAAU,CAAC,OAAO,EAC9EO,EAAY,aAAc,IAAIR,EAAIC,EAAE,IAAI,CAAC,QAAQD,EAAIC,EAAE,SAAS,CAAC,OAAO,EAIxEO,EAAY,iBAAkB,SAASR,EAAIC,EAAE,IAAI,CAChD,QAAOD,EAAIC,EAAE,UAAU,CAAC,IAAID,EAAIC,EAAE,WAAW,CAAC,IAAK,EAAI,EACxDL,EAAA,sBAAgC,SAMhCY,EAAY,cAAe,SAASR,EAAIC,EAAE,WAAW,CAAC,cAE/BD,EAAIC,EAAE,WAAW,CAAC,QACf,EAE1BO,EAAY,mBAAoB,SAASR,EAAIC,EAAE,gBAAgB,CAAC,cAEpCD,EAAIC,EAAE,gBAAgB,CAAC,QACpB,EAG/BO,EAAY,OAAQ,iBAAiB,EAErCA,EAAY,OAAQ,2BAA2B,EAC/CA,EAAY,UAAW,6BAA6B,qCCvNpD,MAAMG,GAAc,OAAO,OAAO,CAAE,MAAO,EAAM,CAAA,EAC3CC,GAAY,OAAO,OAAO,CAAG,CAAA,EAC7BC,GAAeC,GACdA,EAID,OAAOA,GAAY,SACdH,GAGFG,EAPEF,GASX,IAAAG,GAAiBF,GCdjB,MAAMG,GAAU,WACVC,GAAqB,CAAC/hB,EAAGC,IAAM,CACnC,MAAM+hB,EAAOF,GAAQ,KAAK9hB,CAAC,EACrBiiB,EAAOH,GAAQ,KAAK7hB,CAAC,EAE3B,OAAI+hB,GAAQC,IACVjiB,EAAI,CAACA,EACLC,EAAI,CAACA,GAGAD,IAAMC,EAAI,EACZ+hB,GAAQ,CAACC,EAAQ,GACjBA,GAAQ,CAACD,EAAQ,EAClBhiB,EAAIC,EAAI,GACR,CACN,EAEMiiB,GAAsB,CAACliB,EAAGC,IAAM8hB,GAAmB9hB,EAAGD,CAAC,EAE7D,IAAAmiB,GAAiB,CACjB,mBAAEJ,GACA,oBAAAG,EACF,ECtBA,MAAM5B,GAAQE,GACR,CAAE,WAAAR,GAAY,iBAAAC,IAAqBQ,GACnC,CAAE,OAAQG,GAAIG,EAAAA,IAAMqB,GAEpBT,GAAeU,GACf,CAAE,mBAAAN,EAAkB,EAAKO,GAC/B,IAAAC,GAAA,MAAMC,EAAO,CACX,YAAaC,EAASb,EAAS,CAG7B,GAFAA,EAAUD,GAAaC,CAAO,EAE1Ba,aAAmBD,GAAQ,CAC7B,GAAIC,EAAQ,QAAU,CAAC,CAACb,EAAQ,OAC5Ba,EAAQ,oBAAsB,CAAC,CAACb,EAAQ,kBAC1C,OAAOa,EAEPA,EAAUA,EAAQ,OAE1B,SAAe,OAAOA,GAAY,SAC5B,MAAM,IAAI,UAAU,gDAAgD,OAAOA,CAAO,IAAI,EAGxF,GAAIA,EAAQ,OAASzC,GACnB,MAAM,IAAI,UACR,0BAA0BA,EAAU,aAC5C,EAGIM,GAAM,SAAUmC,EAASb,CAAO,EAChC,KAAK,QAAUA,EACf,KAAK,MAAQ,CAAC,CAACA,EAAQ,MAGvB,KAAK,kBAAoB,CAAC,CAACA,EAAQ,kBAEnC,MAAMc,EAAID,EAAQ,KAAI,EAAG,MAAMb,EAAQ,MAAQhB,GAAGG,GAAE,KAAK,EAAIH,GAAGG,GAAE,IAAI,CAAC,EAEvE,GAAI,CAAC2B,EACH,MAAM,IAAI,UAAU,oBAAoBD,CAAO,EAAE,EAUnD,GAPA,KAAK,IAAMA,EAGX,KAAK,MAAQ,CAACC,EAAE,CAAC,EACjB,KAAK,MAAQ,CAACA,EAAE,CAAC,EACjB,KAAK,MAAQ,CAACA,EAAE,CAAC,EAEb,KAAK,MAAQzC,IAAoB,KAAK,MAAQ,EAChD,MAAM,IAAI,UAAU,uBAAuB,EAG7C,GAAI,KAAK,MAAQA,IAAoB,KAAK,MAAQ,EAChD,MAAM,IAAI,UAAU,uBAAuB,EAG7C,GAAI,KAAK,MAAQA,IAAoB,KAAK,MAAQ,EAChD,MAAM,IAAI,UAAU,uBAAuB,EAIxCyC,EAAE,CAAC,EAGN,KAAK,WAAaA,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAKxqB,GAAO,CAC5C,GAAI,WAAW,KAAKA,CAAE,EAAG,CACvB,MAAMyqB,EAAM,CAACzqB,EACb,GAAIyqB,GAAO,GAAKA,EAAM1C,GACpB,OAAO0C,CAEnB,CACQ,OAAOzqB,CACR,CAAA,EAVD,KAAK,WAAa,CAAA,EAapB,KAAK,MAAQwqB,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,MAAM,GAAG,EAAI,CAAA,EACtC,KAAK,OAAM,CACf,CAEE,QAAU,CACR,YAAK,QAAU,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,GACpD,KAAK,WAAW,SAClB,KAAK,SAAW,IAAI,KAAK,WAAW,KAAK,GAAG,CAAC,IAExC,KAAK,OAChB,CAEE,UAAY,CACV,OAAO,KAAK,OAChB,CAEE,QAASE,EAAO,CAEd,GADAtC,GAAM,iBAAkB,KAAK,QAAS,KAAK,QAASsC,CAAK,EACrD,EAAEA,aAAiBJ,IAAS,CAC9B,GAAI,OAAOI,GAAU,UAAYA,IAAU,KAAK,QAC9C,MAAO,GAETA,EAAQ,IAAIJ,GAAOI,EAAO,KAAK,OAAO,CAC5C,CAEI,OAAIA,EAAM,UAAY,KAAK,QAClB,EAGF,KAAK,YAAYA,CAAK,GAAK,KAAK,WAAWA,CAAK,CAC3D,CAEE,YAAaA,EAAO,CAClB,OAAMA,aAAiBJ,KACrBI,EAAQ,IAAIJ,GAAOI,EAAO,KAAK,OAAO,GAItCb,GAAmB,KAAK,MAAOa,EAAM,KAAK,GAC1Cb,GAAmB,KAAK,MAAOa,EAAM,KAAK,GAC1Cb,GAAmB,KAAK,MAAOa,EAAM,KAAK,CAEhD,CAEE,WAAYA,EAAO,CAMjB,GALMA,aAAiBJ,KACrBI,EAAQ,IAAIJ,GAAOI,EAAO,KAAK,OAAO,GAIpC,KAAK,WAAW,QAAU,CAACA,EAAM,WAAW,OAC9C,MAAO,GACF,GAAI,CAAC,KAAK,WAAW,QAAUA,EAAM,WAAW,OACrD,MAAO,GACF,GAAI,CAAC,KAAK,WAAW,QAAU,CAACA,EAAM,WAAW,OACtD,MAAO,GAGT,IAAIhkB,EAAI,EACR,EAAG,CACD,MAAMoB,EAAI,KAAK,WAAWpB,CAAC,EACrBqB,EAAI2iB,EAAM,WAAWhkB,CAAC,EAE5B,GADA0hB,GAAM,qBAAsB1hB,EAAGoB,EAAGC,CAAC,EAC/BD,IAAM,QAAaC,IAAM,OAC3B,MAAO,GACF,GAAIA,IAAM,OACf,MAAO,GACF,GAAID,IAAM,OACf,MAAO,GACF,GAAIA,IAAMC,EACf,SAEA,OAAO8hB,GAAmB/hB,EAAGC,CAAC,CAEjC,OAAQ,EAAErB,EACf,CAEE,aAAcgkB,EAAO,CACbA,aAAiBJ,KACrBI,EAAQ,IAAIJ,GAAOI,EAAO,KAAK,OAAO,GAGxC,IAAIhkB,EAAI,EACR,EAAG,CACD,MAAMoB,EAAI,KAAK,MAAMpB,CAAC,EAChBqB,EAAI2iB,EAAM,MAAMhkB,CAAC,EAEvB,GADA0hB,GAAM,gBAAiB1hB,EAAGoB,EAAGC,CAAC,EAC1BD,IAAM,QAAaC,IAAM,OAC3B,MAAO,GACF,GAAIA,IAAM,OACf,MAAO,GACF,GAAID,IAAM,OACf,MAAO,GACF,GAAIA,IAAMC,EACf,SAEA,OAAO8hB,GAAmB/hB,EAAGC,CAAC,CAEjC,OAAQ,EAAErB,EACf,CAIE,IAAKikB,EAASC,EAAYC,EAAgB,CACxC,OAAQF,EAAO,CACb,IAAK,WACH,KAAK,WAAW,OAAS,EACzB,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,QACL,KAAK,IAAI,MAAOC,EAAYC,CAAc,EAC1C,MACF,IAAK,WACH,KAAK,WAAW,OAAS,EACzB,KAAK,MAAQ,EACb,KAAK,QACL,KAAK,IAAI,MAAOD,EAAYC,CAAc,EAC1C,MACF,IAAK,WAIH,KAAK,WAAW,OAAS,EACzB,KAAK,IAAI,QAASD,EAAYC,CAAc,EAC5C,KAAK,IAAI,MAAOD,EAAYC,CAAc,EAC1C,MAGF,IAAK,aACC,KAAK,WAAW,SAAW,GAC7B,KAAK,IAAI,QAASD,EAAYC,CAAc,EAE9C,KAAK,IAAI,MAAOD,EAAYC,CAAc,EAC1C,MAEF,IAAK,SAMD,KAAK,QAAU,GACf,KAAK,QAAU,GACf,KAAK,WAAW,SAAW,IAE3B,KAAK,QAEP,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,WAAa,CAAA,EAClB,MACF,IAAK,SAKC,KAAK,QAAU,GAAK,KAAK,WAAW,SAAW,IACjD,KAAK,QAEP,KAAK,MAAQ,EACb,KAAK,WAAa,CAAA,EAClB,MACF,IAAK,QAKC,KAAK,WAAW,SAAW,GAC7B,KAAK,QAEP,KAAK,WAAa,CAAA,EAClB,MAGF,IAAK,MAAO,CACV,MAAMC,EAAO,OAAOD,CAAc,EAAI,EAAI,EAE1C,GAAI,CAACD,GAAcC,IAAmB,GACpC,MAAM,IAAI,MAAM,iDAAiD,EAGnE,GAAI,KAAK,WAAW,SAAW,EAC7B,KAAK,WAAa,CAACC,CAAI,MAClB,CACL,IAAIpkB,EAAI,KAAK,WAAW,OACxB,KAAO,EAAEA,GAAK,GACR,OAAO,KAAK,WAAWA,CAAC,GAAM,WAChC,KAAK,WAAWA,CAAC,IACjBA,EAAI,IAGR,GAAIA,IAAM,GAAI,CAEZ,GAAIkkB,IAAe,KAAK,WAAW,KAAK,GAAG,GAAKC,IAAmB,GACjE,MAAM,IAAI,MAAM,uDAAuD,EAEzE,KAAK,WAAW,KAAKC,CAAI,CACrC,CACA,CACQ,GAAIF,EAAY,CAGd,IAAIG,EAAa,CAACH,EAAYE,CAAI,EAC9BD,IAAmB,KACrBE,EAAa,CAACH,CAAU,GAEtBf,GAAmB,KAAK,WAAW,CAAC,EAAGe,CAAU,IAAM,EACrD,MAAM,KAAK,WAAW,CAAC,CAAC,IAC1B,KAAK,WAAaG,GAGpB,KAAK,WAAaA,CAE9B,CACQ,KACR,CACM,QACE,MAAM,IAAI,MAAM,+BAA+BJ,CAAO,EAAE,CAChE,CACI,YAAK,IAAM,KAAK,OAAM,EAClB,KAAK,MAAM,SACb,KAAK,KAAO,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC,IAE/B,IACX,CACA,EAEA,IAAAK,EAAiBV,GC7SjB,MAAMA,GAAShC,EACT2C,GAAQ,CAACV,EAASb,EAASwB,EAAc,KAAU,CACvD,GAAIX,aAAmBD,GACrB,OAAOC,EAET,GAAI,CACF,OAAO,IAAID,GAAOC,EAASb,CAAO,CACnC,OAAQyB,EAAI,CACX,GAAI,CAACD,EACH,OAAO,KAET,MAAMC,CACV,CACA,EAEA,IAAAC,GAAiBH,GCfjB,MAAMA,GAAQ3C,GACR+C,GAAQ,CAACd,EAASb,IAAY,CAClC,MAAMtpB,EAAI6qB,GAAMV,EAASb,CAAO,EAChC,OAAOtpB,EAAIA,EAAE,QAAU,IACzB,EACA,IAAAkrB,GAAiBD,GCLjB,MAAMJ,GAAQ3C,GACRiD,GAAQ,CAAChB,EAASb,IAAY,CAClC,MAAMppB,EAAI2qB,GAAMV,EAAQ,KAAM,EAAC,QAAQ,SAAU,EAAE,EAAGb,CAAO,EAC7D,OAAOppB,EAAIA,EAAE,QAAU,IACzB,EACA,IAAAkrB,GAAiBD,GCLjB,MAAMjB,GAAShC,EAETmD,GAAM,CAAClB,EAASI,EAASjB,EAASkB,EAAYC,IAAmB,CACjE,OAAQnB,GAAa,WACvBmB,EAAiBD,EACjBA,EAAalB,EACbA,EAAU,QAGZ,GAAI,CACF,OAAO,IAAIY,GACTC,aAAmBD,GAASC,EAAQ,QAAUA,EAC9Cb,CACD,EAAC,IAAIiB,EAASC,EAAYC,CAAc,EAAE,OAC5C,MAAY,CACX,OAAO,IACX,CACA,EACA,IAAAa,GAAiBD,GClBjB,MAAMR,GAAQ3C,GAERqD,GAAO,CAACC,EAAUC,IAAa,CACnC,MAAMC,EAAKb,GAAMW,EAAU,KAAM,EAAI,EAC/BG,EAAKd,GAAMY,EAAU,KAAM,EAAI,EAC/BG,EAAaF,EAAG,QAAQC,CAAE,EAEhC,GAAIC,IAAe,EACjB,OAAO,KAGT,MAAMC,EAAWD,EAAa,EACxBE,EAAcD,EAAWH,EAAKC,EAC9BI,EAAaF,EAAWF,EAAKD,EAC7BM,EAAa,CAAC,CAACF,EAAY,WAAW,OAG5C,GAFkB,CAAC,CAACC,EAAW,WAAW,QAEzB,CAACC,EAQhB,MAAI,CAACD,EAAW,OAAS,CAACA,EAAW,MAC5B,QAKLD,EAAY,MAEP,QAGLA,EAAY,MAEP,QAIF,QAIT,MAAMtU,EAASwU,EAAa,MAAQ,GAEpC,OAAIN,EAAG,QAAUC,EAAG,MACXnU,EAAS,QAGdkU,EAAG,QAAUC,EAAG,MACXnU,EAAS,QAGdkU,EAAG,QAAUC,EAAG,MACXnU,EAAS,QAIX,YACT,EAEA,IAAAyU,GAAiBV,GChEjB,MAAMrB,GAAShC,EACTgE,GAAQ,CAACxkB,EAAGykB,IAAU,IAAIjC,GAAOxiB,EAAGykB,CAAK,EAAE,MACjD,IAAAC,GAAiBF,GCFjB,MAAMhC,GAAShC,EACTmE,GAAQ,CAAC3kB,EAAGykB,IAAU,IAAIjC,GAAOxiB,EAAGykB,CAAK,EAAE,MACjD,IAAAG,GAAiBD,GCFjB,MAAMnC,GAAShC,EACTqE,GAAQ,CAAC7kB,EAAGykB,IAAU,IAAIjC,GAAOxiB,EAAGykB,CAAK,EAAE,MACjD,IAAAK,GAAiBD,GCFjB,MAAM1B,GAAQ3C,GACRyC,GAAa,CAACR,EAASb,IAAY,CACvC,MAAMmD,EAAS5B,GAAMV,EAASb,CAAO,EACrC,OAAQmD,GAAUA,EAAO,WAAW,OAAUA,EAAO,WAAa,IACpE,EACA,IAAAC,GAAiB/B,GCLjB,MAAMT,GAAShC,EACTyE,GAAU,CAACjlB,EAAGC,EAAGwkB,IACrB,IAAIjC,GAAOxiB,EAAGykB,CAAK,EAAE,QAAQ,IAAIjC,GAAOviB,EAAGwkB,CAAK,CAAC,EAEnD,IAAAS,GAAiBD,GCJjB,MAAMA,GAAUzE,GACV2E,GAAW,CAACnlB,EAAGC,EAAGwkB,IAAUQ,GAAQhlB,EAAGD,EAAGykB,CAAK,EACrD,IAAAW,GAAiBD,GCFjB,MAAMF,GAAUzE,GACV6E,GAAe,CAACrlB,EAAGC,IAAMglB,GAAQjlB,EAAGC,EAAG,EAAI,EACjD,IAAAqlB,GAAiBD,GCFjB,MAAM7C,GAAShC,EACT+E,GAAe,CAACvlB,EAAGC,EAAGwkB,IAAU,CACpC,MAAMe,EAAW,IAAIhD,GAAOxiB,EAAGykB,CAAK,EAC9BgB,EAAW,IAAIjD,GAAOviB,EAAGwkB,CAAK,EACpC,OAAOe,EAAS,QAAQC,CAAQ,GAAKD,EAAS,aAAaC,CAAQ,CACrE,EACA,IAAAC,GAAiBH,GCNjB,MAAMA,GAAe/E,GACfmF,GAAO,CAACC,EAAMnB,IAAUmB,EAAK,KAAK,CAAC5lB,EAAGC,IAAMslB,GAAavlB,EAAGC,EAAGwkB,CAAK,CAAC,EAC3E,IAAAoB,GAAiBF,GCFjB,MAAMJ,GAAe/E,GACfsF,GAAQ,CAACF,EAAMnB,IAAUmB,EAAK,KAAK,CAAC5lB,EAAGC,IAAMslB,GAAatlB,EAAGD,EAAGykB,CAAK,CAAC,EAC5E,IAAAsB,GAAiBD,GCFjB,MAAMb,GAAUzE,GACVwF,GAAK,CAAChmB,EAAGC,EAAGwkB,IAAUQ,GAAQjlB,EAAGC,EAAGwkB,CAAK,EAAI,EACnD,IAAAwB,GAAiBD,GCFjB,MAAMf,GAAUzE,GACV0F,GAAK,CAAClmB,EAAGC,EAAGwkB,IAAUQ,GAAQjlB,EAAGC,EAAGwkB,CAAK,EAAI,EACnD,IAAA0B,GAAiBD,GCFjB,MAAMjB,GAAUzE,GACV4F,GAAK,CAACpmB,EAAGC,EAAGwkB,IAAUQ,GAAQjlB,EAAGC,EAAGwkB,CAAK,IAAM,EACrD,IAAA4B,GAAiBD,GCFjB,MAAMnB,GAAUzE,GACV8F,GAAM,CAACtmB,EAAGC,EAAGwkB,IAAUQ,GAAQjlB,EAAGC,EAAGwkB,CAAK,IAAM,EACtD,IAAA8B,GAAiBD,GCFjB,MAAMrB,GAAUzE,GACVgG,GAAM,CAACxmB,EAAGC,EAAGwkB,IAAUQ,GAAQjlB,EAAGC,EAAGwkB,CAAK,GAAK,EACrD,IAAAgC,GAAiBD,GCFjB,MAAMvB,GAAUzE,GACVkG,GAAM,CAAC1mB,EAAGC,EAAGwkB,IAAUQ,GAAQjlB,EAAGC,EAAGwkB,CAAK,GAAK,EACrD,IAAAkC,GAAiBD,GCFjB,MAAMN,GAAK5F,GACL8F,GAAM7F,GACNuF,GAAK5D,GACLoE,GAAMnE,GACN6D,GAAK5D,GACLoE,GAAME,GAENC,GAAM,CAAC7mB,EAAG8W,EAAI7W,EAAGwkB,IAAU,CAC/B,OAAQ3N,EAAE,CACR,IAAK,MACH,OAAI,OAAO9W,GAAM,WACfA,EAAIA,EAAE,SAEJ,OAAOC,GAAM,WACfA,EAAIA,EAAE,SAEDD,IAAMC,EAEf,IAAK,MACH,OAAI,OAAOD,GAAM,WACfA,EAAIA,EAAE,SAEJ,OAAOC,GAAM,WACfA,EAAIA,EAAE,SAEDD,IAAMC,EAEf,IAAK,GACL,IAAK,IACL,IAAK,KACH,OAAOmmB,GAAGpmB,EAAGC,EAAGwkB,CAAK,EAEvB,IAAK,KACH,OAAO6B,GAAItmB,EAAGC,EAAGwkB,CAAK,EAExB,IAAK,IACH,OAAOuB,GAAGhmB,EAAGC,EAAGwkB,CAAK,EAEvB,IAAK,KACH,OAAO+B,GAAIxmB,EAAGC,EAAGwkB,CAAK,EAExB,IAAK,IACH,OAAOyB,GAAGlmB,EAAGC,EAAGwkB,CAAK,EAEvB,IAAK,KACH,OAAOiC,GAAI1mB,EAAGC,EAAGwkB,CAAK,EAExB,QACE,MAAM,IAAI,UAAU,qBAAqB3N,CAAE,EAAE,CACnD,CACA,EACA,IAAAgQ,GAAiBD,GCnDjB,MAAMrE,GAAShC,EACT2C,GAAQ1C,GACR,CAAE,OAAQG,GAAI,EAAAG,IAAMqB,GAEpB2E,GAAS,CAACtE,EAASb,IAAY,CACnC,GAAIa,aAAmBD,GACrB,OAAOC,EAOT,GAJI,OAAOA,GAAY,WACrBA,EAAU,OAAOA,CAAO,GAGtB,OAAOA,GAAY,SACrB,OAAO,KAGTb,EAAUA,GAAW,CAAA,EAErB,IAAItmB,EAAQ,KACZ,GAAI,CAACsmB,EAAQ,IACXtmB,EAAQmnB,EAAQ,MAAMb,EAAQ,kBAAoBhB,GAAGG,GAAE,UAAU,EAAIH,GAAGG,GAAE,MAAM,CAAC,MAC5E,CAUL,MAAMiG,EAAiBpF,EAAQ,kBAAoBhB,GAAGG,GAAE,aAAa,EAAIH,GAAGG,GAAE,SAAS,EACvF,IAAIkG,EACJ,MAAQA,EAAOD,EAAe,KAAKvE,CAAO,KACrC,CAACnnB,GAASA,EAAM,MAAQA,EAAM,CAAC,EAAE,SAAWmnB,EAAQ,UAEnD,CAACnnB,GACC2rB,EAAK,MAAQA,EAAK,CAAC,EAAE,SAAW3rB,EAAM,MAAQA,EAAM,CAAC,EAAE,UAC3DA,EAAQ2rB,GAEVD,EAAe,UAAYC,EAAK,MAAQA,EAAK,CAAC,EAAE,OAASA,EAAK,CAAC,EAAE,OAGnED,EAAe,UAAY,EAC/B,CAEE,GAAI1rB,IAAU,KACZ,OAAO,KAGT,MAAMkpB,EAAQlpB,EAAM,CAAC,EACfqpB,EAAQrpB,EAAM,CAAC,GAAK,IACpBupB,EAAQvpB,EAAM,CAAC,GAAK,IACpB2nB,EAAarB,EAAQ,mBAAqBtmB,EAAM,CAAC,EAAI,IAAIA,EAAM,CAAC,CAAC,GAAK,GACtE4rB,EAAQtF,EAAQ,mBAAqBtmB,EAAM,CAAC,EAAI,IAAIA,EAAM,CAAC,CAAC,GAAK,GAEvE,OAAO6nB,GAAM,GAAGqB,CAAK,IAAIG,CAAK,IAAIE,CAAK,GAAG5B,CAAU,GAAGiE,CAAK,GAAItF,CAAO,CACzE,EACA,IAAAuF,GAAiBJ,GC3DjB,MAAMK,EAAS,CACb,aAAe,CACb,KAAK,IAAM,IACX,KAAK,IAAM,IAAI,GACnB,CAEE,IAAK/rB,EAAK,CACR,MAAM2L,EAAQ,KAAK,IAAI,IAAI3L,CAAG,EAC9B,GAAI2L,IAAU,OAIZ,YAAK,IAAI,OAAO3L,CAAG,EACnB,KAAK,IAAI,IAAIA,EAAK2L,CAAK,EAChBA,CAEb,CAEE,OAAQ3L,EAAK,CACX,OAAO,KAAK,IAAI,OAAOA,CAAG,CAC9B,CAEE,IAAKA,EAAK2L,EAAO,CAGf,GAAI,CAFY,KAAK,OAAO3L,CAAG,GAEf2L,IAAU,OAAW,CAEnC,GAAI,KAAK,IAAI,MAAQ,KAAK,IAAK,CAC7B,MAAMqgB,EAAW,KAAK,IAAI,KAAM,EAAC,KAAI,EAAG,MACxC,KAAK,OAAOA,CAAQ,CAC5B,CAEM,KAAK,IAAI,IAAIhsB,EAAK2L,CAAK,CAC7B,CAEI,OAAO,IACX,CACA,CAEA,IAAAsgB,GAAiBF,4CCvCjB,MAAMG,EAAmB,OAGzB,MAAMC,CAAM,CACV,YAAaC,EAAO7F,EAAS,CAG3B,GAFAA,EAAUD,EAAaC,CAAO,EAE1B6F,aAAiBD,EACnB,OACEC,EAAM,QAAU,CAAC,CAAC7F,EAAQ,OAC1B6F,EAAM,oBAAsB,CAAC,CAAC7F,EAAQ,kBAE/B6F,EAEA,IAAID,EAAMC,EAAM,IAAK7F,CAAO,EAIvC,GAAI6F,aAAiBC,EAEnB,YAAK,IAAMD,EAAM,MACjB,KAAK,IAAM,CAAC,CAACA,CAAK,CAAC,EACnB,KAAK,UAAY,OACV,KAsBT,GAnBA,KAAK,QAAU7F,EACf,KAAK,MAAQ,CAAC,CAACA,EAAQ,MACvB,KAAK,kBAAoB,CAAC,CAACA,EAAQ,kBAKnC,KAAK,IAAM6F,EAAM,KAAI,EAAG,QAAQF,EAAkB,GAAG,EAGrD,KAAK,IAAM,KAAK,IACb,MAAM,IAAI,EAEV,IAAIxiB,GAAK,KAAK,WAAWA,EAAE,KAAI,CAAE,CAAC,EAIlC,OAAOgQ,GAAKA,EAAE,MAAM,EAEnB,CAAC,KAAK,IAAI,OACZ,MAAM,IAAI,UAAU,yBAAyB,KAAK,GAAG,EAAE,EAIzD,GAAI,KAAK,IAAI,OAAS,EAAG,CAEvB,MAAM4S,EAAQ,KAAK,IAAI,CAAC,EAExB,GADA,KAAK,IAAM,KAAK,IAAI,OAAO5S,GAAK,CAAC6S,EAAU7S,EAAE,CAAC,CAAC,CAAC,EAC5C,KAAK,IAAI,SAAW,EACtB,KAAK,IAAM,CAAC4S,CAAK,UACR,KAAK,IAAI,OAAS,GAE3B,UAAW5S,KAAK,KAAK,IACnB,GAAIA,EAAE,SAAW,GAAK8S,EAAM9S,EAAE,CAAC,CAAC,EAAG,CACjC,KAAK,IAAM,CAACA,CAAC,EACb,QAMR,KAAK,UAAY,OAGnB,IAAI,OAAS,CACX,GAAI,KAAK,YAAc,OAAW,CAChC,KAAK,UAAY,GACjB,QAASnW,EAAI,EAAGA,EAAI,KAAK,IAAI,OAAQA,IAAK,CACpCA,EAAI,IACN,KAAK,WAAa,MAEpB,MAAMkpB,EAAQ,KAAK,IAAIlpB,CAAC,EACxB,QAASoU,EAAI,EAAGA,EAAI8U,EAAM,OAAQ9U,IAC5BA,EAAI,IACN,KAAK,WAAa,KAEpB,KAAK,WAAa8U,EAAM9U,CAAC,EAAE,SAAU,EAAC,KAAI,GAIhD,OAAO,KAAK,UAGd,QAAU,CACR,OAAO,KAAK,MAGd,UAAY,CACV,OAAO,KAAK,MAGd,WAAYyU,EAAO,CAMjB,MAAMM,IAFH,KAAK,QAAQ,mBAAqBC,IAClC,KAAK,QAAQ,OAASC,IACE,IAAMR,EAC3B9gB,EAASuhB,EAAM,IAAIH,CAAO,EAChC,GAAIphB,EACF,OAAOA,EAGT,MAAM8d,EAAQ,KAAK,QAAQ,MAErB0D,EAAK1D,EAAQ7D,EAAGG,EAAE,gBAAgB,EAAIH,EAAGG,EAAE,WAAW,EAC5D0G,EAAQA,EAAM,QAAQU,EAAIC,EAAc,KAAK,QAAQ,iBAAiB,CAAC,EACvE9H,EAAM,iBAAkBmH,CAAK,EAG7BA,EAAQA,EAAM,QAAQ7G,EAAGG,EAAE,cAAc,EAAGsH,CAAqB,EACjE/H,EAAM,kBAAmBmH,CAAK,EAG9BA,EAAQA,EAAM,QAAQ7G,EAAGG,EAAE,SAAS,EAAGuH,CAAgB,EACvDhI,EAAM,aAAcmH,CAAK,EAGzBA,EAAQA,EAAM,QAAQ7G,EAAGG,EAAE,SAAS,EAAGwH,CAAgB,EACvDjI,EAAM,aAAcmH,CAAK,EAKzB,IAAIe,EAAYf,EACb,MAAM,GAAG,EACT,IAAIgB,GAAQC,EAAgBD,EAAM,KAAK,OAAO,CAAC,EAC/C,KAAK,GAAG,EACR,MAAM,KAAK,EAEX,IAAIA,GAAQE,EAAYF,EAAM,KAAK,OAAO,CAAC,EAE1ChE,IAEF+D,EAAYA,EAAU,OAAOC,IAC3BnI,EAAM,uBAAwBmI,EAAM,KAAK,OAAO,EACzC,CAAC,CAACA,EAAK,MAAM7H,EAAGG,EAAE,eAAe,CAAC,EAC1C,GAEHT,EAAM,aAAckI,CAAS,EAK7B,MAAMI,EAAW,IAAI,IACfC,EAAcL,EAAU,IAAIC,GAAQ,IAAIf,EAAWe,EAAM,KAAK,OAAO,CAAC,EAC5E,UAAWA,KAAQI,EAAa,CAC9B,GAAIjB,EAAUa,CAAI,EAChB,MAAO,CAACA,CAAI,EAEdG,EAAS,IAAIH,EAAK,MAAOA,CAAI,EAE3BG,EAAS,KAAO,GAAKA,EAAS,IAAI,EAAE,GACtCA,EAAS,OAAO,EAAE,EAGpB,MAAMnxB,EAAS,CAAC,GAAGmxB,EAAS,OAAQ,CAAA,EACpC,OAAAV,EAAM,IAAIH,EAAStwB,CAAM,EAClBA,EAGT,WAAYgwB,EAAO7F,EAAS,CAC1B,GAAI,EAAE6F,aAAiBD,GACrB,MAAM,IAAI,UAAU,qBAAqB,EAG3C,OAAO,KAAK,IAAI,KAAMsB,GAElBC,EAAcD,EAAiBlH,CAAO,GACtC6F,EAAM,IAAI,KAAMuB,GAEZD,EAAcC,EAAkBpH,CAAO,GACvCkH,EAAgB,MAAOG,GACdD,EAAiB,MAAOE,GACtBD,EAAe,WAAWC,EAAiBtH,CAAO,CAC1D,CACF,CAEJ,CAEJ,EAIH,KAAMa,EAAS,CACb,GAAI,CAACA,EACH,MAAO,GAGT,GAAI,OAAOA,GAAY,SACrB,GAAI,CACFA,EAAU,IAAID,EAAOC,EAAS,KAAK,OAAO,CAC3C,MAAY,CACX,MAAO,GAIX,QAAS7jB,EAAI,EAAGA,EAAI,KAAK,IAAI,OAAQA,IACnC,GAAIuqB,GAAQ,KAAK,IAAIvqB,CAAC,EAAG6jB,EAAS,KAAK,OAAO,EAC5C,MAAO,GAGX,MAAO,IAIXgF,GAAiBD,EAEjB,MAAM4B,EAAM5I,GACN0H,EAAQ,IAAIkB,EAEZzH,EAAelB,GACfiH,EAAatF,GAAuB,EACpC9B,EAAQ+B,GACRG,EAASF,EACT,CACJ,OAAQ1B,EACR,EAAAG,EACA,sBAAAsH,EACA,iBAAAC,EACA,iBAAAC,CACF,EAAI3B,GACE,CAAE,wBAAAoB,EAAyB,WAAAC,GAAeoB,GAE1CzB,EAAY7S,GAAKA,EAAE,QAAU,WAC7B8S,EAAQ9S,GAAKA,EAAE,QAAU,GAIzBgU,EAAgB,CAACF,EAAajH,IAAY,CAC9C,IAAInqB,EAAS,GACb,MAAM6xB,EAAuBT,EAAY,MAAK,EAC9C,IAAIU,EAAiBD,EAAqB,IAAG,EAE7C,KAAO7xB,GAAU6xB,EAAqB,QACpC7xB,EAAS6xB,EAAqB,MAAOE,GAC5BD,EAAe,WAAWC,EAAiB5H,CAAO,CAC1D,EAED2H,EAAiBD,EAAqB,IAAG,EAG3C,OAAO7xB,GAMHixB,EAAkB,CAACD,EAAM7G,KAC7BtB,EAAM,OAAQmI,EAAM7G,CAAO,EAC3B6G,EAAOgB,EAAchB,EAAM7G,CAAO,EAClCtB,EAAM,QAASmI,CAAI,EACnBA,EAAOiB,GAAcjB,EAAM7G,CAAO,EAClCtB,EAAM,SAAUmI,CAAI,EACpBA,EAAOkB,GAAelB,EAAM7G,CAAO,EACnCtB,EAAM,SAAUmI,CAAI,EACpBA,EAAOmB,EAAanB,EAAM7G,CAAO,EACjCtB,EAAM,QAASmI,CAAI,EACZA,GAGHoB,EAAM3xB,GAAM,CAACA,GAAMA,EAAG,YAAa,IAAK,KAAOA,IAAO,IAStDwxB,GAAgB,CAACjB,EAAM7G,IACpB6G,EACJ,KAAI,EACJ,MAAM,KAAK,EACX,IAAK1T,GAAM+U,GAAa/U,EAAG6M,CAAO,CAAC,EACnC,KAAK,GAAG,EAGPkI,GAAe,CAACrB,EAAM7G,IAAY,CACtC,MAAM7c,EAAI6c,EAAQ,MAAQhB,EAAGG,EAAE,UAAU,EAAIH,EAAGG,EAAE,KAAK,EACvD,OAAO0H,EAAK,QAAQ1jB,EAAG,CAACwa,EAAGwK,EAAGrH,EAAGrlB,EAAG2sB,IAAO,CACzC1J,EAAM,QAASmI,EAAMlJ,EAAGwK,EAAGrH,EAAGrlB,EAAG2sB,CAAE,EACnC,IAAIhM,EAEJ,OAAI6L,EAAIE,CAAC,EACP/L,EAAM,GACG6L,EAAInH,CAAC,EACd1E,EAAM,KAAK+L,CAAC,SAAS,CAACA,EAAI,CAAC,SAClBF,EAAIxsB,CAAC,EAEd2gB,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,OAAOqH,CAAC,IAAI,CAACrH,EAAI,CAAC,OAC1BsH,GACT1J,EAAM,kBAAmB0J,CAAE,EAC3BhM,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,CAAC,IAAI2sB,CACzB,KAAID,CAAC,IAAI,CAACrH,EAAI,CAAC,QAGhB1E,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,CACpB,KAAI0sB,CAAC,IAAI,CAACrH,EAAI,CAAC,OAGlBpC,EAAM,eAAgBtC,CAAG,EAClBA,CACR,CAAA,GAWGyL,EAAgB,CAAChB,EAAM7G,IACpB6G,EACJ,KAAI,EACJ,MAAM,KAAK,EACX,IAAK1T,GAAMkV,EAAalV,EAAG6M,CAAO,CAAC,EACnC,KAAK,GAAG,EAGPqI,EAAe,CAACxB,EAAM7G,IAAY,CACtCtB,EAAM,QAASmI,EAAM7G,CAAO,EAC5B,MAAM7c,EAAI6c,EAAQ,MAAQhB,EAAGG,EAAE,UAAU,EAAIH,EAAGG,EAAE,KAAK,EACjDmJ,EAAItI,EAAQ,kBAAoB,KAAO,GAC7C,OAAO6G,EAAK,QAAQ1jB,EAAG,CAACwa,EAAGwK,EAAGrH,EAAGrlB,EAAG2sB,IAAO,CACzC1J,EAAM,QAASmI,EAAMlJ,EAAGwK,EAAGrH,EAAGrlB,EAAG2sB,CAAE,EACnC,IAAIhM,EAEJ,OAAI6L,EAAIE,CAAC,EACP/L,EAAM,GACG6L,EAAInH,CAAC,EACd1E,EAAM,KAAK+L,CAAC,OAAOG,CAAC,KAAK,CAACH,EAAI,CAAC,SACtBF,EAAIxsB,CAAC,EACV0sB,IAAM,IACR/L,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,KAAKwH,CAAC,KAAKH,CAAC,IAAI,CAACrH,EAAI,CAAC,OAEvC1E,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,KAAKwH,CAAC,KAAK,CAACH,EAAI,CAAC,SAE3BC,GACT1J,EAAM,kBAAmB0J,CAAE,EACvBD,IAAM,IACJrH,IAAM,IACR1E,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,CAAC,IAAI2sB,CACpC,KAAeD,CAAC,IAAIrH,CAAC,IAAI,CAACrlB,EAAI,CAAC,KAErB2gB,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,CAAC,IAAI2sB,CACzB,KAAID,CAAC,IAAI,CAACrH,EAAI,CAAC,OAGlB1E,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,CAAC,IAAI2sB,MACrB,CAACD,EAAI,CAAC,WAGbzJ,EAAM,OAAO,EACTyJ,IAAM,IACJrH,IAAM,IACR1E,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,CAC/B,GAAa6sB,CAAC,KAAKH,CAAC,IAAIrH,CAAC,IAAI,CAACrlB,EAAI,CAAC,KAEzB2gB,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,CAC/B,GAAa6sB,CAAC,KAAKH,CAAC,IAAI,CAACrH,EAAI,CAAC,OAGtB1E,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,IAAIrlB,MAChB,CAAC0sB,EAAI,CAAC,UAIfzJ,EAAM,eAAgBtC,CAAG,EAClBA,CACR,CAAA,GAGG2L,GAAiB,CAAClB,EAAM7G,KAC5BtB,EAAM,iBAAkBmI,EAAM7G,CAAO,EAC9B6G,EACJ,MAAM,KAAK,EACX,IAAK1T,GAAMoV,EAAcpV,EAAG6M,CAAO,CAAC,EACpC,KAAK,GAAG,GAGPuI,EAAgB,CAAC1B,EAAM7G,IAAY,CACvC6G,EAAOA,EAAK,KAAI,EAChB,MAAM1jB,EAAI6c,EAAQ,MAAQhB,EAAGG,EAAE,WAAW,EAAIH,EAAGG,EAAE,MAAM,EACzD,OAAO0H,EAAK,QAAQ1jB,EAAG,CAACiZ,EAAKoM,EAAML,EAAGrH,EAAGrlB,EAAG2sB,IAAO,CACjD1J,EAAM,SAAUmI,EAAMzK,EAAKoM,EAAML,EAAGrH,EAAGrlB,EAAG2sB,CAAE,EAC5C,MAAMK,EAAKR,EAAIE,CAAC,EACVO,EAAKD,GAAMR,EAAInH,CAAC,EAChB6H,EAAKD,GAAMT,EAAIxsB,CAAC,EAChBmtB,GAAOD,EAEb,OAAIH,IAAS,KAAOI,KAClBJ,EAAO,IAKTJ,EAAKpI,EAAQ,kBAAoB,KAAO,GAEpCyI,EACED,IAAS,KAAOA,IAAS,IAE3BpM,EAAM,WAGNA,EAAM,IAECoM,GAAQI,IAGbF,IACF5H,EAAI,GAENrlB,EAAI,EAEA+sB,IAAS,KAGXA,EAAO,KACHE,GACFP,EAAI,CAACA,EAAI,EACTrH,EAAI,EACJrlB,EAAI,IAEJqlB,EAAI,CAACA,EAAI,EACTrlB,EAAI,IAEG+sB,IAAS,OAGlBA,EAAO,IACHE,EACFP,EAAI,CAACA,EAAI,EAETrH,EAAI,CAACA,EAAI,GAIT0H,IAAS,MACXJ,EAAK,MAGPhM,EAAM,GAAGoM,EAAOL,CAAC,IAAIrH,CAAC,IAAIrlB,CAAC,GAAG2sB,CAAE,IACvBM,EACTtM,EAAM,KAAK+L,CAAC,OAAOC,CAAE,KAAK,CAACD,EAAI,CAAC,SACvBQ,IACTvM,EAAM,KAAK+L,CAAC,IAAIrH,CAAC,KAAKsH,CACrB,KAAID,CAAC,IAAI,CAACrH,EAAI,CAAC,QAGlBpC,EAAM,gBAAiBtC,CAAG,EAEnBA,CACR,CAAA,GAKG4L,EAAe,CAACnB,EAAM7G,KAC1BtB,EAAM,eAAgBmI,EAAM7G,CAAO,EAE5B6G,EACJ,KAAI,EACJ,QAAQ7H,EAAGG,EAAE,IAAI,EAAG,EAAE,GAGrB4H,EAAc,CAACF,EAAM7G,KACzBtB,EAAM,cAAemI,EAAM7G,CAAO,EAC3B6G,EACJ,KAAI,EACJ,QAAQ7H,EAAGgB,EAAQ,kBAAoBb,EAAE,QAAUA,EAAE,IAAI,EAAG,EAAE,GAS7DqH,EAAgBqC,GAAS,CAACC,EAC9BC,EAAMC,EAAIC,EAAIC,EAAIC,EAAKC,EACvBC,EAAIC,EAAIC,EAAIC,EAAIC,MACZxB,EAAIe,CAAE,EACRD,EAAO,GACEd,EAAIgB,CAAE,EACfF,EAAO,KAAKC,CAAE,OAAOH,EAAQ,KAAO,EAAE,GAC7BZ,EAAIiB,CAAE,EACfH,EAAO,KAAKC,CAAE,IAAIC,CAAE,KAAKJ,EAAQ,KAAO,EAAE,GACjCM,EACTJ,EAAO,KAAKA,CAAI,GAEhBA,EAAO,KAAKA,CAAI,GAAGF,EAAQ,KAAO,EAAE,GAGlCZ,EAAIqB,CAAE,EACRD,EAAK,GACIpB,EAAIsB,CAAE,EACfF,EAAK,IAAI,CAACC,EAAK,CAAC,SACPrB,EAAIuB,CAAE,EACfH,EAAK,IAAIC,CAAE,IAAI,CAACC,EAAK,CAAC,OACbE,GACTJ,EAAK,KAAKC,CAAE,IAAIC,CAAE,IAAIC,CAAE,IAAIC,EAAG,GACtBZ,EACTQ,EAAK,IAAIC,CAAE,IAAIC,CAAE,IAAI,CAACC,EAAK,CAAC,KAE5BH,EAAK,KAAKA,CAAE,GAGP,GAAGN,CAAI,IAAIM,CAAE,GAAG,KAAI,GAGvB9B,GAAU,CAACmC,EAAK7I,EAASb,IAAY,CACzC,QAAShjB,EAAI,EAAGA,EAAI0sB,EAAI,OAAQ1sB,IAC9B,GAAI,CAAC0sB,EAAI1sB,CAAC,EAAE,KAAK6jB,CAAO,EACtB,MAAO,GAIX,GAAIA,EAAQ,WAAW,QAAU,CAACb,EAAQ,kBAAmB,CAM3D,QAAShjB,EAAI,EAAGA,EAAI0sB,EAAI,OAAQ1sB,IAE9B,GADA0hB,EAAMgL,EAAI1sB,CAAC,EAAE,MAAM,EACf0sB,EAAI1sB,CAAC,EAAE,SAAW8oB,EAAW,KAI7B4D,EAAI1sB,CAAC,EAAE,OAAO,WAAW,OAAS,EAAG,CACvC,MAAMsF,EAAUonB,EAAI1sB,CAAC,EAAE,OACvB,GAAIsF,EAAQ,QAAUue,EAAQ,OAC1Bve,EAAQ,QAAUue,EAAQ,OAC1Bve,EAAQ,QAAUue,EAAQ,MAC5B,MAAO,GAMb,MAAO,GAGT,MAAO,EACT,yDCziBA,MAAM8I,EAAM,OAAO,YAAY,EAE/B,MAAM7D,CAAW,CACf,WAAW,KAAO,CAChB,OAAO6D,EAGT,YAAa9C,EAAM7G,EAAS,CAG1B,GAFAA,EAAUD,EAAaC,CAAO,EAE1B6G,aAAgBf,EAAY,CAC9B,GAAIe,EAAK,QAAU,CAAC,CAAC7G,EAAQ,MAC3B,OAAO6G,EAEPA,EAAOA,EAAK,MAIhBA,EAAOA,EAAK,KAAM,EAAC,MAAM,KAAK,EAAE,KAAK,GAAG,EACxCnI,EAAM,aAAcmI,EAAM7G,CAAO,EACjC,KAAK,QAAUA,EACf,KAAK,MAAQ,CAAC,CAACA,EAAQ,MACvB,KAAK,MAAM6G,CAAI,EAEX,KAAK,SAAW8C,EAClB,KAAK,MAAQ,GAEb,KAAK,MAAQ,KAAK,SAAW,KAAK,OAAO,QAG3CjL,EAAM,OAAQ,IAAI,EAGpB,MAAOmI,EAAM,CACX,MAAM1jB,EAAI,KAAK,QAAQ,MAAQ6b,EAAGG,EAAE,eAAe,EAAIH,EAAGG,EAAE,UAAU,EAChE2B,EAAI+F,EAAK,MAAM1jB,CAAC,EAEtB,GAAI,CAAC2d,EACH,MAAM,IAAI,UAAU,uBAAuB+F,CAAI,EAAE,EAGnD,KAAK,SAAW/F,EAAE,CAAC,IAAM,OAAYA,EAAE,CAAC,EAAI,GACxC,KAAK,WAAa,MACpB,KAAK,SAAW,IAIbA,EAAE,CAAC,EAGN,KAAK,OAAS,IAAIF,EAAOE,EAAE,CAAC,EAAG,KAAK,QAAQ,KAAK,EAFjD,KAAK,OAAS6I,EAMlB,UAAY,CACV,OAAO,KAAK,MAGd,KAAM9I,EAAS,CAGb,GAFAnC,EAAM,kBAAmBmC,EAAS,KAAK,QAAQ,KAAK,EAEhD,KAAK,SAAW8I,GAAO9I,IAAY8I,EACrC,MAAO,GAGT,GAAI,OAAO9I,GAAY,SACrB,GAAI,CACFA,EAAU,IAAID,EAAOC,EAAS,KAAK,OAAO,CAC3C,MAAY,CACX,MAAO,GAIX,OAAOoE,EAAIpE,EAAS,KAAK,SAAU,KAAK,OAAQ,KAAK,OAAO,EAG9D,WAAYgG,EAAM7G,EAAS,CACzB,GAAI,EAAE6G,aAAgBf,GACpB,MAAM,IAAI,UAAU,0BAA0B,EAGhD,OAAI,KAAK,WAAa,GAChB,KAAK,QAAU,GACV,GAEF,IAAIF,EAAMiB,EAAK,MAAO7G,CAAO,EAAE,KAAK,KAAK,KAAK,EAC5C6G,EAAK,WAAa,GACvBA,EAAK,QAAU,GACV,GAEF,IAAIjB,EAAM,KAAK,MAAO5F,CAAO,EAAE,KAAK6G,EAAK,MAAM,GAGxD7G,EAAUD,EAAaC,CAAO,EAG1BA,EAAQ,oBACT,KAAK,QAAU,YAAc6G,EAAK,QAAU,aAG3C,CAAC7G,EAAQ,oBACV,KAAK,MAAM,WAAW,QAAQ,GAAK6G,EAAK,MAAM,WAAW,QAAQ,GAC3D,GAIL,QAAK,SAAS,WAAW,GAAG,GAAKA,EAAK,SAAS,WAAW,GAAG,GAI7D,KAAK,SAAS,WAAW,GAAG,GAAKA,EAAK,SAAS,WAAW,GAAG,GAK9D,KAAK,OAAO,UAAYA,EAAK,OAAO,SACrC,KAAK,SAAS,SAAS,GAAG,GAAKA,EAAK,SAAS,SAAS,GAAG,GAIvD5B,EAAI,KAAK,OAAQ,IAAK4B,EAAK,OAAQ7G,CAAO,GAC5C,KAAK,SAAS,WAAW,GAAG,GAAK6G,EAAK,SAAS,WAAW,GAAG,GAI3D5B,EAAI,KAAK,OAAQ,IAAK4B,EAAK,OAAQ7G,CAAO,GAC5C,KAAK,SAAS,WAAW,GAAG,GAAK6G,EAAK,SAAS,WAAW,GAAG,KAOnE+C,GAAiB9D,EAEjB,MAAM/F,EAAenB,GACf,CAAE,OAAQI,EAAI,EAAAG,GAAMN,GACpBoG,EAAMzE,GACN9B,EAAQ+B,GACRG,EAASF,EACTkF,EAAQZ,GAAA,YC5Id,MAAMY,GAAQhH,GAA2B,EACnCiL,GAAY,CAAChJ,EAASgF,EAAO7F,IAAY,CAC7C,GAAI,CACF6F,EAAQ,IAAID,GAAMC,EAAO7F,CAAO,CACjC,MAAY,CACX,MAAO,EACX,CACE,OAAO6F,EAAM,KAAKhF,CAAO,CAC3B,EACA,IAAAiJ,GAAiBD,GCTjB,MAAMjE,GAAQhH,GAA2B,EAGnCmL,GAAgB,CAAClE,EAAO7F,IAC5B,IAAI4F,GAAMC,EAAO7F,CAAO,EAAE,IACvB,IAAI6G,GAAQA,EAAK,IAAI1T,GAAKA,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,KAAI,EAAG,MAAM,GAAG,CAAC,EAEnE,IAAA6W,GAAiBD,GCPjB,MAAMnJ,GAAShC,EACTgH,GAAQ/G,GAA2B,EAEnCoL,GAAgB,CAACC,EAAUrE,EAAO7F,IAAY,CAClD,IAAIP,EAAM,KACN0K,EAAQ,KACRC,EAAW,KACf,GAAI,CACFA,EAAW,IAAIxE,GAAMC,EAAO7F,CAAO,CACpC,MAAY,CACX,OAAO,IACX,CACE,OAAAkK,EAAS,QAASxzB,GAAM,CAClB0zB,EAAS,KAAK1zB,CAAC,IAEb,CAAC+oB,GAAO0K,EAAM,QAAQzzB,CAAC,IAAM,MAE/B+oB,EAAM/oB,EACNyzB,EAAQ,IAAIvJ,GAAOnB,EAAKO,CAAO,EAGpC,CAAA,EACMP,CACT,EACA,IAAA4K,GAAiBJ,GCxBjB,MAAMrJ,GAAShC,EACTgH,GAAQ/G,GAA2B,EACnCyL,GAAgB,CAACJ,EAAUrE,EAAO7F,IAAY,CAClD,IAAIuK,EAAM,KACNC,EAAQ,KACRJ,EAAW,KACf,GAAI,CACFA,EAAW,IAAIxE,GAAMC,EAAO7F,CAAO,CACpC,MAAY,CACX,OAAO,IACX,CACE,OAAAkK,EAAS,QAASxzB,GAAM,CAClB0zB,EAAS,KAAK1zB,CAAC,IAEb,CAAC6zB,GAAOC,EAAM,QAAQ9zB,CAAC,IAAM,KAE/B6zB,EAAM7zB,EACN8zB,EAAQ,IAAI5J,GAAO2J,EAAKvK,CAAO,EAGpC,CAAA,EACMuK,CACT,EACA,IAAAE,GAAiBH,GCvBjB,MAAM1J,GAAShC,EACTgH,GAAQ/G,GAA2B,EACnCuF,GAAK5D,GAELkK,GAAa,CAAC7E,EAAOhD,IAAU,CACnCgD,EAAQ,IAAID,GAAMC,EAAOhD,CAAK,EAE9B,IAAI8H,EAAS,IAAI/J,GAAO,OAAO,EAM/B,GALIiF,EAAM,KAAK8E,CAAM,IAIrBA,EAAS,IAAI/J,GAAO,SAAS,EACzBiF,EAAM,KAAK8E,CAAM,GACnB,OAAOA,EAGTA,EAAS,KACT,QAAS3tB,EAAI,EAAGA,EAAI6oB,EAAM,IAAI,OAAQ,EAAE7oB,EAAG,CACzC,MAAMiqB,EAAcpB,EAAM,IAAI7oB,CAAC,EAE/B,IAAI4tB,EAAS,KACb3D,EAAY,QAAS2C,GAAe,CAElC,MAAMiB,EAAU,IAAIjK,GAAOgJ,EAAW,OAAO,OAAO,EACpD,OAAQA,EAAW,SAAQ,CACzB,IAAK,IACCiB,EAAQ,WAAW,SAAW,EAChCA,EAAQ,QAERA,EAAQ,WAAW,KAAK,CAAC,EAE3BA,EAAQ,IAAMA,EAAQ,OAAM,EAE9B,IAAK,GACL,IAAK,MACC,CAACD,GAAUxG,GAAGyG,EAASD,CAAM,KAC/BA,EAASC,GAEX,MACF,IAAK,IACL,IAAK,KAEH,MAEF,QACE,MAAM,IAAI,MAAM,yBAAyBjB,EAAW,QAAQ,EAAE,CACxE,CACK,CAAA,EACGgB,IAAW,CAACD,GAAUvG,GAAGuG,EAAQC,CAAM,KACzCD,EAASC,EAEf,CAEE,OAAID,GAAU9E,EAAM,KAAK8E,CAAM,EACtBA,EAGF,IACT,EACA,IAAAG,GAAiBJ,GC5DjB,MAAM9E,GAAQhH,GAA2B,EACnCmM,GAAa,CAAClF,EAAO7F,IAAY,CACrC,GAAI,CAGF,OAAO,IAAI4F,GAAMC,EAAO7F,CAAO,EAAE,OAAS,GAC3C,MAAY,CACX,OAAO,IACX,CACA,EACA,IAAA2B,GAAiBoJ,GCVjB,MAAMnK,GAAShC,EACTkH,GAAajH,GAAgC,EAC7C,CAAA,IAAE8K,EAAG,EAAK7D,GACVF,GAAQpF,GAA2B,EACnCqJ,GAAYpJ,GACZ2D,GAAK1D,GACL4D,GAAKU,GACLF,GAAM2C,GACN7C,GAAMoG,GAENC,GAAU,CAACpK,EAASgF,EAAOqF,EAAMlL,IAAY,CACjDa,EAAU,IAAID,GAAOC,EAASb,CAAO,EACrC6F,EAAQ,IAAID,GAAMC,EAAO7F,CAAO,EAEhC,IAAImL,EAAMC,EAAOC,EAAMxE,EAAMyE,EAC7B,OAAQJ,EAAI,CACV,IAAK,IACHC,EAAO/G,GACPgH,EAAQtG,GACRuG,EAAO/G,GACPuC,EAAO,IACPyE,EAAQ,KACR,MACF,IAAK,IACHH,EAAO7G,GACP8G,EAAQxG,GACRyG,EAAOjH,GACPyC,EAAO,IACPyE,EAAQ,KACR,MACF,QACE,MAAM,IAAI,UAAU,uCAAuC,CACjE,CAGE,GAAIzB,GAAUhJ,EAASgF,EAAO7F,CAAO,EACnC,MAAO,GAMT,QAAShjB,EAAI,EAAGA,EAAI6oB,EAAM,IAAI,OAAQ,EAAE7oB,EAAG,CACzC,MAAMiqB,EAAcpB,EAAM,IAAI7oB,CAAC,EAE/B,IAAIuuB,EAAO,KACPC,EAAM,KAuBV,GArBAvE,EAAY,QAAS2C,GAAe,CAC9BA,EAAW,SAAWD,KACxBC,EAAa,IAAI9D,GAAW,SAAS,GAEvCyF,EAAOA,GAAQ3B,EACf4B,EAAMA,GAAO5B,EACTuB,EAAKvB,EAAW,OAAQ2B,EAAK,OAAQvL,CAAO,EAC9CuL,EAAO3B,EACEyB,EAAKzB,EAAW,OAAQ4B,EAAI,OAAQxL,CAAO,IACpDwL,EAAM5B,EAET,CAAA,EAIG2B,EAAK,WAAa1E,GAAQ0E,EAAK,WAAaD,IAM3C,CAACE,EAAI,UAAYA,EAAI,WAAa3E,IACnCuE,EAAMvK,EAAS2K,EAAI,MAAM,EAC3B,MAAO,GACF,GAAIA,EAAI,WAAaF,GAASD,EAAKxK,EAAS2K,EAAI,MAAM,EAC3D,MAAO,EAEb,CACE,MAAO,EACT,EAEA,IAAAC,GAAiBR,GC9EjB,MAAMA,GAAUrM,GACV8M,GAAM,CAAC7K,EAASgF,EAAO7F,IAAYiL,GAAQpK,EAASgF,EAAO,IAAK7F,CAAO,EAC7E,IAAA2L,GAAiBD,GCHjB,MAAMT,GAAUrM,GAEVgN,GAAM,CAAC/K,EAASgF,EAAO7F,IAAYiL,GAAQpK,EAASgF,EAAO,IAAK7F,CAAO,EAC7E,IAAA6L,GAAiBD,GCHjB,MAAMhG,GAAQhH,GAA2B,EACnC1a,GAAa,CAAC4nB,EAAIC,EAAI/L,KAC1B8L,EAAK,IAAIlG,GAAMkG,EAAI9L,CAAO,EAC1B+L,EAAK,IAAInG,GAAMmG,EAAI/L,CAAO,EACnB8L,EAAG,WAAWC,EAAI/L,CAAO,GAElC,IAAAgM,GAAiB9nB,GCHjB,MAAM2lB,GAAYjL,GACZyE,GAAUxE,GAChB,IAAAoN,GAAiB,CAAC/B,EAAUrE,EAAO7F,IAAY,CAC7C,MAAM0J,EAAM,CAAA,EACZ,IAAI3D,EAAQ,KACRmG,EAAO,KACX,MAAMx1B,EAAIwzB,EAAS,KAAK,CAAC9rB,EAAGC,IAAMglB,GAAQjlB,EAAGC,EAAG2hB,CAAO,CAAC,EACxD,UAAWa,KAAWnqB,EACHmzB,GAAUhJ,EAASgF,EAAO7F,CAAO,GAEhDkM,EAAOrL,EACFkF,IACHA,EAAQlF,KAGNqL,GACFxC,EAAI,KAAK,CAAC3D,EAAOmG,CAAI,CAAC,EAExBA,EAAO,KACPnG,EAAQ,MAGRA,GACF2D,EAAI,KAAK,CAAC3D,EAAO,IAAI,CAAC,EAGxB,MAAMoG,EAAS,CAAA,EACf,SAAW,CAAC5B,EAAK9K,CAAG,IAAKiK,EACnBa,IAAQ9K,EACV0M,EAAO,KAAK5B,CAAG,EACN,CAAC9K,GAAO8K,IAAQ7zB,EAAE,CAAC,EAC5By1B,EAAO,KAAK,GAAG,EACL1M,EAED8K,IAAQ7zB,EAAE,CAAC,EACpBy1B,EAAO,KAAK,KAAK1M,CAAG,EAAE,EAEtB0M,EAAO,KAAK,GAAG5B,CAAG,MAAM9K,CAAG,EAAE,EAJ7B0M,EAAO,KAAK,KAAK5B,CAAG,EAAE,EAO1B,MAAM6B,EAAaD,EAAO,KAAK,MAAM,EAC/BE,EAAW,OAAOxG,EAAM,KAAQ,SAAWA,EAAM,IAAM,OAAOA,CAAK,EACzE,OAAOuG,EAAW,OAASC,EAAS,OAASD,EAAavG,CAC5D,EC9CA,MAAMD,GAAQhH,GAA8B,EACtCkH,GAAajH,GAAmC,EAChD,CAAE,IAAA8K,EAAG,EAAK7D,GACV+D,GAAYrJ,GACZ6C,GAAU5C,GAsCV6L,GAAS,CAACC,EAAKC,EAAKxM,EAAU,CAAA,IAAO,CACzC,GAAIuM,IAAQC,EACV,MAAO,GAGTD,EAAM,IAAI3G,GAAM2G,EAAKvM,CAAO,EAC5BwM,EAAM,IAAI5G,GAAM4G,EAAKxM,CAAO,EAC5B,IAAIyM,EAAa,GAEjBC,EAAO,UAAWC,KAAaJ,EAAI,IAAK,CACtC,UAAWK,KAAaJ,EAAI,IAAK,CAC/B,MAAMK,EAAQC,GAAaH,EAAWC,EAAW5M,CAAO,EAExD,GADAyM,EAAaA,GAAcI,IAAU,KACjCA,EACF,SAASH,CAEjB,CAKI,GAAID,EACF,MAAO,EAEb,CACE,MAAO,EACT,EAEMM,GAA+B,CAAC,IAAIjH,GAAW,WAAW,CAAC,EAC3DkH,GAAiB,CAAC,IAAIlH,GAAW,SAAS,CAAC,EAE3CgH,GAAe,CAACP,EAAKC,EAAKxM,IAAY,CAC1C,GAAIuM,IAAQC,EACV,MAAO,GAGT,GAAID,EAAI,SAAW,GAAKA,EAAI,CAAC,EAAE,SAAW5C,GAAK,CAC7C,GAAI6C,EAAI,SAAW,GAAKA,EAAI,CAAC,EAAE,SAAW7C,GACxC,MAAO,GACE3J,EAAQ,kBACjBuM,EAAMQ,GAENR,EAAMS,EAEZ,CAEE,GAAIR,EAAI,SAAW,GAAKA,EAAI,CAAC,EAAE,SAAW7C,GAAK,CAC7C,GAAI3J,EAAQ,kBACV,MAAO,GAEPwM,EAAMQ,EAEZ,CAEE,MAAMC,EAAQ,IAAI,IAClB,IAAI7I,EAAIE,EACR,UAAWnR,KAAKoZ,EACVpZ,EAAE,WAAa,KAAOA,EAAE,WAAa,KACvCiR,EAAK8I,GAAS9I,EAAIjR,EAAG6M,CAAO,EACnB7M,EAAE,WAAa,KAAOA,EAAE,WAAa,KAC9CmR,EAAK6I,GAAQ7I,EAAInR,EAAG6M,CAAO,EAE3BiN,EAAM,IAAI9Z,EAAE,MAAM,EAItB,GAAI8Z,EAAM,KAAO,EACf,OAAO,KAGT,IAAIG,EACJ,GAAIhJ,GAAME,EAAI,CAEZ,GADA8I,EAAW/J,GAAQe,EAAG,OAAQE,EAAG,OAAQtE,CAAO,EAC5CoN,EAAW,EACb,OAAO,KACF,GAAIA,IAAa,IAAMhJ,EAAG,WAAa,MAAQE,EAAG,WAAa,MACpE,OAAO,IAEb,CAGE,UAAWE,KAAMyI,EAAO,CAKtB,GAJI7I,GAAM,CAACyF,GAAUrF,EAAI,OAAOJ,CAAE,EAAGpE,CAAO,GAIxCsE,GAAM,CAACuF,GAAUrF,EAAI,OAAOF,CAAE,EAAGtE,CAAO,EAC1C,OAAO,KAGT,UAAW7M,KAAKqZ,EACd,GAAI,CAAC3C,GAAUrF,EAAI,OAAOrR,CAAC,EAAG6M,CAAO,EACnC,MAAO,GAIX,MAAO,EACX,CAEE,IAAIqN,EAAQC,EACRC,EAAUC,EAGVC,EAAenJ,GACjB,CAACtE,EAAQ,mBACTsE,EAAG,OAAO,WAAW,OAASA,EAAG,OAAS,GACxCoJ,EAAetJ,GACjB,CAACpE,EAAQ,mBACToE,EAAG,OAAO,WAAW,OAASA,EAAG,OAAS,GAExCqJ,GAAgBA,EAAa,WAAW,SAAW,GACnDnJ,EAAG,WAAa,KAAOmJ,EAAa,WAAW,CAAC,IAAM,IACxDA,EAAe,IAGjB,UAAWta,KAAKqZ,EAAK,CAGnB,GAFAgB,EAAWA,GAAYra,EAAE,WAAa,KAAOA,EAAE,WAAa,KAC5Doa,EAAWA,GAAYpa,EAAE,WAAa,KAAOA,EAAE,WAAa,KACxDiR,GASF,GARIsJ,GACEva,EAAE,OAAO,YAAcA,EAAE,OAAO,WAAW,QAC3CA,EAAE,OAAO,QAAUua,EAAa,OAChCva,EAAE,OAAO,QAAUua,EAAa,OAChCva,EAAE,OAAO,QAAUua,EAAa,QAClCA,EAAe,IAGfva,EAAE,WAAa,KAAOA,EAAE,WAAa,MAEvC,GADAka,EAASH,GAAS9I,EAAIjR,EAAG6M,CAAO,EAC5BqN,IAAWla,GAAKka,IAAWjJ,EAC7B,MAAO,WAEAA,EAAG,WAAa,MAAQ,CAACyF,GAAUzF,EAAG,OAAQ,OAAOjR,CAAC,EAAG6M,CAAO,EACzE,MAAO,GAGX,GAAIsE,GASF,GARImJ,GACEta,EAAE,OAAO,YAAcA,EAAE,OAAO,WAAW,QAC3CA,EAAE,OAAO,QAAUsa,EAAa,OAChCta,EAAE,OAAO,QAAUsa,EAAa,OAChCta,EAAE,OAAO,QAAUsa,EAAa,QAClCA,EAAe,IAGfta,EAAE,WAAa,KAAOA,EAAE,WAAa,MAEvC,GADAma,EAAQH,GAAQ7I,EAAInR,EAAG6M,CAAO,EAC1BsN,IAAUna,GAAKma,IAAUhJ,EAC3B,MAAO,WAEAA,EAAG,WAAa,MAAQ,CAACuF,GAAUvF,EAAG,OAAQ,OAAOnR,CAAC,EAAG6M,CAAO,EACzE,MAAO,GAGX,GAAI,CAAC7M,EAAE,WAAamR,GAAMF,IAAOgJ,IAAa,EAC5C,MAAO,EAEb,CAgBE,MAXI,EAAAhJ,GAAMmJ,GAAY,CAACjJ,GAAM8I,IAAa,GAItC9I,GAAMkJ,GAAY,CAACpJ,GAAMgJ,IAAa,GAOtCM,GAAgBD,EAKtB,EAGMP,GAAW,CAAC9uB,EAAGC,EAAG2hB,IAAY,CAClC,GAAI,CAAC5hB,EACH,OAAOC,EAET,MAAMwoB,EAAOxD,GAAQjlB,EAAE,OAAQC,EAAE,OAAQ2hB,CAAO,EAChD,OAAO6G,EAAO,EAAIzoB,EACdyoB,EAAO,GACPxoB,EAAE,WAAa,KAAOD,EAAE,WAAa,KAD1BC,EAEXD,CACN,EAGM+uB,GAAU,CAAC/uB,EAAGC,EAAG2hB,IAAY,CACjC,GAAI,CAAC5hB,EACH,OAAOC,EAET,MAAMwoB,EAAOxD,GAAQjlB,EAAE,OAAQC,EAAE,OAAQ2hB,CAAO,EAChD,OAAO6G,EAAO,EAAIzoB,EACdyoB,EAAO,GACPxoB,EAAE,WAAa,KAAOD,EAAE,WAAa,KAD1BC,EAEXD,CACN,EAEA,IAAAuvB,GAAiBrB,GCrPjB,MAAMsB,GAAahP,GACbH,GAAYI,GACZ+B,GAASJ,EACTD,GAAcE,GACdc,GAAQb,GACRiB,GAAQqD,GACRnD,GAAQ4F,GACR1F,GAAMiJ,GACN/I,GAAO4L,GACPjL,GAAQkL,GACR/K,GAAQgL,GACR9K,GAAQ+K,GACR3M,GAAa4M,GACb5K,GAAU6K,GACV3K,GAAW4K,GACX1K,GAAe2K,GACfzK,GAAe0K,GACftK,GAAOuK,GACPpK,GAAQqK,GACRnK,GAAKoK,GACLlK,GAAKmK,GACLjK,GAAKkK,GACLhK,GAAMiK,GACN/J,GAAMgK,GACN9J,GAAM+J,GACN5J,GAAM6J,GACN3J,GAAS4J,GACTjJ,GAAakJ,GAA+B,EAC5CpJ,GAAQqJ,GAA0B,EAClCpF,GAAYqF,GACZnF,GAAgBoF,GAChBlF,GAAgBmF,GAChB9E,GAAgB+E,GAChB3E,GAAa4E,GACbvE,GAAawE,GACbtE,GAAUuE,GACV9D,GAAM+D,GACN7D,GAAM8D,GACNxrB,GAAayrB,GACbC,GAAgBC,GAChBvD,GAASwD,GACf,IAAAxO,GAAiB,CACf,MAAAC,GACA,MAAAI,GACA,MAAAE,GACA,IAAAE,GACA,KAAAE,GACA,MAAAW,GACA,MAAAG,GACA,MAAAE,GACA,WAAA5B,GACA,QAAAgC,GACA,SAAAE,GACA,aAAAE,GACA,aAAAE,GACA,KAAAI,GACA,MAAAG,GACA,GAAAE,GACA,GAAAE,GACA,GAAAE,GACA,IAAAE,GACA,IAAAE,GACA,IAAAE,GACA,IAAAG,GACA,OAAAE,GACA,WAAAW,GACA,MAAAF,GACA,UAAAiE,GACA,cAAAE,GACA,cAAAE,GACA,cAAAK,GACA,WAAAI,GACA,WAAAK,GACA,QAAAE,GACA,IAAAS,GACA,IAAAE,GACA,WAAA1nB,GACA,cAAA0rB,GACA,OAAAtD,GACA,OAAA1L,GACA,GAAIgN,GAAW,GACf,IAAKA,GAAW,IAChB,OAAQA,GAAW,EACnB,oBAAqBnP,GAAU,oBAC/B,cAAeA,GAAU,cACzB,mBAAoB8B,GAAY,mBAChC,oBAAqBA,GAAY,mBACnC,kBCtEawP,GAA4C,CACvD,SAAU,IACZ,EAOMC,GAAe,iBAYd,MAAMC,WAA2BC,EAAAA,kBAGtC,CAIA,YACmBC,EACjBC,EACAze,EAA6B,CAAA,EAC7B,CACA,MAAM,CAAE,GAAGA,EAAK,GAAGoe,EAAA,EAAgCK,CAAM,EAR1Ct4B,EAAA,aACAA,EAAA,+BAGE,KAAA,iBAAAq4B,EAKjB,KAAK,KAAOxe,EAAI,KAChB,KAAK,uBAAyBA,EAAI,sBAAA,CAG1B,OAAO0e,EAAoC,CAC3C,OAAAA,EAAI,YAAY,KAAM,CAC5B,IAAK,SACH,MAAO,SAASA,EAAI,YAAY,MAAM,IAAIA,EAAI,YAAY,KAAK,GACjE,IAAK,SACH,MAAO,SAASA,EAAI,YAAY,MAAM,IAAIA,EAAI,YAAY,KAAK,GACjE,IAAK,mBACI,MAAA,oBAAoB5iB,GAAa4iB,CAAG,CAAE,GAC/C,QACS,OAAAL,EAAA,CACX,CAGF,MAAgB,UAAUK,EAA6D,SACjF,GAAA,CACF,MAAMC,EAAQD,EAAI,YAClB,OAAQC,EAAM,KAAM,CAClB,IAAK,SACC,GAAA,CACF,MAAMt7B,EAAQ,MAAMF,GAAoBw7B,EAAM,MAAM,EACpD,OAAIt7B,IAAUs7B,EAAM,MAAc,CAAE,YAAa,CAAA,CAAG,EACxC,CAAE,eAAgB,CAAE,GAAGA,EAAO,MAAAt7B,CAAM,EAAG,YAAa,EAAG,QAC5DwhB,EAAc,CAChB,YAAA,OAAO,KAAKA,CAAG,EACb,CAAE,YAAa,EAAG,CAAA,CAI7B,IAAK,SACC,GAAA,CACF,MAAMnhB,EAAc,MAAM6B,EAAA,uBAAuBo5B,EAAM,OAAQ,KAAK,MAAM,EAC1E,GAAIj7B,IAAgB,OAAW,MAAO,CAAE,YAAa,CAAA,CAAG,EAClD,MAAAL,EAAQ,MAAMI,GAAoBC,CAAW,EACnD,OAAIL,IAAUs7B,EAAM,MAAc,CAAE,YAAa,CAAA,CAAG,EACxC,CAAE,eAAgB,CAAE,GAAGA,EAAO,MAAAt7B,CAAa,EAAG,YAAa,EAAG,QACnEwhB,EAAc,CAChB,YAAA,OAAO,KAAKA,CAAG,EACb,CAAE,YAAa,EAAG,CAAA,CAI7B,IAAK,mBACC,GAAA,CACF,KAAM,CAAE,YAAA+Z,EAAa,YAAAC,CAAY,EAAIH,EAAI,SACzC,GAAIE,IAAgB,QAAS,MAAO,CAAE,YAAa,CAAA,CAAG,EACtD,MAAMtwB,EAAW,KAAK,iBAAiB,YAAYqwB,EAAM,WAAW,EAChE,IAAApzB,EACAxF,EAA8B,KAAK,uBAEvC,GAAIA,IAAY,OACV,GAAA44B,EAAM,UAAY,OAEpB,GADW,MAAMrwB,EAAS,kBAAkBqwB,EAAM,GAAI75B,eAAa,EACjDiB,EAAAjB,EAAA,kBACb,CAGH,GADW,MAAMwJ,EAAS,kBAAkBqwB,EAAM,GAAI95B,YAAU,IACrD,OACT,YAAK,OAAO,MACV,+BAA+Bi6B,EAAAA,oBAAoBH,EAAM,EAAE,CAAC,EAC9D,EACO,CAAE,YAAa,EAAG,EAEjB54B,EAAAlB,EAAA,UAAA,QAEG85B,EAAM,QAGzB,MAAMI,EAAe,MAAMzwB,EAAS,qBAAqBqwB,EAAM,GAAI54B,CAAO,EACtE,GAAAg5B,IAAiB,QAAaA,EAAa,SAAW,EAAU,MAAA,CAAE,YAAa,EAAG,EAGtFA,EAAa,QAAQ,EAErB,IAAIC,EACJ,OAAQJ,EAAa,CACnB,KAAK,OACeI,EAAAD,EAAa,CAAC,EAAE,OAClC,MACF,IAAK,QACHC,GAAkBh5B,EAAA+4B,EAAa,KAAMh6B,GAAMA,EAAE,OAAS,OAAO,IAA3C,YAAAiB,EAA8C,OAChE,MACF,IAAK,QACHg5B,GAAkB9pB,EAAA6pB,EAAa,KAAMh6B,GAAMA,EAAE,OAAS,OAAO,IAA3C,YAAAmQ,EAA8C,OAChE,KAAA,CAGJ,MAAM+pB,EAAiCF,EAAa,IAAI,CAAC,CAAE,KAAAnuB,EAAM,OAAAsuB,MAAc,CAC7E,KAAAtuB,EACA,OAAQ,CAAE,GAAG+tB,EAAO,GAAI,CAAE,GAAGA,EAAM,GAAI,QAASO,CAAS,CAAA,CAAA,EACzD,EAEF,GAAIF,IAAoB,OAAkB,MAAA,CAAE,YAAAC,CAAY,EACxD,GAAIJ,IAAgB,QAAalP,GAAO,IAAIqP,EAAiBH,CAAW,EACtE,MAAO,CAAE,YAAAI,CAAY,EAEvB,MAAME,EAA0C,CAC9C,GAAGR,EACH,GAAI,CAAE,GAAGA,EAAM,GAAI,QAASK,CAAgB,CAC9C,EAGA,OAAM,SAAY,CACZ,GAAA,CACI,MAAA1wB,EAAS,cAAc6wB,EAAe,EAAE,QACvCn6B,EAAY,CACd,KAAA,OAAO,KAAKA,CAAC,CAAA,CACpB,GACC,EAEI,CAAE,YAAAi6B,EAAa,eAAAE,CAAe,QAC9Bta,EAAc,CAChB,YAAA,OAAO,KAAKA,CAAG,EACb,CAAE,YAAa,EAAG,CAAA,CAI7B,QACS,MAAA,CAAE,YAAa,EAAG,CAAA,QAEtB7f,EAAY,CACd,YAAA,OAAO,KAAKA,CAAC,EACX,CAAE,YAAa,EAAG,CAAA,CAC3B,CAGQ,aAAao6B,EAA8BC,EAAuC,CAC1F,OAAOvjB,GAAasjB,CAAI,IAAMtjB,GAAaujB,CAAI,CAAA,CAqBnD,CCxLO,MAAeC,EAA2B,CAA1C,cACYn5B,EAAA,qBAAgB,KAIzB,MAAM2B,EAAa,CACzB,MAAMy3B,EAAU,KAAK,UAAU,IAAIz3B,CAAG,EACtC,GAAIy3B,IAAY,OAAiB,MAAA,IAAI,MAAM,mBAAmB,EAC1D,GAAAA,EAAQ,WAAa,EAAG,CACrB,KAAA,UAAU,OAAOz3B,CAAG,EAGzB,MAAMrF,EAAW88B,EAAQ,SACA98B,GAAQ,MAAQ,OAAOA,EAAI,OAAO,OAAO,GAAM,YAClEA,EAAA,OAAO,OAAO,EAAE,CAAA,CACxB,CAGK,QAAQ+8B,EAA4B,CACnC,MAAA13B,EAAM,KAAK,mBAAmB03B,CAAM,EAC1C,IAAID,EAAU,KAAK,UAAU,IAAIz3B,CAAG,EAChCy3B,IAAY,SACdA,EAAU,CAAE,SAAU,EAAG,SAAU,KAAK,kBAAkBC,CAAM,CAAE,EAC7D,KAAA,UAAU,IAAI13B,EAAKy3B,CAAO,GAIzBA,EAAA,WAER,IAAIE,EAAc,GACX,MAAA,CACL,SAAUF,EAAQ,SAClB,IAAAz3B,EACA,MAAO,IAAM,CACP23B,IAEIF,EAAA,WACME,EAAA,GACd,KAAK,MAAM33B,CAAG,EAAA,CAElB,CAAA,CAGK,SAASA,EAAgB,CAC1B,GAAA,CAAC,KAAK,UAAU,IAAIA,CAAG,EAAG,MAAM,IAAI,MAAM,6BAA6BA,CAAG,EAAE,EAChF,OAAO,KAAK,UAAU,IAAIA,CAAG,EAAG,QAAA,CAG3B,YAAYA,EAA4B,OAC7C,OAAO9B,EAAA,KAAK,UAAU,IAAI8B,CAAG,IAAtB,YAAA9B,EAAyB,QAAA,CAEpC,CChEA,IAAI05B,GACG,SAASC,GAAgB,CAC9B,OAAID,KACIA,GAAA,CACN,kBAAmB,QAAQ,IAAI,iBAAmB,OAClD,YAAa,QAAQ,IAAI,oBAAsB,MACjD,EACI,QAAQ,IAAI,mBACdA,GAAM,aACF,QAAQ,IAAI,mBAAqB,aAAe,aAAe,eAC9DA,GACT,CCgCA,SAASE,GAAQn9B,EAA2B,CACnC,OAAA,OAAOA,EAAI,EAAE,CACtB,CAIA,MAAMo9B,GAA0B,CAAC,MAAO,OAAQ,QAAS,SAAU,SAAU,OAAO,EAEpF,SAASC,GAAeC,EAAkE,CACxF,MAAMC,EAAY,CAAC,EACbC,EAA+C,CAAC,EACtD,UAAWC,KAAUH,EACdG,EAAO,OAAqB,kBAC/BF,EAAU,KAAKE,CAAM,EACrBD,EAAU,KAAK,CACb,GAAGC,EACH,KAAM,kBAAA,CACP,GAEDD,EAAU,KAAKC,CAAM,EAGrB,GAAAF,EAAU,OAAS,EAAG,CAClB,MAAAG,EAAgB,KAAK,UAAUH,CAAS,EACtC,QAAA,KACN,2EAA2EG,CAAa,EAC1F,CAAA,CAEK,OAAAJ,CACT,CAEA,MAAMK,GAAiB,CAACpU,EAAWjnB,IAAgB,OAAOA,GAAM,SAAWA,EAAE,SAAA,EAAaA,EAE1F,MAAMs7B,EAAoE,CAoBxE,YACmBC,EACA7B,EACA8B,EACjBC,EACA,CAxBcr6B,EAAA,mBACAA,EAAA,mBACCA,EAAA,4BAAuB,KACvBA,EAAA,iCAA4B,KAK5BA,EAAA,yBAqHDA,EAAA,mBAAc,MAAOs6B,GAAqC,CAClE,MAAApd,EAAcod,EAAQ,IAAKC,GAAW,KAAK,6BAA6BA,CAAM,CAAC,EACrF,UAAW5a,KAAczC,EAAmB,MAAAyC,EAAW,qBAAqB,CAC9E,GAEgB3f,EAAA,mBAAc,MAAOu6B,GAAoC,CACjE,MAAA5a,EAAa,KAAK,6BAA6B4a,CAAM,EAC3D,OAAO,KAAK,WAAW,cAAc,MAAM5a,EAAW,oBAAoB,MAAM,CAClF,GAEgB3f,EAAA,0BAAqB,MAAOu6B,GAAwC,CAC9E,GAAA,CACI,MAAA5a,EAAa,KAAK,6BAA6B4a,CAAM,EACrDl/B,EAAO,KAAK,WAAW,cAAc,MAAMskB,EAAW,oBAAoB,MAAM,EACtF,OAAO,MAAM,KAAK,iBAAiB,WAAWtkB,CAAI,QAC3CqjB,EAAc,CACf,MAAAnjB,EAAQ,KAAK,UAAUmjB,CAAG,EACxB,cAAA,IAAI,qCAAqCnjB,CAAK,EAAE,EAClDmjB,CAAA,CAEV,GA7HmB,KAAA,WAAAyb,EACA,KAAA,OAAA7B,EACA,KAAA,iBAAA8B,EAGX,MAAAI,EAAiC,CAACC,EAAkCC,IAAoB,CAC5F,OAAQD,EAAO,CACb,QACA,IAAK,OACI,OAAA,KAAK,OAAO,KAAKC,CAAO,EACjC,IAAK,OACI,OAAA,KAAK,OAAO,KAAKA,CAAO,EACjC,IAAK,QACI,OAAA,KAAK,OAAO,MAAMA,CAAO,CAAA,CAEtC,EAEA,UAAWC,KAAUN,EACnB,UAAWvmB,KAAQF,GAAS+mB,EAAO,IAAI,EACrC,KAAK,iBAAiB,IAAIlB,GAAQ3lB,CAAI,EAAGA,CAAI,EAGjD,MAAM8mB,EAAmB,CACvB,GAAG,IAAI,IAAIP,EAAQ,IAAKM,IAAY,CAClC,GAAGA,EACH,KAAMxmB,GAASwmB,EAAO,KAAMlB,EAAO,GACnC,EAAE,IACDoB,GAAS,CAACllB,GAAaklB,CAAI,EAAIA,CAAI,CACrC,CAAA,EAAE,OAAO,CACZ,EAEA,KAAK,YAAc,IAA+B,CAC5C,GAAA,CACF,MAAMC,EAAS,IAAIC,UAASvB,EAAgB,EAAA,kBAAoBgB,EAAU,MAAS,EACnFM,EAAO,cAAc,IAAI,EACzB,UAAWH,KAAUC,EACnBE,EAAO,cAAcH,EAAO,GAAIA,EAAO,IAAI,EAC3CG,EAAO,cAAcH,EAAO,GAAIA,EAAO,IAAI,EAEtC,OAAAG,QACApc,EAAc,CACrB,MAAM,IAAI,MACR,yCAAyC,KAAK,UAAUkc,CAAgB,CAAC,YAAYlc,CAAY,EACnG,CAAA,CACF,GACC,EAEH,KAAK,YAAc,IAA+B,CAC5C,GAAA,CACI,MAAAoc,EAAStB,IAAgB,kBAAoB,IAAIwB,GAAAA,OAAOR,CAAO,EAAI,IAAIQ,UAC7E,UAAWL,KAAUC,EACf,GAAA,CACFE,EAAO,cAAcH,EAAO,GAAIA,EAAO,IAAI,QACpCjc,EAAc,CACrB,MAAM,IAAI,MACR,iBAAiBic,EAAO,EAAE,sBAAsBjc,CAAY,WAAW,KAAK,UAAUic,EAAO,IAAI,CAAC,GACpG,CAAA,CAGG,OAAAG,QACApc,EAAc,CACrB,MAAM,IAAI,MACR,yCAAyC,KAAK,UAAUkc,CAAgB,CAAC,YAAYlc,CAAY,EACnG,CAAA,CACF,GACC,EAEH,KAAK,iBAAmB,IAA+B,CACjD,GAAA,CACI,MAAAoc,EAAStB,IAAgB,kBAAoB,IAAIwB,GAAAA,OAAOR,CAAO,EAAI,IAAIQ,UAC7EF,EAAO,cAAc,IAAI,EACzB,UAAWH,KAAUC,EACf,GAAA,CACFE,EAAO,cAAcH,EAAO,GAAIA,EAAO,IAAI,EAC3CG,EAAO,cAAcH,EAAO,GAAIA,EAAO,IAAI,QACpCjc,EAAc,CACrB,MAAM,IAAI,MACR,iBAAiBic,EAAO,EAAE,sBAAsBjc,CAAY,WAAW,KAAK,UAAUic,EAAO,IAAI,CAAC,eAAe,KAAK,UAAUA,EAAO,IAAI,CAAC,GAC9I,CAAA,CAGG,OAAAG,QACApc,EAAc,CACrB,MAAM,IAAI,MACR,yCAAyC,KAAK,UAAUkc,CAAgB,CAAC,YAAYlc,CAAY,EACnG,CAAA,CAEJ,CAAA,CAlGF,IAAW,sBAAuB,CAC1B,MAAAuc,EAAa,KAAK,iBAAiB,EAClC,MAAA,CACL,WAAAA,EACA,CAAC,OAAO,OAAO,EAAG,IAAM,CACtBA,EAAW,QAAQ,CAAA,CAEvB,CAAA,CA8FM,6BAA6BV,EAAgB,CACnD,IAAI5a,EAAa,KAAK,sBAAsB,IAAI4a,CAAM,EAClD,GAAA5a,IAAe,OAAkB,OAAAA,EAErC,MAAMub,EAAe,KAAK,iBAAiB,IAAIX,CAAM,EACrD,GAAIW,IAAiB,OAAW,MAAM,IAAI,MAAM,gBAAgBX,CAAM,aAAa,EAGnF,OAAA5a,EAAa,KAAK,WAAW,kBAAkBub,CAAY,EAAE,2BAA2B,EAEnF,KAAA,sBAAsB,IAAIX,EAAQ5a,CAAU,EAE1CA,CAAA,CAyBT,CAAC,OAAO,OAAO,GAAU,CACvB,UAAWA,KAAc,KAAK,sBAAsB,OAAO,IAAc,WAAW,EACpF,KAAK,WAAW,QAAQ,EACxB,KAAK,WAAW,QAAQ,CAAA,CAE5B,CAOO,MAAMwb,EAAwC,CAOnD,YACmBhB,EACA7B,EACjB,CATet4B,EAAA,gBACAA,EAAA,gBACAA,EAAA,yBAEAA,EAAA,2BAGE,KAAA,WAAAm6B,EACA,KAAA,OAAA7B,EAEX,MAAA8B,EAAmB,IAAI1M,YAA6B,CACxD,QAAS,IACT,YAAa,MAAO/rB,GAAQ,MAAMrG,GAAI,SAASqG,CAAG,EAClD,gBAAkB/C,GAAMA,EAAE,MAAA,CAC3B,EACD,KAAK,iBAAmBw7B,EAElB,MAAAgB,EAAqB,IAAIC,EAAA,4BAA4B,CAAC,EAC5D,KAAK,mBAAqBD,EAErB,KAAA,QAAU,IAAK,cAAcjC,EAAuD,CACvF,YACmBgB,EACA7B,EACjB,CACM,MAAA,EAHW6B,KAAAA,WAAAA,EACA7B,KAAAA,OAAAA,CAAA,CAKT,kBAAkBe,EAA0C,CACpE,OAAIG,EAAgB,EAAA,mBACXlB,EAAA,KACL,mCAAmC,KAAK,mBAAmBe,CAAM,CAAC,MAAM,KAAK,UAAUA,EAAQY,EAAc,CAAC,EAChH,EACK,IAAIC,GAAa,KAAK,WAAY,KAAK,OAAQE,EAAkBf,CAAM,CAAA,CAGtE,mBAAmBA,EAAoC,CAC/D,OAAOiC,GAAwBjC,CAAM,CAAA,CAEtC,EAAA,KAAK,WAAY,KAAK,MAAM,EAE1B,KAAA,QAAU,IAAK,cAAcF,EAGhC,CACA,YACmBoC,EACjB,CACM,MAAA,EAFW,KAAA,QAAAA,CAAA,CAKnB,MAAgB,kBAAkBlC,EAAyD,CACzF,MAAMna,EAAuBma,EAAO,aAC9BmC,EAAY,MAAMJ,EAAmB,IAAI,SAAY,CAKzD,IAAAK,EAAA,OAJIjC,EAAgB,EAAA,mBACXlB,EAAA,KACL,mCAAmC,KAAK,mBAAmBe,CAAM,CAAC,MAAM,KAAK,UAAUA,EAAQY,EAAc,CAAC,EAChH,EACF,MAAMyB,EAAuBC,GAAAF,EAAA,KAAK,QAAQ,SAASvc,CAAM,EAAE,sBACpD,OAAA,MAAMwc,EAAqB,WAAW,YAAY,CACvD,IAAKE,GAAoBvC,EAAO,IAAI,GAAG,EACvC,QAASM,GAAeN,EAAO,IAAI,OAAO,CAAA,CAC3C,QAJDxT,EAAA,KAAAgW,EAAAhW,EAAAiW,EAAA,WAAAC,GAAAN,EAAAI,EAAAC,GAIC,CACF,EACM,OAAAzC,EAAO,IAAI,QAAQ,SAAW,EAAImC,EAAU,KAAKnC,EAAO,IAAI,OAAO,EAAImC,CAAA,CAGtE,mBAAmBnC,EAA+B,CAC1D,OAAO2C,GAA2B3C,CAAM,CAAA,CAC1C,EACC,KAAK,OAAO,CAAA,CAOV,aACLtZ,EACA7c,EACc,CACd,MAAM+4B,EAAelc,EAClB,OAAQ1E,GAAMqe,GAAW,KAAMrS,GAAMA,IAAMhM,EAAE,KAAK,SAAS,CAAC,EAC5D,IAAKA,GACJmE,EAAA,eAAenE,EAAIoE,GACjByc,wBAAqBzc,CAAC,EAAI9K,GAAsB8K,CAAC,EAAInK,GAAqB+F,EAAE,KAAMoE,CAAC,CAAA,CAEvF,EACInjB,EAAM,KAAK,QAAQ,QAAQ2/B,CAAY,EACzC,OAAA/4B,EAAA,aAAa5G,EAAI,KAAK,EACnBA,EAAI,GAAA,CAGN,aACLyjB,EACA7c,EACc,CACd,MAAMi5B,EAAe,KAAK,aAAaC,oBAAkBrc,EAAI,GAAG,EAAG7c,CAAG,EAChEm5B,EAASrc,EAAAA,aAAaD,EAAM1E,GAAMA,EAAE,EAAE,EACtC/e,EAAM,KAAK,QAAQ,QAAQ,CAAE,IAAK+/B,EAAQ,aAAAF,EAAc,EAC9D,OAAI3C,EAAgB,EAAA,mBAClB,KAAK,OAAO,KACV,sCAAsC2C,CAAY,oBAAoB,KAAK,UAAU7/B,CAAG,CAAC,MAAM,KAAK,UAClG0jB,EAAAA,aAAaD,EAAM1E,GAAMA,EAAE,IAAI,EAC/B4e,EAAA,CACD,EACH,EACE/2B,EAAA,aAAa5G,EAAI,KAAK,EACnBA,EAAI,GAAA,CAOb,MAAa,YACX4iB,EACA7iB,EAC8B,CAC9B,MAAMigC,EAA8C,CAClD,GAAGjgC,EACH,eACEA,EAAQ,eAAe,SAAW,EAC9B,CAAC,CACC,SAAU,CACR,GAAG,IAAI,IAAIA,EAAQ,eAAe,IAC/Bw+B,GAAS,CAACllB,GAAaklB,CAAI,EAAIA,CAAI,CACrC,CAAA,EAAE,OAAO,CACZ,EACA,eAAgB,CAAA,CAAC,CAClB,EACD,CAAA,CACR,EAMO,MAAA,CACL,MANerB,EAAc,EAAE,YAC7B,MAAM,KAAK,QAAQ,SAASta,CAAM,EAAE,WAAW,YAAYod,CAAQ,EACnE,MAAM,KAAK,mBAAmB,IAC9B,SAAY,MAAM,KAAK,QAAQ,SAASpd,CAAM,EAAE,WAAW,YAAYod,CAAQ,CACjF,GAEe,KACZ,OAAQC,GACPA,EAAE,gBAAgB,SAAW,GAC1BA,EAAE,gBAAgB,KAAM39B,GACzBA,EAAE,eAAe,OAAO,SAAW,GAChCA,EAAE,eAAe,WAAW,MAAO49B,GAAMA,EAAE,SAAW,CAAC,CAAC,CAAC,EAC/D,IAAKD,GAAMA,EAAE,GAAG,CACrB,CAAA,CAGF,MAAa,cAAcrd,EAAsBud,EAA2C,CAC1F,OAAOjD,EAAc,EAAE,YACnB,MAAM,KAAK,QAAQ,SAASta,CAAM,EAAE,WAAW,cAAcud,CAAQ,EACrE,MAAM,KAAK,mBAAmB,IAC9B,SAAY,MAAM,KAAK,QAAQ,SAASvd,CAAM,EAAE,WAAW,cAAcud,CAAQ,CACnF,CAAA,CAGJ,MAAa,YAAYvd,EAAmD,CAC1E,OAAOsa,EAAc,EAAE,YACnB,MAAM,KAAK,QAAQ,SAASta,CAAM,EAAE,WAAW,YAAA,EAC/C,MAAM,KAAK,mBAAmB,IAC9B,SAAY,MAAM,KAAK,QAAQ,SAASA,CAAM,EAAE,WAAW,YAAY,CACzE,CAAA,CAGJ,MAAa,mBACXA,EACA7iB,EACqC,CACrC,IAAIqgC,EAAQ,MAAM,KAAK,mBAAmB,IAAI,SAAY,CAKxD,IAAAjB,EAAA,OAJIjC,EAAgB,EAAA,mBAClB,KAAK,OAAO,KACV,qCAAqCta,CAAM,eAAe,KAAK,UAAU7iB,EAAS49B,EAAc,CAAC,EACnG,EACF,MAAMyB,EAAuBC,GAAAF,EAAA,KAAK,QAAQ,SAASvc,CAAM,EAAE,sBACpD,OAAA,MAAMwc,EAAqB,WAAW,YAAY,CACvD,IAAKE,GAAoBv/B,EAAQ,GAAG,EACpC,QAASs9B,GAAet9B,EAAQ,OAAO,CAAA,CACxC,QAJDwpB,EAAA,KAAAgW,EAAAhW,EAAAiW,EAAA,WAAAC,GAAAN,EAAAI,EAAAC,GAIC,CACF,EAEG,GAAAz/B,EAAQ,QAAQ,OAAS,EAAG,CACxB,MAAAsgC,EAAc,MAAM,KAAK,mBAAmB,IAChD,SAAY,MAAMD,EAAM,KAAKrgC,EAAQ,OAAO,CAC9C,EACAqgC,EAAM,QAAQ,EACNA,EAAAC,CAAA,CAGJ,MAAAv3B,EAAOs3B,EAAM,QAAQ,EACrB7oB,EAAO,MAAM,KAAK,mBAAmB,IACzC,SAAY,MAAM6oB,EAAM,QAAQ,CAAC,GAAGt3B,EAAK,KAAK,CAAC,CAAC,CAClD,EACA,OAAAs3B,EAAM,QAAQ,EAEPt3B,EAAK,IAAI,CAACA,EAAMF,KAAO,CAC5B,KAAME,EACN,KAAMyO,EAAK3O,CAAC,CAAA,EACZ,CAAA,CAGJ,MAAa,gBACXga,EACA7iB,EAC+B,CAC/B,OAAO,MAAM,KAAK,mBAAmB,IAAI,SAAY,CAKnD,IAAAo/B,EAAA,OAJIjC,EAAgB,EAAA,mBAClB,KAAK,OAAO,KACV,kCAAkCta,CAAM,eAAe,KAAK,UAAU7iB,EAAS49B,EAAc,CAAC,EAChG,EACF,MAAMyB,EAAuBC,GAAAF,EAAA,KAAK,QAAQ,SAASvc,CAAM,EAAE,sBACpD,OAAA,MAAMwc,EAAqB,WAAW,gBAAgB,CAC3D,GAAGr/B,EACH,QAASs9B,GAAet9B,EAAQ,OAAO,CAAA,CACxC,QAJDwpB,EAAA,KAAAgW,EAAAhW,EAAAiW,EAAA,WAAAC,GAAAN,EAAAI,EAAAC,GAIC,CACF,CAAA,CAOH,MAAa,SAAS5c,EAA4C,CAEhE,OADe,MAAM,KAAK,QAAQ,SAASA,CAAM,GACnC,SAAS,CAAA,CAGzB,MAAa,QAAQA,EAAmD,CAEtE,OADe,MAAM,KAAK,QAAQ,SAASA,CAAM,GACnC,QAAQ,CAAA,CAGxB,MAAa,QACXA,EACA0d,EACA7O,EACyB,CACzB,MAAM8O,EAAS,MAAM,KAAK,QAAQ,SAAS3d,CAAM,EAC1C,OAAA,MAAM,KAAK,mBAAmB,IACnC,SAAY,MAAM2d,EAAO,QAAQD,EAAe7O,CAAK,CACvD,CAAA,CAEJ,CAEA,SAAS6N,GAAoB78B,EAAuD,CAClF,OAAQA,EAAM,KAAM,CAClB,IAAK,SACI,MAAA,CACL,KAAM,SACN,SAAUA,EAAM,OAChB,eAAgB,CAAA,CAClB,EACF,IAAK,QACL,IAAK,OACI,MAAA,CACL,KAAMA,EAAM,KACZ,QAASA,EAAM,QAAQ,IAAK+9B,GAAQlB,GAAoBkB,CAAG,CAAC,CAC9D,EACF,IAAK,QACI,MAAA,CACL,KAAM,QACN,QAASlB,GAAoB78B,EAAM,OAAO,EAC1C,UAAWA,EAAM,UAAU,IAAK+9B,GAAQlB,GAAoBkB,CAAG,CAAC,CAClE,EACF,QACEv9B,EAAAA,YAAYR,CAAK,CAAA,CAEvB,CAEA,SAASi9B,GAA2BnoB,EAA6B,CACzD,MAAA9R,EAAOuF,cAAW,QAAQ,EAC3B,OAAAvF,EAAA,OAAO4T,GAAa9B,CAAI,CAAE,EACxB9R,EAAK,SAAS,SAAS,KAAK,CACrC,CAEA,SAASu5B,GAAwBznB,EAAgE,CAC/F,MAAMkpB,EAAc,CAAC,GAAGlpB,CAAI,EAAE,IAAK8mB,GACjCnb,EAAAA,eAAemb,EAAStvB,GAAM,CACxB,IAAAtN,EAQJ,MAAM0M,EAAOY,EAAE,KACf,OAAQZ,EAAM,CACZ,IAAK,OACM1M,EAAA,CACP,KAAMsN,EAAE,KACR,UAAWA,EAAE,UACb,QAAS,OAAO,QAAQA,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC8J,EAAM7H,CAAK,KAAO,CACtD,IAAK6H,EACL,MAAA7H,CAAA,EACA,CACJ,EACA,MACF,IAAK,kBACMvP,EAAA,CACP,KAAMsN,EAAE,KACR,UAAWA,EAAE,mBACb,QAAS,OAAO,QAAQA,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC8J,EAAMzJ,CAAI,KAAO,CACtD,IAAKyJ,EACL,MAAOskB,GAAQ/tB,CAAI,CAAA,EACnB,CACJ,EACA,MACF,IAAK,oBACM3N,EAAA,CACP,KAAMsN,EAAE,KACR,UAAWA,EAAE,mBACb,QAAS,OAAO,QAAQA,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC8J,EAAMzJ,CAAI,KAAO,CACtD,IAAKyJ,EACL,MAAO,CAACskB,GAAQ/tB,EAAK,KAAK,EAAG+tB,GAAQ/tB,EAAK,MAAM,CAAC,CAAA,EACjD,CACJ,EACA,MACF,QACE,MAAM,MAAM,8BAA8B,KAAK,UAAUjB,CAAoB,CAAC,EAAE,CAAA,CAE7E,OAAA1M,EAAA,QAAQ,KAAK,CAACi/B,EAAKC,IAAQD,EAAI,IAAI,cAAcC,EAAI,GAAG,CAAC,EACzDl/B,CACR,CAAA,CACH,EACYg/B,EAAA,KAAK,CAACC,EAAKC,IAAQD,EAAI,GAAG,cAAcC,EAAI,EAAE,CAAC,EAErD,MAAAl7B,EAAOuF,cAAW,QAAQ,EAC3B,OAAAvF,EAAA,OAAO4T,GAAaonB,CAAW,CAAE,EAC/Bh7B,EAAK,SAAS,SAAS,KAAK,CACrC,CCpgBsB,eAAAm7B,GACpBv6B,EACAw6B,EACAC,EAC+B,CAC/B,MAAMvjB,EAAoB,CACxB,GAAGkM,GACH,GAAGE,GAAyBkX,CAAO,EACnC,GAAGC,CACL,EAEMn0B,EAAS,IAAIo0B,mBAAiBxjB,EAAI,WAAW,EAE7CyjB,EAAiBC,GAAAA,qBAAqB1jB,EAAI,OAAQlX,EAAIkX,EAAI,gBAAgB,EAC1E2jB,EAAaC,GAAA,iBAAiB96B,EAAIkX,EAAI,MAAM,EAC5C6jB,EAAmBC,GAAA,uBAAuBh7B,EAAIkX,EAAI,MAAM,EACxD+jB,EAAuBC,GAAA,2BAA2Bl7B,EAAIkX,EAAI,MAAM,EAEhEsgB,EAAa,IAAI2D,GAAA,eACrBjkB,EAAI,OACJyjB,EACAE,EACA3jB,EAAI,iBACJ5Q,EACA4Q,EAAI,aACN,EAEMkkB,EAAkB,IAAIC,GAAA,wBAC1BnkB,EAAI,OACJ5Q,EACAq0B,EACAzjB,EAAI,sBACJA,EAAI,0BACN,EAEMokB,EAAe,IAAIC,GAAA,aACvBrkB,EAAI,OACJ5Q,EACAy0B,EACAE,EACA/jB,EAAI,eACN,EACMskB,EAAmB,IAAIC,oBAAiBvkB,EAAI,OAAQ2jB,EAAY3jB,EAAI,kBAAkB,EACtFwkB,EAAY,IAAIC,GAAA,WAAWzkB,EAAI,OAAQskB,EAAkBhE,CAAU,EACnEoE,EAAW,MAAMC,GAAAA,SAAS,KAC9B3kB,EAAI,OACJlX,EACAsG,EACA4Q,EAAI,iBACJA,EAAI,uBACJA,EAAI,4BACN,EAEM4kB,EAAe,IAAItD,GAAahB,EAAYtgB,EAAI,MAAM,EAErD,MAAA,CACL,WAAAsgB,EACA,gBAAA4D,EACA,UAAAM,EACA,SAAAE,EACA,OAAAt1B,EACA,aAAAg1B,EACA,aAAAQ,CACF,CACF,CC/DO,MAAMC,EAAY,CAMf,YACW57B,EACD67B,EACA11B,EACC21B,EACAC,EACAC,EACDC,EAChBC,EACA,CAdeh/B,EAAA,WAGDA,EAAA,oBA+DCA,EAAA,+BAA0B,KA5DxB,KAAA,IAAA8C,EACD,KAAA,UAAA67B,EACA,KAAA,OAAA11B,EACC,KAAA,sBAAA21B,EACA,KAAA,mBAAAC,EACA,KAAA,gBAAAC,EACD,KAAA,sBAAAC,EAGhB,KAAK,YAAcC,EACd,KAAA,GAAK,KAAK,IAAI,EAAA,CAIrB,IAAW,mBAA0C,CACnD,OAAO,KAAK,IAAI,SAAA,CAQlB,MAAa,cAAcz7B,EAAmB/E,EAAayG,gBAAmC,CAC5F,MAAMzC,EAAW,MAAM,KAAK,GAAG,YAAY,kBAAmB,MAAOuB,GAAO,CAC1E,MAAMT,EAAM,MAAM+P,GAActP,EAAIR,CAAI,EACxC,OAAAQ,EAAG,YAAYV,EAAAA,MAAM,KAAK,sBAAuB7E,CAAE,EAAG,UAAW8E,CAAG,EACpE,MAAMS,EAAG,OAAO,EACT,MAAMk7B,qBAAmB37B,CAAG,CAAA,CACpC,EACK,aAAA,KAAK,gBAAgB,aAAa,EACjCd,CAAA,CAIT,MAAa,eACXI,EACAW,EACAsK,EACe,CACf,MAAM4F,GAAoB,KAAK,GAAI7Q,EAAKiL,EAAQ,MAAOvK,GAAQ,CAC7DA,EAAI,QAAQC,CAAI,CAAA,CACjB,EACK,MAAA,KAAK,gBAAgB,aAAa,CAAA,CAK1C,MAAa,cAAc/E,EAA2B,CACpD,MAAM,KAAK,GAAG,YAAY,kBAAmB,MAAOuF,GAAO,CACzDA,EAAG,YAAYV,EAAA,MAAM,KAAK,sBAAuB7E,CAAE,CAAC,EACpD,MAAMuF,EAAG,OAAO,CAAA,CACjB,EACK,MAAA,KAAK,gBAAgB,aAAa,CAAA,CAS1C,MAAc,sBAAsBvF,EAAiC,CACnE,OAAO,MAAM,KAAK,GAAG,WAAW,4BAA6B,MAAOuF,GAAO,CACnE,MAAAnB,GAAO,MAAMmB,EAAG,SAASV,QAAM,KAAK,sBAAuB7E,CAAE,CAAC,GAAG,MACvE,GAAIiU,mBAAiB7P,CAAG,EAAS,MAAA,IAAI,MAAM,oCAAoC,EACxE,OAAAA,CAAA,CACR,CAAA,CAGH,MAAc,iBAAiBpE,EAA8C,CAC3E,OAAI,OAAOA,GAAO,SAAiB,MAAM,KAAK,sBAAsBA,CAAE,EAC1DA,CAAA,CAId,MAAa,YAAYA,EAAyB,CAChD,MAAMoE,EAAM,MAAM,KAAK,iBAAiBpE,CAAE,EACtC,GAAA,KAAK,oBAAoB,IAAIoE,CAAG,QAAS,IAAI,MAAM,WAAWA,CAAG,iBAAiB,EACjF,KAAA,oBAAoB,IAAIA,EAAK,MAAM+hB,GAAQ,KAAK,KAAK,IAAK/hB,CAAG,CAAC,EAC9D,KAAA,mBAAmB,SAAS,CAAC,GAAG,KAAK,oBAAoB,KAAA,CAAM,CAAC,CAAA,CAIvE,MAAa,aAAaA,EAAgC,CACxD,MAAMU,EAAM,KAAK,oBAAoB,IAAIV,CAAG,EAC5C,GAAIU,IAAQ,OAAW,MAAM,IAAI,MAAM,WAAWV,CAAG,kCAAkC,EAClF,KAAA,oBAAoB,OAAOA,CAAG,EACnC,MAAMU,EAAI,QAAQ,EACb,KAAA,mBAAmB,SAAS,CAAC,GAAG,KAAK,oBAAoB,KAAA,CAAM,CAAC,CAAA,CAKhE,iBAAiBV,EAA0B,CAChD,MAAMU,EAAM,KAAK,oBAAoB,IAAIV,CAAG,EAC5C,GAAIU,IAAQ,OAAW,MAAM,IAAI,MAAM,WAAWV,CAAG,kCAAkC,EAChF,OAAAU,CAAA,CAMT,MAAa,OAAQ,CACnB,MAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,oBAAoB,QAAQ,EAAE,IAAKA,GAAQA,EAAI,QAAS,CAAA,CAAC,EAE9E,MAAA,KAAK,gBAAgB,UAAU,EAC/B,MAAA,KAAK,IAAI,oBAAoB,QAAQ,EACrC,MAAA,KAAK,GAAG,MAAM,CAAA,CAItB,MAAa,0BAA2B,CACtC,MAAM,KAAK,MAAM,CAAA,CAKnB,OAAc,qBAA8B,CAC1C,OAAO+5B,EAAAA,iBAAiB,eAAe,CAAA,CAIzC,aAAoB,KAClB16B,EACAw6B,EACAC,EACsB,CACtB,MAAMvjB,EAAsB,CAC1B,GAAGsM,GACH,GAAGC,GAA2B+W,CAAO,EACrC,GAAGC,CACL,EAEIvjB,EAAA,mBAAmB,QAAU2f,EAAgB,EAAA,aAEjD,MAAM0F,EAAW,MAAMv8B,EAAG,YAAY,mBAAoB,MAAOoB,GAAO,CACtE,MAAMo7B,EAAgB97B,EAAA,MAAMU,EAAG,WAAY1B,EAAa,EACrD0B,EAAA,YAAYo7B,EAAe,SAAS,EACvC,MAAMC,EAAoB,MAAMr7B,EAAG,SAASo7B,CAAa,EACrD,GAAA1sB,EAAA,iBAAiB2sB,EAAkB,KAAK,EAAG,CACvCF,MAAAA,EAAWn7B,EAAG,gBAAgBzB,EAAoB,EACxD,OAAAyB,EAAG,KAAKm7B,CAAQ,EAEbn7B,EAAA,SAASo7B,EAAeD,CAAQ,EAEnC,MAAMn7B,EAAG,OAAO,EAET,MAAMm7B,EAAS,QAAA,KAEtB,QAAOE,EAAkB,KAC3B,CACD,EAEK9G,EAASze,EAAI,OAEb8kB,EAAY,MAAMzB,GAAcv6B,EAAIw6B,EAAStjB,CAAG,EAGhDwlB,EAAsB,IAAIC,cAAW38B,EAAG,eAAgB,CAC5D,WAAY,IACZ,WAAY,CAAA,CACb,EAEKqG,EAAqB,IAAIjJ,GAAmBs/B,CAAmB,EAE/DE,EAAa,IAAIx2B,GACrBC,EACA21B,EAAU,OACVU,CACF,EAEMG,EAAyB,IAAIC,GAAA,kBACjCnH,EACA31B,EAAG,eACHkX,EAAI,oBACN,EAEM/W,EAA8B,CAClC,GAAAH,EACA,OAAQg8B,EAAU,OAClB,OAAArG,EACA,eAAgB31B,EAAG,eACnB,oBAAA08B,EACA,IAAAxlB,EACA,WAAA0lB,EACA,uBAAAC,EACA,UAAAb,EACA,mBAAoB,IAAIxG,GAAmBnvB,EAAoBsvB,EAAQ,CACrE,SAAUze,EAAI,8BACd,KAAMwlB,EACN,uBAAwBxlB,EAAI,sBAAA,CAC7B,EACD,QAAS,MAAM6lB,GAAW,WAAA,CAC5B,EAEM78B,EAAiB,IAAI88B,EAA6B,eAAA,EAAE,EACpDC,EAAgB,MAAMl9B,GAAkBC,EAAIu8B,EAAUr8B,EAAgBC,CAAG,EAE/E,OAAO,IAAI47B,GACT57B,EACA67B,EACAA,EAAU,OACVO,EACAr8B,EACA+8B,EAAc,KACd52B,EACA42B,EAAc,UAChB,CAAA,CAEJ,CCvNA,MAAMC,GAAyB,CAC7B,wBACA,0BACA,yBACA,uBACA,0BAEA,4BACA,8BACA,0BACA,6BAEA,sBACA,wBACA,sBAEA,sBACA,sBACA,yBACA,sBACA,4BACA,4BACA,+BACA,yBACF,EAKA,eAAsBC,GACpBC,EACAC,EAA2C,GAC1B,CACjB,MAAMnmB,EAAwB,CAC5B,oBAAqB,IACrB,cAAe,IACf,kBAAmB,GAEnB,cAAe,IAEf,wBAAyB,IACzB,2BAA4B,EAE5B,iBAAkB,iCAClB,mBAAoB,oCACpB,kBAAmB,mBACnB,YAAa,kDAEb,wBAAyB,IACzB,gCAAiC,EACjC,iBACE,mFAEF,UAAW,IAEX,GAAGmmB,CACL,EAEMC,EAAoB,CAAC,EAEdJ,GAAA,QAASK,GAAU,CACJtgC,WAAQsgC,CAAK,EACrB,UAAWxF,GAAiB,OAC5C,MAAMyF,EAAY,IAAI,KAAK,EAAE,YAAY,GACrCtgC,EAAA66B,GAAA,YAAAA,EAAS,WAAT,MAAA76B,EAAmB,UACb66B,EAAA,SAAS,QAAUA,EAAQ,SAAS,QAAQ,IAAK,GAAW,EAAE,SAAA,CAAU,GAEvEuF,EAAA,KACT,KAAK,UAAU,CACb,UAAAE,EACA,MAAAD,EACA,KAAMxF,CACP,CAAA,CACH,CAAA,CACD,CAAA,CACF,EAED,MAAM0F,EAAyB,CAC7B,QAAS,CAAC,EACV,4BAA6B,CAAC,EAC9B,8BAA+B,CAAC,EAChC,sBAAuB,CAAC,EACxB,wBAAyB,CAAC,EAE1B,oBAAqB,CAAA,CACvB,EAEMC,EAAWC,EAAAA,kBAAkBP,EAAe,CAAE,sBAAuBlmB,EAAI,cAAe,EAE9FumB,EAAO,QAAU,MAAMG,GAAY1mB,EAAI,oBAAqBA,EAAI,kBAAmB,SAAY,CAEvF,MAAA3G,EAAW,MADA,IAAIstB,EAAA,wBAAwBH,CAAQ,EACrB,KAAK,EAC9B,OAAA,KAAK,UAAUntB,CAAQ,EAAE,MAAM,EAAG2G,EAAI,SAAS,EAAI,KAAA,CAC3D,EAGK,MAAA4mB,EADW,IAAID,EAAA,wBAAwBH,CAAQ,EACzB,GAAG,eAE/B,OAAAD,EAAO,4BAA8B,MAAMG,GACzC1mB,EAAI,wBACJA,EAAI,2BACJ,SACE,MAAM6mB,GAAW,IAAI,IAAI7mB,EAAI,kBAAmBA,EAAI,gBAAgB,EAAGA,EAAK4mB,CAAU,CAC1F,EAEAL,EAAO,8BAAgC,MAAMG,GAC3C1mB,EAAI,wBACJA,EAAI,2BACJ,SACE,MAAM6mB,GAAW,IAAI,IAAI7mB,EAAI,kBAAmBA,EAAI,kBAAkB,EAAGA,EAAK4mB,CAAU,CAC5F,EAEAL,EAAO,sBAAwB,MAAMG,GACnC1mB,EAAI,wBACJA,EAAI,2BACJ,SAAY,MAAM6mB,GAAW,IAAI,IAAI7mB,EAAI,YAAaA,EAAI,gBAAgB,EAAGA,EAAK4mB,CAAU,CAC9F,EAEAL,EAAO,wBAA0B,MAAMG,GACrC1mB,EAAI,wBACJA,EAAI,2BACJ,SAAY,MAAM6mB,GAAW,IAAI,IAAI7mB,EAAI,YAAaA,EAAI,kBAAkB,EAAGA,EAAK4mB,CAAU,CAChG,EAEAL,EAAO,oBAAsB,MAAMG,GACjC1mB,EAAI,wBACJA,EAAI,gCACJ,SAAY,MAAM6mB,GAAW7mB,EAAI,iBAAkBA,EAAK4mB,CAAU,CACpE,EAEOE,GAAgBP,EAAQL,EAAelmB,EAAKomB,CAAU,CAC/D,CAIA,eAAeM,GACbK,EACAC,EACAC,EAC6B,CAC7B,MAAMC,EAAaC,GAAM,EACnBC,EAA8B,CAAC,EAE9B,KAAAzvB,GAAQuvB,CAAU,EAAIH,GAAqB,CAChD,MAAMM,EAAYF,GAAM,EACpB,IAAA9tB,EACA,GAAA,CACFA,EAAW,CAAE,GAAI,GAAM,MAAO,MAAM4tB,GAAO,QACpCjiC,EAAG,CACVqU,EAAW,CAAE,GAAI,GAAO,MAAOrU,CAAE,CAAA,CAE7B,MAAAsiC,EAAc3vB,GAAQ0vB,CAAS,EAErCD,EAAQ,KAAK,CACX,UAAWE,EACX,SAAAjuB,CAAA,CACD,EAEK,MAAAkuB,EAAoB,IAAOP,EAAoBM,EAEjDC,EAAoB,GAAS,MAAAvc,GAAAA,WAAWuc,CAAiB,CAAA,CAGxD,OAAAH,CACT,CAEA,eAAeP,GAAWzgC,EAAmB4Z,EAAuB4mB,EAAwB,CAC1F,KAAM,CAAE,KAAMY,EAAS,WAAAC,GAAe,MAAMjlC,WAAQ4D,EAAK,CACvD,WAAYwgC,EACZ,eAAgB5mB,EAAI,cACpB,YAAaA,EAAI,aAAA,CAClB,EACKinB,EAAO,MAAMO,EAAQ,KAAK,EAEzB,MAAA,CACL,WAAAC,EACA,gBAAiBR,EAAK,MAAM,EAAGjnB,EAAI,SAAS,EAAI,KAClD,CACF,CAEA,SAAS8mB,GACPP,EACAmB,EACAC,EACAvB,EACQ,CACF,MAAAwB,EAAerB,EAAO,QAAQ,OAAQz8B,GAAMA,EAAE,SAAS,EAAE,EACzD+9B,EAActB,EAAO,QAAQ,OAAQz8B,GAAM,CAACA,EAAE,SAAS,EAAE,EACzDg+B,EAAqB,CACzB,GAAG,IAAI,IAAIF,EAAa,IAAK99B,GAAM,KAAK,UAAWA,EAAE,SAAiB,KAAK,CAAC,CAAC,CAC/E,EAEO,MAAA;AAAA;AAAA,eAEM49B,CAAU;AAAA,WACd,KAAK,UAAUC,EAAM,KAAM,CAAC,CAAC;AAAA;AAAA,mBAErBI,GAAexB,EAAO,OAAO,CAAC;AAAA;AAAA,qCAEZwB,GAAexB,EAAO,2BAA2B,CAAC;AAAA;AAAA,wCAE/CwB,GAAexB,EAAO,6BAA6B,CAAC;AAAA;AAAA,+BAE7DwB,GAAexB,EAAO,qBAAqB,CAAC;AAAA;AAAA,kCAEzCwB,GAAexB,EAAO,uBAAuB,CAAC;AAAA;AAAA,6BAEnDwB,GAAexB,EAAO,mBAAmB,CAAC;AAAA;AAAA;AAAA,EAGrE,KAAK,UAAUA,EAAO,4BAA6B,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAG3D,KAAK,UAAUA,EAAO,8BAA+B,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAG7D,KAAK,UAAUA,EAAO,sBAAuB,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAGrD,KAAK,UAAUA,EAAO,wBAAyB,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAGvD,KAAK,UAAUA,EAAO,oBAAqB,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAGnD,KAAK,UAAUsB,EAAa,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAGpC,KAAK,UAAUC,EAAoB,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAG3C1B,EAAW,KAAK;AAAA,CAAI,CAAC;AAAA,CAEvB,CAEA,SAAS2B,GAAkBxB,EAAoC,CAC7D,MAAMyB,EAAYzB,EAAO,OAAQ/0B,GAAMA,EAAE,SAAS,EAAE,EAC9C,CAAE,KAAAy2B,EAAY,OAAAC,GAAmBC,GAAY5B,CAAM,EAElD,MAAA;AAAA,SACAA,EAAO,MAAM;AAAA,aACTyB,EAAU,MAAM;AAAA,UACnBzB,EAAO,OAASyB,EAAU,MAAM;AAAA,cAC5BC,CAAI;AAAA,gBACFC,CAAM;AAAA,CAEtB,CAEA,SAASC,GAAYf,EAAkC,CACrD,MAAMgB,EAAShB,EAAQ,IAAKt9B,GAAMA,EAAE,SAAS,EACvCm+B,EAAOG,EAAO,OAAO,CAACC,EAAKv+B,IAAMu+B,EAAMv+B,CAAC,EAAIs+B,EAAO,OAEzD,IAAIF,EACA,GAAAE,EAAO,OAAS,EAAG,CACrB,MAAME,EAAM,KAAK,MAAMF,EAAO,OAAS,CAAC,EACxCF,EAASE,EAAO,OAAS,EAAIA,EAAOE,CAAG,GAAKF,EAAOE,EAAM,CAAC,EAAIF,EAAOE,CAAG,GAAK,CAAA,CAGxE,MAAA,CAAE,KAAAL,EAAM,OAAAC,CAAO,CACxB,CAEA,SAASf,IAAgB,CACvB,OAAO,KAAK,IAAI,CAClB,CAEA,SAASxvB,GAAQ4wB,EAAyB,CACxC,OAAOpB,GAAU,EAAAoB,CACnB","x_google_ignoreList":[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82]}