@rolatech/angular-automation 20.2.6-beta.1 → 20.2.7-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rolatech-angular-automation.mjs","sources":["../../../../packages/angular-automation/src/lib/angular-automation/angular-automation.ts","../../../../packages/angular-automation/src/lib/angular-automation/angular-automation.html","../../../../packages/angular-automation/src/rolatech-angular-automation.ts"],"sourcesContent":["import { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'rolatech-angular-automation',\n imports: [],\n templateUrl: './angular-automation.html',\n styleUrl: './angular-automation.scss',\n encapsulation: ViewEncapsulation.None,\n})\nexport class AngularAutomation {}\n","<p>AngularAutomation works!</p>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MASa,iBAAiB,CAAA;uGAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,uFCT9B,mCACA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDQa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,OAAA,EAC9B,EAAE,EAAA,aAAA,EAGI,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,mCAAA,EAAA;;;AEPvC;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"rolatech-angular-automation.mjs","sources":["../../../../packages/angular-automation/src/lib/ui/automation-ui.util.ts","../../../../packages/angular-automation/src/lib/ui/track.util.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-index/automation-manage-index.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-index/automation-manage-index.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-detail/automation-manage-detail.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-detail/automation-manage-detail.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-definition-index/automation-manage-definition-index.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-definition-index/automation-manage-definition-index.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-definition-detail/automation-manage-definition-detail.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-definition-detail/automation-manage-definition-detail.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-execution-index/automation-manage-execution-index.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-execution-index/automation-manage-execution-index.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-execution-detail/automation-manage-execution-detail.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-execution-detail/automation-manage-execution-detail.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-execution-log/automation-manage-execution-log.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-execution-log/automation-manage-execution-log.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-schedule-index/automation-manage-schedule-index.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-schedule-index/automation-manage-schedule-index.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-schedule-detail/automation-manage-schedule-detail.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-schedule-detail/automation-manage-schedule-detail.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-definition-create/automation-manage-definition-create.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-definition-create/automation-manage-definition-create.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-schedule-create/automation-manage-schedule-create.ts","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage-schedule-create/automation-manage-schedule-create.html","../../../../packages/angular-automation/src/lib/pages/automation-manage/automation-manage.routes.ts","../../../../packages/angular-automation/src/lib/interfaces/automation.ts","../../../../packages/angular-automation/src/rolatech-angular-automation.ts"],"sourcesContent":["// angular-automation/src/lib/ui/automation-ui.util.ts\nexport function safeJsonPretty(input?: string | null): string {\n if (!input) return '';\n try {\n return JSON.stringify(JSON.parse(input), null, 2);\n } catch {\n return input; // already text\n }\n}\n\nexport function isoToLocal(iso?: string | null): string {\n if (!iso) return '—';\n const d = new Date(iso);\n return isNaN(d.getTime()) ? String(iso) : d.toLocaleString();\n}\n\nexport function badgeClass(status?: string | null): string {\n switch ((status ?? '').toUpperCase()) {\n case 'SUCCEEDED':\n return 'rt-badge rt-badge-success';\n case 'FAILED':\n return 'rt-badge rt-badge-danger';\n case 'RUNNING':\n return 'rt-badge rt-badge-info';\n case 'QUEUED':\n return 'rt-badge rt-badge-warn';\n case 'CANCEL_REQUESTED':\n case 'CANCELLED':\n return 'rt-badge rt-badge-muted';\n default:\n return 'rt-badge rt-badge-muted';\n }\n}\n","export function trackByValue(index: number, item: { value?: string | null }): string {\n const v = (item?.value ?? '').trim();\n return v ? v : `idx:${index}`;\n}\n\nexport function trackByStableId<T extends { id?: string | null }>(index: number, item: T): string {\n const id = (item?.id ?? '').trim();\n return id ? id : `idx:${index}`;\n}\n\nexport function trackByCode(index: number, item: { code?: string | null }): string {\n const c = (item?.code ?? '').trim();\n return c ? c : `idx:${index}`;\n}\n","import { Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport {\n AutomationDefinitionDto,\n AutomationExecutionDto,\n AutomationScheduleDto,\n AutomationService,\n} from '@rolatech/angular-services';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterLink } from '@angular/router';\nimport { forkJoin } from 'rxjs';\nimport { isoToLocal, badgeClass } from '../../../ui/automation-ui.util';\nimport { trackByStableId } from '../../../ui/track.util';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'rolatech-automation-manage-index',\n imports: [RouterLink, MatButtonModule],\n templateUrl: './automation-manage-index.html',\n styleUrl: './automation-manage-index.scss',\n})\nexport class AutomationManageIndex {\n private readonly svc = inject(AutomationService);\n private readonly destroyRef = inject(DestroyRef);\n\n loading = signal(true);\n\n definitions = signal<AutomationDefinitionDto[]>([]);\n schedules = signal<AutomationScheduleDto[]>([]);\n executions = signal<AutomationExecutionDto[]>([]);\n\n isoToLocal = isoToLocal;\n badgeClass = badgeClass;\n trackByStableId = trackByStableId;\n\n constructor() {\n this.load();\n }\n\n load() {\n this.loading.set(true);\n\n forkJoin({\n defs: this.svc.listDefinitions({ page: 1, limit: 50 } as any),\n sch: this.svc.listSchedules({ page: 1, limit: 50 } as any),\n exe: this.svc.listExecutions({ page: 1, limit: 20, sort: 'queuedAt desc' } as any),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: ({ defs, sch, exe }) => {\n this.definitions.set(defs.data ?? []);\n this.schedules.set(sch.data ?? []);\n this.executions.set(exe.data ?? []);\n this.loading.set(false);\n },\n error: () => {\n this.definitions.set([]);\n this.schedules.set([]);\n this.executions.set([]);\n this.loading.set(false);\n },\n });\n }\n\n // --- computed helpers (cards) ---\n defCount = computed(() => this.definitions().length);\n defEnabledCount = computed(() => this.definitions().filter((d) => !!d.enabled).length);\n defLastUpdated = computed(() => {\n const d = [...this.definitions()]\n .filter((x) => x.updatedAt)\n .sort((a, b) => String(b.updatedAt).localeCompare(String(a.updatedAt)))[0];\n return d?.updatedAt ?? '—';\n });\n defHint = computed(() => {\n const d = this.definitions()[0];\n return d ? `Latest: ${d.code} → ${d.handlerKey}` : 'Create a definition to wire a Spring handler bean.';\n });\n\n scheduleCount = computed(() => this.schedules().length);\n scheduleEnabledCount = computed(() => this.schedules().filter((s) => !!s.enabled).length);\n nextRunLabel = computed(() => {\n const s = [...this.schedules()]\n .filter((x) => !!x.nextRunAt)\n .sort((a, b) => String(a.nextRunAt).localeCompare(String(b.nextRunAt)))[0];\n return s?.nextRunAt ? isoToLocal(s.nextRunAt) : '—';\n });\n scheduleHint = computed(() => {\n const s = this.schedules()[0];\n return s ? `Example: ${s.name} (${s.schedule})` : 'Create schedules to run definitions automatically.';\n });\n\n execCount = computed(() => this.executions().length);\n execRunningCount = computed(() => this.executions().filter((e) => (e.status ?? '').toUpperCase() === 'RUNNING').length);\n execQueuedCount = computed(() => this.executions().filter((e) => (e.status ?? '').toUpperCase() === 'QUEUED').length);\n execFailedCount = computed(() => this.executions().filter((e) => (e.status ?? '').toUpperCase() === 'FAILED').length);\n execSucceededCount = computed(() => this.executions().filter((e) => (e.status ?? '').toUpperCase() === 'SUCCEEDED').length);\n\n execLastUpdated = computed(() => {\n const e = [...this.executions()]\n .filter((x) => x.queuedAt || x.createdAt)\n .sort((a, b) => String(b.queuedAt ?? b.createdAt ?? '').localeCompare(String(a.queuedAt ?? a.createdAt ?? '')))[0];\n return e?.queuedAt ? isoToLocal(e.queuedAt) : (e?.createdAt ?? '—');\n });\n\n execHint = computed(() => {\n const e = this.executions()[0];\n return e ? `Latest: ${e.definitionCode ?? e.definitionId} • ${e.status}` : 'Trigger a run from a definition/schedule.';\n });\n\n recentExecutions = computed(() => {\n // already requested 20, keep top 8\n return (this.executions() ?? []).slice(0, 8);\n });\n\n progressPct(e: AutomationExecutionDto) {\n const total = e.total ?? 0;\n const done = e.processed ?? 0;\n if (!total) return 0;\n return Math.max(0, Math.min(100, Math.round((done / total) * 100)));\n }\n}\n","<div class=\"p-6 space-y-6 rt-page\">\n <!-- Header -->\n <div class=\"flex items-start justify-between gap-4\">\n <div>\n <div class=\"flex items-center gap-3\">\n <div class=\"h-11 w-11 rounded-2xl rt-soft grid place-items-center text-sm font-semibold\">A</div>\n <div>\n <h1 class=\"text-2xl font-semibold leading-tight\">Automation Center</h1>\n <p class=\"text-sm rt-muted\">Manage definitions, schedules, and executions (run history + logs).</p>\n </div>\n </div>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <button mat-stroked-button class=\"rt-btn rt-btn-ghost\" (click)=\"load()\">Refresh</button>\n\n <a mat-flat-button class=\"rt-btn rt-btn-primary\" routerLink=\"executions\"> View executions </a>\n </div>\n </div>\n\n <!-- Top cards -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <!-- Definitions -->\n <a routerLink=\"definitions\" class=\"group rounded-2xl rt-panel p-4 hover:shadow-lg transition\">\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"text-sm font-medium\">Definitions</div>\n <div class=\"text-xs rt-muted\">Handlers + default input JSON</div>\n </div>\n <div class=\"h-9 w-9 rounded-xl rt-soft grid place-items-center group-hover:shadow-sm transition\">⚙️</div>\n </div>\n\n <div class=\"mt-4 flex items-end justify-between\">\n <div class=\"text-3xl font-semibold\">{{ defCount() }}</div>\n <div class=\"text-xs rt-muted text-right\">\n Enabled: <span class=\"font-medium rt-strong\">{{ defEnabledCount() }}</span>\n </div>\n </div>\n\n <div class=\"mt-3 text-xs rt-muted\">\n Last updated:\n <span class=\"rt-strong font-medium\">{{ defLastUpdated() }}</span>\n </div>\n\n <div class=\"mt-3 text-xs rt-muted line-clamp-2\">{{ defHint() }}</div>\n </a>\n\n <!-- Schedules -->\n <a routerLink=\"schedules\" class=\"group rounded-2xl rt-panel p-4 hover:shadow-lg transition\">\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"text-sm font-medium\">Schedules</div>\n <div class=\"text-xs rt-muted\">Cron presets + next run times</div>\n </div>\n <div class=\"h-9 w-9 rounded-xl rt-soft grid place-items-center group-hover:shadow-sm transition\">🗓️</div>\n </div>\n\n <div class=\"mt-4 flex items-end justify-between\">\n <div class=\"text-3xl font-semibold\">{{ scheduleCount() }}</div>\n <div class=\"text-xs rt-muted text-right\">\n Enabled: <span class=\"font-medium rt-strong\">{{ scheduleEnabledCount() }}</span>\n </div>\n </div>\n\n <div class=\"mt-3 text-xs rt-muted\">\n Next run:\n <span class=\"rt-strong font-medium\">{{ nextRunLabel() }}</span>\n </div>\n\n <div class=\"mt-3 text-xs rt-muted line-clamp-2\">{{ scheduleHint() }}</div>\n </a>\n\n <!-- Executions -->\n <a routerLink=\"executions\" class=\"group rounded-2xl rt-panel p-4 hover:shadow-lg transition\">\n <div class=\"flex items-start justify-between\">\n <div>\n <div class=\"text-sm font-medium\">Executions</div>\n <div class=\"text-xs rt-muted\">Run history + progress</div>\n </div>\n <div class=\"h-9 w-9 rounded-xl rt-soft grid place-items-center group-hover:shadow-sm transition\">🚀</div>\n </div>\n\n <div class=\"mt-4 flex items-end justify-between\">\n <div class=\"text-3xl font-semibold\">{{ execCount() }}</div>\n <div class=\"text-xs rt-muted text-right\">\n Running: <span class=\"font-medium rt-strong\">{{ execRunningCount() }}</span>\n </div>\n </div>\n\n <div class=\"mt-3 text-xs rt-muted\">\n Latest:\n <span class=\"rt-strong font-medium\">{{ execLastUpdated() }}</span>\n </div>\n\n <div class=\"mt-3 text-xs rt-muted line-clamp-2\">{{ execHint() }}</div>\n </a>\n </div>\n\n <!-- Recent executions -->\n <div class=\"rounded-2xl rt-panel overflow-hidden\">\n <div class=\"p-4 flex items-center justify-between\">\n <div>\n <div class=\"text-sm font-medium\">Recent executions</div>\n <div class=\"text-xs rt-muted\">Latest runs (best-effort order: newest first)</div>\n </div>\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"executions\"> Open list </a>\n </div>\n\n <div class=\"overflow-auto\">\n <table class=\"min-w-[980px] w-full text-sm rt-table\">\n <thead>\n <tr>\n <th class=\"text-left p-3\">Status</th>\n <th class=\"text-left p-3\">Definition</th>\n <th class=\"text-left p-3\">Progress</th>\n <th class=\"text-left p-3\">Queued</th>\n <th class=\"text-left p-3\">Finished</th>\n <th class=\"text-right p-3\">Action</th>\n </tr>\n </thead>\n\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">Loading...</td>\n </tr>\n } @else { @for (e of recentExecutions(); track trackByStableId($index, e)) {\n <tr>\n <td class=\"p-3\">\n <span [class]=\"badgeClass(e.status)\"> {{ e.status }} </span>\n </td>\n\n <td class=\"p-3 font-mono text-xs\">{{ e.definitionCode ?? e.definitionId }}</td>\n\n <td class=\"p-3\">\n <div class=\"text-xs rt-muted\">{{ e.processed }} / {{ e.total }}</div>\n <div class=\"rt-progress mt-1\">\n <div class=\"bar\" [style.width.%]=\"progressPct(e)\"></div>\n </div>\n </td>\n\n <td class=\"p-3 rt-muted\">{{ isoToLocal(e.queuedAt) }}</td>\n <td class=\"p-3 rt-muted\">{{ isoToLocal(e.finishedAt) }}</td>\n\n <td class=\"p-3 text-right\">\n <a class=\"rt-btn rt-btn-ghost\" [routerLink]=\"['executions', e.id]\"> Open </a>\n </td>\n </tr>\n } @if (recentExecutions().length === 0) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">No executions found.</td>\n </tr>\n } }\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Bottom quick actions -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"rounded-2xl rt-panel p-4\">\n <div class=\"text-sm font-medium\">Quick actions</div>\n <div class=\"text-xs rt-muted mt-1\">Common admin tasks</div>\n\n <div class=\"mt-4 flex flex-wrap gap-2\">\n <a class=\"rt-btn rt-btn-primary\" routerLink=\"definitions/create\"> Create definition </a>\n <a class=\"rt-btn\" routerLink=\"schedules/create\"> Create schedule </a>\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"executions\"> View run history </a>\n </div>\n </div>\n\n <div class=\"rounded-2xl rt-panel p-4\">\n <div class=\"text-sm font-medium\">Health</div>\n <div class=\"text-xs rt-muted mt-1\">High-level snapshot</div>\n\n <div class=\"mt-4 grid grid-cols-3 gap-3 text-sm\">\n <div class=\"rounded-xl rt-soft p-3\">\n <div class=\"text-xs rt-muted\">Queued</div>\n <div class=\"text-lg font-semibold\">{{ execQueuedCount() }}</div>\n </div>\n\n <div class=\"rounded-xl rt-soft p-3\">\n <div class=\"text-xs rt-muted\">Failed</div>\n <div class=\"text-lg font-semibold\">{{ execFailedCount() }}</div>\n </div>\n\n <div class=\"rounded-xl rt-soft p-3\">\n <div class=\"text-xs rt-muted\">Succeeded</div>\n <div class=\"text-lg font-semibold\">{{ execSucceededCount() }}</div>\n </div>\n </div>\n\n <div class=\"mt-3 text-xs rt-muted\">\n Tip: open an execution and use <span class=\"font-medium rt-strong\">Logs</span> for real-time troubleshooting.\n </div>\n </div>\n </div>\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterLink, ActivatedRoute, Router } from '@angular/router';\nimport { AutomationService } from '@rolatech/angular-services';\nimport { switchMap, of, catchError } from 'rxjs';\n\n@Component({\n selector: 'rolatech-automation-manage-detail',\n imports: [RouterLink],\n templateUrl: './automation-manage-detail.html',\n styleUrl: './automation-manage-detail.scss',\n})\nexport class AutomationManageDetail {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly svc = inject(AutomationService);\n private readonly destroyRef = inject(DestroyRef);\n\n loading = signal(true);\n\n id() {\n return this.route.snapshot.params['id'];\n }\n\n constructor() {\n const id = this.id();\n\n // Try definition -> schedule -> execution (fast + safe)\n this.svc\n .getDefinition(id)\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n switchMap((d) => {\n this.router.navigate(['/automations/definitions', d.id]);\n return of(true);\n }),\n catchError(() =>\n this.svc.getSchedule(id).pipe(\n switchMap((s) => {\n this.router.navigate(['/automations/schedules', s.id]);\n return of(true);\n }),\n catchError(() =>\n this.svc.getExecution(id).pipe(\n switchMap((e) => {\n this.router.navigate(['/automations/executions', e.id]);\n return of(true);\n }),\n catchError(() => of(false)),\n ),\n ),\n ),\n ),\n )\n .subscribe((ok) => {\n this.loading.set(false);\n });\n }\n}\n","<div class=\"p-6 max-w-2xl space-y-4 rt-page\">\n <h1 class=\"text-xl font-semibold\">Open Automation</h1>\n\n @if (loading()) {\n <div class=\"text-sm rt-muted\">Detecting resource type…</div>\n } @else {\n <div class=\"rounded-2xl rt-panel p-4 space-y-3\">\n <div class=\"text-sm rt-muted\">\n Could not resolve id <span class=\"font-mono text-xs\">{{ id() }}</span> as a Definition / Schedule / Execution.\n </div>\n <div class=\"flex gap-2\">\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"/automations/definitions\">Definitions</a>\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"/automations/schedules\">Schedules</a>\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"/automations/executions\">Executions</a>\n </div>\n </div>\n }\n</div>\n","import { Component, computed, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { RouterLink } from '@angular/router';\nimport { AutomationService, AutomationDefinitionDto } from '@rolatech/angular-services';\n\n@Component({\n selector: 'rolatech-automation-manage-definition-index',\n imports: [RouterLink, MatButtonModule],\n templateUrl: './automation-manage-definition-index.html',\n styleUrl: './automation-manage-definition-index.scss',\n})\nexport class AutomationManageDefinitionIndex {\n private readonly svc = inject(AutomationService);\n private readonly destroyRef = inject(DestroyRef);\n\n loading = signal(true);\n items = signal<AutomationDefinitionDto[]>([]);\n q = signal('');\n\n filtered = computed(() => {\n const qq = this.q().trim().toLowerCase();\n if (!qq) return this.items();\n return this.items().filter((d) => (d.code + ' ' + d.name).toLowerCase().includes(qq));\n });\n\n constructor() {\n this.load();\n }\n\n load() {\n this.loading.set(true);\n this.svc\n .listDefinitions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (res: any) => {\n this.items.set(res.data ?? []);\n this.loading.set(false);\n },\n error: () => {\n this.items.set([]);\n this.loading.set(false);\n },\n });\n }\n}\n","<div class=\"p-6 space-y-4 rt-page\">\n <div class=\"flex items-center justify-between gap-3\">\n <div>\n <h1 class=\"text-xl font-semibold\">Definitions</h1>\n <p class=\"text-sm rt-muted\">Create and maintain automation definitions.</p>\n </div>\n\n <div class=\"flex gap-2\">\n <a mat-stroked-button class=\"rt-btn rt-btn-ghost\" routerLink=\"/automations\">Back</a>\n <a mat-flat-button class=\"rt-btn rt-btn-primary\" routerLink=\"create\">Create</a>\n </div>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <input\n class=\"w-full max-w-md rt-input\"\n placeholder=\"Search code/name...\"\n [value]=\"q()\"\n (input)=\"q.set(($any($event.target).value ?? '').toString())\"\n />\n <button class=\"rt-btn rt-btn-ghost\" (click)=\"load()\">Refresh</button>\n </div>\n\n <div class=\"rounded-2xl rt-panel overflow-hidden\">\n <div class=\"overflow-auto\">\n <table class=\"min-w-[900px] w-full text-sm rt-table\">\n <thead>\n <tr>\n <th class=\"text-left p-3\">Code</th>\n <th class=\"text-left p-3\">Name</th>\n <th class=\"text-left p-3\">Handler</th>\n <th class=\"text-left p-3\">Enabled</th>\n <th class=\"text-left p-3\">Updated</th>\n <th class=\"text-right p-3\">Action</th>\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">Loading...</td>\n </tr>\n } @else { @for (d of filtered(); track d.id) {\n <tr>\n <td class=\"p-3 font-mono text-xs\">{{ d.code }}</td>\n <td class=\"p-3\">{{ d.name }}</td>\n <td class=\"p-3 font-mono text-xs\">{{ d.handlerKey }}</td>\n <td class=\"p-3\">\n <span class=\"rt-badge\" [class]=\"d.enabled ? 'rt-badge-success' : 'rt-badge-muted'\">\n {{ d.enabled ? 'Enabled' : 'Disabled' }}\n </span>\n </td>\n <td class=\"p-3 rt-muted\">{{ d.updatedAt ?? '—' }}</td>\n <td class=\"p-3 text-right\">\n <a class=\"rt-btn rt-btn-ghost\" [routerLink]=\"[d.id]\">Open</a>\n </td>\n </tr>\n } @if (!filtered().length) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">No definitions.</td>\n </tr>\n } }\n </tbody>\n </table>\n </div>\n </div>\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';\nimport { RouterLink, ActivatedRoute } from '@angular/router';\nimport { AutomationService, AutomationDefinitionDto, UpdateDefinitionRequest } from '@rolatech/angular-services';\nimport { safeJsonPretty } from '../../../ui/automation-ui.util';\n\n@Component({\n selector: 'rolatech-automation-manage-definition-detail',\n imports: [RouterLink, ReactiveFormsModule],\n templateUrl: './automation-manage-definition-detail.html',\n styleUrl: './automation-manage-definition-detail.scss',\n})\nexport class AutomationManageDefinitionDetail {\n private readonly svc = inject(AutomationService);\n private readonly route = inject(ActivatedRoute);\n private readonly fb = inject(FormBuilder);\n private readonly destroyRef = inject(DestroyRef);\n\n loading = signal(true);\n saving = signal(false);\n error = signal<string | null>(null);\n\n item = signal<AutomationDefinitionDto | null>(null);\n prettyDefaultJson = signal('');\n\n form = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(200)]],\n description: [''],\n handlerKey: ['', [Validators.required, Validators.maxLength(200)]],\n defaultInputJson: [''],\n enabled: [true],\n });\n\n constructor() {\n const id = this.route.snapshot.params['id'];\n this.load(id);\n }\n\n load(id: string) {\n this.loading.set(true);\n this.svc\n .getDefinition(id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (res: any) => {\n this.item.set(res.data);\n this.form.patchValue({\n name: res.data.name,\n description: res.data.description ?? '',\n handlerKey: res.data.handlerKey,\n defaultInputJson: res.data.defaultInputJson ?? '',\n enabled: res.data.enabled,\n });\n this.prettyDefaultJson.set(safeJsonPretty(res.data.defaultInputJson));\n this.loading.set(false);\n },\n error: (e) => {\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n this.loading.set(false);\n },\n });\n }\n\n save() {\n const d = this.item();\n if (!d || this.form.invalid) return;\n\n const req: UpdateDefinitionRequest = {\n name: this.form.value.name ?? d.name,\n description: this.form.value.description ?? null,\n handlerKey: this.form.value.handlerKey ?? d.handlerKey,\n defaultInputJson: this.form.value.defaultInputJson ?? null,\n enabled: !!this.form.value.enabled,\n };\n\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .updateDefinition(d.id, req)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (updated) => {\n this.item.set(updated);\n this.prettyDefaultJson.set(safeJsonPretty(updated.defaultInputJson));\n this.saving.set(false);\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n\n disable() {\n const d = this.item();\n if (!d) return;\n\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .deleteDefinition(d.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n // reload\n this.load(d.id);\n this.saving.set(false);\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n}\n","<div class=\"p-6 max-w-4xl space-y-4 rt-page\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h1 class=\"text-xl font-semibold\">Definition</h1>\n <p class=\"text-sm rt-muted\">{{ item()?.code ?? '—' }}</p>\n </div>\n\n <div class=\"flex gap-2\">\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"../\">Back</a>\n <button class=\"rt-btn rt-btn-danger\" (click)=\"disable()\" [disabled]=\"saving() || !item()\">Disable</button>\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"text-sm rt-muted\">Loading...</div>\n } @else {\n <form class=\"rounded-2xl rt-panel p-4 space-y-4\" [formGroup]=\"form\" (ngSubmit)=\"save()\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n <label class=\"space-y-1\">\n <div class=\"text-sm font-medium\">Code</div>\n <input class=\"w-full rt-input font-mono text-sm\" [value]=\"item()?.code\" disabled />\n </label>\n <label class=\"space-y-1\">\n <div class=\"text-sm font-medium\">Name</div>\n <input class=\"w-full rt-input\" formControlName=\"name\" />\n </label>\n </div>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Handler Key</div>\n <input class=\"w-full rt-input font-mono text-sm\" formControlName=\"handlerKey\" />\n </label>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Description</div>\n <textarea class=\"w-full rt-input min-h-[80px]\" formControlName=\"description\"></textarea>\n </label>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Default Input JSON</div>\n <textarea class=\"w-full rt-input font-mono text-xs min-h-[160px]\" formControlName=\"defaultInputJson\"></textarea>\n </label>\n\n <div class=\"flex items-center justify-between\">\n <label class=\"flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" class=\"rounded\" formControlName=\"enabled\" />\n Enabled\n </label>\n\n <button class=\"rt-btn rt-btn-primary\" [disabled]=\"form.invalid || saving()\">{{ saving() ? 'Saving…' : 'Save' }}</button>\n </div>\n\n @if (error()) {\n <div class=\"text-sm rt-alert-danger\">{{ error() }}</div>\n }\n </form>\n\n <div class=\"rounded-2xl rt-panel p-4\">\n <div class=\"text-sm font-medium mb-2\">Preview: Default Input JSON</div>\n <pre class=\"text-xs rt-soft rounded-xl p-3 overflow-auto\">{{ prettyDefaultJson() }}</pre>\n </div>\n }\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterLink } from '@angular/router';\nimport { AutomationService, AutomationExecutionDto } from '@rolatech/angular-services';\nimport { badgeClass, isoToLocal } from '../../../ui/automation-ui.util';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'rolatech-automation-manage-execution-index',\n imports: [RouterLink, MatButtonModule],\n templateUrl: './automation-manage-execution-index.html',\n styleUrl: './automation-manage-execution-index.scss',\n})\nexport class AutomationManageExecutionIndex {\n private readonly svc = inject(AutomationService);\n private readonly destroyRef = inject(DestroyRef);\n\n loading = signal(true);\n items = signal<AutomationExecutionDto[]>([]);\n\n badgeClass = badgeClass;\n isoToLocal = isoToLocal;\n\n constructor() {\n this.load();\n }\n\n progressPct(e: AutomationExecutionDto) {\n const total = e.total ?? 0;\n const done = e.processed ?? 0;\n if (!total) return 0;\n return Math.max(0, Math.min(100, Math.round((done / total) * 100)));\n }\n\n load() {\n this.loading.set(true);\n this.svc\n .listExecutions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (res: any) => {\n this.items.set(res.data ?? []);\n this.loading.set(false);\n },\n error: () => {\n this.items.set([]);\n this.loading.set(false);\n },\n });\n }\n}\n","<div class=\"p-6 space-y-4 rt-page\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h1 class=\"text-xl font-semibold\">Executions</h1>\n <p class=\"text-sm rt-muted\">Review job runs, progress and errors.</p>\n </div>\n <div class=\"flex gap-2\">\n <a mat-stroked-button class=\"rt-btn rt-btn-ghost\" routerLink=\"/automations\">Back</a>\n <button mat-stroked-button class=\"rt-btn rt-btn-ghost\" (click)=\"load()\">Refresh</button>\n </div>\n </div>\n\n <div class=\"rounded-2xl rt-panel overflow-hidden\">\n <div class=\"overflow-auto\">\n <table class=\"min-w-[1000px] w-full text-sm rt-table\">\n <thead>\n <tr>\n <th class=\"text-left p-3\">Status</th>\n <th class=\"text-left p-3\">Definition</th>\n <th class=\"text-left p-3\">Progress</th>\n <th class=\"text-left p-3\">Queued</th>\n <th class=\"text-left p-3\">Finished</th>\n <th class=\"text-right p-3\">Action</th>\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">Loading...</td>\n </tr>\n } @else { @for (e of items(); track e.id) {\n <tr>\n <td class=\"p-3\">\n <span [class]=\"badgeClass(e.status)\"> {{ e.status }} </span>\n </td>\n <td class=\"p-3 font-mono text-xs\">{{ e.definitionCode ?? e.definitionId }}</td>\n <td class=\"p-3\">\n <div class=\"text-xs rt-muted\">{{ e.processed }} / {{ e.total }}</div>\n <div class=\"rt-progress mt-1\">\n <div class=\"bar\" [style.width.%]=\"progressPct(e)\"></div>\n </div>\n </td>\n <td class=\"p-3 rt-muted\">{{ isoToLocal(e.queuedAt) }}</td>\n <td class=\"p-3 rt-muted\">{{ isoToLocal(e.finishedAt) }}</td>\n <td class=\"p-3 text-right\">\n <a class=\"rt-btn rt-btn-ghost\" [routerLink]=\"[e.id]\">Open</a>\n </td>\n </tr>\n } @if (!items().length) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">No executions.</td>\n </tr>\n } }\n </tbody>\n </table>\n </div>\n </div>\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterLink, ActivatedRoute } from '@angular/router';\nimport { AutomationService, AutomationExecutionDto } from '@rolatech/angular-services';\nimport { badgeClass, isoToLocal, safeJsonPretty } from '../../../ui/automation-ui.util';\n\n@Component({\n selector: 'rolatech-automation-manage-execution-detail',\n imports: [RouterLink],\n templateUrl: './automation-manage-execution-detail.html',\n styleUrl: './automation-manage-execution-detail.scss',\n})\nexport class AutomationManageExecutionDetail {\n private readonly svc = inject(AutomationService);\n private readonly route = inject(ActivatedRoute);\n private readonly destroyRef = inject(DestroyRef);\n\n badgeClass = badgeClass;\n isoToLocal = isoToLocal;\n\n loading = signal(true);\n saving = signal(false);\n error = signal<string | null>(null);\n\n item = signal<AutomationExecutionDto | null>(null);\n inputPretty = signal('');\n\n constructor() {\n this.load();\n }\n\n private id() {\n return this.route.snapshot.params['id'];\n }\n\n canCancel() {\n const s = (this.item()?.status ?? '').toUpperCase();\n return s === 'QUEUED' || s === 'RUNNING';\n }\n\n progressPct() {\n const e = this.item();\n const total = e?.total ?? 0;\n const done = e?.processed ?? 0;\n if (!total) return 0;\n return Math.max(0, Math.min(100, Math.round((done / total) * 100)));\n }\n\n load() {\n this.loading.set(true);\n this.error.set(null);\n this.svc\n .getExecution(this.id())\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (e: any) => {\n this.item.set(e.data);\n this.inputPretty.set(safeJsonPretty(e.data.inputJson));\n this.loading.set(false);\n },\n error: (err) => {\n this.error.set(String(err?.error?.message ?? err?.message ?? err));\n this.loading.set(false);\n },\n });\n }\n\n cancel() {\n if (!this.canCancel()) return;\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .cancelExecution(this.id())\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.saving.set(false);\n this.load();\n },\n error: (err) => {\n this.saving.set(false);\n this.error.set(String(err?.error?.message ?? err?.message ?? err));\n },\n });\n }\n}\n","<div class=\"p-6 max-w-5xl space-y-4 rt-page\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h1 class=\"text-xl font-semibold\">Execution</h1>\n <div class=\"text-sm rt-muted font-mono\">{{ item()?.id ?? '—' }}</div>\n </div>\n <div class=\"flex gap-2\">\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"../\">Back</a>\n <a class=\"rt-btn rt-btn-ghost\" [routerLink]=\"['log']\">Logs</a>\n <button class=\"rt-btn rt-btn-danger\" (click)=\"cancel()\" [disabled]=\"saving() || !canCancel()\">Cancel</button>\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"text-sm rt-muted\">Loading...</div>\n } @else {\n <div class=\"grid grid-cols-1 lg:grid-cols-3 gap-4\">\n <div class=\"lg:col-span-2 rounded-2xl rt-panel p-4 space-y-4\">\n <div class=\"flex items-center justify-between\">\n <span [class]=\"badgeClass(item()?.status)\">{{ item()?.status }}</span>\n <button class=\"rt-btn rt-btn-ghost\" (click)=\"load()\">Refresh</button>\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm\">\n <div>\n <div class=\"text-xs rt-muted\">Definition</div>\n <div class=\"font-mono text-xs\">{{ item()?.definitionCode ?? item()?.definitionId }}</div>\n </div>\n <div>\n <div class=\"text-xs rt-muted\">Schedule</div>\n <div class=\"font-mono text-xs\">{{ item()?.scheduleId ?? '—' }}</div>\n </div>\n <div>\n <div class=\"text-xs rt-muted\">Queued</div>\n <div>{{ isoToLocal(item()?.queuedAt) }}</div>\n </div>\n <div>\n <div class=\"text-xs rt-muted\">Started</div>\n <div>{{ isoToLocal(item()?.startedAt) }}</div>\n </div>\n <div>\n <div class=\"text-xs rt-muted\">Finished</div>\n <div>{{ isoToLocal(item()?.finishedAt) }}</div>\n </div>\n <div>\n <div class=\"text-xs rt-muted\">Idempotency</div>\n <div class=\"font-mono text-xs\">{{ item()?.idempotencyKey ?? '—' }}</div>\n </div>\n </div>\n\n <div>\n <div class=\"text-xs rt-muted mb-1\">Progress</div>\n <div class=\"text-sm\">{{ item()?.processed ?? 0 }} / {{ item()?.total ?? 0 }}</div>\n <div class=\"rt-progress mt-1\">\n <div class=\"bar\" [style.width.%]=\"progressPct()\"></div>\n </div>\n </div>\n\n @if (item()?.errorMessage) {\n <div class=\"text-sm rt-alert-danger whitespace-pre-wrap\">{{ item()?.errorMessage }}</div>\n }\n </div>\n\n <div class=\"rounded-2xl rt-panel p-4 space-y-3\">\n <div class=\"text-sm font-medium\">Input JSON</div>\n <pre class=\"text-xs rt-soft rounded-xl p-3 overflow-auto\">{{ inputPretty() }}</pre>\n @if (error()) {\n <div class=\"text-sm rt-alert-danger\">{{ error() }}</div>\n }\n </div>\n </div>\n }\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterLink, ActivatedRoute } from '@angular/router';\nimport { AutomationService, ExecutionLogDto } from '@rolatech/angular-services';\nimport { isoToLocal } from '../../../ui/automation-ui.util';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'rolatech-automation-manage-execution-log',\n imports: [RouterLink, MatButtonModule],\n templateUrl: './automation-manage-execution-log.html',\n styleUrl: './automation-manage-execution-log.scss',\n})\nexport class AutomationManageExecutionLog {\n private readonly svc = inject(AutomationService);\n private readonly route = inject(ActivatedRoute);\n private readonly destroyRef = inject(DestroyRef);\n\n isoToLocal = isoToLocal;\n\n loading = signal(true);\n logs = signal<ExecutionLogDto[]>([]);\n\n id() {\n return this.route.snapshot.params['id'];\n }\n\n constructor() {\n this.load();\n }\n\n levelClass(level?: string | null) {\n switch ((level ?? '').toUpperCase()) {\n case 'ERROR':\n return 'rt-badge rt-badge-danger';\n case 'WARN':\n return 'rt-badge rt-badge-warn';\n case 'DEBUG':\n return 'rt-badge rt-badge-muted';\n default:\n return 'rt-badge rt-badge-info';\n }\n }\n\n load() {\n this.loading.set(true);\n this.svc\n .listExecutionLogs(this.id(), { limit: 200 })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (res: any) => {\n this.logs.set(res.data ?? []);\n this.loading.set(false);\n },\n error: () => {\n this.logs.set([]);\n this.loading.set(false);\n },\n });\n }\n}\n","<div class=\"p-6 space-y-4 rt-page\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h1 class=\"text-xl font-semibold\">Execution Logs</h1>\n <div class=\"text-sm rt-muted font-mono\">{{ id() }}</div>\n </div>\n <div class=\"flex gap-2\">\n <a mat-stroked-button class=\"rt-btn rt-btn-ghost\" routerLink=\"../\">Back</a>\n <button mat-stroked-button class=\"rt-btn rt-btn-ghost\" (click)=\"load()\">Refresh</button>\n </div>\n </div>\n\n <div class=\"rounded-2xl rt-panel overflow-hidden\">\n @if (loading()) {\n <div class=\"p-4 text-sm rt-muted\">Loading...</div>\n } @else {\n <div class=\"divide-y divide-[color:var(--rt-outline,rgba(0,0,0,0.08))]\">\n @for (l of logs(); track l.id) {\n <div class=\"p-4\">\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex items-center gap-2\">\n <span [class]=\"levelClass(l.level)\"> {{ l.level }} </span>\n <span class=\"text-xs rt-muted\">{{ isoToLocal(l.createdAt) }}</span>\n </div>\n <span class=\"text-xs rt-quiet font-mono\">{{ l.id }}</span>\n </div>\n <pre class=\"mt-2 text-xs rt-soft rounded-xl p-3 overflow-auto whitespace-pre-wrap\">{{ l.message }}</pre>\n </div>\n } @if (!logs().length) {\n <div class=\"p-4 text-sm rt-muted\">No logs.</div>\n }\n </div>\n }\n </div>\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterLink } from '@angular/router';\nimport { AutomationService, AutomationScheduleDto, ScheduleOptionResponse } from '@rolatech/angular-services';\nimport { isoToLocal } from '../../../ui/automation-ui.util';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'rolatech-automation-manage-schedule-index',\n imports: [RouterLink, MatButtonModule],\n templateUrl: './automation-manage-schedule-index.html',\n styleUrl: './automation-manage-schedule-index.scss',\n})\nexport class AutomationManageScheduleIndex {\n private readonly svc = inject(AutomationService);\n private readonly destroyRef = inject(DestroyRef);\n\n loading = signal(true);\n items = signal<AutomationScheduleDto[]>([]);\n options = signal<ScheduleOptionResponse[]>([]);\n\n isoToLocal = isoToLocal;\n\n constructor() {\n this.loadOptions();\n this.load();\n }\n\n loadOptions() {\n this.svc\n .scheduleOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: (o) => this.options.set(o ?? []), error: () => this.options.set([]) });\n }\n\n scheduleLabel(value: string) {\n const m = this.options().find((x) => x.value === value);\n return m ? `${m.label} — ${m.description}` : '';\n }\n\n load() {\n this.loading.set(true);\n this.svc\n .listSchedules()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (res: any) => {\n this.items.set(res.data ?? []);\n this.loading.set(false);\n },\n error: () => {\n this.items.set([]);\n this.loading.set(false);\n },\n });\n }\n}\n","<div class=\"p-6 space-y-4 rt-page\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h1 class=\"text-xl font-semibold\">Schedules</h1>\n <p class=\"text-sm rt-muted\">Enable/disable schedules and review next runs.</p>\n </div>\n <div class=\"flex gap-2\">\n <a mat-stroked-button class=\"rt-btn rt-btn-ghost\" routerLink=\"/automations\">Back</a>\n <button mat-stroked-button class=\"rt-btn rt-btn-ghost\" (click)=\"load()\">Refresh</button>\n <a mat-flat-button class=\"rt-btn rt-btn-primary\" routerLink=\"create\">Create</a>\n </div>\n </div>\n\n <div class=\"rounded-2xl rt-panel overflow-hidden\">\n <div class=\"overflow-auto\">\n <table class=\"min-w-[980px] w-full text-sm rt-table\">\n <thead>\n <tr>\n <th class=\"text-left p-3\">Name</th>\n <th class=\"text-left p-3\">Definition</th>\n <th class=\"text-left p-3\">Schedule</th>\n <th class=\"text-left p-3\">Enabled</th>\n <th class=\"text-left p-3\">Next Run</th>\n <th class=\"text-right p-3\">Action</th>\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">Loading...</td>\n </tr>\n } @else { @for (s of items(); track s.id) {\n <tr>\n <td class=\"p-3\">{{ s.name }}</td>\n <td class=\"p-3 font-mono text-xs\">{{ s.definitionCode ?? s.definitionId }}</td>\n <td class=\"p-3\">\n <div class=\"font-mono text-xs\">{{ s.schedule }}</div>\n <div class=\"text-xs rt-muted\">{{ scheduleLabel(s.schedule) }}</div>\n </td>\n <td class=\"p-3\">\n <span class=\"rt-badge\" [class]=\"s.enabled ? 'rt-badge-success' : 'rt-badge-muted'\">\n {{ s.enabled ? 'Enabled' : 'Disabled' }}\n </span>\n </td>\n <td class=\"p-3 rt-muted\">{{ isoToLocal(s.nextRunAt) }}</td>\n <td class=\"p-3 text-right\">\n <a class=\"rt-btn rt-btn-ghost\" [routerLink]=\"[s.id]\">Open</a>\n </td>\n </tr>\n } @if (!items().length) {\n <tr>\n <td class=\"p-3 rt-muted\" colspan=\"6\">No schedules.</td>\n </tr>\n } }\n </tbody>\n </table>\n </div>\n </div>\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { RouterLink, ActivatedRoute, Router } from '@angular/router';\nimport {\n AutomationService,\n AutomationScheduleDto,\n ScheduleOptionResponse,\n UpdateScheduleRequest,\n} from '@rolatech/angular-services';\nimport { isoToLocal, safeJsonPretty } from '../../../ui/automation-ui.util';\nimport { trackByCode, trackByStableId, trackByValue } from '../../../ui/track.util';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'rolatech-automation-manage-schedule-detail',\n imports: [RouterLink, ReactiveFormsModule, MatFormFieldModule, MatSelectModule, MatButtonModule, MatCheckboxModule],\n templateUrl: './automation-manage-schedule-detail.html',\n styleUrl: './automation-manage-schedule-detail.scss',\n})\nexport class AutomationManageScheduleDetail {\n private readonly svc = inject(AutomationService);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly fb = inject(FormBuilder);\n private readonly destroyRef = inject(DestroyRef);\n\n isoToLocal = isoToLocal;\n trackByCode = trackByCode;\n trackByStableId = trackByStableId;\n\n loading = signal(true);\n saving = signal(false);\n error = signal<string | null>(null);\n\n item = signal<AutomationScheduleDto | null>(null);\n options = signal<ScheduleOptionResponse[]>([]);\n jsonPreview = signal('');\n\n // ✅ IMPORTANT: don’t use [disabled] in template. disable control here if needed.\n form = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(200)]],\n schedule: this.fb.control<string>({ value: '', disabled: true }, { validators: [Validators.required] }),\n inputJson: [''],\n enabled: [true],\n });\n\n /** compareWith for strings (works even if values become non-string later) */\n compareSchedule = (a: unknown, b: unknown) => String(a ?? '') === String(b ?? '');\n\n constructor() {\n const id = this.route.snapshot.params['id'];\n this.loadOptions();\n this.load(id);\n }\n\n loadOptions() {\n this.svc\n .scheduleOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (list) => {\n this.options.set(list ?? []);\n\n // enable schedule control once options exist\n if ((list?.length ?? 0) > 0) {\n this.form.controls.schedule.enable({ emitEvent: false });\n }\n },\n error: () => {\n this.options.set([]);\n this.form.controls.schedule.disable({ emitEvent: false });\n },\n });\n }\n\n scheduleDesc() {\n const code = String(this.form.controls.schedule.value ?? '').trim();\n const m = this.options().find((x) => x.code === code);\n return m ? m.description : '';\n }\n\n load(id: string) {\n this.loading.set(true);\n this.error.set(null);\n\n this.svc\n .getSchedule(id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (s) => {\n console.log(s);\n this.item.set(s);\n\n // patch values\n this.form.patchValue(\n {\n name: s.name,\n schedule: s.schedule, // ✅ string like \"EVERY_5_MINUTES\"\n inputJson: s.inputJson ?? '',\n enabled: s.enabled,\n },\n { emitEvent: false },\n );\n\n // if options not loaded yet, keep disabled; when options arrive, enabled\n this.jsonPreview.set(safeJsonPretty(s.inputJson));\n this.loading.set(false);\n },\n error: (e) => {\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n this.loading.set(false);\n },\n });\n }\n\n save() {\n const s = this.item();\n if (!s || this.form.invalid) return;\n\n const req: UpdateScheduleRequest = {\n name: this.form.value.name ?? s.name,\n schedule: (this.form.value.schedule as any) ?? s.schedule,\n inputJson: this.form.value.inputJson ?? null,\n enabled: !!this.form.value.enabled,\n };\n\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .updateSchedule(s.id, req)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (updated) => {\n this.item.set(updated);\n this.jsonPreview.set(safeJsonPretty(updated.inputJson));\n this.saving.set(false);\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n\n toggle(enable: boolean) {\n const s = this.item();\n if (!s) return;\n\n this.saving.set(true);\n this.error.set(null);\n\n const call$ = enable ? this.svc.enableSchedule(s.id) : this.svc.disableSchedule(s.id);\n call$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (updated) => {\n this.item.set(updated);\n this.form.patchValue({ enabled: updated.enabled }, { emitEvent: false });\n this.saving.set(false);\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n\n runNow() {\n const s = this.item();\n if (!s?.definitionCode) return;\n\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .runNowBySchedule(s.id, s.definitionCode, this.form.value.inputJson ?? s.inputJson ?? null)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (exec) => {\n this.saving.set(false);\n this.router.navigate(['/automations/executions', exec.id]);\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n\n remove() {\n const s = this.item();\n if (!s) return;\n\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .deleteSchedule(s.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n this.saving.set(false);\n this.router.navigate(['/automations/schedules']);\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n}\n","<div class=\"p-6 max-w-5xl space-y-4 rt-page\">\n <div class=\"flex items-center justify-between gap-3\">\n <div>\n <h1 class=\"text-xl font-semibold\">Schedule</h1>\n <p class=\"text-sm rt-muted\">{{ item()?.name ?? '—' }}</p>\n </div>\n\n <div class=\"flex gap-2\">\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"../\">Back</a>\n\n <button\n mat-stroked-button\n class=\"rt-btn rt-btn-primary\"\n (click)=\"runNow()\"\n [disabled]=\"saving() || !item()?.definitionCode\"\n >\n Run now\n </button>\n\n <button mat-stroked-button class=\"rt-btn rt-btn-danger\" (click)=\"remove()\" [disabled]=\"saving() || !item()\">\n Delete\n </button>\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"text-sm rt-muted\">Loading...</div>\n } @else {\n <div class=\"grid grid-cols-1 lg:grid-cols-3 gap-4\">\n <!-- Form -->\n <div class=\"lg:col-span-2 rounded-2xl rt-panel p-4 space-y-4\">\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" class=\"space-y-4\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n <div>\n <div class=\"text-xs rt-muted\">Definition</div>\n <div class=\"font-mono text-xs\">{{ item()?.definitionCode ?? item()?.definitionId }}</div>\n </div>\n <div>\n <div class=\"text-xs rt-muted\">Schedule ID</div>\n <div class=\"font-mono text-xs\">{{ item()?.id }}</div>\n </div>\n </div>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Name</div>\n <input class=\"w-full rt-input\" formControlName=\"name\" />\n </label>\n\n <!-- ✅ mat-select, value = o.code -->\n <mat-form-field appearance=\"fill\" class=\"w-full\">\n <mat-label>Schedule</mat-label>\n\n <mat-select formControlName=\"schedule\">\n @for (o of options(); track trackByCode($index, o)) {\n <mat-option [value]=\"o.code\">\n <span class=\"text-sm\"> {{ o.label }}</span>\n </mat-option>\n }\n </mat-select>\n\n <mat-hint>{{ scheduleDesc() }}</mat-hint>\n\n @if (form.controls.schedule.invalid && form.controls.schedule.touched) {\n <mat-error>Schedule is required</mat-error>\n }\n </mat-form-field>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Input JSON</div>\n <textarea class=\"w-full rt-input font-mono text-xs min-h-[160px]\" formControlName=\"inputJson\"></textarea>\n </label>\n\n <mat-checkbox formControlName=\"enabled\">Enabled</mat-checkbox>\n\n <div class=\"flex items-center justify-end gap-2\">\n <button\n mat-stroked-button\n class=\"rt-btn rt-btn-ghost\"\n (click)=\"toggle(false)\"\n type=\"button\"\n [disabled]=\"saving() || !item()?.enabled\"\n >\n Disable\n </button>\n <button\n mat-stroked-button\n class=\"rt-btn rt-btn-primary\"\n (click)=\"toggle(true)\"\n type=\"button\"\n [disabled]=\"saving() || !!item()?.enabled\"\n >\n Enable\n </button>\n <button mat-flat-button class=\"rt-btn rt-btn-primary\" [disabled]=\"form.invalid || saving()\">\n {{ saving() ? 'Saving…' : 'Save' }}\n </button>\n </div>\n\n @if (error()) {\n <div class=\"text-sm rt-alert-danger\">{{ error() }}</div>\n }\n </form>\n </div>\n\n <!-- Side info -->\n <div class=\"rounded-2xl rt-panel p-4 space-y-3\">\n <div>\n <div class=\"text-xs rt-muted\">Next run</div>\n <div class=\"text-sm\">{{ isoToLocal(item()?.nextRunAt) }}</div>\n </div>\n <div>\n <div class=\"text-xs rt-muted\">Last run</div>\n <div class=\"text-sm\">{{ isoToLocal(item()?.lastRunAt) }}</div>\n </div>\n\n <div class=\"pt-2\">\n <div class=\"text-sm font-medium mb-1\">Input JSON (preview)</div>\n <pre class=\"text-xs rt-soft rounded-xl p-3 overflow-auto\">{{ jsonPreview() }}</pre>\n </div>\n </div>\n </div>\n }\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { AutomationService, CreateDefinitionRequest } from '@rolatech/angular-services';\n\n@Component({\n selector: 'rolatech-automation-manage-definition-create',\n imports: [RouterLink, ReactiveFormsModule],\n templateUrl: './automation-manage-definition-create.html',\n styleUrl: './automation-manage-definition-create.scss',\n})\nexport class AutomationManageDefinitionCreate {\n private readonly svc = inject(AutomationService);\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n\n saving = signal(false);\n error = signal<string | null>(null);\n\n form = this.fb.group({\n code: ['', [Validators.required, Validators.maxLength(120)]],\n name: ['', [Validators.required, Validators.maxLength(200)]],\n description: [''],\n handlerKey: ['', [Validators.required, Validators.maxLength(200)]],\n defaultInputJson: [''],\n enabled: [true],\n });\n\n submit() {\n if (this.form.invalid) return;\n\n const req: CreateDefinitionRequest = {\n code: this.form.value.code!,\n name: this.form.value.name!,\n description: this.form.value.description ?? null,\n handlerKey: this.form.value.handlerKey!,\n defaultInputJson: this.form.value.defaultInputJson ?? null,\n enabled: !!this.form.value.enabled,\n };\n\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .createDefinition(req)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (dto) => {\n this.saving.set(false);\n this.router.navigate(['../', dto.id], { relativeTo: undefined as any });\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n}\n","<div class=\"p-6 max-w-3xl space-y-4 rt-page\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h1 class=\"text-xl font-semibold\">Create Definition</h1>\n <p class=\"text-sm rt-muted\">Define a handler and default input JSON.</p>\n </div>\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"../\">Back</a>\n </div>\n\n <form class=\"rounded-2xl rt-panel p-4 space-y-4\" [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n <label class=\"space-y-1\">\n <div class=\"text-sm font-medium\">Code</div>\n <input class=\"w-full rt-input font-mono text-sm\" formControlName=\"code\" placeholder=\"PROPERTY_ALTO_SYNC\" />\n </label>\n\n <label class=\"space-y-1\">\n <div class=\"text-sm font-medium\">Name</div>\n <input class=\"w-full rt-input\" formControlName=\"name\" placeholder=\"Alto Sync\" />\n </label>\n </div>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Handler Key (Spring bean name)</div>\n <input class=\"w-full rt-input font-mono text-sm\" formControlName=\"handlerKey\" placeholder=\"altoSyncAutomationHandler\" />\n </label>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Description</div>\n <textarea class=\"w-full rt-input min-h-[80px]\" formControlName=\"description\"></textarea>\n </label>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Default Input JSON</div>\n <textarea\n class=\"w-full rt-input font-mono text-xs min-h-[160px]\"\n formControlName=\"defaultInputJson\"\n placeholder='{\"dryRun\":false}'\n ></textarea>\n </label>\n\n <div class=\"flex items-center justify-between\">\n <label class=\"flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" class=\"rounded\" formControlName=\"enabled\" />\n Enabled\n </label>\n\n <button class=\"rt-btn rt-btn-primary\" [disabled]=\"form.invalid || saving()\">{{ saving() ? 'Saving…' : 'Create' }}</button>\n </div>\n\n @if (error()) {\n <div class=\"text-sm rt-alert-danger\">{{ error() }}</div>\n }\n </form>\n</div>\n","import { Component, DestroyRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport {\n AutomationService,\n AutomationDefinitionDto,\n ScheduleOptionResponse,\n CreateScheduleRequest,\n} from '@rolatech/angular-services';\nimport { trackByStableId, trackByValue } from '../../../ui/track.util';\n\n@Component({\n selector: 'rolatech-automation-manage-schedule-create',\n imports: [RouterLink, ReactiveFormsModule],\n templateUrl: './automation-manage-schedule-create.html',\n styleUrl: './automation-manage-schedule-create.scss',\n})\nexport class AutomationManageScheduleCreate {\n private readonly svc = inject(AutomationService);\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n\n trackByStableId = trackByStableId;\n trackByValue = trackByValue;\n\n saving = signal(false);\n error = signal<string | null>(null);\n\n definitions = signal<AutomationDefinitionDto[]>([]);\n options = signal<ScheduleOptionResponse[]>([]);\n\n form = this.fb.group({\n definitionId: ['', Validators.required],\n name: ['', [Validators.required, Validators.maxLength(200)]],\n schedule: ['', Validators.required],\n inputJson: [''],\n enabled: [true],\n });\n\n constructor() {\n this.loadDefinitions();\n this.loadOptions();\n }\n\n loadDefinitions() {\n this.svc\n .listDefinitions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: (d) => this.definitions.set(d.data ?? []), error: () => this.definitions.set([]) });\n }\n\n loadOptions() {\n this.svc\n .scheduleOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: (o) => this.options.set(o ?? []), error: () => this.options.set([]) });\n }\n\n scheduleDesc() {\n const v = this.form.value.schedule ?? '';\n const m = this.options().find((x) => x.value === v);\n return m ? m.description : '';\n }\n\n submit() {\n if (this.form.invalid) return;\n\n const req: CreateScheduleRequest = {\n definitionId: this.form.value.definitionId!,\n name: this.form.value.name!,\n schedule: this.form.value.schedule as any,\n inputJson: this.form.value.inputJson ?? null,\n enabled: !!this.form.value.enabled,\n };\n\n this.saving.set(true);\n this.error.set(null);\n\n this.svc\n .createSchedule(req)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (created) => {\n this.saving.set(false);\n this.router.navigate(['/automations/schedules', created.id]);\n },\n error: (e) => {\n this.saving.set(false);\n this.error.set(String(e?.error?.message ?? e?.message ?? e));\n },\n });\n }\n}\n","<div class=\"p-6 max-w-3xl space-y-4 rt-page\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h1 class=\"text-xl font-semibold\">Create Schedule</h1>\n <p class=\"text-sm rt-muted\">Attach a definition to a schedule cadence.</p>\n </div>\n <a class=\"rt-btn rt-btn-ghost\" routerLink=\"../\">Back</a>\n </div>\n\n <form class=\"rounded-2xl rt-panel p-4 space-y-4\" [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Definition</div>\n <select class=\"w-full rt-input font-mono text-sm\" formControlName=\"definitionId\">\n <option value=\"\" disabled>Select a definition</option>\n @for (d of definitions(); track trackByStableId($index, d)) {\n <option [value]=\"d.id\">{{ d.code }} — {{ d.name }}</option>\n }\n </select>\n </label>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Schedule name</div>\n <input class=\"w-full rt-input\" formControlName=\"name\" placeholder=\"Daily Alto Sync\" />\n </label>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Cron option</div>\n <select class=\"w-full rt-input font-mono text-sm\" formControlName=\"schedule\">\n <option value=\"\" disabled>Select schedule</option>\n @for (o of options(); track trackByValue($index, o)) {\n <option [value]=\"o.value\">{{ o.value }} — {{ o.label }}</option>\n }\n </select>\n <div class=\"text-xs rt-muted mt-1\">{{ scheduleDesc() }}</div>\n </label>\n\n <label class=\"space-y-1 block\">\n <div class=\"text-sm font-medium\">Input JSON (override)</div>\n <textarea\n class=\"w-full rt-input font-mono text-xs min-h-[160px]\"\n formControlName=\"inputJson\"\n placeholder='{\"dryRun\":false}'\n ></textarea>\n </label>\n\n <div class=\"flex items-center justify-between\">\n <label class=\"flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" class=\"rounded\" formControlName=\"enabled\" />\n Enabled\n </label>\n\n <button class=\"rt-btn rt-btn-primary\" [disabled]=\"form.invalid || saving()\">{{ saving() ? 'Saving…' : 'Create' }}</button>\n </div>\n\n @if (error()) {\n <div class=\"text-sm rt-alert-danger\">{{ error() }}</div>\n }\n </form>\n</div>\n","import { Routes } from '@angular/router';\nimport { AutomationManageIndex } from './automation-manage-index/automation-manage-index';\nimport { AutomationManageDetail } from './automation-manage-detail/automation-manage-detail';\nimport { AutomationManageDefinitionIndex } from './automation-manage-definition-index/automation-manage-definition-index';\nimport { AutomationManageDefinitionDetail } from './automation-manage-definition-detail/automation-manage-definition-detail';\nimport { AutomationManageExecutionIndex } from './automation-manage-execution-index/automation-manage-execution-index';\nimport { AutomationManageExecutionDetail } from './automation-manage-execution-detail/automation-manage-execution-detail';\nimport { AutomationManageExecutionLog } from './automation-manage-execution-log/automation-manage-execution-log';\nimport { AutomationManageScheduleIndex } from './automation-manage-schedule-index/automation-manage-schedule-index';\nimport { AutomationManageScheduleDetail } from './automation-manage-schedule-detail/automation-manage-schedule-detail';\nimport { AutomationManageDefinitionCreate } from './automation-manage-definition-create/automation-manage-definition-create';\nimport { AutomationManageScheduleCreate } from './automation-manage-schedule-create/automation-manage-schedule-create';\n\nexport const automationManageRoutes: Routes = [\n { path: '', component: AutomationManageIndex },\n\n { path: 'definitions', component: AutomationManageDefinitionIndex },\n { path: 'definitions/create', component: AutomationManageDefinitionCreate },\n { path: 'definitions/:id', component: AutomationManageDefinitionDetail },\n\n { path: 'schedules', component: AutomationManageScheduleIndex },\n { path: 'schedules/create', component: AutomationManageScheduleCreate },\n { path: 'schedules/:id', component: AutomationManageScheduleDetail },\n\n { path: 'executions', component: AutomationManageExecutionIndex },\n { path: 'executions/:id', component: AutomationManageExecutionDetail },\n { path: 'executions/:id/log', component: AutomationManageExecutionLog },\n\n { path: ':id', component: AutomationManageDetail },\n];\n","// angular-automation/src/lib/models/automation.models.ts\n\n/** Mirrors AbstractBaseEntity (common fields in your backend). */\nexport interface BaseEntity {\n id: string;\n createdAt?: string; // ISO string, e.g. \"2025-12-25T10:30:00Z\"\n updatedAt?: string; // ISO string\n version?: number;\n}\n\n/** ---- Enums ---- */\n\nexport type AutomationExecutionStatus = 'QUEUED' | 'RUNNING' | 'SUCCEEDED' | 'FAILED' | 'CANCELLED'; // keep if your backend has it; remove if not\n\nexport type AutomationLogLevel = 'INFO' | 'WARN' | 'ERROR' | 'DEBUG';\n\nexport type ScheduleCron = 'EVERY_5_MINUTES' | 'EVERY_15_MINUTES' | 'HOURLY' | 'DAILY' | 'WEEKLY';\n\n/** ---- Entities ---- */\n\nexport interface AutomationDefinition extends BaseEntity {\n code: string; // unique, e.g. \"PROPERTY_ALTO_SYNC\"\n name: string;\n description?: string | null;\n handlerKey: string; // Spring bean name, e.g. \"altoSyncAutomationHandler\"\n defaultInputJson?: string | null; // raw JSON string from backend\n enabled: boolean;\n}\n\nexport interface AutomationExecution extends BaseEntity {\n definitionId: string;\n scheduleId?: string | null;\n\n status: AutomationExecutionStatus;\n\n queuedAt?: string | null; // Instant -> ISO string\n startedAt?: string | null;\n finishedAt?: string | null;\n\n processed: number;\n total: number;\n\n lastSeq: number;\n\n inputJson?: string | null; // raw JSON string\n metadata?: Record<string, any> | null; // Map<String,Object> (json)\n idempotencyKey?: string | null;\n\n errorMessage?: string | null;\n}\n\nexport interface AutomationSchedule extends BaseEntity {\n definitionId: string;\n\n name: string;\n\n schedule: ScheduleCron;\n\n inputJson?: string | null; // raw JSON string override/extra config per schedule\n\n enabled: boolean;\n\n nextRunAt?: string | null; // Instant -> ISO string\n lastRunAt?: string | null;\n}\n\nexport interface AutomationExecutionLog extends BaseEntity {\n executionId: string;\n level: AutomationLogLevel;\n message: string;\n}\n\n/** ---- Optional: enum metadata for UI (label/description) ---- */\n\nexport interface ScheduleCronMeta {\n value: ScheduleCron;\n label: string;\n description: string;\n}\n\nexport const SCHEDULE_CRON_META: readonly ScheduleCronMeta[] = [\n { value: 'EVERY_5_MINUTES', label: 'Every 5 minutes', description: 'Runs every 5 minutes' },\n { value: 'EVERY_15_MINUTES', label: 'Every 15 minutes', description: 'Runs every 15 minutes' },\n { value: 'HOURLY', label: 'Hourly', description: 'Runs once per hour' },\n { value: 'DAILY', label: 'Daily', description: 'Runs once per day' },\n { value: 'WEEKLY', label: 'Weekly', description: 'Runs once per week' },\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AACM,SAAU,cAAc,CAAC,KAAqB,EAAA;AAClD,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;AACrB,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD;AAAE,IAAA,MAAM;QACN,OAAO,KAAK,CAAC;IACf;AACF;AAEM,SAAU,UAAU,CAAC,GAAmB,EAAA;AAC5C,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG;AACpB,IAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACvB,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE;AAC9D;AAEM,SAAU,UAAU,CAAC,MAAsB,EAAA;IAC/C,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,WAAW,EAAE;AAClC,QAAA,KAAK,WAAW;AACd,YAAA,OAAO,2BAA2B;AACpC,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,0BAA0B;AACnC,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,wBAAwB;AACjC,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,wBAAwB;AACjC,QAAA,KAAK,kBAAkB;AACvB,QAAA,KAAK,WAAW;AACd,YAAA,OAAO,yBAAyB;AAClC,QAAA;AACE,YAAA,OAAO,yBAAyB;;AAEtC;;AChCM,SAAU,YAAY,CAAC,KAAa,EAAE,IAA+B,EAAA;AACzE,IAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE;AAC/B;AAEM,SAAU,eAAe,CAAmC,KAAa,EAAE,IAAO,EAAA;AACtF,IAAA,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE;IAClC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE;AACjC;AAEM,SAAU,WAAW,CAAC,KAAa,EAAE,IAA8B,EAAA;AACvE,IAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;IACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE;AAC/B;;MCOa,qBAAqB,CAAA;AACf,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AAEtB,IAAA,WAAW,GAAG,MAAM,CAA4B,EAAE,uDAAC;AACnD,IAAA,SAAS,GAAG,MAAM,CAA0B,EAAE,qDAAC;AAC/C,IAAA,UAAU,GAAG,MAAM,CAA2B,EAAE,sDAAC;IAEjD,UAAU,GAAG,UAAU;IACvB,UAAU,GAAG,UAAU;IACvB,eAAe,GAAG,eAAe;AAEjC,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,EAAE;IACb;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEtB,QAAA,QAAQ,CAAC;AACP,YAAA,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAS,CAAC;AAC7D,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAS,CAAC;YAC1D,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAS,CAAC;SACnF;AACE,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAI;gBAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AACnC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;;AAGA,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,oDAAC;IACpD,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACtF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;aAC7B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;AACzB,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,QAAA,OAAO,CAAC,EAAE,SAAS,IAAI,GAAG;AAC5B,IAAA,CAAC,0DAAC;AACF,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC/B,QAAA,OAAO,CAAC,GAAG,CAAA,QAAA,EAAW,CAAC,CAAC,IAAI,CAAA,GAAA,EAAM,CAAC,CAAC,UAAU,CAAA,CAAE,GAAG,oDAAoD;AACzG,IAAA,CAAC,mDAAC;AAEF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,yDAAC;IACvD,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACzF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;aAC3B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;AAC3B,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,QAAA,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG;AACrD,IAAA,CAAC,wDAAC;AACF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC7B,QAAA,OAAO,CAAC,GAAG,CAAA,SAAA,EAAY,CAAC,CAAC,IAAI,CAAA,EAAA,EAAK,CAAC,CAAC,QAAQ,CAAA,CAAA,CAAG,GAAG,oDAAoD;AACxG,IAAA,CAAC,wDAAC;AAEF,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,qDAAC;AACpD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC,CAAC,MAAM,4DAAC;AACvH,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,QAAQ,CAAC,CAAC,MAAM,2DAAC;AACrH,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,QAAQ,CAAC,CAAC,MAAM,2DAAC;AACrH,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,WAAW,CAAC,CAAC,MAAM,8DAAC;AAE3H,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;AAC5B,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS;AACvC,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpH,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC;AACrE,IAAA,CAAC,2DAAC;AAEF,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,CAAA,GAAA,EAAM,CAAC,CAAC,MAAM,EAAE,GAAG,2CAA2C;AACxH,IAAA,CAAC,oDAAC;AAEF,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;;AAE/B,QAAA,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9C,IAAA,CAAC,4DAAC;AAEF,IAAA,WAAW,CAAC,CAAyB,EAAA;AACnC,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;AAC1B,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;IACrE;uGAlGW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBlC,s1PAsMA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtLY,UAAU,mOAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI1B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kCAAkC,EAAA,OAAA,EACnC,CAAC,UAAU,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,s1PAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEJ3B,sBAAsB,CAAA;AAChB,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;IAEtB,EAAE,GAAA;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;IACzC;AAEA,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;;AAGpB,QAAA,IAAI,CAAC;aACF,aAAa,CAAC,EAAE;AAChB,aAAA,IAAI,CACH,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EACnC,SAAS,CAAC,CAAC,CAAC,KAAI;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACxD,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,EACF,UAAU,CAAC,MACT,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAC3B,SAAS,CAAC,CAAC,CAAC,KAAI;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACtD,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,EACF,UAAU,CAAC,MACT,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAC5B,SAAS,CAAC,CAAC,CAAC,KAAI;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACvD,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,QAAA,CAAC,CAAC,EACF,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAC5B,CACF,CACF,CACF;AAEF,aAAA,SAAS,CAAC,CAAC,EAAE,KAAI;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,CAAC,CAAC;IACN;uGA7CW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZnC,uxBAkBA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVY,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIT,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;+BACE,mCAAmC,EAAA,OAAA,EACpC,CAAC,UAAU,CAAC,EAAA,QAAA,EAAA,uxBAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEIV,+BAA+B,CAAA;AACzB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAA4B,EAAE,iDAAC;AAC7C,IAAA,CAAC,GAAG,MAAM,CAAC,EAAE,6CAAC;AAEd,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AACvB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE;AAC5B,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvF,IAAA,CAAC,oDAAC;AAEF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,EAAE;IACb;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC;AACF,aAAA,eAAe;AACf,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAQ,KAAI;gBACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AAC9B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;uGAjCW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA/B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZ5C,+7EAkEA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1DY,UAAU,mOAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI1B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAN3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6CAA6C,EAAA,OAAA,EAC9C,CAAC,UAAU,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,+7EAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEK3B,gCAAgC,CAAA;AAC1B,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AACtB,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AAEnC,IAAA,IAAI,GAAG,MAAM,CAAiC,IAAI,gDAAC;AACnD,IAAA,iBAAiB,GAAG,MAAM,CAAC,EAAE,6DAAC;AAE9B,IAAA,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,WAAW,EAAE,CAAC,EAAE,CAAC;AACjB,QAAA,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,gBAAgB,EAAE,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC,IAAI,CAAC;AAChB,KAAA,CAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACf;AAEA,IAAA,IAAI,CAAC,EAAU,EAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC;aACF,aAAa,CAAC,EAAE;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAQ,KAAI;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACnB,oBAAA,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;AACnB,oBAAA,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;AACvC,oBAAA,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;AAC/B,oBAAA,gBAAgB,EAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE;AACjD,oBAAA,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO;AAC1B,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACrE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;gBACX,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAE7B,QAAA,MAAM,GAAG,GAA4B;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YACpC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI;YAChD,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU;YACtD,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI;YAC1D,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;SACnC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;AACF,aAAA,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG;AAC1B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,OAAO,KAAI;AAChB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACtB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACpE,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACN;IAEA,OAAO,GAAA;AACL,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC;YAAE;AAER,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;AACF,aAAA,gBAAgB,CAAC,CAAC,CAAC,EAAE;AACrB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;;AAET,gBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACf,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACN;uGAvGW,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECb7C,y+EA+DA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtDY,UAAU,mOAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI9B,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAN5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8CAA8C,EAAA,OAAA,EAC/C,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,y+EAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEI/B,8BAA8B,CAAA;AACxB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAA2B,EAAE,iDAAC;IAE5C,UAAU,GAAG,UAAU;IACvB,UAAU,GAAG,UAAU;AAEvB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,EAAE;IACb;AAEA,IAAA,WAAW,CAAC,CAAyB,EAAA;AACnC,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;AAC1B,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;IACrE;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC;AACF,aAAA,cAAc;AACd,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAQ,KAAI;gBACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AAC9B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;uGApCW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECb3C,gxEA0DA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjDY,UAAU,mOAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI1B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAN1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4CAA4C,EAAA,OAAA,EAC7C,CAAC,UAAU,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,gxEAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEG3B,+BAA+B,CAAA;AACzB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhD,UAAU,GAAG,UAAU;IACvB,UAAU,GAAG,UAAU;AAEvB,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AACtB,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AAEnC,IAAA,IAAI,GAAG,MAAM,CAAgC,IAAI,gDAAC;AAClD,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,uDAAC;AAExB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,EAAE;IACb;IAEQ,EAAE,GAAA;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;IACzC;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,WAAW,EAAE;AACnD,QAAA,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS;IAC1C;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAC3B,QAAA,MAAM,IAAI,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;IACrE;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC;AACF,aAAA,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE;AACtB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,CAAM,KAAI;gBACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACrB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACtD,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;gBACb,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;AAClE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;AACF,aAAA,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;AACzB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,IAAI,EAAE;YACb,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;YACpE,CAAC;AACF,SAAA,CAAC;IACN;uGAzEW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZ5C,i3FAyEA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjEY,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIT,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAN3C,SAAS;+BACE,6CAA6C,EAAA,OAAA,EAC9C,CAAC,UAAU,CAAC,EAAA,QAAA,EAAA,i3FAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEKV,4BAA4B,CAAA;AACtB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhD,UAAU,GAAG,UAAU;AAEvB,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AACtB,IAAA,IAAI,GAAG,MAAM,CAAoB,EAAE,gDAAC;IAEpC,EAAE,GAAA;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;IACzC;AAEA,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,IAAI,EAAE;IACb;AAEA,IAAA,UAAU,CAAC,KAAqB,EAAA;QAC9B,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE;AACjC,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,0BAA0B;AACnC,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,wBAAwB;AACjC,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,yBAAyB;AAClC,YAAA;AACE,gBAAA,OAAO,wBAAwB;;IAErC;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC;aACF,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAC3C,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAQ,KAAI;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AAC7B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;uGA9CW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbzC,y5CAmCA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1BY,UAAU,mOAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI1B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0CAA0C,EAAA,OAAA,EAC3C,CAAC,UAAU,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,y5CAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEI3B,6BAA6B,CAAA;AACvB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAA0B,EAAE,iDAAC;AAC3C,IAAA,OAAO,GAAG,MAAM,CAA2B,EAAE,mDAAC;IAE9C,UAAU,GAAG,UAAU;AAEvB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,IAAI,EAAE;IACb;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC;AACF,aAAA,eAAe;AACf,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;IAC7F;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AACvD,QAAA,OAAO,CAAC,GAAG,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,GAAA,EAAM,CAAC,CAAC,WAAW,CAAA,CAAE,GAAG,EAAE;IACjD;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC;AACF,aAAA,aAAa;AACb,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAQ,KAAI;gBACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AAC9B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;uGA1CW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECb1C,i3EA2DA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlDY,UAAU,mOAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI1B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2CAA2C,EAAA,OAAA,EAC5C,CAAC,UAAU,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,i3EAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEc3B,8BAA8B,CAAA;AACxB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhD,UAAU,GAAG,UAAU;IACvB,WAAW,GAAG,WAAW;IACzB,eAAe,GAAG,eAAe;AAEjC,IAAA,OAAO,GAAG,MAAM,CAAC,IAAI,mDAAC;AACtB,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AAEnC,IAAA,IAAI,GAAG,MAAM,CAA+B,IAAI,gDAAC;AACjD,IAAA,OAAO,GAAG,MAAM,CAA2B,EAAE,mDAAC;AAC9C,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,uDAAC;;AAGxB,IAAA,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAS,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvG,SAAS,EAAE,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,CAAC,IAAI,CAAC;AAChB,KAAA,CAAC;;IAGF,eAAe,GAAG,CAAC,CAAU,EAAE,CAAU,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAEjF,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACf;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC;AACF,aAAA,eAAe;AACf,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;gBACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;;gBAG5B,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;AAC3B,oBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC1D;YACF,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC3D,CAAC;AACF,SAAA,CAAC;IACN;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,EAAE;IAC/B;AAEA,IAAA,IAAI,CAAC,EAAU,EAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;aACF,WAAW,CAAC,EAAE;AACd,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,CAAC,KAAI;AACV,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;;AAGhB,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAClB;oBACE,IAAI,EAAE,CAAC,CAAC,IAAI;AACZ,oBAAA,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACpB,oBAAA,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;oBAC5B,OAAO,EAAE,CAAC,CAAC,OAAO;AACnB,iBAAA,EACD,EAAE,SAAS,EAAE,KAAK,EAAE,CACrB;;AAGD,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;gBACX,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;AAC5D,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAE7B,QAAA,MAAM,GAAG,GAA0B;YACjC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YACpC,QAAQ,EAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAgB,IAAI,CAAC,CAAC,QAAQ;YACzD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI;YAC5C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;SACnC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;AACF,aAAA,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG;AACxB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,OAAO,KAAI;AAChB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACtB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACvD,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACN;AAEA,IAAA,MAAM,CAAC,MAAe,EAAA;AACpB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC;YAAE;AAER,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;AACrF,QAAA,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,YAAA,IAAI,EAAE,CAAC,OAAO,KAAI;AAChB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACtB,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACxE,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACJ;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;QACrB,IAAI,CAAC,CAAC,EAAE,cAAc;YAAE;AAExB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;aACF,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI;AACzF,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,yBAAyB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACN;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC;YAAE;AAER,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;AACF,aAAA,cAAc,CAAC,CAAC,CAAC,EAAE;AACnB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;AACT,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,wBAAwB,CAAC,CAAC;YAClD,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACN;uGA7LW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvB3C,6tIA2HA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxGY,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,mXAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIvG,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAN1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4CAA4C,EAAA,OAAA,EAC7C,CAAC,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,6tIAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEPxG,gCAAgC,CAAA;AAC1B,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AAEnC,IAAA,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,QAAA,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,WAAW,EAAE,CAAC,EAAE,CAAC;AACjB,QAAA,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,gBAAgB,EAAE,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC,IAAI,CAAC;AAChB,KAAA,CAAC;IAEF,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEvB,QAAA,MAAM,GAAG,GAA4B;AACnC,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAK;AAC3B,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAK;YAC3B,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI;AAChD,YAAA,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAW;YACvC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI;YAC1D,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;SACnC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;aACF,gBAAgB,CAAC,GAAG;AACpB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,SAAgB,EAAE,CAAC;YACzE,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACN;uGA9CW,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZ7C,0sEAuDA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/CY,UAAU,mOAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI9B,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAN5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8CAA8C,EAAA,OAAA,EAC/C,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,0sEAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;MEU/B,8BAA8B,CAAA;AACxB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhD,eAAe,GAAG,eAAe;IACjC,YAAY,GAAG,YAAY;AAE3B,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,kDAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,iDAAC;AAEnC,IAAA,WAAW,GAAG,MAAM,CAA4B,EAAE,uDAAC;AACnD,IAAA,OAAO,GAAG,MAAM,CAA2B,EAAE,mDAAC;AAE9C,IAAA,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,YAAY,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACvC,QAAA,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,QAAA,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;QACnC,SAAS,EAAE,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,CAAC,IAAI,CAAC;AAChB,KAAA,CAAC;AAEF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC;AACF,aAAA,eAAe;AACf,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1G;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC;AACF,aAAA,eAAe;AACf,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;IAC7F;IAEA,YAAY,GAAA;QACV,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,EAAE;IAC/B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AAEvB,QAAA,MAAM,GAAG,GAA0B;AACjC,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAa;AAC3C,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAK;AAC3B,YAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAe;YACzC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI;YAC5C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;SACnC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,IAAI,CAAC;aACF,cAAc,CAAC,GAAG;AAClB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,OAAO,KAAI;AAChB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,wBAAwB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,CAAC,KAAI;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;AACF,SAAA,CAAC;IACN;uGA3EW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClB3C,g4EA2DA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7CY,UAAU,mOAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAI9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAN1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4CAA4C,EAAA,OAAA,EAC7C,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,g4EAAA,EAAA,MAAA,EAAA,CAAA,wsKAAA,CAAA,EAAA;;;AEDrC,MAAM,sBAAsB,GAAW;AAC5C,IAAA,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE;AAE9C,IAAA,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,+BAA+B,EAAE;AACnE,IAAA,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,gCAAgC,EAAE;AAC3E,IAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,gCAAgC,EAAE;AAExE,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,6BAA6B,EAAE;AAC/D,IAAA,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,8BAA8B,EAAE;AACvE,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,8BAA8B,EAAE;AAEpE,IAAA,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,8BAA8B,EAAE;AACjE,IAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,+BAA+B,EAAE;AACtE,IAAA,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,4BAA4B,EAAE;AAEvE,IAAA,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE;;;AC5BpD;AAgFO,MAAM,kBAAkB,GAAgC;IAC7D,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC3F,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,uBAAuB,EAAE;IAC9F,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACvE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACpE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;;;ACrFzE;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.static{position:static}.fixed{position:fixed}.relative{position:relative}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.line-clamp-2{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.h-11{height:2.75rem}.h-9{height:2.25rem}.min-h-\[160px\]{min-height:160px}.min-h-\[80px\]{min-height:80px}.w-11{width:2.75rem}.w-20{width:5rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-\[1000px\]{min-width:1000px}.min-w-\[320px\]{min-width:320px}.min-w-\[900px\]{min-width:900px}.min-w-\[980px\]{min-width:980px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-\[color\:var\(--rt-outline\2c rgba\(0\2c 0\2c 0\2c 0\.08\)\)\]>:not([hidden])~:not([hidden]){border-color:var(--rt-outline,rgba(0,0,0,.08))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-xl{border-radius:.75rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-tight{line-height:1.25}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.group:hover .group-hover\:shadow-sm,.hover\:shadow-lg:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
package/themes/theme.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:host{color:var(--rt-text-primary, #0f0f0f)}.rt-page{min-height:100%;color:var(--rt-text-primary, #0f0f0f);background:var(--rt-base-background, #fff)}.rt-panel{background:var(--rt-raised-background, #fff);border:1px solid var(--rt-outline, rgba(0, 0, 0, 0.08));box-shadow:0 16px 50px color-mix(in srgb, var(--rt-base-background, #0f0f0f) 60%, transparent)}.rt-soft{background:color-mix(in srgb, var(--rt-raised-background, #fff) 80%, transparent);border:1px solid color-mix(in srgb, var(--rt-outline, rgba(0, 0, 0, 0.08)) 60%, transparent)}.rt-muted{color:var(--rt-text-secondary, #606060) !important}.rt-quiet{color:color-mix(in srgb, var(--rt-text-secondary, #606060) 70%, transparent) !important}.rt-strong{color:var(--rt-text-primary, #0f0f0f) !important}.rt-ring{border-color:var(--rt-outline, rgba(0, 0, 0, 0.08)) !important}.rt-pill{display:inline-flex;align-items:center;gap:6px;padding:.35rem .75rem;border-radius:999px;border:1px solid var(--rt-outline, rgba(0, 0, 0, 0.08));background:var(--rt-additive-background, rgba(0, 0, 0, 0.05));color:var(--rt-text-primary, #0f0f0f)}.rt-pill.brand{background:color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 18%, var(--rt-raised-background, #fff));border-color:color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 50%, transparent);color:#2b0a00}.rt-btn{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;padding:.55rem .95rem;border-radius:12px;border:1px solid var(--rt-outline, rgba(0, 0, 0, 0.08));background:var(--rt-raised-background, #fff);color:var(--rt-text-primary, #0f0f0f);font-weight:600;transition:background 150ms ease,border-color 150ms ease,transform 150ms ease,box-shadow 150ms ease}.rt-btn:hover{background:color-mix(in srgb, var(--rt-additive-background, rgba(0, 0, 0, 0.05)) 90%, var(--rt-raised-background, #fff));border-color:color-mix(in srgb, var(--rt-outline, rgba(0, 0, 0, 0.08)) 40%, transparent);transform:translateY(-1px);box-shadow:0 10px 30px color-mix(in srgb, var(--rt-base-background, #0f0f0f) 60%, transparent);text-decoration:none}.rt-btn:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}.rt-btn-primary{background:var(--rt-static-brand-orange, #ea580b);border-color:color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 70%, transparent);color:#fff}.rt-btn-primary:hover{background:color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 82%, #000)}.rt-btn-ghost{background:rgba(0,0,0,0);color:var(--rt-text-primary, #0f0f0f)}.rt-btn-danger{background:color-mix(in srgb, #ef4444 20%, var(--rt-raised-background, #fff));border-color:color-mix(in srgb, #ef4444 42%, transparent);color:#7f1d1d}.rt-btn-danger:hover{background:color-mix(in srgb, #ef4444 32%, var(--rt-raised-background, #fff))}.rt-table{width:100%;background:var(--rt-raised-background, #fff);border-collapse:collapse;border:1px solid var(--rt-outline, rgba(0, 0, 0, 0.08))}.rt-table thead{background:color-mix(in srgb, var(--rt-additive-background, rgba(0, 0, 0, 0.05)) 85%, var(--rt-raised-background, #fff));color:var(--rt-text-secondary, #606060)}.rt-table th,.rt-table td{border-bottom:1px solid var(--rt-outline, rgba(0, 0, 0, 0.08))}.rt-table tbody tr:hover{background:color-mix(in srgb, var(--rt-additive-background, rgba(0, 0, 0, 0.05)) 70%, var(--rt-raised-background, #fff))}.rt-badge{display:inline-flex;align-items:center;gap:.25rem;padding:.2rem .65rem;border-radius:999px;border:1px solid var(--rt-outline, rgba(0, 0, 0, 0.08));font-size:.8rem;font-weight:700;letter-spacing:.01em}.rt-badge-success{background:color-mix(in srgb, #22c55e 18%, var(--rt-raised-background, #fff));border-color:color-mix(in srgb, #22c55e 40%, transparent);color:#166534}.rt-badge-warn{background:color-mix(in srgb, #f59e0b 24%, var(--rt-raised-background, #fff));border-color:color-mix(in srgb, #f59e0b 40%, transparent);color:#7c2d12}.rt-badge-danger{background:color-mix(in srgb, #ef4444 22%, var(--rt-raised-background, #fff));border-color:color-mix(in srgb, #ef4444 40%, transparent);color:#7f1d1d}.rt-badge-info{background:color-mix(in srgb, #38bdf8 18%, var(--rt-raised-background, #fff));border-color:color-mix(in srgb, #38bdf8 40%, transparent);color:#0f172a}.rt-badge-muted{background:color-mix(in srgb, var(--rt-additive-background, rgba(0, 0, 0, 0.05)) 90%, var(--rt-raised-background, #fff));color:var(--rt-text-secondary, #606060)}.rt-alert-danger{background:color-mix(in srgb, #ef4444 22%, var(--rt-raised-background, #fff));border:1px solid color-mix(in srgb, #ef4444 40%, transparent);color:#7f1d1d;border-radius:14px;padding:.85rem 1rem}.rt-input{background:var(--rt-raised-background, #fff);border:1px solid var(--rt-outline, rgba(0, 0, 0, 0.08));border-radius:12px;color:var(--rt-text-primary, #0f0f0f);padding:.65rem .85rem;transition:border-color 150ms ease,box-shadow 150ms ease}.rt-input:focus{outline:none;border-color:color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 60%, transparent);box-shadow:0 0 0 3px color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 18%, transparent)}.rt-progress{height:8px;border-radius:999px;background:color-mix(in srgb, var(--rt-additive-background, rgba(0, 0, 0, 0.05)) 80%, var(--rt-raised-background, #fff));overflow:hidden}.rt-progress .bar{height:100%;background:linear-gradient(90deg, color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 82%, #fff) 0%, color-mix(in srgb, var(--rt-static-brand-orange, #ea580b) 70%, #000) 100%)}
|
|
@@ -1,8 +1,63 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Routes } from '@angular/router';
|
|
2
2
|
|
|
3
|
-
declare
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
declare const automationManageRoutes: Routes;
|
|
4
|
+
|
|
5
|
+
/** Mirrors AbstractBaseEntity (common fields in your backend). */
|
|
6
|
+
interface BaseEntity {
|
|
7
|
+
id: string;
|
|
8
|
+
createdAt?: string;
|
|
9
|
+
updatedAt?: string;
|
|
10
|
+
version?: number;
|
|
11
|
+
}
|
|
12
|
+
/** ---- Enums ---- */
|
|
13
|
+
type AutomationExecutionStatus = 'QUEUED' | 'RUNNING' | 'SUCCEEDED' | 'FAILED' | 'CANCELLED';
|
|
14
|
+
type AutomationLogLevel = 'INFO' | 'WARN' | 'ERROR' | 'DEBUG';
|
|
15
|
+
type ScheduleCron = 'EVERY_5_MINUTES' | 'EVERY_15_MINUTES' | 'HOURLY' | 'DAILY' | 'WEEKLY';
|
|
16
|
+
/** ---- Entities ---- */
|
|
17
|
+
interface AutomationDefinition extends BaseEntity {
|
|
18
|
+
code: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string | null;
|
|
21
|
+
handlerKey: string;
|
|
22
|
+
defaultInputJson?: string | null;
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
}
|
|
25
|
+
interface AutomationExecution extends BaseEntity {
|
|
26
|
+
definitionId: string;
|
|
27
|
+
scheduleId?: string | null;
|
|
28
|
+
status: AutomationExecutionStatus;
|
|
29
|
+
queuedAt?: string | null;
|
|
30
|
+
startedAt?: string | null;
|
|
31
|
+
finishedAt?: string | null;
|
|
32
|
+
processed: number;
|
|
33
|
+
total: number;
|
|
34
|
+
lastSeq: number;
|
|
35
|
+
inputJson?: string | null;
|
|
36
|
+
metadata?: Record<string, any> | null;
|
|
37
|
+
idempotencyKey?: string | null;
|
|
38
|
+
errorMessage?: string | null;
|
|
39
|
+
}
|
|
40
|
+
interface AutomationSchedule extends BaseEntity {
|
|
41
|
+
definitionId: string;
|
|
42
|
+
name: string;
|
|
43
|
+
schedule: ScheduleCron;
|
|
44
|
+
inputJson?: string | null;
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
nextRunAt?: string | null;
|
|
47
|
+
lastRunAt?: string | null;
|
|
48
|
+
}
|
|
49
|
+
interface AutomationExecutionLog extends BaseEntity {
|
|
50
|
+
executionId: string;
|
|
51
|
+
level: AutomationLogLevel;
|
|
52
|
+
message: string;
|
|
53
|
+
}
|
|
54
|
+
/** ---- Optional: enum metadata for UI (label/description) ---- */
|
|
55
|
+
interface ScheduleCronMeta {
|
|
56
|
+
value: ScheduleCron;
|
|
57
|
+
label: string;
|
|
58
|
+
description: string;
|
|
6
59
|
}
|
|
60
|
+
declare const SCHEDULE_CRON_META: readonly ScheduleCronMeta[];
|
|
7
61
|
|
|
8
|
-
export {
|
|
62
|
+
export { SCHEDULE_CRON_META, automationManageRoutes };
|
|
63
|
+
export type { AutomationDefinition, AutomationExecution, AutomationExecutionLog, AutomationExecutionStatus, AutomationLogLevel, AutomationSchedule, BaseEntity, ScheduleCron, ScheduleCronMeta };
|