@qodalis/angular-cli
Version:
Angular wrapper for the @qodalis CLI terminal engine.
1 lines • 129 kB
Source Map (JSON)
{"version":3,"file":"qodalis-angular-cli.mjs","sources":["../../../packages/angular-cli/src/lib/cli/tokens/index.ts","../../../packages/angular-cli/src/lib/cli/cli.component.ts","../../../packages/angular-cli/src/lib/collapsable-content/collapsable-content.component.ts","../../../packages/angular-cli/src/lib/collapsable-content/collapsable-content.component.html","../../../packages/angular-cli/src/lib/cli-panel/cli-panel-status.service.ts","../../../packages/angular-cli/src/lib/cli-panel/cli-panel.component.ts","../../../packages/angular-cli/src/lib/cli-panel/cli-panel.component.html","../../../packages/angular-cli/src/lib/cli/services/cli-default-ping-server.service.ts","../../../packages/angular-cli/src/lib/index.ts","../../../packages/angular-cli/src/lib/cli.module.ts","../../../packages/angular-cli/src/lib/utils/dependency-injection.ts","../../../packages/angular-cli/src/lib/utils/index.ts","../../../packages/angular-cli/src/public-api.ts","../../../packages/angular-cli/src/qodalis-angular-cli.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport {\n ICliCommandProcessor,\n ICliModule,\n ICliPingServerService,\n ICliUserSessionService,\n ICliUsersStoreService,\n} from '@qodalis/cli-core';\n\nexport const CliCommandProcessor_TOKEN = new InjectionToken<\n ICliCommandProcessor[]\n>('cli-processors');\n\nexport const ICliUserSessionService_TOKEN =\n new InjectionToken<ICliUserSessionService>('cli-user-session-service');\n\nexport const ICliUsersStoreService_TOKEN = new InjectionToken<\n ICliUsersStoreService[]\n>('cli-users-store-service');\n\nexport const ICliPingServerService_TOKEN = new InjectionToken<\n ICliPingServerService[]\n>('cli-ping-server-service');\n\nexport const CliModule_TOKEN = new InjectionToken<ICliModule[]>('cli-modules');\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n Optional,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n CliEngineSnapshot,\n ICliCommandProcessor,\n ICliModule,\n ICliPingServerService,\n} from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions } from '@qodalis/cli';\nimport {\n CliCommandProcessor_TOKEN,\n CliModule_TOKEN,\n ICliPingServerService_TOKEN,\n} from './tokens';\n\n@Component({\n standalone: false,\n selector: 'cli',\n template: `<div\n #terminal\n [style.height]=\"height || '100%'\"\n style=\"width: 100%;\"\n ></div>`,\n styles: [],\n encapsulation: ViewEncapsulation.None,\n})\nexport class CliComponent implements AfterViewInit, OnDestroy {\n @Input() options?: CliEngineOptions;\n @Input() processors?: ICliCommandProcessor[];\n @Input() modules?: ICliModule[];\n @Input() height?: string;\n @Input() snapshot?: CliEngineSnapshot;\n\n @Output() engineReady = new EventEmitter<CliEngine>();\n\n @ViewChild('terminal', { static: true }) terminalDiv!: ElementRef;\n\n private engine?: CliEngine;\n\n constructor(\n @Optional()\n @Inject(CliCommandProcessor_TOKEN)\n private readonly diProcessors: ICliCommandProcessor[],\n @Optional()\n @Inject(CliModule_TOKEN)\n private readonly diModules: ICliModule[],\n @Optional()\n @Inject(ICliPingServerService_TOKEN)\n private readonly pingServerService: ICliPingServerService,\n ) {}\n\n ngAfterViewInit(): void {\n const engineOptions: CliEngineOptions = {\n ...(this.options ?? {}),\n ...(this.snapshot ? { snapshot: this.snapshot } : {}),\n };\n\n this.engine = new CliEngine(\n this.terminalDiv.nativeElement,\n engineOptions,\n );\n\n // Identify the serving framework\n this.engine.registerService('cli-framework', 'Angular');\n\n // Bridge Angular DI services into the engine's service container\n if (this.pingServerService) {\n this.engine.registerService(\n 'cli-ping-server-service',\n this.pingServerService,\n );\n }\n\n // Register processors provided via Angular DI (from resolveCommandProcessorProvider).\n // Exclude processors that already belong to a module — those will be\n // initialized as part of the module boot (which registers services first).\n if (this.diProcessors && this.diProcessors.length > 0) {\n const moduleProcessors = new Set(\n (this.diModules ?? []).flatMap(m => m.processors ?? []),\n );\n const standalone = this.diProcessors.filter(p => !moduleProcessors.has(p));\n if (standalone.length > 0) {\n this.engine.registerProcessors(standalone);\n }\n }\n\n // Register processors provided via @Input\n if (this.processors && this.processors.length > 0) {\n this.engine.registerProcessors(this.processors);\n }\n\n // Register modules provided via Angular DI\n if (this.diModules && this.diModules.length > 0) {\n this.engine.registerModules(this.diModules);\n }\n\n // Register modules provided via @Input\n if (this.modules && this.modules.length > 0) {\n this.engine.registerModules(this.modules);\n }\n\n this.engine.start().then(() => {\n this.engineReady.emit(this.engine!);\n });\n }\n\n ngOnDestroy(): void {\n this.engine?.destroy();\n }\n\n public focus(): void {\n this.engine?.focus();\n }\n\n public getEngine(): CliEngine | undefined {\n return this.engine;\n }\n}\n","import {\n Component,\n EventEmitter,\n Input,\n Output,\n HostListener,\n} from '@angular/core';\nimport { CliPanelPosition, CliPanelHideAlignment, CliNotification } from '@qodalis/cli-core';\nimport { ServiceDetail, ServerDetail } from '../cli-panel/cli-panel-status.service';\n\nconst HEADER_HEIGHT = 60;\n\n@Component({\n standalone: false,\n selector: 'collapsable-content',\n templateUrl: './collapsable-content.component.html',\n styleUrls: ['./collapsable-content.component.sass'],\n})\nexport class CollapsableContentComponent {\n previousPanelHeight = 600;\n panelHeight = 600;\n panelWidth = 400;\n previousPanelWidth = 400;\n\n isResizing = false;\n startY = 0;\n startX = 0;\n startHeight = 0;\n startWidth = 0;\n\n @Input() visible: boolean = true;\n @Input() isCollapsed: boolean = true;\n @Input() isMaximized: boolean = false;\n @Input() position: CliPanelPosition = 'bottom';\n @Input() closable: boolean = true;\n @Input() resizable: boolean = true;\n @Input() hideable: boolean = true;\n @Input() hideAlignment: CliPanelHideAlignment = 'center';\n @Input() themeStyles: Record<string, string> = {};\n\n @Output()\n public onToggle = new EventEmitter<boolean>();\n\n @Output()\n public onContentSizeChange = new EventEmitter<number>();\n\n @Output()\n public onClose = new EventEmitter<void>();\n\n @Output()\n public onHide = new EventEmitter<void>();\n\n @Output()\n public onPositionChange = new EventEmitter<CliPanelPosition>();\n\n @Input() isHidden = false;\n\n // Status bar inputs\n @Input() statusExecutionState: 'idle' | 'running' = 'idle';\n @Input() statusLastCommand: { name: string; success: boolean } | null = null;\n @Input() statusServiceCount: { running: number; total: number } = { running: 0, total: 0 };\n @Input() statusServiceDetails: ServiceDetail[] = [];\n @Input() statusServerState: 'connected' | 'disconnected' | 'none' = 'none';\n @Input() statusServerDetails: ServerDetail[] = [];\n @Input() statusUptime = 0;\n @Input() notification: CliNotification | null = null;\n\n positionDropdownOpen = false;\n dropdownStyle: Record<string, string> = {};\n private preHideCollapsed = true;\n\n get isHorizontal(): boolean {\n return this.position === 'left' || this.position === 'right';\n }\n\n get showStatusIndicators(): boolean {\n return this.position === 'bottom' || this.position === 'top';\n }\n\n get connectedServerCount(): number {\n return this.statusServerDetails.filter(s => s.connected).length;\n }\n\n get totalServerCount(): number {\n return this.statusServerDetails.length;\n }\n\n servicesDropdownOpen = false;\n servicesDropdownStyle: Record<string, string> = {};\n serversDropdownOpen = false;\n serversDropdownStyle: Record<string, string> = {};\n\n toggleServicesDropdown(event: MouseEvent): void {\n event.stopPropagation();\n this.servicesDropdownOpen = !this.servicesDropdownOpen;\n if (this.servicesDropdownOpen) {\n const el = event.currentTarget as HTMLElement;\n const rect = el.getBoundingClientRect();\n switch (this.position) {\n case 'bottom':\n this.servicesDropdownStyle = {\n bottom: (window.innerHeight - rect.top + 4) + 'px',\n left: rect.left + 'px',\n };\n break;\n case 'top':\n this.servicesDropdownStyle = {\n top: (rect.bottom + 4) + 'px',\n left: rect.left + 'px',\n };\n break;\n case 'left':\n this.servicesDropdownStyle = {\n top: rect.top + 'px',\n left: (rect.right + 4) + 'px',\n };\n break;\n case 'right':\n this.servicesDropdownStyle = {\n top: rect.top + 'px',\n right: (window.innerWidth - rect.left + 4) + 'px',\n };\n break;\n default:\n this.servicesDropdownStyle = {\n bottom: (window.innerHeight - rect.top + 4) + 'px',\n left: rect.left + 'px',\n };\n }\n }\n }\n\n toggleServersDropdown(event: MouseEvent): void {\n event.stopPropagation();\n this.serversDropdownOpen = !this.serversDropdownOpen;\n if (this.serversDropdownOpen) {\n const el = event.currentTarget as HTMLElement;\n const rect = el.getBoundingClientRect();\n switch (this.position) {\n case 'bottom':\n this.serversDropdownStyle = {\n bottom: (window.innerHeight - rect.top + 4) + 'px',\n left: rect.left + 'px',\n };\n break;\n case 'top':\n this.serversDropdownStyle = {\n top: (rect.bottom + 4) + 'px',\n left: rect.left + 'px',\n };\n break;\n case 'left':\n this.serversDropdownStyle = {\n top: rect.top + 'px',\n left: (rect.right + 4) + 'px',\n };\n break;\n case 'right':\n this.serversDropdownStyle = {\n top: rect.top + 'px',\n right: (window.innerWidth - rect.left + 4) + 'px',\n };\n break;\n default:\n this.serversDropdownStyle = {\n bottom: (window.innerHeight - rect.top + 4) + 'px',\n left: rect.left + 'px',\n };\n }\n }\n }\n\n get formattedUptime(): string {\n const mins = Math.floor(this.statusUptime / 60000);\n if (mins < 60) return `${mins}m`;\n const hrs = Math.floor(mins / 60);\n return `${hrs}h${mins % 60}m`;\n }\n\n get wrapperStyle(): Record<string, string> {\n const size: Record<string, string> = this.isHorizontal\n ? { width: this.panelWidth + 'px' }\n : { height: this.panelHeight + 'px' };\n return { ...size, ...this.themeStyles };\n }\n\n toggleTerminal(): void {\n this.isCollapsed = !this.isCollapsed;\n\n this.onToggle.emit(this.isCollapsed);\n }\n\n closeTerminal(): void {\n this.visible = false;\n this.onClose.emit();\n }\n\n hideTerminal(): void {\n this.preHideCollapsed = this.isCollapsed;\n this.isHidden = true;\n this.onHide.emit();\n }\n\n unhideTerminal(): void {\n this.isHidden = false;\n this.isCollapsed = this.preHideCollapsed;\n this.onToggle.emit(this.isCollapsed);\n }\n\n togglePositionDropdown(event: MouseEvent): void {\n event.stopPropagation();\n this.positionDropdownOpen = !this.positionDropdownOpen;\n if (this.positionDropdownOpen) {\n const btn = event.currentTarget as HTMLElement;\n const rect = btn.getBoundingClientRect();\n switch (this.position) {\n case 'bottom':\n this.dropdownStyle = {\n bottom: (window.innerHeight - rect.top + 4) + 'px',\n right: (window.innerWidth - rect.right) + 'px',\n };\n break;\n case 'top':\n this.dropdownStyle = {\n top: (rect.bottom + 4) + 'px',\n right: (window.innerWidth - rect.right) + 'px',\n };\n break;\n case 'left':\n this.dropdownStyle = {\n top: rect.top + 'px',\n left: (rect.right + 4) + 'px',\n };\n break;\n case 'right':\n this.dropdownStyle = {\n top: rect.top + 'px',\n right: (window.innerWidth - rect.left + 4) + 'px',\n };\n break;\n }\n }\n }\n\n selectPosition(pos: CliPanelPosition): void {\n this.positionDropdownOpen = false;\n this.onPositionChange.emit(pos);\n }\n\n @HostListener('document:click')\n closeDropdowns(): void {\n this.positionDropdownOpen = false;\n this.servicesDropdownOpen = false;\n this.serversDropdownOpen = false;\n }\n\n toggleMaximizationTerminal(): void {\n if (this.isHorizontal) {\n if (!this.isMaximized) {\n this.previousPanelWidth = this.panelWidth;\n this.panelWidth = window.innerWidth;\n } else {\n this.panelWidth = this.previousPanelWidth;\n }\n } else {\n if (!this.isMaximized) {\n this.previousPanelHeight = this.panelHeight;\n this.panelHeight = window.innerHeight;\n } else {\n this.panelHeight = this.previousPanelHeight;\n }\n }\n\n this.isMaximized = !this.isMaximized;\n this.updateTerminalSize();\n }\n\n onResizeStart(event: MouseEvent) {\n if (!this.resizable) return;\n\n this.isResizing = true;\n if (this.isCollapsed) {\n this.toggleTerminal();\n }\n\n if (this.isHorizontal) {\n this.startX = event.clientX;\n this.startWidth = this.panelWidth;\n } else {\n this.startY = event.clientY;\n this.startHeight = this.panelHeight;\n }\n event.preventDefault();\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent) {\n if (!this.isResizing) return;\n\n if (this.isHorizontal) {\n const deltaX = this.position === 'left'\n ? event.clientX - this.startX\n : this.startX - event.clientX;\n let nextWidth = Math.max(100, this.startWidth + deltaX);\n\n if (nextWidth > window.innerWidth) {\n nextWidth = window.innerWidth;\n }\n\n this.panelWidth = nextWidth;\n } else {\n const deltaY = this.position === 'top'\n ? event.clientY - this.startY\n : this.startY - event.clientY;\n let nextHeight = Math.max(100, this.startHeight + deltaY);\n\n if (nextHeight > window.innerHeight) {\n nextHeight = window.innerHeight;\n }\n\n this.panelHeight = nextHeight;\n }\n this.updateTerminalSize();\n }\n\n @HostListener('document:mouseup')\n onMouseUp() {\n this.isResizing = false;\n }\n\n /** Set collapsed state directly (called by parent CliPanelComponent). */\n setCollapsed(value: boolean): void {\n this.isCollapsed = value;\n this.onToggle.emit(value);\n }\n\n /** Set maximized state directly (called by parent CliPanelComponent). */\n setMaximized(value: boolean): void {\n if (value && !this.isMaximized) {\n if (this.isHorizontal) {\n this.previousPanelWidth = this.panelWidth;\n this.panelWidth = window.innerWidth;\n } else {\n this.previousPanelHeight = this.panelHeight;\n this.panelHeight = window.innerHeight;\n }\n } else if (!value && this.isMaximized) {\n if (this.isHorizontal) {\n this.panelWidth = this.previousPanelWidth;\n } else {\n this.panelHeight = this.previousPanelHeight;\n }\n }\n this.isMaximized = value;\n this.updateTerminalSize();\n }\n\n /** Programmatically set panel dimensions. */\n setDimensions(dims: { height?: number; width?: number }): void {\n if (dims.height !== undefined) {\n this.panelHeight = dims.height;\n this.previousPanelHeight = dims.height;\n }\n if (dims.width !== undefined) {\n this.panelWidth = dims.width;\n this.previousPanelWidth = dims.width;\n }\n this.updateTerminalSize();\n }\n\n private updateTerminalSize() {\n if (this.isHorizontal) {\n this.onContentSizeChange.emit(this.panelWidth - HEADER_HEIGHT);\n } else {\n this.onContentSizeChange.emit(this.panelHeight - HEADER_HEIGHT);\n }\n }\n}\n","<!-- Hide tab (shown when panel is hidden) -->\n<button\n *ngIf=\"visible && isHidden\"\n class=\"cli-panel-hide-tab\"\n [attr.data-position]=\"position\"\n [attr.data-hide-align]=\"hideAlignment\"\n [ngStyle]=\"themeStyles\"\n title=\"Show CLI\"\n (click)=\"unhideTerminal()\"\n>\n <svg\n class=\"cli-panel-hide-tab-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n <span class=\"cli-panel-hide-tab-label\">CLI</span>\n <svg\n class=\"cli-panel-hide-tab-arrow\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <!-- bottom: chevron up -->\n <polyline *ngIf=\"position === 'bottom'\" points=\"18 15 12 9 6 15\" />\n <!-- top: chevron down -->\n <polyline *ngIf=\"position === 'top'\" points=\"6 9 12 15 18 9\" />\n <!-- left: chevron right -->\n <polyline *ngIf=\"position === 'left'\" points=\"9 18 15 12 9 6\" />\n <!-- right: chevron left -->\n <polyline *ngIf=\"position === 'right'\" points=\"15 6 9 12 15 18\" />\n </svg>\n</button>\n\n<!-- Main panel (kept in DOM when hidden to preserve terminal state) -->\n<div\n *ngIf=\"visible\"\n class=\"terminal-wrapper\"\n [style.display]=\"isHidden ? 'none' : ''\"\n [class.collapsed]=\"isCollapsed\"\n [class.maximized]=\"isMaximized\"\n [class.resizing]=\"isResizing\"\n [attr.data-position]=\"position\"\n [attr.data-resizable]=\"resizable\"\n [attr.data-closable]=\"closable\"\n [attr.data-hideable]=\"hideable\"\n [ngStyle]=\"wrapperStyle\"\n>\n <div class=\"terminal-header\">\n <div class=\"resize-bar\" (mousedown)=\"onResizeStart($event)\">\n <div class=\"resize-grip\"></div>\n </div>\n <div class=\"header-content\">\n <p class=\"terminal-title\">\n <svg\n class=\"title-icon\"\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n CLI\n </p>\n <!-- Status indicators (bottom/top positions only) -->\n <div class=\"status-indicators\" *ngIf=\"showStatusIndicators\">\n <!-- Execution state -->\n <span class=\"status-item\" [class.status-running]=\"statusExecutionState === 'running'\">\n <span class=\"status-dot\" [class.dot-idle]=\"statusExecutionState === 'idle'\" [class.dot-running]=\"statusExecutionState === 'running'\"></span>\n <span class=\"status-label\">{{ statusExecutionState }}</span>\n </span>\n\n <!-- Background services (only if any exist) -->\n <span class=\"status-item status-clickable\" *ngIf=\"statusServiceCount.total > 0\" (click)=\"toggleServicesDropdown($event)\">\n <span class=\"status-icon\">⚙</span>\n <span class=\"status-label\">{{ statusServiceCount.running }}/{{ statusServiceCount.total }} services</span>\n </span>\n\n <!-- Last command -->\n <span class=\"status-item\" *ngIf=\"statusLastCommand\">\n <span class=\"status-icon\" [class.status-success]=\"statusLastCommand.success\" [class.status-error]=\"!statusLastCommand.success\">\n {{ statusLastCommand.success ? '✓' : '✕' }}\n </span>\n <span class=\"status-label\">{{ statusLastCommand.name }}</span>\n </span>\n\n <!-- Server connection -->\n <span class=\"status-item status-clickable\" *ngIf=\"statusServerState !== 'none'\" (click)=\"toggleServersDropdown($event)\">\n <span class=\"status-dot\" [class.dot-idle]=\"statusServerState === 'connected'\" [class.dot-error]=\"statusServerState === 'disconnected'\"></span>\n <span class=\"status-label\">{{ connectedServerCount }}/{{ totalServerCount }} servers</span>\n </span>\n\n <!-- Uptime -->\n <span class=\"status-item status-muted\" *ngIf=\"statusUptime > 0\">\n <span class=\"status-icon\">↑</span>\n <span class=\"status-label\">{{ formattedUptime }}</span>\n </span>\n\n <!-- Custom processor notification -->\n <span class=\"status-item status-text\" [ngClass]=\"'level-' + notification?.level\" *ngIf=\"notification\">\n <span class=\"status-label\">{{ notification.message }}</span>\n </span>\n </div>\n\n <!-- Compact status indicators (left/right positions — CSS controls visibility) -->\n <div class=\"status-indicators-compact\">\n <!-- Execution state -->\n <span class=\"compact-item\" [title]=\"statusExecutionState\">\n <span class=\"status-dot\" [class.dot-idle]=\"statusExecutionState === 'idle'\" [class.dot-running]=\"statusExecutionState === 'running'\"></span>\n </span>\n\n <!-- Background services -->\n <span class=\"compact-item status-clickable\" *ngIf=\"statusServiceCount.total > 0\" [title]=\"statusServiceCount.running + '/' + statusServiceCount.total + ' services'\" (click)=\"toggleServicesDropdown($event)\">\n <span class=\"status-icon\">⚙</span>\n </span>\n\n <!-- Last command -->\n <span class=\"compact-item\" *ngIf=\"statusLastCommand\" [title]=\"(statusLastCommand.success ? '✓ ' : '✗ ') + statusLastCommand.name\">\n <span class=\"status-icon\" [class.status-success]=\"statusLastCommand.success\" [class.status-error]=\"!statusLastCommand.success\">\n {{ statusLastCommand.success ? '✓' : '✕' }}\n </span>\n </span>\n\n <!-- Server connection -->\n <span class=\"compact-item status-clickable\" *ngIf=\"statusServerState !== 'none'\" [title]=\"connectedServerCount + '/' + totalServerCount + ' servers'\" (click)=\"toggleServersDropdown($event)\">\n <span class=\"status-dot\" [class.dot-idle]=\"statusServerState === 'connected'\" [class.dot-error]=\"statusServerState === 'disconnected'\"></span>\n </span>\n\n <!-- Uptime -->\n <span class=\"compact-item status-muted\" *ngIf=\"statusUptime > 0\" [title]=\"formattedUptime\">\n <span class=\"status-icon\">↑</span>\n </span>\n\n <!-- Notification -->\n <span class=\"compact-item\" *ngIf=\"notification\" [title]=\"notification.message\">\n <span class=\"compact-dot\" [ngClass]=\"'level-' + notification.level\"></span>\n </span>\n </div>\n\n <div class=\"action-buttons\">\n <!-- Position dropdown -->\n <div class=\"panel-btn-position-wrapper\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"panel-btn panel-btn-position\"\n title=\"Move panel\"\n (click)=\"togglePositionDropdown($event)\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <!-- bottom -->\n <rect *ngIf=\"position === 'bottom'\" x=\"4\" y=\"15\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n <!-- top -->\n <rect *ngIf=\"position === 'top'\" x=\"4\" y=\"4\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n <!-- left -->\n <rect *ngIf=\"position === 'left'\" x=\"4\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n <!-- right -->\n <rect *ngIf=\"position === 'right'\" x=\"15\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n </svg>\n </button>\n </div>\n\n <!-- Hide button -->\n <button\n *ngIf=\"hideable\"\n class=\"panel-btn panel-btn-hide\"\n title=\"Hide\"\n (click)=\"hideTerminal()\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"18\" />\n <polyline points=\"9 14 12 17 15 14\" />\n </svg>\n </button>\n\n <button\n class=\"panel-btn\"\n [title]=\"!isMaximized ? 'Maximize' : 'Restore'\"\n [disabled]=\"isCollapsed\"\n (click)=\"toggleMaximizationTerminal()\"\n >\n <svg\n *ngIf=\"!isMaximized\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n <svg\n *ngIf=\"isMaximized\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n </button>\n\n <button\n class=\"panel-btn\"\n [title]=\"isCollapsed ? 'Expand' : 'Collapse'\"\n (click)=\"toggleTerminal()\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline *ngIf=\"position === 'bottom' && isCollapsed\" points=\"18 15 12 9 6 15\" />\n <polyline *ngIf=\"position === 'bottom' && !isCollapsed\" points=\"6 9 12 15 18 9\" />\n <polyline *ngIf=\"position === 'top' && isCollapsed\" points=\"6 9 12 15 18 9\" />\n <polyline *ngIf=\"position === 'top' && !isCollapsed\" points=\"18 15 12 9 6 15\" />\n <polyline *ngIf=\"position === 'left' && isCollapsed\" points=\"9 18 15 12 9 6\" />\n <polyline *ngIf=\"position === 'left' && !isCollapsed\" points=\"15 6 9 12 15 18\" />\n <polyline *ngIf=\"position === 'right' && isCollapsed\" points=\"15 6 9 12 15 18\" />\n <polyline *ngIf=\"position === 'right' && !isCollapsed\" points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n\n <button class=\"panel-btn panel-btn-close\" title=\"Close\" (click)=\"closeTerminal()\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n <!-- Ambient glow line -->\n <div class=\"glow-line\" [class.glow-active]=\"statusExecutionState === 'running'\"></div>\n </div>\n <div class=\"terminal-content\" [style.display]=\"isCollapsed ? 'none' : ''\">\n <ng-content></ng-content>\n </div>\n</div>\n\n<!-- Services dropdown portaled outside terminal-wrapper -->\n<div class=\"services-dropdown\" *ngIf=\"servicesDropdownOpen\" [ngStyle]=\"servicesDropdownStyle\" (click)=\"$event.stopPropagation()\">\n <div class=\"services-dropdown-header\">Background Services</div>\n <div class=\"services-dropdown-list\">\n <div class=\"services-dropdown-item\" *ngFor=\"let svc of statusServiceDetails\">\n <span class=\"svc-dot\" [class.svc-running]=\"svc.status === 'running'\" [class.svc-stopped]=\"svc.status !== 'running'\"></span>\n <div class=\"svc-info\">\n <span class=\"svc-name\">{{ svc.name }}</span>\n <span class=\"svc-desc\" *ngIf=\"svc.description\">{{ svc.description }}</span>\n </div>\n <span class=\"svc-status\">{{ svc.status }}</span>\n </div>\n </div>\n <div class=\"services-dropdown-empty\" *ngIf=\"statusServiceDetails.length === 0\">\n No services registered\n </div>\n</div>\n\n<!-- Servers dropdown portaled outside terminal-wrapper -->\n<div class=\"services-dropdown\" *ngIf=\"serversDropdownOpen\" [ngStyle]=\"serversDropdownStyle\" (click)=\"$event.stopPropagation()\">\n <div class=\"services-dropdown-header\">Server Connections</div>\n <div class=\"services-dropdown-list\">\n <div class=\"services-dropdown-item\" *ngFor=\"let srv of statusServerDetails\">\n <span class=\"svc-dot\" [class.svc-running]=\"srv.connected\" [class.svc-stopped]=\"!srv.connected\"></span>\n <div class=\"svc-info\">\n <span class=\"svc-name\">{{ srv.name }}</span>\n <span class=\"svc-desc\" *ngIf=\"srv.url\">{{ srv.url }}</span>\n </div>\n <div class=\"srv-meta\">\n <span class=\"svc-status\">{{ srv.connected ? 'connected' : 'disconnected' }}</span>\n <span class=\"svc-desc\" *ngIf=\"srv.apiVersion\">v{{ srv.apiVersion }}</span>\n <span class=\"svc-desc\" *ngIf=\"srv.commandCount\">{{ srv.commandCount }} cmds</span>\n </div>\n </div>\n </div>\n <div class=\"services-dropdown-empty\" *ngIf=\"statusServerDetails.length === 0\">\n No servers configured\n </div>\n</div>\n\n<!-- Position dropdown portaled outside terminal-wrapper to escape transform stacking context -->\n<div class=\"position-dropdown\" *ngIf=\"positionDropdownOpen\" [ngStyle]=\"dropdownStyle\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"position-dropdown-item\"\n [class.active]=\"position === 'bottom'\"\n (click)=\"selectPosition('bottom')\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <rect x=\"4\" y=\"15\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n </svg>\n Bottom\n </button>\n <button\n class=\"position-dropdown-item\"\n [class.active]=\"position === 'top'\"\n (click)=\"selectPosition('top')\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n </svg>\n Top\n </button>\n <button\n class=\"position-dropdown-item\"\n [class.active]=\"position === 'left'\"\n (click)=\"selectPosition('left')\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <rect x=\"4\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n </svg>\n Left\n </button>\n <button\n class=\"position-dropdown-item\"\n [class.active]=\"position === 'right'\"\n (click)=\"selectPosition('right')\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <rect x=\"15\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n </svg>\n Right\n </button>\n</div>\n","import { BehaviorSubject, Observable, Subject, interval, map, distinctUntilChanged, takeUntil, startWith, merge } from 'rxjs';\nimport { CliEngine } from '@qodalis/cli';\nimport { CliNotification } from '@qodalis/cli-core';\n\nexport interface TabStatus {\n executionState: 'idle' | 'running';\n lastCommandStatus: 'success' | 'error' | null;\n lastCommandName: string | null;\n notification: CliNotification | null;\n}\n\nexport interface ServiceDetail {\n name: string;\n status: string;\n description?: string;\n}\n\nexport interface ServerDetail {\n name: string;\n url: string;\n connected: boolean;\n apiVersion?: string;\n commandCount?: number;\n}\n\nexport interface GlobalStatus {\n runningServiceCount: number;\n totalServiceCount: number;\n serviceDetails: ServiceDetail[];\n serverConnectionState: 'connected' | 'disconnected' | 'none';\n serverDetails: ServerDetail[];\n uptime: number;\n}\n\ninterface TabEntry {\n engines: Map<number, CliEngine>; // paneId -> engine\n status$: BehaviorSubject<TabStatus>;\n destroy$: Subject<void>;\n refresh$: Subject<void>;\n}\n\n/** Slow poll for uptime display only. */\nconst UPTIME_POLL_MS = 2000;\n\n/** Fast poll to catch execution state changes. */\nconst EXEC_POLL_MS = 300;\n\nconst DEFAULT_TAB_STATUS: TabStatus = {\n executionState: 'idle',\n lastCommandStatus: null,\n lastCommandName: null,\n notification: null,\n};\n\nconst DEFAULT_GLOBAL_STATUS: GlobalStatus = {\n runningServiceCount: 0,\n totalServiceCount: 0,\n serviceDetails: [],\n serverConnectionState: 'none',\n serverDetails: [],\n uptime: 0,\n};\n\nexport class CliPanelStatusService {\n private tabs = new Map<number, TabEntry>();\n private activeTabId: number | undefined;\n private globalStatus$ = new BehaviorSubject<GlobalStatus>(DEFAULT_GLOBAL_STATUS);\n private destroy$ = new Subject<void>();\n\n /** Push to trigger an immediate global status recalculation. */\n private globalRefresh$ = new Subject<void>();\n\n /** Cleanup functions for background-service event listeners. */\n private bgUnsubscribes: Array<() => void> = [];\n\n private globalPollingStarted = false;\n\n /**\n * Register an engine for a specific pane within a tab.\n */\n registerEngine(tabId: number, paneId: number, engine: CliEngine): void {\n let entry = this.tabs.get(tabId);\n if (!entry) {\n entry = {\n engines: new Map(),\n status$: new BehaviorSubject<TabStatus>(DEFAULT_TAB_STATUS),\n destroy$: new Subject<void>(),\n refresh$: new Subject<void>(),\n };\n this.tabs.set(tabId, entry);\n this.startPollingTab(entry);\n }\n entry.engines.set(paneId, engine);\n\n // Listen to notifier changes for immediate tab refresh\n const context = engine.getContext();\n if (context?.notifier?.change$) {\n context.notifier.change$.pipe(\n takeUntil(entry.destroy$),\n takeUntil(this.destroy$),\n ).subscribe(() => {\n entry!.refresh$.next();\n });\n }\n\n // Listen to background service events for immediate global refresh\n this.listenToBackgroundServices(engine);\n\n if (!this.globalPollingStarted) {\n this.globalPollingStarted = true;\n this.startGlobalPolling();\n }\n }\n\n /**\n * Unregister all engines for a tab (called on tab close).\n */\n unregisterTab(tabId: number): void {\n const entry = this.tabs.get(tabId);\n if (entry) {\n entry.destroy$.next();\n entry.destroy$.complete();\n this.tabs.delete(tabId);\n }\n }\n\n /**\n * Set the active tab for global status derivation.\n */\n setActiveTab(tabId: number): void {\n this.activeTabId = tabId;\n this.globalRefresh$.next();\n }\n\n /**\n * Observable of per-tab status.\n */\n getTabStatus$(tabId: number): Observable<TabStatus> {\n const entry = this.tabs.get(tabId);\n return entry ? entry.status$.asObservable() : new BehaviorSubject(DEFAULT_TAB_STATUS).asObservable();\n }\n\n /**\n * Observable of global status (from active tab).\n */\n getGlobalStatus$(): Observable<GlobalStatus> {\n return this.globalStatus$.asObservable();\n }\n\n /**\n * Clean up all subscriptions.\n */\n destroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n for (const entry of this.tabs.values()) {\n entry.destroy$.next();\n entry.destroy$.complete();\n }\n this.tabs.clear();\n for (const unsub of this.bgUnsubscribes) {\n unsub();\n }\n this.bgUnsubscribes.length = 0;\n }\n\n /**\n * Hook into an engine's background service events so that\n * service start/stop/status-change triggers an immediate refresh.\n */\n private listenToBackgroundServices(engine: CliEngine): void {\n const context = engine.getContext();\n if (!context?.backgroundServices) return;\n\n try {\n const unsub = context.backgroundServices.on(() => {\n this.globalRefresh$.next();\n });\n this.bgUnsubscribes.push(unsub);\n } catch { /* not available */ }\n }\n\n private startPollingTab(entry: TabEntry): void {\n merge(\n interval(EXEC_POLL_MS).pipe(startWith(0)),\n entry.refresh$,\n ).pipe(\n map(() => this.computeTabStatus(entry)),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n takeUntil(entry.destroy$),\n takeUntil(this.destroy$),\n ).subscribe(status => {\n entry.status$.next(status);\n });\n }\n\n private startGlobalPolling(): void {\n // Merge: slow timer for uptime ticking + immediate refresh signals\n merge(\n interval(UPTIME_POLL_MS).pipe(startWith(0)),\n this.globalRefresh$,\n ).pipe(\n map(() => this.computeGlobalStatus()),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n takeUntil(this.destroy$),\n ).subscribe(status => {\n this.globalStatus$.next(status);\n });\n }\n\n private computeTabStatus(entry: TabEntry): TabStatus {\n let running = false;\n let latestResult: { command: string; success: boolean } | undefined;\n let notification: CliNotification | null = null;\n\n for (const engine of entry.engines.values()) {\n const context = engine.getContext();\n if (!context) continue;\n\n // Check if a command is currently executing or a context processor\n // (raw/fullscreen mode, e.g. games) is active\n if ((context as any).isExecuting || (context as any).contextProcessor) {\n running = true;\n }\n\n // Check last command result\n const result = (context as any).lastCommandResult;\n if (result) {\n latestResult = result;\n }\n\n // Pick up notification from processors\n const notif = context.notifier?.current;\n if (notif) {\n notification = notif;\n }\n }\n\n return {\n executionState: running ? 'running' : 'idle',\n lastCommandStatus: latestResult ? (latestResult.success ? 'success' : 'error') : null,\n lastCommandName: latestResult?.command ?? null,\n notification,\n };\n }\n\n private computeGlobalStatus(): GlobalStatus {\n if (this.activeTabId == null) return DEFAULT_GLOBAL_STATUS;\n const entry = this.tabs.get(this.activeTabId);\n if (!entry) return DEFAULT_GLOBAL_STATUS;\n\n // Use the first engine in the active tab for global data\n const engine = entry.engines.values().next().value;\n if (!engine) return DEFAULT_GLOBAL_STATUS;\n\n const context = engine.getContext();\n if (!context) return DEFAULT_GLOBAL_STATUS;\n\n // Background services\n let runningServiceCount = 0;\n let totalServiceCount = 0;\n let serviceDetails: ServiceDetail[] = [];\n try {\n const services = context.backgroundServices?.list() ?? [];\n totalServiceCount = services.length;\n runningServiceCount = services.filter(\n (s: any) => s.status === 'running',\n ).length;\n serviceDetails = services.map((s: any) => ({\n name: s.name,\n status: s.status,\n description: s.description,\n }));\n } catch { /* not available */ }\n\n // Server connection\n let serverConnectionState: GlobalStatus['serverConnectionState'] = 'none';\n const serverDetails: ServerDetail[] = [];\n try {\n const serverManager = (context as any).services?.get?.('cli-server-manager');\n if (serverManager?.connections?.size > 0) {\n let anyConnected = false;\n for (const [name, conn] of serverManager.connections) {\n if (conn.connected) {\n anyConnected = true;\n }\n serverDetails.push({\n name,\n url: conn.config?.url ?? '',\n connected: !!conn.connected,\n apiVersion: conn.connected ? conn.apiVersion : undefined,\n commandCount: conn.connected ? conn.commands?.length : undefined,\n });\n }\n serverConnectionState = anyConnected ? 'connected' : 'disconnected';\n } else {\n // Fall back to configured servers from engine options\n const configuredServers = (engine as any).options?.servers;\n if (Array.isArray(configuredServers) && configuredServers.length > 0) {\n for (const srv of configuredServers) {\n if (srv.enabled === false) continue;\n serverDetails.push({\n name: srv.name,\n url: srv.url ?? '',\n connected: false,\n });\n }\n serverConnectionState = 'disconnected';\n }\n }\n } catch { /* not available */ }\n\n // Uptime\n const uptime = engine.startedAt ? Date.now() - engine.startedAt : 0;\n\n return { runningServiceCount, totalServiceCount, serviceDetails, serverConnectionState, serverDetails, uptime };\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport {\n CliEngineSnapshot,\n CliPanelConfig,\n CliPanelPosition,\n CliPanelState,\n ICliCommandProcessor,\n ICliModule,\n ICliPanelRef,\n derivePanelThemeStyles,\n loadPanelPosition,\n savePanelPosition,\n} from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions } from '@qodalis/cli';\nimport { CliComponent } from '../cli/cli.component';\nimport { CollapsableContentComponent } from '../collapsable-content/collapsable-content.component';\nimport { CliPanelStatusService, TabStatus, GlobalStatus } from './cli-panel-status.service';\nimport { Subject, takeUntil } from 'rxjs';\n\nexport interface TerminalPane {\n id: number;\n widthPercent: number;\n snapshot?: CliEngineSnapshot;\n}\n\nexport interface TerminalTab {\n id: number;\n title: string;\n isEditing: boolean;\n panes: TerminalPane[];\n}\n\nexport interface TabContextMenu {\n visible: boolean;\n x: number;\n y: number;\n tabId: number;\n}\n\nexport type CliPanelOptions = CliEngineOptions & CliPanelConfig;\n\n/**\n * A component that displays the CLI on the bottom of page.\n */\n@Component({\n standalone: false,\n selector: 'cli-panel',\n templateUrl: './cli-panel.component.html',\n styleUrls: ['./cli-panel.component.sass'],\n})\nexport class CliPanelComponent implements OnInit, OnDestroy, ICliPanelRef<CliEngine> {\n /**\n * The options for the CLI.\n */\n @Input() options?: CliPanelOptions;\n\n /**\n * Optional list of CLI modules to register with each terminal pane.\n */\n @Input() modules?: ICliModule[];\n\n /**\n * Optional list of command processors to register with each terminal pane.\n * This allows passing processors without Angular DI (framework-agnostic pattern).\n * @deprecated Use modules instead.\n */\n @Input() processors?: ICliCommandProcessor[];\n\n @Output() onClose = new EventEmitter<void>();\n\n // ── Bindable properties (hybrid controlled/uncontrolled) ──\n @Input() collapsed?: boolean;\n @Output() collapsedChange = new EventEmitter<boolean>();\n\n @Input() hidden?: boolean;\n @Output() hiddenChange = new EventEmitter<boolean>();\n\n @Input() maximized?: boolean;\n @Output() maximizedChange = new EventEmitter<boolean>();\n\n @Input() activeTabId?: number;\n @Output() activeTabIdChange = new EventEmitter<number>();\n\n @Input() position?: CliPanelPosition;\n @Output() positionChange = new EventEmitter<CliPanelPosition>();\n\n @Input() height?: number;\n @Output() heightChange = new EventEmitter<number>();\n\n @Input() width?: number;\n @Output() widthChange = new EventEmitter<number>();\n\n // ── Structural events ──\n @Output() onTabAdded = new EventEmitter<{ tabId: number }>();\n @Output() onTabClosed = new EventEmitter<{ tabId: number }>();\n @Output() onPaneSplit = new EventEmitter<{ paneId: number; tabId: number }>();\n @Output() onPaneClosed = new EventEmitter<{ paneId: number }>();\n\n @ViewChild(CollapsableContentComponent)\n collapsableContent!: CollapsableContentComponent;\n @ViewChildren(CliComponent) cliComponents!: QueryList<CliComponent>;\n\n currentPosition: CliPanelPosition = 'bottom';\n\n themeStyles: Record<string, string> = {};\n\n visible = true;\n\n tabs: TerminalTab[] = [];\n tabStatuses: Record<number, TabStatus> = {};\n activePaneId = 0;\n private _internalActiveTabId = 0;\n private _internalCollapsed = true;\n private _internalHidden = false;\n private _internalMaximized = false;\n private _internalHeight = 600;\n private _internalWidth = 400;\n private nextTabId = 1;\n private nextPaneId = 1;\n private statusService = new CliPanelStatusService();\n private destroy$ = new Subject<void>();\n globalStatus: GlobalStatus = {\n runningServiceCount: 0,\n totalServiceCount: 0,\n serviceDetails: [],\n serverConnectionState: 'none',\n serverDetails: [],\n uptime: 0,\n };\n\n protected get resolvedCollapsed(): boolean {\n return this.collapsed !== undefined ? this.collapsed : this._internalCollapsed;\n }\n protected get resolvedHidden(): boolean {\n return this.hidden !== undefined ? this.hidden : this._internalHidden;\n }\n protected get resolvedMaximized(): boolean {\n return this.maximized !== undefined ? this.maximized : this._internalMaximized;\n }\n protected get resolvedActiveTabId(): number {\n return this.activeTabId !== undefined ? this.activeTabId : this._internalActiveTabId;\n }\n protected get resolvedHeight(): number {\n return this.height !== undefined ? this.height : this._internalHeight;\n }\n protected get resolvedWidth(): number {\n return this.width !== undefined ? this.width : this._internalWidth;\n }\n protected get resolvedPosition(): CliPanelPosition {\n return this.position !== undefined ? this.position : this.currentPosition;\n }\n\n contextMenu: TabContextMenu = {\n visible: false,\n x: 0,\n y: 0,\n tabId: 0,\n };\n\n paneResizing = false;\n private paneResizeTabId = 0;\n private paneResizeDividerIndex = 0;\n private paneResizeStartX = 0;\n private paneResizeStartWidths: number[] = [];\n private paneResizeContainerWidth = 0;\n\n private static readonly MIN_PANE_WIDTH_PERCENT = 10;\n\n protected terminalHeight: string = '100%';\n\n protected initialized: boolean = false;\n\n private themeObserver?: MutationObserver;\n\n constructor(private readonly elementRef: ElementRef) {}\n\n ngOnInit(): void {\n this.currentPosition = loadPanelPosition() ?? this.options?.position ?? 'bottom';\n if (this.options?.isHidden != null) {\n this._internalHidden = this.options.isHidden;\n }\n if (this.options?.isCollapsed != null) {\n this._internalCollapsed = this.options.isCollapsed;\n }\n this.statusService.getGlobalStatus$().pipe(\n takeUntil(this.destroy$),\n ).subscribe(status => {\n this.globalStatus = status;\n });\n }\n\n ngOnDestroy(): void {\n this.themeObserver?.disconnect();\n this.statusService.destroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.contextMenu.visible) {\n this.closeContextMenu();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey(): void {\n if (this.contextMenu.visible) {\n this.closeContextMenu();\n }\n this.cancelAllEditing();\n }\n\n onPositionChange(position: CliPanelPosition): void {\n this.currentPosition = position;\n savePanelPosition(this.currentPosition);\n this.positionChange.emit(position);\n }\n\n onToggle($event: boolean): void {\n this._internalCollapsed = $event;\n this.collapsedChange.emit($event);\n if (!$event && !this.initialized) {\n this.initialized = true;\n this.addTab();\n this.setupThemeSync();\n }\n }\n\n onContentSizeChange(_event: number) {\n // Terminal height is handled via CSS flex layout\n }\n\n // --- Tab management ---\n\n addTab(title?: string): number {\n const pane: TerminalPane = { id: this.nextPaneId++, widthPercent: 100 };\n const tabId = this.nextTabId++;\n const tab: TerminalTab = {\n id: tabId,\n title: title ?? `Terminal ${tabId}`,\n isEditing: false,\n panes: [pane],\n };\n this.tabs.push(tab);\n this._internalActiveTabId = tabId;\n this.activeTabIdChange.emit(tabId);\n this.activePaneId = pane.id;\n this.statusService.setActiveTab(tabId);\n this.onTabAdded.emit({ tabId });\n return tabId;\n }\n\n closeTab(id: number): void {\n const index = this.tabs.findIndex((t) => t.id === id);\n if (index === -1) return;\n\n this.tabs.splice(index, 1);\n this.onTabClosed.emit({ tabId: id });\n this.statusService.unregisterTab(id);\n delete this.tabStatuses[id];\n\n if (this.tabs.length === 0) {\n this.initialized = false;\n this.collapsableContent?.toggleTerminal();\n return;\n }\n\n if (this.resolvedActiveTabId === id) {\n const nextIndex = Math.min(index, this.tabs.length - 1);\n this.selectTab(this.tabs[nextIndex].id);\n }\n }\n\n selectTab(id: number): void {\n this._internalActiveTabId = id;\n this.activeTabIdChange.emit(id);\n this.statusService.setActiveTab(id);\n const tab = this.findTab(id);\n if (tab && tab.panes.length > 0) {\n this.activePaneId = tab.panes[0].id;\n }\n setTimeout(() => {\n this.focusActiveTerminal();\n });\n }\n\n trackByTabId(_index: number, tab: TerminalTab): number {\n return tab.id;\n }\n\n getTabDotClass(tabId: number): string {\n const status = this.tabStatuses[tabId];\n if (!status) return 'dot-idle';\n if (status.executionState === 'running') return 'dot-running';\n if (status.lastCommandStatus === 'error') return 'dot-error';\n return 'dot-idle';\n }\n\n onPaneEngineReady(tabId: number, paneId: number, engine: CliEngine): void {\n this.statusService.registerEngine(tabId, paneId, engine);\n this.statusService.getTabStatus$(tabId).pipe(\n takeUntil(this.destroy$),\n ).subscribe(status => {\n this.tabStatuses[tabId] = status;\n });\n }\n\n trackByPaneId(_index: number, pane: TerminalPane): number {\n return pane.id;\n }\n\n // --- Inline rename ---\n\n startRename(tab: TerminalTab): void {\n this.cancelAllEditing();\n tab.isEditing = true;\n setTimeout(() => {\n const input = this.elementRef.nativeElement.querySelector(\n '.tab-rename-input',\n ) as HTMLInputElement | null;\n if (input) {\n input.focus();\n input.select();\n }\n });\n }\n\n onTabDoubleClick(tab: TerminalTab): void {\n this.startRename(tab);\n }\n\n commitRename(tab: TerminalTab, value: string): void {\n const trimmed = value.trim();\n if (trimmed) {\n tab.title = trimmed;\n }\n tab.isEditing = false;\n }\n\n onRenameKeydown(event: KeyboardEvent, tab: TerminalTab): void {\n if (event.key === 'Enter') {\n this.commitRename(tab, (event.target as HTMLInputElement).value);\n } else if (event.key === 'Escape') {\n tab.isEditing = false;\n }\n }\n\n onRenameBlur(event: FocusEvent, tab: TerminalTab): void {\n if (tab.isEditing) {\n this.commitRename(tab, (event.target as HTMLInputElement).value);\n }\n }\n\n // --- Context menu ---\n\n onTabContextMenu(event: MouseEvent, tab: TerminalTab): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.contextMenu = {\n visible: true,\n x: event.clientX,\n y: event.clientY,\n tabId: tab.id,\n };\n }\n\n closeContextMenu(): void {\n this.contextMenu = { ...this.contextMenu, visible: false };\n }\n\n contextMenuRename(): void {\n const tab = this.findTab(this.contextMenu.tabId);\n this.closeContextMenu();\n if (tab) {\n this.startRename(tab);\n }\n }\n\n contextMenuDuplicate(): void {\n const sourceTab = this.findTab(this.contextMenu.tabId);\n this.closeContextMenu();\n if (sourceTab) {\n const snapshot = this.getEngineForTab(sourceTab)?.snapshot();\n\n const pane: TerminalPane = {\n id: this.nextPaneId++,\n widthPercent: 100,\n snapshot,\n };\n const tab: TerminalTab = {\n id: this.nextTabId++,\n title: `${sourceTab.title} (copy)`,\n isEditing: false,\n panes: [pane],\n };\n const sourceIndex = this.tabs.indexOf(sourceTab);\n this.tabs.splice(sourceIndex + 1, 0, tab);\n this._internalActiveTabId = tab.id;\n this.activeTabIdChange.emit(tab.id);\n this.activePaneId = pane.id;\n }\n }\n\n contextMenuClose(): void {\n const id = this.contextMenu.tabId;\n this.closeContextMenu();\n this.closeTab(id);\n }\n\n contextMenuCloseOthers(): void {\n const id = this.contextMenu.tabId;\n this.closeContextMenu();\n this.tabs = this.tabs.filter((t) => t.id === id);\n this._internalActiveTabId = id;\n this.activeTabIdChange.emit(id);\n }\n\n contextMenuCloseToTheRight(): void {\n const id = this.contextMenu.tabId;\n this.closeContextMenu();\n const index = this.tabs.findIndex((t) => t.id === id);\n if (index === -1) return;\n this.tabs = this.tabs.slice(0, index + 1);\n if (!this.tabs.find((t) => t.id === this.resolvedActiveTabId)) {\n this._internalActiveTabId = id;\n this.activeTabIdChange.emit(id);\n }\n }\n\n contextMenuCloseAll(): void {\n this.closeContextMenu();\n this.tabs = [];\n this.initialized = false;\n this.collapsableContent?.toggleTerminal();\n }\n\n // --- Split / close pane ---\n\n splitPane(tabId?: number): number {\n const targetTabId = tabId ?? this.resolvedActiveTabId;\n const tab = this.findTab(targetTabId);\n if (!tab) return -1;\n\n const paneId = this.nextPaneId++;\n const newPane: TerminalPane = { id: paneId, widthPercent: 0 };\n tab.panes.push(newPane);\n\n const evenWidth = 100 / tab.panes.length;\n tab.panes.forEach((p) => (p.widthPercent = evenWidth));\n this.normalizePaneWidths(tab.panes);\n\n this.activePaneId = paneId;\n this.onPaneSplit.emit({ paneId, tabId: targetTabId });\n return paneId;\n }\n\n closePane(paneId: number): void {\n for (const tab of this.tabs) {\n const idx = tab.panes.findIndex((p) => p.id === paneId);\n if (idx === -1) continue;\n\n if (tab.panes.length <= 1) {\n this.closeTab(tab.id);\n return;\n }\n\n // Destroy engine at the flat index\n let flatIndex = 0;\n for (const t of this.tabs) {\n for (const p of t.panes) {\n if (p.id === paneId) {\n const engine = this.cliComponents?.toArray()[flatIndex]?.getEngine();\n if (engine) engine.destroy();\n }\n flatIndex++;\n }\n }\n\n tab.panes.splice(idx, 1);\n this.normalizePaneWidths(tab.panes);\n\n if (this.activePaneId === paneId) {\n this.activePaneId = tab.panes[Math.min(idx, tab.panes.length - 1)].id;\n }\n\n this.onPaneClosed.emit({ paneId });\n setTimeout(() => this.focusActiveTerminal());\n return;\n }\n }\n\n contextMenuSplitRight(): void {\n const tabId = this.contextMenu.tabId;\n this.closeContextMenu();\n this.splitPane(tabId);\n }\n\n // --- Pane resize ---\n\n onPaneResizeStart(\n event: MouseEvent,\n tabId: number,\n dividerIndex: number,\n ): void {\n event.preventDefault();\n const tab = this.findTab(tabId);\n if (!tab) return;\n\n this.paneResizing = true;\n this.paneResizeTabId = tabId;\n this.paneResizeDividerIndex = dividerIndex;\n this.paneResizeStartX = event.clientX;\n this.paneResizeStartWidths = tab.panes.map((p) => p.widthPercent);\n\n const container = (event.target as HTMLElement).closest(\n '.terminal-panes-container',\n );\n this.paneResizeContainerWidth = container ? container.clientWidth : 1;\n\n document.body.classList.add('cli-pane-resizing');\n }\n\n @HostListener('document:mousemove', ['$event'])\n onPaneResizeMove(event: MouseEvent): void {\n if (!this.paneResizing) return;\n\n const tab = this.findTab(this.paneResizeTabId);\n if (!tab) return;\n\n const deltaX = event.clientX - this.paneResizeStartX;\n const deltaPct = (deltaX / this.paneResizeContainerWidth) * 100;\n\n const i = this.paneResizeDividerIndex;\n const minW = CliPanelComponent.MIN_PANE_WIDTH_PERCENT;\n\n let leftWidth = this.paneResizeStartWidths[i] + deltaPct;\n let rightWidth = this.paneResizeStartWidths[i + 1] - deltaPct;\n\n if (leftWidth < minW) {\n leftWidth = minW;\n rightWidth =\n this.paneResizeStartWidths[i] +\n this.paneResizeStartWidths[i + 1] -\n minW;\n }\n if (rightWidth < minW) {\n rightWidth = minW;\n leftWidth =\n this.paneResizeStartWidths[i] +\n this.paneResizeStartWidths[i + 1] -\n minW;\n }\n\n tab.panes[i].widthPercent = leftWidth;\n tab.panes[i + 1].widthPercent = rightWidth;\n }\n\n @HostListener('document:mouseup')\n onPaneResizeEnd(): void {\n if (!this.paneResizing) return;\n this.paneResizing = false;\n document.body.classList.remove('cli-pane-resizing');\n }\n\n // --- Pane focus ---\n\n onPaneClick(tabId: number, paneId: number): void {\n this.activePaneId = paneId;\n if (this.resolvedActiveTabId !== tabId) {\n this._internalActiveTabId = tabId;\n this.activeTabIdChange.emit(tabId);\n }\n setTimeout(() => this.focusPane(tabId, paneId));\n }\n\n // --- ICliPanelRef methods ---\n\n open(): void {\n if (!this.visible) {\n this.visible = true;\n }\n if (this.resolvedHidden) {\n this._internalHidden = false;\n this.hiddenChange.emit(false);\n }\n if (this.resolvedCollapsed) {\n this._internalCollapsed = false;\n this.collapsedChange.emit(false);\n this.collapsableContent?.setCollapsed(false);\n if (!this.initialized) {\n this.initialized = true;\n this.addTab();\n this.setupThemeSync();\n }\n }\n }\n\n collapse(): void {\n if (!this.resolvedCollapsed) {\n this._internalCollapsed = true;\n this.collapsedChange.emit(true);\n this.collapsableContent?.setCollapsed(true);\n }\n }\n\n toggleCollapse(): void {\n if (this.resolvedCollapsed) {\n this.open();\n } else {\n this.collapse();\n }\n }\n\n hide(): void {\n if (!this.resolvedHidden) {\n this._internalHidden = true;\n this.hiddenChange.emit(true);\n this.collapsableContent?.hideTerminal();\n }\n }\n\n unhide(): void {\n if (this.resolvedHidden) {\n this._internalHidden = false;\n this.hiddenChange.emit(false);\n this.collapsableContent?.unhideTerminal();\n }\n }\n\n toggleHide(): void {\n if (this.resolvedHidden) {\n this.unhide();\n } else {\n this.hide();\n }\n }\n\n close(): void {\n this.visible = false;\n this.onClose.emit();\n }\n\n maximize(): void {\n if (!this.resolvedMaximized) {\n this._internalMaximized = true;\n this.maximizedChange.emit(true);\n this.collapsableContent?.setMaximized(true);\n }\n }\n\n restore(): void {\n if (this.resolvedMaximized) {\n this._internalMaximized = false;\n this.maximizedChange.emit(false);\n this.collapsableContent?.setMaximized(false);\n }\n }\n\n toggleMaximize(): void {\n if (this.resolvedMaximized) {\n this.restore();\n } else {\n this.maximize();\n }\n }\n\n resize(dimensions: { height?: number; width?: number }): void {\n if (dimensions.height !== undefined) {\n this._internalHeight = dimensions.height;\n this.heightChange.emit(dimensions.height);\n }\n if (dimensions.width !== undefined) {\n this._internalWidth = dimensions.width;\n this.widthChange.emit(dimensions.width);\n }\n this.collapsableContent?.setDimensions(dimensions);\n }\n\n setPosition(pos: CliPanelPosition): void {\n this.currentPosition = pos;\n savePanelPosition(pos);\n this.positionChange.emit(pos);\n }\n\n renameTab(tabId: number, title: string): void {\n const tab = this.findTab(tabId);\n if (tab) {\n tab.title = title;\n }\n }\n\n getEngine(paneId?: number): CliEngine | undefined {\n const targetPaneId = paneId ?? this.activePaneId;\n let flatIndex = 0;\n for (const tab of this.tabs) {\n for (const pane of tab.panes) {\n if (pane.id === targetPaneId) {\n const components = this.cliComponents?.toArray();\n return components?.[flatIndex]?.getEngine();\n }\n flatIndex++;\n }\n }\n return undefined;\n }\n\n getState(): CliPanelState {\n return {\n collapsed: this.resolvedCollapsed,\n hidden: this.resolvedHidden,\n maximized: this.resolvedMaximized,\n position: this.resolvedPosition,\n height: this.resolvedHeight,\n width: this.resolvedWidth,\n activeTabId: this.resolvedActiveTabId,\n activePaneId: this.activePaneId,\n tabs: this.tabs.map((t) => ({\n id: t.id,\n title: t.title,\n panes: t.panes.map((p) => ({ id: p.id, widthPercent: p.widthPercent })),\n })),\n };\n }\n\n // --- Helpers ---\n\n private findTab(id: number): TerminalTab | undefined {\n return this.tabs.find((t) => t.id === id);\n }\n\n private getEngineForTab(tab: TerminalTab): CliEngine | undefined {\n if (!this.cliComponents) return undefined;\n\n let flatIndex = 0;\n for (const t of this.tabs) {\n for (const _pane of t.panes) {\n if (t.id === tab.id) {\n const component = this.cliComponents.toArray()[flatIndex];\n return component?.getEngine();\n }\n flatIndex++;\n }\n }\n return undefined;\n }\n\n private cancelAllEditing(): void {\n this.tabs.forEach((t) => (t.isEditing = false));\n }\n\n private focusActiveTerminal(): void {\n this.focusPane(this.resolvedActiveTabId, this.activePaneId);\n }\n\n private focusPane(tabId: number, paneId: number): void {\n if (!this.cliComponents) return;\n\n let flatIndex = 0;\n for (const tab of this.tabs) {\n for (const pane of tab.panes) {\n if (tab.id === tabId && pane.id === paneId) {\n const component = this.cliComponents.toArray()[flatIndex];\n component?.focus();\n return;\n }\n flatIndex++;\n }\n }\n }\n\n private normalizePaneWidths(panes: TerminalPane[]): void {\n const total = panes.reduce((s, p) => s + p.widthPercent, 0);\n if (total === 0) return;\n const scale = 100 / total;\n panes.forEach((p) => (p.widthPercent = p.widthPercent * scale));\n }\n\n private setupThemeSync(): void {\n if (!this.options?.syncTheme) return;\n\n // Wait for the first terminal to render, then observe style changes\n setTimeout(() => {\n this.syncThemeFromEngine();\n\n const container = this.elementRef.nativeElement.querySelector(\n '.terminal-container',\n );\n if (!container) return;\n\n this.themeObserver?.disconnect();\n this.themeObserver = new MutationObserver(() => {\n this.syncThemeFromEngine();\n });\n this.themeObserver.observe(container, {\n attributes: true,\n attributeFilter: ['style'],\n });\n }, 200);\n }\n\n private syncThemeFromEngine(): void {\n if (!this.cliComponents) return;\n const first = this.cliComponents.first;\n if (!first) return;\n const engine = first.getEngine();\n if (!engine) return;\n const theme = engine.getTerminal().options.theme;\n if (!theme) return;\n this.themeStyles = derivePanelThemeStyles(theme);\n }\n}\n","<collapsable-content\n [isCollapsed]=\"resolvedCollapsed\"\n [isHidden]=\"resolvedHidden\"\n [isMaximized]=\"resolvedMaximized\"\n [position]=\"resolvedPosition\"\n [closable]=\"options?.closable ?? true\"\n [resizable]=\"options?.resizable ?? true\"\n [hideable]=\"options?.hideable ?? true\"\n [hideAlignment]=\"options?.hideAlignment ?? 'center'\"\n [themeStyles]=\"themeStyles\"\n [statusExecutionState]=\"tabStatuses[resolvedActiveTabId]?.executionState || 'idle'\"\n [statusLastCommand]=\"tabStatuses[resolvedActiveTabId]?.lastCommandStatus ? { name: tabStatuses[resolvedActiveTabId]?.lastCommandName || '', success: tabStatuses[resolvedActiveTabId]?.lastCommandStatus === 'success' } : null\"\n [statusServiceCount]=\"{ running: globalStatus.runningServiceCount, total: globalStatus.totalServiceCount }\"\n [statusServiceDetails]=\"globalStatus.serviceDetails\"\n [statusServerState]=\"globalStatus.serverConnectionState\"\n [statusServerDetails]=\"globalStatus.serverDetails\"\n [statusUptime]=\"globalStatus.uptime\"\n [notification]=\"tabStatuses[resolvedActiveTabId]?.notification || null\"\n (onToggle)=\"onToggle($event)\"\n (onContentSizeChange)=\"onContentSizeChange($event)\"\n (onPositionChange)=\"onPositionChange($event)\"\n (onClose)=\"onClose.emit()\"\n *ngIf=\"visible\"\n>\n <ng-container *ngIf=\"initialized\">\n <div class=\"terminal-tabs\">\n <ul class=\"tab-list\">\n <li\n *ngFor=\"let tab of tabs; trackBy: trackByTabId\"\n class=\"tab\"\n [class.active]=\"tab.id === resolvedActiveTabId\"\n (click)=\"selectTab(tab.id)\"\n (dblclick)=\"onTabDoubleClick(tab)\"\n (contextmenu)=\"onTabContextMenu($event, tab)\"\n >\n <input\n *ngIf=\"tab.isEditing\"\n class=\"tab-rename-input\"\n type=\"text\"\n [value]=\"tab.title\"\n (keydown)=\"onRenameKeydown($event, tab)\"\n (blur)=\"onRenameBlur($event, tab)\"\n (click)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n #renameInput\n />\n <span *ngIf=\"!tab.isEditing\" class=\"tab-dot\" [ngClass]=\"getTabDotClass(tab.id)\"></span>\n <span *ngIf=\"!tab.isEditing\" class=\"tab-title\">{{ tab.title }}</span>\n <button\n *ngIf=\"!tab.isEditing\"\n class=\"close-btn\"\n title=\"Close tab\"\n (click)=\"closeTab(tab.id); $event.stopPropagation()\"\n >\n ×\n </button>\n </li>\n </ul>\n <button class=\"add-tab\" title=\"New terminal\" (click)=\"addTab()\">+</button>\n </div>\n <div class=\"terminal-instances\">\n <div\n *ngFor=\"let tab of tabs; trackBy: trackByTabId\"\n class=\"terminal-instance\"\n [hidden]=\"tab.id !== resolvedActiveTabId\"\n >\n <div\n class=\"terminal-panes-container\"\n [attr.data-tab-id]=\"tab.id\"\n [class.resizing]=\"paneResizing\"\n >\n <ng-container\n *ngFor=\"\n let pane of tab.panes;\n let i = index;\n trackBy: trackByPaneId\n \"\n >\n <div\n *ngIf=\"i > 0\"\n class=\"pane-divider\"\n (mousedown)=\"onPaneResizeStart($event, tab.id, i - 1)\"\n >\n <div class=\"pane-divider-grip\"></div>\n </div>\n <div\n class=\"terminal-pane\"\n [class.active-pane]=\"\n pane.id === activePaneId && tab.id === resolvedActiveTabId\n \"\n [style.flex]=\"pane.widthPercent + ' 1 0'\"\n (click)=\"onPaneClick(tab.id, pane.id)\"\n >\n <button\n *ngIf=\"tab.panes.length > 1\"\n class=\"pane-close-btn\"\n (click)=\"closePane(pane.id); $event.stopPropagation()\"\n title=\"Close pane\"\n >\n ×\n </button>\n <cli\n [options]=\"options\"\n [height]=\"terminalHeight\"\n [modules]=\"modules\"\n [processors]=\"processors\"\n [snapshot]=\"pane.snapshot\"\n (engineReady)=\"onPaneEngineReady(tab.id, pane.id, $event)\"\n />\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</collapsable-content>\n\n<!-- Context menu rendered outside collapsable-content to escape transform/overflow clipping -->\n<div\n class=\"tab-context-menu\"\n *ngIf=\"contextMenu.visible\"\n [style.left.px]=\"contextMenu.x\"\n [style.top.px]=\"contextMenu.y\"\n (click)=\"$event.stopPropagation()\"\n>\n <button class=\"context-menu-item\" (click)=\"contextMenuRename()\">\n Rename\n </button>\n <button class=\"context-menu-item\" (click)=\"contextMenuDuplicate()\">\n Duplicate\n </button>\n <button class=\"context-menu-item\" (click)=\"contextMenuSplitRight()\">\n Split Right\n </button>\n <div class=\"context-menu-separator\"></div>\n <button class=\"context-menu-item\" (click)=\"contextMenuClose()\">Close</button>\n <button\n class=\"context-menu-item\"\n (click)=\"contextMenuCloseOthers()\"\n [disabled]=\"tabs.length <= 1\"\n >\n Close Others\n </button>\n <button class=\"context-menu-item\" (click)=\"contextMenuCloseToTheRight()\">\n Close to the Right\n </button>\n <div class=\"context-menu-separator\"></div>\n <button class=\"context-menu-item destructive\" (click)=\"contextMenuCloseAll()\">\n Close All\n </button>\n</div>\n","import { ICliPingServerService } from '@qodalis/cli-core';\n\nexport class CliDefaultPingServerService implements ICliPingServerService {\n ping(): Promise<void> {\n // Simulate a server ping\n return new Promise((resolve) => setTimeout(resolve, 2000));\n }\n}\n","import { Provider } from '@angular/core';\nimport { ICliPingServerService_TOKEN as CLI_PING_TOKEN } from './cli/tokens';\nimport { CliDefaultPingServerService } from './cli/services';\n\n/**\n * Angular DI providers for services that the framework-agnostic\n * processors in @qodalis/cli need. The CliComponent bridges these\n * into the engine's service container automatically.\n */\nexport const resolveCliProviders = (): Provider[] => {\n return [\n {\n useClass: CliDefaultPingServerService,\n provide: CLI_PING_TOKEN,\n },\n ];\n};\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CliComponent } from './cli/cli.component';\nimport { CollapsableContentComponent } from './collapsable-content/collapsable-content.component';\nimport { CliPanelComponent } from './cli-panel/cli-panel.component';\nimport { resolveCliProviders } from '.';\n\n@NgModule({\n declarations: [\n CliComponent,\n CollapsableContentComponent,\n CliPanelComponent,\n ],\n imports: [CommonModule],\n providers: [resolveCliProviders()],\n exports: [CliPanelComponent, CliComponent],\n})\nexport class CliModule {}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { ICliCommandProcessor, ICliModule } from '@qodalis/cli-core';\nimport { CliCommandProcessor_TOKEN, CliModule_TOKEN } from '../cli/tokens';\n\nexport const resolveCliProvider = <T>(\n token: InjectionToken<T>,\n provider: new (...args: any[]) => T,\n): Provider => ({\n provide: token,\n useExisting: provider,\n multi: true,\n});\n\n/**\n * @deprecated Use resolveCliModuleProvider() instead.\n */\nexport const resolveCommandProcessorProvider = <T extends ICliCommandProcessor>(\n provider: new (...args: any[]) => T,\n): Provider => [\n provider,\n resolveCliProvider<T>(CliCommandProcessor_TOKEN, provider),\n];\n\n/**\n * Resolve an ICliModule into Angular providers.\n * Registers the module via CliModule_TOKEN and also registers processors\n * individually via CliCommandProcessor_TOKEN for backward compatibility.\n */\nexport const resolveCliModuleProvider = (module: ICliModule): Provider[] => {\n const providers: Provider[] = [\n {\n provide: CliModule_TOKEN,\n useValue: module,\n multi: true,\n },\n ];\n\n if (module.processors) {\n for (const processor of module.processors) {\n providers.push({\n provide: CliCommandProcessor_TOKEN,\n useValue: processor,\n multi: true,\n });\n }\n }\n\n return providers;\n};\n","// Re-exports from @qodalis/cli for backwards compatibility\nexport {\n CommandParser,\n ParsedArg,\n CommandParserOutput,\n} from './command-parser';\nexport { openLink, getGreetingBasedOnTime } from '@qodalis/cli';\n\nexport * from './dependency-injection';\n","/*\n * Public API Surface of @qodalis/angular-cli\n */\n\nexport * from './lib/cli.module';\n\nexport { resolveCliProviders } from './lib/index';\n\nexport * from './lib/cli/services';\n\nexport * from './lib/utils';\n\nexport * from './lib/cli/tokens';\n\nexport {\n CliPanelComponent,\n CliPanelOptions,\n} from './lib/cli-panel/cli-panel.component';\n\nexport { CliComponent } from './lib/cli/cli.component';\n\n// Re-exports from @qodalis/cli for convenience\nexport { CliEngine, CliEngineOptions } from '@qodalis/cli';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.CliComponent","i3.CollapsableContentComponent","CLI_PING_TOKEN"],"mappings":";;;;;;;;;MASa,yBAAyB,GAAG,IAAI,cAAc,CAEzD,gBAAgB;MAEL,4BAA4B,GACrC,IAAI,cAAc,CAAyB,0BAA0B;MAE5D,2BAA2B,GAAG,IAAI,cAAc,CAE3D,yBAAyB;MAEd,2BAA2B,GAAG,IAAI,cAAc,CAE3D,yBAAyB;MAEd,eAAe,GAAG,IAAI,cAAc,CAAe,aAAa;;MCahE,YAAY,CAAA;AAarB,IAAA,WAAA,CAGqB,YAAoC,EAGpC,SAAuB,EAGvB,iBAAwC,EAAA;QANxC,IAAA,CAAA,YAAY,GAAZ,YAAY;QAGZ,IAAA,CAAA,SAAS,GAAT,SAAS;QAGT,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;AAf5B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAa;IAgBlD;IAEH,eAAe,GAAA;AACX,QAAA,MAAM,aAAa,GAAqB;AACpC,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AACvB,YAAA,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;SACxD;AAED,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CACvB,IAAI,CAAC,WAAW,CAAC,aAAa,EAC9B,aAAa,CAChB;;QAGD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,SAAS,CAAC;;AAGvD,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,eAAe,CACvB,yBAAyB,EACzB,IAAI,CAAC,iBAAiB,CACzB;QACL;;;;AAKA,QAAA,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACnD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC5B,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAC1D;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1E,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,gBAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC;YAC9C;QACJ;;AAGA,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/C,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;QACnD;;AAGA,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7C,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;QAC/C;;AAGA,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7C;QAEA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,MAAK;YAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC;AACvC,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;IAC1B;IAEO,KAAK,GAAA;AACR,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;IACxB;IAEO,SAAS,GAAA;QACZ,OAAO,IAAI,CAAC,MAAM;IACtB;AA1FS,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAeT,yBAAyB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAGzB,eAAe,6BAGf,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AArB9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EARX,CAAA;;;;AAIF,WAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAIC,YAAY,EAAA,UAAA,EAAA,CAAA;kBAXxB,SAAS;iCACM,KAAK,EAAA,QAAA,EACP,KAAK,EAAA,QAAA,EACL,CAAA;;;;YAIF,EAAA,aAAA,EAEO,iBAAiB,CAAC,IAAI,EAAA;;0BAgBhC;;0BACA,MAAM;2BAAC,yBAAyB;;0BAEhC;;0BACA,MAAM;2BAAC,eAAe;;0BAEtB;;0BACA,MAAM;2BAAC,2BAA2B;yCApB9B,OAAO,EAAA,CAAA;sBAAf;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAES,WAAW,EAAA,CAAA;sBAApB;gBAEwC,WAAW,EAAA,CAAA;sBAAnD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;ACpC3C,MAAM,aAAa,GAAG,EAAE;MAQX,2BAA2B,CAAA;AANxC,IAAA,WAAA,GAAA;QAOI,IAAA,CAAA,mBAAmB,GAAG,GAAG;QACzB,IAAA,CAAA,WAAW,GAAG,GAAG;QACjB,IAAA,CAAA,UAAU,GAAG,GAAG;QAChB,IAAA,CAAA,kBAAkB,GAAG,GAAG;QAExB,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,WAAW,GAAG,CAAC;QACf,IAAA,CAAA,UAAU,GAAG,CAAC;QAEL,IAAA,CAAA,OAAO,GAAY,IAAI;QACvB,IAAA,CAAA,WAAW,GAAY,IAAI;QAC3B,IAAA,CAAA,WAAW,GAAY,KAAK;QAC5B,IAAA,CAAA,QAAQ,GAAqB,QAAQ;QACrC,IAAA,CAAA,QAAQ,GAAY,IAAI;QACxB,IAAA,CAAA,SAAS,GAAY,IAAI;QACzB,IAAA,CAAA,QAAQ,GAAY,IAAI;QACxB,IAAA,CAAA,aAAa,GAA0B,QAAQ;QAC/C,IAAA,CAAA,WAAW,GAA2B,EAAE;AAG1C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAW;AAGtC,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,YAAY,EAAU;AAGhD,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAGlC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAGjC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAoB;QAErD,IAAA,CAAA,QAAQ,GAAG,KAAK;;QAGhB,IAAA,CAAA,oBAAoB,GAAuB,MAAM;QACjD,IAAA,CAAA,iBAAiB,GAA8C,IAAI;QACnE,IAAA,CAAA,kBAAkB,GAAuC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;QACjF,IAAA,CAAA,oBAAoB,GAAoB,EAAE;QAC1C,IAAA,CAAA,iBAAiB,GAA0C,MAAM;QACjE,IAAA,CAAA,mBAAmB,GAAmB,EAAE;QACxC,IAAA,CAAA,YAAY,GAAG,CAAC;QAChB,IAAA,CAAA,YAAY,GAA2B,IAAI;QAEpD,IAAA,CAAA,oBAAoB,GAAG,KAAK;QAC5B,IAAA,CAAA,aAAa,GAA2B,EAAE;QAClC,IAAA,CAAA,gBAAgB,GAAG,IAAI;QAkB/B,IAAA,CAAA,oBAAoB,GAAG,KAAK;QAC5B,IAAA,CAAA,qBAAqB,GAA2B,EAAE;QAClD,IAAA,CAAA,mBAAmB,GAAG,KAAK;QAC3B,IAAA,CAAA,oBAAoB,GAA2B,EAAE;AA+RpD,IAAA;AAlTG,IAAA,IAAI,YAAY,GAAA;QACZ,OAAO,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;IAChE;AAEA,IAAA,IAAI,oBAAoB,GAAA;QACpB,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;IAChE;AAEA,IAAA,IAAI,oBAAoB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM;IACnE;AAEA,IAAA,IAAI,gBAAgB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM;IAC1C;AAOA,IAAA,sBAAsB,CAAC,KAAiB,EAAA;QACpC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,oBAAoB;AACtD,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC3B,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,aAA4B;AAC7C,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACvC,YAAA,QAAQ,IAAI,CAAC,QAAQ;AACjB,gBAAA,KAAK,QAAQ;oBACT,IAAI,CAAC,qBAAqB,GAAG;AACzB,wBAAA,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI;AAClD,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI;qBACzB;oBACD;AACJ,gBAAA,KAAK,KAAK;oBACN,IAAI,CAAC,qBAAqB,GAAG;wBACzB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI;AAC7B,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI;qBACzB;oBACD;AACJ,gBAAA,KAAK,MAAM;oBACP,IAAI,CAAC,qBAAqB,GAAG;AACzB,wBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI;wBACpB,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI;qBAChC;oBACD;AACJ,gBAAA,KAAK,OAAO;oBACR,IAAI,CAAC,qBAAqB,GAAG;AACzB,wBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI;AACpB,wBAAA,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI;qBACpD;oBACD;AACJ,gBAAA;oBACI,IAAI,CAAC,qBAAqB,GAAG;AACzB,wBAAA,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI;AAClD,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI;qBACzB;;QAEb;IACJ;AAEA,IAAA,qBAAqB,CAAC,KAAiB,EAAA;QACnC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,mBAAmB;AACpD,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,aAA4B;AAC7C,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACvC,YAAA,QAAQ,IAAI,CAAC,QAAQ;AACjB,gBAAA,KAAK,QAAQ;oBACT,IAAI,CAAC,oBAAoB,GAAG;AACxB,wBAAA,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI;AAClD,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI;qBACzB;oBACD;AACJ,gBAAA,KAAK,KAAK;oBACN,IAAI,CAAC,oBAAoB,GAAG;wBACxB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI;AAC7B,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI;qBACzB;oBACD;AACJ,gBAAA,KAAK,MAAM;oBACP,IAAI,CAAC,oBAAoB,GAAG;AACxB,wBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI;wBACpB,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI;qBAChC;oBACD;AACJ,gBAAA,KAAK,OAAO;oBACR,IAAI,CAAC,oBAAoB,GAAG;AACxB,wBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI;AACpB,wBAAA,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI;qBACpD;oBACD;AACJ,gBAAA;oBACI,IAAI,CAAC,oBAAoB,GAAG;AACxB,wBAAA,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI;AAClD,wBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI;qBACzB;;QAEb;IACJ;AAEA,IAAA,IAAI,eAAe,GAAA;AACf,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAClD,IAAI,IAAI,GAAG,EAAE;YAAE,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;AACjC,QAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,IAAI,GAAG,EAAE,GAAG;IACjC;AAEA,IAAA,IAAI,YAAY,GAAA;AACZ,QAAA,MAAM,IAAI,GAA2B,IAAI,CAAC;cACpC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI;cAC/B,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE;QACzC,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;IAC3C;IAEA,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;QAEpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACxC;IAEA,aAAa,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACvB;IAEA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW;AACxC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACtB;IAEA,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB;QACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACxC;AAEA,IAAA,sBAAsB,CAAC,KAAiB,EAAA;QACpC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,oBAAoB;AACtD,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,aAA4B;AAC9C,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,EAAE;AACxC,YAAA,QAAQ,IAAI,CAAC,QAAQ;AACjB,gBAAA,KAAK,QAAQ;oBACT,IAAI,CAAC,aAAa,GAAG;AACjB,wBAAA,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI;wBAClD,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI;qBACjD;oBACD;AACJ,gBAAA,KAAK,KAAK;oBACN,IAAI,CAAC,aAAa,GAAG;wBACjB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI;wBAC7B,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI;qBACjD;oBACD;AACJ,gBAAA,KAAK,MAAM;oBACP,IAAI,CAAC,aAAa,GAAG;AACjB,wBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI;wBACpB,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI;qBAChC;oBACD;AACJ,gBAAA,KAAK,OAAO;oBACR,IAAI,CAAC,aAAa,GAAG;AACjB,wBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI;AACpB,wBAAA,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI;qBACpD;oBACD;;QAEZ;IACJ;AAEA,IAAA,cAAc,CAAC,GAAqB,EAAA;AAChC,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACnC;IAGA,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;IACpC;IAEA,0BAA0B,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACnB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;AACzC,gBAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;YACvC;iBAAO;AACH,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB;YAC7C;QACJ;aAAO;AACH,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACnB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW;AAC3C,gBAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;YACzC;iBAAO;AACH,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB;YAC/C;QACJ;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;QACpC,IAAI,CAAC,kBAAkB,EAAE;IAC7B;AAEA,IAAA,aAAa,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,cAAc,EAAE;QACzB;AAEA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QACrC;aAAO;AACH,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;QACvC;QACA,KAAK,CAAC,cAAc,EAAE;IAC1B;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AAEtB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK;AAC7B,kBAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;kBACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AACjC,YAAA,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;AAEvD,YAAA,IAAI,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE;AAC/B,gBAAA,SAAS,GAAG,MAAM,CAAC,UAAU;YACjC;AAEA,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC/B;aAAO;AACH,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK;AAC7B,kBAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;kBACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AACjC,YAAA,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;AAEzD,YAAA,IAAI,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE;AACjC,gBAAA,UAAU,GAAG,MAAM,CAAC,WAAW;YACnC;AAEA,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU;QACjC;QACA,IAAI,CAAC,kBAAkB,EAAE;IAC7B;IAGA,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IAC3B;;AAGA,IAAA,YAAY,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;;AAGA,IAAA,YAAY,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;AACzC,gBAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;YACvC;iBAAO;AACH,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW;AAC3C,gBAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW;YACzC;QACJ;AAAO,aAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE;AACnC,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACnB,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB;YAC7C;iBAAO;AACH,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB;YAC/C;QACJ;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,kBAAkB,EAAE;IAC7B;;AAGA,IAAA,aAAa,CAAC,IAAyC,EAAA;AACnD,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE;AAC3B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM;AAC9B,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM;QAC1C;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK;AAC5B,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK;QACxC;QACA,IAAI,CAAC,kBAAkB,EAAE;IAC7B;IAEQ,kBAAkB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;QAClE;aAAO;YACH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC;QACnE;IACJ;+GAtWS,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,47BClBxC,43hBAqYA,EAAA,MAAA,EAAA,CAAA,iweAAA,CAAA,EAAA,YAAA,EAAA,CAAA,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,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDnXa,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACM,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,qBAAqB,EAAA,QAAA,EAAA,43hBAAA,EAAA,MAAA,EAAA,CAAA,iweAAA,CAAA,EAAA;8BAgBtB,OAAO,EAAA,CAAA;sBAAf;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAGM,QAAQ,EAAA,CAAA;sBADd;gBAIM,mBAAmB,EAAA,CAAA;sBADzB;gBAIM,OAAO,EAAA,CAAA;sBADb;gBAIM,MAAM,EAAA,CAAA;sBADZ;gBAIM,gBAAgB,EAAA,CAAA;sBADtB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,kBAAkB,EAAA,CAAA;sBAA1B;gBACQ,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBACQ,mBAAmB,EAAA,CAAA;sBAA3B;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBACQ,YAAY,EAAA,CAAA;sBAApB;gBAyLD,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,gBAAgB;gBA+C9B,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;gBA+B9C,SAAS,EAAA,CAAA;sBADR,YAAY;uBAAC,kBAAkB;;;AE5RpC;AACA,MAAM,cAAc,GAAG,IAAI;AAE3B;AACA,MAAM,YAAY,GAAG,GAAG;AAExB,MAAM,kBAAkB,GAAc;AAClC,IAAA,cAAc,EAAE,MAAM;AACtB,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,YAAY,EAAE,IAAI;CACrB;AAED,MAAM,qBAAqB,GAAiB;AACxC,IAAA,mBAAmB,EAAE,CAAC;AACtB,IAAA,iBAAiB,EAAE,CAAC;AACpB,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,qBAAqB,EAAE,MAAM;AAC7B,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,MAAM,EAAE,CAAC;CACZ;MAEY,qBAAqB,CAAA;AAAlC,IAAA,WAAA,GAAA;AACY,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,GAAG,EAAoB;AAElC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAAe,qBAAqB,CAAC;AACxE,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;;AAG9B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAQ;;QAGpC,IAAA,CAAA,cAAc,GAAsB,EAAE;QAEtC,IAAA,CAAA,oBAAoB,GAAG,KAAK;IAkPxC;AAhPI;;AAEG;AACH,IAAA,cAAc,CAAC,KAAa,EAAE,MAAc,EAAE,MAAiB,EAAA;QAC3D,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,KAAK,GAAG;gBACJ,OAAO,EAAE,IAAI,GAAG,EAAE;AAClB,gBAAA,OAAO,EAAE,IAAI,eAAe,CAAY,kBAAkB,CAAC;gBAC3D,QAAQ,EAAE,IAAI,OAAO,EAAQ;gBAC7B,QAAQ,EAAE,IAAI,OAAO,EAAQ;aAChC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AAC3B,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAC/B;QACA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;;AAGjC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE;AACnC,QAAA,IAAI,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;YAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CACzB,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EACzB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3B,CAAC,SAAS,CAAC,MAAK;AACb,gBAAA,KAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC1B,YAAA,CAAC,CAAC;QACN;;AAGA,QAAA,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC;AAEvC,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC5B,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;YAChC,IAAI,CAAC,kBAAkB,EAAE;QAC7B;IACJ;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAClC,IAAI,KAAK,EAAE;AACP,YAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;AACrB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B;IACJ;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC9B;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAClC,OAAO,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,CAAC,YAAY,EAAE;IACxG;AAEA;;AAEG;IACH,gBAAgB,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;IAC5C;AAEA;;AAEG;IACH,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AACpC,YAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;AACrB,YAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE;QAC7B;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACjB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,KAAK,EAAE;QACX;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;IAClC;AAEA;;;AAGG;AACK,IAAA,0BAA0B,CAAC,MAAiB,EAAA;AAChD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE;QACnC,IAAI,CAAC,OAAO,EAAE,kBAAkB;YAAE;AAElC,QAAA,IAAI;YACA,MAAM,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAK;AAC7C,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC9B,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC;AAAE,QAAA,MAAM,sBAAsB;IAClC;AAEQ,IAAA,eAAe,CAAC,KAAe,EAAA;AACnC,QAAA,KAAK,CACD,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACzC,KAAK,CAAC,QAAQ,CACjB,CAAC,IAAI,CACF,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EACvC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACvE,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EACzB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3B,CAAC,SAAS,CAAC,MAAM,IAAG;AACjB,YAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,QAAA,CAAC,CAAC;IACN;IAEQ,kBAAkB,GAAA;;AAEtB,QAAA,KAAK,CACD,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAC3C,IAAI,CAAC,cAAc,CACtB,CAAC,IAAI,CACF,GAAG,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC,EACrC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACvE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3B,CAAC,SAAS,CAAC,MAAM,IAAG;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AACnC,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,gBAAgB,CAAC,KAAe,EAAA;QACpC,IAAI,OAAO,GAAG,KAAK;AACnB,QAAA,IAAI,YAA+D;QACnE,IAAI,YAAY,GAA2B,IAAI;QAE/C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;AACzC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE;AACnC,YAAA,IAAI,CAAC,OAAO;gBAAE;;;YAId,IAAK,OAAe,CAAC,WAAW,IAAK,OAAe,CAAC,gBAAgB,EAAE;gBACnE,OAAO,GAAG,IAAI;YAClB;;AAGA,YAAA,MAAM,MAAM,GAAI,OAAe,CAAC,iBAAiB;YACjD,IAAI,MAAM,EAAE;gBACR,YAAY,GAAG,MAAM;YACzB;;AAGA,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO;YACvC,IAAI,KAAK,EAAE;gBACP,YAAY,GAAG,KAAK;YACxB;QACJ;QAEA,OAAO;YACH,cAAc,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM;YAC5C,iBAAiB,EAAE,YAAY,IAAI,YAAY,CAAC,OAAO,GAAG,SAAS,GAAG,OAAO,IAAI,IAAI;AACrF,YAAA,eAAe,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;YAC9C,YAAY;SACf;IACL;IAEQ,mBAAmB,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;AAAE,YAAA,OAAO,qBAAqB;AAC1D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;AAC7C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,qBAAqB;;AAGxC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AAClD,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,qBAAqB;AAEzC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,qBAAqB;;QAG1C,IAAI,mBAAmB,GAAG,CAAC;QAC3B,IAAI,iBAAiB,GAAG,CAAC;QACzB,IAAI,cAAc,GAAoB,EAAE;AACxC,QAAA,IAAI;YACA,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE;AACzD,YAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM;AACnC,YAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,CAAM,KAAK,CAAC,CAAC,MAAM,KAAK,SAAS,CACrC,CAAC,MAAM;YACR,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,MAAM;gBACvC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;AAC7B,aAAA,CAAC,CAAC;QACP;AAAE,QAAA,MAAM,sBAAsB;;QAG9B,IAAI,qBAAqB,GAA0C,MAAM;QACzE,MAAM,aAAa,GAAmB,EAAE;AACxC,QAAA,IAAI;YACA,MAAM,aAAa,GAAI,OAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,oBAAoB,CAAC;YAC5E,IAAI,aAAa,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE;gBACtC,IAAI,YAAY,GAAG,KAAK;gBACxB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE;AAClD,oBAAA,IAAI,IAAI,CAAC,SAAS,EAAE;wBAChB,YAAY,GAAG,IAAI;oBACvB;oBACA,aAAa,CAAC,IAAI,CAAC;wBACf,IAAI;AACJ,wBAAA,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE;AAC3B,wBAAA,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;AAC3B,wBAAA,UAAU,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS;AACxD,wBAAA,YAAY,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;AACnE,qBAAA,CAAC;gBACN;gBACA,qBAAqB,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc;YACvE;iBAAO;;AAEH,gBAAA,MAAM,iBAAiB,GAAI,MAAc,CAAC,OAAO,EAAE,OAAO;AAC1D,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;AAClE,oBAAA,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE;AACjC,wBAAA,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;4BAAE;wBAC3B,aAAa,CAAC,IAAI,CAAC;4BACf,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,4BAAA,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE;AAClB,4BAAA,SAAS,EAAE,KAAK;AACnB,yBAAA,CAAC;oBACN;oBACA,qBAAqB,GAAG,cAAc;gBAC1C;YACJ;QACJ;AAAE,QAAA,MAAM,sBAAsB;;QAG9B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC;AAEnE,QAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,EAAE;IACnH;AACH;;ACxQD;;AAEG;MAOU,iBAAiB,CAAA;AAgF1B,IAAA,IAAc,iBAAiB,GAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB;IAClF;AACA,IAAA,IAAc,cAAc,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe;IACzE;AACA,IAAA,IAAc,iBAAiB,GAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB;IAClF;AACA,IAAA,IAAc,mBAAmB,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB;IACxF;AACA,IAAA,IAAc,cAAc,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe;IACzE;AACA,IAAA,IAAc,aAAa,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc;IACtE;AACA,IAAA,IAAc,gBAAgB,GAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe;IAC7E;aAgBwB,IAAA,CAAA,sBAAsB,GAAG,EAAH,CAAM;AAQpD,IAAA,WAAA,CAA6B,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;AA1G7B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAIlC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAW;AAG7C,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAW;AAG1C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAW;AAG7C,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,YAAY,EAAU;AAG9C,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAoB;AAGrD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAU;AAGzC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAU;;AAGxC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAqB;AAClD,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAqB;AACnD,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAqC;AACnE,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAsB;QAM/D,IAAA,CAAA,eAAe,GAAqB,QAAQ;QAE5C,IAAA,CAAA,WAAW,GAA2B,EAAE;QAExC,IAAA,CAAA,OAAO,GAAG,IAAI;QAEd,IAAA,CAAA,IAAI,GAAkB,EAAE;QACxB,IAAA,CAAA,WAAW,GAA8B,EAAE;QAC3C,IAAA,CAAA,YAAY,GAAG,CAAC;QACR,IAAA,CAAA,oBAAoB,GAAG,CAAC;QACxB,IAAA,CAAA,kBAAkB,GAAG,IAAI;QACzB,IAAA,CAAA,eAAe,GAAG,KAAK;QACvB,IAAA,CAAA,kBAAkB,GAAG,KAAK;QAC1B,IAAA,CAAA,eAAe,GAAG,GAAG;QACrB,IAAA,CAAA,cAAc,GAAG,GAAG;QACpB,IAAA,CAAA,SAAS,GAAG,CAAC;QACb,IAAA,CAAA,UAAU,GAAG,CAAC;AACd,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,qBAAqB,EAAE;AAC3C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AACtC,QAAA,IAAA,CAAA,YAAY,GAAiB;AACzB,YAAA,mBAAmB,EAAE,CAAC;AACtB,YAAA,iBAAiB,EAAE,CAAC;AACpB,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,qBAAqB,EAAE,MAAM;AAC7B,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,MAAM,EAAE,CAAC;SACZ;AAwBD,QAAA,IAAA,CAAA,WAAW,GAAmB;AAC1B,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,KAAK,EAAE,CAAC;SACX;QAED,IAAA,CAAA,YAAY,GAAG,KAAK;QACZ,IAAA,CAAA,eAAe,GAAG,CAAC;QACnB,IAAA,CAAA,sBAAsB,GAAG,CAAC;QAC1B,IAAA,CAAA,gBAAgB,GAAG,CAAC;QACpB,IAAA,CAAA,qBAAqB,GAAa,EAAE;QACpC,IAAA,CAAA,wBAAwB,GAAG,CAAC;QAI1B,IAAA,CAAA,cAAc,GAAW,MAAM;QAE/B,IAAA,CAAA,WAAW,GAAY,KAAK;IAIgB;IAEtD,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,eAAe,GAAG,iBAAiB,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,QAAQ;QAChF,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,EAAE;YAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;QAChD;QACA,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,IAAI,EAAE;YACnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW;QACtD;QACA,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,IAAI,CACtC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3B,CAAC,SAAS,CAAC,MAAM,IAAG;AACjB,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM;AAC9B,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC5B;AAGA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC1B,IAAI,CAAC,gBAAgB,EAAE;QAC3B;IACJ;IAGA,WAAW,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC1B,IAAI,CAAC,gBAAgB,EAAE;QAC3B;QACA,IAAI,CAAC,gBAAgB,EAAE;IAC3B;AAEA,IAAA,gBAAgB,CAAC,QAA0B,EAAA;AACvC,QAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;AAC/B,QAAA,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;IACtC;AAEA,IAAA,QAAQ,CAAC,MAAe,EAAA;AACpB,QAAA,IAAI,CAAC,kBAAkB,GAAG,MAAM;AAChC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAC9B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,cAAc,EAAE;QACzB;IACJ;AAEA,IAAA,mBAAmB,CAAC,MAAc,EAAA;;IAElC;;AAIA,IAAA,MAAM,CAAC,KAAc,EAAA;AACjB,QAAA,MAAM,IAAI,GAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE;AACvE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC9B,QAAA,MAAM,GAAG,GAAgB;AACrB,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,KAAK,EAAE,KAAK,IAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE;AACnC,YAAA,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,CAAC,IAAI,CAAC;SAChB;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AAC/B,QAAA,OAAO,KAAK;IAChB;AAEA,IAAA,QAAQ,CAAC,EAAU,EAAA;AACf,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE;QAElB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;AACpC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,YAAA,IAAI,CAAC,kBAAkB,EAAE,cAAc,EAAE;YACzC;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,EAAE,EAAE;AACjC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC3C;IACJ;AAEA,IAAA,SAAS,CAAC,EAAU,EAAA;AAChB,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;AAC9B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QACvC;QACA,UAAU,CAAC,MAAK;YACZ,IAAI,CAAC,mBAAmB,EAAE;AAC9B,QAAA,CAAC,CAAC;IACN;IAEA,YAAY,CAAC,MAAc,EAAE,GAAgB,EAAA;QACzC,OAAO,GAAG,CAAC,EAAE;IACjB;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,UAAU;AAC9B,QAAA,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS;AAAE,YAAA,OAAO,aAAa;AAC7D,QAAA,IAAI,MAAM,CAAC,iBAAiB,KAAK,OAAO;AAAE,YAAA,OAAO,WAAW;AAC5D,QAAA,OAAO,UAAU;IACrB;AAEA,IAAA,iBAAiB,CAAC,KAAa,EAAE,MAAc,EAAE,MAAiB,EAAA;QAC9D,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CACxC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3B,CAAC,SAAS,CAAC,MAAM,IAAG;AACjB,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,MAAM;AACpC,QAAA,CAAC,CAAC;IACN;IAEA,aAAa,CAAC,MAAc,EAAE,IAAkB,EAAA;QAC5C,OAAO,IAAI,CAAC,EAAE;IAClB;;AAIA,IAAA,WAAW,CAAC,GAAgB,EAAA;QACxB,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,GAAG,CAAC,SAAS,GAAG,IAAI;QACpB,UAAU,CAAC,MAAK;AACZ,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CACrD,mBAAmB,CACK;YAC5B,IAAI,KAAK,EAAE;gBACP,KAAK,CAAC,KAAK,EAAE;gBACb,KAAK,CAAC,MAAM,EAAE;YAClB;AACJ,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,gBAAgB,CAAC,GAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;IACzB;IAEA,YAAY,CAAC,GAAgB,EAAE,KAAa,EAAA;AACxC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;QAC5B,IAAI,OAAO,EAAE;AACT,YAAA,GAAG,CAAC,KAAK,GAAG,OAAO;QACvB;AACA,QAAA,GAAG,CAAC,SAAS,GAAG,KAAK;IACzB;IAEA,eAAe,CAAC,KAAoB,EAAE,GAAgB,EAAA;AAClD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACvB,IAAI,CAAC,YAAY,CAAC,GAAG,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACpE;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;AAC/B,YAAA,GAAG,CAAC,SAAS,GAAG,KAAK;QACzB;IACJ;IAEA,YAAY,CAAC,KAAiB,EAAE,GAAgB,EAAA;AAC5C,QAAA,IAAI,GAAG,CAAC,SAAS,EAAE;YACf,IAAI,CAAC,YAAY,CAAC,GAAG,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACpE;IACJ;;IAIA,gBAAgB,CAAC,KAAiB,EAAE,GAAgB,EAAA;QAChD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QAEvB,IAAI,CAAC,WAAW,GAAG;AACf,YAAA,OAAO,EAAE,IAAI;YACb,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,KAAK,EAAE,GAAG,CAAC,EAAE;SAChB;IACL;IAEA,gBAAgB,GAAA;AACZ,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;IAC9D;IAEA,iBAAiB,GAAA;AACb,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,GAAG,EAAE;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;QACzB;IACJ;IAEA,oBAAoB,GAAA;AAChB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACtD,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,SAAS,EAAE;YACX,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE;AAE5D,YAAA,MAAM,IAAI,GAAiB;AACvB,gBAAA,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE;AACrB,gBAAA,YAAY,EAAE,GAAG;gBACjB,QAAQ;aACX;AACD,YAAA,MAAM,GAAG,GAAgB;AACrB,gBAAA,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE;AACpB,gBAAA,KAAK,EAAE,CAAA,EAAG,SAAS,CAAC,KAAK,CAAA,OAAA,CAAS;AAClC,gBAAA,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,CAAC,IAAI,CAAC;aAChB;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;AAChD,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;AACzC,YAAA,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACnC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE;QAC/B;IACJ;IAEA,gBAAgB,GAAA;AACZ,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK;QACjC,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACrB;IAEA,sBAAsB,GAAA;AAClB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK;QACjC,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;AAC9B,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;IACnC;IAEA,0BAA0B,GAAA;AACtB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK;QACjC,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,mBAAmB,CAAC,EAAE;AAC3D,YAAA,IAAI,CAAC,oBAAoB,GAAG,EAAE;AAC9B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC;IACJ;IAEA,mBAAmB,GAAA;QACf,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AACd,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,kBAAkB,EAAE,cAAc,EAAE;IAC7C;;AAIA,IAAA,SAAS,CAAC,KAAc,EAAA;AACpB,QAAA,MAAM,WAAW,GAAG,KAAK,IAAI,IAAI,CAAC,mBAAmB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;AACrC,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;AAEnB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC,MAAM,OAAO,GAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE;AAC7D,QAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAEvB,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM;AACxC,QAAA,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AAEnC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACrD,QAAA,OAAO,MAAM;IACjB;AAEA,IAAA,SAAS,CAAC,MAAc,EAAA;AACpB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AACzB,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC;YACvD,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE;YAEhB,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;AACvB,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB;YACJ;;YAGA,IAAI,SAAS,GAAG,CAAC;AACjB,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;AACvB,gBAAA,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;AACrB,oBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE;AACjB,wBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE;AACpE,wBAAA,IAAI,MAAM;4BAAE,MAAM,CAAC,OAAO,EAAE;oBAChC;AACA,oBAAA,SAAS,EAAE;gBACf;YACJ;YAEA,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACxB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AAEnC,YAAA,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE;gBAC9B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;YACzE;YAEA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;YAClC,UAAU,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC5C;QACJ;IACJ;IAEA,qBAAqB,GAAA;AACjB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK;QACpC,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACzB;;AAIA,IAAA,iBAAiB,CACb,KAAiB,EACjB,KAAa,EACb,YAAoB,EAAA;QAEpB,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,GAAG;YAAE;AAEV,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,QAAA,IAAI,CAAC,sBAAsB,GAAG,YAAY;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO;AACrC,QAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC;QAEjE,MAAM,SAAS,GAAI,KAAK,CAAC,MAAsB,CAAC,OAAO,CACnD,2BAA2B,CAC9B;AACD,QAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS,GAAG,SAAS,CAAC,WAAW,GAAG,CAAC;QAErE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACpD;AAGA,IAAA,gBAAgB,CAAC,KAAiB,EAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QAExB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC;AAC9C,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB;QACpD,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,wBAAwB,IAAI,GAAG;AAE/D,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,sBAAsB;AACrC,QAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,sBAAsB;QAErD,IAAI,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,QAAQ;AACxD,QAAA,IAAI,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ;AAE7D,QAAA,IAAI,SAAS,GAAG,IAAI,EAAE;YAClB,SAAS,GAAG,IAAI;YAChB,UAAU;AACN,gBAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAC7B,oBAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC;AACjC,oBAAA,IAAI;QACZ;AACA,QAAA,IAAI,UAAU,GAAG,IAAI,EAAE;YACnB,UAAU,GAAG,IAAI;YACjB,SAAS;AACL,gBAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAC7B,oBAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC;AACjC,oBAAA,IAAI;QACZ;QAEA,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,SAAS;QACrC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,UAAU;IAC9C;IAGA,eAAe,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACvD;;IAIA,WAAW,CAAC,KAAa,EAAE,MAAc,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;AAC1B,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,KAAK,EAAE;AACpC,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QACtC;AACA,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD;;IAIA,IAAI,GAAA;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACf,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACvB;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,KAAK,CAAC;AAC5C,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACnB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;gBACvB,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,cAAc,EAAE;YACzB;QACJ;IACJ;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACzB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,YAAA,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,IAAI,CAAC;QAC/C;IACJ;IAEA,cAAc,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,IAAI,EAAE;QACf;aAAO;YACH,IAAI,CAAC,QAAQ,EAAE;QACnB;IACJ;IAEA,IAAI,GAAA;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,YAAA,IAAI,CAAC,kBAAkB,EAAE,YAAY,EAAE;QAC3C;IACJ;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,kBAAkB,EAAE,cAAc,EAAE;QAC7C;IACJ;IAEA,UAAU,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,MAAM,EAAE;QACjB;aAAO;YACH,IAAI,CAAC,IAAI,EAAE;QACf;IACJ;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACvB;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACzB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,YAAA,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,IAAI,CAAC;QAC/C;IACJ;IAEA,OAAO,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,KAAK,CAAC;QAChD;IACJ;IAEA,cAAc,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,OAAO,EAAE;QAClB;aAAO;YACH,IAAI,CAAC,QAAQ,EAAE;QACnB;IACJ;AAEA,IAAA,MAAM,CAAC,UAA+C,EAAA;AAClD,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE;AACjC,YAAA,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,MAAM;YACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC7C;AACA,QAAA,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK;YACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAC3C;AACA,QAAA,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,UAAU,CAAC;IACtD;AAEA,IAAA,WAAW,CAAC,GAAqB,EAAA;AAC7B,QAAA,IAAI,CAAC,eAAe,GAAG,GAAG;QAC1B,iBAAiB,CAAC,GAAG,CAAC;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;IACjC;IAEA,SAAS,CAAC,KAAa,EAAE,KAAa,EAAA;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAC/B,IAAI,GAAG,EAAE;AACL,YAAA,GAAG,CAAC,KAAK,GAAG,KAAK;QACrB;IACJ;AAEA,IAAA,SAAS,CAAC,MAAe,EAAA;AACrB,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,IAAI,CAAC,YAAY;QAChD,IAAI,SAAS,GAAG,CAAC;AACjB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AACzB,YAAA,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE;AAC1B,gBAAA,IAAI,IAAI,CAAC,EAAE,KAAK,YAAY,EAAE;oBAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE;oBAChD,OAAO,UAAU,GAAG,SAAS,CAAC,EAAE,SAAS,EAAE;gBAC/C;AACA,gBAAA,SAAS,EAAE;YACf;QACJ;AACA,QAAA,OAAO,SAAS;IACpB;IAEA,QAAQ,GAAA;QACJ,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,iBAAiB;YACjC,MAAM,EAAE,IAAI,CAAC,cAAc;YAC3B,SAAS,EAAE,IAAI,CAAC,iBAAiB;YACjC,QAAQ,EAAE,IAAI,CAAC,gBAAgB;YAC/B,MAAM,EAAE,IAAI,CAAC,cAAc;YAC3B,KAAK,EAAE,IAAI,CAAC,aAAa;YACzB,WAAW,EAAE,IAAI,CAAC,mBAAmB;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;AAC/B,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;gBACxB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;AAC1E,aAAA,CAAC,CAAC;SACN;IACL;;AAIQ,IAAA,OAAO,CAAC,EAAU,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IAC7C;AAEQ,IAAA,eAAe,CAAC,GAAgB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,SAAS;QAEzC,IAAI,SAAS,GAAG,CAAC;AACjB,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;AACvB,YAAA,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE;gBACzB,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;oBACjB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC;AACzD,oBAAA,OAAO,SAAS,EAAE,SAAS,EAAE;gBACjC;AACA,gBAAA,SAAS,EAAE;YACf;QACJ;AACA,QAAA,OAAO,SAAS;IACpB;IAEQ,gBAAgB,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;IACnD;IAEQ,mBAAmB,GAAA;QACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,YAAY,CAAC;IAC/D;IAEQ,SAAS,CAAC,KAAa,EAAE,MAAc,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;QAEzB,IAAI,SAAS,GAAG,CAAC;AACjB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AACzB,YAAA,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE;AAC1B,gBAAA,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE;oBACxC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC;oBACzD,SAAS,EAAE,KAAK,EAAE;oBAClB;gBACJ;AACA,gBAAA,SAAS,EAAE;YACf;QACJ;IACJ;AAEQ,IAAA,mBAAmB,CAAC,KAAqB,EAAA;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,CAAC;YAAE;AACjB,QAAA,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;IACnE;IAEQ,cAAc,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS;YAAE;;QAG9B,UAAU,CAAC,MAAK;YACZ,IAAI,CAAC,mBAAmB,EAAE;AAE1B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CACzD,qBAAqB,CACxB;AACD,YAAA,IAAI,CAAC,SAAS;gBAAE;AAEhB,YAAA,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,gBAAgB,CAAC,MAAK;gBAC3C,IAAI,CAAC,mBAAmB,EAAE;AAC9B,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE;AAClC,gBAAA,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE,CAAC,OAAO,CAAC;AAC7B,aAAA,CAAC;QACN,CAAC,EAAE,GAAG,CAAC;IACX;IAEQ,mBAAmB,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK;AACtC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE;AAChC,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK;AAChD,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC;IACpD;+GAzvBS,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAgDf,2BAA2B,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAExB,YAAY,gDChH9B,+nLAuJA,EAAA,MAAA,EAAA,CAAA,2xLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,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,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,2BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,aAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDzFa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACM,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,KAAK,YACP,WAAW,EAAA,QAAA,EAAA,+nLAAA,EAAA,MAAA,EAAA,CAAA,2xLAAA,CAAA,EAAA;+EAQZ,OAAO,EAAA,CAAA;sBAAf;gBAKQ,OAAO,EAAA,CAAA;sBAAf;gBAOQ,UAAU,EAAA,CAAA;sBAAlB;gBAES,OAAO,EAAA,CAAA;sBAAhB;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBACS,eAAe,EAAA,CAAA;sBAAxB;gBAEQ,MAAM,EAAA,CAAA;sBAAd;gBACS,YAAY,EAAA,CAAA;sBAArB;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBACS,eAAe,EAAA,CAAA;sBAAxB;gBAEQ,WAAW,EAAA,CAAA;sBAAnB;gBACS,iBAAiB,EAAA,CAAA;sBAA1B;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBAEQ,MAAM,EAAA,CAAA;sBAAd;gBACS,YAAY,EAAA,CAAA;sBAArB;gBAEQ,KAAK,EAAA,CAAA;sBAAb;gBACS,WAAW,EAAA,CAAA;sBAApB;gBAGS,UAAU,EAAA,CAAA;sBAAnB;gBACS,WAAW,EAAA,CAAA;sBAApB;gBACS,WAAW,EAAA,CAAA;sBAApB;gBACS,YAAY,EAAA,CAAA;sBAArB;gBAGD,kBAAkB,EAAA,CAAA;sBADjB,SAAS;uBAAC,2BAA2B;gBAEV,aAAa,EAAA,CAAA;sBAAxC,YAAY;uBAAC,YAAY;gBAmG1B,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBAQ1C,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,yBAAyB;gBAgUvC,gBAAgB,EAAA,CAAA;sBADf,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;gBAoC9C,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,kBAAkB;;;MEzjBvB,2BAA2B,CAAA;IACpC,IAAI,GAAA;;AAEA,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9D;AACH;;ACHD;;;;AAIG;AACI,MAAM,mBAAmB,GAAG,MAAiB;IAChD,OAAO;AACH,QAAA;AACI,YAAA,QAAQ,EAAE,2BAA2B;AACrC,YAAA,OAAO,EAAEC,2BAAc;AAC1B,SAAA;KACJ;AACL;;MCCa,SAAS,CAAA;+GAAT,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAT,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,iBARd,YAAY;YACZ,2BAA2B;AAC3B,YAAA,iBAAiB,CAAA,EAAA,OAAA,EAAA,CAEX,YAAY,CAAA,EAAA,OAAA,EAAA,CAEZ,iBAAiB,EAAE,YAAY,CAAA,EAAA,CAAA,CAAA;AAEhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,aAHP,CAAC,mBAAmB,EAAE,CAAC,YADxB,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAIb,SAAS,EAAA,UAAA,EAAA,CAAA;kBAVrB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,YAAY,EAAE;wBACV,YAAY;wBACZ,2BAA2B;wBAC3B,iBAAiB;AACpB,qBAAA;oBACD,OAAO,EAAE,CAAC,YAAY,CAAC;AACvB,oBAAA,SAAS,EAAE,CAAC,mBAAmB,EAAE,CAAC;AAClC,oBAAA,OAAO,EAAE,CAAC,iBAAiB,EAAE,YAAY,CAAC;AAC7C,iBAAA;;;ACZM,MAAM,kBAAkB,GAAG,CAC9B,KAAwB,EACxB,QAAmC,MACvB;AACZ,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,KAAK,EAAE,IAAI;AACd,CAAA;AAED;;AAEG;MACU,+BAA+B,GAAG,CAC3C,QAAmC,KACxB;IACX,QAAQ;AACR,IAAA,kBAAkB,CAAI,yBAAyB,EAAE,QAAQ,CAAC;;AAG9D;;;;AAIG;AACI,MAAM,wBAAwB,GAAG,CAAC,MAAkB,KAAgB;AACvE,IAAA,MAAM,SAAS,GAAe;AAC1B,QAAA;AACI,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,KAAK,EAAE,IAAI;AACd,SAAA;KACJ;AAED,IAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACnB,QAAA,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE;YACvC,SAAS,CAAC,IAAI,CAAC;AACX,gBAAA,OAAO,EAAE,yBAAyB;AAClC,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA,CAAC;QACN;IACJ;AAEA,IAAA,OAAO,SAAS;AACpB;;AChDA;;ACAA;;AAEG;;ACFH;;AAEG;;;;"}