@acorex-platform/module-platform-dev-tools-client 0.0.58 → 0.0.59

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.
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-platform-dev-tools-client.mjs","sources":["../../../../libs/modules/platform-dev-tools/client/src/lib/permission-definition.provider.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/settings.provider.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-tree.model.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-route.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-data.service.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-module-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-module-detail.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-plugin-fields.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-json.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-actions.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-property-details.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-detail.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-catalog-io.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-catalog-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-catalog-detail.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-graph.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entities-graph.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entities-graph.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-page.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-page.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-list-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/platform-dev-tools.module.ts","../../../../libs/modules/platform-dev-tools/client/src/acorex-platform-module-platform-dev-tools-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport {\n AXPPermissionDefinitionProvider,\n AXPPermissionDefinitionProviderContext,\n} from '@acorex-platform/framework-client/auth';\nimport {\n AXPCommonPermissionGroupKeys\n} from '@acorex-platform/module-common-client/contracts';\nimport {\n AXPApplicationsPlatformPermissionKeys\n} from '@acorex-platform/module-platform-dev-tools-client/contracts';\n\nimport { Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ---- Permission Definition Provider ----\n\n/**\n * Registers UseDevTools under Applications & Platform.\n */\n@Injectable()\nexport class AXMPermissionDefinitionProvider implements AXPPermissionDefinitionProvider {\n async define(context: AXPPermissionDefinitionProviderContext): Promise<void> {\n const keys = AXPApplicationsPlatformPermissionKeys;\n const groups = AXPCommonPermissionGroupKeys;\n const P = '@common:applications-platform.permissions';\n const G = '@common:permission-groups';\n\n context.addGroup(groups.ApplicationsPlatform.Root, `${G}.applications-platform.title`, `${G}.applications-platform.description`, { order: 110 });\n\n context\n .addGroup(\n groups.ApplicationsPlatform.DevTools,\n `${G}.applications-platform-dev-tools.title`,\n `${G}.applications-platform-dev-tools.description`,\n { parent: groups.ApplicationsPlatform.Root, order: 40 },\n )\n .addPermission(keys.UseDevTools, `${P}.use-dev-tools.title`, `${P}.use-dev-tools.description`, {\n modules: ['PlatformDevTools'],\n requiredFeatures: ['PlatformDevTools'],\n })\n .endPermission()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport {\n AXPPlatformDevToolsSettings,\n AXP_PLATFORM_DEV_TOOLS_COMMUNICATION_DEBUG_REDIRECT_SECTION,\n} from '@acorex-platform/module-platform-dev-tools-client/contracts';\n\n//#endregion\n\n//#region ---- Setting Provider ----\n\n/**\n * Defines settings for Platform Dev Tools (developer-oriented options).\n */\nexport class AXPPlatformDevToolsSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n context\n .addGroup(\n 'platform-dev-tools',\n '@platform-dev-tools:settings.group.nav-title',\n '@platform-dev-tools:settings.group.description',\n 'fa-light fa-wrench',\n '@platform-dev-tools:settings.group.title',\n 999,\n )\n .addSection(\n 'developer',\n '@platform-dev-tools:settings.developer.title',\n '@platform-dev-tools:settings.developer.description',\n )\n .addSetting({\n key: AXPPlatformDevToolsSettings.DebugMode,\n title: '@platform-dev-tools:settings.developer.items.debug-mode.title',\n description: '@platform-dev-tools:settings.developer.items.debug-mode.description',\n scope: 'P',\n overridableAt: [],\n // Platform-only developer switch (same pattern as System Insight / Auth).\n isInherited: false,\n defaultValue: false,\n widget: {\n type: AXPWidgetsList.Editors.ToggleSwitch,\n },\n })\n .endSection()\n .addSection(\n AXP_PLATFORM_DEV_TOOLS_COMMUNICATION_DEBUG_REDIRECT_SECTION,\n '@platform-dev-tools:settings.communication-debug-redirect.title',\n '@platform-dev-tools:settings.communication-debug-redirect.description',\n )\n .endSection()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ----- Tree node types -----\n\nexport type PlatformExplorerNodeKind =\n | 'type-group'\n | 'module'\n | 'diagram'\n | 'entities'\n | 'entity'\n | 'commands'\n | 'command'\n | 'queries'\n | 'query'\n | 'plugins'\n | 'plugin'\n | 'widgets'\n | 'widget';\n\nexport interface PlatformExplorerTreeNode {\n id: string;\n kind: PlatformExplorerNodeKind;\n label: string;\n moduleName?: string;\n moduleTitle?: string;\n icon?: string;\n itemCount?: number;\n /** Top rule before a type-group header that is not the first visible group. */\n divided?: boolean;\n payload?: unknown;\n}\n\n//#endregion\n","import type { ParamMap, Params } from '@angular/router';\n\nimport type { PlatformExplorerNodeKind, PlatformExplorerTreeNode } from './platform-explorer-tree.model';\n\n//#region ----- Types -----\n\nexport type ExplorerPageKind = 'module' | 'diagram' | 'entity' | 'command' | 'query' | 'plugin' | 'widget';\n\nexport interface ExplorerRouteState {\n module?: string;\n kind?: ExplorerPageKind;\n name?: string;\n search?: string;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nexport const EXPLORER_QUERY_MODULE = 'module';\nexport const EXPLORER_QUERY_KIND = 'kind';\nexport const EXPLORER_QUERY_NAME = 'name';\nexport const EXPLORER_QUERY_SEARCH = 'q';\n\nconst FOLDER_KINDS = new Set<PlatformExplorerNodeKind>(['entities', 'commands', 'queries', 'plugins', 'widgets']);\nconst PAGE_KINDS = new Set<ExplorerPageKind>([\n 'module',\n 'diagram',\n 'entity',\n 'command',\n 'query',\n 'plugin',\n 'widget',\n]);\n\n//#endregion\n\n//#region ----- Kind helpers -----\n\nexport function isExplorerFolderKind(kind: PlatformExplorerNodeKind | undefined): boolean {\n return !!kind && FOLDER_KINDS.has(kind);\n}\n\nexport function isExplorerPageKind(kind: string | undefined): kind is ExplorerPageKind {\n return !!kind && PAGE_KINDS.has(kind as ExplorerPageKind);\n}\n\nexport function catalogFolderKind(\n kind: Extract<ExplorerPageKind, 'entity' | 'command' | 'query' | 'plugin' | 'widget'>,\n): 'entities' | 'commands' | 'queries' | 'plugins' | 'widgets' {\n switch (kind) {\n case 'entity':\n return 'entities';\n case 'command':\n return 'commands';\n case 'query':\n return 'queries';\n case 'plugin':\n return 'plugins';\n case 'widget':\n return 'widgets';\n }\n}\n\n//#endregion\n\n//#region ----- Query params -----\n\nfunction param(map: ParamMap, key: string): string | undefined {\n const value = map.get(key)?.trim();\n return value || undefined;\n}\n\nexport function explorerStateFromQuery(map: ParamMap): ExplorerRouteState {\n const module = param(map, EXPLORER_QUERY_MODULE);\n const rawKind = param(map, EXPLORER_QUERY_KIND);\n const kind = rawKind === 'entities' ? 'diagram' : rawKind;\n return {\n ...(module ? { module } : {}),\n ...(isExplorerPageKind(kind) ? { kind } : {}),\n ...(param(map, EXPLORER_QUERY_NAME) ? { name: param(map, EXPLORER_QUERY_NAME) } : {}),\n ...(param(map, EXPLORER_QUERY_SEARCH) ? { search: param(map, EXPLORER_QUERY_SEARCH) } : {}),\n };\n}\n\nexport function queryParamsFromExplorer(\n node: PlatformExplorerTreeNode | null,\n search: string,\n): Params {\n const q = search.trim();\n const params: Params = {\n [EXPLORER_QUERY_MODULE]: null,\n [EXPLORER_QUERY_KIND]: null,\n [EXPLORER_QUERY_NAME]: null,\n [EXPLORER_QUERY_SEARCH]: q || null,\n };\n if (!node || node.kind === 'type-group' || isExplorerFolderKind(node.kind)) {\n return params;\n }\n if (node.moduleName) {\n params[EXPLORER_QUERY_MODULE] = node.moduleName;\n }\n if (node.kind === 'module') {\n return params;\n }\n if (node.kind === 'diagram') {\n params[EXPLORER_QUERY_KIND] = 'diagram';\n return params;\n }\n if (\n node.kind === 'entity' ||\n node.kind === 'command' ||\n node.kind === 'query' ||\n node.kind === 'plugin' ||\n node.kind === 'widget'\n ) {\n params[EXPLORER_QUERY_KIND] = node.kind;\n const payload = node.payload as { name?: unknown; fullName?: unknown } | undefined;\n const name =\n String(payload?.name ?? '').trim() ||\n String(payload?.fullName ?? '').trim() ||\n node.label;\n params[EXPLORER_QUERY_NAME] = name;\n }\n return params;\n}\n\nexport function explorerNodeId(moduleName: string, kind: ExplorerPageKind, name?: string): string {\n if (kind === 'module') {\n return `module-${moduleName}`;\n }\n if (kind === 'diagram') {\n return `module-${moduleName}-diagram`;\n }\n return `${kind}-${name ?? ''}`;\n}\n\nexport function explorerRevealIds(node: PlatformExplorerTreeNode): string[] {\n const moduleName = node.moduleName;\n if (!moduleName) {\n return [node.id];\n }\n const ids = [`module-${moduleName}`];\n if (\n node.kind === 'entity' ||\n node.kind === 'command' ||\n node.kind === 'query' ||\n node.kind === 'plugin' ||\n node.kind === 'widget'\n ) {\n ids.push(`module-${moduleName}-${catalogFolderKind(node.kind)}`);\n }\n if (node.kind !== 'module') {\n ids.push(node.id);\n }\n return ids;\n}\n\nexport function sameExplorerNode(\n left: PlatformExplorerTreeNode | null,\n right: PlatformExplorerTreeNode | null,\n): boolean {\n return left?.id === right?.id;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { inject, Injectable, signal } from '@angular/core';\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { AXPModuleManifestRegistry } from '@acorex-platform/framework-client/core';\nimport {\n AXP_MODULE_TYPE,\n resolveModuleType,\n runtimeQueryPayloadData,\n type AXPModuleManifest,\n type AXPModuleType,\n} from '@acorex-platform/framework-shared/core';\nimport {\n AXMPlatformExplorerQueryKeys,\n type AXMPlatformExplorerCatalogItem,\n type AXMPlatformExplorerCatalogKind,\n type AXMPlatformExplorerEntityDetail,\n type AXMPlatformExplorerGetCatalogItemInput,\n type AXMPlatformExplorerGetEntityInput,\n type AXMPlatformExplorerGetModuleInput,\n type AXMPlatformExplorerListModulesInput,\n type AXMPlatformExplorerModuleCatalog,\n type AXMPlatformExplorerModuleListResult,\n type AXMPlatformExplorerModuleSummary,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\nimport type { PlatformExplorerTreeNode } from './platform-explorer-tree.model';\nimport { catalogFolderKind, type ExplorerRouteState } from './platform-explorer-route.util';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface PlatformExplorerEntityTab {\n id: string;\n textKey: string;\n extraText?: string;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable()\nexport class PlatformExplorerDataService {\n private readonly queryService = inject(AXPQueryService);\n private readonly manifestRegistry = inject(AXPModuleManifestRegistry, { optional: true });\n\n private moduleCache = new Map<string, AXMPlatformExplorerModuleCatalog>();\n\n readonly entityTabs = signal<PlatformExplorerEntityTab[]>([]);\n readonly activeEntitySection = signal('properties');\n\n clearCache(): void {\n this.moduleCache.clear();\n }\n\n setEntityTabs(tabs: PlatformExplorerEntityTab[]): void {\n this.entityTabs.set(tabs);\n }\n\n selectEntitySection(section: string): void {\n this.activeEntitySection.set(section);\n }\n\n clearEntityTabs(): void {\n this.entityTabs.set([]);\n this.activeEntitySection.set('properties');\n }\n\n async listModules(search?: string): Promise<AXMPlatformExplorerModuleSummary[]> {\n const result = await this.queryService.fetch<\n AXMPlatformExplorerListModulesInput,\n AXMPlatformExplorerModuleListResult\n >(AXMPlatformExplorerQueryKeys.ListModules, { search: search?.trim() || undefined });\n return runtimeQueryPayloadData(result)?.items ?? [];\n }\n\n async getModule(moduleName: string): Promise<AXMPlatformExplorerModuleCatalog | null> {\n const name = moduleName.trim();\n const cached = this.moduleCache.get(name);\n if (cached) {\n return cached;\n }\n const result = await this.queryService.fetch<\n AXMPlatformExplorerGetModuleInput,\n AXMPlatformExplorerModuleCatalog | null\n >(AXMPlatformExplorerQueryKeys.GetModule, { module: name });\n const catalog = runtimeQueryPayloadData(result) ?? null;\n if (catalog) {\n this.moduleCache.set(name, catalog);\n }\n return catalog;\n }\n\n async getEntity(moduleName: string, entityName: string): Promise<AXMPlatformExplorerEntityDetail | null> {\n const result = await this.queryService.fetch<\n AXMPlatformExplorerGetEntityInput,\n AXMPlatformExplorerEntityDetail | null\n >(AXMPlatformExplorerQueryKeys.GetEntity, { module: moduleName, entity: entityName });\n return runtimeQueryPayloadData(result) ?? null;\n }\n\n async getCatalogItem(\n kind: AXMPlatformExplorerCatalogKind,\n name: string,\n ): Promise<AXMPlatformExplorerCatalogItem | null> {\n const result = await this.queryService.fetch<\n AXMPlatformExplorerGetCatalogItemInput,\n AXMPlatformExplorerCatalogItem | null\n >(AXMPlatformExplorerQueryKeys.GetCatalogItem, { kind, name });\n return runtimeQueryPayloadData(result) ?? null;\n }\n\n getManifest(moduleName: string): AXPModuleManifest | undefined {\n return this.manifestRegistry?.get(moduleName);\n }\n\n moduleTitle(moduleName: string): string {\n return this.getManifest(moduleName)?.title ?? moduleName;\n }\n\n moduleIcon(moduleName: string): string {\n return this.getManifest(moduleName)?.icon || 'fa-light fa-cube';\n }\n\n async resolveExplorerSelection(\n state: ExplorerRouteState,\n moduleNodes: PlatformExplorerTreeNode[],\n ): Promise<PlatformExplorerTreeNode | null> {\n const moduleName = state.module?.trim();\n if (!moduleName) {\n return null;\n }\n const moduleNode = moduleNodes.find((node) => node.kind === 'module' && node.moduleName === moduleName);\n if (!moduleNode) {\n return null;\n }\n const kind = state.kind;\n if (!kind || kind === 'module') {\n return moduleNode;\n }\n const title = this.moduleTitle(moduleName);\n if (kind === 'diagram') {\n const catalog = await this.getModule(moduleName);\n if (!catalog?.entities.length) {\n return moduleNode;\n }\n return {\n id: `module-${moduleName}-diagram`,\n kind: 'diagram',\n label: '@platform-dev-tools:module.terms.diagram',\n moduleName,\n moduleTitle: title,\n };\n }\n const name = state.name?.trim();\n if (!name) {\n return moduleNode;\n }\n const children = await this.getCategoryChildren(moduleName, catalogFolderKind(kind));\n return (\n children.find((node) => {\n const payload = node.payload as { name?: unknown; fullName?: unknown } | undefined;\n return (\n node.id === `${kind}-${name}` ||\n String(payload?.name ?? '') === name ||\n String(payload?.fullName ?? '') === name\n );\n }) ?? moduleNode\n );\n }\n\n toModuleTreeNodes(modules: AXMPlatformExplorerModuleSummary[]): PlatformExplorerTreeNode[] {\n const buckets = new Map<AXPModuleType, AXMPlatformExplorerModuleSummary[]>();\n for (const type of Object.values(AXP_MODULE_TYPE)) {\n buckets.set(type, []);\n }\n for (const mod of modules) {\n const manifest = this.getManifest(mod.name);\n const type = resolveModuleType({\n name: mod.name,\n type: manifest?.type,\n required: manifest?.required,\n });\n const list = buckets.get(type) ?? [];\n list.push(mod);\n buckets.set(type, list);\n }\n\n const nodes: PlatformExplorerTreeNode[] = [];\n let firstGroup = true;\n for (const type of Object.values(AXP_MODULE_TYPE)) {\n const list = [...(buckets.get(type) ?? [])].sort((a, b) =>\n this.moduleTitle(a.name).localeCompare(this.moduleTitle(b.name), undefined, { sensitivity: 'base' }),\n );\n if (list.length === 0) {\n continue;\n }\n nodes.push({\n id: `type-group-${type}`,\n kind: 'type-group',\n label: `@application-management:editions.modules-editor.types.${type}`,\n divided: !firstGroup,\n });\n firstGroup = false;\n for (const mod of list) {\n nodes.push(this.toModuleNode(mod));\n }\n }\n return nodes;\n }\n\n private toModuleNode(mod: AXMPlatformExplorerModuleSummary): PlatformExplorerTreeNode {\n return {\n id: `module-${mod.name}`,\n kind: 'module',\n label: this.moduleTitle(mod.name),\n moduleName: mod.name,\n moduleTitle: this.moduleTitle(mod.name),\n icon: this.moduleIcon(mod.name),\n itemCount: mod.categoryCount + (mod.entityCount > 0 ? 1 : 0),\n payload: mod,\n };\n }\n\n async getModuleChildren(moduleName: string): Promise<PlatformExplorerTreeNode[]> {\n const catalog = await this.getModule(moduleName);\n if (!catalog) {\n return [];\n }\n const title = this.moduleTitle(moduleName);\n const nodes: PlatformExplorerTreeNode[] = [];\n if (catalog.entities.length > 0) {\n nodes.push({\n id: `module-${moduleName}-diagram`,\n kind: 'diagram',\n label: '@platform-dev-tools:module.terms.diagram',\n moduleName,\n moduleTitle: title,\n });\n }\n this.pushCategory(nodes, moduleName, title, 'entities', catalog.entities.length);\n this.pushCategory(nodes, moduleName, title, 'commands', catalog.commands.length);\n this.pushCategory(nodes, moduleName, title, 'queries', catalog.queries.length);\n this.pushCategory(nodes, moduleName, title, 'plugins', catalog.plugins.length);\n this.pushCategory(nodes, moduleName, title, 'widgets', catalog.widgets.length);\n return nodes;\n }\n\n async getCategoryChildren(moduleName: string, kind: PlatformExplorerTreeNode['kind']): Promise<PlatformExplorerTreeNode[]> {\n const catalog = await this.getModule(moduleName);\n if (!catalog) {\n return [];\n }\n const title = this.moduleTitle(moduleName);\n switch (kind) {\n case 'entities':\n return catalog.entities.map((item) => ({\n id: `entity-${item.fullName}`,\n kind: 'entity' as const,\n label: item.name,\n moduleName,\n moduleTitle: title,\n icon: item.icon,\n payload: item,\n }));\n case 'commands':\n return catalog.commands.map((item) =>\n this.namedNode('command', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n case 'queries':\n return catalog.queries.map((item) =>\n this.namedNode('query', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n case 'plugins':\n return catalog.plugins.map((item) =>\n this.namedNode('plugin', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n case 'widgets':\n return catalog.widgets.map((item) =>\n this.namedNode('widget', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n default:\n return [];\n }\n }\n\n private pushCategory(\n nodes: PlatformExplorerTreeNode[],\n moduleName: string,\n moduleTitle: string,\n kind: 'entities' | 'commands' | 'queries' | 'plugins' | 'widgets',\n count: number,\n ): void {\n if (count <= 0) {\n return;\n }\n nodes.push({\n id: `module-${moduleName}-${kind}`,\n kind,\n label: `@platform-dev-tools:module.terms.${kind}`,\n moduleName,\n moduleTitle,\n itemCount: count,\n });\n }\n\n private namedNode(\n kind: 'command' | 'query' | 'plugin' | 'widget',\n name: string,\n label: string,\n moduleName: string,\n moduleTitle: string,\n payload: unknown,\n icon?: string,\n ): PlatformExplorerTreeNode {\n return {\n id: `${kind}-${name}`,\n kind,\n label,\n moduleName,\n moduleTitle,\n icon,\n payload,\n };\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport { AXBadgeModule } from '@acorex/components/badge';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport {\n resolveModuleDomain,\n resolveModuleType,\n type AXPModuleManifest,\n type AXPModuleType,\n} from '@acorex-platform/framework-shared/core';\nimport type { AXMPlatformExplorerModuleSummary } from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface ManifestDependencyView {\n name: string;\n title: string;\n}\n\ninterface ModuleManifestView {\n name: string;\n title: string;\n description?: string;\n icon: string;\n version: string;\n type: AXPModuleType;\n typeKey: string;\n domain: string;\n domainKey: string;\n i18n?: string;\n required: boolean;\n dependencies: ManifestDependencyView[];\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst TYPE_I18N = '@application-management:editions.modules-editor.types';\nconst DOMAIN_I18N = '@application-management:editions.modules-editor.domains';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-module-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXTranslationModule, AXBadgeModule],\n templateUrl: './platform-explorer-module-detail.component.html',\n})\nexport class AXPlatformExplorerModuleDetailComponent {\n payload = input<AXMPlatformExplorerModuleSummary | undefined>();\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n protected readonly view = computed<ModuleManifestView | null>(() => {\n const summary = this.payload();\n if (!summary) {\n return null;\n }\n const manifest = this.dataService.getManifest(summary.name);\n if (!manifest) {\n return null;\n }\n return this.toView(summary.name, manifest);\n });\n\n private toView(name: string, manifest: AXPModuleManifest): ModuleManifestView {\n const type = resolveModuleType(manifest);\n const domain = resolveModuleDomain(manifest);\n return {\n name,\n title: manifest.title || name,\n description: manifest.description,\n icon: manifest.icon || 'fa-light fa-cube',\n version: manifest.version,\n type,\n typeKey: `${TYPE_I18N}.${type}`,\n domain,\n domainKey: `${DOMAIN_I18N}.${domain}`,\n i18n: manifest.i18n,\n required: !!manifest.required,\n dependencies: (manifest.dependencies ?? []).map((dep) => ({\n name: dep,\n title: dep.includes('.') ? dep : this.dataService.moduleTitle(dep),\n })),\n };\n }\n}\n\n//#endregion\n","<div class=\"flex flex-col flex-1 min-h-0 overflow-auto\">\n <!-- ----- Module identity from client manifest ----- -->\n @if (payload(); as mod) {\n <section class=\"flex flex-col gap-5 p-4\">\n <!--->\n <!-- ----- Manifest header when the module is registered on the client ----- -->\n @if (view(); as info) {\n <div class=\"flex items-start gap-3\">\n <i class=\"text-2xl text-primary shrink-0 mt-0.5\" [ngClass]=\"info.icon\" aria-hidden=\"true\"></i>\n <div class=\"flex flex-col gap-1 min-w-0\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <h2 class=\"m-0 text-lg font-semibold\">{{ info.title | translate | async }}</h2>\n <ax-badge color=\"secondary\" [text]=\"info.version\"></ax-badge>\n <ax-badge color=\"primary\" [text]=\"(info.typeKey | translate | async) ?? info.type\"></ax-badge>\n <ax-badge [text]=\"(info.domainKey | translate | async) ?? info.domain\"></ax-badge>\n <!--->\n <!-- ----- Required modules cannot be disabled in editions ----- -->\n @if (info.required) {\n <ax-badge\n color=\"success\"\n [text]=\"('@platform-dev-tools:module.terms.required' | translate | async) ?? ''\"\n ></ax-badge>\n }\n </div>\n <!--->\n <!-- ----- Optional manifest description ----- -->\n @if (info.description) {\n <p class=\"m-0 text-sm text-muted\">{{ info.description | translate | async }}</p>\n }\n </div>\n </div>\n\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 m-0\">\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd class=\"m-0\"><code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ info.name }}</code></dd>\n <!--->\n <!-- ----- i18n scope from the module manifest ----- -->\n @if (info.i18n) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.i18n' | translate | async }}</dt>\n <dd class=\"m-0\"><code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ info.i18n }}</code></dd>\n }\n </dl>\n\n <div class=\"flex flex-col gap-2\">\n <div class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.dependencies' | translate | async }}</div>\n <!--->\n <!-- ----- Empty dependency list ----- -->\n @if (info.dependencies.length === 0) {\n <p class=\"m-0 text-sm text-muted\">{{ '@platform-dev-tools:module.messages.no-dependencies' | translate | async }}</p>\n }\n <!-- ----- Manifest dependency chips ----- -->\n @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (dep of info.dependencies; track dep.name) {\n <ax-badge [text]=\"(dep.title | translate | async) ?? dep.name\"></ax-badge>\n }\n </div>\n }\n </div>\n }\n <!-- ----- Catalog-only module with no client manifest ----- -->\n @else {\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 m-0\">\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd class=\"m-0\">{{ mod.name }}</dd>\n </dl>\n <p class=\"m-0 text-sm text-muted\">{{ '@platform-dev-tools:module.messages.no-manifest' | translate | async }}</p>\n }\n\n <div class=\"flex flex-wrap gap-2\">\n <ax-badge\n color=\"primary\"\n [text]=\"('@platform-dev-tools:module.badges.entities' | translate: { params: { count: mod.entityCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n color=\"success\"\n [text]=\"('@platform-dev-tools:module.badges.commands' | translate: { params: { count: mod.commandCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n color=\"primary\"\n [text]=\"('@platform-dev-tools:module.badges.queries' | translate: { params: { count: mod.queryCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n color=\"warning\"\n [text]=\"('@platform-dev-tools:module.badges.plugins' | translate: { params: { count: mod.pluginCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n [text]=\"('@platform-dev-tools:module.badges.widgets' | translate: { params: { count: mod.widgetCount } } | async) ?? ''\"\n ></ax-badge>\n </div>\n </section>\n }\n</div>\n","import type { AXPEntityPluginContributions } from '@acorex-platform/framework-shared/runtime';\nimport type { AXMPlatformExplorerResolvedPlugin } from '@acorex-platform/module-platform-management-client/contracts';\n\n//#region ----- Types -----\n\nexport interface ExplorerPluginFieldSource {\n name: string;\n title: string;\n}\n\n//#endregion\n\n//#region ----- Plugin contribution field names -----\n\nfunction isPlaceholderName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.startsWith('(from ') || trimmed.includes('options.fields[]');\n}\n\nfunction parseContributions(json: unknown): AXPEntityPluginContributions | null {\n if (json == null) {\n return null;\n }\n let parsed: unknown = json;\n if (typeof json === 'string') {\n const trimmed = json.trim();\n if (!trimmed) {\n return null;\n }\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return null;\n }\n }\n if (parsed == null || typeof parsed !== 'object') {\n return null;\n }\n return parsed as AXPEntityPluginContributions;\n}\n\nfunction optionString(options: unknown, key: string | undefined): string {\n if (!key || options == null || typeof options !== 'object') {\n return '';\n }\n const value = (options as Record<string, unknown>)[key];\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction contributedNames(plugin: AXMPlatformExplorerResolvedPlugin): string[] {\n const contributions = parseContributions(plugin.contributionsJson);\n const names = new Set<string>();\n const add = (name: string | undefined, nameFromOption?: string): void => {\n const fromOption = optionString(plugin.options, nameFromOption);\n const fieldName = fromOption || name?.trim() || '';\n if (fieldName && !isPlaceholderName(fieldName)) {\n names.add(fieldName);\n }\n };\n for (const property of contributions?.properties ?? []) {\n add(property.name, property.nameFromOption);\n }\n for (const column of contributions?.columns ?? []) {\n add(column.name, column.nameFromOption);\n }\n return [...names];\n}\n\n/**\n * Maps host property/column names to the plugin that contributed them.\n * First matching plugin wins when two plugins claim the same name.\n */\nexport function pluginSourceByFieldName(\n plugins: AXMPlatformExplorerResolvedPlugin[],\n): Map<string, ExplorerPluginFieldSource> {\n const map = new Map<string, ExplorerPluginFieldSource>();\n for (const plugin of plugins) {\n const source: ExplorerPluginFieldSource = {\n name: plugin.name,\n title: plugin.title || plugin.name,\n };\n for (const fieldName of contributedNames(plugin)) {\n if (!map.has(fieldName)) {\n map.set(fieldName, source);\n }\n }\n }\n return map;\n}\n\n//#endregion\n","//#region ----- Types -----\n\nexport interface FlatJsonPair {\n path: string;\n value: string;\n}\n\n//#endregion\n\n//#region ----- Flatten -----\n\nfunction formatLeaf(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction joinPath(prefix: string, key: string): string {\n return prefix ? `${prefix}.${key}` : key;\n}\n\nexport function flattenToPairs(value: unknown, prefix = ''): FlatJsonPair[] {\n if (value === undefined || typeof value === 'function') {\n return [];\n }\n if (value !== null && typeof value === 'object') {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return prefix ? [{ path: prefix, value: '[]' }] : [];\n }\n return value.flatMap((item, index) => flattenToPairs(item, joinPath(prefix, String(index))));\n }\n const entries = Object.entries(value as Record<string, unknown>).filter(\n ([, nested]) => nested !== undefined && typeof nested !== 'function',\n );\n if (entries.length === 0) {\n return prefix ? [{ path: prefix, value: '{}' }] : [];\n }\n return entries.flatMap(([key, nested]) => flattenToPairs(nested, joinPath(prefix, key)));\n }\n return [{ path: prefix, value: formatLeaf(value) }];\n}\n\nexport function flattenJsonText(json: string | undefined): FlatJsonPair[] {\n if (!json?.trim()) {\n return [];\n }\n try {\n return flattenToPairs(JSON.parse(json));\n } catch {\n return [{ path: '', value: json }];\n }\n}\n\n//#endregion\n","import type { AXPEntity, AXPEntityAction, AXPQueryView, AXPRelatedEntity } from '@acorex-platform/framework-shared/entity';\n\nimport { flattenToPairs, type FlatJsonPair } from './platform-explorer-json.util';\n\n//#region ----- Types -----\n\nexport type ExplorerLayoutKind = 'list' | 'record' | 'create' | 'update' | 'detail-list' | 'related';\n\nexport interface ExplorerActionView {\n id: string;\n name?: string;\n title?: string;\n commandName: string;\n type?: string;\n typeLabel: string;\n scope: string;\n priority: string;\n icon?: string;\n color?: string;\n shortcuts: string[];\n permissions: string[];\n hidden?: string;\n disabled?: string;\n isDefault: boolean;\n separated: boolean;\n order?: number;\n depth: number;\n optionsPairs: FlatJsonPair[];\n metadataPairs: FlatJsonPair[];\n submenuExpression?: string;\n}\n\nexport interface ExplorerActionScopeGroup {\n scope: string;\n actions: ExplorerActionView[];\n}\n\nexport interface ExplorerLayoutView {\n name: string;\n title?: string;\n}\n\nexport interface ExplorerLayoutSection {\n id: string;\n kind: ExplorerLayoutKind;\n relatedTitle?: string;\n relatedEntity?: string;\n relatedLayoutType?: string;\n layoutTitle?: string;\n layoutDescription?: string;\n views: ExplorerLayoutView[];\n groups: ExplorerActionScopeGroup[];\n actionCount: number;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst SCOPE_ORDER = ['typeLevel', 'selected', 'individual', 'section'];\n\n//#endregion\n\n//#region ----- Serialize -----\n\nfunction humanText(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed || trimmed.includes('{{')) {\n return undefined;\n }\n return trimmed;\n}\n\nfunction titleCaseType(type: string): string {\n return type\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\nfunction boolOrExpression(value: unknown): string | undefined {\n if (typeof value === 'boolean') {\n return value ? 'yes' : 'no';\n }\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n return undefined;\n}\n\nfunction asActions(value: unknown): AXPEntityAction[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((item): item is AXPEntityAction => !!item && typeof item === 'object');\n}\n\nfunction layoutActions(layout: unknown): AXPEntityAction[] {\n if (!layout || typeof layout !== 'object') {\n return [];\n }\n return asActions((layout as { actions?: unknown }).actions);\n}\n\nfunction resolveCommand(command: AXPEntityAction['command']): {\n name: string;\n optionsPairs: FlatJsonPair[];\n metadataPairs: FlatJsonPair[];\n} {\n if (typeof command === 'function') {\n return { name: 'function', optionsPairs: [], metadataPairs: [] };\n }\n if (typeof command === 'string') {\n return { name: command, optionsPairs: [], metadataPairs: [] };\n }\n if (command && typeof command === 'object') {\n return {\n name: typeof command.name === 'string' ? command.name : '',\n optionsPairs: flattenToPairs(command.options),\n metadataPairs: flattenToPairs(command.metadata),\n };\n }\n return { name: '', optionsPairs: [], metadataPairs: [] };\n}\n\nfunction resolveItems(items: AXPEntityAction['items'] | unknown): {\n children: AXPEntityAction[];\n expression?: string;\n} {\n if (Array.isArray(items)) {\n return { children: asActions(items) };\n }\n if (typeof items === 'string' && items.trim()) {\n return { children: [], expression: items.trim() };\n }\n return { children: [] };\n}\n\n//#endregion\n\n//#region ----- Actions -----\n\nfunction toActionView(action: AXPEntityAction, id: string, depth: number): ExplorerActionView {\n const command = resolveCommand(action.command);\n const items = resolveItems(action.items);\n const hidden = boolOrExpression(action.hidden);\n const disabled = boolOrExpression(action.disabled);\n const type = typeof action.type === 'string' ? action.type : undefined;\n const shortcuts = (action.shortcuts ?? []).filter((item) => typeof item === 'string' && item.trim());\n const permissions = (action.permissions ?? []).filter((item) => typeof item === 'string' && item.trim());\n\n return {\n id,\n name: typeof action.name === 'string' ? action.name : undefined,\n title: typeof action.title === 'string' ? action.title : undefined,\n commandName: command.name,\n type,\n typeLabel: type ? titleCaseType(type) : '',\n scope: typeof action.scope === 'string' ? action.scope : 'individual',\n priority: typeof action.priority === 'string' ? action.priority : 'secondary',\n icon: typeof action.icon === 'string' ? action.icon : undefined,\n color: typeof action.color === 'string' ? action.color : undefined,\n shortcuts,\n permissions,\n hidden,\n disabled,\n isDefault: action.default === true,\n separated: action.separated === true,\n order: typeof action.order === 'number' ? action.order : undefined,\n depth,\n optionsPairs: command.optionsPairs,\n metadataPairs: command.metadataPairs,\n submenuExpression: items.expression,\n };\n}\n\nfunction flattenActions(actions: AXPEntityAction[], prefix: string, depth = 0): ExplorerActionView[] {\n const rows: ExplorerActionView[] = [];\n actions.forEach((action, index) => {\n const id = `${prefix}.${index}`;\n rows.push(toActionView(action, id, depth));\n const items = resolveItems(action.items);\n if (items.children.length) {\n rows.push(...flattenActions(items.children, id, depth + 1));\n }\n });\n return rows;\n}\n\nfunction groupByScope(actions: ExplorerActionView[]): ExplorerActionScopeGroup[] {\n const map = new Map<string, ExplorerActionView[]>();\n for (const action of actions) {\n const scope = action.scope || 'individual';\n const list = map.get(scope) ?? [];\n list.push(action);\n map.set(scope, list);\n }\n const extra = [...map.keys()].filter((scope) => !SCOPE_ORDER.includes(scope));\n return [...SCOPE_ORDER, ...extra]\n .filter((scope) => (map.get(scope)?.length ?? 0) > 0)\n .map((scope) => ({ scope, actions: map.get(scope) ?? [] }));\n}\n\nfunction toSection(\n id: string,\n kind: ExplorerLayoutKind,\n actions: AXPEntityAction[],\n extra?: Partial<ExplorerLayoutSection>,\n allowEmpty = false,\n): ExplorerLayoutSection | null {\n const flat = flattenActions(actions, id);\n if (!flat.length && !allowEmpty) {\n return null;\n }\n return {\n id,\n kind,\n views: extra?.views ?? [],\n relatedTitle: extra?.relatedTitle,\n relatedEntity: extra?.relatedEntity,\n relatedLayoutType: extra?.relatedLayoutType,\n layoutTitle: extra?.layoutTitle,\n layoutDescription: extra?.layoutDescription,\n groups: groupByScope(flat),\n actionCount: flat.length,\n };\n}\n\nfunction queryViews(views: AXPQueryView[] | undefined): ExplorerLayoutView[] {\n return (views ?? []).map((view) => ({\n name: view.name,\n title: humanText(view.title),\n }));\n}\n\nfunction relatedLayoutType(related: AXPRelatedEntity): string | undefined {\n const type = related.layout?.type;\n return typeof type === 'string' ? type : undefined;\n}\n\nexport function buildLayoutSections(entity: AXPEntity): ExplorerLayoutSection[] {\n const master = entity.interfaces?.master;\n const sections: ExplorerLayoutSection[] = [];\n\n const list = toSection('list', 'list', layoutActions(master?.list), {\n layoutTitle: humanText(master?.list?.title),\n layoutDescription: humanText(master?.list?.description),\n views: queryViews(master?.list?.views),\n }, true);\n if (list) {\n sections.push(list);\n }\n\n const record = toSection('record', 'record', layoutActions(master?.single), {\n layoutTitle: humanText(master?.single?.title),\n layoutDescription: humanText(master?.single?.description),\n }, true);\n if (record) {\n sections.push(record);\n }\n\n const create = toSection('create', 'create', layoutActions(master?.create), {\n layoutTitle: humanText(master?.create?.title),\n }, true);\n if (create) {\n sections.push(create);\n }\n\n const update = toSection('update', 'update', layoutActions(master?.update), {\n layoutTitle: humanText(master?.update?.title),\n }, true);\n if (update) {\n sections.push(update);\n }\n\n const detailList = toSection(\n 'detail-list',\n 'detail-list',\n layoutActions(entity.interfaces?.detail?.list),\n {\n layoutTitle: humanText(entity.interfaces?.detail?.list?.title),\n layoutDescription: humanText(entity.interfaces?.detail?.list?.description),\n },\n );\n if (detailList) {\n sections.push(detailList);\n }\n\n (entity.relatedEntities ?? []).forEach((related, index) => {\n const relatedActions = asActions(related.actions);\n const section = toSection(`related:${index}`, 'related', relatedActions, {\n relatedTitle: humanText(related.title),\n relatedEntity: related.entity,\n relatedLayoutType: relatedLayoutType(related),\n });\n if (section) {\n sections.push(section);\n }\n });\n\n return sections;\n}\n\n//#endregion\n","import type { AXPEntityPropertyDefinition } from '@acorex-platform/framework-shared/domain';\nimport type { AXPEntityProperty } from '@acorex-platform/framework-shared/entity';\n\nimport { flattenToPairs, type FlatJsonPair } from './platform-explorer-json.util';\n\n//#region ----- Types -----\n\nexport interface PropertyDetailFlag {\n labelKey: string;\n on: boolean;\n}\n\nexport interface PropertyDetailPair {\n labelKey: string;\n value: string;\n}\n\nexport interface PropertyDetailTrigger {\n event: string;\n action: string;\n disabled: boolean;\n}\n\nexport interface PropertyDetailValidation {\n rule: string;\n message?: string;\n optionsPairs: FlatJsonPair[];\n disabled: boolean;\n}\n\nexport interface PropertyDetailJson {\n labelKey: string;\n pairs: FlatJsonPair[];\n}\n\nexport interface PropertyDetailsView {\n flags: PropertyDetailFlag[];\n pairs: PropertyDetailPair[];\n triggers: PropertyDetailTrigger[];\n validations: PropertyDetailValidation[];\n jsonBlocks: PropertyDetailJson[];\n}\n\nexport const PROPERTY_SCHEMA_FLAG_KEYS = [\n 'nullable',\n 'unique',\n 'readonly',\n 'visible',\n 'searchable',\n 'full-text',\n 'filterable',\n 'auditable',\n] as const;\n\nexport const PROPERTY_SCHEMA_PAIR_KEYS = ['data-type', 'group', 'default-value'] as const;\n\nexport const PROPERTY_PRESENTATION_FLAG_KEYS = [\n 'inline-filter',\n 'sortable',\n 'advanced-filter',\n 'preload-filter',\n] as const;\n\nexport const PROPERTY_PRESENTATION_PAIR_KEYS = [\n 'editor',\n 'widget-path',\n 'widget-mode',\n 'widget-id',\n 'filter-widget',\n] as const;\n\nexport const PROPERTY_SCHEMA_ORDER = [\n 'data-type',\n 'nullable',\n 'group',\n 'unique',\n 'readonly',\n 'visible',\n 'searchable',\n 'full-text',\n 'filterable',\n 'auditable',\n 'default-value',\n] as const;\n\nexport const PROPERTY_PRESENTATION_ORDER = [\n 'editor',\n 'inline-filter',\n 'advanced-filter',\n 'sortable',\n 'widget-path',\n 'widget-mode',\n 'widget-id',\n 'filter-widget',\n 'preload-filter',\n] as const;\n\nexport type PropertyDetailEntry =\n | { kind: 'flag'; labelKey: string; on: boolean }\n | { kind: 'pair'; labelKey: string; value: string };\n\n//#endregion\n\n//#region ----- JSON / scalar -----\n\nfunction formatScalar(value: unknown): string | undefined {\n if (value === undefined || typeof value === 'function') {\n return undefined;\n }\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return undefined;\n}\n\nfunction resolvePropertyDataType(\n schemaDataType: unknown,\n normalizedDataType: unknown,\n editor: unknown,\n widgetDataTypes: Record<string, string>,\n): string | undefined {\n const widgetName = typeof editor === 'string' ? editor.trim() : '';\n const fromWidget = widgetName ? widgetDataTypes[widgetName] : undefined;\n if (fromWidget) {\n return fromWidget;\n }\n return formatScalar(schemaDataType) ?? formatScalar(normalizedDataType);\n}\n\nfunction pushFlag(flags: PropertyDetailFlag[], labelKey: string, value: unknown, always = false): void {\n if (typeof value !== 'boolean') {\n return;\n }\n if (!always && !value) {\n return;\n }\n if (flags.some((flag) => flag.labelKey === labelKey)) {\n return;\n }\n flags.push({ labelKey, on: value });\n}\n\nfunction pushPair(pairs: PropertyDetailPair[], labelKey: string, value: unknown): void {\n const text = formatScalar(value);\n if (!text || pairs.some((pair) => pair.labelKey === labelKey)) {\n return;\n }\n pairs.push({ labelKey, value: text });\n}\n\nfunction pushJson(blocks: PropertyDetailJson[], labelKey: string, value: unknown): void {\n const pairs = flattenToPairs(value);\n if (!pairs.length || blocks.some((block) => block.labelKey === labelKey)) {\n return;\n }\n blocks.push({ labelKey, pairs });\n}\n\nfunction formatAction(action: unknown): string {\n if (Array.isArray(action)) {\n return action.filter((item) => typeof item === 'string' && item.trim()).join(', ');\n }\n return typeof action === 'string' ? action.trim() : '';\n}\n\n//#endregion\n\n//#region ----- Build details -----\n\nexport function hasPropertyDetails(details: PropertyDetailsView): boolean {\n return (\n details.flags.length > 0 ||\n details.pairs.length > 0 ||\n details.triggers.length > 0 ||\n details.validations.length > 0 ||\n details.jsonBlocks.length > 0\n );\n}\n\nexport function propertyFlag(details: PropertyDetailsView, key: string): boolean | undefined {\n return details.flags.find((flag) => flag.labelKey === key)?.on;\n}\n\nexport function propertyFlagsNamed(\n details: PropertyDetailsView,\n keys: readonly string[],\n): PropertyDetailFlag[] {\n return keys\n .map((key) => details.flags.find((flag) => flag.labelKey === key))\n .filter((flag): flag is PropertyDetailFlag => !!flag);\n}\n\nexport function propertyPairsNamed(\n details: PropertyDetailsView,\n keys: readonly string[],\n): PropertyDetailPair[] {\n return keys\n .map((key) => details.pairs.find((pair) => pair.labelKey === key))\n .filter((pair): pair is PropertyDetailPair => !!pair);\n}\n\nexport function propertyEntries(\n details: PropertyDetailsView,\n pairKeys: readonly string[],\n flagKeys: readonly string[],\n order: readonly string[],\n): PropertyDetailEntry[] {\n const byKey = new Map<string, PropertyDetailEntry>();\n for (const pair of propertyPairsNamed(details, pairKeys)) {\n byKey.set(pair.labelKey, { kind: 'pair', labelKey: pair.labelKey, value: pair.value });\n }\n for (const flag of propertyFlagsNamed(details, flagKeys)) {\n byKey.set(flag.labelKey, { kind: 'flag', labelKey: flag.labelKey, on: flag.on });\n }\n return order\n .map((key) => byKey.get(key))\n .filter((entry): entry is PropertyDetailEntry => !!entry);\n}\n\nexport function buildPropertyDetails(\n layout?: AXPEntityProperty,\n normalized?: AXPEntityPropertyDefinition,\n widgetDataTypes: Record<string, string> = {},\n): PropertyDetailsView {\n const flags: PropertyDetailFlag[] = [];\n const pairs: PropertyDetailPair[] = [];\n const triggers: PropertyDetailTrigger[] = [];\n const validations: PropertyDetailValidation[] = [];\n const jsonBlocks: PropertyDetailJson[] = [];\n\n const schema = layout?.schema;\n const widget = schema?.interface;\n const features = normalized?.features;\n const list = layout?.options;\n\n pushFlag(flags, 'nullable', schema?.nullable ?? normalized?.fieldFeatures?.nullable, true);\n pushFlag(flags, 'unique', schema?.unique?.enabled);\n\n const readonly = schema?.readonly ?? normalized?.fieldFeatures?.readOnly;\n if (typeof readonly === 'boolean') {\n pushFlag(flags, 'readonly', readonly);\n } else {\n pushPair(pairs, 'readonly', readonly);\n }\n\n const visible = schema?.visible;\n if (typeof visible === 'boolean') {\n if (!visible) {\n pushFlag(flags, 'visible', false, true);\n }\n } else {\n pushPair(pairs, 'visible', visible);\n }\n\n pushFlag(flags, 'searchable', features?.searchable?.enabled);\n pushFlag(flags, 'full-text', features?.searchable?.fullText);\n pushFlag(flags, 'filterable', features?.filterable?.enabled);\n pushFlag(flags, 'inline-filter', features?.filterable?.inline ?? list?.filter?.inline?.enabled, true);\n pushFlag(flags, 'sortable', features?.sortable?.enabled ?? list?.sort?.enabled, true);\n pushFlag(flags, 'auditable', features?.auditable?.enabled);\n pushFlag(flags, 'advanced-filter', list?.filter?.advance?.enabled, true);\n pushFlag(flags, 'preload-filter', list?.filter?.preload?.enabled);\n\n pushPair(pairs, 'group', layout?.groupId);\n const editor = widget?.type ?? normalized?.interface?.name;\n pushPair(pairs, 'data-type', resolvePropertyDataType(schema?.dataType, normalized?.dataType, editor, widgetDataTypes));\n pushPair(pairs, 'editor', editor);\n pushPair(pairs, 'widget-path', widget?.path);\n pushPair(pairs, 'widget-mode', widget?.mode);\n pushPair(pairs, 'widget-id', widget?.id);\n pushPair(pairs, 'filter-widget', list?.filter?.advance?.widgetType);\n\n const defaultValue = schema?.defaultValue ?? normalized?.defaultValue;\n const defaultText = formatScalar(defaultValue);\n if (defaultText) {\n pushPair(pairs, 'default-value', defaultText);\n } else {\n pushJson(jsonBlocks, 'default-value', defaultValue);\n }\n\n for (const trigger of widget?.triggers ?? []) {\n const event = typeof trigger.event === 'string' ? trigger.event.trim() : '';\n const action = formatAction(trigger.action);\n if (!event && !action) {\n continue;\n }\n triggers.push({\n event,\n action,\n disabled: !!trigger.disabled,\n });\n }\n\n const rules = layout?.validations ?? normalized?.validations ?? [];\n for (const rule of rules) {\n const name = typeof rule.rule === 'string' ? rule.rule.trim() : '';\n if (!name) {\n continue;\n }\n validations.push({\n rule: name,\n message: typeof rule.message === 'string' ? rule.message.trim() || undefined : undefined,\n optionsPairs: flattenToPairs(rule.options),\n disabled: 'disabled' in rule && rule.disabled === true,\n });\n }\n\n pushJson(jsonBlocks, 'widget-options', widget?.options ?? normalized?.interface?.options);\n pushJson(jsonBlocks, 'value-transforms', widget?.valueTransforms);\n pushJson(jsonBlocks, 'widget-children', widget?.children);\n\n return { flags, pairs, triggers, validations, jsonBlocks };\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n linkedSignal,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDrawerModule } from '@acorex/components/drawer';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport type { AXPEntityPropertyDefinition } from '@acorex-platform/framework-shared/domain';\nimport type { AXPEntityProperty } from '@acorex-platform/framework-shared/entity';\nimport type { AXMPlatformExplorerEntityDetail } from '@acorex-platform/module-platform-management-client/contracts';\nimport type { AXMPlatformExplorerEntitySummary } from '@acorex-platform/module-platform-management-client/contracts';\n\nimport {\n PlatformExplorerDataService,\n type PlatformExplorerEntityTab,\n} from '../platform-explorer-data.service';\nimport { pluginSourceByFieldName } from './platform-explorer-plugin-fields.util';\nimport {\n buildLayoutSections,\n type ExplorerActionView,\n type ExplorerLayoutKind,\n type ExplorerLayoutSection,\n} from './platform-explorer-entity-actions.util';\nimport {\n buildPropertyDetails,\n PROPERTY_PRESENTATION_FLAG_KEYS,\n PROPERTY_PRESENTATION_ORDER,\n PROPERTY_PRESENTATION_PAIR_KEYS,\n PROPERTY_SCHEMA_FLAG_KEYS,\n PROPERTY_SCHEMA_ORDER,\n PROPERTY_SCHEMA_PAIR_KEYS,\n propertyEntries,\n propertyFlag,\n propertyPairsNamed,\n type PropertyDetailEntry,\n type PropertyDetailsView,\n} from './platform-explorer-property-details.util';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface EntityPropertyView {\n name: string;\n title?: string;\n dataType?: string;\n editor?: string;\n description?: string;\n pluginName?: string;\n pluginTitle?: string;\n details: PropertyDetailsView;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst PRIMARY_ACTION_TABS: ExplorerLayoutKind[] = ['list', 'record', 'create', 'update'];\nconst CODE_PAIR_KEYS = new Set([\n 'editor',\n 'widget-path',\n 'widget-mode',\n 'widget-id',\n 'filter-widget',\n]);\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-entity-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [\n CommonModule,\n NgTemplateOutlet,\n AXTranslationModule,\n AXLoadingModule,\n AXSearchBoxModule,\n AXDecoratorModule,\n AXDrawerModule,\n AXPStateMessageComponent,\n ],\n templateUrl: './platform-explorer-entity-detail.component.html',\n styleUrl: './platform-explorer-entity-detail.component.css',\n})\nexport class AXPlatformExplorerEntityDetailComponent {\n payload = input<AXMPlatformExplorerEntitySummary | undefined>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly dataService = inject(PlatformExplorerDataService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly detail = signal<AXMPlatformExplorerEntityDetail | null>(null);\n protected readonly loading = signal(false);\n protected readonly loadError = signal(false);\n protected readonly activeSection = this.dataService.activeEntitySection;\n protected readonly selectedName = signal<string | null>(null);\n protected readonly selectedActionId = linkedSignal({\n source: () => this.activeSection(),\n computation: () => null as string | null,\n });\n protected readonly actionQuery = linkedSignal({\n source: () => this.activeSection(),\n computation: () => '',\n });\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly properties = computed(() => this.mergeProperties(this.detail()));\n protected readonly layoutSections = computed((): ExplorerLayoutSection[] => {\n const detail = this.detail();\n return detail ? buildLayoutSections(detail.layout) : [];\n });\n\n protected readonly selectedProperty = computed(() => {\n const name = this.selectedName();\n if (!name) {\n return null;\n }\n return this.properties().find((row) => row.name === name) ?? null;\n });\n\n protected readonly isFieldSection = computed(() => this.activeSection() === 'properties');\n\n protected readonly inspectorOpen = computed(() =>\n this.isFieldSection() ? this.selectedProperty() != null : this.selectedAction() != null,\n );\n\n protected readonly inspectorAriaKey = computed(() =>\n this.isFieldSection()\n ? '@platform-dev-tools:module.property-details.field-definition'\n : '@platform-dev-tools:module.action-details.action-definition',\n );\n\n protected readonly activeLayout = computed(() => {\n const section = this.activeSection();\n if (section === 'properties') {\n return null;\n }\n return this.layoutSections().find((item) => item.id === section || item.kind === section) ?? null;\n });\n\n protected readonly activeActions = computed((): ExplorerActionView[] => {\n const layout = this.activeLayout();\n if (!layout) {\n return [];\n }\n return layout.groups.flatMap((group) => group.actions);\n });\n\n protected readonly filteredActions = computed(() => {\n const query = this.actionQuery().trim().toLowerCase();\n const rows = this.activeActions();\n if (!query) {\n return rows;\n }\n return rows.filter((row) => this.matchesActionQuery(row, query));\n });\n\n protected readonly selectedAction = computed(() => {\n const id = this.selectedActionId();\n const rows = this.activeActions();\n if (id) {\n const match = rows.find((row) => row.id === id);\n if (match) {\n return match;\n }\n }\n return rows[0] ?? null;\n });\n\n protected readonly selectedSchemaEntries = computed(() => {\n const field = this.selectedProperty();\n return field ? this.schemaEntries(field.details) : [];\n });\n\n protected readonly selectedPresentationEntries = computed(() => {\n const field = this.selectedProperty();\n return field ? this.presentationEntries(field.details) : [];\n });\n\n //#endregion\n\n constructor() {\n this.destroyRef.onDestroy(() => this.dataService.clearEntityTabs());\n\n effect(() => {\n const summary = this.payload();\n void this.loadDetail(summary);\n });\n }\n\n //#region ----- Event Handlers -----\n\n protected selectProperty(name: string): void {\n this.selectedName.set(name);\n }\n\n protected selectAction(id: string): void {\n this.selectedActionId.set(id);\n }\n\n protected isSelected(name: string): boolean {\n return this.selectedName() === name;\n }\n\n protected isActionSelected(id: string): boolean {\n return this.selectedAction()?.id === id;\n }\n\n protected onActionSearchChanged(event: AXValueChangedEvent<string>): void {\n this.actionQuery.set(event.value ?? '');\n }\n\n protected flagValue(details: PropertyDetailsView, key: string): boolean | undefined {\n return propertyFlag(details, key);\n }\n\n protected isCodePair(key: string): boolean {\n return CODE_PAIR_KEYS.has(key);\n }\n\n protected isTypePair(key: string): boolean {\n return key === 'data-type';\n }\n\n protected hiddenFlag(action: ExplorerActionView): boolean | undefined {\n return this.yesNoFlag(action.hidden);\n }\n\n protected disabledFlag(action: ExplorerActionView): boolean | undefined {\n return this.yesNoFlag(action.disabled);\n }\n\n protected hiddenExpression(action: ExplorerActionView): string | undefined {\n return this.expressionValue(action.hidden);\n }\n\n protected disabledExpression(action: ExplorerActionView): string | undefined {\n return this.expressionValue(action.disabled);\n }\n\n //#endregion\n\n //#region ----- Property Details -----\n\n private schemaEntries(details: PropertyDetailsView): PropertyDetailEntry[] {\n return propertyEntries(\n details,\n PROPERTY_SCHEMA_PAIR_KEYS,\n PROPERTY_SCHEMA_FLAG_KEYS,\n PROPERTY_SCHEMA_ORDER,\n );\n }\n\n private presentationEntries(details: PropertyDetailsView): PropertyDetailEntry[] {\n return propertyEntries(\n details,\n PROPERTY_PRESENTATION_PAIR_KEYS,\n PROPERTY_PRESENTATION_FLAG_KEYS,\n PROPERTY_PRESENTATION_ORDER,\n );\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async loadDetail(summary: AXMPlatformExplorerEntitySummary | undefined): Promise<void> {\n this.actionQuery.set('');\n this.selectedName.set(null);\n this.selectedActionId.set(null);\n if (!summary) {\n this.detail.set(null);\n this.loading.set(false);\n this.loadError.set(false);\n this.dataService.clearEntityTabs();\n return;\n }\n this.loading.set(true);\n this.loadError.set(false);\n this.detail.set(null);\n try {\n const detail = await this.dataService.getEntity(summary.module, summary.name);\n if (this.payload() === summary) {\n this.detail.set(detail);\n this.selectedName.set(this.mergeProperties(detail)[0]?.name ?? null);\n this.dataService.setEntityTabs(this.buildTabs(detail));\n }\n } catch {\n if (this.payload() === summary) {\n this.loadError.set(true);\n }\n } finally {\n if (this.payload() === summary) {\n this.loading.set(false);\n }\n }\n }\n\n private buildTabs(detail: AXMPlatformExplorerEntityDetail | null): PlatformExplorerEntityTab[] {\n if (!detail) {\n return [];\n }\n const extra = buildLayoutSections(detail.layout).filter(\n (section) => !PRIMARY_ACTION_TABS.includes(section.kind),\n );\n const tabs: PlatformExplorerEntityTab[] = [\n { id: 'properties', textKey: '@platform-dev-tools:module.terms.properties' },\n ];\n for (const kind of PRIMARY_ACTION_TABS) {\n tabs.push({ id: kind, textKey: `@platform-dev-tools:module.layouts.${kind}` });\n }\n for (const layout of extra) {\n tabs.push({\n id: layout.id,\n textKey:\n layout.kind === 'related'\n ? '@platform-dev-tools:module.layouts.related'\n : `@platform-dev-tools:module.layouts.${layout.kind}`,\n extraText:\n layout.kind === 'related' ? layout.relatedTitle || layout.relatedEntity : undefined,\n });\n }\n return tabs;\n }\n\n private mergeProperties(detail: AXMPlatformExplorerEntityDetail | null): EntityPropertyView[] {\n if (!detail) {\n return [];\n }\n const pluginByField = pluginSourceByFieldName(detail.plugins);\n const widgetDataTypes = detail.widgetDataTypes ?? {};\n const normalizedByName = new Map(\n (detail.normalized?.fields ?? []).map((field) => [field.name, field]),\n );\n const rows: EntityPropertyView[] = [];\n const seen = new Set<string>();\n\n for (const property of detail.layout.properties ?? []) {\n seen.add(property.name);\n rows.push(\n this.toRow(property.name, pluginByField, widgetDataTypes, property, normalizedByName.get(property.name)),\n );\n }\n\n for (const field of detail.normalized?.fields ?? []) {\n if (seen.has(field.name)) {\n continue;\n }\n seen.add(field.name);\n rows.push(this.toRow(field.name, pluginByField, widgetDataTypes, undefined, field));\n }\n\n return rows;\n }\n\n private toRow(\n name: string,\n pluginByField: ReturnType<typeof pluginSourceByFieldName>,\n widgetDataTypes: Record<string, string>,\n layout?: AXPEntityProperty,\n normalized?: AXPEntityPropertyDefinition,\n ): EntityPropertyView {\n const plugin = pluginByField.get(name);\n const details = buildPropertyDetails(layout, normalized, widgetDataTypes);\n const title = this.asText(layout?.title) ?? this.asText(normalized?.title);\n const description = this.asText(layout?.description) ?? this.asText(normalized?.description);\n return {\n name,\n title,\n dataType: propertyPairsNamed(details, ['data-type'])[0]?.value ?? '',\n editor: propertyPairsNamed(details, ['editor'])[0]?.value ?? '',\n description,\n pluginName: plugin?.name,\n pluginTitle: plugin?.title,\n details,\n };\n }\n\n private asText(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n }\n\n private matchesActionQuery(row: ExplorerActionView, query: string): boolean {\n return (\n row.commandName.toLowerCase().includes(query) ||\n (row.name?.toLowerCase().includes(query) ?? false) ||\n (row.title?.toLowerCase().includes(query) ?? false) ||\n (row.typeLabel?.toLowerCase().includes(query) ?? false) ||\n row.scope.toLowerCase().includes(query)\n );\n }\n\n private yesNoFlag(value: string | undefined): boolean | undefined {\n if (value === 'yes') {\n return true;\n }\n if (value === 'no') {\n return false;\n }\n return undefined;\n }\n\n private expressionValue(value: string | undefined): string | undefined {\n if (!value || value === 'yes' || value === 'no') {\n return undefined;\n }\n return value;\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"flex flex-col flex-1 min-h-0\">\n <!-- ----- Loading entity layout ----- -->\n @if (loading()) {\n <div class=\"flex flex-1 items-center justify-center p-6\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Entity catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- Entity documentation with field or action inspector ----- -->\n @else if (detail(); as d) {\n <ax-drawer-container class=\"axp-platform-explorer__docs\">\n <ax-content class=\"axp-platform-explorer__docs-main\">\n <div class=\"axp-platform-explorer__docs-shell\">\n <div class=\"axp-platform-explorer__docs-chrome\">\n <!--->\n <!-- ----- Attached plugins as chips ----- -->\n @if (d.plugins.length) {\n <div class=\"axp-platform-explorer__docs-plugins\">\n @for (plugin of d.plugins; track plugin.name) {\n <span class=\"axp-platform-explorer__docs-chip\">\n <i class=\"fa-light fa-plug\" aria-hidden=\"true\"></i>\n {{ (plugin.title || plugin.name) | translate | async }}\n </span>\n }\n </div>\n }\n <!--->\n <!-- ----- Field column headers stay outside the scrolling rows ----- -->\n @if (isFieldSection() && properties().length) {\n <div class=\"axp-platform-explorer__docs-table-head\" role=\"row\">\n <span role=\"columnheader\">{{ '@platform-dev-tools:module.terms.field' | translate | async }}</span>\n <span role=\"columnheader\">\n {{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}\n </span>\n <span role=\"columnheader\">\n {{ '@platform-dev-tools:module.property-details.nullable' | translate | async }}\n </span>\n </div>\n }\n </div>\n\n <!--->\n <!-- ----- Field table ----- -->\n @if (isFieldSection()) {\n <div class=\"axp-platform-explorer__docs-list\">\n <!--->\n <!-- ----- Empty property list ----- -->\n @if (properties().length === 0) {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.messages.no-properties' | translate | async }}\n </p>\n }\n <!-- ----- Field rows ----- -->\n @else {\n <div class=\"axp-platform-explorer__table-wrap axp-platform-explorer__table-wrap--fields\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead class=\"sr-only\">\n <tr>\n <th>{{ '@platform-dev-tools:module.terms.field' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.property-details.nullable' | translate | async }}</th>\n </tr>\n </thead>\n <tbody>\n @for (row of properties(); track row.name) {\n <tr\n class=\"axp-platform-explorer__table-row\"\n [class.axp-platform-explorer__table-row--selected]=\"isSelected(row.name)\"\n (click)=\"selectProperty(row.name)\"\n >\n <td>\n <button\n type=\"button\"\n class=\"axp-platform-explorer__field-button\"\n [attr.aria-pressed]=\"isSelected(row.name)\"\n (click)=\"selectProperty(row.name); $event.stopPropagation()\"\n >\n <code dir=\"ltr\">{{ row.name }}</code>\n </button>\n <!--->\n <!-- ----- Translated property title under the field name ----- -->\n @if (row.title) {\n <div class=\"axp-platform-explorer__field-title\">\n {{ row.title | translate | async }}\n </div>\n }\n </td>\n <td>\n <!--->\n <!-- ----- Stored data type chip ----- -->\n @if (row.dataType) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ row.dataType }}</span>\n }\n <!-- ----- Missing data type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n <td>\n <ng-container\n *ngTemplateOutlet=\"boolCell; context: { value: flagValue(row.details, 'nullable') }\"\n />\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <p class=\"axp-platform-explorer__docs-footnote\">\n {{ '@platform-dev-tools:module.property-details.select-field' | translate | async }}\n </p>\n </div>\n }\n <!-- ----- Action table ----- -->\n @else if (activeLayout(); as layout) {\n <div class=\"axp-platform-explorer__docs-list axp-platform-explorer__docs-list--padded\">\n <div class=\"axp-platform-explorer__docs-toolbar\">\n <div>\n <h2 class=\"axp-platform-explorer__docs-heading\">\n {{ ('@platform-dev-tools:module.layouts.' + layout.kind) | translate | async }}\n </h2>\n <p class=\"axp-platform-explorer__docs-count\">\n {{ ('@platform-dev-tools:module.layouts.' + layout.kind + '-hint') | translate | async }}\n </p>\n <p class=\"axp-platform-explorer__docs-count\">\n <!--->\n <!-- ----- Filtered action count ----- -->\n @if (actionQuery().trim()) {\n {{\n '@platform-dev-tools:module.action-details.action-count-filtered'\n | translate: { params: { shown: filteredActions().length, count: layout.actionCount } }\n | async\n }}\n }\n <!-- ----- Full action count ----- -->\n @else {\n {{\n '@platform-dev-tools:module.layouts.action-count'\n | translate: { params: { count: layout.actionCount } }\n | async\n }}\n }\n </p>\n </div>\n <ax-search-box\n class=\"axp-platform-explorer__docs-search\"\n look=\"fill\"\n [delayTime]=\"200\"\n [value]=\"actionQuery()\"\n [placeholder]=\"\n ('@platform-dev-tools:module.action-details.search-actions' | translate | async) ?? ''\n \"\n (onValueChanged)=\"onActionSearchChanged($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </div>\n <div class=\"flex flex-wrap items-center gap-1.5 mb-4\">\n <!--->\n <!-- ----- Related entity identity ----- -->\n @if (layout.relatedEntity) {\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ layout.relatedEntity }}</code>\n }\n <!--->\n <!-- ----- Related layout type ----- -->\n @if (layout.relatedLayoutType) {\n <span class=\"inline-flex items-center rounded-full bg-lighter px-2 py-0.5 text-xs text-muted\">\n {{\n ('@platform-dev-tools:module.layouts.related-types.' + layout.relatedLayoutType)\n | translate | async\n }}\n </span>\n }\n <!--->\n <!-- ----- List query views ----- -->\n @for (view of layout.views; track view.name) {\n <span class=\"inline-flex items-center rounded-full bg-lighter px-2 py-0.5 text-xs text-muted\">\n {{ (view.title || view.name) | translate | async }}\n </span>\n }\n </div>\n <!--->\n <!-- ----- Optional stored layout title ----- -->\n @if (layout.layoutTitle) {\n <p class=\"m-0 mb-2 text-sm\">{{ layout.layoutTitle | translate | async }}</p>\n }\n <!--->\n <!-- ----- Optional stored layout description ----- -->\n @if (layout.layoutDescription) {\n <p class=\"m-0 mb-3 text-sm text-muted\">{{ layout.layoutDescription | translate | async }}</p>\n }\n\n <!--->\n <!-- ----- Empty action list ----- -->\n @if (layout.actionCount === 0) {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.messages.no-actions' | translate | async }}\n </p>\n }\n <!-- ----- Search matched no actions ----- -->\n @else if (filteredActions().length === 0) {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.action-details.no-matching-actions' | translate | async }}\n </p>\n }\n <!-- ----- Action rows ----- -->\n @else {\n <div class=\"axp-platform-explorer__table-wrap axp-platform-explorer__table-wrap--fields\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead>\n <tr>\n <th>{{ '@platform-dev-tools:module.action-details.item' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.action-details.type' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.action-details.priority' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.action-details.scope' | translate | async }}</th>\n </tr>\n </thead>\n <tbody>\n @for (action of filteredActions(); track action.id) {\n <tr\n class=\"axp-platform-explorer__table-row\"\n [class.axp-platform-explorer__table-row--selected]=\"isActionSelected(action.id)\"\n (click)=\"selectAction(action.id)\"\n >\n <td>\n <div [style.padding-inline-start.rem]=\"action.depth\">\n <button\n type=\"button\"\n class=\"axp-platform-explorer__field-button\"\n [attr.aria-pressed]=\"isActionSelected(action.id)\"\n (click)=\"selectAction(action.id); $event.stopPropagation()\"\n >\n <!--->\n <!-- ----- Action icon from the layout ----- -->\n @if (action.icon) {\n <i class=\"text-muted me-1\" [ngClass]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n <code dir=\"ltr\">{{ action.commandName || action.name || '–' }}</code>\n </button>\n <!--->\n <!-- ----- Translated action title ----- -->\n @if (action.title) {\n <div class=\"axp-platform-explorer__field-title\">\n {{ action.title | translate | async }}\n </div>\n }\n </div>\n </td>\n <td>\n <!--->\n <!-- ----- Action type chip ----- -->\n @if (action.typeLabel) {\n <span class=\"axp-platform-explorer__type-chip\">{{ action.typeLabel }}</span>\n }\n <!-- ----- Missing action type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n <td>\n <span\n class=\"axp-platform-explorer__priority\"\n [class.is-primary]=\"action.priority === 'primary'\"\n >\n {{\n ('@platform-dev-tools:module.action-details.priorities.' + action.priority)\n | translate | async\n }}\n </span>\n </td>\n <td class=\"text-muted\">\n {{\n ('@platform-dev-tools:module.action-details.scopes.' + action.scope) | translate | async\n }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <p class=\"axp-platform-explorer__docs-footnote\">\n {{ '@platform-dev-tools:module.action-details.select-action' | translate | async }}\n </p>\n </div>\n }\n </div>\n </ax-content>\n <ax-drawer\n class=\"axp-platform-explorer__docs-side\"\n [location]=\"'end'\"\n [mode]=\"'push'\"\n [collapsed]=\"!inspectorOpen()\"\n >\n <ax-content\n class=\"axp-platform-explorer__docs-detail\"\n [attr.aria-label]=\"inspectorAriaKey() | translate | async\"\n >\n <!--->\n <!-- ----- Selected field definition ----- -->\n @if (isFieldSection()) {\n <ng-container *ngTemplateOutlet=\"fieldDetail\" />\n }\n <!-- ----- Selected action definition ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"actionDetail\" />\n }\n </ax-content>\n </ax-drawer>\n </ax-drawer-container>\n }\n</div>\n\n<ng-template #boolCell let-value=\"value\">\n <!-- ----- Affirmative flag ----- -->\n @if (value === true) {\n <span class=\"axp-platform-explorer__yes\">\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n {{ '@platform-dev-tools:module.property-details.yes' | translate | async }}\n </span>\n }\n <!-- ----- Negative flag ----- -->\n @else if (value === false) {\n {{ '@platform-dev-tools:module.property-details.no' | translate | async }}\n }\n <!-- ----- Unknown flag ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n</ng-template>\n\n<ng-template #kvList let-pairs=\"pairs\">\n <dl class=\"axp-platform-explorer__docs-dl axp-platform-explorer__docs-dl--json\">\n @for (pair of pairs; track pair.path) {\n <dt>\n <code dir=\"ltr\">{{ pair.path || '–' }}</code>\n </dt>\n <dd>\n <code dir=\"ltr\">{{ pair.value }}</code>\n </dd>\n }\n </dl>\n</ng-template>\n\n<ng-template #fieldDetail>\n <!-- ----- Selected field definition ----- -->\n @if (selectedProperty(); as field) {\n <div class=\"axp-platform-explorer__docs-detail-header\">\n <div class=\"axp-platform-explorer__docs-eyebrow\">\n {{ '@platform-dev-tools:module.property-details.field-definition' | translate | async }}\n </div>\n <h2 class=\"axp-platform-explorer__docs-detail-title\">\n {{ (field.title || field.name) | translate | async }}\n </h2>\n <code class=\"axp-platform-explorer__docs-key\" dir=\"ltr\">{{ field.name }}</code>\n <!--->\n <!-- ----- Plugin source of the selected field ----- -->\n @if (field.pluginTitle) {\n <span class=\"axp-platform-explorer__docs-chip axp-platform-explorer__docs-chip--field\">\n <i class=\"fa-light fa-plug\" aria-hidden=\"true\"></i>\n {{ field.pluginTitle | translate | async }}\n </span>\n }\n </div>\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.terms.description' | translate | async }}</h3>\n <p class=\"axp-platform-explorer__docs-description\">\n <!--->\n <!-- ----- Translated field description ----- -->\n @if (field.description) {\n {{ field.description | translate | async }}\n }\n <!-- ----- Missing field description ----- -->\n @else {\n {{ '@platform-dev-tools:module.property-details.no-description' | translate | async }}\n }\n </p>\n </section>\n <!--->\n <!-- ----- Schema flags and scalar pairs ----- -->\n @if (selectedSchemaEntries(); as schema) {\n <!--->\n <!-- ----- Render schema when at least one entry exists ----- -->\n @if (schema.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.schema' | translate | async }}</h3>\n <dl class=\"axp-platform-explorer__docs-dl\">\n @for (entry of schema; track entry.labelKey) {\n <dt>{{ ('@platform-dev-tools:module.property-details.' + entry.labelKey) | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Boolean schema flags ----- -->\n @if (entry.kind === 'flag') {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: entry.on }\" />\n }\n <!-- ----- Schema scalar values ----- -->\n @else {\n <!--->\n <!-- ----- Data type shown as a chip ----- -->\n @if (isTypePair(entry.labelKey)) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ entry.value }}</span>\n }\n <!-- ----- Code-like schema values ----- -->\n @else if (isCodePair(entry.labelKey)) {\n <code dir=\"ltr\">{{ entry.value }}</code>\n }\n <!-- ----- Plain schema values ----- -->\n @else {\n {{ entry.value }}\n }\n }\n </dd>\n }\n </dl>\n </section>\n }\n }\n <!--->\n <!-- ----- Presentation flags and widget pairs ----- -->\n @if (selectedPresentationEntries(); as presentation) {\n <!--->\n <!-- ----- Render presentation when at least one entry exists ----- -->\n @if (presentation.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.presentation' | translate | async }}</h3>\n <dl class=\"axp-platform-explorer__docs-dl\">\n @for (entry of presentation; track entry.labelKey) {\n <dt>{{ ('@platform-dev-tools:module.property-details.' + entry.labelKey) | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Boolean presentation flags ----- -->\n @if (entry.kind === 'flag') {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: entry.on }\" />\n }\n <!-- ----- Presentation scalar values ----- -->\n @else {\n <!--->\n <!-- ----- Widget identifiers as code ----- -->\n @if (isCodePair(entry.labelKey) || isTypePair(entry.labelKey)) {\n <code dir=\"ltr\">{{ entry.value }}</code>\n }\n <!-- ----- Plain presentation values ----- -->\n @else {\n {{ entry.value }}\n }\n }\n </dd>\n }\n </dl>\n </section>\n }\n }\n <!--->\n <!-- ----- Widget triggers ----- -->\n @if (field.details.triggers.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.triggers' | translate | async }}</h3>\n <div class=\"axp-platform-explorer__prop-stack\">\n @for (trigger of field.details.triggers; track $index) {\n <div class=\"axp-platform-explorer__prop-card\">\n <div class=\"axp-platform-explorer__prop-trigger\">\n <span class=\"text-muted text-xs\">\n {{ '@platform-dev-tools:module.property-details.event' | translate | async }}\n </span>\n <code>{{ trigger.event || '–' }}</code>\n <i class=\"fa-light fa-arrow-right text-muted\" aria-hidden=\"true\"></i>\n <span class=\"text-muted text-xs\">\n {{ '@platform-dev-tools:module.property-details.action' | translate | async }}\n </span>\n <code>{{ trigger.action || '–' }}</code>\n </div>\n <!--->\n <!-- ----- Disabled trigger badge ----- -->\n @if (trigger.disabled) {\n <span class=\"axp-platform-explorer__prop-flag\">\n {{ '@platform-dev-tools:module.property-details.disabled' | translate | async }}\n </span>\n }\n </div>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Validation rules ----- -->\n @if (field.details.validations.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.validations' | translate | async }}</h3>\n <div class=\"axp-platform-explorer__prop-stack\">\n @for (rule of field.details.validations; track $index) {\n <div class=\"axp-platform-explorer__prop-card\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <code>{{ rule.rule }}</code>\n <!--->\n <!-- ----- Disabled validation badge ----- -->\n @if (rule.disabled) {\n <span class=\"axp-platform-explorer__prop-flag\">\n {{ '@platform-dev-tools:module.property-details.disabled' | translate | async }}\n </span>\n }\n </div>\n <!--->\n <!-- ----- Validation message ----- -->\n @if (rule.message) {\n <p class=\"m-0 text-xs text-muted\">{{ rule.message | translate | async }}</p>\n }\n <!--->\n <!-- ----- Flattened validation options ----- -->\n @if (rule.optionsPairs.length) {\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: rule.optionsPairs }\" />\n }\n </div>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Flattened nested JSON (widget options, transforms, children) ----- -->\n @if (field.details.jsonBlocks.length) {\n @for (block of field.details.jsonBlocks; track block.labelKey) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ ('@platform-dev-tools:module.property-details.' + block.labelKey) | translate | async }}</h3>\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: block.pairs }\" />\n </section>\n }\n }\n }\n <!-- ----- No field selected ----- -->\n @else {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.property-details.select-field' | translate | async }}\n </p>\n }\n</ng-template>\n\n<ng-template #actionDetail>\n <!-- ----- Selected action definition ----- -->\n @if (selectedAction(); as action) {\n <div class=\"axp-platform-explorer__docs-detail-header\">\n <div class=\"axp-platform-explorer__docs-eyebrow\">\n {{ '@platform-dev-tools:module.action-details.action-definition' | translate | async }}\n </div>\n <h2 class=\"axp-platform-explorer__docs-detail-title\">\n {{ (action.title || action.commandName || action.name || '–') | translate | async }}\n </h2>\n <code class=\"axp-platform-explorer__docs-key\" dir=\"ltr\">{{ action.commandName || action.name || '–' }}</code>\n </div>\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.behavior' | translate | async }}</h3>\n <dl class=\"axp-platform-explorer__docs-dl\">\n <dt>{{ '@platform-dev-tools:module.action-details.type' | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Action type ----- -->\n @if (action.typeLabel) {\n <span class=\"axp-platform-explorer__type-chip\">{{ action.typeLabel }}</span>\n }\n <!-- ----- Missing action type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.priority' | translate | async }}</dt>\n <dd>\n {{ ('@platform-dev-tools:module.action-details.priorities.' + action.priority) | translate | async }}\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.scope' | translate | async }}</dt>\n <dd>{{ ('@platform-dev-tools:module.action-details.scopes.' + action.scope) | translate | async }}</dd>\n <dt>{{ '@platform-dev-tools:module.action-details.default' | translate | async }}</dt>\n <dd>\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: action.isDefault }\" />\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.separated' | translate | async }}</dt>\n <dd>\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: action.separated }\" />\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.hidden' | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Hidden yes/no ----- -->\n @if (hiddenFlag(action) !== undefined) {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: hiddenFlag(action) }\" />\n }\n <!-- ----- Hidden expression ----- -->\n @else if (hiddenExpression(action); as expression) {\n <code dir=\"ltr\">{{ expression }}</code>\n }\n <!-- ----- Hidden unknown ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.disabled' | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Disabled yes/no ----- -->\n @if (disabledFlag(action) !== undefined) {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: disabledFlag(action) }\" />\n }\n <!-- ----- Disabled expression ----- -->\n @else if (disabledExpression(action); as expression) {\n <code dir=\"ltr\">{{ expression }}</code>\n }\n <!-- ----- Disabled unknown ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </dd>\n <!--->\n <!-- ----- Named action key ----- -->\n @if (action.name) {\n <dt>{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd>\n <code dir=\"ltr\">{{ action.name }}</code>\n </dd>\n }\n <!--->\n <!-- ----- Color token ----- -->\n @if (action.color) {\n <dt>{{ '@platform-dev-tools:module.action-details.color' | translate | async }}</dt>\n <dd>\n <code dir=\"ltr\">{{ action.color }}</code>\n </dd>\n }\n <!--->\n <!-- ----- Sort order ----- -->\n @if (action.order != null) {\n <dt>{{ '@platform-dev-tools:module.action-details.order' | translate | async }}</dt>\n <dd>{{ action.order }}</dd>\n }\n </dl>\n </section>\n <!--->\n <!-- ----- Keyboard shortcuts ----- -->\n @if (action.shortcuts.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.shortcuts' | translate | async }}</h3>\n <div class=\"flex flex-wrap gap-1.5\">\n @for (shortcut of action.shortcuts; track shortcut) {\n <code>{{ shortcut }}</code>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Permission keys ----- -->\n @if (action.permissions.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.terms.permissions' | translate | async }}</h3>\n <div class=\"flex flex-wrap gap-1.5\">\n @for (permission of action.permissions; track permission) {\n <code>{{ permission }}</code>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Dynamic submenu expression ----- -->\n @if (action.submenuExpression) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.submenu' | translate | async }}</h3>\n <code dir=\"ltr\">{{ action.submenuExpression }}</code>\n </section>\n }\n <!--->\n <!-- ----- Flattened command options ----- -->\n @if (action.optionsPairs.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.options' | translate | async }}</h3>\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: action.optionsPairs }\" />\n </section>\n }\n <!--->\n <!-- ----- Flattened command metadata ----- -->\n @if (action.metadataPairs.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.metadata' | translate | async }}</h3>\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: action.metadataPairs }\" />\n </section>\n }\n }\n <!-- ----- No action selected ----- -->\n @else {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.action-details.select-action' | translate | async }}\n </p>\n }\n</ng-template>\n","import type {\n AXMPlatformExplorerCatalogItem,\n AXMPlatformExplorerCatalogKind,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\n//#region ----- Types -----\n\nexport interface CatalogIoRow {\n name: string;\n title?: string;\n dataType?: string;\n required: boolean;\n extra?: string;\n extraKind?: 'scope' | 'condition';\n note?: string;\n}\n\nexport type CatalogContributionKind =\n | 'properties'\n | 'columns'\n | 'actions'\n | 'groups'\n | 'pages'\n | 'related-entities';\n\nexport interface CatalogContributionSection {\n kind: CatalogContributionKind;\n extraKey?: 'scope' | 'condition';\n rows: CatalogIoRow[];\n}\n\nexport interface CatalogIoTables {\n input: CatalogIoRow[];\n output: CatalogIoRow[];\n showOutput: boolean;\n contributions: CatalogContributionSection[];\n extensionKeys: string[];\n}\n\n//#endregion\n\n//#region ----- Property rows -----\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction asText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction hasRequired(def: Record<string, unknown>): boolean {\n if (def['required'] === true) {\n return true;\n }\n const validations = def['validations'];\n if (!Array.isArray(validations)) {\n return false;\n }\n return validations.some((rule) => asRecord(rule)?.['rule'] === 'required');\n}\n\nfunction dataTypeOf(def: Record<string, unknown>): string | undefined {\n const dataType = def['dataType'];\n if (typeof dataType === 'string' && dataType.trim()) {\n return dataType.trim();\n }\n const iface = asRecord(def['interface']);\n const name = iface?.['name'];\n if (typeof name === 'string' && name.trim()) {\n return name.trim();\n }\n return undefined;\n}\n\nfunction joinNotes(\n def: Record<string, unknown>,\n extra: string[],\n omitCondition = false,\n): string | undefined {\n const parts = [\n ...extra,\n omitCondition ? '' : asText(def['condition']),\n asText(def['notes']),\n ].filter(Boolean);\n return parts.length ? parts.join(' · ') : undefined;\n}\n\nfunction toIoRows(defs: unknown): CatalogIoRow[] {\n if (!Array.isArray(defs)) {\n return [];\n }\n const rows: CatalogIoRow[] = [];\n const seen = new Set<string>();\n for (const item of defs) {\n const def = asRecord(item);\n if (!def) {\n continue;\n }\n const name = asText(def['name']);\n if (!name || seen.has(name)) {\n continue;\n }\n seen.add(name);\n const title = asText(def['title']) || undefined;\n const dataType = dataTypeOf(def);\n const note = joinNotes(def, []);\n rows.push({\n name,\n ...(title ? { title } : {}),\n ...(dataType ? { dataType } : {}),\n required: hasRequired(def),\n ...(note ? { note } : {}),\n });\n }\n return rows;\n}\n\nfunction capabilityProperties(section: unknown): CatalogIoRow[] {\n const row = asRecord(section);\n if (!row || row['enabled'] !== true) {\n return [];\n }\n return toIoRows(row['definition']);\n}\n\nfunction queryOutputRows(query: Record<string, unknown>): CatalogIoRow[] {\n const columns = toIoRows(query['columns']);\n if (columns.length) {\n return columns;\n }\n const valueType = asText(query['valueType']);\n if (valueType) {\n return [{ name: 'value', dataType: valueType, required: false }];\n }\n return [];\n}\n\nfunction queryInputRows(query: Record<string, unknown>): CatalogIoRow[] {\n const args = capabilityProperties(query['args']);\n const filter = capabilityProperties(query['filter']);\n if (!args.length) {\n return filter;\n }\n if (!filter.length) {\n return args;\n }\n const seen = new Set(args.map((row) => row.name));\n return [...args, ...filter.filter((row) => !seen.has(row.name))];\n}\n\nfunction emptyTables(showOutput: boolean): CatalogIoTables {\n return {\n input: [],\n output: [],\n showOutput,\n contributions: [],\n extensionKeys: [],\n };\n}\n\n//#endregion\n\n//#region ----- Plugin contributions -----\n\nfunction parseJsonObject(value: unknown): Record<string, unknown> | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n try {\n return asRecord(JSON.parse(trimmed));\n } catch {\n return null;\n }\n }\n return asRecord(value);\n}\n\nfunction namedRows(\n list: unknown,\n nameKeys: string[],\n extraKind?: 'scope' | 'condition',\n): CatalogIoRow[] {\n if (!Array.isArray(list)) {\n return [];\n }\n const rows: CatalogIoRow[] = [];\n for (const item of list) {\n const def = asRecord(item);\n if (!def) {\n continue;\n }\n let name = '';\n for (const key of nameKeys) {\n name = asText(def[key]);\n if (name) {\n break;\n }\n }\n if (!name) {\n continue;\n }\n const title = asText(def['title']) || undefined;\n const fromOption = asText(def['nameFromOption'] || def['idFromOption']);\n const extra =\n extraKind === 'scope'\n ? asText(def['scope']) || undefined\n : extraKind === 'condition'\n ? asText(def['condition']) || undefined\n : undefined;\n const note = joinNotes(\n def,\n fromOption ? [`options.${fromOption}`] : [],\n extraKind === 'condition',\n );\n const dataType = dataTypeOf(def);\n rows.push({\n name,\n ...(title ? { title } : {}),\n ...(dataType ? { dataType } : {}),\n required: hasRequired(def),\n ...(extra && extraKind ? { extra, extraKind } : {}),\n ...(note ? { note } : {}),\n });\n }\n return rows;\n}\n\nfunction contributionSections(json: unknown): {\n contributions: CatalogContributionSection[];\n extensionKeys: string[];\n} {\n const parsed = parseJsonObject(json);\n if (!parsed) {\n return { contributions: [], extensionKeys: [] };\n }\n const contributions: CatalogContributionSection[] = [];\n const add = (\n kind: CatalogContributionKind,\n rows: CatalogIoRow[],\n extraKey?: 'scope' | 'condition',\n ): void => {\n if (!rows.length) {\n return;\n }\n contributions.push({ kind, rows, ...(extraKey ? { extraKey } : {}) });\n };\n\n add('properties', namedRows(parsed['properties'], ['name']));\n add('columns', namedRows(parsed['columns'], ['name'], 'condition'), 'condition');\n add('actions', namedRows(parsed['actions'], ['name'], 'scope'), 'scope');\n add('groups', namedRows(parsed['groups'], ['id', 'name']));\n add('pages', namedRows(parsed['pages'], ['name'], 'condition'), 'condition');\n add('related-entities', namedRows(parsed['relatedEntities'], ['entity', 'name']));\n\n const extensionKeys = Array.isArray(parsed['extensionKeys'])\n ? parsed['extensionKeys'].filter((key): key is string => typeof key === 'string' && key.trim().length > 0)\n : [];\n\n return { contributions, extensionKeys };\n}\n\n//#endregion\n\n//#region ----- Catalog I/O -----\n\nexport function catalogIoFromDetail(\n kind: AXMPlatformExplorerCatalogKind,\n detail: AXMPlatformExplorerCatalogItem | null,\n): CatalogIoTables | null {\n if (!detail) {\n return null;\n }\n if (kind === 'command' && detail.command) {\n return {\n ...emptyTables(true),\n input: toIoRows(detail.command.inputOptionDefinitions),\n output: toIoRows(detail.command.outputOptionDefinitions),\n };\n }\n if (kind === 'query' && detail.query) {\n const query = detail.query as unknown as Record<string, unknown>;\n return {\n ...emptyTables(true),\n input: queryInputRows(query),\n output: queryOutputRows(query),\n };\n }\n if (kind === 'widget' && detail.widget) {\n return {\n ...emptyTables(true),\n input: toIoRows(detail.widget.inputOptionDefinitions),\n output: toIoRows(detail.widget.outputOptionDefinitions),\n };\n }\n if (kind === 'plugin' && detail.plugin) {\n const contributed = contributionSections(detail.plugin.contributionsJson);\n return {\n ...emptyTables(false),\n input: toIoRows(detail.plugin.optionDefinitions),\n contributions: contributed.contributions,\n extensionKeys: contributed.extensionKeys,\n };\n }\n return null;\n}\n\nexport function stringList(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const items: string[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n const text = asText(item);\n if (!text || seen.has(text)) {\n continue;\n }\n seen.add(text);\n items.push(text);\n }\n return items;\n}\n\nexport function categoryLabels(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const items: string[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n const text = asText(item) || asText(asRecord(item)?.['title']) || asText(asRecord(item)?.['name']);\n if (!text || seen.has(text)) {\n continue;\n }\n seen.add(text);\n items.push(text);\n }\n return items;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport type {\n AXMPlatformExplorerCatalogItem,\n AXMPlatformExplorerCatalogKind,\n AXMPlatformExplorerNamedItem,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\nimport {\n catalogIoFromDetail,\n categoryLabels,\n stringList,\n} from './platform-explorer-catalog-io.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-catalog-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXTranslationModule, AXLoadingModule, AXPStateMessageComponent],\n templateUrl: './platform-explorer-catalog-detail.component.html',\n styleUrl: './platform-explorer-catalog-detail.component.css',\n})\nexport class AXPlatformExplorerCatalogDetailComponent {\n kind = input.required<AXMPlatformExplorerCatalogKind>();\n item = input<AXMPlatformExplorerNamedItem | undefined>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly detail = signal<AXMPlatformExplorerCatalogItem | null>(null);\n protected readonly loading = signal(false);\n protected readonly loadError = signal(false);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly ioTables = computed(() => catalogIoFromDetail(this.kind(), this.detail()));\n\n //#endregion\n\n constructor() {\n effect(() => {\n const kind = this.kind();\n const item = this.item();\n void this.load(kind, item?.name);\n });\n }\n\n protected record(): Record<string, unknown> | null {\n const detail = this.detail();\n if (!detail) {\n return null;\n }\n return (detail.command ?? detail.query ?? detail.plugin ?? detail.widget ?? null) as Record<string, unknown> | null;\n }\n\n protected displayTitle(record: Record<string, unknown>): string {\n return String(record['catalogTitle'] ?? record['title'] ?? record['name'] ?? '');\n }\n\n //#region ----- Helpers -----\n\n protected asText(value: unknown): string {\n return typeof value === 'string' ? value : '';\n }\n\n protected asStringList(value: unknown): string[] {\n return stringList(value);\n }\n\n protected asCategoryLabels(value: unknown): string[] {\n return categoryLabels(value);\n }\n\n protected isNumber(value: unknown): boolean {\n return typeof value === 'number' && Number.isFinite(value);\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async load(kind: AXMPlatformExplorerCatalogKind, name: string | undefined): Promise<void> {\n if (!name) {\n this.detail.set(null);\n this.loading.set(false);\n this.loadError.set(false);\n return;\n }\n this.loading.set(true);\n this.loadError.set(false);\n this.detail.set(null);\n try {\n const detail = await this.dataService.getCatalogItem(kind, name);\n if (this.item()?.name === name && this.kind() === kind) {\n this.detail.set(detail);\n }\n } catch {\n if (this.item()?.name === name && this.kind() === kind) {\n this.loadError.set(true);\n }\n } finally {\n if (this.item()?.name === name && this.kind() === kind) {\n this.loading.set(false);\n }\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"flex flex-col flex-1 min-h-0\">\n <!-- ----- Loading catalog row ----- -->\n @if (loading()) {\n <div class=\"flex flex-1 items-center justify-center p-6\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- Catalog row fields ----- -->\n @else if (record(); as row) {\n <section class=\"flex flex-col gap-6 p-4 overflow-auto\">\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 m-0\">\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd class=\"m-0\"><code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ row['name'] }}</code></dd>\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.title' | translate | async }}</dt>\n <dd class=\"m-0\">{{ displayTitle(row) | translate | async }}</dd>\n @if (row['description']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.description' | translate | async }}</dt>\n <dd class=\"m-0\">{{ asText(row['description']) | translate | async }}</dd>\n }\n @if (row['executionMode']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.execution-mode' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['executionMode'] }}</dd>\n }\n @if (row['sourceModule']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.source-module' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['sourceModule'] }}</dd>\n }\n @if (row['type']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.type' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['type'] }}</dd>\n }\n @if (row['dataType']) {\n <dt class=\"font-semibold text-muted\">\n {{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}\n </dt>\n <dd class=\"m-0\">\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ row['dataType'] }}</span>\n </dd>\n }\n @if (asText(row['icon']); as icon) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.icon' | translate | async }}</dt>\n <dd class=\"m-0 flex items-center gap-2\">\n <i [ngClass]=\"icon\" aria-hidden=\"true\"></i>\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\" dir=\"ltr\">{{ icon }}</code>\n </dd>\n }\n @if (isNumber(row['order'])) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.order' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['order'] }}</dd>\n }\n @if (row['defaultFilterWidgetName']) {\n <dt class=\"font-semibold text-muted\">\n {{ '@platform-dev-tools:module.terms.default-filter-widget' | translate | async }}\n </dt>\n <dd class=\"m-0\">\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\" dir=\"ltr\">{{ row['defaultFilterWidgetName'] }}</code>\n </dd>\n }\n @if (asStringList(row['groups']); as groups) {\n <!--->\n <!-- ----- Widget group tags ----- -->\n @if (groups.length) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.groups' | translate | async }}</dt>\n <dd class=\"m-0\">\n <div class=\"axp-platform-explorer__catalog-chips\">\n @for (group of groups; track group) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ group }}</span>\n }\n </div>\n </dd>\n }\n }\n @if (asCategoryLabels(row['categories']); as categories) {\n <!--->\n <!-- ----- Catalog categories ----- -->\n @if (categories.length) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.categories' | translate | async }}</dt>\n <dd class=\"m-0\">\n <div class=\"axp-platform-explorer__catalog-chips\">\n @for (category of categories; track category) {\n <span class=\"axp-platform-explorer__type-chip\">{{ category | translate | async }}</span>\n }\n </div>\n </dd>\n }\n }\n </dl>\n\n <!--->\n <!-- ----- Input, output, and plugin contribution tables ----- -->\n @if (ioTables(); as io) {\n <div class=\"axp-platform-explorer__catalog-io\">\n <section>\n <h2>{{ '@platform-dev-tools:module.terms.input' | translate | async }}</h2>\n <!--->\n <!-- ----- Empty input list ----- -->\n @if (io.input.length === 0) {\n <p class=\"axp-platform-explorer__docs-empty axp-platform-explorer__catalog-io-empty\">\n {{ '@platform-dev-tools:module.messages.no-input' | translate | async }}\n </p>\n }\n <!-- ----- Input rows ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"schemaTable; context: { rows: io.input }\" />\n }\n </section>\n <!--->\n <!-- ----- Output contract for commands, queries, and widgets ----- -->\n @if (io.showOutput) {\n <section>\n <h2>{{ '@platform-dev-tools:module.terms.output' | translate | async }}</h2>\n <!--->\n <!-- ----- Empty output list ----- -->\n @if (io.output.length === 0) {\n <p class=\"axp-platform-explorer__docs-empty axp-platform-explorer__catalog-io-empty\">\n {{ '@platform-dev-tools:module.messages.no-output' | translate | async }}\n </p>\n }\n <!-- ----- Output rows ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"schemaTable; context: { rows: io.output }\" />\n }\n </section>\n }\n <!--->\n <!-- ----- Plugin host contributions from the catalog definition ----- -->\n @if (io.contributions.length) {\n @for (section of io.contributions; track section.kind) {\n <section>\n <h2>{{ ('@platform-dev-tools:module.contributions.' + section.kind) | translate | async }}</h2>\n <!--->\n <!-- ----- Contributed properties use the schema table ----- -->\n @if (section.kind === 'properties') {\n <ng-container *ngTemplateOutlet=\"schemaTable; context: { rows: section.rows }\" />\n }\n <!-- ----- Columns, actions, groups, pages, related entities ----- -->\n @else {\n <ng-container\n *ngTemplateOutlet=\"itemTable; context: { rows: section.rows, extraKey: section.extraKey }\"\n />\n }\n </section>\n }\n }\n <!-- ----- Plugin declared no host contributions ----- -->\n @else if (!io.showOutput) {\n <p class=\"axp-platform-explorer__docs-empty axp-platform-explorer__catalog-io-empty\">\n {{ '@platform-dev-tools:module.messages.no-contributions' | translate | async }}\n </p>\n }\n <!--->\n <!-- ----- Middleware extension keys ----- -->\n @if (io.extensionKeys.length) {\n <section>\n <h2>{{ '@platform-dev-tools:module.contributions.extension-keys' | translate | async }}</h2>\n <div class=\"axp-platform-explorer__catalog-chips\">\n @for (key of io.extensionKeys; track key) {\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\" dir=\"ltr\">{{ key }}</code>\n }\n </div>\n </section>\n }\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template #schemaTable let-rows=\"rows\">\n <div class=\"axp-platform-explorer__table-wrap\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead>\n <tr>\n <th>{{ '@platform-dev-tools:module.terms.field' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.terms.required' | translate | async }}</th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.name) {\n <tr>\n <td>\n <ng-container *ngTemplateOutlet=\"nameCell; context: { row: row }\" />\n </td>\n <td>\n <!--->\n <!-- ----- Stored data type chip ----- -->\n @if (row.dataType) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ row.dataType }}</span>\n }\n <!-- ----- Missing data type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n <td>\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: row.required }\" />\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n</ng-template>\n\n<ng-template #itemTable let-rows=\"rows\" let-extraKey=\"extraKey\">\n <div class=\"axp-platform-explorer__table-wrap\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead>\n <tr>\n <th>{{ '@platform-dev-tools:module.terms.field' | translate | async }}</th>\n <!--->\n <!-- ----- Extra column for scope or condition ----- -->\n @if (extraKey) {\n <th>{{ ('@platform-dev-tools:module.contributions.' + extraKey) | translate | async }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.name) {\n <tr>\n <td>\n <ng-container *ngTemplateOutlet=\"nameCell; context: { row: row }\" />\n </td>\n <!--->\n <!-- ----- Extra cell when the section declares one ----- -->\n @if (extraKey) {\n <td>\n <!--->\n <!-- ----- Action scope ----- -->\n @if (row.extraKind === 'scope' && row.extra) {\n {{ ('@platform-dev-tools:module.contributions.scopes.' + row.extra) | translate | async }}\n }\n <!-- ----- Condition expression ----- -->\n @else if (row.extra) {\n <code dir=\"ltr\">{{ row.extra }}</code>\n }\n <!-- ----- Missing extra ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n</ng-template>\n\n<ng-template #nameCell let-row=\"row\">\n <code dir=\"ltr\">{{ row.name }}</code>\n <!--->\n <!-- ----- Translated title under the field name ----- -->\n @if (row.title) {\n <div class=\"axp-platform-explorer__field-title\">\n {{ row.title | translate | async }}\n </div>\n }\n <!--->\n <!-- ----- Definition notes and option-sourced names ----- -->\n @if (row.note) {\n <div class=\"axp-platform-explorer__field-note\" dir=\"ltr\">{{ row.note }}</div>\n }\n</ng-template>\n\n<ng-template #boolCell let-value=\"value\">\n <!-- ----- Affirmative flag ----- -->\n @if (value === true) {\n <span class=\"axp-platform-explorer__yes\">\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n {{ '@platform-dev-tools:module.property-details.yes' | translate | async }}\n </span>\n }\n <!-- ----- Negative flag ----- -->\n @else {\n {{ '@platform-dev-tools:module.property-details.no' | translate | async }}\n }\n</ng-template>\n","import {\n arrangeWorkflowDiagram,\n type AXPWorkflowConnector,\n type AXPWorkflowDiagramModel,\n type AXPWorkflowNode,\n type AXPWorkflowPort,\n type AXPWorkflowSemanticColor,\n} from '@acorex-platform/module-platform-management-client';\nimport type {\n AXMPlatformExplorerEntityGraph,\n AXMPlatformExplorerEntityGraphEdge,\n AXMPlatformExplorerEntityGraphNode,\n AXMPlatformExplorerEntityGraphProperty,\n AXMPlatformExplorerRelationKind,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\n//#region ----- Constants -----\n\nexport const EXPLORER_ENTITY_NODE_TYPE = 'explorer-entity';\n\n/** Crow's-foot / UML multiplicity shown on ERD ports (not i18n). */\nexport const ERD_CARDINALITY_ONE = '1..1';\nexport const ERD_CARDINALITY_MANY = '0..*';\n\nconst NODE_W = 280;\nconst NODE_HEAD_H = 52;\n/** Room per connector so relation names on parallel edges do not touch. */\nconst PORT_SLOT_H = 24;\nconst PORT_BAND_PAD = 28;\nconst NODE_GAP_Y = 40;\nconst EXTERNAL_GAP_X = 160;\n/** Grid spacing for entities that have no relations. */\nconst ISOLATED_GAP_X = 48;\nconst ISOLATED_GAP_Y = 88;\nconst INTERNAL_ORIGIN = { x: 48, y: 48 };\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface ExplorerEntityNodeData {\n kind: 'entity';\n fullName: string;\n name: string;\n title?: string;\n module: string;\n moduleTitle: string;\n external: boolean;\n icon: string;\n properties: AXMPlatformExplorerEntityGraphProperty[];\n}\n\nexport type ModuleTitleResolver = (moduleName: string) => string;\n\n//#endregion\n\n//#region ----- Node helpers -----\n\nexport function isExplorerEntityNode(node: AXPWorkflowNode): boolean {\n return node.type === EXPLORER_ENTITY_NODE_TYPE;\n}\n\nexport function explorerEntityData(node: AXPWorkflowNode): ExplorerEntityNodeData | null {\n const data = node.data as ExplorerEntityNodeData | undefined;\n return data?.kind === 'entity' ? data : null;\n}\n\n//#endregion\n\n//#region ----- Build diagram -----\n\nfunction relationName(edge: AXMPlatformExplorerEntityGraphEdge): string {\n const labeled = edge.label?.trim();\n if (labeled) {\n return labeled;\n }\n const dot = edge.to.lastIndexOf('.');\n return dot > 0 ? edge.to.slice(dot + 1) : edge.to;\n}\n\nfunction sourceCardinality(kind: AXMPlatformExplorerRelationKind): string {\n return kind === 'lookup' ? ERD_CARDINALITY_MANY : ERD_CARDINALITY_ONE;\n}\n\nfunction targetCardinality(kind: AXMPlatformExplorerRelationKind): string {\n return kind === 'lookup' ? ERD_CARDINALITY_ONE : ERD_CARDINALITY_MANY;\n}\n\nfunction outboundPortId(edge: AXMPlatformExplorerEntityGraphEdge): string {\n return `${edge.from}:out:${edge.kind}:${edge.to}:${edge.label ?? ''}`;\n}\n\nfunction inboundPortId(edge: AXMPlatformExplorerEntityGraphEdge): string {\n return `${edge.to}:in:${edge.kind}:${edge.from}:${edge.label ?? ''}`;\n}\n\nfunction portRatio(index: number, count: number): number {\n if (count <= 1) {\n return 0.5;\n }\n return (index + 1) / (count + 1);\n}\n\nfunction inboundPorts(incoming: AXMPlatformExplorerEntityGraphEdge[]): AXPWorkflowPort[] {\n return incoming.map((edge, index) => ({\n id: inboundPortId(edge),\n kind: 'inbound' as const,\n side: 'left' as const,\n ratio: portRatio(index, incoming.length),\n label: targetCardinality(edge.kind),\n allowMultiple: false,\n readonly: true,\n }));\n}\n\nfunction outboundPorts(outgoing: AXMPlatformExplorerEntityGraphEdge[]): AXPWorkflowPort[] {\n return outgoing.map((edge, index) => ({\n id: outboundPortId(edge),\n kind: 'outbound' as const,\n side: 'right' as const,\n ratio: portRatio(index, outgoing.length),\n label: sourceCardinality(edge.kind),\n readonly: true,\n }));\n}\n\nfunction lookupFieldKeys(edges: AXMPlatformExplorerEntityGraphEdge[]): Set<string> {\n const keys = new Set<string>();\n for (const edge of edges) {\n if (edge.kind === 'lookup' && edge.label) {\n keys.add(`${edge.from}\\0${edge.label}`);\n }\n }\n return keys;\n}\n\nfunction cardHeight(incoming: number, outgoing: number): number {\n const slots = Math.max(incoming, outgoing);\n return slots <= 1 ? NODE_HEAD_H : Math.max(NODE_HEAD_H, PORT_BAND_PAD + slots * PORT_SLOT_H);\n}\n\nfunction toEntityData(\n item: AXMPlatformExplorerEntityGraphNode,\n moduleTitle: string,\n skipLookupFields: Set<string>,\n): ExplorerEntityNodeData {\n return {\n kind: 'entity',\n fullName: item.fullName,\n name: item.name,\n title: item.title,\n module: item.module,\n moduleTitle,\n external: item.external,\n icon: item.icon || 'fa-light fa-table',\n properties: (item.properties ?? []).filter((property) => !skipLookupFields.has(`${item.fullName}\\0${property.name}`)),\n };\n}\n\nfunction entityNode(\n data: ExplorerEntityNodeData,\n outgoing: AXMPlatformExplorerEntityGraphEdge[],\n incoming: AXMPlatformExplorerEntityGraphEdge[],\n): AXPWorkflowNode {\n const color: AXPWorkflowSemanticColor = data.external ? 'warning' : 'primary';\n return {\n id: data.fullName,\n type: EXPLORER_ENTITY_NODE_TYPE,\n title: data.fullName,\n icon: data.icon,\n shape: 'rectangle',\n position: { x: 0, y: 0 },\n size: { width: NODE_W, height: cardHeight(incoming.length, outgoing.length) },\n inboundPorts: inboundPorts(incoming),\n outboundPorts: outboundPorts(outgoing),\n readonly: true,\n color,\n borderColor: color,\n data: { ...data } as Record<string, unknown>,\n };\n}\n\nfunction connectors(edges: AXMPlatformExplorerEntityGraphEdge[]): AXPWorkflowConnector[] {\n return edges.map((edge) => ({\n id: outboundPortId(edge),\n sourceNodeId: edge.from,\n sourcePortId: outboundPortId(edge),\n targetNodeId: edge.to,\n targetPortId: inboundPortId(edge),\n readonly: true,\n color: (edge.kind === 'related' ? 'success' : 'primary') as AXPWorkflowSemanticColor,\n borderColor: (edge.kind === 'related' ? 'success' : 'primary') as AXPWorkflowSemanticColor,\n label: relationName(edge),\n data: { kind: edge.kind },\n }));\n}\n\nfunction nodesBBox(nodes: AXPWorkflowNode[]): { minX: number; minY: number; maxX: number; maxY: number } {\n if (nodes.length === 0) {\n return { minX: INTERNAL_ORIGIN.x, minY: INTERNAL_ORIGIN.y, maxX: INTERNAL_ORIGIN.x, maxY: INTERNAL_ORIGIN.y };\n }\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const node of nodes) {\n minX = Math.min(minX, node.position.x);\n minY = Math.min(minY, node.position.y);\n maxX = Math.max(maxX, node.position.x + node.size.width);\n maxY = Math.max(maxY, node.position.y + node.size.height);\n }\n return { minX, minY, maxX, maxY };\n}\n\nfunction groupEdgesBy(\n edges: AXMPlatformExplorerEntityGraphEdge[],\n keyOf: (edge: AXMPlatformExplorerEntityGraphEdge) => string,\n): Map<string, AXMPlatformExplorerEntityGraphEdge[]> {\n const map = new Map<string, AXMPlatformExplorerEntityGraphEdge[]>();\n for (const edge of edges) {\n const key = keyOf(edge);\n const list = map.get(key);\n if (list) {\n list.push(edge);\n } else {\n map.set(key, [edge]);\n }\n }\n for (const list of map.values()) {\n list.sort((a, b) => relationName(a).localeCompare(relationName(b)) || a.from.localeCompare(b.from));\n }\n return map;\n}\n\n/**\n * Tiles unrelated entities in rows under the related cluster. A single column\n * would make the canvas very tall, which forces fit-to-content to a tiny zoom.\n */\nfunction tileIsolatedNodes(nodes: AXPWorkflowNode[], startY: number, availableWidth: number): Map<string, AXPWorkflowNode> {\n const placed = new Map<string, AXPWorkflowNode>();\n const columns = Math.max(1, Math.floor((availableWidth + ISOLATED_GAP_X) / (NODE_W + ISOLATED_GAP_X)));\n let rowY = startY;\n let rowHeight = 0;\n nodes.forEach((node, index) => {\n const column = index % columns;\n if (column === 0 && index > 0) {\n rowY += rowHeight + NODE_GAP_Y;\n rowHeight = 0;\n }\n placed.set(node.id, {\n ...node,\n position: { x: INTERNAL_ORIGIN.x + column * (NODE_W + ISOLATED_GAP_X), y: rowY },\n });\n rowHeight = Math.max(rowHeight, node.size.height);\n });\n return placed;\n}\n\n/**\n * Converts the explorer entity graph into a readonly ERD. Related entities are\n * arranged left to right, external targets cluster on the right with a yellow\n * header, and unrelated entities tile in a grid underneath. Cards stay\n * header-sized; the property list is shown/hidden without changing layout.\n */\nexport function buildExplorerEntityDiagram(\n graph: AXMPlatformExplorerEntityGraph | null | undefined,\n resolveModuleTitle: ModuleTitleResolver,\n): AXPWorkflowDiagramModel | null {\n if (!graph?.nodes.length) {\n return null;\n }\n\n const nodeIds = new Set(graph.nodes.map((item) => item.fullName));\n const validEdges = graph.edges.filter((edge) => nodeIds.has(edge.from) && nodeIds.has(edge.to));\n const outgoing = groupEdgesBy(validEdges, (edge) => edge.from);\n const incoming = groupEdgesBy(validEdges, (edge) => edge.to);\n const skipLookupFields = lookupFieldKeys(validEdges);\n const relatedIds = new Set(validEdges.flatMap((edge) => [edge.from, edge.to]));\n\n const entityNodes = graph.nodes.map((item) => {\n const data = toEntityData(item, resolveModuleTitle(item.module), skipLookupFields);\n return entityNode(data, outgoing.get(item.fullName) ?? [], incoming.get(item.fullName) ?? []);\n });\n\n const internalRelatedIds = entityNodes\n .filter((node) => !explorerEntityData(node)?.external && relatedIds.has(node.id))\n .map((node) => node.id);\n const arranged = arrangeWorkflowDiagram(\n {\n nodes: entityNodes,\n connectors: connectors(validEdges),\n },\n {\n nodeIds: internalRelatedIds,\n origin: INTERNAL_ORIGIN,\n direction: 'horizontal',\n horizontalGap: 220,\n verticalGap: 72,\n margin: 48,\n groupDisconnected: true,\n },\n );\n\n const internals = arranged.nodes.filter(\n (node) => !explorerEntityData(node)?.external && relatedIds.has(node.id),\n );\n const box = nodesBBox(internals);\n const externals = arranged.nodes\n .filter((node) => explorerEntityData(node)?.external)\n .sort((a, b) => {\n const moduleCmp = (explorerEntityData(a)?.module ?? '').localeCompare(explorerEntityData(b)?.module ?? '');\n return moduleCmp !== 0 ? moduleCmp : a.title.localeCompare(b.title);\n });\n\n const externalX = box.maxX + EXTERNAL_GAP_X;\n let externalY = INTERNAL_ORIGIN.y;\n const positioned = new Map<string, AXPWorkflowNode>();\n for (const node of externals) {\n positioned.set(node.id, {\n ...node,\n position: { x: externalX, y: externalY },\n });\n externalY += node.size.height + NODE_GAP_Y;\n }\n\n const isolated = arranged.nodes\n .filter((node) => !explorerEntityData(node)?.external && !relatedIds.has(node.id))\n .sort((a, b) => a.id.localeCompare(b.id));\n if (isolated.length) {\n const clusterBottom = Math.max(box.maxY, externalY - NODE_GAP_Y, INTERNAL_ORIGIN.y);\n const clusterWidth = Math.max(NODE_W, (externals.length ? externalX + NODE_W : box.maxX) - INTERNAL_ORIGIN.x);\n const startY = internals.length || externals.length ? clusterBottom + ISOLATED_GAP_Y : INTERNAL_ORIGIN.y;\n for (const [id, node] of tileIsolatedNodes(isolated, startY, clusterWidth)) {\n positioned.set(id, node);\n }\n }\n\n return {\n nodes: arranged.nodes.map((node) => positioned.get(node.id) ?? node),\n connectors: arranged.connectors,\n };\n}\n\nexport function connectedNodeIds(model: AXPWorkflowDiagramModel, nodeId: string): string[] {\n const ids = new Set<string>([nodeId]);\n for (const connector of model.connectors) {\n if (connector.sourceNodeId === nodeId) {\n ids.add(connector.targetNodeId);\n }\n if (connector.targetNodeId === nodeId) {\n ids.add(connector.sourceNodeId);\n }\n }\n return [...ids];\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPWorkflowDesignerComponent,\n type AXPWorkflowDiagramModel,\n type AXPWorkflowNode,\n} from '@acorex-platform/module-platform-management-client';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\nimport {\n buildExplorerEntityDiagram,\n connectedNodeIds,\n explorerEntityData,\n type ExplorerEntityNodeData,\n} from './platform-explorer-entity-graph.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-entities-graph',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'axp-explorer-graph-host flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXTranslationModule, AXLoadingModule, AXPStateMessageComponent, AXPWorkflowDesignerComponent],\n templateUrl: './platform-explorer-entities-graph.component.html',\n styleUrl: './platform-explorer-entities-graph.component.css',\n})\nexport class AXPlatformExplorerEntitiesGraphComponent {\n moduleName = input.required<string>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n //#endregion\n\n //#region ----- Constants -----\n\n /** Readonly diagram: no spare drawing area, so fit-to-content keeps cards readable. */\n protected readonly canvasMinSize = { width: 0, height: 0 };\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly loading = signal(false);\n protected readonly loadError = signal(false);\n protected readonly diagram = signal<AXPWorkflowDiagramModel | null>(null);\n protected readonly highlightedNodeIds = signal<readonly string[]>([]);\n protected readonly expandedNodeIds = signal<ReadonlySet<string>>(new Set());\n\n //#endregion\n\n constructor() {\n effect(() => {\n const moduleName = this.moduleName();\n void this.load(moduleName);\n });\n }\n\n //#region ----- Event Handlers -----\n\n protected entityOf(node: AXPWorkflowNode): ExplorerEntityNodeData | null {\n return explorerEntityData(node);\n }\n\n protected entityLabel(entity: ExplorerEntityNodeData): string {\n return entity.fullName || `${entity.module}.${entity.name}`;\n }\n\n protected isExpanded(id: string): boolean {\n return this.expandedNodeIds().has(id);\n }\n\n protected propertyToggleLabel(expanded: boolean): string {\n return expanded\n ? '@platform-dev-tools:module.graph.hide-properties'\n : '@platform-dev-tools:module.graph.show-properties';\n }\n\n protected onToggleProperties(event: Event, id: string): void {\n event.preventDefault();\n event.stopPropagation();\n const next = new Set(this.expandedNodeIds());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.expandedNodeIds.set(next);\n }\n\n protected onNodeClick(event: { node: AXPWorkflowNode }): void {\n const model = this.diagram();\n if (!model) {\n return;\n }\n this.highlightedNodeIds.set(connectedNodeIds(model, event.node.id));\n }\n\n protected onCanvasClick(): void {\n this.highlightedNodeIds.set([]);\n this.expandedNodeIds.set(new Set());\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async load(moduleName: string): Promise<void> {\n this.loading.set(true);\n this.loadError.set(false);\n this.diagram.set(null);\n this.highlightedNodeIds.set([]);\n this.expandedNodeIds.set(new Set());\n try {\n const catalog = await this.dataService.getModule(moduleName);\n if (this.moduleName() !== moduleName) {\n return;\n }\n const graph = catalog?.entityGraph ?? {\n nodes: (catalog?.entities ?? []).map((item) => ({\n fullName: item.fullName,\n module: item.module,\n name: item.name,\n title: item.title,\n icon: item.icon,\n external: false,\n })),\n edges: [],\n };\n this.diagram.set(buildExplorerEntityDiagram(graph, (name) => this.dataService.moduleTitle(name)));\n } catch {\n if (this.moduleName() === moduleName) {\n this.loadError.set(true);\n }\n } finally {\n if (this.moduleName() === moduleName) {\n this.loading.set(false);\n }\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axp-explorer-graph flex flex-col flex-1 min-h-0\">\n <!-- ----- Loading module entity graph ----- -->\n @if (loading()) {\n <div class=\"flex flex-1 items-center justify-center p-6\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- Module has no entities ----- -->\n @else if (!diagram()) {\n <axp-state-message\n icon=\"fa-light fa-diagram-project\"\n [title]=\"'@platform-dev-tools:module.messages.no-entities'\"\n [description]=\"'@platform-dev-tools:module.messages.no-entities-hint'\"\n />\n }\n <!-- ----- Entity-relationship diagram ----- -->\n @else {\n <div class=\"axp-explorer-graph__canvas\">\n <axp-workflow-designer\n [model]=\"diagram()!\"\n [readonly]=\"true\"\n [showPortLabels]=\"true\"\n [showPorts]=\"false\"\n [connectorStub]=\"56\"\n [canvasPadding]=\"80\"\n [minCanvasSize]=\"canvasMinSize\"\n [highlightedNodeIds]=\"highlightedNodeIds()\"\n [nodeBodyTemplate]=\"nodeBodyTpl\"\n (nodeClick)=\"onNodeClick($event)\"\n (designerClick)=\"onCanvasClick()\"\n />\n </div>\n <div class=\"axp-explorer-graph__footer\">\n <p class=\"axp-explorer-graph__hint\">\n {{ '@platform-dev-tools:module.descriptions.entities' | translate | async }}\n </p>\n <div class=\"axp-explorer-graph__legend\">\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__swatch axp-explorer-graph__swatch--internal\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.local-entity' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__swatch axp-explorer-graph__swatch--external\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.external-entity' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-sep\" aria-hidden=\"true\"></span>\n <span class=\"axp-explorer-graph__legend-item\">\n {{ '@platform-dev-tools:module.graph.pk' | translate | async }}\n =\n {{ '@platform-dev-tools:module.graph.pk-hint' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-sep\" aria-hidden=\"true\"></span>\n <span class=\"axp-explorer-graph__legend-item\">\n {{ '@platform-dev-tools:module.graph.cardinality-one' | translate | async }}\n =\n {{ '@platform-dev-tools:module.graph.cardinality-one-hint' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-item\">\n {{ '@platform-dev-tools:module.graph.cardinality-many' | translate | async }}\n =\n {{ '@platform-dev-tools:module.graph.cardinality-many-hint' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-sep\" aria-hidden=\"true\"></span>\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__line axp-explorer-graph__line--lookup\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.lookup' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__line axp-explorer-graph__line--related\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.related' | translate | async }}\n </span>\n </div>\n </div>\n }\n</div>\n\n<ng-template #nodeBodyTpl let-node=\"node\">\n <!-- ----- Entity table ----- -->\n @if (entityOf(node); as entity) {\n <div\n class=\"axp-explorer-graph__entity\"\n [class.axp-explorer-graph__entity--external]=\"entity.external\"\n [class.axp-explorer-graph__entity--expanded]=\"isExpanded(entity.fullName)\"\n >\n <div class=\"axp-explorer-graph__entity-head\">\n <div class=\"axp-explorer-graph__entity-head-main\">\n <span class=\"axp-explorer-graph__entity-name\">{{ entityLabel(entity) }}</span>\n <!--------------------------------------------------------------->\n <!-- ----- Translated catalog title when it differs from the entity name ----- -->\n @if (entity.title && entity.title !== entity.name && entity.title !== entity.fullName) {\n <span class=\"axp-explorer-graph__entity-title\">{{ entity.title | translate | async }}</span>\n }\n </div>\n <!--------------------------------------------------------------->\n <!-- ----- Expand non-lookup properties under the header ----- -->\n @if (entity.properties.length) {\n <button\n type=\"button\"\n class=\"axp-explorer-graph__entity-toggle\"\n [attr.aria-expanded]=\"isExpanded(entity.fullName)\"\n [attr.aria-label]=\"(propertyToggleLabel(isExpanded(entity.fullName)) | translate | async) ?? ''\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onToggleProperties($event, entity.fullName)\"\n >\n <i\n class=\"fa-light\"\n [class.fa-chevron-down]=\"!isExpanded(entity.fullName)\"\n [class.fa-chevron-up]=\"isExpanded(entity.fullName)\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n <!--------------------------------------------------------------->\n <!-- ----- Same-card property list; visibility is toggled from the header ----- -->\n @if (entity.properties.length) {\n <div class=\"axp-explorer-graph__entity-props\" (pointerdown)=\"$event.stopPropagation()\">\n @for (prop of entity.properties; track prop.name) {\n <div class=\"axp-explorer-graph__entity-prop\">\n <!--------------------------------------------------------------->\n <!-- ----- Primary-key badge when the field is id ----- -->\n @if (prop.kind === 'pk') {\n <span class=\"axp-explorer-graph__entity-prop-kind\">\n {{ '@platform-dev-tools:module.graph.pk' | translate | async }}\n </span>\n }\n <span class=\"axp-explorer-graph__entity-prop-name\">{{ prop.name }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n","//#region ----- Imports -----\n\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type {\n AXMPlatformExplorerEntitySummary,\n AXMPlatformExplorerModuleSummary,\n AXMPlatformExplorerNamedItem,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerTreeNode } from './platform-explorer-tree.model';\nimport { AXPlatformExplorerModuleDetailComponent } from './detail/platform-explorer-module-detail.component';\nimport { AXPlatformExplorerEntityDetailComponent } from './detail/platform-explorer-entity-detail.component';\nimport { AXPlatformExplorerCatalogDetailComponent } from './detail/platform-explorer-catalog-detail.component';\nimport { AXPlatformExplorerEntitiesGraphComponent } from './detail/platform-explorer-entities-graph.component';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [\n AXTranslationModule,\n AXPlatformExplorerModuleDetailComponent,\n AXPlatformExplorerEntityDetailComponent,\n AXPlatformExplorerCatalogDetailComponent,\n AXPlatformExplorerEntitiesGraphComponent,\n ],\n template: `\n <div class=\"flex flex-col flex-1 min-h-0\">\n @switch (node().kind) {\n @case ('module') {\n <axp-platform-explorer-module-detail [payload]=\"asModule(node().payload)\" />\n }\n @case ('entity') {\n <axp-platform-explorer-entity-detail [payload]=\"asEntity(node().payload)\" />\n }\n @case ('command') {\n <axp-platform-explorer-catalog-detail kind=\"command\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('query') {\n <axp-platform-explorer-catalog-detail kind=\"query\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('plugin') {\n <axp-platform-explorer-catalog-detail kind=\"plugin\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('widget') {\n <axp-platform-explorer-catalog-detail kind=\"widget\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('diagram') {\n <axp-platform-explorer-entities-graph [moduleName]=\"node().moduleName!\" />\n }\n }\n </div>\n `,\n})\nexport class AXPlatformExplorerDetailComponent {\n node = input.required<PlatformExplorerTreeNode>();\n\n protected asModule(payload: unknown): AXMPlatformExplorerModuleSummary | undefined {\n return payload as AXMPlatformExplorerModuleSummary | undefined;\n }\n\n protected asEntity(payload: unknown): AXMPlatformExplorerEntitySummary | undefined {\n return payload as AXMPlatformExplorerEntitySummary | undefined;\n }\n\n protected asNamed(payload: unknown): AXMPlatformExplorerNamedItem | undefined {\n return payload as AXMPlatformExplorerNamedItem | undefined;\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, ParamMap } from '@angular/router';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXResizableDirective } from '@acorex/cdk/resizable';\nimport {\n AXTreeViewComponent,\n AXTreeViewNode,\n AXTreeViewNodeSelectEvent,\n} from '@acorex/components/tree-view';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTabsModule, type AXTabStripChangedEvent } from '@acorex/components/tabs';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPBreadcrumbItem } from '@acorex-platform/framework-shared/core';\nimport type { AXMPlatformExplorerEntitySummary } from '@acorex-platform/module-platform-management-client/contracts';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport {\n AXPPageLayoutBase,\n AXPPageLayoutBaseComponent,\n AXPPageLayoutComponent,\n} from '@acorex-platform/framework-client/layout/views';\nimport {\n AXPStateMessageComponent,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutHeaderComponent,\n AXPThemeLayoutStartSideComponent,\n} from '@acorex-platform/framework-client/layout/components';\n\nimport { PlatformExplorerDataService } from './platform-explorer-data.service';\nimport { PlatformExplorerTreeNode } from './platform-explorer-tree.model';\nimport { AXPlatformExplorerDetailComponent } from './platform-explorer-detail.component';\nimport {\n explorerRevealIds,\n explorerStateFromQuery,\n isExplorerFolderKind,\n queryParamsFromExplorer,\n sameExplorerNode,\n} from './platform-explorer-route.util';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst CATEGORY_SUFFIXES = ['entities', 'commands', 'queries', 'plugins', 'widgets'] as const;\ntype CategoryKind = (typeof CATEGORY_SUFFIXES)[number];\n\nconst MODULE_LIST_MIN_WIDTH = 256;\nconst MODULE_LIST_DEFAULT_WIDTH = 288;\nconst MODULE_LIST_MAX_WIDTH = 560;\nconst MODULE_LIST_WIDTH_KEY = 'axp.platform-explorer.module-list-width';\n\nfunction readStoredModuleListWidth(): number {\n try {\n const parsed = Number(localStorage.getItem(MODULE_LIST_WIDTH_KEY));\n if (\n Number.isFinite(parsed) &&\n parsed >= MODULE_LIST_MIN_WIDTH &&\n parsed <= MODULE_LIST_MAX_WIDTH\n ) {\n return parsed;\n }\n } catch {\n // ignore missing storage\n }\n return MODULE_LIST_DEFAULT_WIDTH;\n}\n\n//#endregion\n\n//#region ----- Tree mapping -----\n\nfunction toTreeViewNode(node: PlatformExplorerTreeNode, childrenCount?: number): AXTreeViewNode {\n const count = childrenCount ?? node.itemCount;\n return {\n id: node.id,\n title: node.label,\n childrenCount: count && count > 0 ? count : undefined,\n data: { treeNode: node },\n };\n}\n\nfunction parseCategoryParent(parentId: string): { moduleName: string; kind: CategoryKind } | null {\n for (const suffix of CATEGORY_SUFFIXES) {\n const token = `-${suffix}`;\n if (parentId.startsWith('module-') && parentId.endsWith(token)) {\n return {\n moduleName: parentId.slice('module-'.length, parentId.length - token.length),\n kind: suffix,\n };\n }\n }\n return null;\n}\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-page',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'axp-platform-explorer' },\n imports: [\n CommonModule,\n AXTranslationModule,\n AXLoadingModule,\n AXSearchBoxModule,\n AXDecoratorModule,\n AXTabsModule,\n AXPPageLayoutComponent,\n AXPThemeLayoutStartSideComponent,\n AXPThemeLayoutHeaderComponent,\n AXPThemeLayoutBlockComponent,\n AXPStateMessageComponent,\n AXTreeViewComponent,\n AXPlatformExplorerDetailComponent,\n AXResizableDirective,\n ],\n providers: [\n PlatformExplorerDataService,\n {\n provide: AXPPageLayoutBase,\n useExisting: AXPlatformExplorerPageComponent,\n },\n ],\n templateUrl: './platform-explorer-page.component.html',\n styleUrl: './platform-explorer-page.component.css',\n})\nexport class AXPlatformExplorerPageComponent extends AXPPageLayoutBaseComponent {\n protected readonly dataService = inject(PlatformExplorerDataService);\n protected readonly deviceService = inject(AXPDeviceService);\n private readonly route = inject(ActivatedRoute);\n\n readonly loading = signal(true);\n readonly loadError = signal(false);\n readonly selectedNode = signal<PlatformExplorerTreeNode | null>(null);\n protected readonly moduleNodes = signal<PlatformExplorerTreeNode[]>([]);\n protected readonly hasCatalogModules = computed(() =>\n this.moduleNodes().some((node) => node.kind === 'module'),\n );\n protected readonly search = signal('');\n protected readonly tree = viewChild<AXTreeViewComponent>('tree');\n protected readonly entityTabs = this.dataService.entityTabs;\n protected readonly activeEntitySection = this.dataService.activeEntitySection;\n protected readonly moduleListMinWidth = MODULE_LIST_MIN_WIDTH;\n protected readonly moduleListDefaultWidth = MODULE_LIST_DEFAULT_WIDTH;\n protected readonly moduleListMaxWidth = MODULE_LIST_MAX_WIDTH;\n protected readonly moduleListWidth = signal(readStoredModuleListWidth());\n\n private catalogReady = false;\n private syncingFromUrl = false;\n\n constructor() {\n super();\n this.route.queryParamMap.pipe(takeUntilDestroyed()).subscribe((params) => {\n void this.onQueryChanged(params);\n });\n void this.boot();\n }\n\n protected datasource = async (parentId?: string): Promise<AXTreeViewNode[]> => {\n if (!parentId) {\n return this.moduleNodes().map((node) => toTreeViewNode(node, node.itemCount));\n }\n const category = parseCategoryParent(parentId);\n if (category) {\n const children = await this.dataService.getCategoryChildren(category.moduleName, category.kind);\n return children.map((node) => toTreeViewNode(node));\n }\n if (parentId.startsWith('module-')) {\n const moduleName = parentId.slice('module-'.length);\n const children = await this.dataService.getModuleChildren(moduleName);\n return children.map((node) => toTreeViewNode(node, node.itemCount));\n }\n return [];\n };\n\n protected async onSearchChanged(event: AXValueChangedEvent<string>): Promise<void> {\n const text = typeof event.value === 'string' ? event.value : '';\n this.search.set(text);\n this.dataService.clearCache();\n await this.initializeModules(text);\n await this.tree()?.reloadData();\n this.writeQuery(this.selectedNode());\n await this.revealSelection();\n }\n\n override async getPageTitle(): Promise<string> {\n const node = this.selectedNode();\n if (!node) {\n return this.translateService.translateAsync('@platform-dev-tools:module.menus.platform-explorer.title');\n }\n const moduleTitleKey = node.moduleTitle ?? node.label;\n const moduleTitle = await this.translateService.translateAsync(moduleTitleKey);\n switch (node.kind) {\n case 'type-group':\n return this.translateService.translateAsync('@platform-dev-tools:module.menus.platform-explorer.title');\n case 'module':\n return moduleTitle;\n case 'entity':\n case 'command':\n case 'query':\n case 'plugin':\n case 'widget':\n return [moduleTitle, node.label].join(' · ');\n default: {\n const folder = await this.translateService.translateAsync(node.label);\n return [moduleTitle, folder].join(' · ');\n }\n }\n }\n\n override getPageDescription(): string | null | Promise<string | null> {\n const node = this.selectedNode();\n if (!node) {\n return this.translateService.translateAsync('@platform-dev-tools:module.description');\n }\n if (node.kind === 'entity') {\n const entity = node.payload as AXMPlatformExplorerEntitySummary | undefined;\n return entity?.fullName ?? null;\n }\n const key = this.descriptionKeyForKind(node.kind);\n return key ? this.translateService.translateAsync(key) : null;\n }\n\n override getPageBreadcrumbs(): AXPBreadcrumbItem[] | Promise<AXPBreadcrumbItem[]> {\n const node = this.selectedNode();\n const items: AXPBreadcrumbItem[] = [\n { title: '@platform-dev-tools:module.menus.platform-explorer.title' },\n ];\n if (node?.moduleTitle) {\n items.push({ title: node.moduleTitle });\n }\n return items;\n }\n\n protected onModuleListResized(event: AXValueChangedEvent<number>): void {\n if (!event.isUserInteraction || event.value == null) {\n return;\n }\n const width = Math.min(MODULE_LIST_MAX_WIDTH, Math.max(MODULE_LIST_MIN_WIDTH, event.value));\n this.moduleListWidth.set(width);\n try {\n localStorage.setItem(MODULE_LIST_WIDTH_KEY, String(width));\n } catch {\n // ignore quota / private mode\n }\n }\n\n protected async onNodeClick(event: AXTreeViewNodeSelectEvent): Promise<void> {\n const data = event.node?.['data'] as { treeNode?: PlatformExplorerTreeNode } | undefined;\n const treeNode = data?.treeNode;\n if (!treeNode || treeNode.kind === 'type-group') {\n return;\n }\n if (isExplorerFolderKind(treeNode.kind)) {\n const tree = this.tree();\n if (tree) {\n await tree.toggleNodeExpansion(treeNode.id);\n const current = this.selectedNode();\n if (current) {\n tree.selectNode(current.id);\n } else {\n tree.deselectNode(treeNode.id);\n }\n }\n return;\n }\n this.selectPageNode(treeNode);\n }\n\n protected onEntityTabChanged(event: AXTabStripChangedEvent): void {\n const key = event.tab?.key || this.entityTabs()[event.index]?.id;\n if (!key || key === this.dataService.activeEntitySection()) {\n return;\n }\n this.dataService.selectEntitySection(key);\n }\n\n private descriptionKeyForKind(kind: PlatformExplorerTreeNode['kind']): string | null {\n switch (kind) {\n case 'module':\n return '@platform-dev-tools:module.descriptions.module';\n case 'diagram':\n return '@platform-dev-tools:module.descriptions.diagram';\n case 'commands':\n case 'command':\n return '@platform-dev-tools:module.descriptions.command';\n case 'queries':\n case 'query':\n return '@platform-dev-tools:module.descriptions.query';\n case 'plugins':\n case 'plugin':\n return '@platform-dev-tools:module.descriptions.plugin';\n case 'widgets':\n case 'widget':\n return '@platform-dev-tools:module.descriptions.widget';\n default:\n return null;\n }\n }\n\n private async onQueryChanged(params: ParamMap): Promise<void> {\n const state = explorerStateFromQuery(params);\n const nextSearch = state.search ?? '';\n const searchChanged = nextSearch !== this.search();\n if (searchChanged) {\n this.search.set(nextSearch);\n }\n if (!this.catalogReady) {\n return;\n }\n if (searchChanged) {\n this.dataService.clearCache();\n await this.initializeModules(nextSearch);\n await this.tree()?.reloadData();\n }\n await this.applyRouteState(state);\n }\n\n private async boot(): Promise<void> {\n const state = explorerStateFromQuery(this.route.snapshot.queryParamMap);\n if (state.search) {\n this.search.set(state.search);\n }\n await this.initializeModules(this.search());\n this.catalogReady = true;\n await this.applyRouteState(state);\n }\n\n private selectPageNode(treeNode: PlatformExplorerTreeNode): void {\n this.dataService.clearEntityTabs();\n this.selectedNode.set(treeNode);\n this.recompute();\n this.writeQuery(treeNode);\n }\n\n private writeQuery(node: PlatformExplorerTreeNode | null): void {\n if (this.syncingFromUrl) {\n return;\n }\n void this.router.navigate([], {\n relativeTo: this.route,\n queryParams: queryParamsFromExplorer(node, this.search()),\n replaceUrl: true,\n });\n }\n\n private async applyRouteState(state: ReturnType<typeof explorerStateFromQuery>): Promise<void> {\n this.syncingFromUrl = true;\n try {\n const node = await this.dataService.resolveExplorerSelection(state, this.moduleNodes());\n if (sameExplorerNode(this.selectedNode(), node)) {\n await this.revealSelection();\n return;\n }\n this.dataService.clearEntityTabs();\n this.selectedNode.set(node);\n this.recompute();\n await this.revealSelection();\n } finally {\n this.syncingFromUrl = false;\n }\n }\n\n private async revealSelection(): Promise<void> {\n const node = this.selectedNode();\n if (!node) {\n return;\n }\n const tree = await this.waitForTree();\n if (!tree) {\n return;\n }\n const ids = explorerRevealIds(node);\n for (const id of ids.slice(0, -1)) {\n try {\n await tree.expandNode(id);\n } catch {\n // node may not be in the filtered tree\n }\n }\n try {\n tree.selectNode(node.id);\n } catch {\n // ignore missing tree node\n }\n }\n\n private async waitForTree(): Promise<AXTreeViewComponent | undefined> {\n for (let attempt = 0; attempt < 12; attempt++) {\n const tree = this.tree();\n if (tree) {\n return tree;\n }\n await new Promise((resolve) => setTimeout(resolve, 16));\n }\n return this.tree();\n }\n\n private async initializeModules(search?: string): Promise<void> {\n this.loading.set(true);\n this.loadError.set(false);\n try {\n const modules = await this.dataService.listModules(search);\n this.moduleNodes.set(this.dataService.toModuleTreeNodes(modules));\n } catch {\n this.loadError.set(true);\n this.moduleNodes.set([]);\n } finally {\n this.loading.set(false);\n }\n }\n}\n\n//#endregion\n","<axp-page-layout>\n <axp-layout-start-side\n class=\"axp-platform-explorer__start-side\"\n [axResizable]=\"!deviceService.isSmall()\"\n [minWidth]=\"moduleListMinWidth\"\n [maxWidth]=\"moduleListMaxWidth\"\n [width]=\"moduleListWidth()\"\n [defaultWidth]=\"moduleListDefaultWidth\"\n [dblClickAction]=\"'reset'\"\n (onResizingEnded)=\"onModuleListResized($event)\"\n (onResizingDblClick)=\"onModuleListResized($event)\"\n >\n <axp-layout-header>\n <axp-layout-title>\n {{ '@platform-dev-tools:module.menus.platform-explorer.title' | translate | async }}\n </axp-layout-title>\n </axp-layout-header>\n <axp-layout-content class=\"axp-platform-explorer__tree-wrap\">\n <ax-search-box\n class=\"axp-platform-explorer__search\"\n look=\"fill\"\n [delayTime]=\"300\"\n [value]=\"search()\"\n [placeholder]=\"('@platform-dev-tools:module.messages.search-modules' | translate | async) ?? ''\"\n (onValueChanged)=\"onSearchChanged($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n <!-- ----- Loading catalog modules ----- -->\n @if (loading()) {\n <div class=\"axp-platform-explorer__loading\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- No modules in catalog ----- -->\n @else if (!hasCatalogModules()) {\n <axp-state-message\n icon=\"fa-light fa-cubes\"\n [title]=\"'@platform-dev-tools:module.messages.no-modules'\"\n [description]=\"'@platform-dev-tools:module.messages.no-modules-hint'\"\n />\n }\n <!-- ----- Module tree ----- -->\n @else {\n <ax-tree-view\n #tree\n [datasource]=\"datasource\"\n [selectMode]=\"'single'\"\n [showIcons]=\"false\"\n [showChildrenBadge]=\"false\"\n [dragBehavior]=\"'none'\"\n look=\"default\"\n [nodeTemplate]=\"nodeTemplate\"\n (onNodeClick)=\"onNodeClick($event)\"\n />\n }\n </axp-layout-content>\n </axp-layout-start-side>\n\n <!-- ----- Entity layout tabs stay in the sticky page header ----- -->\n @if (entityTabs().length) {\n <axp-page-toolbar class=\"axp-platform-explorer__entity-toolbar\">\n <ax-tabs\n class=\"axp-platform-explorer__entity-tabs\"\n [look]=\"'with-line'\"\n [location]=\"'bottom'\"\n [fitParent]=\"false\"\n (onActiveTabChanged)=\"onEntityTabChanged($event)\"\n >\n @for (tab of entityTabs(); track tab.id) {\n <ax-tab-item\n [key]=\"tab.id\"\n [text]=\"\n ((tab.textKey | translate | async) ?? '') +\n (tab.extraText ? ' · ' + ((tab.extraText | translate | async) ?? '') : '')\n \"\n [active]=\"activeEntitySection() === tab.id\"\n />\n }\n </ax-tabs>\n </axp-page-toolbar>\n }\n\n <axp-page-content class=\"axp-platform-explorer__page-content min-h-0 pt-0\">\n <!-- ----- Selected catalog node ----- -->\n @if (selectedNode(); as node) {\n <axp-platform-explorer-detail [node]=\"node\" />\n }\n <!-- ----- Empty selection ----- -->\n @else {\n <axp-state-message\n icon=\"fa-light fa-sitemap\"\n [title]=\"'@platform-dev-tools:module.messages.select-node'\"\n [description]=\"'@platform-dev-tools:module.messages.select-node-hint'\"\n />\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #nodeTemplate let-node=\"node\">\n @let data = node['data'];\n @let treeNode = data?.treeNode;\n @let kind = treeNode?.kind;\n @let count = node['childrenCount'] ?? treeNode?.itemCount;\n <!-- ----- Manifest type group header ----- -->\n @if (kind === 'type-group') {\n <span\n class=\"axp-platform-explorer__node axp-platform-explorer__node--group\"\n [class.axp-platform-explorer__node--group-divided]=\"treeNode?.divided\"\n >\n <!--->\n <!-- ----- Divider after the previous type group ----- -->\n @if (treeNode?.divided) {\n <span class=\"axp-platform-explorer__group-rule\" aria-hidden=\"true\"></span>\n }\n <span class=\"axp-platform-explorer__group-title\">{{ node['title'] | translate | async }}</span>\n </span>\n }\n <!-- ----- Catalog node ----- -->\n @else {\n <span class=\"axp-platform-explorer__node\">\n @switch (kind) {\n @case ('module') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--module\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-cube'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('entities') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--entities fa-light fa-table\" aria-hidden=\"true\"></i>\n }\n @case ('diagram') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--diagram fa-light fa-diagram-project\" aria-hidden=\"true\"></i>\n }\n @case ('entity') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--entity\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-table'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('commands') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--commands fa-light fa-terminal\" aria-hidden=\"true\"></i>\n }\n @case ('command') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--command\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-play'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('queries') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--queries fa-light fa-database\" aria-hidden=\"true\"></i>\n }\n @case ('query') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--query\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-magnifying-glass'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('plugins') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--plugins fa-light fa-puzzle-piece\" aria-hidden=\"true\"></i>\n }\n @case ('plugin') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--plugin\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-plug'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('widgets') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--widgets fa-light fa-cubes\" aria-hidden=\"true\"></i>\n }\n @case ('widget') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--widget\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-cube'\"\n aria-hidden=\"true\"\n ></i>\n }\n @default {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--default fa-light fa-circle-dot\" aria-hidden=\"true\"></i>\n }\n }\n <span class=\"axp-platform-explorer__node-label\">{{ node['title'] | translate | async }}</span>\n <!--->\n <!-- ----- Child count badge when the folder has items ----- -->\n @if (count != null && count > 0) {\n <span class=\"axp-platform-explorer__node-badge\">{{ count }}</span>\n }\n </span>\n }\n</ng-template>\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXDataSource, AXDataSourceQuery } from '@acorex/cdk/common';\nimport { AXDataTableModule } from '@acorex/components/data-table';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type { AXMPlatformExplorerNamedItem } from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\nimport type { PlatformExplorerNodeKind } from '../platform-explorer-tree.model';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-list-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXDataTableModule, AXTranslationModule],\n template: `\n <div class=\"flex flex-1 min-h-0 p-3 overflow-auto\">\n <ax-data-table\n class=\"flex-1 border border-lightest rounded-md overflow-hidden\"\n [paging]=\"true\"\n [dataSource]=\"dataSource\"\n >\n <ax-text-column [dataField]=\"'name'\" [caption]=\"'@platform-dev-tools:module.terms.name' | translate | async\" [width]=\"'280px'\" [allowResizing]=\"true\"></ax-text-column>\n <ax-text-column [dataField]=\"'title'\" [caption]=\"'@platform-dev-tools:module.terms.title' | translate | async\" [cellTemplate]=\"titleTpl\" [width]=\"'280px'\" [allowResizing]=\"true\"></ax-text-column>\n <ax-text-column [dataField]=\"'description'\" [caption]=\"'@platform-dev-tools:module.terms.description' | translate | async\" [cellTemplate]=\"descTpl\" [allowResizing]=\"true\"></ax-text-column>\n </ax-data-table>\n </div>\n <ng-template #titleTpl let-item>\n @if (item.data?.title) {\n {{ item.data.title | translate | async }}\n }\n @else {\n –\n }\n </ng-template>\n <ng-template #descTpl let-item>\n @if (item.data?.description) {\n {{ item.data.description | translate | async }}\n }\n @else {\n –\n }\n </ng-template>\n `,\n})\nexport class AXPlatformExplorerListDetailComponent {\n moduleName = input.required<string>();\n kind = input.required<PlatformExplorerNodeKind>();\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n readonly dataSource = new AXDataSource<AXMPlatformExplorerNamedItem>({\n key: 'name',\n pageSize: 20,\n load: async (e: AXDataSourceQuery) => {\n const rows = await this.loadRows();\n const skip = e?.skip ?? 0;\n const take = e?.take ?? 20;\n return { items: rows.slice(skip, skip + take), total: rows.length };\n },\n });\n\n constructor() {\n effect(() => {\n this.moduleName();\n this.kind();\n this.dataSource.refresh();\n });\n }\n\n private async loadRows(): Promise<AXMPlatformExplorerNamedItem[]> {\n const catalog = await this.dataService.getModule(this.moduleName());\n if (!catalog) {\n return [];\n }\n switch (this.kind()) {\n case 'entities':\n return catalog.entities.map((item) => ({\n name: item.name,\n title: item.title ?? item.name,\n module: item.module,\n }));\n case 'commands':\n return catalog.commands;\n case 'queries':\n return catalog.queries;\n case 'plugins':\n return catalog.plugins;\n case 'widgets':\n return catalog.widgets;\n default:\n return [];\n }\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { provideLazyProvider } from '@acorex-platform/framework-client/core';\nimport { AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';\nimport { AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';\nimport { AXPRootLayoutComponent } from '@acorex-platform/framework-client/themes/default';\nimport { NgModule } from '@angular/core';\nimport { ROUTES, Routes } from '@angular/router';\nimport { AXMPlatformDevToolsMenuProvider } from './menu.provider';\nimport { AXMPermissionDefinitionProvider } from './permission-definition.provider';\nimport { AXPPlatformDevToolsSettingProvider } from './settings.provider';\nimport { AXPlatformExplorerPageComponent } from './features/platform-explorer';\n\n//#endregion\n\n//#region ---- Routes ----\n\nfunction routesFactory(): Routes {\n return [\n {\n path: ':app/dev/platform-explorer',\n canActivate: [AXPAuthGuard],\n data: { rootLayout: true },\n loadComponent: () => AXPRootLayoutComponent,\n children: [\n {\n path: '',\n loadComponent: () => AXPlatformExplorerPageComponent,\n data: { reuse: true },\n },\n ],\n },\n ];\n}\n\n//#endregion\n\n//#region ---- Module ----\n\n@NgModule({\n imports: [],\n exports: [],\n declarations: [],\n providers: [\n {\n provide: AXP_PERMISSION_DEFINITION_PROVIDER,\n useClass: AXMPermissionDefinitionProvider,\n multi: true,\n },\n provideLazyProvider(AXP_MENU_PROVIDER, () =>\n import('./menu.provider').then(m => m.AXMPlatformDevToolsMenuProvider),\n ),\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXPPlatformDevToolsSettingProvider,\n multi: true,\n },\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFactory,\n },\n ],\n})\nexport class AXMPlatformDevToolsModule { }\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i3","i6","i1","i5"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA;AAEA;AAEA;;AAEG;MAEU,+BAA+B,CAAA;IAC1C,MAAM,MAAM,CAAC,OAA+C,EAAA;QAC1D,MAAM,IAAI,GAAG,qCAAqC;QAClD,MAAM,MAAM,GAAG,4BAA4B;QAC3C,MAAM,CAAC,GAAG,2CAA2C;QACrD,MAAM,CAAC,GAAG,2BAA2B;QAErC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,8BAA8B,EAAE,CAAA,EAAG,CAAC,CAAA,kCAAA,CAAoC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAEhJ;AACG,aAAA,QAAQ,CACP,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EACpC,CAAA,EAAG,CAAC,CAAA,sCAAA,CAAwC,EAC5C,CAAA,EAAG,CAAC,CAAA,4CAAA,CAA8C,EAClD,EAAE,MAAM,EAAE,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;AAExD,aAAA,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,EAAG,CAAC,CAAA,oBAAA,CAAsB,EAAE,CAAA,EAAG,CAAC,CAAA,0BAAA,CAA4B,EAAE;YAC7F,OAAO,EAAE,CAAC,kBAAkB,CAAC;YAC7B,gBAAgB,EAAE,CAAC,kBAAkB,CAAC;SACvC;AACA,aAAA,aAAa;AACb,aAAA,QAAQ,EAAE;IACf;8GAtBW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA/B,+BAA+B,EAAA,CAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAD3C;;;ACtBD;AASA;AAEA;AAEA;;AAEG;MACU,kCAAkC,CAAA;IAC7C,MAAM,OAAO,CAAC,OAA4C,EAAA;QACxD;AACG,aAAA,QAAQ,CACP,oBAAoB,EACpB,8CAA8C,EAC9C,gDAAgD,EAChD,oBAAoB,EACpB,0CAA0C,EAC1C,GAAG;AAEJ,aAAA,UAAU,CACT,WAAW,EACX,8CAA8C,EAC9C,oDAAoD;AAErD,aAAA,UAAU,CAAC;YACV,GAAG,EAAE,2BAA2B,CAAC,SAAS;AAC1C,YAAA,KAAK,EAAE,+DAA+D;AACtE,YAAA,WAAW,EAAE,qEAAqE;AAClF,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,aAAa,EAAE,EAAE;;AAEjB,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,YAAY;AAC1C,aAAA;SACF;AACA,aAAA,UAAU;AACV,aAAA,UAAU,CACT,2DAA2D,EAC3D,iEAAiE,EACjE,uEAAuE;AAExE,aAAA,UAAU;AACV,aAAA,QAAQ,EAAE;IACf;AACD;AAED;;ACxDA;AA8BA;;ACfA;AAEA;AAEO,MAAM,qBAAqB,GAAG,QAAQ;AACtC,MAAM,mBAAmB,GAAG,MAAM;AAClC,MAAM,mBAAmB,GAAG,MAAM;AAClC,MAAM,qBAAqB,GAAG,GAAG;AAExC,MAAM,YAAY,GAAG,IAAI,GAAG,CAA2B,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACjH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAmB;IAC3C,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;AACT,CAAA,CAAC;AAEF;AAEA;AAEM,SAAU,oBAAoB,CAAC,IAA0C,EAAA;IAC7E,OAAO,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AACzC;AAEM,SAAU,kBAAkB,CAAC,IAAwB,EAAA;IACzD,OAAO,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAwB,CAAC;AAC3D;AAEM,SAAU,iBAAiB,CAC/B,IAAqF,EAAA;IAErF,QAAQ,IAAI;AACV,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,UAAU;AACnB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,UAAU;AACnB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,SAAS;AAClB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,SAAS;AAClB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,SAAS;;AAEtB;AAEA;AAEA;AAEA,SAAS,KAAK,CAAC,GAAa,EAAE,GAAW,EAAA;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;IAClC,OAAO,KAAK,IAAI,SAAS;AAC3B;AAEM,SAAU,sBAAsB,CAAC,GAAa,EAAA;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,qBAAqB,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,mBAAmB,CAAC;AAC/C,IAAA,MAAM,IAAI,GAAG,OAAO,KAAK,UAAU,GAAG,SAAS,GAAG,OAAO;IACzD,OAAO;AACL,QAAA,IAAI,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC7B,QAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,GAAG,EAAE,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC;QACrF,IAAI,KAAK,CAAC,GAAG,EAAE,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,GAAG,EAAE,CAAC;KAC5F;AACH;AAEM,SAAU,uBAAuB,CACrC,IAAqC,EACrC,MAAc,EAAA;AAEd,IAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE;AACvB,IAAA,MAAM,MAAM,GAAW;QACrB,CAAC,qBAAqB,GAAG,IAAI;QAC7B,CAAC,mBAAmB,GAAG,IAAI;QAC3B,CAAC,mBAAmB,GAAG,IAAI;AAC3B,QAAA,CAAC,qBAAqB,GAAG,CAAC,IAAI,IAAI;KACnC;AACD,IAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC1E,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,QAAA,MAAM,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,UAAU;IACjD;AACA,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC1B,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;AAC3B,QAAA,MAAM,CAAC,mBAAmB,CAAC,GAAG,SAAS;AACvC,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IACE,IAAI,CAAC,IAAI,KAAK,QAAQ;QACtB,IAAI,CAAC,IAAI,KAAK,SAAS;QACvB,IAAI,CAAC,IAAI,KAAK,OAAO;QACrB,IAAI,CAAC,IAAI,KAAK,QAAQ;AACtB,QAAA,IAAI,CAAC,IAAI,KAAK,QAAQ,EACtB;AACA,QAAA,MAAM,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,IAAI;AACvC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAA6D;AAClF,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAClC,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACtC,IAAI,CAAC,KAAK;AACZ,QAAA,MAAM,CAAC,mBAAmB,CAAC,GAAG,IAAI;IACpC;AACA,IAAA,OAAO,MAAM;AACf;SAEgB,cAAc,CAAC,UAAkB,EAAE,IAAsB,EAAE,IAAa,EAAA;AACtF,IAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,OAAO,CAAA,OAAA,EAAU,UAAU,CAAA,CAAE;IAC/B;AACA,IAAA,IAAI,IAAI,KAAK,SAAS,EAAE;QACtB,OAAO,CAAA,OAAA,EAAU,UAAU,CAAA,QAAA,CAAU;IACvC;AACA,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,EAAE,EAAE;AAChC;AAEM,SAAU,iBAAiB,CAAC,IAA8B,EAAA;AAC9D,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;IAClC,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB;AACA,IAAA,MAAM,GAAG,GAAG,CAAC,UAAU,UAAU,CAAA,CAAE,CAAC;AACpC,IAAA,IACE,IAAI,CAAC,IAAI,KAAK,QAAQ;QACtB,IAAI,CAAC,IAAI,KAAK,SAAS;QACvB,IAAI,CAAC,IAAI,KAAK,OAAO;QACrB,IAAI,CAAC,IAAI,KAAK,QAAQ;AACtB,QAAA,IAAI,CAAC,IAAI,KAAK,QAAQ,EACtB;AACA,QAAA,GAAG,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;IAClE;AACA,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC1B,QAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACnB;AACA,IAAA,OAAO,GAAG;AACZ;AAEM,SAAU,gBAAgB,CAC9B,IAAqC,EACrC,KAAsC,EAAA;AAEtC,IAAA,OAAO,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE,EAAE;AAC/B;AAEA;;ACrKA;AAuCA;AAEA;MAGa,2BAA2B,CAAA;AADxC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC;QACtC,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEjF,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAA4C;QAEhE,IAAA,CAAA,UAAU,GAAG,MAAM,CAA8B,EAAE;uFAAC;QACpD,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,YAAY;gGAAC;AAoRpD,IAAA;IAlRC,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;IAC1B;AAEA,IAAA,aAAa,CAAC,IAAiC,EAAA;AAC7C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEA,IAAA,mBAAmB,CAAC,OAAe,EAAA;AACjC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;IACvC;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;IAC5C;IAEA,MAAM,WAAW,CAAC,MAAe,EAAA;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAG1C,4BAA4B,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;QACpF,OAAO,uBAAuB,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE;IACrD;IAEA,MAAM,SAAS,CAAC,UAAkB,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QACzC,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AACA,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAG1C,4BAA4B,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,uBAAuB,CAAC,MAAM,CAAC,IAAI,IAAI;QACvD,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;QACrC;AACA,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,MAAM,SAAS,CAAC,UAAkB,EAAE,UAAkB,EAAA;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAG1C,4BAA4B,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACrF,QAAA,OAAO,uBAAuB,CAAC,MAAM,CAAC,IAAI,IAAI;IAChD;AAEA,IAAA,MAAM,cAAc,CAClB,IAAoC,EACpC,IAAY,EAAA;AAEZ,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAG1C,4BAA4B,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9D,QAAA,OAAO,uBAAuB,CAAC,MAAM,CAAC,IAAI,IAAI;IAChD;AAEA,IAAA,WAAW,CAAC,UAAkB,EAAA;QAC5B,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,UAAU,CAAC;IAC/C;AAEA,IAAA,WAAW,CAAC,UAAkB,EAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,IAAI,UAAU;IAC1D;AAEA,IAAA,UAAU,CAAC,UAAkB,EAAA;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,IAAI,kBAAkB;IACjE;AAEA,IAAA,MAAM,wBAAwB,CAC5B,KAAyB,EACzB,WAAuC,EAAA;QAEvC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;QACvC,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,IAAI;QACb;QACA,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC;QACvG,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,IAAI;QACb;AACA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;AACvB,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE;AAC9B,YAAA,OAAO,UAAU;QACnB;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AAC1C,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AAChD,YAAA,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE;AAC7B,gBAAA,OAAO,UAAU;YACnB;YACA,OAAO;gBACL,EAAE,EAAE,CAAA,OAAA,EAAU,UAAU,CAAA,QAAA,CAAU;AAClC,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,KAAK,EAAE,0CAA0C;gBACjD,UAAU;AACV,gBAAA,WAAW,EAAE,KAAK;aACnB;QACH;QACA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;QAC/B,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,UAAU;QACnB;AACA,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpF,QACE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAA6D;YAClF,QACE,IAAI,CAAC,EAAE,KAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;gBAC7B,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI;gBACpC,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,KAAK,IAAI;AAE5C,QAAA,CAAC,CAAC,IAAI,UAAU;IAEpB;AAEA,IAAA,iBAAiB,CAAC,OAA2C,EAAA;AAC3D,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqD;QAC5E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;AACjD,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB;AACA,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3C,MAAM,IAAI,GAAG,iBAAiB,CAAC;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,QAAQ,EAAE,IAAI;gBACpB,QAAQ,EAAE,QAAQ,EAAE,QAAQ;AAC7B,aAAA,CAAC;YACF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;AACpC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;QACzB;QAEA,MAAM,KAAK,GAA+B,EAAE;QAC5C,IAAI,UAAU,GAAG,IAAI;QACrB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;YACjD,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KACpD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CACrG;AACD,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBACrB;YACF;YACA,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,CAAA,WAAA,EAAc,IAAI,CAAA,CAAE;AACxB,gBAAA,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,CAAA,sDAAA,EAAyD,IAAI,CAAA,CAAE;gBACtE,OAAO,EAAE,CAAC,UAAU;AACrB,aAAA,CAAC;YACF,UAAU,GAAG,KAAK;AAClB,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACpC;QACF;AACA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,YAAY,CAAC,GAAqC,EAAA;QACxD,OAAO;AACL,YAAA,EAAE,EAAE,CAAA,OAAA,EAAU,GAAG,CAAC,IAAI,CAAA,CAAE;AACxB,YAAA,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YACjC,UAAU,EAAE,GAAG,CAAC,IAAI;YACpB,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,YAAA,SAAS,EAAE,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5D,YAAA,OAAO,EAAE,GAAG;SACb;IACH;IAEA,MAAM,iBAAiB,CAAC,UAAkB,EAAA;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC1C,MAAM,KAAK,GAA+B,EAAE;QAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,CAAA,OAAA,EAAU,UAAU,CAAA,QAAA,CAAU;AAClC,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,KAAK,EAAE,0CAA0C;gBACjD,UAAU;AACV,gBAAA,WAAW,EAAE,KAAK;AACnB,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AAChF,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AAChF,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AAC9E,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AAC9E,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AAC9E,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,MAAM,mBAAmB,CAAC,UAAkB,EAAE,IAAsC,EAAA;QAClF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC1C,QAAQ,IAAI;AACV,YAAA,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AACrC,oBAAA,EAAE,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,QAAQ,CAAA,CAAE;AAC7B,oBAAA,IAAI,EAAE,QAAiB;oBACvB,KAAK,EAAE,IAAI,CAAC,IAAI;oBAChB,UAAU;AACV,oBAAA,WAAW,EAAE,KAAK;oBAClB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,oBAAA,OAAO,EAAE,IAAI;AACd,iBAAA,CAAC,CAAC;AACL,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAClG;AACH,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAC9B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAChG;AACH,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAC9B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACjG;AACH,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAC9B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACjG;AACH,YAAA;AACE,gBAAA,OAAO,EAAE;;IAEf;IAEQ,YAAY,CAClB,KAAiC,EACjC,UAAkB,EAClB,WAAmB,EACnB,IAAiE,EACjE,KAAa,EAAA;AAEb,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd;QACF;QACA,KAAK,CAAC,IAAI,CAAC;AACT,YAAA,EAAE,EAAE,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;YAClC,IAAI;YACJ,KAAK,EAAE,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAE;YACjD,UAAU;YACV,WAAW;AACX,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC;IACJ;AAEQ,IAAA,SAAS,CACf,IAA+C,EAC/C,IAAY,EACZ,KAAa,EACb,UAAkB,EAClB,WAAmB,EACnB,OAAgB,EAChB,IAAa,EAAA;QAEb,OAAO;AACL,YAAA,EAAE,EAAE,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;YACrB,IAAI;YACJ,KAAK;YACL,UAAU;YACV,WAAW;YACX,IAAI;YACJ,OAAO;SACR;IACH;8GA1RW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA3B,2BAA2B,EAAA,CAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC;;;AC3CD;AAwCA;AAEA;AAEA,MAAM,SAAS,GAAG,uDAAuD;AACzE,MAAM,WAAW,GAAG,yDAAyD;AAE7E;AAEA;MAWa,uCAAuC,CAAA;AATpD,IAAA,WAAA,GAAA;AAUE,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK;+FAAgD;AAE9C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;AAE/C,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAA4B,MAAK;AACjE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;YAC3D,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,OAAO,IAAI;YACb;YACA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC5C,CAAC;iFAAC;AAuBH,IAAA;IArBS,MAAM,CAAC,IAAY,EAAE,QAA2B,EAAA;AACtD,QAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC;AACxC,QAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC;QAC5C,OAAO;YACL,IAAI;AACJ,YAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;YAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;AACjC,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,kBAAkB;YACzC,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,IAAI;AACJ,YAAA,OAAO,EAAE,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;YAC/B,MAAM;AACN,YAAA,SAAS,EAAE,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;YACrC,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,YAAA,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;AAC7B,YAAA,YAAY,EAAE,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM;AACxD,gBAAA,IAAI,EAAE,GAAG;gBACT,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC;AACnE,aAAA,CAAC,CAAC;SACJ;IACH;8GArCW,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uCAAuC,mSC5DpD,+lJA6FA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,8BAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAG/C,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBATnD,SAAS;+BACE,qCAAqC,EAAA,UAAA,EACnC,IAAI,EAAA,aAAA,EACD,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,mBAAmB,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,+lJAAA,EAAA;;;AE/C7D;AAEA;AAEA,SAAS,iBAAiB,CAAC,IAAY,EAAA;AACrC,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;AAC3B,IAAA,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAC7E;AAEA,SAAS,kBAAkB,CAAC,IAAa,EAAA;AACvC,IAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAChB,QAAA,OAAO,IAAI;IACb;IACA,IAAI,MAAM,GAAY,IAAI;AAC1B,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;QAC3B,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IACA,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAChD,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,MAAsC;AAC/C;AAEA,SAAS,YAAY,CAAC,OAAgB,EAAE,GAAuB,EAAA;AAC7D,IAAA,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC1D,QAAA,OAAO,EAAE;IACX;AACA,IAAA,MAAM,KAAK,GAAI,OAAmC,CAAC,GAAG,CAAC;AACvD,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;AACtD;AAEA,SAAS,gBAAgB,CAAC,MAAyC,EAAA;IACjE,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,CAAC;AAClE,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU;AAC/B,IAAA,MAAM,GAAG,GAAG,CAAC,IAAwB,EAAE,cAAuB,KAAU;QACtE,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC;QAC/D,MAAM,SAAS,GAAG,UAAU,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAClD,IAAI,SAAS,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE;AAC9C,YAAA,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QACtB;AACF,IAAA,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,UAAU,IAAI,EAAE,EAAE;QACtD,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC;IAC7C;IACA,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,OAAO,IAAI,EAAE,EAAE;QACjD,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC;IACzC;AACA,IAAA,OAAO,CAAC,GAAG,KAAK,CAAC;AACnB;AAEA;;;AAGG;AACG,SAAU,uBAAuB,CACrC,OAA4C,EAAA;AAE5C,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqC;AACxD,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,QAAA,MAAM,MAAM,GAA8B;YACxC,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;SACnC;QACD,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE;YAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACvB,gBAAA,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;YAC5B;QACF;IACF;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;;AC1FA;AAOA;AAEA;AAEA,SAAS,UAAU,CAAC,KAAc,EAAA;AAChC,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACxF,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;AACA,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC9B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;AACF;AAEA,SAAS,QAAQ,CAAC,MAAc,EAAE,GAAW,EAAA;AAC3C,IAAA,OAAO,MAAM,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,GAAG;AAC1C;SAEgB,cAAc,CAAC,KAAc,EAAE,MAAM,GAAG,EAAE,EAAA;IACxD,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AACtD,QAAA,OAAO,EAAE;IACX;IACA,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC/C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,gBAAA,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE;YACtD;YACA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9F;AACA,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,MAAM,CACrE,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,UAAU,CACrE;AACD,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE;QACtD;QACA,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1F;AACA,IAAA,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AACrD;AAEM,SAAU,eAAe,CAAC,IAAwB,EAAA;AACtD,IAAA,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;AACjB,QAAA,OAAO,EAAE;IACX;AACA,IAAA,IAAI;QACF,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC;AAAE,IAAA,MAAM;QACN,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACpC;AACF;AAEA;;ACVA;AAEA;AAEA,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC;AAEtE;AAEA;AAEA,SAAS,SAAS,CAAC,KAAc,EAAA;AAC/B,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,SAAS;IAClB;AACA,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACtC,QAAA,OAAO,SAAS;IAClB;AACA,IAAA,OAAO,OAAO;AAChB;AAEA,SAAS,aAAa,CAAC,IAAY,EAAA;AACjC,IAAA,OAAO;SACJ,KAAK,CAAC,GAAG;SACT,MAAM,CAAC,OAAO;SACd,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;SAC1D,IAAI,CAAC,GAAG,CAAC;AACd;AAEA,SAAS,gBAAgB,CAAC,KAAc,EAAA;AACtC,IAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;QAC9B,OAAO,KAAK,GAAG,KAAK,GAAG,IAAI;IAC7B;IACA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAC7C,QAAA,OAAO,KAAK,CAAC,IAAI,EAAE;IACrB;AACA,IAAA,OAAO,SAAS;AAClB;AAEA,SAAS,SAAS,CAAC,KAAc,EAAA;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAA8B,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;AAC5F;AAEA,SAAS,aAAa,CAAC,MAAe,EAAA;IACpC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACzC,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,SAAS,CAAE,MAAgC,CAAC,OAAO,CAAC;AAC7D;AAEA,SAAS,cAAc,CAAC,OAAmC,EAAA;AAKzD,IAAA,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;AACjC,QAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;IAClE;AACA,IAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;IAC/D;AACA,IAAA,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC1C,OAAO;AACL,YAAA,IAAI,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,GAAG,EAAE;AAC1D,YAAA,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;AAC7C,YAAA,aAAa,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;SAChD;IACH;AACA,IAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;AAC1D;AAEA,SAAS,YAAY,CAAC,KAAyC,EAAA;AAI7D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE;IACvC;IACA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAC7C,QAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE;IACnD;AACA,IAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;AACzB;AAEA;AAEA;AAEA,SAAS,YAAY,CAAC,MAAuB,EAAE,EAAU,EAAE,KAAa,EAAA;IACtE,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;IACxC,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;AAClD,IAAA,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,SAAS;IACtE,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACpG,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAExG,OAAO;QACL,EAAE;AACF,QAAA,IAAI,EAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,SAAS;AAC/D,QAAA,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS;QAClE,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,IAAI;AACJ,QAAA,SAAS,EAAE,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE;AAC1C,QAAA,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,YAAY;AACrE,QAAA,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,WAAW;AAC7E,QAAA,IAAI,EAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,SAAS;AAC/D,QAAA,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS;QAClE,SAAS;QACT,WAAW;QACX,MAAM;QACN,QAAQ;AACR,QAAA,SAAS,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI;AAClC,QAAA,SAAS,EAAE,MAAM,CAAC,SAAS,KAAK,IAAI;AACpC,QAAA,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS;QAClE,KAAK;QACL,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,iBAAiB,EAAE,KAAK,CAAC,UAAU;KACpC;AACH;AAEA,SAAS,cAAc,CAAC,OAA0B,EAAE,MAAc,EAAE,KAAK,GAAG,CAAC,EAAA;IAC3E,MAAM,IAAI,GAAyB,EAAE;IACrC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;AAChC,QAAA,MAAM,EAAE,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,EAAE;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;AACxC,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7D;AACF,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,YAAY,CAAC,OAA6B,EAAA;AACjD,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgC;AACnD,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,YAAY;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACjB,QAAA,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;IACtB;IACA,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7E,IAAA,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,KAAK;SAC7B,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;SACnD,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/D;AAEA,SAAS,SAAS,CAChB,EAAU,EACV,IAAwB,EACxB,OAA0B,EAC1B,KAAsC,EACtC,UAAU,GAAG,KAAK,EAAA;IAElB,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,OAAO,IAAI;IACb;IACA,OAAO;QACL,EAAE;QACF,IAAI;AACJ,QAAA,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;QACzB,YAAY,EAAE,KAAK,EAAE,YAAY;QACjC,aAAa,EAAE,KAAK,EAAE,aAAa;QACnC,iBAAiB,EAAE,KAAK,EAAE,iBAAiB;QAC3C,WAAW,EAAE,KAAK,EAAE,WAAW;QAC/B,iBAAiB,EAAE,KAAK,EAAE,iBAAiB;AAC3C,QAAA,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;QAC1B,WAAW,EAAE,IAAI,CAAC,MAAM;KACzB;AACH;AAEA,SAAS,UAAU,CAAC,KAAiC,EAAA;AACnD,IAAA,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM;QAClC,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,KAAA,CAAC,CAAC;AACL;AAEA,SAAS,iBAAiB,CAAC,OAAyB,EAAA;AAClD,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI;AACjC,IAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,SAAS;AACpD;AAEM,SAAU,mBAAmB,CAAC,MAAiB,EAAA;AACnD,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM;IACxC,MAAM,QAAQ,GAA4B,EAAE;AAE5C,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;QAClE,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;QAC3C,iBAAiB,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC;QACvD,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;KACvC,EAAE,IAAI,CAAC;IACR,IAAI,IAAI,EAAE;AACR,QAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IACrB;AAEA,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;QAC1E,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;QAC7C,iBAAiB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;KAC1D,EAAE,IAAI,CAAC;IACR,IAAI,MAAM,EAAE;AACV,QAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACvB;AAEA,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;QAC1E,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;KAC9C,EAAE,IAAI,CAAC;IACR,IAAI,MAAM,EAAE;AACV,QAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACvB;AAEA,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;QAC1E,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;KAC9C,EAAE,IAAI,CAAC;IACR,IAAI,MAAM,EAAE;AACV,QAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACvB;AAEA,IAAA,MAAM,UAAU,GAAG,SAAS,CAC1B,aAAa,EACb,aAAa,EACb,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAC9C;AACE,QAAA,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;AAC9D,QAAA,iBAAiB,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC;AAC3E,KAAA,CACF;IACD,IAAI,UAAU,EAAE;AACd,QAAA,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;IAC3B;AAEA,IAAA,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;QACxD,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;QACjD,MAAM,OAAO,GAAG,SAAS,CAAC,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,EAAE,SAAS,EAAE,cAAc,EAAE;AACvE,YAAA,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;YACtC,aAAa,EAAE,OAAO,CAAC,MAAM;AAC7B,YAAA,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,CAAC;AAC9C,SAAA,CAAC;QACF,IAAI,OAAO,EAAE;AACX,YAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACxB;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,QAAQ;AACjB;AAEA;;ACxQO,MAAM,yBAAyB,GAAG;IACvC,UAAU;IACV,QAAQ;IACR,UAAU;IACV,SAAS;IACT,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,WAAW;CACH;AAEH,MAAM,yBAAyB,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,CAAU;AAElF,MAAM,+BAA+B,GAAG;IAC7C,eAAe;IACf,UAAU;IACV,iBAAiB;IACjB,gBAAgB;CACR;AAEH,MAAM,+BAA+B,GAAG;IAC7C,QAAQ;IACR,aAAa;IACb,aAAa;IACb,WAAW;IACX,eAAe;CACP;AAEH,MAAM,qBAAqB,GAAG;IACnC,WAAW;IACX,UAAU;IACV,OAAO;IACP,QAAQ;IACR,UAAU;IACV,SAAS;IACT,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,WAAW;IACX,eAAe;CACP;AAEH,MAAM,2BAA2B,GAAG;IACzC,QAAQ;IACR,eAAe;IACf,iBAAiB;IACjB,UAAU;IACV,aAAa;IACb,aAAa;IACb,WAAW;IACX,eAAe;IACf,gBAAgB;CACR;AAMV;AAEA;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;IAClC,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AACtD,QAAA,OAAO,SAAS;IAClB;AACA,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;QAC5B,OAAO,OAAO,IAAI,SAAS;IAC7B;IACA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;AAC3D,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;AACA,IAAA,OAAO,SAAS;AAClB;AAEA,SAAS,uBAAuB,CAC9B,cAAuB,EACvB,kBAA2B,EAC3B,MAAe,EACf,eAAuC,EAAA;AAEvC,IAAA,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;AAClE,IAAA,MAAM,UAAU,GAAG,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,SAAS;IACvE,IAAI,UAAU,EAAE;AACd,QAAA,OAAO,UAAU;IACnB;IACA,OAAO,YAAY,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,kBAAkB,CAAC;AACzE;AAEA,SAAS,QAAQ,CAAC,KAA2B,EAAE,QAAgB,EAAE,KAAc,EAAE,MAAM,GAAG,KAAK,EAAA;AAC7F,IAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;QAC9B;IACF;AACA,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;QACrB;IACF;AACA,IAAA,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE;QACpD;IACF;IACA,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACrC;AAEA,SAAS,QAAQ,CAAC,KAA2B,EAAE,QAAgB,EAAE,KAAc,EAAA;AAC7E,IAAA,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC;AAChC,IAAA,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE;QAC7D;IACF;IACA,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACvC;AAEA,SAAS,QAAQ,CAAC,MAA4B,EAAE,QAAgB,EAAE,KAAc,EAAA;AAC9E,IAAA,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE;QACxE;IACF;IACA,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAClC;AAEA,SAAS,YAAY,CAAC,MAAe,EAAA;AACnC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACpF;AACA,IAAA,OAAO,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;AACxD;AAEA;AAEA;AAEM,SAAU,kBAAkB,CAAC,OAA4B,EAAA;AAC7D,IAAA,QACE,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AACxB,QAAA,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AACxB,QAAA,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC3B,QAAA,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;AAC9B,QAAA,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;AAEjC;AAEM,SAAU,YAAY,CAAC,OAA4B,EAAE,GAAW,EAAA;AACpE,IAAA,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,EAAE,EAAE;AAChE;AAEM,SAAU,kBAAkB,CAChC,OAA4B,EAC5B,IAAuB,EAAA;AAEvB,IAAA,OAAO;SACJ,GAAG,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC;SAChE,MAAM,CAAC,CAAC,IAAI,KAAiC,CAAC,CAAC,IAAI,CAAC;AACzD;AAEM,SAAU,kBAAkB,CAChC,OAA4B,EAC5B,IAAuB,EAAA;AAEvB,IAAA,OAAO;SACJ,GAAG,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC;SAChE,MAAM,CAAC,CAAC,IAAI,KAAiC,CAAC,CAAC,IAAI,CAAC;AACzD;AAEM,SAAU,eAAe,CAC7B,OAA4B,EAC5B,QAA2B,EAC3B,QAA2B,EAC3B,KAAwB,EAAA;AAExB,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B;IACpD,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;QACxD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACxF;IACA,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;QACxD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAClF;AACA,IAAA,OAAO;AACJ,SAAA,GAAG,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;SAC3B,MAAM,CAAC,CAAC,KAAK,KAAmC,CAAC,CAAC,KAAK,CAAC;AAC7D;AAEM,SAAU,oBAAoB,CAClC,MAA0B,EAC1B,UAAwC,EACxC,kBAA0C,EAAE,EAAA;IAE5C,MAAM,KAAK,GAAyB,EAAE;IACtC,MAAM,KAAK,GAAyB,EAAE;IACtC,MAAM,QAAQ,GAA4B,EAAE;IAC5C,MAAM,WAAW,GAA+B,EAAE;IAClD,MAAM,UAAU,GAAyB,EAAE;AAE3C,IAAA,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM;AAC7B,IAAA,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS;AAChC,IAAA,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ;AACrC,IAAA,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO;AAE5B,IAAA,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,IAAI,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC;IAC1F,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;IAElD,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,UAAU,EAAE,aAAa,EAAE,QAAQ;AACxE,IAAA,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE;AACjC,QAAA,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC;IACvC;SAAO;AACL,QAAA,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC;IACvC;AAEA,IAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO;AAC/B,IAAA,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE;QAChC,IAAI,CAAC,OAAO,EAAE;YACZ,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC;QACzC;IACF;SAAO;AACL,QAAA,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC;IACrC;IAEA,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AACrG,IAAA,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;IACrF,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;AAC1D,IAAA,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AACxE,IAAA,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IAEjE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,IAAI,UAAU,EAAE,SAAS,EAAE,IAAI;IAC1D,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AACtH,IAAA,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;AACxC,IAAA,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC;IAEnE,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,UAAU,EAAE,YAAY;AACrE,IAAA,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC;IAC9C,IAAI,WAAW,EAAE;AACf,QAAA,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,CAAC;IAC/C;SAAO;AACL,QAAA,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC;IACrD;IAEA,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;QAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;AAC3C,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;YACrB;QACF;QACA,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK;YACL,MAAM;AACN,YAAA,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ;AAC7B,SAAA,CAAC;IACJ;IAEA,MAAM,KAAK,GAAG,MAAM,EAAE,WAAW,IAAI,UAAU,EAAE,WAAW,IAAI,EAAE;AAClE,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;QAClE,IAAI,CAAC,IAAI,EAAE;YACT;QACF;QACA,WAAW,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,SAAS;AACxF,YAAA,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;YAC1C,QAAQ,EAAE,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AACvD,SAAA,CAAC;IACJ;AAEA,IAAA,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,IAAI,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;IACzF,QAAQ,CAAC,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,eAAe,CAAC;IACjE,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC;IAEzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;AAC5D;AAEA;;ACjUA;AAoEA;AAEA;AAEA,MAAM,mBAAmB,GAAyB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACxF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,QAAQ;IACR,aAAa;IACb,aAAa;IACb,WAAW;IACX,eAAe;AAChB,CAAA,CAAC;AAEF;AAEA;MAqBa,uCAAuC,CAAA;;AAyGlD,IAAA,WAAA,GAAA;AAxGA,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK;+FAAgD;;AAI9C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACjD,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;;QAM7B,IAAA,CAAA,MAAM,GAAG,MAAM,CAAyC,IAAI;mFAAC;QAC7D,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK;oFAAC;QACvB,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK;sFAAC;AACzB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB;QACpD,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgB,IAAI;yFAAC;QAC1C,IAAA,CAAA,gBAAgB,GAAG,YAAY,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,8BAAA,EAAA,CAAA,EAChD,MAAM,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,WAAW,EAAE,MAAM,IAAqB,GACxC;QACiB,IAAA,CAAA,WAAW,GAAG,YAAY,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,aAAA,EAAA,8BAAA,EAAA,CAAA,EAC3C,MAAM,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,WAAW,EAAE,MAAM,EAAE,GACrB;;;AAMiB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;uFAAC;AAChE,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAA8B;AACzE,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,OAAO,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACzD,CAAC;2FAAC;AAEiB,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAClD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;YAChC,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,OAAO,IAAI;YACb;YACA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI;QACnE,CAAC;6FAAC;QAEiB,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,YAAY;2FAAC;QAEtE,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAC1C,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI;0FACxF;QAEkB,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,cAAc;AACjB,cAAE;AACF,cAAE,6DAA6D;6FAClE;AAEkB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;AACpC,YAAA,IAAI,OAAO,KAAK,YAAY,EAAE;AAC5B,gBAAA,OAAO,IAAI;YACb;YACA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI;QACnG,CAAC;yFAAC;AAEiB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAA2B;AACrE,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;YAClC,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,EAAE;YACX;AACA,YAAA,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC;QACxD,CAAC;0FAAC;AAEiB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AACrD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;YACjC,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;4FAAC;AAEiB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;YACjC,IAAI,EAAE,EAAE;AACN,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;gBAC/C,IAAI,KAAK,EAAE;AACT,oBAAA,OAAO,KAAK;gBACd;YACF;AACA,YAAA,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;QACxB,CAAC;2FAAC;AAEiB,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AACvD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACrC,YAAA,OAAO,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACvD,CAAC;kGAAC;AAEiB,QAAA,IAAA,CAAA,2BAA2B,GAAG,QAAQ,CAAC,MAAK;AAC7D,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACrC,YAAA,OAAO,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC7D,CAAC;wGAAC;AAKA,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QAEnE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;;AAIU,IAAA,cAAc,CAAC,IAAY,EAAA;AACnC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEU,IAAA,YAAY,CAAC,EAAU,EAAA;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B;AAEU,IAAA,UAAU,CAAC,IAAY,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI;IACrC;AAEU,IAAA,gBAAgB,CAAC,EAAU,EAAA;QACnC,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE;IACzC;AAEU,IAAA,qBAAqB,CAAC,KAAkC,EAAA;QAChE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IACzC;IAEU,SAAS,CAAC,OAA4B,EAAE,GAAW,EAAA;AAC3D,QAAA,OAAO,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC;IACnC;AAEU,IAAA,UAAU,CAAC,GAAW,EAAA;AAC9B,QAAA,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC;AAEU,IAAA,UAAU,CAAC,GAAW,EAAA;QAC9B,OAAO,GAAG,KAAK,WAAW;IAC5B;AAEU,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;IACtC;AAEU,IAAA,YAAY,CAAC,MAA0B,EAAA;QAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;IACxC;AAEU,IAAA,gBAAgB,CAAC,MAA0B,EAAA;QACnD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5C;AAEU,IAAA,kBAAkB,CAAC,MAA0B,EAAA;QACrD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9C;;;AAMQ,IAAA,aAAa,CAAC,OAA4B,EAAA;QAChD,OAAO,eAAe,CACpB,OAAO,EACP,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,CACtB;IACH;AAEQ,IAAA,mBAAmB,CAAC,OAA4B,EAAA;QACtD,OAAO,eAAe,CACpB,OAAO,EACP,+BAA+B,EAC/B,+BAA+B,EAC/B,2BAA2B,CAC5B;IACH;;;IAMQ,MAAM,UAAU,CAAC,OAAqD,EAAA;AAC5E,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;YAClC;QACF;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;AAC7E,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE;AAC9B,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;AACpE,gBAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACxD;QACF;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE;AAC9B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;QACF;gBAAU;AACR,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE;AAC9B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;IACF;AAEQ,IAAA,SAAS,CAAC,MAA8C,EAAA;QAC9D,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;QACA,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CACrD,CAAC,OAAO,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CACzD;AACD,QAAA,MAAM,IAAI,GAAgC;AACxC,YAAA,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,6CAA6C,EAAE;SAC7E;AACD,QAAA,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE;AACtC,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA,mCAAA,EAAsC,IAAI,CAAA,CAAE,EAAE,CAAC;QAChF;AACA,QAAA,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE,EAAE,MAAM,CAAC,EAAE;AACb,gBAAA,OAAO,EACL,MAAM,CAAC,IAAI,KAAK;AACd,sBAAE;AACF,sBAAE,CAAA,mCAAA,EAAsC,MAAM,CAAC,IAAI,CAAA,CAAE;AACzD,gBAAA,SAAS,EACP,MAAM,CAAC,IAAI,KAAK,SAAS,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,aAAa,GAAG,SAAS;AACtF,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,eAAe,CAAC,MAA8C,EAAA;QACpE,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;QACA,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC;AAC7D,QAAA,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE;AACpD,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CACtE;QACD,MAAM,IAAI,GAAyB,EAAE;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;QAE9B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE;AACrD,YAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzG;QACH;QAEA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,EAAE;YACnD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACxB;YACF;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACrF;AAEA,QAAA,OAAO,IAAI;IACb;IAEQ,KAAK,CACX,IAAY,EACZ,aAAyD,EACzD,eAAuC,EACvC,MAA0B,EAC1B,UAAwC,EAAA;QAExC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC;AACzE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC;AAC1E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC;QAC5F,OAAO;YACL,IAAI;YACJ,KAAK;AACL,YAAA,QAAQ,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;AACpE,YAAA,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;YAC/D,WAAW;YACX,UAAU,EAAE,MAAM,EAAE,IAAI;YACxB,WAAW,EAAE,MAAM,EAAE,KAAK;YAC1B,OAAO;SACR;IACH;AAEQ,IAAA,MAAM,CAAC,KAAc,EAAA;AAC3B,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,SAAS;IACtE;IAEQ,kBAAkB,CAAC,GAAuB,EAAE,KAAa,EAAA;QAC/D,QACE,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC7C,aAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAClD,aAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AACnD,aAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;YACvD,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;IAE3C;AAEQ,IAAA,SAAS,CAAC,KAAyB,EAAA;AACzC,QAAA,IAAI,KAAK,KAAK,KAAK,EAAE;AACnB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,SAAS;IAClB;AAEQ,IAAA,eAAe,CAAC,KAAyB,EAAA;QAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE;AAC/C,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,KAAK;IACd;8GA3UW,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uCAAuC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxGpD,y39BA0rBA,EAAA,MAAA,EAAA,CAAA,+4nBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9lBI,YAAY,mSAEZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,+BAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,cAAc,iYACd,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAKf,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBAnBnD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qCAAqC,cACnC,IAAI,EAAA,aAAA,EACD,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,QACzC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB;wBACjB,iBAAiB;wBACjB,cAAc;wBACd,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,y39BAAA,EAAA,MAAA,EAAA,CAAA,+4nBAAA,CAAA,EAAA;;;AE7DH;AAEA;AAEA,SAAS,QAAQ,CAAC,KAAc,EAAA;AAC9B,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/D,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,KAAgC;AACzC;AAEA,SAAS,MAAM,CAAC,KAAc,EAAA;AAC5B,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;AACtD;AAEA,SAAS,WAAW,CAAC,GAA4B,EAAA;AAC/C,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;AAC5B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC/B,QAAA,OAAO,KAAK;IACd;IACA,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,UAAU,CAAC;AAC5E;AAEA,SAAS,UAAU,CAAC,GAA4B,EAAA;AAC9C,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC;IAChC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE;AACnD,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;IACA,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACxC,IAAA,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AAC3C,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB;AACA,IAAA,OAAO,SAAS;AAClB;AAEA,SAAS,SAAS,CAChB,GAA4B,EAC5B,KAAe,EACf,aAAa,GAAG,KAAK,EAAA;AAErB,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,GAAG,KAAK;AACR,QAAA,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7C,QAAA,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACrB,KAAA,CAAC,MAAM,CAAC,OAAO,CAAC;AACjB,IAAA,OAAO,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS;AACrD;AAEA,SAAS,QAAQ,CAAC,IAAa,EAAA;IAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACxB,QAAA,OAAO,EAAE;IACX;IACA,MAAM,IAAI,GAAmB,EAAE;AAC/B,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AACvB,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE;YACR;QACF;QACA,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC3B;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACd,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,SAAS;AAC/C,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI;AACJ,YAAA,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC3B,YAAA,IAAI,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACjC,YAAA,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC;AAC1B,YAAA,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAC1B,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,oBAAoB,CAAC,OAAgB,EAAA;AAC5C,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC7B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;AACnC,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACpC;AAEA,SAAS,eAAe,CAAC,KAA8B,EAAA;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1C,IAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,QAAA,OAAO,OAAO;IAChB;IACA,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,SAAS,EAAE;AACb,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClE;AACA,IAAA,OAAO,EAAE;AACX;AAEA,SAAS,cAAc,CAAC,KAA8B,EAAA;IACpD,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACpD,IAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClB,QAAA,OAAO,IAAI;IACb;AACA,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE;AAEA,SAAS,WAAW,CAAC,UAAmB,EAAA;IACtC,OAAO;AACL,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,MAAM,EAAE,EAAE;QACV,UAAU;AACV,QAAA,aAAa,EAAE,EAAE;AACjB,QAAA,aAAa,EAAE,EAAE;KAClB;AACH;AAEA;AAEA;AAEA,SAAS,eAAe,CAAC,KAAc,EAAA;AACrC,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;QAC5B,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AACA,IAAA,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB;AAEA,SAAS,SAAS,CAChB,IAAa,EACb,QAAkB,EAClB,SAAiC,EAAA;IAEjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACxB,QAAA,OAAO,EAAE;IACX;IACA,MAAM,IAAI,GAAmB,EAAE;AAC/B,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AACvB,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE;YACR;QACF;QACA,IAAI,IAAI,GAAG,EAAE;AACb,QAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,IAAI,EAAE;gBACR;YACF;QACF;QACA,IAAI,CAAC,IAAI,EAAE;YACT;QACF;QACA,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,SAAS;AAC/C,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;AACvE,QAAA,MAAM,KAAK,GACT,SAAS,KAAK;cACV,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI;cACxB,SAAS,KAAK;kBACZ,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI;kBAC5B,SAAS;QACjB,MAAM,IAAI,GAAG,SAAS,CACpB,GAAG,EACH,UAAU,GAAG,CAAC,CAAA,QAAA,EAAW,UAAU,CAAA,CAAE,CAAC,GAAG,EAAE,EAC3C,SAAS,KAAK,WAAW,CAC1B;AACD,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC;YACR,IAAI;AACJ,YAAA,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC3B,YAAA,IAAI,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACjC,YAAA,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC;AAC1B,YAAA,IAAI,KAAK,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AACnD,YAAA,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAC1B,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,oBAAoB,CAAC,IAAa,EAAA;AAIzC,IAAA,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;IACjD;IACA,MAAM,aAAa,GAAiC,EAAE;IACtD,MAAM,GAAG,GAAG,CACV,IAA6B,EAC7B,IAAoB,EACpB,QAAgC,KACxB;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB;QACF;QACA,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AACvE,IAAA,CAAC;AAED,IAAA,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,IAAA,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC;AAChF,IAAA,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;AACxE,IAAA,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1D,IAAA,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC;AAC5E,IAAA,GAAG,CAAC,kBAAkB,EAAE,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAEjF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;UACvD,MAAM,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAoB,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;UACvG,EAAE;AAEN,IAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE;AACzC;AAEA;AAEA;AAEM,SAAU,mBAAmB,CACjC,IAAoC,EACpC,MAA6C,EAAA;IAE7C,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI;IACb;IACA,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE;QACxC,OAAO;YACL,GAAG,WAAW,CAAC,IAAI,CAAC;YACpB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACtD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC;SACzD;IACH;IACA,IAAI,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE;AACpC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAA2C;QAChE,OAAO;YACL,GAAG,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;AAC5B,YAAA,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC;SAC/B;IACH;IACA,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;QACtC,OAAO;YACL,GAAG,WAAW,CAAC,IAAI,CAAC;YACpB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC;YACrD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC;SACxD;IACH;IACA,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;QACtC,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACzE,OAAO;YACL,GAAG,WAAW,CAAC,KAAK,CAAC;YACrB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAChD,aAAa,EAAE,WAAW,CAAC,aAAa;YACxC,aAAa,EAAE,WAAW,CAAC,aAAa;SACzC;IACH;AACA,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,UAAU,CAAC,KAAc,EAAA;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,EAAE;IACX;IACA,MAAM,KAAK,GAAa,EAAE;AAC1B,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC3B;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACd,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAClB;AACA,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,cAAc,CAAC,KAAc,EAAA;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,EAAE;IACX;IACA,MAAM,KAAK,GAAa,EAAE;AAC1B,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAClG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC3B;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACd,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAClB;AACA,IAAA,OAAO,KAAK;AACd;AAEA;;AC1VA;AA6BA;AAEA;MAYa,wCAAwC,CAAA;;AAwBnD,IAAA,WAAA,GAAA;QAvBA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ;iFAAkC;AACvD,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK;4FAA4C;;AAIvC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;;;QAM/C,IAAA,CAAA,MAAM,GAAG,MAAM,CAAwC,IAAI;mFAAC;QAC5D,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK;oFAAC;QACvB,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK;sFAAC;;;AAMzB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;qFAAC;QAK3F,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAClC,QAAA,CAAC,CAAC;IACJ;IAEU,MAAM,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,IAAI;QACb;AACA,QAAA,QAAQ,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI;IAClF;AAEU,IAAA,YAAY,CAAC,MAA+B,EAAA;AACpD,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAClF;;AAIU,IAAA,MAAM,CAAC,KAAc,EAAA;AAC7B,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,EAAE;IAC/C;AAEU,IAAA,YAAY,CAAC,KAAc,EAAA;AACnC,QAAA,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B;AAEU,IAAA,gBAAgB,CAAC,KAAc,EAAA;AACvC,QAAA,OAAO,cAAc,CAAC,KAAK,CAAC;IAC9B;AAEU,IAAA,QAAQ,CAAC,KAAc,EAAA;QAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC5D;;;AAMQ,IAAA,MAAM,IAAI,CAAC,IAAoC,EAAE,IAAwB,EAAA;QAC/E,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;AAChE,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;AACtD,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YACzB;QACF;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;AACtD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;QACF;gBAAU;AACR,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;AACtD,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;IACF;8GA1FW,wCAAwC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAxC,wCAAwC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3CrD,orYA+RA,EAAA,MAAA,EAAA,CAAA,w4JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxPY,YAAY,mSAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAI3E,wCAAwC,EAAA,UAAA,EAAA,CAAA;kBAVpD,SAAS;+BACE,sCAAsC,EAAA,UAAA,EACpC,IAAI,EAAA,aAAA,EACD,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,CAAC,EAAA,QAAA,EAAA,orYAAA,EAAA,MAAA,EAAA,CAAA,w4JAAA,CAAA,EAAA;;;AEvBzF;AAEO,MAAM,yBAAyB,GAAG,iBAAiB;AAE1D;AACO,MAAM,mBAAmB,GAAG,MAAM;AAClC,MAAM,oBAAoB,GAAG,MAAM;AAE1C,MAAM,MAAM,GAAG,GAAG;AAClB,MAAM,WAAW,GAAG,EAAE;AACtB;AACA,MAAM,WAAW,GAAG,EAAE;AACtB,MAAM,aAAa,GAAG,EAAE;AACxB,MAAM,UAAU,GAAG,EAAE;AACrB,MAAM,cAAc,GAAG,GAAG;AAC1B;AACA,MAAM,cAAc,GAAG,EAAE;AACzB,MAAM,cAAc,GAAG,EAAE;AACzB,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;AAoBxC;AAEA;AAEM,SAAU,oBAAoB,CAAC,IAAqB,EAAA;AACxD,IAAA,OAAO,IAAI,CAAC,IAAI,KAAK,yBAAyB;AAChD;AAEM,SAAU,kBAAkB,CAAC,IAAqB,EAAA;AACtD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0C;AAC5D,IAAA,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI;AAC9C;AAEA;AAEA;AAEA,SAAS,YAAY,CAAC,IAAwC,EAAA;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;IAClC,IAAI,OAAO,EAAE;AACX,QAAA,OAAO,OAAO;IAChB;IACA,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC;IACpC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;AACnD;AAEA,SAAS,iBAAiB,CAAC,IAAqC,EAAA;IAC9D,OAAO,IAAI,KAAK,QAAQ,GAAG,oBAAoB,GAAG,mBAAmB;AACvE;AAEA,SAAS,iBAAiB,CAAC,IAAqC,EAAA;IAC9D,OAAO,IAAI,KAAK,QAAQ,GAAG,mBAAmB,GAAG,oBAAoB;AACvE;AAEA,SAAS,cAAc,CAAC,IAAwC,EAAA;AAC9D,IAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE;AACvE;AAEA,SAAS,aAAa,CAAC,IAAwC,EAAA;AAC7D,IAAA,OAAO,GAAG,IAAI,CAAC,EAAE,CAAA,IAAA,EAAO,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE;AACtE;AAEA,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa,EAAA;AAC7C,IAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,QAAA,OAAO,GAAG;IACZ;IACA,OAAO,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AAClC;AAEA,SAAS,YAAY,CAAC,QAA8C,EAAA;IAClE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACpC,QAAA,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,EAAE,SAAkB;AACxB,QAAA,IAAI,EAAE,MAAe;QACrB,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;AACxC,QAAA,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,QAAA,aAAa,EAAE,KAAK;AACpB,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC,CAAC;AACL;AAEA,SAAS,aAAa,CAAC,QAA8C,EAAA;IACnE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AACpC,QAAA,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,EAAE,UAAmB;AACzB,QAAA,IAAI,EAAE,OAAgB;QACtB,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;AACxC,QAAA,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC,CAAC;AACL;AAEA,SAAS,eAAe,CAAC,KAA2C,EAAA;AAClE,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE;AACxC,YAAA,IAAI,CAAC,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC;QACzC;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,UAAU,CAAC,QAAgB,EAAE,QAAgB,EAAA;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC1C,OAAO,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,GAAG,KAAK,GAAG,WAAW,CAAC;AAC9F;AAEA,SAAS,YAAY,CACnB,IAAwC,EACxC,WAAmB,EACnB,gBAA6B,EAAA;IAE7B,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW;QACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,mBAAmB;AACtC,QAAA,UAAU,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC;KACtH;AACH;AAEA,SAAS,UAAU,CACjB,IAA4B,EAC5B,QAA8C,EAC9C,QAA8C,EAAA;AAE9C,IAAA,MAAM,KAAK,GAA6B,IAAI,CAAC,QAAQ,GAAG,SAAS,GAAG,SAAS;IAC7E,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,QAAQ;AACjB,QAAA,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,IAAI,CAAC,QAAQ;QACpB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACxB,QAAA,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC7E,QAAA,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC;AACpC,QAAA,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC;AACtC,QAAA,QAAQ,EAAE,IAAI;QACd,KAAK;AACL,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,IAAI,EAAE,EAAE,GAAG,IAAI,EAA6B;KAC7C;AACH;AAEA,SAAS,UAAU,CAAC,KAA2C,EAAA;IAC7D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC1B,QAAA,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC;QACxB,YAAY,EAAE,IAAI,CAAC,IAAI;AACvB,QAAA,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC;QAClC,YAAY,EAAE,IAAI,CAAC,EAAE;AACrB,QAAA,YAAY,EAAE,aAAa,CAAC,IAAI,CAAC;AACjC,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,CAA6B;AACpF,QAAA,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,CAA6B;AAC1F,QAAA,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAC1B,KAAA,CAAC,CAAC;AACL;AAEA,SAAS,SAAS,CAAC,KAAwB,EAAA;AACzC,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACtB,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE;IAC/G;AACA,IAAA,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB;AACnC,IAAA,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB;AACnC,IAAA,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB;AACnC,IAAA,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB;AACnC,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AACxD,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC3D;IACA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AACnC;AAEA,SAAS,YAAY,CACnB,KAA2C,EAC3C,KAA2D,EAAA;AAE3D,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgD;AACnE,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACzB,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB;aAAO;YACL,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACtB;IACF;IACA,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrG;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;;;AAGG;AACH,SAAS,iBAAiB,CAAC,KAAwB,EAAE,MAAc,EAAE,cAAsB,EAAA;AACzF,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,cAAc,KAAK,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;IACtG,IAAI,IAAI,GAAG,MAAM;IACjB,IAAI,SAAS,GAAG,CAAC;IACjB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,OAAO;QAC9B,IAAI,MAAM,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;AAC7B,YAAA,IAAI,IAAI,SAAS,GAAG,UAAU;YAC9B,SAAS,GAAG,CAAC;QACf;AACA,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;AAClB,YAAA,GAAG,IAAI;AACP,YAAA,QAAQ,EAAE,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE;AACjF,SAAA,CAAC;AACF,QAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACnD,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,MAAM;AACf;AAEA;;;;;AAKG;AACG,SAAU,0BAA0B,CACxC,KAAwD,EACxD,kBAAuC,EAAA;AAEvC,IAAA,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;AACxB,QAAA,OAAO,IAAI;IACb;IAEA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjE,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/F,IAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;AAC9D,IAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAC5D,IAAA,MAAM,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC3C,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAClF,OAAO,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC/F,IAAA,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG;SACxB,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC/E,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,sBAAsB,CACrC;AACE,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC;KACnC,EACD;AACE,QAAA,OAAO,EAAE,kBAAkB;AAC3B,QAAA,MAAM,EAAE,eAAe;AACvB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,aAAa,EAAE,GAAG;AAClB,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,iBAAiB,EAAE,IAAI;AACxB,KAAA,CACF;AAED,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CACrC,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACzE;AACD,IAAA,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;AAChC,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC;AACxB,SAAA,MAAM,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ;AACnD,SAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QACb,MAAM,SAAS,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;QAC1G,OAAO,SAAS,KAAK,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;AACrE,IAAA,CAAC,CAAC;AAEJ,IAAA,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,cAAc;AAC3C,IAAA,IAAI,SAAS,GAAG,eAAe,CAAC,CAAC;AACjC,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B;AACrD,IAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;AAC5B,QAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;AACtB,YAAA,GAAG,IAAI;YACP,QAAQ,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE;AACzC,SAAA,CAAC;QACF,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU;IAC5C;AAEA,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC;SACvB,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAChF,SAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3C,IAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;AACnB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;AACnF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,eAAe,CAAC,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,eAAe,CAAC,CAAC;AACxG,QAAA,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE;AAC1E,YAAA,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QAC1B;IACF;IAEA,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QACpE,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC;AACH;AAEM,SAAU,gBAAgB,CAAC,KAA8B,EAAE,MAAc,EAAA;IAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,CAAC;AACrC,IAAA,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE;AACxC,QAAA,IAAI,SAAS,CAAC,YAAY,KAAK,MAAM,EAAE;AACrC,YAAA,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC;QACjC;AACA,QAAA,IAAI,SAAS,CAAC,YAAY,KAAK,MAAM,EAAE;AACrC,YAAA,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC;QACjC;IACF;AACA,IAAA,OAAO,CAAC,GAAG,GAAG,CAAC;AACjB;AAEA;;ACpWA;AA6BA;AAEA;MAYa,wCAAwC,CAAA;;AA0BnD,IAAA,WAAA,GAAA;QAzBA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ;uFAAU;;AAIpB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;;;;QAO/C,IAAA,CAAA,aAAa,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;;;QAMvC,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK;oFAAC;QACvB,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK;sFAAC;QACzB,IAAA,CAAA,OAAO,GAAG,MAAM,CAAiC,IAAI;oFAAC;QACtD,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAoB,EAAE;+FAAC;AAClD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE;4FAAC;QAKzE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AAC5B,QAAA,CAAC,CAAC;IACJ;;AAIU,IAAA,QAAQ,CAAC,IAAqB,EAAA;AACtC,QAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC;IACjC;AAEU,IAAA,WAAW,CAAC,MAA8B,EAAA;AAClD,QAAA,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAA,EAAG,MAAM,CAAC,MAAM,CAAA,CAAA,EAAI,MAAM,CAAC,IAAI,EAAE;IAC7D;AAEU,IAAA,UAAU,CAAC,EAAU,EAAA;QAC7B,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC;AAEU,IAAA,mBAAmB,CAAC,QAAiB,EAAA;AAC7C,QAAA,OAAO;AACL,cAAE;cACA,kDAAkD;IACxD;IAEU,kBAAkB,CAAC,KAAY,EAAE,EAAU,EAAA;QACnD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AAC5C,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB;aAAO;AACL,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACd;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;AAEU,IAAA,WAAW,CAAC,KAAgC,EAAA;AACpD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5B,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AACA,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACrC;;;IAMQ,MAAM,IAAI,CAAC,UAAkB,EAAA;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACnC,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC;AAC5D,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;gBACpC;YACF;AACA,YAAA,MAAM,KAAK,GAAG,OAAO,EAAE,WAAW,IAAI;AACpC,gBAAA,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM;oBAC9C,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,oBAAA,QAAQ,EAAE,KAAK;AAChB,iBAAA,CAAC,CAAC;AACH,gBAAA,KAAK,EAAE,EAAE;aACV;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACnG;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;AACpC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;QACF;gBAAU;AACR,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;AACpC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;IACF;8GAlHW,wCAAwC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAxC,wCAAwC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,sDAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3CrD,ulNA8IA,EAAA,MAAA,EAAA,CAAA,y7RAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvGY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAIzG,wCAAwC,EAAA,UAAA,EAAA,CAAA;kBAVpD,SAAS;+BACE,sCAAsC,EAAA,UAAA,EACpC,IAAI,EAAA,aAAA,EACD,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,sDAAsD,EAAE,EAAA,OAAA,EAC9D,CAAC,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,4BAA4B,CAAC,EAAA,QAAA,EAAA,ulNAAA,EAAA,MAAA,EAAA,CAAA,y7RAAA,CAAA,EAAA;;;AEvCvH;AAgBA;AAEA;MA2Ca,iCAAiC,CAAA;AAzC9C,IAAA,WAAA,GAAA;QA0CE,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ;iFAA4B;AAalD,IAAA;AAXW,IAAA,QAAQ,CAAC,OAAgB,EAAA;AACjC,QAAA,OAAO,OAAuD;IAChE;AAEU,IAAA,QAAQ,CAAC,OAAgB,EAAA;AACjC,QAAA,OAAO,OAAuD;IAChE;AAEU,IAAA,OAAO,CAAC,OAAgB,EAAA;AAChC,QAAA,OAAO,OAAmD;IAC5D;8GAbW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5BlC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAhCC,mBAAmB,+BACnB,uCAAuC,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvC,uCAAuC,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvC,wCAAwC,2GACxC,wCAAwC,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FA8B/B,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAzC7C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,UAAU,EAAE,IAAI;oBAChB,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE;AAC/C,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,uCAAuC;wBACvC,uCAAuC;wBACvC,wCAAwC;wBACxC,wCAAwC;AACzC,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BT,EAAA,CAAA;AACF,iBAAA;;;AC5DD;AAoDA;AAEA;AAEA,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAU;AAG5F,MAAM,qBAAqB,GAAG,GAAG;AACjC,MAAM,yBAAyB,GAAG,GAAG;AACrC,MAAM,qBAAqB,GAAG,GAAG;AACjC,MAAM,qBAAqB,GAAG,yCAAyC;AAEvE,SAAS,yBAAyB,GAAA;AAChC,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAClE,QAAA,IACE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AACvB,YAAA,MAAM,IAAI,qBAAqB;YAC/B,MAAM,IAAI,qBAAqB,EAC/B;AACA,YAAA,OAAO,MAAM;QACf;IACF;AAAE,IAAA,MAAM;;IAER;AACA,IAAA,OAAO,yBAAyB;AAClC;AAEA;AAEA;AAEA,SAAS,cAAc,CAAC,IAA8B,EAAE,aAAsB,EAAA;AAC5E,IAAA,MAAM,KAAK,GAAG,aAAa,IAAI,IAAI,CAAC,SAAS;IAC7C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,QAAA,aAAa,EAAE,KAAK,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,SAAS;AACrD,QAAA,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KACzB;AACH;AAEA,SAAS,mBAAmB,CAAC,QAAgB,EAAA;AAC3C,IAAA,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE;AACtC,QAAA,MAAM,KAAK,GAAG,CAAA,CAAA,EAAI,MAAM,EAAE;AAC1B,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC9D,OAAO;AACL,gBAAA,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5E,gBAAA,IAAI,EAAE,MAAM;aACb;QACH;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AAEA;AAkCM,MAAO,+BAAgC,SAAQ,0BAA0B,CAAA;AAwB7E,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AAxBU,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACjD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC1C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;QAEtC,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI;oFAAC;QACtB,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK;sFAAC;QACzB,IAAA,CAAA,YAAY,GAAG,MAAM,CAAkC,IAAI;yFAAC;QAClD,IAAA,CAAA,WAAW,GAAG,MAAM,CAA6B,EAAE;wFAAC;QACpD,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAC9C,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;8FAC1D;QACkB,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE;mFAAC;QACnB,IAAA,CAAA,IAAI,GAAG,SAAS,CAAsB,MAAM;iFAAC;AAC7C,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;AACxC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB;QAC1D,IAAA,CAAA,kBAAkB,GAAG,qBAAqB;QAC1C,IAAA,CAAA,sBAAsB,GAAG,yBAAyB;QAClD,IAAA,CAAA,kBAAkB,GAAG,qBAAqB;AAC1C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,yBAAyB,EAAE;4FAAC;QAEhE,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,cAAc,GAAG,KAAK;AAUpB,QAAA,IAAA,CAAA,UAAU,GAAG,OAAO,QAAiB,KAA+B;YAC5E,IAAI,CAAC,QAAQ,EAAE;gBACb,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/E;AACA,YAAA,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC9C,IAAI,QAAQ,EAAE;AACZ,gBAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;AAC/F,gBAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;YACrD;AACA,YAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;gBAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;gBACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC;AACrE,gBAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACrE;AACA,YAAA,OAAO,EAAE;AACX,QAAA,CAAC;AArBC,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AACvE,YAAA,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAClC,QAAA,CAAC,CAAC;AACF,QAAA,KAAK,IAAI,CAAC,IAAI,EAAE;IAClB;IAmBU,MAAM,eAAe,CAAC,KAAkC,EAAA;AAChE,QAAA,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,EAAE;AAC/D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAC7B,QAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAClC,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACpC,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE;IAC9B;AAES,IAAA,MAAM,YAAY,GAAA;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,0DAA0D,CAAC;QACzG;QACA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK;QACrD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,cAAc,CAAC;AAC9E,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,0DAA0D,CAAC;AACzG,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,WAAW;AACpB,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9C,SAAS;AACP,gBAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;gBACrE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1C;;IAEJ;IAES,kBAAkB,GAAA;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,wCAAwC,CAAC;QACvF;AACA,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC1B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAuD;AAC3E,YAAA,OAAO,MAAM,EAAE,QAAQ,IAAI,IAAI;QACjC;QACA,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;AACjD,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI;IAC/D;IAES,kBAAkB,GAAA;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,MAAM,KAAK,GAAwB;YACjC,EAAE,KAAK,EAAE,0DAA0D,EAAE;SACtE;AACD,QAAA,IAAI,IAAI,EAAE,WAAW,EAAE;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC;AACA,QAAA,OAAO,KAAK;IACd;AAEU,IAAA,mBAAmB,CAAC,KAAkC,EAAA;QAC9D,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;YACnD;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3F,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI;YACF,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D;AAAE,QAAA,MAAM;;QAER;IACF;IAEU,MAAM,WAAW,CAAC,KAAgC,EAAA;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,MAAM,CAAwD;AACxF,QAAA,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ;QAC/B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE;YAC/C;QACF;AACA,QAAA,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,IAAI,IAAI,EAAE;gBACR,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC3C,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;gBACnC,IAAI,OAAO,EAAE;AACX,oBAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B;qBAAO;AACL,oBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC;YACF;YACA;QACF;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;IAC/B;AAEU,IAAA,kBAAkB,CAAC,KAA6B,EAAA;AACxD,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE;AAChE,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE;YAC1D;QACF;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC;IAC3C;AAEQ,IAAA,qBAAqB,CAAC,IAAsC,EAAA;QAClE,QAAQ,IAAI;AACV,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,gDAAgD;AACzD,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,iDAAiD;AAC1D,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,iDAAiD;AAC1D,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,+CAA+C;AACxD,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,gDAAgD;AACzD,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,gDAAgD;AACzD,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;IAEQ,MAAM,cAAc,CAAC,MAAgB,EAAA;AAC3C,QAAA,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC;AAC5C,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE;QACrC,MAAM,aAAa,GAAG,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE;QAClD,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QAC7B;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB;QACF;QACA,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAC7B,YAAA,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AACxC,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE;QACjC;AACA,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IACnC;AAEQ,IAAA,MAAM,IAAI,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;AACvE,QAAA,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/B;QACA,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IACnC;AAEQ,IAAA,cAAc,CAAC,QAAkC,EAAA;AACvD,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC3B;AAEQ,IAAA,UAAU,CAAC,IAAqC,EAAA;AACtD,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB;QACF;AACA,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;YAC5B,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,WAAW,EAAE,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACzD,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA,CAAC;IACJ;IAEQ,MAAM,eAAe,CAAC,KAAgD,EAAA;AAC5E,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YACvF,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE;AAC/C,gBAAA,MAAM,IAAI,CAAC,eAAe,EAAE;gBAC5B;YACF;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;AAClC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,MAAM,IAAI,CAAC,eAAe,EAAE;QAC9B;gBAAU;AACR,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC7B;IACF;AAEQ,IAAA,MAAM,eAAe,GAAA;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AACA,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;QACrC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AACA,QAAA,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC;AACnC,QAAA,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AACjC,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B;AAAE,YAAA,MAAM;;YAER;QACF;AACA,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B;AAAE,QAAA,MAAM;;QAER;IACF;AAEQ,IAAA,MAAM,WAAW,GAAA;AACvB,QAAA,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE;AAC7C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,IAAI,IAAI,EAAE;AACR,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzD;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB;IAEQ,MAAM,iBAAiB,CAAC,MAAe,EAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC;AAC1D,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnE;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;8GA5RW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,EAAA,SAAA,EAV/B;YACT,2BAA2B;AAC3B,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,+BAA+B;AAC7C,aAAA;AACF,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3IH,83PA2MA,EAAA,MAAA,EAAA,CAAA,gmKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDrFI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,+BAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,gCAAgC,EAAA,QAAA,EAAA,mDAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChC,6BAA6B,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC7B,4BAA4B,EAAA,QAAA,EAAA,qfAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,EAAA,cAAA,EAAA,WAAA,EAAA,eAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,iCAAiC,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjC,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,QAAA,EAAA,eAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAYX,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAhC3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,cAC1B,IAAI,EAAA,aAAA,EACD,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,QACzC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAA,OAAA,EAC/B;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB;wBACjB,iBAAiB;wBACjB,YAAY;wBACZ,sBAAsB;wBACtB,gCAAgC;wBAChC,6BAA6B;wBAC7B,4BAA4B;wBAC5B,wBAAwB;wBACxB,mBAAmB;wBACnB,iCAAiC;wBACjC,oBAAoB;qBACrB,EAAA,SAAA,EACU;wBACT,2BAA2B;AAC3B,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAA,+BAAiC;AAC7C,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,83PAAA,EAAA,MAAA,EAAA,CAAA,gmKAAA,CAAA,EAAA;4FAiBwD,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5JjE;AAmBA;AAEA;MAuCa,qCAAqC,CAAA;AAiBhD,IAAA,WAAA,GAAA;QAhBA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ;uFAAU;QACrC,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ;iFAA4B;AAEhC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;QAEzD,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,CAA+B;AACnE,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,IAAI,EAAE,OAAO,CAAoB,KAAI;AACnC,gBAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;AAClC,gBAAA,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC;AACzB,gBAAA,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE;gBAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;YACrE,CAAC;AACF,SAAA,CAAC;QAGA,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AAC3B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACnE,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;AACA,QAAA,QAAQ,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;oBACrC,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;oBAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iBAAA,CAAC,CAAC;AACL,YAAA,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,QAAQ;AACzB,YAAA,KAAK,SAAS;gBACZ,OAAO,OAAO,CAAC,OAAO;AACxB,YAAA,KAAK,SAAS;gBACZ,OAAO,OAAO,CAAC,OAAO;AACxB,YAAA,KAAK,SAAS;gBACZ,OAAO,OAAO,CAAC,OAAO;AACxB,YAAA;AACE,gBAAA,OAAO,EAAE;;IAEf;8GAhDW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9BtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA7BS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FA+BnD,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBArCjD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mCAAmC;AAC7C,oBAAA,UAAU,EAAE,IAAI;oBAChB,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE;AAC/C,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;AAC/D,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BT,EAAA,CAAA;AACF,iBAAA;;;AC3DD;AAaA;AAEA;AAEA,SAAS,aAAa,GAAA;IACpB,OAAO;AACL,QAAA;AACE,YAAA,IAAI,EAAE,4BAA4B;YAClC,WAAW,EAAE,CAAC,YAAY,CAAC;AAC3B,YAAA,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;AAC1B,YAAA,aAAa,EAAE,MAAM,sBAAsB;AAC3C,YAAA,QAAQ,EAAE;AACR,gBAAA;AACE,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,aAAa,EAAE,MAAM,+BAA+B;AACpD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AACtB,iBAAA;AACF,aAAA;AACF,SAAA;KACF;AACH;AAEA;AAEA;MA2Ba,yBAAyB,CAAA;8GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAzB,yBAAyB,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,SAAA,EArBzB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,kCAAkC;AAC3C,gBAAA,QAAQ,EAAE,+BAA+B;AACzC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;YACD,mBAAmB,CAAC,iBAAiB,EAAE,MACrC,OAAO,+EAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,+BAA+B,CAAC,CACvE;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,+BAA+B;AACxC,gBAAA,QAAQ,EAAE,kCAAkC;AAC5C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,MAAM;AACf,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,UAAU,EAAE,aAAa;AAC1B,aAAA;AACF,SAAA,EAAA,CAAA,CAAA;;2FAEU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAzBrC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,kCAAkC;AAC3C,4BAAA,QAAQ,EAAE,+BAA+B;AACzC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;wBACD,mBAAmB,CAAC,iBAAiB,EAAE,MACrC,OAAO,+EAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,+BAA+B,CAAC,CACvE;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,+BAA+B;AACxC,4BAAA,QAAQ,EAAE,kCAAkC;AAC5C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,MAAM;AACf,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,UAAU,EAAE,aAAa;AAC1B,yBAAA;AACF,qBAAA;AACF,iBAAA;;;AC/DD;;AAEG;;"}
1
+ {"version":3,"file":"acorex-platform-module-platform-dev-tools-client.mjs","sources":["../../../../libs/modules/platform-dev-tools/client/src/lib/permission-definition.provider.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/settings.provider.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-tree.model.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-route.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-data.service.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-module-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-module-detail.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-plugin-fields.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-json.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-actions.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-property-details.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-detail.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-catalog-io.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-catalog-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-catalog-detail.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entity-graph.util.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entities-graph.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-entities-graph.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-page.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/platform-explorer-page.component.html","../../../../libs/modules/platform-dev-tools/client/src/lib/features/platform-explorer/detail/platform-explorer-list-detail.component.ts","../../../../libs/modules/platform-dev-tools/client/src/lib/platform-dev-tools.module.ts","../../../../libs/modules/platform-dev-tools/client/src/acorex-platform-module-platform-dev-tools-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport {\n AXPPermissionDefinitionProvider,\n AXPPermissionDefinitionProviderContext,\n} from '@acorex-platform/framework-client/auth';\nimport {\n AXPCommonPermissionGroupKeys\n} from '@acorex-platform/module-common-client/contracts';\nimport {\n AXPApplicationsPlatformPermissionKeys\n} from '@acorex-platform/module-platform-dev-tools-client/contracts';\n\nimport { Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ---- Permission Definition Provider ----\n\n/**\n * Registers UseDevTools under Applications & Platform.\n */\n@Injectable()\nexport class AXMPermissionDefinitionProvider implements AXPPermissionDefinitionProvider {\n async define(context: AXPPermissionDefinitionProviderContext): Promise<void> {\n const keys = AXPApplicationsPlatformPermissionKeys;\n const groups = AXPCommonPermissionGroupKeys;\n const P = '@common:applications-platform.permissions';\n const G = '@common:permission-groups';\n\n context.addGroup(groups.ApplicationsPlatform.Root, `${G}.applications-platform.title`, `${G}.applications-platform.description`, { order: 110 });\n\n context\n .addGroup(\n groups.ApplicationsPlatform.DevTools,\n `${G}.applications-platform-dev-tools.title`,\n `${G}.applications-platform-dev-tools.description`,\n { parent: groups.ApplicationsPlatform.Root, order: 40 },\n )\n .addPermission(keys.UseDevTools, `${P}.use-dev-tools.title`, `${P}.use-dev-tools.description`, {\n modules: ['PlatformDevTools'],\n requiredFeatures: ['PlatformDevTools'],\n })\n .endPermission()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport {\n AXPPlatformDevToolsSettings,\n AXP_PLATFORM_DEV_TOOLS_COMMUNICATION_DEBUG_REDIRECT_SECTION,\n} from '@acorex-platform/module-platform-dev-tools-client/contracts';\n\n//#endregion\n\n//#region ---- Setting Provider ----\n\n/**\n * Defines settings for Platform Dev Tools (developer-oriented options).\n */\nexport class AXPPlatformDevToolsSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n context\n .addGroup(\n 'platform-dev-tools',\n '@platform-dev-tools:settings.group.nav-title',\n '@platform-dev-tools:settings.group.description',\n 'fa-light fa-wrench',\n '@platform-dev-tools:settings.group.title',\n 999,\n )\n .addSection(\n 'developer',\n '@platform-dev-tools:settings.developer.title',\n '@platform-dev-tools:settings.developer.description',\n )\n .addSetting({\n key: AXPPlatformDevToolsSettings.DebugMode,\n title: '@platform-dev-tools:settings.developer.items.debug-mode.title',\n description: '@platform-dev-tools:settings.developer.items.debug-mode.description',\n scope: 'P',\n overridableAt: [],\n // Platform-only developer switch (same pattern as System Insight / Auth).\n isInherited: false,\n defaultValue: false,\n widget: {\n type: AXPWidgetsList.Editors.ToggleSwitch,\n },\n })\n .endSection()\n .addSection(\n AXP_PLATFORM_DEV_TOOLS_COMMUNICATION_DEBUG_REDIRECT_SECTION,\n '@platform-dev-tools:settings.communication-debug-redirect.title',\n '@platform-dev-tools:settings.communication-debug-redirect.description',\n )\n .endSection()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ----- Tree node types -----\n\nexport type PlatformExplorerNodeKind =\n | 'type-group'\n | 'module'\n | 'diagram'\n | 'entities'\n | 'entity'\n | 'commands'\n | 'command'\n | 'queries'\n | 'query'\n | 'plugins'\n | 'plugin'\n | 'widgets'\n | 'widget';\n\nexport interface PlatformExplorerTreeNode {\n id: string;\n kind: PlatformExplorerNodeKind;\n label: string;\n moduleName?: string;\n moduleTitle?: string;\n icon?: string;\n itemCount?: number;\n /** Top rule before a type-group header that is not the first visible group. */\n divided?: boolean;\n payload?: unknown;\n}\n\n//#endregion\n","import type { ParamMap, Params } from '@angular/router';\n\nimport type { PlatformExplorerNodeKind, PlatformExplorerTreeNode } from './platform-explorer-tree.model';\n\n//#region ----- Types -----\n\nexport type ExplorerPageKind = 'module' | 'diagram' | 'entity' | 'command' | 'query' | 'plugin' | 'widget';\n\nexport interface ExplorerRouteState {\n module?: string;\n kind?: ExplorerPageKind;\n name?: string;\n search?: string;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nexport const EXPLORER_QUERY_MODULE = 'module';\nexport const EXPLORER_QUERY_KIND = 'kind';\nexport const EXPLORER_QUERY_NAME = 'name';\nexport const EXPLORER_QUERY_SEARCH = 'q';\n\nconst FOLDER_KINDS = new Set<PlatformExplorerNodeKind>(['entities', 'commands', 'queries', 'plugins', 'widgets']);\nconst PAGE_KINDS = new Set<ExplorerPageKind>([\n 'module',\n 'diagram',\n 'entity',\n 'command',\n 'query',\n 'plugin',\n 'widget',\n]);\n\n//#endregion\n\n//#region ----- Kind helpers -----\n\nexport function isExplorerFolderKind(kind: PlatformExplorerNodeKind | undefined): boolean {\n return !!kind && FOLDER_KINDS.has(kind);\n}\n\nexport function isExplorerPageKind(kind: string | undefined): kind is ExplorerPageKind {\n return !!kind && PAGE_KINDS.has(kind as ExplorerPageKind);\n}\n\nexport function catalogFolderKind(\n kind: Extract<ExplorerPageKind, 'entity' | 'command' | 'query' | 'plugin' | 'widget'>,\n): 'entities' | 'commands' | 'queries' | 'plugins' | 'widgets' {\n switch (kind) {\n case 'entity':\n return 'entities';\n case 'command':\n return 'commands';\n case 'query':\n return 'queries';\n case 'plugin':\n return 'plugins';\n case 'widget':\n return 'widgets';\n }\n}\n\n//#endregion\n\n//#region ----- Query params -----\n\nfunction param(map: ParamMap, key: string): string | undefined {\n const value = map.get(key)?.trim();\n return value || undefined;\n}\n\nexport function explorerStateFromQuery(map: ParamMap): ExplorerRouteState {\n const module = param(map, EXPLORER_QUERY_MODULE);\n const rawKind = param(map, EXPLORER_QUERY_KIND);\n const kind = rawKind === 'entities' ? 'diagram' : rawKind;\n return {\n ...(module ? { module } : {}),\n ...(isExplorerPageKind(kind) ? { kind } : {}),\n ...(param(map, EXPLORER_QUERY_NAME) ? { name: param(map, EXPLORER_QUERY_NAME) } : {}),\n ...(param(map, EXPLORER_QUERY_SEARCH) ? { search: param(map, EXPLORER_QUERY_SEARCH) } : {}),\n };\n}\n\nexport function queryParamsFromExplorer(\n node: PlatformExplorerTreeNode | null,\n search: string,\n): Params {\n const q = search.trim();\n const params: Params = {\n [EXPLORER_QUERY_MODULE]: null,\n [EXPLORER_QUERY_KIND]: null,\n [EXPLORER_QUERY_NAME]: null,\n [EXPLORER_QUERY_SEARCH]: q || null,\n };\n if (!node || node.kind === 'type-group' || isExplorerFolderKind(node.kind)) {\n return params;\n }\n if (node.moduleName) {\n params[EXPLORER_QUERY_MODULE] = node.moduleName;\n }\n if (node.kind === 'module') {\n return params;\n }\n if (node.kind === 'diagram') {\n params[EXPLORER_QUERY_KIND] = 'diagram';\n return params;\n }\n if (\n node.kind === 'entity' ||\n node.kind === 'command' ||\n node.kind === 'query' ||\n node.kind === 'plugin' ||\n node.kind === 'widget'\n ) {\n params[EXPLORER_QUERY_KIND] = node.kind;\n const payload = node.payload as { name?: unknown; fullName?: unknown } | undefined;\n const name =\n String(payload?.name ?? '').trim() ||\n String(payload?.fullName ?? '').trim() ||\n node.label;\n params[EXPLORER_QUERY_NAME] = name;\n }\n return params;\n}\n\nexport function explorerNodeId(moduleName: string, kind: ExplorerPageKind, name?: string): string {\n if (kind === 'module') {\n return `module-${moduleName}`;\n }\n if (kind === 'diagram') {\n return `module-${moduleName}-diagram`;\n }\n return `${kind}-${name ?? ''}`;\n}\n\nexport function explorerRevealIds(node: PlatformExplorerTreeNode): string[] {\n const moduleName = node.moduleName;\n if (!moduleName) {\n return [node.id];\n }\n const ids = [`module-${moduleName}`];\n if (\n node.kind === 'entity' ||\n node.kind === 'command' ||\n node.kind === 'query' ||\n node.kind === 'plugin' ||\n node.kind === 'widget'\n ) {\n ids.push(`module-${moduleName}-${catalogFolderKind(node.kind)}`);\n }\n if (node.kind !== 'module') {\n ids.push(node.id);\n }\n return ids;\n}\n\nexport function sameExplorerNode(\n left: PlatformExplorerTreeNode | null,\n right: PlatformExplorerTreeNode | null,\n): boolean {\n return left?.id === right?.id;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { inject, Injectable, signal } from '@angular/core';\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { AXPModuleManifestRegistry } from '@acorex-platform/framework-client/core';\nimport {\n AXP_MODULE_TYPE,\n resolveModuleType,\n runtimeQueryPayloadData,\n type AXPModuleManifest,\n type AXPModuleType,\n} from '@acorex-platform/framework-shared/core';\nimport {\n AXMPlatformExplorerQueryKeys,\n type AXMPlatformExplorerCatalogItem,\n type AXMPlatformExplorerCatalogKind,\n type AXMPlatformExplorerEntityDetail,\n type AXMPlatformExplorerGetCatalogItemInput,\n type AXMPlatformExplorerGetEntityInput,\n type AXMPlatformExplorerGetModuleInput,\n type AXMPlatformExplorerListModulesInput,\n type AXMPlatformExplorerModuleCatalog,\n type AXMPlatformExplorerModuleListResult,\n type AXMPlatformExplorerModuleSummary,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\nimport type { PlatformExplorerTreeNode } from './platform-explorer-tree.model';\nimport { catalogFolderKind, type ExplorerRouteState } from './platform-explorer-route.util';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface PlatformExplorerEntityTab {\n id: string;\n textKey: string;\n extraText?: string;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n@Injectable()\nexport class PlatformExplorerDataService {\n private readonly queryService = inject(AXPQueryService);\n private readonly manifestRegistry = inject(AXPModuleManifestRegistry, { optional: true });\n\n private moduleCache = new Map<string, AXMPlatformExplorerModuleCatalog>();\n\n readonly entityTabs = signal<PlatformExplorerEntityTab[]>([]);\n readonly activeEntitySection = signal('properties');\n\n clearCache(): void {\n this.moduleCache.clear();\n }\n\n setEntityTabs(tabs: PlatformExplorerEntityTab[]): void {\n this.entityTabs.set(tabs);\n }\n\n selectEntitySection(section: string): void {\n this.activeEntitySection.set(section);\n }\n\n clearEntityTabs(): void {\n this.entityTabs.set([]);\n this.activeEntitySection.set('properties');\n }\n\n async listModules(search?: string): Promise<AXMPlatformExplorerModuleSummary[]> {\n const result = await this.queryService.fetch<\n AXMPlatformExplorerListModulesInput,\n AXMPlatformExplorerModuleListResult\n >(AXMPlatformExplorerQueryKeys.ListModules, { search: search?.trim() || undefined });\n return runtimeQueryPayloadData(result)?.items ?? [];\n }\n\n async getModule(moduleName: string): Promise<AXMPlatformExplorerModuleCatalog | null> {\n const name = moduleName.trim();\n const cached = this.moduleCache.get(name);\n if (cached) {\n return cached;\n }\n const result = await this.queryService.fetch<\n AXMPlatformExplorerGetModuleInput,\n AXMPlatformExplorerModuleCatalog | null\n >(AXMPlatformExplorerQueryKeys.GetModule, { module: name });\n const catalog = runtimeQueryPayloadData(result) ?? null;\n if (catalog) {\n this.moduleCache.set(name, catalog);\n }\n return catalog;\n }\n\n async getEntity(moduleName: string, entityName: string): Promise<AXMPlatformExplorerEntityDetail | null> {\n const result = await this.queryService.fetch<\n AXMPlatformExplorerGetEntityInput,\n AXMPlatformExplorerEntityDetail | null\n >(AXMPlatformExplorerQueryKeys.GetEntity, { module: moduleName, entity: entityName });\n return runtimeQueryPayloadData(result) ?? null;\n }\n\n async getCatalogItem(\n kind: AXMPlatformExplorerCatalogKind,\n name: string,\n ): Promise<AXMPlatformExplorerCatalogItem | null> {\n const result = await this.queryService.fetch<\n AXMPlatformExplorerGetCatalogItemInput,\n AXMPlatformExplorerCatalogItem | null\n >(AXMPlatformExplorerQueryKeys.GetCatalogItem, { kind, name });\n return runtimeQueryPayloadData(result) ?? null;\n }\n\n getManifest(moduleName: string): AXPModuleManifest | undefined {\n return this.manifestRegistry?.get(moduleName);\n }\n\n moduleTitle(moduleName: string): string {\n return this.getManifest(moduleName)?.title ?? moduleName;\n }\n\n moduleIcon(moduleName: string): string {\n return this.getManifest(moduleName)?.icon || 'fa-light fa-cube';\n }\n\n async resolveExplorerSelection(\n state: ExplorerRouteState,\n moduleNodes: PlatformExplorerTreeNode[],\n ): Promise<PlatformExplorerTreeNode | null> {\n const moduleName = state.module?.trim();\n if (!moduleName) {\n return null;\n }\n const moduleNode = moduleNodes.find((node) => node.kind === 'module' && node.moduleName === moduleName);\n if (!moduleNode) {\n return null;\n }\n const kind = state.kind;\n if (!kind || kind === 'module') {\n return moduleNode;\n }\n const title = this.moduleTitle(moduleName);\n if (kind === 'diagram') {\n const catalog = await this.getModule(moduleName);\n if (!catalog?.entities.length) {\n return moduleNode;\n }\n return {\n id: `module-${moduleName}-diagram`,\n kind: 'diagram',\n label: '@platform-dev-tools:module.terms.diagram',\n moduleName,\n moduleTitle: title,\n };\n }\n const name = state.name?.trim();\n if (!name) {\n return moduleNode;\n }\n const children = await this.getCategoryChildren(moduleName, catalogFolderKind(kind));\n return (\n children.find((node) => {\n const payload = node.payload as { name?: unknown; fullName?: unknown } | undefined;\n return (\n node.id === `${kind}-${name}` ||\n String(payload?.name ?? '') === name ||\n String(payload?.fullName ?? '') === name\n );\n }) ?? moduleNode\n );\n }\n\n toModuleTreeNodes(modules: AXMPlatformExplorerModuleSummary[]): PlatformExplorerTreeNode[] {\n const buckets = new Map<AXPModuleType, AXMPlatformExplorerModuleSummary[]>();\n for (const type of Object.values(AXP_MODULE_TYPE)) {\n buckets.set(type, []);\n }\n for (const mod of modules) {\n const manifest = this.getManifest(mod.name);\n const type = resolveModuleType({\n name: mod.name,\n type: manifest?.type,\n required: manifest?.required,\n });\n const list = buckets.get(type) ?? [];\n list.push(mod);\n buckets.set(type, list);\n }\n\n const nodes: PlatformExplorerTreeNode[] = [];\n let firstGroup = true;\n for (const type of Object.values(AXP_MODULE_TYPE)) {\n const list = [...(buckets.get(type) ?? [])].sort((a, b) =>\n this.moduleTitle(a.name).localeCompare(this.moduleTitle(b.name), undefined, { sensitivity: 'base' }),\n );\n if (list.length === 0) {\n continue;\n }\n nodes.push({\n id: `type-group-${type}`,\n kind: 'type-group',\n label: `@application-management:editions.modules-editor.types.${type}`,\n divided: !firstGroup,\n });\n firstGroup = false;\n for (const mod of list) {\n nodes.push(this.toModuleNode(mod));\n }\n }\n return nodes;\n }\n\n private toModuleNode(mod: AXMPlatformExplorerModuleSummary): PlatformExplorerTreeNode {\n return {\n id: `module-${mod.name}`,\n kind: 'module',\n label: this.moduleTitle(mod.name),\n moduleName: mod.name,\n moduleTitle: this.moduleTitle(mod.name),\n icon: this.moduleIcon(mod.name),\n itemCount: mod.categoryCount + (mod.entityCount > 0 ? 1 : 0),\n payload: mod,\n };\n }\n\n async getModuleChildren(moduleName: string): Promise<PlatformExplorerTreeNode[]> {\n const catalog = await this.getModule(moduleName);\n if (!catalog) {\n return [];\n }\n const title = this.moduleTitle(moduleName);\n const nodes: PlatformExplorerTreeNode[] = [];\n if (catalog.entities.length > 0) {\n nodes.push({\n id: `module-${moduleName}-diagram`,\n kind: 'diagram',\n label: '@platform-dev-tools:module.terms.diagram',\n moduleName,\n moduleTitle: title,\n });\n }\n this.pushCategory(nodes, moduleName, title, 'entities', catalog.entities.length);\n this.pushCategory(nodes, moduleName, title, 'commands', catalog.commands.length);\n this.pushCategory(nodes, moduleName, title, 'queries', catalog.queries.length);\n this.pushCategory(nodes, moduleName, title, 'plugins', catalog.plugins.length);\n this.pushCategory(nodes, moduleName, title, 'widgets', catalog.widgets.length);\n return nodes;\n }\n\n async getCategoryChildren(moduleName: string, kind: PlatformExplorerTreeNode['kind']): Promise<PlatformExplorerTreeNode[]> {\n const catalog = await this.getModule(moduleName);\n if (!catalog) {\n return [];\n }\n const title = this.moduleTitle(moduleName);\n switch (kind) {\n case 'entities':\n return catalog.entities.map((item) => ({\n id: `entity-${item.fullName}`,\n kind: 'entity' as const,\n label: item.name,\n moduleName,\n moduleTitle: title,\n icon: item.icon,\n payload: item,\n }));\n case 'commands':\n return catalog.commands.map((item) =>\n this.namedNode('command', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n case 'queries':\n return catalog.queries.map((item) =>\n this.namedNode('query', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n case 'plugins':\n return catalog.plugins.map((item) =>\n this.namedNode('plugin', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n case 'widgets':\n return catalog.widgets.map((item) =>\n this.namedNode('widget', item.name, item.title ?? item.name, moduleName, title, item, item.icon),\n );\n default:\n return [];\n }\n }\n\n private pushCategory(\n nodes: PlatformExplorerTreeNode[],\n moduleName: string,\n moduleTitle: string,\n kind: 'entities' | 'commands' | 'queries' | 'plugins' | 'widgets',\n count: number,\n ): void {\n if (count <= 0) {\n return;\n }\n nodes.push({\n id: `module-${moduleName}-${kind}`,\n kind,\n label: `@platform-dev-tools:module.terms.${kind}`,\n moduleName,\n moduleTitle,\n itemCount: count,\n });\n }\n\n private namedNode(\n kind: 'command' | 'query' | 'plugin' | 'widget',\n name: string,\n label: string,\n moduleName: string,\n moduleTitle: string,\n payload: unknown,\n icon?: string,\n ): PlatformExplorerTreeNode {\n return {\n id: `${kind}-${name}`,\n kind,\n label,\n moduleName,\n moduleTitle,\n icon,\n payload,\n };\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\nimport { AXBadgeModule } from '@acorex/components/badge';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport {\n resolveModuleDomain,\n resolveModuleType,\n type AXPModuleManifest,\n type AXPModuleType,\n} from '@acorex-platform/framework-shared/core';\nimport type { AXMPlatformExplorerModuleSummary } from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface ManifestDependencyView {\n name: string;\n title: string;\n}\n\ninterface ModuleManifestView {\n name: string;\n title: string;\n description?: string;\n icon: string;\n version: string;\n type: AXPModuleType;\n typeKey: string;\n domain: string;\n domainKey: string;\n i18n?: string;\n required: boolean;\n dependencies: ManifestDependencyView[];\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst TYPE_I18N = '@application-management:editions.modules-editor.types';\nconst DOMAIN_I18N = '@application-management:editions.modules-editor.domains';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-module-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXTranslationModule, AXBadgeModule],\n templateUrl: './platform-explorer-module-detail.component.html',\n})\nexport class AXPlatformExplorerModuleDetailComponent {\n payload = input<AXMPlatformExplorerModuleSummary | undefined>();\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n protected readonly view = computed<ModuleManifestView | null>(() => {\n const summary = this.payload();\n if (!summary) {\n return null;\n }\n const manifest = this.dataService.getManifest(summary.name);\n if (!manifest) {\n return null;\n }\n return this.toView(summary.name, manifest);\n });\n\n private toView(name: string, manifest: AXPModuleManifest): ModuleManifestView {\n const type = resolveModuleType(manifest);\n const domain = resolveModuleDomain(manifest);\n return {\n name,\n title: manifest.title || name,\n description: manifest.description,\n icon: manifest.icon || 'fa-light fa-cube',\n version: manifest.version,\n type,\n typeKey: `${TYPE_I18N}.${type}`,\n domain,\n domainKey: `${DOMAIN_I18N}.${domain}`,\n i18n: manifest.i18n,\n required: !!manifest.required,\n dependencies: (manifest.dependencies ?? []).map((dep) => ({\n name: dep,\n title: dep.includes('.') ? dep : this.dataService.moduleTitle(dep),\n })),\n };\n }\n}\n\n//#endregion\n","<div class=\"flex flex-col flex-1 min-h-0 overflow-auto\">\n <!-- ----- Module identity from client manifest ----- -->\n @if (payload(); as mod) {\n <section class=\"flex flex-col gap-5 p-4\">\n <!--->\n <!-- ----- Manifest header when the module is registered on the client ----- -->\n @if (view(); as info) {\n <div class=\"flex items-start gap-3\">\n <i class=\"text-2xl text-primary shrink-0 mt-0.5\" [ngClass]=\"info.icon\" aria-hidden=\"true\"></i>\n <div class=\"flex flex-col gap-1 min-w-0\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <h2 class=\"m-0 text-lg font-semibold\">{{ info.title | translate | async }}</h2>\n <ax-badge color=\"secondary\" [text]=\"info.version\"></ax-badge>\n <ax-badge color=\"primary\" [text]=\"(info.typeKey | translate | async) ?? info.type\"></ax-badge>\n <ax-badge [text]=\"(info.domainKey | translate | async) ?? info.domain\"></ax-badge>\n <!--->\n <!-- ----- Required modules cannot be disabled in editions ----- -->\n @if (info.required) {\n <ax-badge\n color=\"success\"\n [text]=\"('@platform-dev-tools:module.terms.required' | translate | async) ?? ''\"\n ></ax-badge>\n }\n </div>\n <!--->\n <!-- ----- Optional manifest description ----- -->\n @if (info.description) {\n <p class=\"m-0 text-sm text-muted\">{{ info.description | translate | async }}</p>\n }\n </div>\n </div>\n\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 m-0\">\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd class=\"m-0\"><code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ info.name }}</code></dd>\n <!--->\n <!-- ----- i18n scope from the module manifest ----- -->\n @if (info.i18n) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.i18n' | translate | async }}</dt>\n <dd class=\"m-0\"><code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ info.i18n }}</code></dd>\n }\n </dl>\n\n <div class=\"flex flex-col gap-2\">\n <div class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.dependencies' | translate | async }}</div>\n <!--->\n <!-- ----- Empty dependency list ----- -->\n @if (info.dependencies.length === 0) {\n <p class=\"m-0 text-sm text-muted\">{{ '@platform-dev-tools:module.messages.no-dependencies' | translate | async }}</p>\n }\n <!-- ----- Manifest dependency chips ----- -->\n @else {\n <div class=\"flex flex-wrap gap-2\">\n @for (dep of info.dependencies; track dep.name) {\n <ax-badge [text]=\"(dep.title | translate | async) ?? dep.name\"></ax-badge>\n }\n </div>\n }\n </div>\n }\n <!-- ----- Catalog-only module with no client manifest ----- -->\n @else {\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 m-0\">\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd class=\"m-0\">{{ mod.name }}</dd>\n </dl>\n <p class=\"m-0 text-sm text-muted\">{{ '@platform-dev-tools:module.messages.no-manifest' | translate | async }}</p>\n }\n\n <div class=\"flex flex-wrap gap-2\">\n <ax-badge\n color=\"primary\"\n [text]=\"('@platform-dev-tools:module.badges.entities' | translate: { params: { count: mod.entityCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n color=\"success\"\n [text]=\"('@platform-dev-tools:module.badges.commands' | translate: { params: { count: mod.commandCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n color=\"primary\"\n [text]=\"('@platform-dev-tools:module.badges.queries' | translate: { params: { count: mod.queryCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n color=\"warning\"\n [text]=\"('@platform-dev-tools:module.badges.plugins' | translate: { params: { count: mod.pluginCount } } | async) ?? ''\"\n ></ax-badge>\n <ax-badge\n [text]=\"('@platform-dev-tools:module.badges.widgets' | translate: { params: { count: mod.widgetCount } } | async) ?? ''\"\n ></ax-badge>\n </div>\n </section>\n }\n</div>\n","import type { AXPEntityPluginContributions } from '@acorex-platform/framework-shared/runtime';\nimport type { AXMPlatformExplorerResolvedPlugin } from '@acorex-platform/module-platform-management-client/contracts';\n\n//#region ----- Types -----\n\nexport interface ExplorerPluginFieldSource {\n name: string;\n title: string;\n}\n\n//#endregion\n\n//#region ----- Plugin contribution field names -----\n\nfunction isPlaceholderName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.startsWith('(from ') || trimmed.includes('options.fields[]');\n}\n\nfunction parseContributions(json: unknown): AXPEntityPluginContributions | null {\n if (json == null) {\n return null;\n }\n let parsed: unknown = json;\n if (typeof json === 'string') {\n const trimmed = json.trim();\n if (!trimmed) {\n return null;\n }\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return null;\n }\n }\n if (parsed == null || typeof parsed !== 'object') {\n return null;\n }\n return parsed as AXPEntityPluginContributions;\n}\n\nfunction optionString(options: unknown, key: string | undefined): string {\n if (!key || options == null || typeof options !== 'object') {\n return '';\n }\n const value = (options as Record<string, unknown>)[key];\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction contributedNames(plugin: AXMPlatformExplorerResolvedPlugin): string[] {\n const contributions = parseContributions(plugin.contributionsJson);\n const names = new Set<string>();\n const add = (name: string | undefined, nameFromOption?: string): void => {\n const fromOption = optionString(plugin.options, nameFromOption);\n const fieldName = fromOption || name?.trim() || '';\n if (fieldName && !isPlaceholderName(fieldName)) {\n names.add(fieldName);\n }\n };\n for (const property of contributions?.properties ?? []) {\n add(property.name, property.nameFromOption);\n }\n for (const column of contributions?.columns ?? []) {\n add(column.name, column.nameFromOption);\n }\n return [...names];\n}\n\n/**\n * Maps host property/column names to the plugin that contributed them.\n * First matching plugin wins when two plugins claim the same name.\n */\nexport function pluginSourceByFieldName(\n plugins: AXMPlatformExplorerResolvedPlugin[],\n): Map<string, ExplorerPluginFieldSource> {\n const map = new Map<string, ExplorerPluginFieldSource>();\n for (const plugin of plugins) {\n const source: ExplorerPluginFieldSource = {\n name: plugin.name,\n title: plugin.title || plugin.name,\n };\n for (const fieldName of contributedNames(plugin)) {\n if (!map.has(fieldName)) {\n map.set(fieldName, source);\n }\n }\n }\n return map;\n}\n\n//#endregion\n","//#region ----- Types -----\n\nexport interface FlatJsonPair {\n path: string;\n value: string;\n}\n\n//#endregion\n\n//#region ----- Flatten -----\n\nfunction formatLeaf(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction joinPath(prefix: string, key: string): string {\n return prefix ? `${prefix}.${key}` : key;\n}\n\nexport function flattenToPairs(value: unknown, prefix = ''): FlatJsonPair[] {\n if (value === undefined || typeof value === 'function') {\n return [];\n }\n if (value !== null && typeof value === 'object') {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return prefix ? [{ path: prefix, value: '[]' }] : [];\n }\n return value.flatMap((item, index) => flattenToPairs(item, joinPath(prefix, String(index))));\n }\n const entries = Object.entries(value as Record<string, unknown>).filter(\n ([, nested]) => nested !== undefined && typeof nested !== 'function',\n );\n if (entries.length === 0) {\n return prefix ? [{ path: prefix, value: '{}' }] : [];\n }\n return entries.flatMap(([key, nested]) => flattenToPairs(nested, joinPath(prefix, key)));\n }\n return [{ path: prefix, value: formatLeaf(value) }];\n}\n\nexport function flattenJsonText(json: string | undefined): FlatJsonPair[] {\n if (!json?.trim()) {\n return [];\n }\n try {\n return flattenToPairs(JSON.parse(json));\n } catch {\n return [{ path: '', value: json }];\n }\n}\n\n//#endregion\n","import type { AXPEntity, AXPEntityAction, AXPQueryView, AXPRelatedEntity } from '@acorex-platform/framework-shared/entity';\n\nimport { flattenToPairs, type FlatJsonPair } from './platform-explorer-json.util';\n\n//#region ----- Types -----\n\nexport type ExplorerLayoutKind = 'list' | 'record' | 'create' | 'update' | 'detail-list' | 'related';\n\nexport interface ExplorerActionView {\n id: string;\n name?: string;\n title?: string;\n commandName: string;\n type?: string;\n typeLabel: string;\n scope: string;\n priority: string;\n icon?: string;\n color?: string;\n shortcuts: string[];\n permissions: string[];\n hidden?: string;\n disabled?: string;\n isDefault: boolean;\n separated: boolean;\n order?: number;\n depth: number;\n optionsPairs: FlatJsonPair[];\n metadataPairs: FlatJsonPair[];\n submenuExpression?: string;\n}\n\nexport interface ExplorerActionScopeGroup {\n scope: string;\n actions: ExplorerActionView[];\n}\n\nexport interface ExplorerLayoutView {\n name: string;\n title?: string;\n}\n\nexport interface ExplorerLayoutSection {\n id: string;\n kind: ExplorerLayoutKind;\n relatedTitle?: string;\n relatedEntity?: string;\n relatedLayoutType?: string;\n layoutTitle?: string;\n layoutDescription?: string;\n views: ExplorerLayoutView[];\n groups: ExplorerActionScopeGroup[];\n actionCount: number;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst SCOPE_ORDER = ['typeLevel', 'selected', 'individual', 'section'];\n\n//#endregion\n\n//#region ----- Serialize -----\n\nfunction humanText(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed || trimmed.includes('{{')) {\n return undefined;\n }\n return trimmed;\n}\n\nfunction titleCaseType(type: string): string {\n return type\n .split('-')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\nfunction boolOrExpression(value: unknown): string | undefined {\n if (typeof value === 'boolean') {\n return value ? 'yes' : 'no';\n }\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n return undefined;\n}\n\nfunction asActions(value: unknown): AXPEntityAction[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((item): item is AXPEntityAction => !!item && typeof item === 'object');\n}\n\nfunction layoutActions(layout: unknown): AXPEntityAction[] {\n if (!layout || typeof layout !== 'object') {\n return [];\n }\n return asActions((layout as { actions?: unknown }).actions);\n}\n\nfunction resolveCommand(command: AXPEntityAction['command']): {\n name: string;\n optionsPairs: FlatJsonPair[];\n metadataPairs: FlatJsonPair[];\n} {\n if (typeof command === 'function') {\n return { name: 'function', optionsPairs: [], metadataPairs: [] };\n }\n if (typeof command === 'string') {\n return { name: command, optionsPairs: [], metadataPairs: [] };\n }\n if (command && typeof command === 'object') {\n return {\n name: typeof command.name === 'string' ? command.name : '',\n optionsPairs: flattenToPairs(command.options),\n metadataPairs: flattenToPairs(command.metadata),\n };\n }\n return { name: '', optionsPairs: [], metadataPairs: [] };\n}\n\nfunction resolveItems(items: AXPEntityAction['items'] | unknown): {\n children: AXPEntityAction[];\n expression?: string;\n} {\n if (Array.isArray(items)) {\n return { children: asActions(items) };\n }\n if (typeof items === 'string' && items.trim()) {\n return { children: [], expression: items.trim() };\n }\n return { children: [] };\n}\n\n//#endregion\n\n//#region ----- Actions -----\n\nfunction toActionView(action: AXPEntityAction, id: string, depth: number): ExplorerActionView {\n const command = resolveCommand(action.command);\n const items = resolveItems(action.items);\n const hidden = boolOrExpression(action.hidden);\n const disabled = boolOrExpression(action.disabled);\n const type = typeof action.type === 'string' ? action.type : undefined;\n const shortcuts = (action.shortcuts ?? []).filter((item) => typeof item === 'string' && item.trim());\n const permissions = (action.permissions ?? []).filter((item) => typeof item === 'string' && item.trim());\n\n return {\n id,\n name: typeof action.name === 'string' ? action.name : undefined,\n title: typeof action.title === 'string' ? action.title : undefined,\n commandName: command.name,\n type,\n typeLabel: type ? titleCaseType(type) : '',\n scope: typeof action.scope === 'string' ? action.scope : 'individual',\n priority: typeof action.priority === 'string' ? action.priority : 'secondary',\n icon: typeof action.icon === 'string' ? action.icon : undefined,\n color: typeof action.color === 'string' ? action.color : undefined,\n shortcuts,\n permissions,\n hidden,\n disabled,\n isDefault: action.default === true,\n separated: action.separated === true,\n order: typeof action.order === 'number' ? action.order : undefined,\n depth,\n optionsPairs: command.optionsPairs,\n metadataPairs: command.metadataPairs,\n submenuExpression: items.expression,\n };\n}\n\nfunction flattenActions(actions: AXPEntityAction[], prefix: string, depth = 0): ExplorerActionView[] {\n const rows: ExplorerActionView[] = [];\n actions.forEach((action, index) => {\n const id = `${prefix}.${index}`;\n rows.push(toActionView(action, id, depth));\n const items = resolveItems(action.items);\n if (items.children.length) {\n rows.push(...flattenActions(items.children, id, depth + 1));\n }\n });\n return rows;\n}\n\nfunction groupByScope(actions: ExplorerActionView[]): ExplorerActionScopeGroup[] {\n const map = new Map<string, ExplorerActionView[]>();\n for (const action of actions) {\n const scope = action.scope || 'individual';\n const list = map.get(scope) ?? [];\n list.push(action);\n map.set(scope, list);\n }\n const extra = [...map.keys()].filter((scope) => !SCOPE_ORDER.includes(scope));\n return [...SCOPE_ORDER, ...extra]\n .filter((scope) => (map.get(scope)?.length ?? 0) > 0)\n .map((scope) => ({ scope, actions: map.get(scope) ?? [] }));\n}\n\nfunction toSection(\n id: string,\n kind: ExplorerLayoutKind,\n actions: AXPEntityAction[],\n extra?: Partial<ExplorerLayoutSection>,\n allowEmpty = false,\n): ExplorerLayoutSection | null {\n const flat = flattenActions(actions, id);\n if (!flat.length && !allowEmpty) {\n return null;\n }\n return {\n id,\n kind,\n views: extra?.views ?? [],\n relatedTitle: extra?.relatedTitle,\n relatedEntity: extra?.relatedEntity,\n relatedLayoutType: extra?.relatedLayoutType,\n layoutTitle: extra?.layoutTitle,\n layoutDescription: extra?.layoutDescription,\n groups: groupByScope(flat),\n actionCount: flat.length,\n };\n}\n\nfunction queryViews(views: AXPQueryView[] | undefined): ExplorerLayoutView[] {\n return (views ?? []).map((view) => ({\n name: view.name,\n title: humanText(view.title),\n }));\n}\n\nfunction relatedLayoutType(related: AXPRelatedEntity): string | undefined {\n const type = related.layout?.type;\n return typeof type === 'string' ? type : undefined;\n}\n\nexport function buildLayoutSections(entity: AXPEntity): ExplorerLayoutSection[] {\n const master = entity.interfaces?.master;\n const sections: ExplorerLayoutSection[] = [];\n\n const list = toSection('list', 'list', layoutActions(master?.list), {\n layoutTitle: humanText(master?.list?.title),\n layoutDescription: humanText(master?.list?.description),\n views: queryViews(master?.list?.views),\n }, true);\n if (list) {\n sections.push(list);\n }\n\n const record = toSection('record', 'record', layoutActions(master?.single), {\n layoutTitle: humanText(master?.single?.title),\n layoutDescription: humanText(master?.single?.description),\n }, true);\n if (record) {\n sections.push(record);\n }\n\n const create = toSection('create', 'create', layoutActions(master?.create), {\n layoutTitle: humanText(master?.create?.title),\n }, true);\n if (create) {\n sections.push(create);\n }\n\n const update = toSection('update', 'update', layoutActions(master?.update), {\n layoutTitle: humanText(master?.update?.title),\n }, true);\n if (update) {\n sections.push(update);\n }\n\n const detailList = toSection(\n 'detail-list',\n 'detail-list',\n layoutActions(entity.interfaces?.detail?.list),\n {\n layoutTitle: humanText(entity.interfaces?.detail?.list?.title),\n layoutDescription: humanText(entity.interfaces?.detail?.list?.description),\n },\n );\n if (detailList) {\n sections.push(detailList);\n }\n\n (entity.relatedEntities ?? []).forEach((related, index) => {\n const relatedActions = asActions(related.actions);\n const section = toSection(`related:${index}`, 'related', relatedActions, {\n relatedTitle: humanText(related.title),\n relatedEntity: related.entity,\n relatedLayoutType: relatedLayoutType(related),\n });\n if (section) {\n sections.push(section);\n }\n });\n\n return sections;\n}\n\n//#endregion\n","import type { AXPEntityPropertyDefinition } from '@acorex-platform/framework-shared/domain';\nimport type { AXPEntityProperty } from '@acorex-platform/framework-shared/entity';\n\nimport { flattenToPairs, type FlatJsonPair } from './platform-explorer-json.util';\n\n//#region ----- Types -----\n\nexport interface PropertyDetailFlag {\n labelKey: string;\n on: boolean;\n}\n\nexport interface PropertyDetailPair {\n labelKey: string;\n value: string;\n}\n\nexport interface PropertyDetailTrigger {\n event: string;\n action: string;\n disabled: boolean;\n}\n\nexport interface PropertyDetailValidation {\n rule: string;\n message?: string;\n optionsPairs: FlatJsonPair[];\n disabled: boolean;\n}\n\nexport interface PropertyDetailJson {\n labelKey: string;\n pairs: FlatJsonPair[];\n}\n\nexport interface PropertyDetailsView {\n flags: PropertyDetailFlag[];\n pairs: PropertyDetailPair[];\n triggers: PropertyDetailTrigger[];\n validations: PropertyDetailValidation[];\n jsonBlocks: PropertyDetailJson[];\n}\n\nexport const PROPERTY_SCHEMA_FLAG_KEYS = [\n 'nullable',\n 'unique',\n 'readonly',\n 'visible',\n 'searchable',\n 'full-text',\n 'filterable',\n 'auditable',\n] as const;\n\nexport const PROPERTY_SCHEMA_PAIR_KEYS = ['data-type', 'group', 'default-value'] as const;\n\nexport const PROPERTY_PRESENTATION_FLAG_KEYS = [\n 'inline-filter',\n 'sortable',\n 'advanced-filter',\n 'preload-filter',\n] as const;\n\nexport const PROPERTY_PRESENTATION_PAIR_KEYS = [\n 'editor',\n 'widget-path',\n 'widget-mode',\n 'widget-id',\n 'filter-widget',\n] as const;\n\nexport const PROPERTY_SCHEMA_ORDER = [\n 'data-type',\n 'nullable',\n 'group',\n 'unique',\n 'readonly',\n 'visible',\n 'searchable',\n 'full-text',\n 'filterable',\n 'auditable',\n 'default-value',\n] as const;\n\nexport const PROPERTY_PRESENTATION_ORDER = [\n 'editor',\n 'inline-filter',\n 'advanced-filter',\n 'sortable',\n 'widget-path',\n 'widget-mode',\n 'widget-id',\n 'filter-widget',\n 'preload-filter',\n] as const;\n\nexport type PropertyDetailEntry =\n | { kind: 'flag'; labelKey: string; on: boolean }\n | { kind: 'pair'; labelKey: string; value: string };\n\n//#endregion\n\n//#region ----- JSON / scalar -----\n\nfunction formatScalar(value: unknown): string | undefined {\n if (value === undefined || typeof value === 'function') {\n return undefined;\n }\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return undefined;\n}\n\nfunction resolvePropertyDataType(\n schemaDataType: unknown,\n normalizedDataType: unknown,\n editor: unknown,\n widgetDataTypes: Record<string, string>,\n): string | undefined {\n const widgetName = typeof editor === 'string' ? editor.trim() : '';\n const fromWidget = widgetName ? widgetDataTypes[widgetName] : undefined;\n if (fromWidget) {\n return fromWidget;\n }\n return formatScalar(schemaDataType) ?? formatScalar(normalizedDataType);\n}\n\nfunction pushFlag(flags: PropertyDetailFlag[], labelKey: string, value: unknown, always = false): void {\n if (typeof value !== 'boolean') {\n return;\n }\n if (!always && !value) {\n return;\n }\n if (flags.some((flag) => flag.labelKey === labelKey)) {\n return;\n }\n flags.push({ labelKey, on: value });\n}\n\nfunction pushPair(pairs: PropertyDetailPair[], labelKey: string, value: unknown): void {\n const text = formatScalar(value);\n if (!text || pairs.some((pair) => pair.labelKey === labelKey)) {\n return;\n }\n pairs.push({ labelKey, value: text });\n}\n\nfunction pushJson(blocks: PropertyDetailJson[], labelKey: string, value: unknown): void {\n const pairs = flattenToPairs(value);\n if (!pairs.length || blocks.some((block) => block.labelKey === labelKey)) {\n return;\n }\n blocks.push({ labelKey, pairs });\n}\n\nfunction formatAction(action: unknown): string {\n if (Array.isArray(action)) {\n return action.filter((item) => typeof item === 'string' && item.trim()).join(', ');\n }\n return typeof action === 'string' ? action.trim() : '';\n}\n\n//#endregion\n\n//#region ----- Build details -----\n\nexport function hasPropertyDetails(details: PropertyDetailsView): boolean {\n return (\n details.flags.length > 0 ||\n details.pairs.length > 0 ||\n details.triggers.length > 0 ||\n details.validations.length > 0 ||\n details.jsonBlocks.length > 0\n );\n}\n\nexport function propertyFlag(details: PropertyDetailsView, key: string): boolean | undefined {\n return details.flags.find((flag) => flag.labelKey === key)?.on;\n}\n\nexport function propertyFlagsNamed(\n details: PropertyDetailsView,\n keys: readonly string[],\n): PropertyDetailFlag[] {\n return keys\n .map((key) => details.flags.find((flag) => flag.labelKey === key))\n .filter((flag): flag is PropertyDetailFlag => !!flag);\n}\n\nexport function propertyPairsNamed(\n details: PropertyDetailsView,\n keys: readonly string[],\n): PropertyDetailPair[] {\n return keys\n .map((key) => details.pairs.find((pair) => pair.labelKey === key))\n .filter((pair): pair is PropertyDetailPair => !!pair);\n}\n\nexport function propertyEntries(\n details: PropertyDetailsView,\n pairKeys: readonly string[],\n flagKeys: readonly string[],\n order: readonly string[],\n): PropertyDetailEntry[] {\n const byKey = new Map<string, PropertyDetailEntry>();\n for (const pair of propertyPairsNamed(details, pairKeys)) {\n byKey.set(pair.labelKey, { kind: 'pair', labelKey: pair.labelKey, value: pair.value });\n }\n for (const flag of propertyFlagsNamed(details, flagKeys)) {\n byKey.set(flag.labelKey, { kind: 'flag', labelKey: flag.labelKey, on: flag.on });\n }\n return order\n .map((key) => byKey.get(key))\n .filter((entry): entry is PropertyDetailEntry => !!entry);\n}\n\nexport function buildPropertyDetails(\n layout?: AXPEntityProperty,\n normalized?: AXPEntityPropertyDefinition,\n widgetDataTypes: Record<string, string> = {},\n): PropertyDetailsView {\n const flags: PropertyDetailFlag[] = [];\n const pairs: PropertyDetailPair[] = [];\n const triggers: PropertyDetailTrigger[] = [];\n const validations: PropertyDetailValidation[] = [];\n const jsonBlocks: PropertyDetailJson[] = [];\n\n const schema = layout?.schema;\n const widget = schema?.interface;\n const features = normalized?.features;\n const list = layout?.options;\n\n pushFlag(flags, 'nullable', schema?.nullable ?? normalized?.fieldFeatures?.nullable, true);\n pushFlag(flags, 'unique', schema?.unique?.enabled);\n\n const readonly = schema?.readonly ?? normalized?.fieldFeatures?.readOnly;\n if (typeof readonly === 'boolean') {\n pushFlag(flags, 'readonly', readonly);\n } else {\n pushPair(pairs, 'readonly', readonly);\n }\n\n const visible = schema?.visible;\n if (typeof visible === 'boolean') {\n if (!visible) {\n pushFlag(flags, 'visible', false, true);\n }\n } else {\n pushPair(pairs, 'visible', visible);\n }\n\n pushFlag(flags, 'searchable', features?.searchable?.enabled);\n pushFlag(flags, 'full-text', features?.searchable?.fullText);\n pushFlag(flags, 'filterable', features?.filterable?.enabled);\n pushFlag(flags, 'inline-filter', features?.filterable?.inline ?? list?.filter?.inline?.enabled, true);\n pushFlag(flags, 'sortable', features?.sortable?.enabled ?? list?.sort?.enabled, true);\n pushFlag(flags, 'auditable', features?.auditable?.enabled);\n pushFlag(flags, 'advanced-filter', list?.filter?.advance?.enabled, true);\n pushFlag(flags, 'preload-filter', list?.filter?.preload?.enabled);\n\n pushPair(pairs, 'group', layout?.groupId);\n const editor = widget?.type ?? normalized?.interface?.name;\n pushPair(pairs, 'data-type', resolvePropertyDataType(schema?.dataType, normalized?.dataType, editor, widgetDataTypes));\n pushPair(pairs, 'editor', editor);\n pushPair(pairs, 'widget-path', widget?.path);\n pushPair(pairs, 'widget-mode', widget?.mode);\n pushPair(pairs, 'widget-id', widget?.id);\n pushPair(pairs, 'filter-widget', list?.filter?.advance?.widgetType);\n\n const defaultValue = schema?.defaultValue ?? normalized?.defaultValue;\n const defaultText = formatScalar(defaultValue);\n if (defaultText) {\n pushPair(pairs, 'default-value', defaultText);\n } else {\n pushJson(jsonBlocks, 'default-value', defaultValue);\n }\n\n for (const trigger of widget?.triggers ?? []) {\n const event = typeof trigger.event === 'string' ? trigger.event.trim() : '';\n const action = formatAction(trigger.action);\n if (!event && !action) {\n continue;\n }\n triggers.push({\n event,\n action,\n disabled: !!trigger.disabled,\n });\n }\n\n const rules = layout?.validations ?? normalized?.validations ?? [];\n for (const rule of rules) {\n const name = typeof rule.rule === 'string' ? rule.rule.trim() : '';\n if (!name) {\n continue;\n }\n validations.push({\n rule: name,\n message: typeof rule.message === 'string' ? rule.message.trim() || undefined : undefined,\n optionsPairs: flattenToPairs(rule.options),\n disabled: 'disabled' in rule && rule.disabled === true,\n });\n }\n\n pushJson(jsonBlocks, 'widget-options', widget?.options ?? normalized?.interface?.options);\n pushJson(jsonBlocks, 'value-transforms', widget?.valueTransforms);\n pushJson(jsonBlocks, 'widget-children', widget?.children);\n\n return { flags, pairs, triggers, validations, jsonBlocks };\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n linkedSignal,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDrawerModule } from '@acorex/components/drawer';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport type { AXPEntityPropertyDefinition } from '@acorex-platform/framework-shared/domain';\nimport type { AXPEntityProperty } from '@acorex-platform/framework-shared/entity';\nimport type { AXMPlatformExplorerEntityDetail } from '@acorex-platform/module-platform-management-client/contracts';\nimport type { AXMPlatformExplorerEntitySummary } from '@acorex-platform/module-platform-management-client/contracts';\n\nimport {\n PlatformExplorerDataService,\n type PlatformExplorerEntityTab,\n} from '../platform-explorer-data.service';\nimport { pluginSourceByFieldName } from './platform-explorer-plugin-fields.util';\nimport {\n buildLayoutSections,\n type ExplorerActionView,\n type ExplorerLayoutKind,\n type ExplorerLayoutSection,\n} from './platform-explorer-entity-actions.util';\nimport {\n buildPropertyDetails,\n PROPERTY_PRESENTATION_FLAG_KEYS,\n PROPERTY_PRESENTATION_ORDER,\n PROPERTY_PRESENTATION_PAIR_KEYS,\n PROPERTY_SCHEMA_FLAG_KEYS,\n PROPERTY_SCHEMA_ORDER,\n PROPERTY_SCHEMA_PAIR_KEYS,\n propertyEntries,\n propertyFlag,\n propertyPairsNamed,\n type PropertyDetailEntry,\n type PropertyDetailsView,\n} from './platform-explorer-property-details.util';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface EntityPropertyView {\n name: string;\n title?: string;\n dataType?: string;\n editor?: string;\n description?: string;\n pluginName?: string;\n pluginTitle?: string;\n details: PropertyDetailsView;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst PRIMARY_ACTION_TABS: ExplorerLayoutKind[] = ['list', 'record', 'create', 'update'];\nconst CODE_PAIR_KEYS = new Set([\n 'editor',\n 'widget-path',\n 'widget-mode',\n 'widget-id',\n 'filter-widget',\n]);\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-entity-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [\n CommonModule,\n NgTemplateOutlet,\n AXTranslationModule,\n AXLoadingModule,\n AXSearchBoxModule,\n AXDecoratorModule,\n AXDrawerModule,\n AXPStateMessageComponent,\n ],\n templateUrl: './platform-explorer-entity-detail.component.html',\n styleUrl: './platform-explorer-entity-detail.component.css',\n})\nexport class AXPlatformExplorerEntityDetailComponent {\n payload = input<AXMPlatformExplorerEntitySummary | undefined>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly dataService = inject(PlatformExplorerDataService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly detail = signal<AXMPlatformExplorerEntityDetail | null>(null);\n protected readonly loading = signal(false);\n protected readonly loadError = signal(false);\n protected readonly activeSection = this.dataService.activeEntitySection;\n protected readonly selectedName = signal<string | null>(null);\n protected readonly selectedActionId = linkedSignal({\n source: () => this.activeSection(),\n computation: () => null as string | null,\n });\n protected readonly actionQuery = linkedSignal({\n source: () => this.activeSection(),\n computation: () => '',\n });\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly properties = computed(() => this.mergeProperties(this.detail()));\n protected readonly layoutSections = computed((): ExplorerLayoutSection[] => {\n const detail = this.detail();\n return detail ? buildLayoutSections(detail.layout) : [];\n });\n\n protected readonly selectedProperty = computed(() => {\n const name = this.selectedName();\n if (!name) {\n return null;\n }\n return this.properties().find((row) => row.name === name) ?? null;\n });\n\n protected readonly isFieldSection = computed(() => this.activeSection() === 'properties');\n\n protected readonly inspectorOpen = computed(() =>\n this.isFieldSection() ? this.selectedProperty() != null : this.selectedAction() != null,\n );\n\n protected readonly inspectorAriaKey = computed(() =>\n this.isFieldSection()\n ? '@platform-dev-tools:module.property-details.field-definition'\n : '@platform-dev-tools:module.action-details.action-definition',\n );\n\n protected readonly activeLayout = computed(() => {\n const section = this.activeSection();\n if (section === 'properties') {\n return null;\n }\n return this.layoutSections().find((item) => item.id === section || item.kind === section) ?? null;\n });\n\n protected readonly activeActions = computed((): ExplorerActionView[] => {\n const layout = this.activeLayout();\n if (!layout) {\n return [];\n }\n return layout.groups.flatMap((group) => group.actions);\n });\n\n protected readonly filteredActions = computed(() => {\n const query = this.actionQuery().trim().toLowerCase();\n const rows = this.activeActions();\n if (!query) {\n return rows;\n }\n return rows.filter((row) => this.matchesActionQuery(row, query));\n });\n\n protected readonly selectedAction = computed(() => {\n const id = this.selectedActionId();\n const rows = this.activeActions();\n if (id) {\n const match = rows.find((row) => row.id === id);\n if (match) {\n return match;\n }\n }\n return rows[0] ?? null;\n });\n\n protected readonly selectedSchemaEntries = computed(() => {\n const field = this.selectedProperty();\n return field ? this.schemaEntries(field.details) : [];\n });\n\n protected readonly selectedPresentationEntries = computed(() => {\n const field = this.selectedProperty();\n return field ? this.presentationEntries(field.details) : [];\n });\n\n //#endregion\n\n constructor() {\n this.destroyRef.onDestroy(() => this.dataService.clearEntityTabs());\n\n effect(() => {\n const summary = this.payload();\n void this.loadDetail(summary);\n });\n }\n\n //#region ----- Event Handlers -----\n\n protected selectProperty(name: string): void {\n this.selectedName.set(name);\n }\n\n protected selectAction(id: string): void {\n this.selectedActionId.set(id);\n }\n\n protected isSelected(name: string): boolean {\n return this.selectedName() === name;\n }\n\n protected isActionSelected(id: string): boolean {\n return this.selectedAction()?.id === id;\n }\n\n protected onActionSearchChanged(event: AXValueChangedEvent<string>): void {\n this.actionQuery.set(event.value ?? '');\n }\n\n protected flagValue(details: PropertyDetailsView, key: string): boolean | undefined {\n return propertyFlag(details, key);\n }\n\n protected isCodePair(key: string): boolean {\n return CODE_PAIR_KEYS.has(key);\n }\n\n protected isTypePair(key: string): boolean {\n return key === 'data-type';\n }\n\n protected hiddenFlag(action: ExplorerActionView): boolean | undefined {\n return this.yesNoFlag(action.hidden);\n }\n\n protected disabledFlag(action: ExplorerActionView): boolean | undefined {\n return this.yesNoFlag(action.disabled);\n }\n\n protected hiddenExpression(action: ExplorerActionView): string | undefined {\n return this.expressionValue(action.hidden);\n }\n\n protected disabledExpression(action: ExplorerActionView): string | undefined {\n return this.expressionValue(action.disabled);\n }\n\n //#endregion\n\n //#region ----- Property Details -----\n\n private schemaEntries(details: PropertyDetailsView): PropertyDetailEntry[] {\n return propertyEntries(\n details,\n PROPERTY_SCHEMA_PAIR_KEYS,\n PROPERTY_SCHEMA_FLAG_KEYS,\n PROPERTY_SCHEMA_ORDER,\n );\n }\n\n private presentationEntries(details: PropertyDetailsView): PropertyDetailEntry[] {\n return propertyEntries(\n details,\n PROPERTY_PRESENTATION_PAIR_KEYS,\n PROPERTY_PRESENTATION_FLAG_KEYS,\n PROPERTY_PRESENTATION_ORDER,\n );\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async loadDetail(summary: AXMPlatformExplorerEntitySummary | undefined): Promise<void> {\n this.actionQuery.set('');\n this.selectedName.set(null);\n this.selectedActionId.set(null);\n if (!summary) {\n this.detail.set(null);\n this.loading.set(false);\n this.loadError.set(false);\n this.dataService.clearEntityTabs();\n return;\n }\n this.loading.set(true);\n this.loadError.set(false);\n this.detail.set(null);\n try {\n const detail = await this.dataService.getEntity(summary.module, summary.name);\n if (this.payload() === summary) {\n this.detail.set(detail);\n this.selectedName.set(this.mergeProperties(detail)[0]?.name ?? null);\n this.dataService.setEntityTabs(this.buildTabs(detail));\n }\n } catch {\n if (this.payload() === summary) {\n this.loadError.set(true);\n }\n } finally {\n if (this.payload() === summary) {\n this.loading.set(false);\n }\n }\n }\n\n private buildTabs(detail: AXMPlatformExplorerEntityDetail | null): PlatformExplorerEntityTab[] {\n if (!detail) {\n return [];\n }\n const extra = buildLayoutSections(detail.layout).filter(\n (section) => !PRIMARY_ACTION_TABS.includes(section.kind),\n );\n const tabs: PlatformExplorerEntityTab[] = [\n { id: 'properties', textKey: '@platform-dev-tools:module.terms.properties' },\n ];\n for (const kind of PRIMARY_ACTION_TABS) {\n tabs.push({ id: kind, textKey: `@platform-dev-tools:module.layouts.${kind}` });\n }\n for (const layout of extra) {\n tabs.push({\n id: layout.id,\n textKey:\n layout.kind === 'related'\n ? '@platform-dev-tools:module.layouts.related'\n : `@platform-dev-tools:module.layouts.${layout.kind}`,\n extraText:\n layout.kind === 'related' ? layout.relatedTitle || layout.relatedEntity : undefined,\n });\n }\n return tabs;\n }\n\n private mergeProperties(detail: AXMPlatformExplorerEntityDetail | null): EntityPropertyView[] {\n if (!detail) {\n return [];\n }\n const pluginByField = pluginSourceByFieldName(detail.plugins);\n const widgetDataTypes = detail.widgetDataTypes ?? {};\n const normalizedByName = new Map(\n (detail.normalized?.fields ?? []).map((field) => [field.name, field]),\n );\n const rows: EntityPropertyView[] = [];\n const seen = new Set<string>();\n\n for (const property of detail.layout.properties ?? []) {\n seen.add(property.name);\n rows.push(\n this.toRow(property.name, pluginByField, widgetDataTypes, property, normalizedByName.get(property.name)),\n );\n }\n\n for (const field of detail.normalized?.fields ?? []) {\n if (seen.has(field.name)) {\n continue;\n }\n seen.add(field.name);\n rows.push(this.toRow(field.name, pluginByField, widgetDataTypes, undefined, field));\n }\n\n return rows;\n }\n\n private toRow(\n name: string,\n pluginByField: ReturnType<typeof pluginSourceByFieldName>,\n widgetDataTypes: Record<string, string>,\n layout?: AXPEntityProperty,\n normalized?: AXPEntityPropertyDefinition,\n ): EntityPropertyView {\n const plugin = pluginByField.get(name);\n const details = buildPropertyDetails(layout, normalized, widgetDataTypes);\n const title = this.asText(layout?.title) ?? this.asText(normalized?.title);\n const description = this.asText(layout?.description) ?? this.asText(normalized?.description);\n return {\n name,\n title,\n dataType: propertyPairsNamed(details, ['data-type'])[0]?.value ?? '',\n editor: propertyPairsNamed(details, ['editor'])[0]?.value ?? '',\n description,\n pluginName: plugin?.name,\n pluginTitle: plugin?.title,\n details,\n };\n }\n\n private asText(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n }\n\n private matchesActionQuery(row: ExplorerActionView, query: string): boolean {\n return (\n row.commandName.toLowerCase().includes(query) ||\n (row.name?.toLowerCase().includes(query) ?? false) ||\n (row.title?.toLowerCase().includes(query) ?? false) ||\n (row.typeLabel?.toLowerCase().includes(query) ?? false) ||\n row.scope.toLowerCase().includes(query)\n );\n }\n\n private yesNoFlag(value: string | undefined): boolean | undefined {\n if (value === 'yes') {\n return true;\n }\n if (value === 'no') {\n return false;\n }\n return undefined;\n }\n\n private expressionValue(value: string | undefined): string | undefined {\n if (!value || value === 'yes' || value === 'no') {\n return undefined;\n }\n return value;\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"flex flex-col flex-1 min-h-0\">\n <!-- ----- Loading entity layout ----- -->\n @if (loading()) {\n <div class=\"flex flex-1 items-center justify-center p-6\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Entity catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- Entity documentation with field or action inspector ----- -->\n @else if (detail(); as d) {\n <ax-drawer-container class=\"axp-platform-explorer__docs\">\n <ax-content class=\"axp-platform-explorer__docs-main\">\n <div class=\"axp-platform-explorer__docs-shell\">\n <div class=\"axp-platform-explorer__docs-chrome\">\n <!--->\n <!-- ----- Attached plugins as chips ----- -->\n @if (d.plugins.length) {\n <div class=\"axp-platform-explorer__docs-plugins\">\n @for (plugin of d.plugins; track plugin.name) {\n <span class=\"axp-platform-explorer__docs-chip\">\n <i class=\"fa-light fa-plug\" aria-hidden=\"true\"></i>\n {{ (plugin.title || plugin.name) | translate | async }}\n </span>\n }\n </div>\n }\n <!--->\n <!-- ----- Field column headers stay outside the scrolling rows ----- -->\n @if (isFieldSection() && properties().length) {\n <div class=\"axp-platform-explorer__docs-table-head\" role=\"row\">\n <span role=\"columnheader\">{{ '@platform-dev-tools:module.terms.field' | translate | async }}</span>\n <span role=\"columnheader\">\n {{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}\n </span>\n <span role=\"columnheader\">\n {{ '@platform-dev-tools:module.property-details.nullable' | translate | async }}\n </span>\n </div>\n }\n </div>\n\n <!--->\n <!-- ----- Field table ----- -->\n @if (isFieldSection()) {\n <div class=\"axp-platform-explorer__docs-list\">\n <!--->\n <!-- ----- Empty property list ----- -->\n @if (properties().length === 0) {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.messages.no-properties' | translate | async }}\n </p>\n }\n <!-- ----- Field rows ----- -->\n @else {\n <div class=\"axp-platform-explorer__table-wrap axp-platform-explorer__table-wrap--fields\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead class=\"sr-only\">\n <tr>\n <th>{{ '@platform-dev-tools:module.terms.field' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.property-details.nullable' | translate | async }}</th>\n </tr>\n </thead>\n <tbody>\n @for (row of properties(); track row.name) {\n <tr\n class=\"axp-platform-explorer__table-row\"\n [class.axp-platform-explorer__table-row--selected]=\"isSelected(row.name)\"\n (click)=\"selectProperty(row.name)\"\n >\n <td>\n <button\n type=\"button\"\n class=\"axp-platform-explorer__field-button\"\n [attr.aria-pressed]=\"isSelected(row.name)\"\n (click)=\"selectProperty(row.name); $event.stopPropagation()\"\n >\n <code dir=\"ltr\">{{ row.name }}</code>\n </button>\n <!--->\n <!-- ----- Translated property title under the field name ----- -->\n @if (row.title) {\n <div class=\"axp-platform-explorer__field-title\">\n {{ row.title | translate | async }}\n </div>\n }\n </td>\n <td>\n <!--->\n <!-- ----- Stored data type chip ----- -->\n @if (row.dataType) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ row.dataType }}</span>\n }\n <!-- ----- Missing data type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n <td>\n <ng-container\n *ngTemplateOutlet=\"boolCell; context: { value: flagValue(row.details, 'nullable') }\"\n />\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <p class=\"axp-platform-explorer__docs-footnote\">\n {{ '@platform-dev-tools:module.property-details.select-field' | translate | async }}\n </p>\n </div>\n }\n <!-- ----- Action table ----- -->\n @else if (activeLayout(); as layout) {\n <div class=\"axp-platform-explorer__docs-list axp-platform-explorer__docs-list--padded\">\n <div class=\"axp-platform-explorer__docs-toolbar\">\n <div>\n <h2 class=\"axp-platform-explorer__docs-heading\">\n {{ ('@platform-dev-tools:module.layouts.' + layout.kind) | translate | async }}\n </h2>\n <p class=\"axp-platform-explorer__docs-count\">\n {{ ('@platform-dev-tools:module.layouts.' + layout.kind + '-hint') | translate | async }}\n </p>\n <p class=\"axp-platform-explorer__docs-count\">\n <!--->\n <!-- ----- Filtered action count ----- -->\n @if (actionQuery().trim()) {\n {{\n '@platform-dev-tools:module.action-details.action-count-filtered'\n | translate: { params: { shown: filteredActions().length, count: layout.actionCount } }\n | async\n }}\n }\n <!-- ----- Full action count ----- -->\n @else {\n {{\n '@platform-dev-tools:module.layouts.action-count'\n | translate: { params: { count: layout.actionCount } }\n | async\n }}\n }\n </p>\n </div>\n <ax-search-box\n class=\"axp-platform-explorer__docs-search\"\n look=\"fill\"\n [delayTime]=\"200\"\n [value]=\"actionQuery()\"\n [placeholder]=\"\n ('@platform-dev-tools:module.action-details.search-actions' | translate | async) ?? ''\n \"\n (onValueChanged)=\"onActionSearchChanged($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </div>\n <div class=\"flex flex-wrap items-center gap-1.5 mb-4\">\n <!--->\n <!-- ----- Related entity identity ----- -->\n @if (layout.relatedEntity) {\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ layout.relatedEntity }}</code>\n }\n <!--->\n <!-- ----- Related layout type ----- -->\n @if (layout.relatedLayoutType) {\n <span class=\"inline-flex items-center rounded-full bg-lighter px-2 py-0.5 text-xs text-muted\">\n {{\n ('@platform-dev-tools:module.layouts.related-types.' + layout.relatedLayoutType)\n | translate | async\n }}\n </span>\n }\n <!--->\n <!-- ----- List query views ----- -->\n @for (view of layout.views; track view.name) {\n <span class=\"inline-flex items-center rounded-full bg-lighter px-2 py-0.5 text-xs text-muted\">\n {{ (view.title || view.name) | translate | async }}\n </span>\n }\n </div>\n <!--->\n <!-- ----- Optional stored layout title ----- -->\n @if (layout.layoutTitle) {\n <p class=\"m-0 mb-2 text-sm\">{{ layout.layoutTitle | translate | async }}</p>\n }\n <!--->\n <!-- ----- Optional stored layout description ----- -->\n @if (layout.layoutDescription) {\n <p class=\"m-0 mb-3 text-sm text-muted\">{{ layout.layoutDescription | translate | async }}</p>\n }\n\n <!--->\n <!-- ----- Empty action list ----- -->\n @if (layout.actionCount === 0) {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.messages.no-actions' | translate | async }}\n </p>\n }\n <!-- ----- Search matched no actions ----- -->\n @else if (filteredActions().length === 0) {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.action-details.no-matching-actions' | translate | async }}\n </p>\n }\n <!-- ----- Action rows ----- -->\n @else {\n <div class=\"axp-platform-explorer__table-wrap axp-platform-explorer__table-wrap--fields\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead>\n <tr>\n <th>{{ '@platform-dev-tools:module.action-details.item' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.action-details.type' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.action-details.priority' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.action-details.scope' | translate | async }}</th>\n </tr>\n </thead>\n <tbody>\n @for (action of filteredActions(); track action.id) {\n <tr\n class=\"axp-platform-explorer__table-row\"\n [class.axp-platform-explorer__table-row--selected]=\"isActionSelected(action.id)\"\n (click)=\"selectAction(action.id)\"\n >\n <td>\n <div [style.padding-inline-start.rem]=\"action.depth\">\n <button\n type=\"button\"\n class=\"axp-platform-explorer__field-button\"\n [attr.aria-pressed]=\"isActionSelected(action.id)\"\n (click)=\"selectAction(action.id); $event.stopPropagation()\"\n >\n <!--->\n <!-- ----- Action icon from the layout ----- -->\n @if (action.icon) {\n <i class=\"text-muted me-1\" [ngClass]=\"action.icon\" aria-hidden=\"true\"></i>\n }\n <code dir=\"ltr\">{{ action.commandName || action.name || '–' }}</code>\n </button>\n <!--->\n <!-- ----- Translated action title ----- -->\n @if (action.title) {\n <div class=\"axp-platform-explorer__field-title\">\n {{ action.title | translate | async }}\n </div>\n }\n </div>\n </td>\n <td>\n <!--->\n <!-- ----- Action type chip ----- -->\n @if (action.typeLabel) {\n <span class=\"axp-platform-explorer__type-chip\">{{ action.typeLabel }}</span>\n }\n <!-- ----- Missing action type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n <td>\n <span\n class=\"axp-platform-explorer__priority\"\n [class.is-primary]=\"action.priority === 'primary'\"\n >\n {{\n ('@platform-dev-tools:module.action-details.priorities.' + action.priority)\n | translate | async\n }}\n </span>\n </td>\n <td class=\"text-muted\">\n {{\n ('@platform-dev-tools:module.action-details.scopes.' + action.scope) | translate | async\n }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <p class=\"axp-platform-explorer__docs-footnote\">\n {{ '@platform-dev-tools:module.action-details.select-action' | translate | async }}\n </p>\n </div>\n }\n </div>\n </ax-content>\n <ax-drawer\n class=\"axp-platform-explorer__docs-side\"\n [location]=\"'end'\"\n [mode]=\"'push'\"\n [collapsed]=\"!inspectorOpen()\"\n >\n <ax-content\n class=\"axp-platform-explorer__docs-detail\"\n [attr.aria-label]=\"inspectorAriaKey() | translate | async\"\n >\n <!--->\n <!-- ----- Selected field definition ----- -->\n @if (isFieldSection()) {\n <ng-container *ngTemplateOutlet=\"fieldDetail\" />\n }\n <!-- ----- Selected action definition ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"actionDetail\" />\n }\n </ax-content>\n </ax-drawer>\n </ax-drawer-container>\n }\n</div>\n\n<ng-template #boolCell let-value=\"value\">\n <!-- ----- Affirmative flag ----- -->\n @if (value === true) {\n <span class=\"axp-platform-explorer__yes\">\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n {{ '@platform-dev-tools:module.property-details.yes' | translate | async }}\n </span>\n }\n <!-- ----- Negative flag ----- -->\n @else if (value === false) {\n {{ '@platform-dev-tools:module.property-details.no' | translate | async }}\n }\n <!-- ----- Unknown flag ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n</ng-template>\n\n<ng-template #kvList let-pairs=\"pairs\">\n <dl class=\"axp-platform-explorer__docs-dl axp-platform-explorer__docs-dl--json\">\n @for (pair of pairs; track pair.path) {\n <dt>\n <code dir=\"ltr\">{{ pair.path || '–' }}</code>\n </dt>\n <dd>\n <code dir=\"ltr\">{{ pair.value }}</code>\n </dd>\n }\n </dl>\n</ng-template>\n\n<ng-template #fieldDetail>\n <!-- ----- Selected field definition ----- -->\n @if (selectedProperty(); as field) {\n <div class=\"axp-platform-explorer__docs-detail-header\">\n <div class=\"axp-platform-explorer__docs-eyebrow\">\n {{ '@platform-dev-tools:module.property-details.field-definition' | translate | async }}\n </div>\n <h2 class=\"axp-platform-explorer__docs-detail-title\">\n {{ (field.title || field.name) | translate | async }}\n </h2>\n <code class=\"axp-platform-explorer__docs-key\" dir=\"ltr\">{{ field.name }}</code>\n <!--->\n <!-- ----- Plugin source of the selected field ----- -->\n @if (field.pluginTitle) {\n <span class=\"axp-platform-explorer__docs-chip axp-platform-explorer__docs-chip--field\">\n <i class=\"fa-light fa-plug\" aria-hidden=\"true\"></i>\n {{ field.pluginTitle | translate | async }}\n </span>\n }\n </div>\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.terms.description' | translate | async }}</h3>\n <p class=\"axp-platform-explorer__docs-description\">\n <!--->\n <!-- ----- Translated field description ----- -->\n @if (field.description) {\n {{ field.description | translate | async }}\n }\n <!-- ----- Missing field description ----- -->\n @else {\n {{ '@platform-dev-tools:module.property-details.no-description' | translate | async }}\n }\n </p>\n </section>\n <!--->\n <!-- ----- Schema flags and scalar pairs ----- -->\n @if (selectedSchemaEntries(); as schema) {\n <!--->\n <!-- ----- Render schema when at least one entry exists ----- -->\n @if (schema.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.schema' | translate | async }}</h3>\n <dl class=\"axp-platform-explorer__docs-dl\">\n @for (entry of schema; track entry.labelKey) {\n <dt>{{ ('@platform-dev-tools:module.property-details.' + entry.labelKey) | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Boolean schema flags ----- -->\n @if (entry.kind === 'flag') {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: entry.on }\" />\n }\n <!-- ----- Schema scalar values ----- -->\n @else {\n <!--->\n <!-- ----- Data type shown as a chip ----- -->\n @if (isTypePair(entry.labelKey)) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ entry.value }}</span>\n }\n <!-- ----- Code-like schema values ----- -->\n @else if (isCodePair(entry.labelKey)) {\n <code dir=\"ltr\">{{ entry.value }}</code>\n }\n <!-- ----- Plain schema values ----- -->\n @else {\n {{ entry.value }}\n }\n }\n </dd>\n }\n </dl>\n </section>\n }\n }\n <!--->\n <!-- ----- Presentation flags and widget pairs ----- -->\n @if (selectedPresentationEntries(); as presentation) {\n <!--->\n <!-- ----- Render presentation when at least one entry exists ----- -->\n @if (presentation.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.presentation' | translate | async }}</h3>\n <dl class=\"axp-platform-explorer__docs-dl\">\n @for (entry of presentation; track entry.labelKey) {\n <dt>{{ ('@platform-dev-tools:module.property-details.' + entry.labelKey) | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Boolean presentation flags ----- -->\n @if (entry.kind === 'flag') {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: entry.on }\" />\n }\n <!-- ----- Presentation scalar values ----- -->\n @else {\n <!--->\n <!-- ----- Widget identifiers as code ----- -->\n @if (isCodePair(entry.labelKey) || isTypePair(entry.labelKey)) {\n <code dir=\"ltr\">{{ entry.value }}</code>\n }\n <!-- ----- Plain presentation values ----- -->\n @else {\n {{ entry.value }}\n }\n }\n </dd>\n }\n </dl>\n </section>\n }\n }\n <!--->\n <!-- ----- Widget triggers ----- -->\n @if (field.details.triggers.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.triggers' | translate | async }}</h3>\n <div class=\"axp-platform-explorer__prop-stack\">\n @for (trigger of field.details.triggers; track $index) {\n <div class=\"axp-platform-explorer__prop-card\">\n <div class=\"axp-platform-explorer__prop-trigger\">\n <span class=\"text-muted text-xs\">\n {{ '@platform-dev-tools:module.property-details.event' | translate | async }}\n </span>\n <code>{{ trigger.event || '–' }}</code>\n <i class=\"fa-light fa-arrow-right text-muted\" aria-hidden=\"true\"></i>\n <span class=\"text-muted text-xs\">\n {{ '@platform-dev-tools:module.property-details.action' | translate | async }}\n </span>\n <code>{{ trigger.action || '–' }}</code>\n </div>\n <!--->\n <!-- ----- Disabled trigger badge ----- -->\n @if (trigger.disabled) {\n <span class=\"axp-platform-explorer__prop-flag\">\n {{ '@platform-dev-tools:module.property-details.disabled' | translate | async }}\n </span>\n }\n </div>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Validation rules ----- -->\n @if (field.details.validations.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.property-details.validations' | translate | async }}</h3>\n <div class=\"axp-platform-explorer__prop-stack\">\n @for (rule of field.details.validations; track $index) {\n <div class=\"axp-platform-explorer__prop-card\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <code>{{ rule.rule }}</code>\n <!--->\n <!-- ----- Disabled validation badge ----- -->\n @if (rule.disabled) {\n <span class=\"axp-platform-explorer__prop-flag\">\n {{ '@platform-dev-tools:module.property-details.disabled' | translate | async }}\n </span>\n }\n </div>\n <!--->\n <!-- ----- Validation message ----- -->\n @if (rule.message) {\n <p class=\"m-0 text-xs text-muted\">{{ rule.message | translate | async }}</p>\n }\n <!--->\n <!-- ----- Flattened validation options ----- -->\n @if (rule.optionsPairs.length) {\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: rule.optionsPairs }\" />\n }\n </div>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Flattened nested JSON (widget options, transforms, children) ----- -->\n @if (field.details.jsonBlocks.length) {\n @for (block of field.details.jsonBlocks; track block.labelKey) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ ('@platform-dev-tools:module.property-details.' + block.labelKey) | translate | async }}</h3>\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: block.pairs }\" />\n </section>\n }\n }\n }\n <!-- ----- No field selected ----- -->\n @else {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.property-details.select-field' | translate | async }}\n </p>\n }\n</ng-template>\n\n<ng-template #actionDetail>\n <!-- ----- Selected action definition ----- -->\n @if (selectedAction(); as action) {\n <div class=\"axp-platform-explorer__docs-detail-header\">\n <div class=\"axp-platform-explorer__docs-eyebrow\">\n {{ '@platform-dev-tools:module.action-details.action-definition' | translate | async }}\n </div>\n <h2 class=\"axp-platform-explorer__docs-detail-title\">\n {{ (action.title || action.commandName || action.name || '–') | translate | async }}\n </h2>\n <code class=\"axp-platform-explorer__docs-key\" dir=\"ltr\">{{ action.commandName || action.name || '–' }}</code>\n </div>\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.behavior' | translate | async }}</h3>\n <dl class=\"axp-platform-explorer__docs-dl\">\n <dt>{{ '@platform-dev-tools:module.action-details.type' | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Action type ----- -->\n @if (action.typeLabel) {\n <span class=\"axp-platform-explorer__type-chip\">{{ action.typeLabel }}</span>\n }\n <!-- ----- Missing action type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.priority' | translate | async }}</dt>\n <dd>\n {{ ('@platform-dev-tools:module.action-details.priorities.' + action.priority) | translate | async }}\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.scope' | translate | async }}</dt>\n <dd>{{ ('@platform-dev-tools:module.action-details.scopes.' + action.scope) | translate | async }}</dd>\n <dt>{{ '@platform-dev-tools:module.action-details.default' | translate | async }}</dt>\n <dd>\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: action.isDefault }\" />\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.separated' | translate | async }}</dt>\n <dd>\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: action.separated }\" />\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.hidden' | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Hidden yes/no ----- -->\n @if (hiddenFlag(action) !== undefined) {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: hiddenFlag(action) }\" />\n }\n <!-- ----- Hidden expression ----- -->\n @else if (hiddenExpression(action); as expression) {\n <code dir=\"ltr\">{{ expression }}</code>\n }\n <!-- ----- Hidden unknown ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </dd>\n <dt>{{ '@platform-dev-tools:module.action-details.disabled' | translate | async }}</dt>\n <dd>\n <!--->\n <!-- ----- Disabled yes/no ----- -->\n @if (disabledFlag(action) !== undefined) {\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: disabledFlag(action) }\" />\n }\n <!-- ----- Disabled expression ----- -->\n @else if (disabledExpression(action); as expression) {\n <code dir=\"ltr\">{{ expression }}</code>\n }\n <!-- ----- Disabled unknown ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </dd>\n <!--->\n <!-- ----- Named action key ----- -->\n @if (action.name) {\n <dt>{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd>\n <code dir=\"ltr\">{{ action.name }}</code>\n </dd>\n }\n <!--->\n <!-- ----- Color token ----- -->\n @if (action.color) {\n <dt>{{ '@platform-dev-tools:module.action-details.color' | translate | async }}</dt>\n <dd>\n <code dir=\"ltr\">{{ action.color }}</code>\n </dd>\n }\n <!--->\n <!-- ----- Sort order ----- -->\n @if (action.order != null) {\n <dt>{{ '@platform-dev-tools:module.action-details.order' | translate | async }}</dt>\n <dd>{{ action.order }}</dd>\n }\n </dl>\n </section>\n <!--->\n <!-- ----- Keyboard shortcuts ----- -->\n @if (action.shortcuts.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.shortcuts' | translate | async }}</h3>\n <div class=\"flex flex-wrap gap-1.5\">\n @for (shortcut of action.shortcuts; track shortcut) {\n <code>{{ shortcut }}</code>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Permission keys ----- -->\n @if (action.permissions.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.terms.permissions' | translate | async }}</h3>\n <div class=\"flex flex-wrap gap-1.5\">\n @for (permission of action.permissions; track permission) {\n <code>{{ permission }}</code>\n }\n </div>\n </section>\n }\n <!--->\n <!-- ----- Dynamic submenu expression ----- -->\n @if (action.submenuExpression) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.submenu' | translate | async }}</h3>\n <code dir=\"ltr\">{{ action.submenuExpression }}</code>\n </section>\n }\n <!--->\n <!-- ----- Flattened command options ----- -->\n @if (action.optionsPairs.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.options' | translate | async }}</h3>\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: action.optionsPairs }\" />\n </section>\n }\n <!--->\n <!-- ----- Flattened command metadata ----- -->\n @if (action.metadataPairs.length) {\n <section class=\"axp-platform-explorer__docs-detail-block\">\n <h3>{{ '@platform-dev-tools:module.action-details.metadata' | translate | async }}</h3>\n <ng-container *ngTemplateOutlet=\"kvList; context: { pairs: action.metadataPairs }\" />\n </section>\n }\n }\n <!-- ----- No action selected ----- -->\n @else {\n <p class=\"axp-platform-explorer__docs-empty\">\n {{ '@platform-dev-tools:module.action-details.select-action' | translate | async }}\n </p>\n }\n</ng-template>\n","import type {\n AXMPlatformExplorerCatalogItem,\n AXMPlatformExplorerCatalogKind,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\n//#region ----- Types -----\n\nexport interface CatalogIoRow {\n name: string;\n title?: string;\n dataType?: string;\n required: boolean;\n extra?: string;\n extraKind?: 'scope' | 'condition';\n note?: string;\n}\n\nexport type CatalogContributionKind =\n | 'properties'\n | 'columns'\n | 'actions'\n | 'groups'\n | 'pages'\n | 'related-entities';\n\nexport interface CatalogContributionSection {\n kind: CatalogContributionKind;\n extraKey?: 'scope' | 'condition';\n rows: CatalogIoRow[];\n}\n\nexport interface CatalogIoTables {\n input: CatalogIoRow[];\n output: CatalogIoRow[];\n showOutput: boolean;\n contributions: CatalogContributionSection[];\n extensionKeys: string[];\n}\n\n//#endregion\n\n//#region ----- Property rows -----\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction asText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction hasRequired(def: Record<string, unknown>): boolean {\n if (def['required'] === true) {\n return true;\n }\n const validations = def['validations'];\n if (!Array.isArray(validations)) {\n return false;\n }\n return validations.some((rule) => asRecord(rule)?.['rule'] === 'required');\n}\n\nfunction dataTypeOf(def: Record<string, unknown>): string | undefined {\n const dataType = def['dataType'];\n if (typeof dataType === 'string' && dataType.trim()) {\n return dataType.trim();\n }\n const iface = asRecord(def['interface']);\n const name = iface?.['name'];\n if (typeof name === 'string' && name.trim()) {\n return name.trim();\n }\n return undefined;\n}\n\nfunction joinNotes(\n def: Record<string, unknown>,\n extra: string[],\n omitCondition = false,\n): string | undefined {\n const parts = [\n ...extra,\n omitCondition ? '' : asText(def['condition']),\n asText(def['notes']),\n ].filter(Boolean);\n return parts.length ? parts.join(' · ') : undefined;\n}\n\nfunction toIoRows(defs: unknown): CatalogIoRow[] {\n if (!Array.isArray(defs)) {\n return [];\n }\n const rows: CatalogIoRow[] = [];\n const seen = new Set<string>();\n for (const item of defs) {\n const def = asRecord(item);\n if (!def) {\n continue;\n }\n const name = asText(def['name']);\n if (!name || seen.has(name)) {\n continue;\n }\n seen.add(name);\n const title = asText(def['title']) || undefined;\n const dataType = dataTypeOf(def);\n const note = joinNotes(def, []);\n rows.push({\n name,\n ...(title ? { title } : {}),\n ...(dataType ? { dataType } : {}),\n required: hasRequired(def),\n ...(note ? { note } : {}),\n });\n }\n return rows;\n}\n\nfunction capabilityProperties(section: unknown): CatalogIoRow[] {\n const row = asRecord(section);\n if (!row || row['enabled'] !== true) {\n return [];\n }\n return toIoRows(row['definition']);\n}\n\nfunction queryOutputRows(query: Record<string, unknown>): CatalogIoRow[] {\n const columns = toIoRows(query['columns']);\n if (columns.length) {\n return columns;\n }\n const valueType = asText(query['valueType']);\n if (valueType) {\n return [{ name: 'value', dataType: valueType, required: false }];\n }\n return [];\n}\n\nfunction queryInputRows(query: Record<string, unknown>): CatalogIoRow[] {\n const args = capabilityProperties(query['args']);\n const filter = capabilityProperties(query['filter']);\n if (!args.length) {\n return filter;\n }\n if (!filter.length) {\n return args;\n }\n const seen = new Set(args.map((row) => row.name));\n return [...args, ...filter.filter((row) => !seen.has(row.name))];\n}\n\nfunction emptyTables(showOutput: boolean): CatalogIoTables {\n return {\n input: [],\n output: [],\n showOutput,\n contributions: [],\n extensionKeys: [],\n };\n}\n\n//#endregion\n\n//#region ----- Plugin contributions -----\n\nfunction parseJsonObject(value: unknown): Record<string, unknown> | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n try {\n return asRecord(JSON.parse(trimmed));\n } catch {\n return null;\n }\n }\n return asRecord(value);\n}\n\nfunction namedRows(\n list: unknown,\n nameKeys: string[],\n extraKind?: 'scope' | 'condition',\n): CatalogIoRow[] {\n if (!Array.isArray(list)) {\n return [];\n }\n const rows: CatalogIoRow[] = [];\n for (const item of list) {\n const def = asRecord(item);\n if (!def) {\n continue;\n }\n let name = '';\n for (const key of nameKeys) {\n name = asText(def[key]);\n if (name) {\n break;\n }\n }\n if (!name) {\n continue;\n }\n const title = asText(def['title']) || undefined;\n const fromOption = asText(def['nameFromOption'] || def['idFromOption']);\n const extra =\n extraKind === 'scope'\n ? asText(def['scope']) || undefined\n : extraKind === 'condition'\n ? asText(def['condition']) || undefined\n : undefined;\n const note = joinNotes(\n def,\n fromOption ? [`options.${fromOption}`] : [],\n extraKind === 'condition',\n );\n const dataType = dataTypeOf(def);\n rows.push({\n name,\n ...(title ? { title } : {}),\n ...(dataType ? { dataType } : {}),\n required: hasRequired(def),\n ...(extra && extraKind ? { extra, extraKind } : {}),\n ...(note ? { note } : {}),\n });\n }\n return rows;\n}\n\nfunction contributionSections(json: unknown): {\n contributions: CatalogContributionSection[];\n extensionKeys: string[];\n} {\n const parsed = parseJsonObject(json);\n if (!parsed) {\n return { contributions: [], extensionKeys: [] };\n }\n const contributions: CatalogContributionSection[] = [];\n const add = (\n kind: CatalogContributionKind,\n rows: CatalogIoRow[],\n extraKey?: 'scope' | 'condition',\n ): void => {\n if (!rows.length) {\n return;\n }\n contributions.push({ kind, rows, ...(extraKey ? { extraKey } : {}) });\n };\n\n add('properties', namedRows(parsed['properties'], ['name']));\n add('columns', namedRows(parsed['columns'], ['name'], 'condition'), 'condition');\n add('actions', namedRows(parsed['actions'], ['name'], 'scope'), 'scope');\n add('groups', namedRows(parsed['groups'], ['id', 'name']));\n add('pages', namedRows(parsed['pages'], ['name'], 'condition'), 'condition');\n add('related-entities', namedRows(parsed['relatedEntities'], ['entity', 'name']));\n\n const extensionKeys = Array.isArray(parsed['extensionKeys'])\n ? parsed['extensionKeys'].filter((key): key is string => typeof key === 'string' && key.trim().length > 0)\n : [];\n\n return { contributions, extensionKeys };\n}\n\n//#endregion\n\n//#region ----- Catalog I/O -----\n\nexport function catalogIoFromDetail(\n kind: AXMPlatformExplorerCatalogKind,\n detail: AXMPlatformExplorerCatalogItem | null,\n): CatalogIoTables | null {\n if (!detail) {\n return null;\n }\n if (kind === 'command' && detail.command) {\n return {\n ...emptyTables(true),\n input: toIoRows(detail.command.inputOptionDefinitions),\n output: toIoRows(detail.command.outputOptionDefinitions),\n };\n }\n if (kind === 'query' && detail.query) {\n const query = detail.query as unknown as Record<string, unknown>;\n return {\n ...emptyTables(true),\n input: queryInputRows(query),\n output: queryOutputRows(query),\n };\n }\n if (kind === 'widget' && detail.widget) {\n return {\n ...emptyTables(true),\n input: toIoRows(detail.widget.inputOptionDefinitions),\n output: toIoRows(detail.widget.outputOptionDefinitions),\n };\n }\n if (kind === 'plugin' && detail.plugin) {\n const contributed = contributionSections(detail.plugin.contributionsJson);\n return {\n ...emptyTables(false),\n input: toIoRows(detail.plugin.optionDefinitions),\n contributions: contributed.contributions,\n extensionKeys: contributed.extensionKeys,\n };\n }\n return null;\n}\n\nexport function stringList(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const items: string[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n const text = asText(item);\n if (!text || seen.has(text)) {\n continue;\n }\n seen.add(text);\n items.push(text);\n }\n return items;\n}\n\nexport function categoryLabels(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const items: string[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n const text = asText(item) || asText(asRecord(item)?.['title']) || asText(asRecord(item)?.['name']);\n if (!text || seen.has(text)) {\n continue;\n }\n seen.add(text);\n items.push(text);\n }\n return items;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport type {\n AXMPlatformExplorerCatalogItem,\n AXMPlatformExplorerCatalogKind,\n AXMPlatformExplorerNamedItem,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\nimport {\n catalogIoFromDetail,\n categoryLabels,\n stringList,\n} from './platform-explorer-catalog-io.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-catalog-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXTranslationModule, AXLoadingModule, AXPStateMessageComponent],\n templateUrl: './platform-explorer-catalog-detail.component.html',\n styleUrl: './platform-explorer-catalog-detail.component.css',\n})\nexport class AXPlatformExplorerCatalogDetailComponent {\n kind = input.required<AXMPlatformExplorerCatalogKind>();\n item = input<AXMPlatformExplorerNamedItem | undefined>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly detail = signal<AXMPlatformExplorerCatalogItem | null>(null);\n protected readonly loading = signal(false);\n protected readonly loadError = signal(false);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly ioTables = computed(() => catalogIoFromDetail(this.kind(), this.detail()));\n\n //#endregion\n\n constructor() {\n effect(() => {\n const kind = this.kind();\n const item = this.item();\n void this.load(kind, item?.name);\n });\n }\n\n protected record(): Record<string, unknown> | null {\n const detail = this.detail();\n if (!detail) {\n return null;\n }\n return (detail.command ?? detail.query ?? detail.plugin ?? detail.widget ?? null) as Record<string, unknown> | null;\n }\n\n protected displayTitle(record: Record<string, unknown>): string {\n return String(record['catalogTitle'] ?? record['title'] ?? record['name'] ?? '');\n }\n\n //#region ----- Helpers -----\n\n protected asText(value: unknown): string {\n return typeof value === 'string' ? value : '';\n }\n\n protected asStringList(value: unknown): string[] {\n return stringList(value);\n }\n\n protected asCategoryLabels(value: unknown): string[] {\n return categoryLabels(value);\n }\n\n protected isNumber(value: unknown): boolean {\n return typeof value === 'number' && Number.isFinite(value);\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async load(kind: AXMPlatformExplorerCatalogKind, name: string | undefined): Promise<void> {\n if (!name) {\n this.detail.set(null);\n this.loading.set(false);\n this.loadError.set(false);\n return;\n }\n this.loading.set(true);\n this.loadError.set(false);\n this.detail.set(null);\n try {\n const detail = await this.dataService.getCatalogItem(kind, name);\n if (this.item()?.name === name && this.kind() === kind) {\n this.detail.set(detail);\n }\n } catch {\n if (this.item()?.name === name && this.kind() === kind) {\n this.loadError.set(true);\n }\n } finally {\n if (this.item()?.name === name && this.kind() === kind) {\n this.loading.set(false);\n }\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"flex flex-col flex-1 min-h-0\">\n <!-- ----- Loading catalog row ----- -->\n @if (loading()) {\n <div class=\"flex flex-1 items-center justify-center p-6\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- Catalog row fields ----- -->\n @else if (record(); as row) {\n <section class=\"flex flex-col gap-6 p-4 overflow-auto\">\n <dl class=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 m-0\">\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.name' | translate | async }}</dt>\n <dd class=\"m-0\"><code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\">{{ row['name'] }}</code></dd>\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.title' | translate | async }}</dt>\n <dd class=\"m-0\">{{ displayTitle(row) | translate | async }}</dd>\n @if (row['description']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.description' | translate | async }}</dt>\n <dd class=\"m-0\">{{ asText(row['description']) | translate | async }}</dd>\n }\n @if (row['executionMode']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.execution-mode' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['executionMode'] }}</dd>\n }\n @if (row['sourceModule']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.source-module' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['sourceModule'] }}</dd>\n }\n @if (row['type']) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.type' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['type'] }}</dd>\n }\n @if (row['dataType']) {\n <dt class=\"font-semibold text-muted\">\n {{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}\n </dt>\n <dd class=\"m-0\">\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ row['dataType'] }}</span>\n </dd>\n }\n @if (asText(row['icon']); as icon) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.icon' | translate | async }}</dt>\n <dd class=\"m-0 flex items-center gap-2\">\n <i [ngClass]=\"icon\" aria-hidden=\"true\"></i>\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\" dir=\"ltr\">{{ icon }}</code>\n </dd>\n }\n @if (isNumber(row['order'])) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.order' | translate | async }}</dt>\n <dd class=\"m-0\">{{ row['order'] }}</dd>\n }\n @if (row['defaultFilterWidgetName']) {\n <dt class=\"font-semibold text-muted\">\n {{ '@platform-dev-tools:module.terms.default-filter-widget' | translate | async }}\n </dt>\n <dd class=\"m-0\">\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\" dir=\"ltr\">{{ row['defaultFilterWidgetName'] }}</code>\n </dd>\n }\n @if (asStringList(row['groups']); as groups) {\n <!--->\n <!-- ----- Widget group tags ----- -->\n @if (groups.length) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.groups' | translate | async }}</dt>\n <dd class=\"m-0\">\n <div class=\"axp-platform-explorer__catalog-chips\">\n @for (group of groups; track group) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ group }}</span>\n }\n </div>\n </dd>\n }\n }\n @if (asCategoryLabels(row['categories']); as categories) {\n <!--->\n <!-- ----- Catalog categories ----- -->\n @if (categories.length) {\n <dt class=\"font-semibold text-muted\">{{ '@platform-dev-tools:module.terms.categories' | translate | async }}</dt>\n <dd class=\"m-0\">\n <div class=\"axp-platform-explorer__catalog-chips\">\n @for (category of categories; track category) {\n <span class=\"axp-platform-explorer__type-chip\">{{ category | translate | async }}</span>\n }\n </div>\n </dd>\n }\n }\n </dl>\n\n <!--->\n <!-- ----- Input, output, and plugin contribution tables ----- -->\n @if (ioTables(); as io) {\n <div class=\"axp-platform-explorer__catalog-io\">\n <section>\n <h2>{{ '@platform-dev-tools:module.terms.input' | translate | async }}</h2>\n <!--->\n <!-- ----- Empty input list ----- -->\n @if (io.input.length === 0) {\n <p class=\"axp-platform-explorer__docs-empty axp-platform-explorer__catalog-io-empty\">\n {{ '@platform-dev-tools:module.messages.no-input' | translate | async }}\n </p>\n }\n <!-- ----- Input rows ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"schemaTable; context: { rows: io.input }\" />\n }\n </section>\n <!--->\n <!-- ----- Output contract for commands, queries, and widgets ----- -->\n @if (io.showOutput) {\n <section>\n <h2>{{ '@platform-dev-tools:module.terms.output' | translate | async }}</h2>\n <!--->\n <!-- ----- Empty output list ----- -->\n @if (io.output.length === 0) {\n <p class=\"axp-platform-explorer__docs-empty axp-platform-explorer__catalog-io-empty\">\n {{ '@platform-dev-tools:module.messages.no-output' | translate | async }}\n </p>\n }\n <!-- ----- Output rows ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"schemaTable; context: { rows: io.output }\" />\n }\n </section>\n }\n <!--->\n <!-- ----- Plugin host contributions from the catalog definition ----- -->\n @if (io.contributions.length) {\n @for (section of io.contributions; track section.kind) {\n <section>\n <h2>{{ ('@platform-dev-tools:module.contributions.' + section.kind) | translate | async }}</h2>\n <!--->\n <!-- ----- Contributed properties use the schema table ----- -->\n @if (section.kind === 'properties') {\n <ng-container *ngTemplateOutlet=\"schemaTable; context: { rows: section.rows }\" />\n }\n <!-- ----- Columns, actions, groups, pages, related entities ----- -->\n @else {\n <ng-container\n *ngTemplateOutlet=\"itemTable; context: { rows: section.rows, extraKey: section.extraKey }\"\n />\n }\n </section>\n }\n }\n <!-- ----- Plugin declared no host contributions ----- -->\n @else if (!io.showOutput) {\n <p class=\"axp-platform-explorer__docs-empty axp-platform-explorer__catalog-io-empty\">\n {{ '@platform-dev-tools:module.messages.no-contributions' | translate | async }}\n </p>\n }\n <!--->\n <!-- ----- Middleware extension keys ----- -->\n @if (io.extensionKeys.length) {\n <section>\n <h2>{{ '@platform-dev-tools:module.contributions.extension-keys' | translate | async }}</h2>\n <div class=\"axp-platform-explorer__catalog-chips\">\n @for (key of io.extensionKeys; track key) {\n <code class=\"text-xs bg-lighter px-1.5 py-0.5 rounded\" dir=\"ltr\">{{ key }}</code>\n }\n </div>\n </section>\n }\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template #schemaTable let-rows=\"rows\">\n <div class=\"axp-platform-explorer__table-wrap\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead>\n <tr>\n <th>{{ '@platform-dev-tools:module.terms.field' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.property-details.data-type' | translate | async }}</th>\n <th>{{ '@platform-dev-tools:module.terms.required' | translate | async }}</th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.name) {\n <tr>\n <td>\n <ng-container *ngTemplateOutlet=\"nameCell; context: { row: row }\" />\n </td>\n <td>\n <!--->\n <!-- ----- Stored data type chip ----- -->\n @if (row.dataType) {\n <span class=\"axp-platform-explorer__type-chip\" dir=\"ltr\">{{ row.dataType }}</span>\n }\n <!-- ----- Missing data type ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n <td>\n <ng-container *ngTemplateOutlet=\"boolCell; context: { value: row.required }\" />\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n</ng-template>\n\n<ng-template #itemTable let-rows=\"rows\" let-extraKey=\"extraKey\">\n <div class=\"axp-platform-explorer__table-wrap\">\n <table class=\"axp-platform-explorer__table axp-platform-explorer__table--fields\">\n <thead>\n <tr>\n <th>{{ '@platform-dev-tools:module.terms.field' | translate | async }}</th>\n <!--->\n <!-- ----- Extra column for scope or condition ----- -->\n @if (extraKey) {\n <th>{{ ('@platform-dev-tools:module.contributions.' + extraKey) | translate | async }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.name) {\n <tr>\n <td>\n <ng-container *ngTemplateOutlet=\"nameCell; context: { row: row }\" />\n </td>\n <!--->\n <!-- ----- Extra cell when the section declares one ----- -->\n @if (extraKey) {\n <td>\n <!--->\n <!-- ----- Action scope ----- -->\n @if (row.extraKind === 'scope' && row.extra) {\n {{ ('@platform-dev-tools:module.contributions.scopes.' + row.extra) | translate | async }}\n }\n <!-- ----- Condition expression ----- -->\n @else if (row.extra) {\n <code dir=\"ltr\">{{ row.extra }}</code>\n }\n <!-- ----- Missing extra ----- -->\n @else {\n <span class=\"axp-platform-explorer__unknown\">–</span>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n</ng-template>\n\n<ng-template #nameCell let-row=\"row\">\n <code dir=\"ltr\">{{ row.name }}</code>\n <!--->\n <!-- ----- Translated title under the field name ----- -->\n @if (row.title) {\n <div class=\"axp-platform-explorer__field-title\">\n {{ row.title | translate | async }}\n </div>\n }\n <!--->\n <!-- ----- Definition notes and option-sourced names ----- -->\n @if (row.note) {\n <div class=\"axp-platform-explorer__field-note\" dir=\"ltr\">{{ row.note }}</div>\n }\n</ng-template>\n\n<ng-template #boolCell let-value=\"value\">\n <!-- ----- Affirmative flag ----- -->\n @if (value === true) {\n <span class=\"axp-platform-explorer__yes\">\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n {{ '@platform-dev-tools:module.property-details.yes' | translate | async }}\n </span>\n }\n <!-- ----- Negative flag ----- -->\n @else {\n {{ '@platform-dev-tools:module.property-details.no' | translate | async }}\n }\n</ng-template>\n","import {\n arrangeWorkflowDiagram,\n type AXPWorkflowConnector,\n type AXPWorkflowDiagramModel,\n type AXPWorkflowNode,\n type AXPWorkflowPort,\n type AXPWorkflowSemanticColor,\n} from '@acorex-platform/module-platform-management-client';\nimport type {\n AXMPlatformExplorerEntityGraph,\n AXMPlatformExplorerEntityGraphEdge,\n AXMPlatformExplorerEntityGraphNode,\n AXMPlatformExplorerEntityGraphProperty,\n AXMPlatformExplorerRelationKind,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\n//#region ----- Constants -----\n\nexport const EXPLORER_ENTITY_NODE_TYPE = 'explorer-entity';\n\n/** Crow's-foot / UML multiplicity shown on ERD ports (not i18n). */\nexport const ERD_CARDINALITY_ONE = '1..1';\nexport const ERD_CARDINALITY_MANY = '0..*';\n\nconst NODE_W = 280;\nconst NODE_HEAD_H = 52;\n/** Room per connector so relation names on parallel edges do not touch. */\nconst PORT_SLOT_H = 24;\nconst PORT_BAND_PAD = 28;\nconst NODE_GAP_Y = 40;\nconst EXTERNAL_GAP_X = 160;\n/** Grid spacing for entities that have no relations. */\nconst ISOLATED_GAP_X = 48;\nconst ISOLATED_GAP_Y = 88;\nconst INTERNAL_ORIGIN = { x: 48, y: 48 };\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface ExplorerEntityNodeData {\n kind: 'entity';\n fullName: string;\n name: string;\n title?: string;\n module: string;\n moduleTitle: string;\n external: boolean;\n icon: string;\n properties: AXMPlatformExplorerEntityGraphProperty[];\n}\n\nexport type ModuleTitleResolver = (moduleName: string) => string;\n\n//#endregion\n\n//#region ----- Node helpers -----\n\nexport function isExplorerEntityNode(node: AXPWorkflowNode): boolean {\n return node.type === EXPLORER_ENTITY_NODE_TYPE;\n}\n\nexport function explorerEntityData(node: AXPWorkflowNode): ExplorerEntityNodeData | null {\n const data = node.data as ExplorerEntityNodeData | undefined;\n return data?.kind === 'entity' ? data : null;\n}\n\n//#endregion\n\n//#region ----- Build diagram -----\n\nfunction relationName(edge: AXMPlatformExplorerEntityGraphEdge): string {\n const labeled = edge.label?.trim();\n if (labeled) {\n return labeled;\n }\n const dot = edge.to.lastIndexOf('.');\n return dot > 0 ? edge.to.slice(dot + 1) : edge.to;\n}\n\nfunction sourceCardinality(kind: AXMPlatformExplorerRelationKind): string {\n return kind === 'lookup' ? ERD_CARDINALITY_MANY : ERD_CARDINALITY_ONE;\n}\n\nfunction targetCardinality(kind: AXMPlatformExplorerRelationKind): string {\n return kind === 'lookup' ? ERD_CARDINALITY_ONE : ERD_CARDINALITY_MANY;\n}\n\nfunction outboundPortId(edge: AXMPlatformExplorerEntityGraphEdge): string {\n return `${edge.from}:out:${edge.kind}:${edge.to}:${edge.label ?? ''}`;\n}\n\nfunction inboundPortId(edge: AXMPlatformExplorerEntityGraphEdge): string {\n return `${edge.to}:in:${edge.kind}:${edge.from}:${edge.label ?? ''}`;\n}\n\nfunction portRatio(index: number, count: number): number {\n if (count <= 1) {\n return 0.5;\n }\n return (index + 1) / (count + 1);\n}\n\nfunction inboundPorts(incoming: AXMPlatformExplorerEntityGraphEdge[]): AXPWorkflowPort[] {\n return incoming.map((edge, index) => ({\n id: inboundPortId(edge),\n kind: 'inbound' as const,\n side: 'left' as const,\n ratio: portRatio(index, incoming.length),\n label: targetCardinality(edge.kind),\n allowMultiple: false,\n readonly: true,\n }));\n}\n\nfunction outboundPorts(outgoing: AXMPlatformExplorerEntityGraphEdge[]): AXPWorkflowPort[] {\n return outgoing.map((edge, index) => ({\n id: outboundPortId(edge),\n kind: 'outbound' as const,\n side: 'right' as const,\n ratio: portRatio(index, outgoing.length),\n label: sourceCardinality(edge.kind),\n readonly: true,\n }));\n}\n\nfunction lookupFieldKeys(edges: AXMPlatformExplorerEntityGraphEdge[]): Set<string> {\n const keys = new Set<string>();\n for (const edge of edges) {\n if (edge.kind === 'lookup' && edge.label) {\n keys.add(`${edge.from}\\0${edge.label}`);\n }\n }\n return keys;\n}\n\nfunction cardHeight(incoming: number, outgoing: number): number {\n const slots = Math.max(incoming, outgoing);\n return slots <= 1 ? NODE_HEAD_H : Math.max(NODE_HEAD_H, PORT_BAND_PAD + slots * PORT_SLOT_H);\n}\n\nfunction toEntityData(\n item: AXMPlatformExplorerEntityGraphNode,\n moduleTitle: string,\n skipLookupFields: Set<string>,\n): ExplorerEntityNodeData {\n return {\n kind: 'entity',\n fullName: item.fullName,\n name: item.name,\n title: item.title,\n module: item.module,\n moduleTitle,\n external: item.external,\n icon: item.icon || 'fa-light fa-table',\n properties: (item.properties ?? []).filter((property) => !skipLookupFields.has(`${item.fullName}\\0${property.name}`)),\n };\n}\n\nfunction entityNode(\n data: ExplorerEntityNodeData,\n outgoing: AXMPlatformExplorerEntityGraphEdge[],\n incoming: AXMPlatformExplorerEntityGraphEdge[],\n): AXPWorkflowNode {\n const color: AXPWorkflowSemanticColor = data.external ? 'warning' : 'primary';\n return {\n id: data.fullName,\n type: EXPLORER_ENTITY_NODE_TYPE,\n title: data.fullName,\n icon: data.icon,\n shape: 'rectangle',\n position: { x: 0, y: 0 },\n size: { width: NODE_W, height: cardHeight(incoming.length, outgoing.length) },\n inboundPorts: inboundPorts(incoming),\n outboundPorts: outboundPorts(outgoing),\n readonly: true,\n color,\n borderColor: color,\n data: { ...data } as Record<string, unknown>,\n };\n}\n\nfunction connectors(edges: AXMPlatformExplorerEntityGraphEdge[]): AXPWorkflowConnector[] {\n return edges.map((edge) => ({\n id: outboundPortId(edge),\n sourceNodeId: edge.from,\n sourcePortId: outboundPortId(edge),\n targetNodeId: edge.to,\n targetPortId: inboundPortId(edge),\n readonly: true,\n color: (edge.kind === 'related' ? 'success' : 'primary') as AXPWorkflowSemanticColor,\n borderColor: (edge.kind === 'related' ? 'success' : 'primary') as AXPWorkflowSemanticColor,\n label: relationName(edge),\n data: { kind: edge.kind },\n }));\n}\n\nfunction nodesBBox(nodes: AXPWorkflowNode[]): { minX: number; minY: number; maxX: number; maxY: number } {\n if (nodes.length === 0) {\n return { minX: INTERNAL_ORIGIN.x, minY: INTERNAL_ORIGIN.y, maxX: INTERNAL_ORIGIN.x, maxY: INTERNAL_ORIGIN.y };\n }\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const node of nodes) {\n minX = Math.min(minX, node.position.x);\n minY = Math.min(minY, node.position.y);\n maxX = Math.max(maxX, node.position.x + node.size.width);\n maxY = Math.max(maxY, node.position.y + node.size.height);\n }\n return { minX, minY, maxX, maxY };\n}\n\nfunction groupEdgesBy(\n edges: AXMPlatformExplorerEntityGraphEdge[],\n keyOf: (edge: AXMPlatformExplorerEntityGraphEdge) => string,\n): Map<string, AXMPlatformExplorerEntityGraphEdge[]> {\n const map = new Map<string, AXMPlatformExplorerEntityGraphEdge[]>();\n for (const edge of edges) {\n const key = keyOf(edge);\n const list = map.get(key);\n if (list) {\n list.push(edge);\n } else {\n map.set(key, [edge]);\n }\n }\n for (const list of map.values()) {\n list.sort((a, b) => relationName(a).localeCompare(relationName(b)) || a.from.localeCompare(b.from));\n }\n return map;\n}\n\n/**\n * Tiles unrelated entities in rows under the related cluster. A single column\n * would make the canvas very tall, which forces fit-to-content to a tiny zoom.\n */\nfunction tileIsolatedNodes(nodes: AXPWorkflowNode[], startY: number, availableWidth: number): Map<string, AXPWorkflowNode> {\n const placed = new Map<string, AXPWorkflowNode>();\n const columns = Math.max(1, Math.floor((availableWidth + ISOLATED_GAP_X) / (NODE_W + ISOLATED_GAP_X)));\n let rowY = startY;\n let rowHeight = 0;\n nodes.forEach((node, index) => {\n const column = index % columns;\n if (column === 0 && index > 0) {\n rowY += rowHeight + NODE_GAP_Y;\n rowHeight = 0;\n }\n placed.set(node.id, {\n ...node,\n position: { x: INTERNAL_ORIGIN.x + column * (NODE_W + ISOLATED_GAP_X), y: rowY },\n });\n rowHeight = Math.max(rowHeight, node.size.height);\n });\n return placed;\n}\n\n/**\n * Converts the explorer entity graph into a readonly ERD. Related entities are\n * arranged left to right, external targets cluster on the right with a yellow\n * header, and unrelated entities tile in a grid underneath. Cards stay\n * header-sized; the property list is shown/hidden without changing layout.\n */\nexport function buildExplorerEntityDiagram(\n graph: AXMPlatformExplorerEntityGraph | null | undefined,\n resolveModuleTitle: ModuleTitleResolver,\n): AXPWorkflowDiagramModel | null {\n if (!graph?.nodes.length) {\n return null;\n }\n\n const nodeIds = new Set(graph.nodes.map((item) => item.fullName));\n const validEdges = graph.edges.filter((edge) => nodeIds.has(edge.from) && nodeIds.has(edge.to));\n const outgoing = groupEdgesBy(validEdges, (edge) => edge.from);\n const incoming = groupEdgesBy(validEdges, (edge) => edge.to);\n const skipLookupFields = lookupFieldKeys(validEdges);\n const relatedIds = new Set(validEdges.flatMap((edge) => [edge.from, edge.to]));\n\n const entityNodes = graph.nodes.map((item) => {\n const data = toEntityData(item, resolveModuleTitle(item.module), skipLookupFields);\n return entityNode(data, outgoing.get(item.fullName) ?? [], incoming.get(item.fullName) ?? []);\n });\n\n const internalRelatedIds = entityNodes\n .filter((node) => !explorerEntityData(node)?.external && relatedIds.has(node.id))\n .map((node) => node.id);\n const arranged = arrangeWorkflowDiagram(\n {\n nodes: entityNodes,\n connectors: connectors(validEdges),\n },\n {\n nodeIds: internalRelatedIds,\n origin: INTERNAL_ORIGIN,\n direction: 'horizontal',\n horizontalGap: 220,\n verticalGap: 72,\n margin: 48,\n groupDisconnected: true,\n },\n );\n\n const internals = arranged.nodes.filter(\n (node) => !explorerEntityData(node)?.external && relatedIds.has(node.id),\n );\n const box = nodesBBox(internals);\n const externals = arranged.nodes\n .filter((node) => explorerEntityData(node)?.external)\n .sort((a, b) => {\n const moduleCmp = (explorerEntityData(a)?.module ?? '').localeCompare(explorerEntityData(b)?.module ?? '');\n return moduleCmp !== 0 ? moduleCmp : a.title.localeCompare(b.title);\n });\n\n const externalX = box.maxX + EXTERNAL_GAP_X;\n let externalY = INTERNAL_ORIGIN.y;\n const positioned = new Map<string, AXPWorkflowNode>();\n for (const node of externals) {\n positioned.set(node.id, {\n ...node,\n position: { x: externalX, y: externalY },\n });\n externalY += node.size.height + NODE_GAP_Y;\n }\n\n const isolated = arranged.nodes\n .filter((node) => !explorerEntityData(node)?.external && !relatedIds.has(node.id))\n .sort((a, b) => a.id.localeCompare(b.id));\n if (isolated.length) {\n const clusterBottom = Math.max(box.maxY, externalY - NODE_GAP_Y, INTERNAL_ORIGIN.y);\n const clusterWidth = Math.max(NODE_W, (externals.length ? externalX + NODE_W : box.maxX) - INTERNAL_ORIGIN.x);\n const startY = internals.length || externals.length ? clusterBottom + ISOLATED_GAP_Y : INTERNAL_ORIGIN.y;\n for (const [id, node] of tileIsolatedNodes(isolated, startY, clusterWidth)) {\n positioned.set(id, node);\n }\n }\n\n return {\n nodes: arranged.nodes.map((node) => positioned.get(node.id) ?? node),\n connectors: arranged.connectors,\n };\n}\n\nexport function connectedNodeIds(model: AXPWorkflowDiagramModel, nodeId: string): string[] {\n const ids = new Set<string>([nodeId]);\n for (const connector of model.connectors) {\n if (connector.sourceNodeId === nodeId) {\n ids.add(connector.targetNodeId);\n }\n if (connector.targetNodeId === nodeId) {\n ids.add(connector.sourceNodeId);\n }\n }\n return [...ids];\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPWorkflowDesignerComponent,\n type AXPWorkflowDiagramModel,\n type AXPWorkflowNode,\n} from '@acorex-platform/module-platform-management-client';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\nimport {\n buildExplorerEntityDiagram,\n connectedNodeIds,\n explorerEntityData,\n type ExplorerEntityNodeData,\n} from './platform-explorer-entity-graph.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-entities-graph',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'axp-explorer-graph-host flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXTranslationModule, AXLoadingModule, AXPStateMessageComponent, AXPWorkflowDesignerComponent],\n templateUrl: './platform-explorer-entities-graph.component.html',\n styleUrl: './platform-explorer-entities-graph.component.css',\n})\nexport class AXPlatformExplorerEntitiesGraphComponent {\n moduleName = input.required<string>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n //#endregion\n\n //#region ----- Constants -----\n\n /** Readonly diagram: no spare drawing area, so fit-to-content keeps cards readable. */\n protected readonly canvasMinSize = { width: 0, height: 0 };\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly loading = signal(false);\n protected readonly loadError = signal(false);\n protected readonly diagram = signal<AXPWorkflowDiagramModel | null>(null);\n protected readonly highlightedNodeIds = signal<readonly string[]>([]);\n protected readonly expandedNodeIds = signal<ReadonlySet<string>>(new Set());\n\n //#endregion\n\n constructor() {\n effect(() => {\n const moduleName = this.moduleName();\n void this.load(moduleName);\n });\n }\n\n //#region ----- Event Handlers -----\n\n protected entityOf(node: AXPWorkflowNode): ExplorerEntityNodeData | null {\n return explorerEntityData(node);\n }\n\n protected entityLabel(entity: ExplorerEntityNodeData): string {\n return entity.fullName || `${entity.module}.${entity.name}`;\n }\n\n protected isExpanded(id: string): boolean {\n return this.expandedNodeIds().has(id);\n }\n\n protected propertyToggleLabel(expanded: boolean): string {\n return expanded\n ? '@platform-dev-tools:module.graph.hide-properties'\n : '@platform-dev-tools:module.graph.show-properties';\n }\n\n protected onToggleProperties(event: Event, id: string): void {\n event.preventDefault();\n event.stopPropagation();\n const next = new Set(this.expandedNodeIds());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.expandedNodeIds.set(next);\n }\n\n protected onNodeClick(event: { node: AXPWorkflowNode }): void {\n const model = this.diagram();\n if (!model) {\n return;\n }\n this.highlightedNodeIds.set(connectedNodeIds(model, event.node.id));\n }\n\n protected onCanvasClick(): void {\n this.highlightedNodeIds.set([]);\n this.expandedNodeIds.set(new Set());\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async load(moduleName: string): Promise<void> {\n this.loading.set(true);\n this.loadError.set(false);\n this.diagram.set(null);\n this.highlightedNodeIds.set([]);\n this.expandedNodeIds.set(new Set());\n try {\n const catalog = await this.dataService.getModule(moduleName);\n if (this.moduleName() !== moduleName) {\n return;\n }\n const graph = catalog?.entityGraph ?? {\n nodes: (catalog?.entities ?? []).map((item) => ({\n fullName: item.fullName,\n module: item.module,\n name: item.name,\n title: item.title,\n icon: item.icon,\n external: false,\n })),\n edges: [],\n };\n this.diagram.set(buildExplorerEntityDiagram(graph, (name) => this.dataService.moduleTitle(name)));\n } catch {\n if (this.moduleName() === moduleName) {\n this.loadError.set(true);\n }\n } finally {\n if (this.moduleName() === moduleName) {\n this.loading.set(false);\n }\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axp-explorer-graph flex flex-col flex-1 min-h-0\">\n <!-- ----- Loading module entity graph ----- -->\n @if (loading()) {\n <div class=\"flex flex-1 items-center justify-center p-6\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- Module has no entities ----- -->\n @else if (!diagram()) {\n <axp-state-message\n icon=\"fa-light fa-diagram-project\"\n [title]=\"'@platform-dev-tools:module.messages.no-entities'\"\n [description]=\"'@platform-dev-tools:module.messages.no-entities-hint'\"\n />\n }\n <!-- ----- Entity-relationship diagram ----- -->\n @else {\n <div class=\"axp-explorer-graph__canvas\">\n <axp-workflow-designer\n [model]=\"diagram()!\"\n [readonly]=\"true\"\n [showPortLabels]=\"true\"\n [showPorts]=\"false\"\n [connectorStub]=\"56\"\n [canvasPadding]=\"80\"\n [minCanvasSize]=\"canvasMinSize\"\n [highlightedNodeIds]=\"highlightedNodeIds()\"\n [nodeBodyTemplate]=\"nodeBodyTpl\"\n (nodeClick)=\"onNodeClick($event)\"\n (designerClick)=\"onCanvasClick()\"\n />\n </div>\n <div class=\"axp-explorer-graph__footer\">\n <p class=\"axp-explorer-graph__hint\">\n {{ '@platform-dev-tools:module.descriptions.entities' | translate | async }}\n </p>\n <div class=\"axp-explorer-graph__legend\">\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__swatch axp-explorer-graph__swatch--internal\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.local-entity' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__swatch axp-explorer-graph__swatch--external\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.external-entity' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-sep\" aria-hidden=\"true\"></span>\n <span class=\"axp-explorer-graph__legend-item\">\n {{ '@platform-dev-tools:module.graph.pk' | translate | async }}\n =\n {{ '@platform-dev-tools:module.graph.pk-hint' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-sep\" aria-hidden=\"true\"></span>\n <span class=\"axp-explorer-graph__legend-item\">\n {{ '@platform-dev-tools:module.graph.cardinality-one' | translate | async }}\n =\n {{ '@platform-dev-tools:module.graph.cardinality-one-hint' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-item\">\n {{ '@platform-dev-tools:module.graph.cardinality-many' | translate | async }}\n =\n {{ '@platform-dev-tools:module.graph.cardinality-many-hint' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-sep\" aria-hidden=\"true\"></span>\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__line axp-explorer-graph__line--lookup\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.lookup' | translate | async }}\n </span>\n <span class=\"axp-explorer-graph__legend-item\">\n <span class=\"axp-explorer-graph__line axp-explorer-graph__line--related\" aria-hidden=\"true\"></span>\n {{ '@platform-dev-tools:module.graph.related' | translate | async }}\n </span>\n </div>\n </div>\n }\n</div>\n\n<ng-template #nodeBodyTpl let-node=\"node\">\n <!-- ----- Entity table ----- -->\n @if (entityOf(node); as entity) {\n <div\n class=\"axp-explorer-graph__entity\"\n [class.axp-explorer-graph__entity--external]=\"entity.external\"\n [class.axp-explorer-graph__entity--expanded]=\"isExpanded(entity.fullName)\"\n >\n <div class=\"axp-explorer-graph__entity-head\">\n <div class=\"axp-explorer-graph__entity-head-main\">\n <span class=\"axp-explorer-graph__entity-name\">{{ entityLabel(entity) }}</span>\n <!--------------------------------------------------------------->\n <!-- ----- Translated catalog title when it differs from the entity name ----- -->\n @if (entity.title && entity.title !== entity.name && entity.title !== entity.fullName) {\n <span class=\"axp-explorer-graph__entity-title\">{{ entity.title | translate | async }}</span>\n }\n </div>\n <!--------------------------------------------------------------->\n <!-- ----- Expand non-lookup properties under the header ----- -->\n @if (entity.properties.length) {\n <button\n type=\"button\"\n class=\"axp-explorer-graph__entity-toggle\"\n [attr.aria-expanded]=\"isExpanded(entity.fullName)\"\n [attr.aria-label]=\"(propertyToggleLabel(isExpanded(entity.fullName)) | translate | async) ?? ''\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onToggleProperties($event, entity.fullName)\"\n >\n <i\n class=\"fa-light\"\n [class.fa-chevron-down]=\"!isExpanded(entity.fullName)\"\n [class.fa-chevron-up]=\"isExpanded(entity.fullName)\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n <!--------------------------------------------------------------->\n <!-- ----- Same-card property list; visibility is toggled from the header ----- -->\n @if (entity.properties.length) {\n <div class=\"axp-explorer-graph__entity-props\" (pointerdown)=\"$event.stopPropagation()\">\n @for (prop of entity.properties; track prop.name) {\n <div class=\"axp-explorer-graph__entity-prop\">\n <!--------------------------------------------------------------->\n <!-- ----- Primary-key badge when the field is id ----- -->\n @if (prop.kind === 'pk') {\n <span class=\"axp-explorer-graph__entity-prop-kind\">\n {{ '@platform-dev-tools:module.graph.pk' | translate | async }}\n </span>\n }\n <span class=\"axp-explorer-graph__entity-prop-name\">{{ prop.name }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n","//#region ----- Imports -----\n\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type {\n AXMPlatformExplorerEntitySummary,\n AXMPlatformExplorerModuleSummary,\n AXMPlatformExplorerNamedItem,\n} from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerTreeNode } from './platform-explorer-tree.model';\nimport { AXPlatformExplorerModuleDetailComponent } from './detail/platform-explorer-module-detail.component';\nimport { AXPlatformExplorerEntityDetailComponent } from './detail/platform-explorer-entity-detail.component';\nimport { AXPlatformExplorerCatalogDetailComponent } from './detail/platform-explorer-catalog-detail.component';\nimport { AXPlatformExplorerEntitiesGraphComponent } from './detail/platform-explorer-entities-graph.component';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [\n AXTranslationModule,\n AXPlatformExplorerModuleDetailComponent,\n AXPlatformExplorerEntityDetailComponent,\n AXPlatformExplorerCatalogDetailComponent,\n AXPlatformExplorerEntitiesGraphComponent,\n ],\n template: `\n <div class=\"flex flex-col flex-1 min-h-0\">\n @switch (node().kind) {\n @case ('module') {\n <axp-platform-explorer-module-detail [payload]=\"asModule(node().payload)\" />\n }\n @case ('entity') {\n <axp-platform-explorer-entity-detail [payload]=\"asEntity(node().payload)\" />\n }\n @case ('command') {\n <axp-platform-explorer-catalog-detail kind=\"command\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('query') {\n <axp-platform-explorer-catalog-detail kind=\"query\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('plugin') {\n <axp-platform-explorer-catalog-detail kind=\"plugin\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('widget') {\n <axp-platform-explorer-catalog-detail kind=\"widget\" [item]=\"asNamed(node().payload)\" />\n }\n @case ('diagram') {\n <axp-platform-explorer-entities-graph [moduleName]=\"node().moduleName!\" />\n }\n }\n </div>\n `,\n})\nexport class AXPlatformExplorerDetailComponent {\n node = input.required<PlatformExplorerTreeNode>();\n\n protected asModule(payload: unknown): AXMPlatformExplorerModuleSummary | undefined {\n return payload as AXMPlatformExplorerModuleSummary | undefined;\n }\n\n protected asEntity(payload: unknown): AXMPlatformExplorerEntitySummary | undefined {\n return payload as AXMPlatformExplorerEntitySummary | undefined;\n }\n\n protected asNamed(payload: unknown): AXMPlatformExplorerNamedItem | undefined {\n return payload as AXMPlatformExplorerNamedItem | undefined;\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, ParamMap } from '@angular/router';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXResizableDirective } from '@acorex/cdk/resizable';\nimport {\n AXTreeViewComponent,\n AXTreeViewNode,\n AXTreeViewNodeSelectEvent,\n} from '@acorex/components/tree-view';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXSearchBoxModule } from '@acorex/components/search-box';\nimport { AXTabsModule, type AXTabStripChangedEvent } from '@acorex/components/tabs';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPBreadcrumbItem } from '@acorex-platform/framework-shared/core';\nimport type { AXMPlatformExplorerEntitySummary } from '@acorex-platform/module-platform-management-client/contracts';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport {\n AXPPageLayoutBase,\n AXPPageLayoutBaseComponent,\n AXPPageLayoutComponent,\n} from '@acorex-platform/framework-client/layout/views';\nimport {\n AXPStateMessageComponent,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutHeaderComponent,\n AXPThemeLayoutStartSideComponent,\n} from '@acorex-platform/framework-client/layout/components';\n\nimport { PlatformExplorerDataService } from './platform-explorer-data.service';\nimport { PlatformExplorerTreeNode } from './platform-explorer-tree.model';\nimport { AXPlatformExplorerDetailComponent } from './platform-explorer-detail.component';\nimport {\n explorerRevealIds,\n explorerStateFromQuery,\n isExplorerFolderKind,\n queryParamsFromExplorer,\n sameExplorerNode,\n} from './platform-explorer-route.util';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst CATEGORY_SUFFIXES = ['entities', 'commands', 'queries', 'plugins', 'widgets'] as const;\ntype CategoryKind = (typeof CATEGORY_SUFFIXES)[number];\n\nconst MODULE_LIST_MIN_WIDTH = 256;\nconst MODULE_LIST_DEFAULT_WIDTH = 288;\nconst MODULE_LIST_MAX_WIDTH = 560;\nconst MODULE_LIST_WIDTH_KEY = 'axp.platform-explorer.module-list-width';\n\nfunction readStoredModuleListWidth(): number {\n try {\n const parsed = Number(localStorage.getItem(MODULE_LIST_WIDTH_KEY));\n if (\n Number.isFinite(parsed) &&\n parsed >= MODULE_LIST_MIN_WIDTH &&\n parsed <= MODULE_LIST_MAX_WIDTH\n ) {\n return parsed;\n }\n } catch {\n // ignore missing storage\n }\n return MODULE_LIST_DEFAULT_WIDTH;\n}\n\n//#endregion\n\n//#region ----- Tree mapping -----\n\nfunction toTreeViewNode(node: PlatformExplorerTreeNode, childrenCount?: number): AXTreeViewNode {\n const count = childrenCount ?? node.itemCount;\n return {\n id: node.id,\n title: node.label,\n childrenCount: count && count > 0 ? count : undefined,\n data: { treeNode: node },\n };\n}\n\nfunction parseCategoryParent(parentId: string): { moduleName: string; kind: CategoryKind } | null {\n for (const suffix of CATEGORY_SUFFIXES) {\n const token = `-${suffix}`;\n if (parentId.startsWith('module-') && parentId.endsWith(token)) {\n return {\n moduleName: parentId.slice('module-'.length, parentId.length - token.length),\n kind: suffix,\n };\n }\n }\n return null;\n}\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-page',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'axp-platform-explorer' },\n imports: [\n CommonModule,\n AXTranslationModule,\n AXLoadingModule,\n AXSearchBoxModule,\n AXDecoratorModule,\n AXTabsModule,\n AXPPageLayoutComponent,\n AXPThemeLayoutStartSideComponent,\n AXPThemeLayoutHeaderComponent,\n AXPThemeLayoutBlockComponent,\n AXPStateMessageComponent,\n AXTreeViewComponent,\n AXPlatformExplorerDetailComponent,\n AXResizableDirective,\n ],\n providers: [\n PlatformExplorerDataService,\n {\n provide: AXPPageLayoutBase,\n useExisting: AXPlatformExplorerPageComponent,\n },\n ],\n templateUrl: './platform-explorer-page.component.html',\n styleUrl: './platform-explorer-page.component.css',\n})\nexport class AXPlatformExplorerPageComponent extends AXPPageLayoutBaseComponent {\n protected readonly dataService = inject(PlatformExplorerDataService);\n protected readonly deviceService = inject(AXPDeviceService);\n private readonly route = inject(ActivatedRoute);\n\n readonly loading = signal(true);\n readonly loadError = signal(false);\n readonly selectedNode = signal<PlatformExplorerTreeNode | null>(null);\n protected readonly moduleNodes = signal<PlatformExplorerTreeNode[]>([]);\n protected readonly hasCatalogModules = computed(() =>\n this.moduleNodes().some((node) => node.kind === 'module'),\n );\n protected readonly search = signal('');\n protected readonly tree = viewChild<AXTreeViewComponent>('tree');\n protected readonly entityTabs = this.dataService.entityTabs;\n protected readonly activeEntitySection = this.dataService.activeEntitySection;\n protected readonly moduleListMinWidth = MODULE_LIST_MIN_WIDTH;\n protected readonly moduleListDefaultWidth = MODULE_LIST_DEFAULT_WIDTH;\n protected readonly moduleListMaxWidth = MODULE_LIST_MAX_WIDTH;\n protected readonly moduleListWidth = signal(readStoredModuleListWidth());\n\n private catalogReady = false;\n private syncingFromUrl = false;\n\n constructor() {\n super();\n this.route.queryParamMap.pipe(takeUntilDestroyed()).subscribe((params) => {\n void this.onQueryChanged(params);\n });\n void this.boot();\n }\n\n protected datasource = async (parentId?: string): Promise<AXTreeViewNode[]> => {\n if (!parentId) {\n return this.moduleNodes().map((node) => toTreeViewNode(node, node.itemCount));\n }\n const category = parseCategoryParent(parentId);\n if (category) {\n const children = await this.dataService.getCategoryChildren(category.moduleName, category.kind);\n return children.map((node) => toTreeViewNode(node));\n }\n if (parentId.startsWith('module-')) {\n const moduleName = parentId.slice('module-'.length);\n const children = await this.dataService.getModuleChildren(moduleName);\n return children.map((node) => toTreeViewNode(node, node.itemCount));\n }\n return [];\n };\n\n protected async onSearchChanged(event: AXValueChangedEvent<string>): Promise<void> {\n const text = typeof event.value === 'string' ? event.value : '';\n this.search.set(text);\n this.dataService.clearCache();\n await this.initializeModules(text);\n await this.tree()?.reloadData();\n this.writeQuery(this.selectedNode());\n await this.revealSelection();\n }\n\n override async getPageTitle(): Promise<string> {\n const node = this.selectedNode();\n if (!node) {\n return this.translateService.translateAsync('@platform-dev-tools:module.menus.platform-explorer.title');\n }\n const moduleTitleKey = node.moduleTitle ?? node.label;\n const moduleTitle = await this.translateService.translateAsync(moduleTitleKey);\n switch (node.kind) {\n case 'type-group':\n return this.translateService.translateAsync('@platform-dev-tools:module.menus.platform-explorer.title');\n case 'module':\n return moduleTitle;\n case 'entity':\n case 'command':\n case 'query':\n case 'plugin':\n case 'widget':\n return [moduleTitle, node.label].join(' · ');\n default: {\n const folder = await this.translateService.translateAsync(node.label);\n return [moduleTitle, folder].join(' · ');\n }\n }\n }\n\n override getPageDescription(): string | null | Promise<string | null> {\n const node = this.selectedNode();\n if (!node) {\n return this.translateService.translateAsync('@platform-dev-tools:module.description');\n }\n if (node.kind === 'entity') {\n const entity = node.payload as AXMPlatformExplorerEntitySummary | undefined;\n return entity?.fullName ?? null;\n }\n const key = this.descriptionKeyForKind(node.kind);\n return key ? this.translateService.translateAsync(key) : null;\n }\n\n override getPageBreadcrumbs(): AXPBreadcrumbItem[] | Promise<AXPBreadcrumbItem[]> {\n const node = this.selectedNode();\n const items: AXPBreadcrumbItem[] = [\n { title: '@platform-dev-tools:module.menus.platform-explorer.title' },\n ];\n if (node?.moduleTitle) {\n items.push({ title: node.moduleTitle });\n }\n return items;\n }\n\n protected onModuleListResized(event: AXValueChangedEvent<number>): void {\n if (!event.isUserInteraction || event.value == null) {\n return;\n }\n const width = Math.min(MODULE_LIST_MAX_WIDTH, Math.max(MODULE_LIST_MIN_WIDTH, event.value));\n this.moduleListWidth.set(width);\n try {\n localStorage.setItem(MODULE_LIST_WIDTH_KEY, String(width));\n } catch {\n // ignore quota / private mode\n }\n }\n\n protected async onNodeClick(event: AXTreeViewNodeSelectEvent): Promise<void> {\n const data = event.node?.['data'] as { treeNode?: PlatformExplorerTreeNode } | undefined;\n const treeNode = data?.treeNode;\n if (!treeNode || treeNode.kind === 'type-group') {\n return;\n }\n if (isExplorerFolderKind(treeNode.kind)) {\n const tree = this.tree();\n if (tree) {\n await tree.toggleNodeExpansion(treeNode.id);\n const current = this.selectedNode();\n if (current) {\n tree.selectNode(current.id);\n } else {\n tree.deselectNode(treeNode.id);\n }\n }\n return;\n }\n this.selectPageNode(treeNode);\n }\n\n protected onEntityTabChanged(event: AXTabStripChangedEvent): void {\n const key = event.tab?.key || this.entityTabs()[event.index]?.id;\n if (!key || key === this.dataService.activeEntitySection()) {\n return;\n }\n this.dataService.selectEntitySection(key);\n }\n\n private descriptionKeyForKind(kind: PlatformExplorerTreeNode['kind']): string | null {\n switch (kind) {\n case 'module':\n return '@platform-dev-tools:module.descriptions.module';\n case 'diagram':\n return '@platform-dev-tools:module.descriptions.diagram';\n case 'commands':\n case 'command':\n return '@platform-dev-tools:module.descriptions.command';\n case 'queries':\n case 'query':\n return '@platform-dev-tools:module.descriptions.query';\n case 'plugins':\n case 'plugin':\n return '@platform-dev-tools:module.descriptions.plugin';\n case 'widgets':\n case 'widget':\n return '@platform-dev-tools:module.descriptions.widget';\n default:\n return null;\n }\n }\n\n private async onQueryChanged(params: ParamMap): Promise<void> {\n const state = explorerStateFromQuery(params);\n const nextSearch = state.search ?? '';\n const searchChanged = nextSearch !== this.search();\n if (searchChanged) {\n this.search.set(nextSearch);\n }\n if (!this.catalogReady) {\n return;\n }\n if (searchChanged) {\n this.dataService.clearCache();\n await this.initializeModules(nextSearch);\n await this.tree()?.reloadData();\n }\n await this.applyRouteState(state);\n }\n\n private async boot(): Promise<void> {\n const state = explorerStateFromQuery(this.route.snapshot.queryParamMap);\n if (state.search) {\n this.search.set(state.search);\n }\n await this.initializeModules(this.search());\n this.catalogReady = true;\n await this.applyRouteState(state);\n }\n\n private selectPageNode(treeNode: PlatformExplorerTreeNode): void {\n this.dataService.clearEntityTabs();\n this.selectedNode.set(treeNode);\n this.recompute();\n this.writeQuery(treeNode);\n }\n\n private writeQuery(node: PlatformExplorerTreeNode | null): void {\n if (this.syncingFromUrl) {\n return;\n }\n void this.router.navigate([], {\n relativeTo: this.route,\n queryParams: queryParamsFromExplorer(node, this.search()),\n replaceUrl: true,\n });\n }\n\n private async applyRouteState(state: ReturnType<typeof explorerStateFromQuery>): Promise<void> {\n this.syncingFromUrl = true;\n try {\n const node = await this.dataService.resolveExplorerSelection(state, this.moduleNodes());\n if (sameExplorerNode(this.selectedNode(), node)) {\n await this.revealSelection();\n return;\n }\n this.dataService.clearEntityTabs();\n this.selectedNode.set(node);\n this.recompute();\n await this.revealSelection();\n } finally {\n this.syncingFromUrl = false;\n }\n }\n\n private async revealSelection(): Promise<void> {\n const node = this.selectedNode();\n if (!node) {\n return;\n }\n const tree = await this.waitForTree();\n if (!tree) {\n return;\n }\n const ids = explorerRevealIds(node);\n for (const id of ids.slice(0, -1)) {\n try {\n await tree.expandNode(id);\n } catch {\n // node may not be in the filtered tree\n }\n }\n try {\n tree.selectNode(node.id);\n } catch {\n // ignore missing tree node\n }\n }\n\n private async waitForTree(): Promise<AXTreeViewComponent | undefined> {\n for (let attempt = 0; attempt < 12; attempt++) {\n const tree = this.tree();\n if (tree) {\n return tree;\n }\n await new Promise((resolve) => setTimeout(resolve, 16));\n }\n return this.tree();\n }\n\n private async initializeModules(search?: string): Promise<void> {\n this.loading.set(true);\n this.loadError.set(false);\n try {\n const modules = await this.dataService.listModules(search);\n this.moduleNodes.set(this.dataService.toModuleTreeNodes(modules));\n } catch {\n this.loadError.set(true);\n this.moduleNodes.set([]);\n } finally {\n this.loading.set(false);\n }\n }\n}\n\n//#endregion\n","<axp-page-layout>\n <axp-layout-start-side\n class=\"axp-platform-explorer__start-side\"\n [axResizable]=\"!deviceService.isSmall()\"\n [minWidth]=\"moduleListMinWidth\"\n [maxWidth]=\"moduleListMaxWidth\"\n [width]=\"moduleListWidth()\"\n [defaultWidth]=\"moduleListDefaultWidth\"\n [dblClickAction]=\"'reset'\"\n (onResizingEnded)=\"onModuleListResized($event)\"\n (onResizingDblClick)=\"onModuleListResized($event)\"\n >\n <axp-layout-header>\n <axp-layout-title>\n {{ '@platform-dev-tools:module.menus.platform-explorer.title' | translate | async }}\n </axp-layout-title>\n </axp-layout-header>\n <axp-layout-content class=\"axp-platform-explorer__tree-wrap\">\n <ax-search-box\n class=\"axp-platform-explorer__search\"\n look=\"fill\"\n [delayTime]=\"300\"\n [value]=\"search()\"\n [placeholder]=\"('@platform-dev-tools:module.messages.search-modules' | translate | async) ?? ''\"\n (onValueChanged)=\"onSearchChanged($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n <!-- ----- Loading catalog modules ----- -->\n @if (loading()) {\n <div class=\"axp-platform-explorer__loading\">\n <ax-loading></ax-loading>\n </div>\n }\n <!-- ----- Catalog query failed ----- -->\n @else if (loadError()) {\n <axp-state-message\n icon=\"fa-light fa-triangle-exclamation\"\n [title]=\"'@platform-dev-tools:module.messages.load-error-title'\"\n [description]=\"'@platform-dev-tools:module.messages.load-error'\"\n />\n }\n <!-- ----- No modules in catalog ----- -->\n @else if (!hasCatalogModules()) {\n <axp-state-message\n icon=\"fa-light fa-cubes\"\n [title]=\"'@platform-dev-tools:module.messages.no-modules'\"\n [description]=\"'@platform-dev-tools:module.messages.no-modules-hint'\"\n />\n }\n <!-- ----- Module tree ----- -->\n @else {\n <ax-tree-view\n #tree\n [datasource]=\"datasource\"\n [selectMode]=\"'single'\"\n [showIcons]=\"false\"\n [showChildrenBadge]=\"false\"\n [dragBehavior]=\"'none'\"\n look=\"default\"\n [nodeTemplate]=\"nodeTemplate\"\n (onNodeClick)=\"onNodeClick($event)\"\n />\n }\n </axp-layout-content>\n </axp-layout-start-side>\n\n <!-- ----- Entity layout tabs stay in the sticky page header ----- -->\n @if (entityTabs().length) {\n <axp-page-toolbar class=\"axp-platform-explorer__entity-toolbar\">\n <ax-tabs\n class=\"axp-platform-explorer__entity-tabs\"\n [look]=\"'with-line'\"\n [location]=\"'bottom'\"\n [fitParent]=\"false\"\n (onActiveTabChanged)=\"onEntityTabChanged($event)\"\n >\n @for (tab of entityTabs(); track tab.id) {\n <ax-tab-item\n [key]=\"tab.id\"\n [text]=\"\n ((tab.textKey | translate | async) ?? '') +\n (tab.extraText ? ' · ' + ((tab.extraText | translate | async) ?? '') : '')\n \"\n [active]=\"activeEntitySection() === tab.id\"\n />\n }\n </ax-tabs>\n </axp-page-toolbar>\n }\n\n <axp-page-content class=\"axp-platform-explorer__page-content min-h-0 pt-0\">\n <!-- ----- Selected catalog node ----- -->\n @if (selectedNode(); as node) {\n <axp-platform-explorer-detail [node]=\"node\" />\n }\n <!-- ----- Empty selection ----- -->\n @else {\n <axp-state-message\n icon=\"fa-light fa-sitemap\"\n [title]=\"'@platform-dev-tools:module.messages.select-node'\"\n [description]=\"'@platform-dev-tools:module.messages.select-node-hint'\"\n />\n }\n </axp-page-content>\n</axp-page-layout>\n\n<ng-template #nodeTemplate let-node=\"node\">\n @let data = node['data'];\n @let treeNode = data?.treeNode;\n @let kind = treeNode?.kind;\n @let count = node['childrenCount'] ?? treeNode?.itemCount;\n <!-- ----- Manifest type group header ----- -->\n @if (kind === 'type-group') {\n <span\n class=\"axp-platform-explorer__node axp-platform-explorer__node--group\"\n [class.axp-platform-explorer__node--group-divided]=\"treeNode?.divided\"\n >\n <!--->\n <!-- ----- Divider after the previous type group ----- -->\n @if (treeNode?.divided) {\n <span class=\"axp-platform-explorer__group-rule\" aria-hidden=\"true\"></span>\n }\n <span class=\"axp-platform-explorer__group-title\">{{ node['title'] | translate | async }}</span>\n </span>\n }\n <!-- ----- Catalog node ----- -->\n @else {\n <span class=\"axp-platform-explorer__node\">\n @switch (kind) {\n @case ('module') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--module\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-cube'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('entities') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--entities fa-light fa-table\" aria-hidden=\"true\"></i>\n }\n @case ('diagram') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--diagram fa-light fa-diagram-project\" aria-hidden=\"true\"></i>\n }\n @case ('entity') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--entity\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-table'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('commands') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--commands fa-light fa-terminal\" aria-hidden=\"true\"></i>\n }\n @case ('command') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--command\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-play'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('queries') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--queries fa-light fa-database\" aria-hidden=\"true\"></i>\n }\n @case ('query') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--query\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-magnifying-glass'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('plugins') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--plugins fa-light fa-puzzle-piece\" aria-hidden=\"true\"></i>\n }\n @case ('plugin') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--plugin\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-plug'\"\n aria-hidden=\"true\"\n ></i>\n }\n @case ('widgets') {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--widgets fa-light fa-cubes\" aria-hidden=\"true\"></i>\n }\n @case ('widget') {\n <i\n class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--widget\"\n [ngClass]=\"treeNode?.icon || 'fa-light fa-cube'\"\n aria-hidden=\"true\"\n ></i>\n }\n @default {\n <i class=\"axp-platform-explorer__node-icon axp-platform-explorer__node-icon--default fa-light fa-circle-dot\" aria-hidden=\"true\"></i>\n }\n }\n <span class=\"axp-platform-explorer__node-label\">{{ node['title'] | translate | async }}</span>\n <!--->\n <!-- ----- Child count badge when the folder has items ----- -->\n @if (count != null && count > 0) {\n <span class=\"axp-platform-explorer__node-badge\">{{ count }}</span>\n }\n </span>\n }\n</ng-template>\n","//#region ----- Imports -----\n\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXDataSource, AXDataSourceQuery } from '@acorex/cdk/common';\nimport { AXDataTableModule } from '@acorex/components/data-table';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type { AXMPlatformExplorerNamedItem } from '@acorex-platform/module-platform-management-client/contracts';\n\nimport { PlatformExplorerDataService } from '../platform-explorer-data.service';\nimport type { PlatformExplorerNodeKind } from '../platform-explorer-tree.model';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-platform-explorer-list-detail',\n standalone: true,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'flex flex-col flex-1 min-h-0' },\n imports: [CommonModule, AXDataTableModule, AXTranslationModule],\n template: `\n <div class=\"flex flex-1 min-h-0 p-3 overflow-auto\">\n <ax-data-table\n class=\"flex-1 border border-lightest rounded-md overflow-hidden\"\n [paging]=\"true\"\n [dataSource]=\"dataSource\"\n >\n <ax-text-column [dataField]=\"'name'\" [caption]=\"'@platform-dev-tools:module.terms.name' | translate | async\" [width]=\"'280px'\" [allowResizing]=\"true\"></ax-text-column>\n <ax-text-column [dataField]=\"'title'\" [caption]=\"'@platform-dev-tools:module.terms.title' | translate | async\" [cellTemplate]=\"titleTpl\" [width]=\"'280px'\" [allowResizing]=\"true\"></ax-text-column>\n <ax-text-column [dataField]=\"'description'\" [caption]=\"'@platform-dev-tools:module.terms.description' | translate | async\" [cellTemplate]=\"descTpl\" [allowResizing]=\"true\"></ax-text-column>\n </ax-data-table>\n </div>\n <ng-template #titleTpl let-item>\n @if (item.data?.title) {\n {{ item.data.title | translate | async }}\n }\n @else {\n –\n }\n </ng-template>\n <ng-template #descTpl let-item>\n @if (item.data?.description) {\n {{ item.data.description | translate | async }}\n }\n @else {\n –\n }\n </ng-template>\n `,\n})\nexport class AXPlatformExplorerListDetailComponent {\n moduleName = input.required<string>();\n kind = input.required<PlatformExplorerNodeKind>();\n\n private readonly dataService = inject(PlatformExplorerDataService);\n\n readonly dataSource = new AXDataSource<AXMPlatformExplorerNamedItem>({\n key: 'name',\n pageSize: 20,\n load: async (e: AXDataSourceQuery) => {\n const rows = await this.loadRows();\n const skip = e?.skip ?? 0;\n const take = e?.take ?? 20;\n return { items: rows.slice(skip, skip + take), total: rows.length };\n },\n });\n\n constructor() {\n effect(() => {\n this.moduleName();\n this.kind();\n this.dataSource.refresh();\n });\n }\n\n private async loadRows(): Promise<AXMPlatformExplorerNamedItem[]> {\n const catalog = await this.dataService.getModule(this.moduleName());\n if (!catalog) {\n return [];\n }\n switch (this.kind()) {\n case 'entities':\n return catalog.entities.map((item) => ({\n name: item.name,\n title: item.title ?? item.name,\n module: item.module,\n }));\n case 'commands':\n return catalog.commands;\n case 'queries':\n return catalog.queries;\n case 'plugins':\n return catalog.plugins;\n case 'widgets':\n return catalog.widgets;\n default:\n return [];\n }\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { provideLazyProvider } from '@acorex-platform/framework-client/core';\nimport { AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';\nimport { AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';\nimport { AXPRootLayoutComponent } from '@acorex-platform/framework-client/themes/default';\nimport { NgModule } from '@angular/core';\nimport { ROUTES, Routes } from '@angular/router';\nimport { AXMPlatformDevToolsMenuProvider } from './menu.provider';\nimport { AXMPermissionDefinitionProvider } from './permission-definition.provider';\nimport { AXPPlatformDevToolsSettingProvider } from './settings.provider';\nimport { AXPlatformExplorerPageComponent } from './features/platform-explorer';\n\n//#endregion\n\n//#region ---- Routes ----\n\nfunction routesFactory(): Routes {\n return [\n {\n path: ':app/dev/platform-explorer',\n canActivate: [AXPAuthGuard],\n data: { rootLayout: true },\n loadComponent: () => AXPRootLayoutComponent,\n children: [\n {\n path: '',\n loadComponent: () => AXPlatformExplorerPageComponent,\n data: { reuse: true },\n },\n ],\n },\n ];\n}\n\n//#endregion\n\n//#region ---- Module ----\n\n@NgModule({\n imports: [],\n exports: [],\n declarations: [],\n providers: [\n {\n provide: AXP_PERMISSION_DEFINITION_PROVIDER,\n useClass: AXMPermissionDefinitionProvider,\n multi: true,\n },\n provideLazyProvider(AXP_MENU_PROVIDER, () =>\n import('./menu.provider').then(m => m.AXMPlatformDevToolsMenuProvider),\n ),\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXPPlatformDevToolsSettingProvider,\n multi: true,\n },\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFactory,\n },\n ],\n})\nexport class AXMPlatformDevToolsModule { }\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i3","i6","i1","i5"],"mappings":"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"}