@myrmidon/gve-core 5.0.1 → 5.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/myrmidon-gve-core.mjs +264 -179
- package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
- package/index.d.ts +46 -6
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-api.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/validators/svg-validators.ts","../../../../projects/myrmidon/gve-core/src/lib/services/settings.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-graphviz.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-view/chain-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-view/chain-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/ln-heights-editor/ln-heights-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/ln-heights-editor/ln-heights-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.html","../../../../projects/myrmidon/gve-core/src/public-api.ts","../../../../projects/myrmidon/gve-core/src/myrmidon-gve-core.ts"],"sourcesContent":["import {\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { GveAnimationTween, TweenType } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-animation-tween`\r\n *\r\n * A component to edit an animation tween.\r\n * Used by the `gve-animation-timeline` component.\r\n *\r\n * - ▶️ `tween` (`GveAnimationTween`): the tween to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - 🔥 `tweenChange` (`GveAnimationTween`): emitted when the tween is changed.\r\n * - 🔥 `tweenCancel` (`void`): emitted when the user cancels the edit.\r\n */\r\n@Component({\r\n selector: 'gve-animation-tween',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './animation-tween.component.html',\r\n styleUrl: './animation-tween.component.css',\r\n})\r\nexport class AnimationTweenComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n\r\n /**\r\n * The tween to edit.\r\n */\r\n public readonly tween = model<GveAnimationTween | undefined>();\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n public readonly elementIds = input<string[] | undefined>();\r\n\r\n /**\r\n * Emitted when the user cancels the edit.\r\n */\r\n public readonly tweenCancel = output();\r\n\r\n public readonly types = ['to', 'from', 'fromTo', 'set'];\r\n\r\n public label: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public type: FormControl<TweenType>;\r\n public selector: FormControl<string>;\r\n public vars: FormControl<string>;\r\n public vars2: FormControl<string | null>;\r\n public position: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public elementId: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.label = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.note = formBuilder.control(null);\r\n this.type = formBuilder.control('to', { nonNullable: true });\r\n this.selector = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(200)],\r\n });\r\n this.vars = formBuilder.control('{}', {\r\n nonNullable: true,\r\n validators: [Validators.required, this.jsonValidator],\r\n });\r\n this.vars2 = formBuilder.control(null, this.jsonValidator);\r\n this.position = formBuilder.control(null, Validators.maxLength(100));\r\n this.form = formBuilder.group({\r\n label: this.label,\r\n note: this.note,\r\n type: this.type,\r\n selector: this.selector,\r\n vars: this.vars,\r\n vars2: this.vars2,\r\n position: this.position,\r\n });\r\n\r\n this.elementId = formBuilder.control(null);\r\n\r\n effect(() => {\r\n this.updateForm(this.tween());\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // set selector when elementId changes\r\n this._sub = this.elementId.valueChanges\r\n .pipe(debounceTime(200), distinctUntilChanged())\r\n .subscribe((elementId) => {\r\n if (elementId) {\r\n this.selector.setValue('#' + elementId);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public onVarsChange(vars: string): void {\r\n this.vars.setValue(vars);\r\n this.vars.markAsDirty();\r\n this.vars.updateValueAndValidity();\r\n }\r\n\r\n public onVars2Change(vars: string): void {\r\n this.vars2.setValue(vars);\r\n this.vars2.markAsDirty();\r\n this.vars2.updateValueAndValidity();\r\n }\r\n\r\n public close(): void {\r\n this.tweenCancel.emit();\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(tween?: GveAnimationTween): void {\r\n if (!tween) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.label.setValue(tween.label);\r\n this.note.setValue(tween.note || null);\r\n this.type.setValue(tween.type);\r\n this.selector.setValue(tween.selector);\r\n this.vars.setValue(tween.vars || '{}');\r\n this.vars2.setValue(tween.vars2 || null);\r\n this.position.setValue(tween.position || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getTween(): GveAnimationTween {\r\n return {\r\n label: this.label.value,\r\n note: this.note.value?.trim() || undefined,\r\n type: this.type.value,\r\n selector: this.selector.value.trim(),\r\n vars: this.vars.value,\r\n vars2: this.vars2.value || undefined,\r\n position: this.position.value?.trim() || undefined,\r\n };\r\n }\r\n\r\n public openUrl(url: string): void {\r\n window.open(url, '_blank');\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this.tween.set(this.getTween());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n @if ($any(label).errors?.required && (label.dirty || label.touched)) {\r\n <mat-error>label required</mat-error>\r\n } @if ($any(label).errors?.maxLength && (label.dirty || label.touched)) {\r\n <mat-error>label too long</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n @for (t of types; track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- position -->\r\n <mat-form-field>\r\n <mat-label>position</mat-label>\r\n <input matInput [formControl]=\"position\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n [attr.aria-label]=\"'Information about position'\"\r\n (click)=\"\r\n openUrl(\r\n 'https://gsap.com/docs/v3/GSAP/Timeline/#positioning-animations-in-a-timeline'\r\n )\r\n \"\r\n >\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n <mat-hint>time label < > += -=</mat-hint>\r\n @if ( $any(position).errors?.maxLength && (position.dirty ||\r\n position.touched) ) {\r\n <mat-error>position too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- selector -->\r\n <mat-form-field>\r\n <mat-label>selector</mat-label>\r\n <input matInput [formControl]=\"selector\" />\r\n <mat-hint>CSS selector</mat-hint>\r\n @if ( $any(selector).errors?.required && (selector.dirty ||\r\n selector.touched) ) {\r\n <mat-error>selector required</mat-error>\r\n } @if ( $any(selector).errors?.maxLength && (selector.dirty ||\r\n selector.touched) ) {\r\n <mat-error>selector too long</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- element id -->\r\n @if ((elementIds())?.length) {\r\n <mat-form-field>\r\n <mat-label>element ID</mat-label>\r\n <mat-select [formControl]=\"elementId\">\r\n @for (id of elementIds(); track id) {\r\n <mat-option [value]=\"id\">{{ id }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n @if ($any(vars).errors?.required && (vars.dirty || vars.touched)) {\r\n <mat-error>vars required</mat-error>\r\n } @if ($any(vars).errors?.json && (vars.dirty || vars.touched)) {\r\n <mat-error>invalid JSON</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 'fromTo') {\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>2nd vars</mat-label>\r\n <textarea matInput [formControl]=\"vars2\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n @if ($any(vars2).errors?.required && (vars2.dirty || vars2.touched)) {\r\n <mat-error>vars required</mat-error>\r\n } @if ($any(vars2).errors?.json && (vars2.dirty || vars2.touched)) {\r\n <mat-error>invalid JSON</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close tween\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-icon-button\r\n matTooltip=\"Save tween\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, model, output, signal } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { deepCopy, NgxToolsValidators } from '@myrmidon/ngx-tools';\r\nimport {\r\n GveAnimationTimeline,\r\n GveAnimationTween,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTweenComponent } from '../animation-tween/animation-tween.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline`\r\n *\r\n * A component to edit an animation timeline.\r\n * Used by the `gve-animation-timeline-set` component.\r\n *\r\n * - ▶️ `timeline` (`GveAnimationTimeline`): the animation timeline to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected\r\n * by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelineChange` (`GveAnimationTimeline`): emitted when the timeline\r\n * is changed.\r\n * - 🔥 `timelineCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n AnimationTweenComponent\r\n],\r\n templateUrl: './animation-timeline.component.html',\r\n styleUrl: './animation-timeline.component.css',\r\n})\r\nexport class AnimationTimelineComponent {\r\n /**\r\n * The animation timeline to edit.\r\n */\r\n public readonly timeline = model<GveAnimationTimeline | undefined>();\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n public readonly elementIds = input<string[] | undefined>();\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n public readonly tags = input<string[]>([]);\r\n\r\n /**\r\n * Emitted when the timeline is changed.\r\n */\r\n public readonly timelineChange = output<GveAnimationTimeline>();\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n public readonly timelineCancel = output();\r\n\r\n public readonly editedTweenIndex = signal<number>(-1);\r\n public readonly editedTween = signal<GveAnimationTween | undefined>(undefined);\r\n\r\n public tag: FormControl<string>;\r\n public tweens: FormControl<GveAnimationTween[]>;\r\n public vars: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.tag = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.tweens = formBuilder.control([], {\r\n nonNullable: true,\r\n validators: NgxToolsValidators.strictMinLengthValidator(1),\r\n });\r\n this.vars = formBuilder.control(null, this.jsonValidator);\r\n\r\n this.form = formBuilder.group({\r\n tag: this.tag,\r\n tweens: this.tweens,\r\n vars: this.vars,\r\n });\r\n\r\n // when the timeline changes, update the form\r\n effect(() => {\r\n this.updateForm(this.timeline());\r\n });\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(timeline?: GveAnimationTimeline) {\r\n if (!timeline) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.tag.setValue(timeline.tag);\r\n this.tweens.setValue(timeline.tweens);\r\n this.vars.setValue(timeline.vars || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public addTween(): void {\r\n this.editedTweenIndex.set(-1);\r\n this.editedTween.set({\r\n label: 'tween #' + (this.tweens.value.length + 1),\r\n type: 'to',\r\n selector: '',\r\n });\r\n }\r\n\r\n public editTween(index: number): void {\r\n this.editedTweenIndex.set(index);\r\n this.editedTween.set(deepCopy(this.tweens.value[index]));\r\n }\r\n\r\n public deleteTween(index: number): void {\r\n this.tweens.setValue(this.tweens.value.filter((_, i) => i !== index));\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public closeTween(): void {\r\n this.editedTween.set(undefined);\r\n this.editedTweenIndex.set(-1);\r\n }\r\n\r\n public saveTween(tween?: GveAnimationTween): void {\r\n if (this.editedTweenIndex() === -1) {\r\n this.tweens.setValue([...this.tweens.value, tween!]);\r\n } else {\r\n this.tweens.setValue(\r\n this.tweens.value.map((t, index) =>\r\n index === this.editedTweenIndex() ? tween! : t\r\n )\r\n );\r\n }\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n this.closeTween();\r\n }\r\n\r\n public moveTweenUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index - 1];\r\n tweens[index - 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public moveTweenDown(index: number): void {\r\n if (index >= this.tweens.value.length - 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index + 1];\r\n tweens[index + 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n private getTimeline(): GveAnimationTimeline {\r\n return {\r\n tag: this.tag.value || '',\r\n tweens: this.tweens.value,\r\n vars: this.vars.value || undefined,\r\n };\r\n }\r\n\r\n public close(): void {\r\n this.timelineCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.timeline.set(this.getTimeline());\r\n this.timelineChange.emit(this.timeline()!);\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\r\n @if (tags().length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(tag).errors?.required && (tag.dirty || tag.touched)) {\r\n <mat-error>tag required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n @if ($any(tag).errors?.required && (tag.dirty || tag.touched)) {\r\n <mat-error>tag required</mat-error>\r\n } @if ($any(tag).errors?.maxLength && (tag.dirty || tag.touched)) {\r\n <mat-error>tag too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n @if ($any(vars).errors?.json && (vars.dirty || vars.touched)) {\r\n <mat-error>invalid JSON</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- tweens -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr [class.selected]=\"index === editedTweenIndex()\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- tween editor -->\r\n @if (editedTween()) {\r\n <mat-expansion-panel [expanded]=\"editedTween()\" [disabled]=\"!editedTween()\">\r\n @if (editedTween()) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween #{{ editedTweenIndex() + 1 }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds()\"\r\n [tween]=\"editedTween()\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (tweenCancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close timeline\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save timeline\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, input, model, output, signal } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { deepCopy } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { GveAnimationTimeline } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTimelineComponent } from '../animation-timeline/animation-timeline.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline-set`\r\n *\r\n * A component to edit a set of animation timelines.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `timelines` (`GveAnimationTimeline[]`): the animation timelines to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelinesChange` (`GveAnimationTimeline[]`): emitted when the timelines are changed.\r\n * - 🔥 `timelinesCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline-set',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n AnimationTimelineComponent,\r\n ],\r\n templateUrl: './animation-timeline-set.component.html',\r\n styleUrl: './animation-timeline-set.component.css',\r\n})\r\nexport class AnimationTimelineSetComponent {\r\n /**\r\n * The animation timelines to edit.\r\n */\r\n public readonly timelines = model<GveAnimationTimeline[]>([]);\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n public readonly elementIds = input<string[] | undefined>();\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n public readonly tags = input<string[]>([]);\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n public readonly timelinesCancel = output();\r\n\r\n public readonly editedTimeline = signal<GveAnimationTimeline | undefined>(\r\n undefined\r\n );\r\n public readonly editedIndex = signal<number>(-1);\r\n\r\n constructor(private _dialogService: DialogService) {}\r\n\r\n public closeTimeline(): void {\r\n this.editedTimeline.set(undefined);\r\n this.editedIndex.set(-1);\r\n }\r\n\r\n public newTimeline(): void {\r\n this.editedTimeline.set({\r\n tag: '',\r\n tweens: [],\r\n });\r\n this.editedIndex.set(-1);\r\n }\r\n\r\n public editTimeline(index: number): void {\r\n this.editedTimeline.set(deepCopy(this.timelines()[index]));\r\n this.editedIndex.set(index);\r\n }\r\n\r\n public onTimelineChange(timeline: GveAnimationTimeline): void {\r\n const timelines = [...this.timelines()];\r\n if (this.editedIndex() === -1) {\r\n timelines.push(timeline);\r\n } else {\r\n timelines.splice(this.editedIndex(), 1, timeline);\r\n }\r\n\r\n // sort timelines by tag\r\n timelines.sort((a, b) => a.tag.localeCompare(b.tag));\r\n this.timelines.set(timelines);\r\n\r\n this.closeTimeline();\r\n }\r\n\r\n public deleteTimeline(index: number): void {\r\n this._dialogService\r\n .confirm('Confirm Deletion', `Delete ${this.timelines()[index].tag}?`)\r\n .subscribe((yes) => {\r\n if (yes) {\r\n const timelines = [...this.timelines()];\r\n timelines.splice(index, 1);\r\n this.timelines.set(timelines);\r\n }\r\n });\r\n }\r\n}\r\n","<div>\r\n <!-- add -->\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n (click)=\"newTimeline()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tag</th>\r\n <th>tweens</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of timelines(); track t.tag; let index = $index) {\r\n <tr [class.selected]=\"editedIndex() === index\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button type=\"button\" mat-icon-button (click)=\"editTimeline(index)\">\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button type=\"button\" mat-icon-button (click)=\"deleteTimeline(index)\">\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ t.tag }}</td>\r\n <td>{{ t.tweens.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- editor -->\r\n @if (editedTimeline()) {\r\n <mat-expansion-panel [disabled]=\"!editedTimeline\" [expanded]=\"editedTimeline\">\r\n <mat-expansion-panel-header>\r\n timeline {{ editedTimeline()?.tag }}\r\n </mat-expansion-panel-header>\r\n <gve-animation-timeline\r\n [elementIds]=\"elementIds()\"\r\n [tags]=\"tags()\"\r\n [timeline]=\"editedTimeline()\"\r\n (timelineChange)=\"onTimelineChange($event!)\"\r\n (timelineCancel)=\"closeTimeline()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n</div>\r\n","import { Component, input, output } from '@angular/core';\r\nimport { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { ColorToContrastPipe } from '@myrmidon/ngx-tools';\r\n\r\n/**\r\n * A single character from a base text.\r\n */\r\nexport interface BaseTextChar {\r\n id: number;\r\n value: string;\r\n label: string;\r\n color: string;\r\n oldColor?: string;\r\n borderColor: string;\r\n oldBorderColor?: string;\r\n emSize: number;\r\n}\r\n\r\n/**\r\n * Event emitted by the base text character component when a character\r\n * is clicked.\r\n */\r\nexport interface BaseTextCharEvent {\r\n char: BaseTextChar;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-char`\r\n *\r\n * A component that displays a single character from a base text.\r\n * Used by `gve-base-text-view`.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-char',\r\n imports: [MatRippleModule, ColorToContrastPipe],\r\n templateUrl: './base-text-char.component.html',\r\n styleUrl: './base-text-char.component.css',\r\n})\r\nexport class BaseTextCharComponent {\r\n /**\r\n * The character to display.\r\n */\r\n public readonly char = input<BaseTextChar | undefined>();\r\n\r\n /**\r\n * Emitted when the character is clicked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n public readonly defaultColor = '#D8D8D8';\r\n public readonly defaultBorderColor = '#D8D8D8';\r\n public readonly defaultEmSize = 1.5;\r\n\r\n public onCharClick(event: MouseEvent): void {\r\n this.charPick.emit({ char: this.char()!, event });\r\n }\r\n}\r\n","@if (char()) {\r\n<div matRipple id=\"container\" (click)=\"onCharClick($event)\">\r\n <div\r\n id=\"c-label\"\r\n [style.fontSize]=\"char()!.emSize + 'em'\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n >\r\n {{ char()!.label }}\r\n </div>\r\n <div\r\n id=\"c-id\"\r\n [style.fontSize]=\"char()!.emSize / 2 + 'em'\"\r\n [style.color]=\"char()!.color | colorToContrast\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n [style.backgroundColor]=\"char()!.color\"\r\n >\r\n {{ char()!.id }}\r\n </div>\r\n</div>\r\n}\r\n","import { Component, effect, input, output, signal } from '@angular/core';\r\n\r\nimport { CharNode } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n BaseTextChar,\r\n BaseTextCharComponent,\r\n BaseTextCharEvent,\r\n} from '../base-text-char/base-text-char.component';\r\n\r\n/**\r\n * A range in the base text.\r\n */\r\nexport interface VarBaseTextRange {\r\n at: number;\r\n run: number;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-view`\r\n *\r\n * A component to display a selectable base text. Its input is either a string or an\r\n * array of `CharNode`'s.\r\n * Used by the chain result view component and the base text editor component.\r\n *\r\n * - ▶️ `defaultColor` (`string`): the default color for the text.\r\n * - ▶️ `colorCallback` (callback): an optional callback to get the color of a\r\n * character node.\r\n * - ▶️ `defaultBorderColor` (`string`): the default border color for the text.\r\n * - ▶️ `borderColorCallback` (callback): an optional callback to get the border color\r\n * of a character node.\r\n * - ▶️ `selectionColor` (`string`): the color for the selected text.\r\n * - ▶️ `hasLineNumber` (`boolean`): true if line numbers should be displayed next\r\n * to each line.\r\n * - ▶️ `text` (`string` | `CharNode[]`): the text to display.\r\n * - 🔥 `charPick` (`BaseTextCharEvent`): emitted when a character is picked.\r\n * - 🔥 `rangePick` (`VarBaseTextRange`): emitted when a range is picked.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-view',\r\n imports: [BaseTextCharComponent],\r\n templateUrl: './base-text-view.component.html',\r\n styleUrl: './base-text-view.component.css',\r\n})\r\nexport class BaseTextViewComponent {\r\n private _lastSelectedChar?: BaseTextChar;\r\n\r\n /**\r\n * The default color for the text.\r\n */\r\n public readonly defaultColor = input('#DBDBDB');\r\n\r\n /**\r\n * The default border color for the text.\r\n */\r\n public readonly defaultBorderColor = input('#DBDBDB');\r\n\r\n /**\r\n * The color for the selected text.\r\n */\r\n public readonly selectionColor = input('#3E92CC');\r\n\r\n /**\r\n * True if line numbers should be displayed next to each line.\r\n */\r\n public readonly hasLineNumber = input(false);\r\n\r\n /**\r\n * The text to display.\r\n */\r\n public readonly text = input<CharNode[]>([]);\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly colorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly borderColorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * Emitted when a character is picked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n /**\r\n * Emitted when a range is picked. This is preceded by a character pick event.\r\n * The range is defined by the starting character and the number of characters.\r\n * The range is inclusive.\r\n */\r\n public readonly rangePick = output<VarBaseTextRange>();\r\n\r\n public readonly lines = signal<BaseTextChar[][]>([]);\r\n\r\n constructor() {\r\n // build lines when text or border color callback change\r\n effect(() => {\r\n this.buildLines(\r\n this.text(),\r\n this.colorCallback(),\r\n this.borderColorCallback()\r\n );\r\n });\r\n\r\n // reset _lastSelectedChar when text changes\r\n effect(() => {\r\n this.text();\r\n this._lastSelectedChar = undefined;\r\n });\r\n }\r\n\r\n private buildLines(\r\n text: CharNode[],\r\n colorCallback?: (node: CharNode) => string | null,\r\n borderColorCallback?: (node: CharNode) => string | null\r\n ): void {\r\n if (!text) {\r\n this.lines.set([]);\r\n return;\r\n }\r\n\r\n const newLines: BaseTextChar[][] = [];\r\n newLines.push([]);\r\n\r\n const nodes = text as CharNode[];\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const char: BaseTextChar = {\r\n id: nodes[i].id,\r\n value: nodes[i].data,\r\n label: nodes[i].label,\r\n color: colorCallback\r\n ? colorCallback(nodes[i]) || this.defaultColor()\r\n : this.defaultColor(),\r\n borderColor: borderColorCallback\r\n ? borderColorCallback(nodes[i]) || this.defaultBorderColor()\r\n : this.defaultBorderColor(),\r\n emSize: 1.5,\r\n };\r\n char.oldColor = char.color;\r\n char.oldBorderColor = char.borderColor;\r\n\r\n newLines[newLines.length - 1].push(char);\r\n\r\n if (char.value === '\\n') {\r\n newLines.push([]);\r\n }\r\n }\r\n\r\n this.lines.set(newLines);\r\n }\r\n\r\n private resetColors(): void {\r\n if (!this.lines()) return;\r\n\r\n const newLines = this.lines().map((line) =>\r\n line.map((c) => {\r\n if (!c) return c;\r\n return {\r\n ...c,\r\n color: c.oldColor || this.defaultColor(),\r\n borderColor: c.oldBorderColor || this.defaultBorderColor(),\r\n };\r\n })\r\n );\r\n this.lines.set(newLines);\r\n }\r\n\r\n public onCharPick(event: BaseTextCharEvent): void {\r\n // guard against null/undefined event.char\r\n if (!event?.char) {\r\n return;\r\n }\r\n\r\n // first reset all colors before updating\r\n this.resetColors();\r\n\r\n // calculate selection state\r\n const isRangeSelection =\r\n Boolean(this._lastSelectedChar) &&\r\n this._lastSelectedChar !== event.char &&\r\n event.event?.ctrlKey;\r\n\r\n let rangeToEmit: VarBaseTextRange;\r\n\r\n if (isRangeSelection && this._lastSelectedChar) {\r\n const minId = Math.min(this._lastSelectedChar.id, event.char.id);\r\n const maxId = Math.max(this._lastSelectedChar.id, event.char.id);\r\n\r\n // update UI to highlight range - create new objects\r\n const newLines = this.lines().map((line) =>\r\n line.map((c) => {\r\n if (!c) return c;\r\n if (c.id >= minId && c.id <= maxId) {\r\n return {\r\n ...c,\r\n oldColor: c.color,\r\n oldBorderColor: c.borderColor,\r\n color: this.selectionColor(),\r\n borderColor: this.selectionColor(),\r\n };\r\n }\r\n return c;\r\n })\r\n );\r\n this.lines.set(newLines);\r\n\r\n rangeToEmit = { at: minId, run: maxId - minId + 1 };\r\n } else {\r\n // single character selection - create new objects\r\n const newLines = this.lines().map((line) =>\r\n line.map((c) => {\r\n if (!c) return c;\r\n if (c.id === event.char.id) {\r\n const updatedChar = {\r\n ...c,\r\n oldColor: c.color,\r\n oldBorderColor: c.borderColor,\r\n color: this.selectionColor(),\r\n borderColor: this.selectionColor(),\r\n };\r\n // update last selected character reference\r\n this._lastSelectedChar = updatedChar;\r\n return updatedChar;\r\n }\r\n return c;\r\n })\r\n );\r\n this.lines.set(newLines);\r\n\r\n rangeToEmit = { at: event.char.id, run: 1 };\r\n }\r\n\r\n // emit events last, after all internal state is updated\r\n this.charPick.emit(event);\r\n this.rangePick.emit(rangeToEmit);\r\n }\r\n}\r\n","<div id=\"text\">\r\n @for (line of lines(); track $index) {\r\n <div class=\"line\">\r\n @if (hasLineNumber()) {\r\n <div class=\"nr\">\r\n {{ lines().indexOf(line) + 1 }}\r\n </div>\r\n } @for (c of line; track c.id) {\r\n <gve-base-text-char [char]=\"c\" (charPick)=\"onCharPick($event)\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n effect,\r\n ElementRef,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\n// material\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport {\r\n Feature,\r\n FeatureSetPolicy,\r\n LabeledId,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * Features map. This is used for features from closed sets,\r\n * and lists the possible values for each feature.\r\n * The key is the feature name, and the value is an array of\r\n * labeled IDs representing the allowed values for that feature.\r\n */\r\nexport interface FeatureMap {\r\n [key: string]: LabeledId[];\r\n}\r\n\r\n/**\r\n * 🔑 `gve-feature-editor`\r\n *\r\n * Component for editing a single feature, whose model is a name=value\r\n * pair, plus a set policy value which defines the desired behavior\r\n * when adding that feature to a set.\r\n * Used by `gve-feature-set-editor`.\r\n *\r\n * - ▶️ `feature` (`Feature`): the feature to edit.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of\r\n * features. Each item in the list is an object with _id_ and _label_\r\n * properties.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When\r\n * specified and the user selects a feature name present in the map keys,\r\n * the corresponding values will be used to populate the value selection.\r\n * - 🔥 `featureChange` (`Feature`): emitted when feature has changed.\r\n * - 🔥 `featureCancel`: emitted when the user cancels the feature editing.\r\n */\r\n@Component({\r\n selector: 'gve-feature-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './feature-editor.component.html',\r\n styleUrl: './feature-editor.component.css',\r\n})\r\nexport class FeatureEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private _frozen?: boolean;\r\n\r\n @ViewChild('nameCtl') nameControl?: ElementRef;\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The feature to edit.\r\n */\r\n public readonly feature = model<Feature | OperationFeature | undefined>();\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(false);\r\n\r\n /**\r\n * Event emitted when the user cancels the feature editing.\r\n */\r\n public readonly featureCancel = output();\r\n\r\n public readonly nameIds = signal<LabeledId[] | undefined>(undefined);\r\n\r\n public name: FormControl<string>;\r\n public value: FormControl<string>;\r\n public setPolicy: FormControl<FeatureSetPolicy>;\r\n // var feature controls\r\n public isNegated: FormControl<boolean>;\r\n public isGlobal: FormControl<boolean>;\r\n public isShortLived: FormControl<boolean>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.name = formBuilder.control<string>('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.value = formBuilder.control('', {\r\n validators: [Validators.maxLength(5000)],\r\n nonNullable: true,\r\n });\r\n this.setPolicy = formBuilder.control(FeatureSetPolicy.multiple, {\r\n nonNullable: true,\r\n });\r\n this.isNegated = formBuilder.control(false, { nonNullable: true });\r\n this.isGlobal = formBuilder.control(false, { nonNullable: true });\r\n this.isShortLived = formBuilder.control(false, { nonNullable: true });\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n value: this.value,\r\n setPolicy: this.setPolicy,\r\n isNegated: this.isNegated,\r\n isGlobal: this.isGlobal,\r\n isShortLived: this.isShortLived,\r\n });\r\n\r\n // when feature changes, update the form\r\n effect(() => {\r\n this.updateForm(this.feature());\r\n setTimeout(() => {\r\n this.nameControl?.nativeElement?.focus();\r\n this.nameIds.set(\r\n this.getLabeledIdsFor(this.name.value, this.featValues())\r\n );\r\n }, 500);\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever the name changes, update the value selection\r\n this._sub = this.name.valueChanges\r\n .pipe(debounceTime(300), distinctUntilChanged())\r\n .subscribe((name) => {\r\n if (!this._frozen && this.featNames()?.length) {\r\n this.value.reset();\r\n this.nameIds.set(this.getLabeledIdsFor(name, this.featValues()));\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(\r\n id?: string,\r\n featValues?: FeatureMap\r\n ): LabeledId[] | undefined {\r\n if (!id) {\r\n return undefined;\r\n }\r\n console.log('getLabeledIdsFor', id, featValues);\r\n return featValues ? featValues![id] : undefined;\r\n }\r\n\r\n private updateForm(feature?: OperationFeature): void {\r\n if (!feature) {\r\n this.form.reset();\r\n } else {\r\n this._frozen = true;\r\n this.name.setValue(feature.name);\r\n this.value.setValue(feature.value);\r\n this.setPolicy.setValue(feature.setPolicy || FeatureSetPolicy.multiple);\r\n this.isNegated.setValue(feature.isNegated || false);\r\n this.isGlobal.setValue(feature.isGlobal || false);\r\n this.isShortLived.setValue(feature.isShortLived || false);\r\n this._frozen = false;\r\n }\r\n }\r\n\r\n public cancel(): void {\r\n this.featureCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this.feature.set(\r\n this.isVar()\r\n ? {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n isNegated: this.isNegated.value,\r\n isGlobal: this.isGlobal.value,\r\n isShortLived: this.isShortLived.value,\r\n }\r\n : {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n }\r\n );\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n @if (featNames()?.length) {\r\n <!-- name (bound) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <mat-select #nameCtl [formControl]=\"name\">\r\n @for (i of featNames(); track i) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- name (free) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input #nameCtl matInput [formControl]=\"name\" />\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n } @if ($any(name).errors?.maxLength && (name.dirty || name.touched)) {\r\n <mat-error>name too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- value (bound) -->\r\n @if (nameIds()?.length) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <mat-select [formControl]=\"value\">\r\n @for (e of nameIds(); track e) {\r\n <mat-option [value]=\"e.id\">{{ e.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- value (free) -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n } @if ($any(value).errors?.maxLength && (value.dirty || value.touched)) {\r\n <mat-error>value too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- setPolicy -->\r\n <mat-form-field>\r\n <mat-label>set policy</mat-label>\r\n <mat-select [formControl]=\"setPolicy\">\r\n <mat-option [value]=\"0\">multiple</mat-option>\r\n <mat-option [value]=\"1\">single</mat-option>\r\n <mat-option [value]=\"2\">single first</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n @if (isVar()) {\r\n <div class=\"form-row\">\r\n <!-- isNegated -->\r\n <mat-checkbox [formControl]=\"isNegated\">negated</mat-checkbox>\r\n\r\n <!-- isShortLived -->\r\n <mat-checkbox [formControl]=\"isShortLived\">short-lived</mat-checkbox>\r\n\r\n <!-- isGlobal -->\r\n <mat-checkbox [formControl]=\"isGlobal\">global</mat-checkbox>\r\n </div>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import {\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { deepCopy, FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n FeatureSetPolicy,\r\n LabeledId,\r\n Feature,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n FeatureEditorComponent,\r\n FeatureMap,\r\n} from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-editor`\r\n *\r\n * Component for editing a set of features. It shows a list of features,\r\n * allowing to edit each of them or adding new ones. Optionally you can\r\n * specify a list of feature names and values to use in the selection.\r\n * Used by base text editor and chain operation editor components.\r\n *\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is equal to or greater than the threshold. Default is 5.\r\n * - ▶️ `features` (`Feature[]`): the features to edit.\r\n * - ▶️ `isVar`: true if the feature is a variant operation feature, which\r\n * has additional properties like negation, global, and short-lived.\r\n * - 🔥 `featuresChange` (`Feature[]`): emitted when features have changed.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n FlatLookupPipe,\r\n FeatureEditorComponent,\r\n ],\r\n templateUrl: './feature-set-editor.component.html',\r\n styleUrl: './feature-set-editor.component.css',\r\n})\r\nexport class FeatureSetEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n\r\n public readonly POLICIES = ['M', 'S', 'SF'];\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(false);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than or equal to the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n /**\r\n * The features to edit.\r\n */\r\n public readonly features = model<Feature[] | OperationFeature[]>([]);\r\n\r\n public readonly editedFeature = signal<\r\n Feature | OperationFeature | undefined\r\n >(undefined);\r\n public readonly editedFeatureIndex = signal<number>(-1);\r\n public filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control<string | null>(null);\r\n\r\n // when features change, apply the filter\r\n effect(() => {\r\n this.applyFeatureFilter(this.features(), this.filter.value);\r\n });\r\n }\r\n\r\n private applyFeatureFilter(\r\n features: Feature[] | OperationFeature[],\r\n name?: string | null\r\n ): void {\r\n this.filteredFeatures.set(\r\n features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n }) || []\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n // when the filter changes, apply the filter\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(this.features(), value);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public addFeature(): void {\r\n this.editedFeature.set({\r\n name: '',\r\n value: '',\r\n setPolicy: FeatureSetPolicy.multiple,\r\n });\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n\r\n public editFeature(feature: Feature | OperationFeature): void {\r\n this.editedFeature.set(deepCopy(feature));\r\n this.editedFeatureIndex.set(this.features().indexOf(feature));\r\n }\r\n\r\n public deleteFeature(feature: Feature | OperationFeature): void {\r\n const index = this.features().indexOf(feature);\r\n if (index < 0) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n features.splice(index, 1);\r\n this.features.set(features);\r\n }\r\n\r\n public onFeatureChange(feature?: Feature | OperationFeature): void {\r\n if (!feature) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n\r\n for (let i = features.length - 1; i >= 0; i--) {\r\n if (features[i].name === feature.name) {\r\n if (\r\n feature.setPolicy === FeatureSetPolicy.single ||\r\n features[i].setPolicy === FeatureSetPolicy.single\r\n ) {\r\n features.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n if (this.editedFeatureIndex() === -1) {\r\n features.push(feature);\r\n } else {\r\n features.splice(this.editedFeatureIndex(), 1, feature);\r\n }\r\n\r\n this.onFeatureCancel();\r\n this.features.set(features);\r\n }\r\n\r\n public onFeatureCancel(): void {\r\n this.editedFeature.set(undefined);\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n}\r\n","<div>\r\n <div class=\"form-row\">\r\n <!-- filter -->\r\n @if (filterThreshold() === 0 || features().length >= filterThreshold()) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"filter\" [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- add feature button -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Add a new feature\"\r\n (click)=\"addFeature()\"\r\n [class.in-row-button]=\"\r\n filterThreshold() === 0 || features()!.length >= filterThreshold()\r\n \"\r\n >\r\n <mat-icon>add</mat-icon>\r\n feature\r\n </button>\r\n </div>\r\n\r\n <!-- list -->\r\n @if (features().length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>feature</th>\r\n <th>value</th>\r\n <th>policy</th>\r\n @if (isVar()) {\r\n <th>negated</th>\r\n <th>global</th>\r\n <th>short-lived</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track feature; let i = $index) {\r\n <tr [class.selected]=\"i === editedFeatureIndex()\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Edit this feature\"\r\n (click)=\"editFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Delete this feature\"\r\n (click)=\"deleteFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @if (featNames()?.length) {\r\n <span>{{\r\n feature.name | flatLookup : featNames : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </td>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup : featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n <td>\r\n <span>{{ POLICIES[feature.setPolicy] }}</span>\r\n </td>\r\n @if (isVar()) {\r\n <td>\r\n <span>{{ $any(feature).isNegated ? \"yes\" : \"no\" }}</span>\r\n </td>\r\n <td>\r\n <span>{{ $any(feature).isGlobal ? \"yes\" : \"no\" }}</span>\r\n </td>\r\n <td>\r\n <span>{{ $any(feature).isShortLived ? \"yes\" : \"no\" }}</span>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- editor -->\r\n @if (editedFeature()) {\r\n <mat-expansion-panel\r\n [disabled]=\"!editedFeature()\"\r\n [expanded]=\"editedFeature()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <span>{{ editedFeature()?.name || \"feature\" }}</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-feature-editor\r\n [isVar]=\"isVar()\"\r\n [featNames]=\"featNames()\"\r\n [featValues]=\"featValues()\"\r\n [feature]=\"editedFeature()\"\r\n (featureChange)=\"onFeatureChange($event)\"\r\n (featureCancel)=\"onFeatureCancel()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n</div>\r\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport {\r\n CharNode,\r\n Feature,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-base-text-editor`\r\n *\r\n * Editor for snapshot's base text. This can receive a string or an array\r\n * of `CharNode` objects, and lets the user edit the text, character by\r\n * character, optionally also setting its features.\r\n *\r\n * Used by the `gve-snapshot-editor` component.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n BaseTextViewComponent,\r\n FeatureSetEditorComponent,\r\n ],\r\n templateUrl: './base-text-editor.component.html',\r\n styleUrl: './base-text-editor.component.css',\r\n})\r\nexport class BaseTextEditorComponent {\r\n /**\r\n * The text to edit. In input this can be a string, an array of `CharNode`\r\n * objects, or undefined. In output this will be an array of `CharNode`\r\n * objects.\r\n */\r\n public readonly text = input.required({\r\n transform: (value: CharNode[] | string | undefined) => {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n return SnapshotViewService.stringToBaseChars(value);\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n /**\r\n * Emitted for the edited text as an array of `CharNode`'s whenever it changes.\r\n */\r\n public readonly textChange = output<CharNode[]>();\r\n\r\n public readonly selectedChar = signal<CharNode | undefined>(undefined);\r\n public readonly selectedCharLabel = signal<string | undefined>(undefined);\r\n public readonly textRange = signal<VarBaseTextRange | undefined>(undefined);\r\n\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder, private _dialogService: DialogService) {\r\n this.userText = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(10000)],\r\n });\r\n this.form = formBuilder.group({\r\n userText: this.userText,\r\n });\r\n\r\n effect(() => {\r\n this.resetSelectedChar();\r\n if (!this.text()) {\r\n this.userText.reset();\r\n } else {\r\n this.userText.setValue(\r\n this.text()!\r\n .map((c) => c.label)\r\n .join('')\r\n );\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n private resetSelectedChar(): void {\r\n this.selectedChar.set(undefined);\r\n this.selectedCharLabel.set(undefined);\r\n }\r\n\r\n public onSelectedChar(event: BaseTextCharEvent): void {\r\n this.selectedChar.set(this.text()!.find((c) => c.id === event.char.id));\r\n this.selectedCharLabel.set(event.char.label);\r\n }\r\n\r\n public onFeaturesChange(features: Feature[]): void {\r\n const char = this.selectedChar();\r\n if (!char) {\r\n return;\r\n }\r\n const chars = this.text()!.map((c) =>\r\n c.id === char.id ? { ...c, features } : c\r\n );\r\n this.selectedChar.set({ ...char, features });\r\n this.textChange.emit(chars);\r\n }\r\n\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange.set(range);\r\n }\r\n\r\n public patchTextFromUser(): void {\r\n // TODO\r\n }\r\n\r\n public setTextFromUser(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Reset text?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.textChange.emit(\r\n SnapshotViewService.stringToBaseChars(this.userText.value)\r\n );\r\n }\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n @if ( $any(userText).errors?.required && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text required</mat-error>\r\n } @if ( $any(userText).errors?.maxLength && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\r\n </button> -->\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text() || []\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange.set($event)\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange()) {\r\n <div id=\"text-range\">{{ textRange()!.at }} × {{ textRange()!.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar()) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar()!.features || []\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { Observable, catchError } from 'rxjs';\r\n\r\nimport { ErrorService, EnvService } from '@myrmidon/ngx-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharNode,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { ResultWrapper } from '../models';\r\n\r\n/**\r\n * Execution step of a char-based chain operation.\r\n */\r\nexport interface ChainOperationContextStep {\r\n /**\r\n * The operation that was executed.\r\n */\r\n operation: CharChainOperation;\r\n /**\r\n * The input version tag.\r\n */\r\n inputTag: string;\r\n /**\r\n * The output version tag.\r\n */\r\n outputTag: string;\r\n /**\r\n * The string synthetically representing the resulting text\r\n * version.\r\n */\r\n result?: string;\r\n /**\r\n * The features emitted up to the executed operation.\r\n * These are the features of the text as a whole, and\r\n * those belonging to specific nodes, each keyed under\r\n * a string built with `v` + output version tag + `_`\r\n * + node ID (e.g. `v1_2` for node with ID 2 at version 1).\r\n */\r\n featureSet: {\r\n features: OperationFeature[];\r\n nodeFeatures: Record<string, OperationFeature[]>;\r\n };\r\n /**\r\n * The reference node IDs of the operation which was\r\n * executed.\r\n */\r\n refNodeIds: number[];\r\n}\r\n\r\n/**\r\n * Result of execution of a char-based chain.\r\n */\r\nexport interface CharChainResult {\r\n /**\r\n * The execution steps of the chain.\r\n */\r\n steps: ChainOperationContextStep[];\r\n /**\r\n * The chain dump, which is the text representation of the chain.\r\n */\r\n chainDump: string;\r\n /**\r\n * The list of all unique tags in the chain.\r\n */\r\n chainTags: string[];\r\n /**\r\n * The sets of nodes in their order, for each version tag.\r\n * These nodes are collected by following the path defined\r\n * by the set of links of each version tag; so each of the\r\n * sets contains only the nodes used at that step to build\r\n * the text version, with their features up to that stage.\r\n */\r\n taggedNodes: { [key: string]: CharNode[] };\r\n}\r\n\r\n/**\r\n * The input and output tags of a char-based chain operation.\r\n */\r\nexport interface ChainOperationTags {\r\n inputTag: string;\r\n outputTag: string;\r\n}\r\n\r\n/**\r\n * The node of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainNode {\r\n id: number;\r\n label: string;\r\n data: string;\r\n sourceTag?: string;\r\n}\r\n\r\n/**\r\n * The link of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainLink {\r\n tag: string;\r\n sourceId: number;\r\n targetId: number;\r\n}\r\n\r\n/**\r\n * The character-based chain, as resulting from running operations\r\n * on a base text, used for diagnostic or demonstration purposes.\r\n */\r\nexport interface CharChain {\r\n nodes: CharChainNode[];\r\n links: CharChainLink[];\r\n}\r\n\r\n/**\r\n * Service to interact with the GVE API.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveApiService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService\r\n ) {}\r\n\r\n /**\r\n * Parse the specified text into operations. Each operation is a line\r\n * of the text.\r\n * @param text The text to parse.\r\n * @returns The operations.\r\n */\r\n public parseOperations(\r\n text: string\r\n ): Observable<ResultWrapper<CharChainOperation[]>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainOperation[]>>(\r\n `${this._env.get('apiUrl')}text/operations/parse`,\r\n {\r\n text,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Run operations on the specified text.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public runOperations(\r\n text: CharNode[],\r\n operations: CharChainOperation[]\r\n ): Observable<ResultWrapper<CharChainResult>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainResult>>(\r\n `${this._env.get('apiUrl')}text/operations/run`,\r\n {\r\n text,\r\n operations,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the input and output tags for the given operations.\r\n *\r\n * @param operations The operations.\r\n * @returns Result wrapper.\r\n */\r\n public getTags(\r\n operations: CharChainOperation[]\r\n ): Observable<ResultWrapper<string[]>> {\r\n return this._http\r\n .post<ResultWrapper<string[]>>(\r\n `${this._env.get('apiUrl')}text/operations/tags`,\r\n {\r\n operations,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the chain corresponding to the operations run on the\r\n * specified text. This is used for diagnostic or demonstration\r\n * purposes.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public getChain(\r\n text: CharNode[],\r\n operations: CharChainOperation[]\r\n ): Observable<ResultWrapper<CharChain>> {\r\n return this._http\r\n .post<ResultWrapper<CharChain>>(\r\n `${this._env.get('apiUrl')}text/operations/run/chain`,\r\n {\r\n text,\r\n operations,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n input,\r\n OnInit,\r\n Optional,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharChainOperation } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { PayloadMatDialogConfig } from '../../models';\r\nimport { GveApiService } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-batch-operation-editor`\r\n *\r\n * A component to edit a batch of operations. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `preset` (`string`): the optional preset text to parse.\r\n * - 🔥 `operationsChange` (`CharChainOperation[]`): event emitted when operations change.\r\n */\r\n@Component({\r\n selector: 'gve-batch-operation-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './batch-operation-editor.component.html',\r\n styleUrl: './batch-operation-editor.component.css',\r\n})\r\nexport class BatchOperationEditorComponent implements OnInit {\r\n public readonly busy = signal<boolean>(false);\r\n public readonly parseError = signal<string | undefined>(undefined);\r\n\r\n public text: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n /**\r\n * The preset text to parse if any. Usually you start with a blank\r\n * text, but sometimes you might want to pre-set it.\r\n */\r\n public readonly preset = input<string | undefined>();\r\n\r\n /**\r\n * Emitted when operations change.\r\n */\r\n public readonly operationsChange = output<CharChainOperation[]>();\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<BatchOperationEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ preset?: string }>\r\n ) {\r\n this.text = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(2000),\r\n ]);\r\n this.form = formBuilder.group({\r\n inputOps: this.text,\r\n });\r\n\r\n effect(() => {\r\n this.parseOperations(this.preset() || undefined);\r\n });\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.preset) {\r\n this.parseOperations(this.data?.payload?.preset);\r\n }\r\n }\r\n\r\n public parseOperations(text?: string): void {\r\n if (this.busy() || !text) {\r\n return;\r\n }\r\n this.busy.set(true);\r\n this.parseError.set(undefined);\r\n\r\n this._api.parseOperations(text).subscribe({\r\n next: (wrapper) => {\r\n if (wrapper.error) {\r\n this.parseError.set(wrapper.error);\r\n return;\r\n }\r\n this.operationsChange.emit(wrapper.result || []);\r\n if (this.dialogRef) {\r\n this.dialogRef.close(wrapper.result);\r\n }\r\n },\r\n error: (error) => {\r\n this.parseError.set(error.message);\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Add Operations</h2>\r\n </div>\r\n }\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"text\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n @if (parseError()) {\r\n <div class=\"error\">{{ parseError() }}</div>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or output tags,\r\n separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>@</code> to AT to use character indexes (0-N)\r\n rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>, separated by\r\n space, where:\r\n </li>\r\n <li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove feature (no\r\n value). Suffixes: <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple), <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text into operations\"\r\n [disabled]=\"!text.value || busy()\"\r\n (click)=\"parseOperations(text.value!)\"\r\n >\r\n batch add\r\n </button>\r\n </div>\r\n </fieldset>\r\n</div>\r\n","\r\nimport { Component, effect, input, model, output } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LabeledId, OperationSource } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-operation-source-editor`\r\n *\r\n * A component to edit an operation source.\r\n * Used by chain operation editor component.\r\n *\r\n * - ▶️ `source` (`OperationSource`): the source to edit.\r\n * - ▶️ `ids` (`LabeledId[]`): the list of source IDs, when using a closed\r\n * list for them.\r\n * - ▶️ `types` (`LabeledId[]`): the list of source types, when using a closed\r\n * list for them.\r\n * - 🔥 `sourceChange` (`EventEmitter<OperationSource>`): the event emitted\r\n * when the source changes.\r\n * - 🔥 `sourceCancel` (`EventEmitter<void>`): the event emitted when the\r\n * edit is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-operation-source-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule\r\n],\r\n templateUrl: './operation-source-editor.component.html',\r\n styleUrl: './operation-source-editor.component.css',\r\n})\r\nexport class OperationSourceEditorComponent {\r\n /**\r\n * The source to edit.\r\n */\r\n public readonly source = model<OperationSource | undefined>();\r\n\r\n /**\r\n * The list of source IDs when it's a closed set.\r\n */\r\n public readonly ids = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The list of source types when it's a closed set.\r\n */\r\n public readonly types = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The event emitted when the edit is canceled.\r\n */\r\n public sourceCancel = output();\r\n\r\n public id: FormControl<string>;\r\n public type: FormControl<string>;\r\n public rank: FormControl<number>;\r\n public note: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.id = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.type = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.rank = new FormControl(0, {\r\n nonNullable: true,\r\n });\r\n this.note = new FormControl(null, {\r\n validators: [Validators.maxLength(1000)],\r\n });\r\n this.form = formBuilder.group({\r\n id: this.id,\r\n type: this.type,\r\n rank: this.rank,\r\n note: this.note,\r\n });\r\n\r\n // when source changes, update form\r\n effect(() => {\r\n this.updateForm(this.source());\r\n });\r\n }\r\n\r\n private updateForm(source?: OperationSource): void {\r\n if (!source) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.id.setValue(source.id);\r\n this.type.setValue(source.type);\r\n this.rank.setValue(source.rank || 0);\r\n this.note.setValue(source.note || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public cancel(): void {\r\n this.sourceCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.source.set({\r\n id: this.id.value,\r\n type: this.type.value,\r\n rank: this.rank.value,\r\n note: this.note.value || undefined,\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <!-- id (bound) -->\r\n @if (ids()?.length) {\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <mat-select [formControl]=\"id\">\r\n @for (i of ids(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- id (free) -->\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <input matInput [formControl]=\"id\" />\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n } @if ($any(id.errors)?.maxLength && (id.dirty || id.touched)) {\r\n <mat-error>id too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- type (bound) -->\r\n @if (types()?.length) {\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n @for (i of types(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- type (free) -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <input matInput [formControl]=\"type\" />\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n } @if ($any(type.errors)?.maxLength && (type.dirty || type.touched)) {\r\n <mat-error>type too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput [formControl]=\"note\" class=\"long-text\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\n\r\n/**\r\n * Validators for SVG.\r\n */\r\nexport class SvgValidators {\r\n /**\r\n * Validator for a valid SVG `g` root element in GVE.\r\n */\r\n static rootGValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n const parser = new DOMParser();\r\n let error = null;\r\n let svgRoot;\r\n\r\n try {\r\n const doc = parser.parseFromString(control.value, 'image/svg+xml');\r\n svgRoot =\r\n doc.documentElement.nodeName === 'svg' ? doc.documentElement : null;\r\n } catch (e) {\r\n error = { svgInvalid: { value: control.value } };\r\n }\r\n\r\n if (!error && svgRoot) {\r\n const gElements = svgRoot.getElementsByTagName('g');\r\n if (gElements.length !== 1 || svgRoot.childNodes.length > 1) {\r\n error = { svgInvalidRoot: { value: control.value } };\r\n }\r\n }\r\n\r\n return error;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Service to store and retrieve dynamic settings.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SettingsService {\r\n private readonly _cache: Map<string, unknown> = new Map<string, unknown>();\r\n private readonly _subject: BehaviorSubject<string | null> =\r\n new BehaviorSubject<string | null>(null);\r\n\r\n /**\r\n * Observable emitting the key of the setting that has changed.\r\n */\r\n public get settingChange$(): Observable<string | null> {\r\n return this._subject.asObservable();\r\n }\r\n\r\n /**\r\n * Prefix to scope the keys. This prefix is used internally to scope the keys\r\n * so that they cannot conflict with other keys in the local storage.\r\n * The prefix is totally transparent to the user of the service, who should\r\n * use the keys without the prefix.\r\n */\r\n public keyPrefix?: string;\r\n\r\n /**\r\n * True to persist the settings in the local storage by default.\r\n */\r\n public persistDefault = false;\r\n\r\n /**\r\n * Scopes the key by prefixing it with the keyPrefix if any.\r\n *\r\n * @param key The key to scope.\r\n * @returns The scoped key.\r\n */\r\n private getScopedKey(key: string): string {\r\n return this.keyPrefix ? this.keyPrefix + key : key;\r\n }\r\n\r\n private isPersist(persist?: boolean): boolean {\r\n return persist === undefined ? this.persistDefault : persist;\r\n }\r\n\r\n /**\r\n * Sets a setting's value.\r\n *\r\n * @param key The key.\r\n * @param value The value.\r\n * @param persist True to persist this setting in local storage.\r\n */\r\n public set(key: string, value: any, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.set(key, value);\r\n if (this.isPersist(persist) && value !== undefined) {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n } catch (e) {\r\n console.error(`Error saving key \"${key}\" to localStorage`, e);\r\n }\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Set multiple settings at once from the specified settings object.\r\n *\r\n * @param settings The settings to set.\r\n * @param persist True to persist these settings in local storage.\r\n */\r\n public setFrom(\r\n settings: { [key: string]: any } | undefined | null,\r\n persist?: boolean\r\n ): void {\r\n if (!settings) {\r\n return;\r\n }\r\n for (const key in settings) {\r\n if (settings.hasOwnProperty(key)) {\r\n this.set(key, settings[key], persist);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get a setting's value of type T.\r\n *\r\n * @param key The key.\r\n * @param defaultValue The default value to get when the setting\r\n * is not found in the store.\r\n * @returns The value.\r\n */\r\n public get<T>(key: string, defaultValue?: any, persist?: boolean): T {\r\n key = this.getScopedKey(key);\r\n\r\n // immediately return value from cache\r\n if (this._cache.has(key)) {\r\n return this._cache.get(key) as T;\r\n }\r\n\r\n // try loading value from local storage\r\n if (this.isPersist(persist)) {\r\n const value = localStorage.getItem(key);\r\n if (value) {\r\n try {\r\n const parsedValue = JSON.parse(value) as T;\r\n this._cache.set(key, parsedValue);\r\n return parsedValue;\r\n } catch (e) {\r\n console.error(\r\n `Error parsing value for key \"${key}\" from localStorage`,\r\n e\r\n );\r\n }\r\n }\r\n }\r\n\r\n // not found, return default value\r\n return defaultValue;\r\n }\r\n\r\n /**\r\n * Check if a key exists in the store.\r\n *\r\n * @param key The key.\r\n * @param persist True to check if the key exists in local storage.\r\n * @returns True if the key exists in the store.\r\n */\r\n public contains(key: string, persist?: boolean): boolean {\r\n key = this.getScopedKey(key);\r\n if (this._cache.has(key)) {\r\n return true;\r\n }\r\n return this.isPersist(persist) && localStorage.getItem(key) !== null;\r\n }\r\n\r\n /**\r\n * Get all the keys of the settings in the store.\r\n *\r\n * @param persist True to include keys from local storage.\r\n * @returns The keys of the settings in the store.\r\n */\r\n public getKeys(persist?: boolean): string[] {\r\n const keys: Set<string> = new Set<string>();\r\n\r\n // collect keys from local storage\r\n if (this.isPersist(persist)) {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && (!this.keyPrefix || key.startsWith(this.keyPrefix))) {\r\n keys.add(key);\r\n }\r\n }\r\n }\r\n\r\n // collect keys from cache\r\n this._cache.forEach((_, key) => keys.add(key));\r\n\r\n // return keys as array\r\n return Array.from(keys);\r\n }\r\n\r\n /**\r\n * Remove a setting if present.\r\n *\r\n * @param key The key.\r\n * @param persist True to remove the setting from local storage.\r\n */\r\n public remove(key: string, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.delete(key);\r\n\r\n if (this.isPersist(persist)) {\r\n localStorage.removeItem(key);\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Clear all settings. Warning: this will remove all settings from the\r\n * local storage if no key prefix is set.\r\n *\r\n * @param persist True to remove all settings from local storage.\r\n */\r\n public clear(persist?: boolean): void {\r\n // remove from local storage all the settings\r\n const removedKeys: Set<string> = new Set<string>();\r\n\r\n if (this.isPersist(persist)) {\r\n if (this.keyPrefix) {\r\n // collect keys to remove from local storage\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(this.keyPrefix)) {\r\n removedKeys.add(key);\r\n }\r\n }\r\n // remove collected keys from local storage\r\n removedKeys.forEach((key) => localStorage.removeItem(key));\r\n } else {\r\n localStorage.clear();\r\n }\r\n }\r\n\r\n // remove from cache all the items emitting change events\r\n this._cache.forEach((_, key) => {\r\n this._cache.delete(key);\r\n this._subject.next(key);\r\n removedKeys.delete(key);\r\n });\r\n\r\n // emit changes for the remaining removed keys\r\n // for when the cache was not in sync with the local storage\r\n removedKeys.forEach((key) => this._subject.next(key));\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, filter } from 'rxjs/operators';\r\n\r\n// material\r\nimport { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n// vendor\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { customAlphabet } from 'nanoid';\r\n\r\n// myrmidon\r\nimport { deepCopy, SafeHtmlPipe } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport {\r\n CharChainOperation,\r\n Feature,\r\n OperationFeature,\r\n OperationType,\r\n OperationSource,\r\n SnapshotBase,\r\n LabeledId,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\n// local\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\nimport { OperationSourceEditorComponent } from '../operation-source-editor/operation-source-editor.component';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { SvgValidators } from '../../validators/svg-validators';\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * Definitions for features, including names and values.\r\n */\r\nexport interface FeatureDefinitions {\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n names?: LabeledId[];\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n values?: FeatureMap;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-chain-operation-editor`\r\n *\r\n * A component for editing a variant generation operation.\r\n * Used by the `gve-snapshot-editor` component.\r\n * - ▶️ `operation` (`CharChainOperation`): the operation to edit.\r\n * - ▶️ `snapshot` (`SnapshotBase`): the snapshot the operation refers to.\r\n * - ▶️ `hidePreview` (`boolean`): whether to hide the preview request button.\r\n * - 🔥 `operationChange` (`CharChainOperation`): emitted when the operation\r\n * is changed.\r\n * - 🔥 `operationPreview` (`CharChainOperation`): emitted when the operation\r\n * preview is requested.\r\n * - 🔥 `operationCancel` (`void`): emitted when operation editing is cancelled.\r\n *\r\n * The editor is composed of many sections:\r\n * - **general**:\r\n * - ID: each operation has an ID, automatically assigned. This is not used in\r\n * the context of the operation or of its transformations, but is provided as a\r\n * reference.\r\n * - at and run: coordinates for the selection of the base text targeted by\r\n * this operation. Check `idx` when `at` is index-based rather than ID-based.\r\n * - to and to-run: a second coordinate, used by some operations.\r\n * - value: the text value argument, for those operations requiring it.\r\n * - rank and group ID.\r\n * - input and output tags.\r\n * - features. These are metadata attached to this operation, and can be any\r\n * type of name=value pairs.\r\n * - **sources**: sources are a special type of metadata used when your text\r\n * versions come from more than a single source. In this case, you can specify\r\n * the source(s) for each operation, just like in a traditional apparatus you\r\n * specify witnesses for each variant. Each source has an ID, a type, a\r\n * probability rank (0=not specified, else 1-N), and an optional free text note.\r\n * - **diplomatic**: SVG `g` code. The diplomatic section is the approximate\r\n * diplomatic representation of the layout of the annotated text. It essentially\r\n * consists in a freely editable SVG code, always grouped into a single root `g`\r\n * element, encoding all the graphical traits representing this operation.\r\n * The visual part of each operation can be placed everywhere on the snapshot,\r\n * as specified by its coordinates.\r\n * - **elements**: features of any of the SVG code elements having an ID.\r\n * The elements section lists all the SVG elements having an `id` attribute in\r\n * the SVG code of the diplomatic section. The ID allows you to attach\r\n * any number of features (metadata modeled as name=value pairs) to each of\r\n * these elements. Among these features, you may use `style` or `class` for\r\n * renditional purposes, and any other name for your own metadata. Note that\r\n * element IDs will be required also when dealing with animations. So, ensure\r\n * to assign an ID to each element you want to animate.\r\n * - **dp feats**: diplomatic features: these are features (metadata modeled\r\n * as name=value pairs) for the diplomatic representation of this operation\r\n * as a whole.\r\n */\r\n@Component({\r\n selector: 'gve-chain-operation-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n ClipboardModule,\r\n MatBadgeModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n SafeHtmlPipe,\r\n FeatureSetEditorComponent,\r\n OperationSourceEditorComponent,\r\n ],\r\n templateUrl: './chain-operation-editor.component.html',\r\n styleUrl: './chain-operation-editor.component.css',\r\n})\r\nexport class ChainOperationEditorComponent implements OnInit, OnDestroy {\r\n // monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private readonly _subs: Subscription[];\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n private _editorModel?: monaco.editor.ITextModel;\r\n private _editor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n /**\r\n * The operation to edit.\r\n */\r\n public readonly operation = model<CharChainOperation | undefined>();\r\n\r\n /**\r\n * The snapshot the operation refers to.\r\n */\r\n public readonly snapshot = input<SnapshotBase | undefined>();\r\n\r\n /**\r\n * Whether to hide the preview request button.\r\n */\r\n public readonly hidePreview = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for element features, including names and values.\r\n */\r\n public readonly elementFeatureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for diplomatic features, including names and values.\r\n */\r\n public readonly diplomaticFeatureDefs = input<\r\n FeatureDefinitions | undefined\r\n >();\r\n\r\n /**\r\n * Emitted when the operation is changed.\r\n */\r\n public readonly operationChange = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when the operation preview is requested.\r\n */\r\n public readonly operationPreview = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when operation editing is cancelled.\r\n */\r\n public readonly operationCancel = output();\r\n\r\n public readonly tabIndex = signal<number>(0);\r\n public readonly id = signal<string | undefined>(undefined);\r\n public readonly hasTo = signal<boolean>(false);\r\n public readonly hasToRun = signal<boolean>(false);\r\n public readonly hasValue = signal<boolean>(false);\r\n // elements parsed from SVG and having an id attribute;\r\n // we can attach features to each of these elements\r\n public readonly elements = signal<SVGElement[]>([]);\r\n public readonly editedElementId = signal<string | undefined>(undefined);\r\n // source\r\n public readonly editedSource = signal<OperationSource | undefined>(undefined);\r\n public readonly editedSourceIndex = signal<number>(-1);\r\n\r\n // general\r\n public rank: FormControl<number>;\r\n public groupId: FormControl<string | null>;\r\n public features: FormControl<Feature[]>;\r\n public sources: FormControl<OperationSource[]>;\r\n public type: FormControl<OperationType>;\r\n public at: FormControl<number>;\r\n public atAsIndex: FormControl<boolean>;\r\n public to: FormControl<number>;\r\n public toAsIndex: FormControl<boolean>;\r\n public inputTag: FormControl<string | null>;\r\n public outputTag: FormControl<string | null>;\r\n public run: FormControl<number>;\r\n public toRun: FormControl<number>;\r\n public value: FormControl<string | null>;\r\n // svg\r\n public svg: FormControl<string>;\r\n // elements\r\n public elementFeatures: FormControl<Record<string, Feature[]>>;\r\n // diplomatic\r\n public newTextHidden: FormControl<boolean>;\r\n public dpFeatures: FormControl<Feature[]>;\r\n // root\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _clipboard: Clipboard,\r\n private _settings: SettingsService,\r\n private _dialogService: DialogService\r\n ) {\r\n this._subs = [];\r\n // general\r\n this.rank = formBuilder.control<number>(0, { nonNullable: true });\r\n this.groupId = formBuilder.control<string | null>(null);\r\n this.features = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n this.sources = formBuilder.control<OperationSource[]>([], {\r\n nonNullable: true,\r\n });\r\n this.type = formBuilder.control<OperationType>(OperationType.replace, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.at = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.atAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.to = formBuilder.control<number>(0, { nonNullable: true });\r\n this.toAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.inputTag = formBuilder.control<string | null>(null);\r\n this.outputTag = formBuilder.control<string | null>(null);\r\n this.run = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.toRun = formBuilder.control<number>(0, { nonNullable: true });\r\n this.value = formBuilder.control<string | null>(null);\r\n\r\n // svg\r\n this.svg = formBuilder.control<string>('', {\r\n validators: [SvgValidators.rootGValidator()],\r\n nonNullable: true,\r\n });\r\n this.elementFeatures = formBuilder.control<Record<string, Feature[]>>(\r\n {},\r\n { nonNullable: true }\r\n );\r\n this.newTextHidden = formBuilder.control<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.dpFeatures = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n\r\n this.form = formBuilder.group({\r\n rank: this.rank,\r\n groupId: this.groupId,\r\n features: this.features,\r\n sources: this.sources,\r\n type: this.type,\r\n at: this.at,\r\n atAsIndex: this.atAsIndex,\r\n to: this.to,\r\n toAsIndex: this.toAsIndex,\r\n inputTag: this.inputTag,\r\n outputTag: this.outputTag,\r\n run: this.run,\r\n toRun: this.toRun,\r\n value: this.value,\r\n svg: this.svg,\r\n elementFeatures: this.elementFeatures,\r\n newTextHidden: this.newTextHidden,\r\n dpFeatures: this.dpFeatures,\r\n });\r\n\r\n // when operation changes, update form\r\n effect(() => {\r\n this.updateForm(this.operation());\r\n });\r\n\r\n // when snapshot changes, update SVG\r\n effect(() => {\r\n const snapshot = this.snapshot();\r\n const dirty = this.hasTextChanges(snapshot || undefined);\r\n if (dirty) {\r\n this.requestPreview();\r\n this._editorModel?.setValue(this.svg.value || '');\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever svg or base change, update preview\r\n this._subs.push(\r\n this.form.valueChanges\r\n .pipe(\r\n filter((changes) => 'svg' in changes || 'snapshot' in changes),\r\n debounceTime(500)\r\n )\r\n .subscribe(() => {\r\n this.requestPreview();\r\n })\r\n );\r\n\r\n // whenever type changes, update args UI\r\n this._subs.push(\r\n this.type.valueChanges.subscribe(() => this.updateArgsUI())\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._disposables.forEach((d) => d.dispose());\r\n for (const sub of this._subs) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n private hasTextChanges(snapshot?: SnapshotBase): boolean {\r\n if ((!snapshot && this.snapshot()) || (snapshot && !this.snapshot())) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.size?.width !== this.snapshot()?.size?.width ||\r\n snapshot?.size?.height !== this.snapshot()?.size?.height\r\n ) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.style !== this.snapshot()?.style ||\r\n snapshot?.text !== this.snapshot()?.text ||\r\n snapshot?.textStyle !== this.snapshot()?.textStyle\r\n ) {\r\n return true;\r\n }\r\n // compare textOptions returning true if any different\r\n const options = snapshot?.textOptions;\r\n if (\r\n options?.lineHeightOffset !==\r\n this.snapshot()?.textOptions?.lineHeightOffset ||\r\n options?.charSpacingOffset !==\r\n this.snapshot()?.textOptions?.charSpacingOffset ||\r\n options?.spcWidthOffset !== this.snapshot()?.textOptions?.spcWidthOffset\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public onCreateEditor(editor: monaco.editor.IEditor) {\r\n console.log('creating editor');\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._editorModel =\r\n this._editorModel || monaco.editor.createModel(this.svg.value, 'xml');\r\n editor.setModel(this._editorModel);\r\n this._editor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n // when the editor content changes, update the SVG control value\r\n this._editorModel.onDidChangeContent((e) => {\r\n console.log('change content');\r\n const code = this._editorModel!.getValue();\r\n if (code !== this.svg.value) {\r\n this.svg.setValue(code);\r\n this.svg.markAsDirty();\r\n this.svg.updateValueAndValidity();\r\n }\r\n })\r\n );\r\n }\r\n\r\n public onFeaturesChange(features: OperationFeature[]): void {\r\n this.features.setValue(features);\r\n this.features.markAsDirty();\r\n }\r\n\r\n public onDpFeaturesChange(features: Feature[]): void {\r\n this.dpFeatures.setValue(features);\r\n this.dpFeatures.markAsDirty();\r\n }\r\n\r\n // #region sources\r\n public addSource(): void {\r\n this.editedSource.set({ id: '', type: '' });\r\n this.editedSourceIndex.set(-1);\r\n }\r\n\r\n public editSource(index: number): void {\r\n this.editedSourceIndex.set(index);\r\n this.editedSource.set(deepCopy(this.sources.value[index]));\r\n }\r\n\r\n public closeSource(): void {\r\n this.editedSourceIndex.set(-1);\r\n this.editedSource.set(undefined);\r\n }\r\n\r\n public onSourceChange(source: OperationSource): void {\r\n const sources = [...this.sources.value];\r\n if (this.editedSourceIndex() === -1) {\r\n sources.push(source);\r\n } else {\r\n sources[this.editedSourceIndex()] = source;\r\n }\r\n this.sources.setValue(sources);\r\n this.closeSource();\r\n }\r\n // #endregion\r\n\r\n // #region svg\r\n public saveSvg(): void {\r\n if (!this.svg.value) {\r\n return;\r\n }\r\n const blob = new Blob([this.svg.value], { type: 'application/xml' });\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // create filename from date and time\r\n const now = new Date();\r\n const date = now.toISOString().split('T')[0];\r\n const time = now.toTimeString().split(' ')[0].replace(':', '-');\r\n a.download = `svg-${date}_${time}.svg`;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n public openSvgEditor(): void {\r\n const url = this._settings.get<string>(\r\n 'svg-editor',\r\n 'https://editor.method.ac/'\r\n // 'https://boxy-svg.com/app'\r\n );\r\n if (url) {\r\n if (this.svg.value) {\r\n this._clipboard.copy(this.svg.value);\r\n }\r\n window.open(url, '_blank');\r\n }\r\n }\r\n\r\n public loadSvg(): void {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = '.svg';\r\n input.onchange = () => {\r\n const file = input.files?.[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n this._editorModel?.setValue(e.target?.result as string);\r\n };\r\n reader.readAsText(file);\r\n }\r\n };\r\n input.click();\r\n }\r\n\r\n public setSvgFromClipboard(): void {\r\n navigator.clipboard.readText().then((text) => {\r\n this._editorModel?.setValue(text);\r\n });\r\n }\r\n\r\n private parseSvg(svg?: string): SVGElement[] {\r\n if (!svg) {\r\n return [];\r\n }\r\n try {\r\n // parse SVG code extracting all the SVG elements with an id attribute\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(svg, 'image/svg+xml');\r\n const elements = Array.from(doc.querySelectorAll('[id]'));\r\n\r\n // for each element, read x and y and add a transform with a translate\r\n // equal to -x and -y so that the element is at the origin. This is useful\r\n // so that the element can be previewed in its box without wasting space\r\n // just because it happens not to be placed at the SVG origin\r\n for (const element of elements) {\r\n const x = parseFloat(element.getAttribute('x') || '0');\r\n const y = parseFloat(element.getAttribute('y') || '0');\r\n element.setAttribute('transform', `translate(${-x},${-y})`);\r\n }\r\n\r\n return elements as SVGElement[];\r\n } catch (e) {\r\n this.svg.setErrors({ invalidSvg: true });\r\n return [];\r\n }\r\n }\r\n\r\n public removeDecimals(): void {\r\n const svg = this.svg.value;\r\n const newSvg = svg.replace(/(\\d+)\\.\\d+/g, '$1');\r\n this._editorModel?.setValue(newSvg);\r\n }\r\n\r\n public wrapInGroup(): void {\r\n // wrap SVG code in <g>...</g> if it does not already start with <g>\r\n const svg = this.svg.value;\r\n if (!svg.startsWith('<g')) {\r\n this._editorModel?.setValue(`<g>${svg}</g>`);\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region element features\r\n public onTabIndexChange(index: number): void {\r\n this.tabIndex.set(index);\r\n if (index === 3) {\r\n this.elements.set(this.parseSvg(this.svg.value));\r\n }\r\n }\r\n\r\n public editElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const features = this.elementFeatures.value[id] || [];\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [id]: features,\r\n });\r\n this.editedElementId.set(id);\r\n }\r\n\r\n public deleteElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const elementFeatures = { ...this.elementFeatures.value };\r\n if (!elementFeatures[id]) {\r\n return;\r\n }\r\n\r\n this._dialogService\r\n .confirm('Confirm', 'Delete element features?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n delete elementFeatures[id];\r\n this.elementFeatures.setValue(elementFeatures);\r\n\r\n if (this.editedElementId() === id) {\r\n this.editedElementId.set(undefined);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public onElementFeaturesChange(features: Feature[]): void {\r\n if (this.editedElementId()) {\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [this.editedElementId()!]: features,\r\n });\r\n this.editedElementId.set(undefined);\r\n }\r\n }\r\n // #endregion\r\n\r\n private updateArgsUI(): void {\r\n let to = false,\r\n toRun = false,\r\n value = false;\r\n switch (this.type.value) {\r\n case OperationType.moveAfter:\r\n case OperationType.moveBefore:\r\n to = true;\r\n break;\r\n case OperationType.swap:\r\n to = true;\r\n toRun = true;\r\n break;\r\n case OperationType.addAfter:\r\n case OperationType.addBefore:\r\n case OperationType.replace:\r\n value = true;\r\n break;\r\n }\r\n this.hasTo.set(to);\r\n this.hasToRun.set(toRun);\r\n this.hasValue.set(value);\r\n\r\n if (!to) {\r\n this.to.reset();\r\n }\r\n if (!toRun) {\r\n this.toRun.reset();\r\n }\r\n if (!value) {\r\n this.value.reset();\r\n }\r\n }\r\n\r\n private updateForm(operation?: CharChainOperation | null): void {\r\n if (!operation) {\r\n this.form.reset();\r\n this.updateArgsUI();\r\n return;\r\n }\r\n\r\n // get or generate ID\r\n if (operation.id) {\r\n this.id.set(operation.id);\r\n } else {\r\n this.id.set(this._nanoid());\r\n }\r\n\r\n this.rank.setValue(operation.rank || 0);\r\n this.groupId.setValue(operation.groupId || null);\r\n this.features.setValue(operation.features || []);\r\n this.sources.setValue(operation.sources || []);\r\n this.newTextHidden.setValue(\r\n operation.diplomatics?.isNewTextHidden || false\r\n );\r\n this.dpFeatures.setValue(operation.diplomatics?.features || []);\r\n\r\n this.type.setValue(operation.type);\r\n this.at.setValue(operation.at);\r\n this.atAsIndex.setValue(operation.atAsIndex || false);\r\n this.to.setValue(operation.to || 0);\r\n this.toAsIndex.setValue(operation.toAsIndex || false);\r\n this.inputTag.setValue(operation.inputTag || null);\r\n this.outputTag.setValue(operation.outputTag || null);\r\n this.run.setValue(operation.run);\r\n this.toRun.setValue(operation.toRun || 0);\r\n this.value.setValue(operation.value || null);\r\n\r\n this.svg.setValue(operation.diplomatics?.g || '');\r\n this._editorModel?.setValue(this.svg.value || '');\r\n this.elementFeatures.setValue(operation.diplomatics?.elementFeatures || {});\r\n\r\n this.form.markAsPristine();\r\n\r\n this.elements.set(this.parseSvg(operation.diplomatics?.g));\r\n\r\n this.updateArgsUI();\r\n }\r\n\r\n public cancel(): void {\r\n this.operationCancel.emit();\r\n }\r\n\r\n private getOperation(): CharChainOperation {\r\n return {\r\n rank: this.rank.value || undefined,\r\n groupId: this.groupId.value || undefined,\r\n features: this.features.value?.length ? this.features.value : undefined,\r\n sources: this.sources.value?.length ? this.sources.value : undefined,\r\n diplomatics: {\r\n g: this.svg.value,\r\n isNewTextHidden: this.newTextHidden.value,\r\n features: this.dpFeatures.value,\r\n elementFeatures: this.elementFeatures.value,\r\n },\r\n id: this.id()!,\r\n type: this.type.value,\r\n at: this.at.value,\r\n atAsIndex: this.atAsIndex.value || undefined,\r\n to: this.to.value || undefined,\r\n toAsIndex: this.toAsIndex.value || undefined,\r\n inputTag: this.inputTag.value || undefined,\r\n outputTag: this.outputTag.value || undefined,\r\n run: this.run.value,\r\n toRun: this.toRun.value || undefined,\r\n value: this.value.value || undefined,\r\n };\r\n }\r\n\r\n public requestPreview(): void {\r\n this.operationPreview.emit(this.getOperation());\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n\r\n this.operation.set(this.getOperation());\r\n this.operationChange.emit(this.operation()!);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex()\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id() }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\"\r\n ><mat-icon>layers</mat-icon> replace</mat-option\r\n >\r\n <mat-option [value]=\"1\"\r\n ><mat-icon>close</mat-icon>delete</mat-option\r\n >\r\n <mat-option [value]=\"2\"\r\n ><mat-icon>last_page</mat-icon>add-before</mat-option\r\n >\r\n <mat-option [value]=\"3\"\r\n ><mat-icon>first_page</mat-icon>add-after</mat-option\r\n >\r\n <mat-option [value]=\"4\"\r\n ><mat-icon>login</mat-icon>move-before</mat-option\r\n >\r\n <mat-option [value]=\"5\"\r\n ><mat-icon>logout</mat-icon>move-after</mat-option\r\n >\r\n <mat-option [value]=\"6\"\r\n ><mat-icon>compare_arrows</mat-icon>swap</mat-option\r\n >\r\n <mat-option [value]=\"7\"\r\n ><mat-icon>edit_note</mat-icon>annotate</mat-option\r\n >\r\n </mat-select>\r\n @if ($any(type).errors?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n @if ($any(at).errors?.required && (at.dirty || at.touched)) {\r\n <mat-error>at required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n @if ($any(run).errors?.required && (run.dirty || run.touched)) {\r\n <mat-error>run required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n @if ($any(to).errors?.required && (to.dirty || to.touched)) {\r\n <mat-error>to required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n @if ( $any(toRun).errors?.required && (toRun.dirty || toRun.touched) )\r\n {\r\n <mat-error>to run required</mat-error>\r\n }\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue()) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n @if ($any(rank).errors?.required && (rank.dirty || rank.touched)) {\r\n <mat-error>rank required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n @if ( $any(groupId).errors?.required && (groupId.dirty ||\r\n groupId.touched) ) {\r\n <mat-error>group ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [featNames]=\"featureDefs()?.names\"\r\n [featValues]=\"featureDefs()?.values\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr [class.selected]=\"s === editedSource()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (editedSource()) {\r\n <!-- source editor -->\r\n <mat-expansion-panel\r\n [disabled]=\"!editedSource()\"\r\n [expanded]=\"editedSource()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource()\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-decimals\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Remove decimals\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"removeDecimals()\"\r\n >\r\n <mat-icon>pin</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-group\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Wrap code in group\"\r\n (click)=\"wrapInGroup()\"\r\n >\r\n <mat-icon>code</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements(); track e.id) {\r\n <tr [class.selected]=\"e.id === editedElementId()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit element features\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete all element features\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n [disabled]=\"!$any(elementFeatures.value)[e.id]?.length\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n <span\r\n [matBadge]=\"$any(elementFeatures.value)[e.id]?.length || 0\"\r\n [matBadgeHidden]=\"!$any(elementFeatures.value)[e.id]?.length\"\r\n matBadgeOverlap=\"false\"\r\n >{{ e.id }}</span\r\n >\r\n </td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (editedElementId()) {\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId()\"\r\n [expanded]=\"editedElementId()\"\r\n >\r\n <mat-expansion-panel-header>{{\r\n editedElementId()\r\n }}</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [featNames]=\"elementFeatureDefs()?.names\"\r\n [featValues]=\"elementFeatureDefs()?.values\"\r\n [features]=\"elementFeatures.value[editedElementId()!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <div>\r\n <mat-checkbox [formControl]=\"newTextHidden\">hide new text</mat-checkbox>\r\n </div>\r\n <gve-feature-set-editor\r\n [featNames]=\"diplomaticFeatureDefs()?.names\"\r\n [featValues]=\"diplomaticFeatureDefs()?.values\"\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview()) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, Input, signal } from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n Feature,\r\n LabeledId,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-view`\r\n *\r\n * A component to display a list of features.\r\n * Used by the chain result view component.\r\n *\r\n * - ▶️ `features` (`Feature[]`): the features to display.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n FlatLookupPipe,\r\n ],\r\n templateUrl: './feature-set-view.component.html',\r\n styleUrl: './feature-set-view.component.css',\r\n})\r\nexport class FeatureSetViewComponent {\r\n private _sub?: Subscription;\r\n\r\n /**\r\n * The features.\r\n */\r\n public readonly features = input<Feature[] | OperationFeature[]>([]);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n public readonly filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control(null);\r\n\r\n // when features change, reset the filter and apply it\r\n effect(() => {\r\n const features = this.features();\r\n this.filter.reset();\r\n this.applyFeatureFilter();\r\n });\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures.set(\r\n this.features().filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n })\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(value);\r\n });\r\n this.applyFeatureFilter();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n}\r\n","<div>\r\n <!-- filter -->\r\n <div>\r\n @if (filterThreshold() === 0 || features()!.length > filterThreshold()) {\r\n <div class=\"form-row\">\r\n <mat-form-field id=\"filter\">\r\n <mat-label>filter</mat-label>\r\n <input matInput [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n <span id=\"badge\">{{ filteredFeatures().length }}</span>\r\n </div>\r\n }\r\n\r\n <!-- list -->\r\n @if (filteredFeatures().length) {\r\n <table>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track $index) {\r\n <tr>\r\n <th>\r\n @if (featNames.length) {\r\n <span>{{\r\n feature.name | flatLookup : featNames : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </th>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup : featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { ChainOperationContextStep } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-steps-map`\r\n *\r\n * A map of steps in a chain operation context. This shows the list of\r\n * steps in the execution of a set of operations, and allows the user to\r\n * pick a step to view.\r\n *\r\n * Used by the `gve-chain-result-view` component.\r\n *\r\n * - ▶️ `steps` (`ChainOperationContextStep[]`): the steps to display.\r\n * - ▶️ `selectedStep` (`ChainOperationContextStep`): the step that is\r\n * currently selected.\r\n * - ▶️ `textFontSize` (`string`): the font size of the steps text.\r\n * - 🔥 `selectedStepChange` (`ChainOperationContextStep`): emitted when\r\n * the selectd step has been changed by the user. This is not emitted\r\n * when the selected step is changed programmatically, unless this is\r\n * the first time the steps are set. In that case, the last step is\r\n * automatically selected.\r\n */\r\n@Component({\r\n selector: 'gve-steps-map',\r\n imports: [CommonModule, MatButtonModule, MatRippleModule, MatTooltipModule],\r\n templateUrl: './steps-map.component.html',\r\n styleUrl: './steps-map.component.css',\r\n})\r\nexport class StepsMapComponent implements AfterViewInit {\r\n // track view initialization\r\n private _viewInitialized = signal(false);\r\n // track whether we've processed the steps/selection\r\n private _selectionProcessed = signal(false);\r\n\r\n // the lines of each version text, keyed under the output tag\r\n public readonly lines = signal<{ [key: string]: string[] }>({});\r\n\r\n /**\r\n * The steps to display.\r\n */\r\n public readonly steps = input<ChainOperationContextStep[]>([]);\r\n\r\n /**\r\n * The step that is currently selected.\r\n */\r\n public readonly selectedStep = model<ChainOperationContextStep | undefined>();\r\n\r\n /**\r\n * The font size of the steps text.\r\n */\r\n public readonly textFontSize = input('0.8em');\r\n\r\n constructor() {\r\n // handle steps updates\r\n effect(() => {\r\n const currentSteps = this.steps();\r\n if (currentSteps && currentSteps.length > 0) {\r\n this.updateLines(currentSteps);\r\n } else {\r\n this.lines.set({});\r\n }\r\n\r\n // reset selection processing when steps change\r\n this._selectionProcessed.set(false);\r\n });\r\n\r\n // handle synchronization between steps and selectedStep\r\n effect(() => {\r\n // only proceed if view is initialized and we haven't processed selection yet\r\n if (this._viewInitialized() && !this._selectionProcessed()) {\r\n const currentSteps = this.steps();\r\n const currentSelectedStep = this.selectedStep();\r\n\r\n // if we have steps, handle selection\r\n if (currentSteps && currentSteps.length > 0) {\r\n if (currentSelectedStep) {\r\n // if we have both inputs, verify selection is valid\r\n this.validateAndSetSelection(currentSelectedStep);\r\n } else {\r\n // auto-select last step if no selection provided\r\n this.selectedStep.set(currentSteps[currentSteps.length - 1]);\r\n }\r\n\r\n // mark as processed\r\n this._selectionProcessed.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private validateAndSetSelection(step: ChainOperationContextStep): void {\r\n const currentSteps = this.steps();\r\n\r\n // check if the selected step exists in the steps array\r\n const stepExists = currentSteps.some((s) => s.outputTag === step.outputTag);\r\n\r\n if (stepExists) {\r\n // valid selection, keep it\r\n this.selectedStep.set(step);\r\n } else {\r\n // invalid selection, default to last step\r\n const lastStep = currentSteps[currentSteps.length - 1];\r\n this.selectedStep.set(lastStep);\r\n }\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for selection processing\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n private updateLines(steps: ChainOperationContextStep[] | undefined) {\r\n if (!steps) {\r\n this.lines.set({});\r\n return;\r\n }\r\n\r\n const lines: { [key: string]: string[] } = {};\r\n for (let i = 0; i < steps.length; i++) {\r\n const step = this.steps()![i];\r\n lines[step.outputTag] = step.result?.split('\\n') || [];\r\n }\r\n this.lines.set(lines);\r\n }\r\n\r\n public onStepClick(step: ChainOperationContextStep) {\r\n this.selectedStep.set(step);\r\n }\r\n}\r\n","<div>\r\n @if (steps().length) { @for (step of steps(); track step.outputTag) {\r\n <div\r\n matRipple\r\n class=\"step form-row\"\r\n [class.selected]=\"step === selectedStep()\"\r\n (click)=\"onStepClick(step)\"\r\n >\r\n <!-- tag -->\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} ▶ </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <!-- text lines -->\r\n <div class=\"text\" [style.fontSize]=\"textFontSize()\">\r\n @for (line of lines()[step.outputTag]; track $index) {\r\n <div class=\"line\">{{ line }}</div>\r\n }\r\n <div></div>\r\n </div>\r\n </div>\r\n } }\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n effect,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport {\r\n CharNode,\r\n Feature,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { FeatureSetViewComponent } from '../feature-set-view/feature-set-view.component';\r\nimport { StepsMapComponent } from '../steps-map/steps-map.component';\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChainResult,\r\n} from '../../services/gve-api.service';\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\n\r\n/**\r\n * 🔑 `gve-chain-result-view`\r\n *\r\n * Component to display a chain result. This provides a version picker\r\n * by staged version or simple step, and shows the selected step's text\r\n * and features, plus a steps map. User can pick a step from both the\r\n * pickers or the map.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `result` (`CharChainResult`): the result to display.\r\n * - 🔥 `stepPick` (`ChainOperationContextStep`): emitted when a\r\n * result's step is picked by the user.\r\n */\r\n@Component({\r\n selector: 'gve-chain-result-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n FeatureSetViewComponent,\r\n StepsMapComponent,\r\n BaseTextViewComponent,\r\n ],\r\n templateUrl: './chain-result-view.component.html',\r\n styleUrl: './chain-result-view.component.css',\r\n})\r\nexport class ChainResultViewComponent\r\n implements OnInit, OnDestroy, AfterViewInit\r\n{\r\n private _subs?: Subscription[];\r\n // track if we've already performed step selection\r\n private _stepSelectionDone = signal(false);\r\n // track if component view is initialized\r\n private _viewInitialized = signal(false);\r\n\r\n /**\r\n * The result to display.\r\n */\r\n public readonly result = input<CharChainResult | undefined>();\r\n\r\n /**\r\n * The index of the initial step to display after the result is set.\r\n * If the index is negative, it is counted from the end of the steps.\r\n */\r\n public readonly initialStepIndex = input<number | undefined>();\r\n\r\n /**\r\n * Emitted when a result's step is picked by the user.\r\n */\r\n public readonly stepPick = output<ChainOperationContextStep>();\r\n\r\n public readonly versionTags = signal<string[]>([]);\r\n public readonly tags = signal<string[]>([]);\r\n public readonly step = signal<ChainOperationContextStep | undefined>(\r\n undefined\r\n );\r\n public readonly selection = signal<string | undefined>(undefined);\r\n public readonly selectionFeatures = signal<OperationFeature[]>([]);\r\n\r\n public versionTag: FormControl<string | null>;\r\n public tag: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // bind callback methods\r\n this.getCharColor = this.getCharColor.bind(this);\r\n // this.getCharBorderColor = this.getCharBorderColor.bind(this);\r\n\r\n this.versionTag = formBuilder.control<string | null>(null);\r\n this.tag = formBuilder.control<string | null>(null);\r\n\r\n // when result changes, update the form\r\n effect(() => {\r\n this.updateForm(this.result());\r\n // select the initial step if set\r\n this.selectInitialStep(this.initialStepIndex());\r\n });\r\n\r\n // when either the result or initialStepIndex changes, try to select a step\r\n effect(() => {\r\n // only proceed if we haven't already done selection and view is ready\r\n if (!this._stepSelectionDone() && this._viewInitialized()) {\r\n const currentResult = this.result();\r\n const currentIndex = this.initialStepIndex();\r\n\r\n // if we have both pieces of data needed for selection, do it\r\n if (currentResult?.steps?.length && currentIndex !== undefined) {\r\n this.doInitialStepSelection(currentResult, currentIndex);\r\n this._stepSelectionDone.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private doInitialStepSelection(\r\n result: CharChainResult,\r\n initialStepIndex: number\r\n ): void {\r\n // calculate the effective index (handling negative indices)\r\n const effectiveIndex =\r\n initialStepIndex < 0\r\n ? result.steps.length + initialStepIndex\r\n : initialStepIndex;\r\n\r\n // ensure the index is valid\r\n if (effectiveIndex >= 0 && effectiveIndex < result.steps.length) {\r\n const targetStep = result.steps[effectiveIndex];\r\n\r\n // if we have a tag control (which we do based on your code)\r\n if (targetStep.outputTag) {\r\n // using the tag control ensures all the necessary updates happen\r\n this.tag.setValue(targetStep.outputTag);\r\n }\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [\r\n // whenever the staged version tag changes, update the tag\r\n this.versionTag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.tag.setValue(this.getTagFromVersion(value) || null);\r\n }),\r\n\r\n // whenever the tag changes, update the step\r\n this.tag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.selectionFeatures.set([]); // reset selection features\r\n this.step.set(\r\n this.result()?.steps.find((step) => step.outputTag === value)\r\n );\r\n if (this.step()) {\r\n this.stepPick.emit(this.step()!);\r\n }\r\n }),\r\n ];\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for initial selection\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n public getCharColor(node: CharNode): string | null {\r\n const features = this.getNodeFeatures(node.id);\r\n return features?.some(\r\n (f) => f.name === '$seg-out' || f.name === '$seg2-out'\r\n )\r\n ? 'orange'\r\n : null;\r\n }\r\n\r\n private selectInitialStep(initialStepIndex?: number): void {\r\n if (initialStepIndex !== undefined && this.result()?.steps) {\r\n this.step.set(\r\n this.result()!.steps[\r\n initialStepIndex < 0\r\n ? this.result()!.steps.length + initialStepIndex\r\n : initialStepIndex\r\n ]\r\n );\r\n } else {\r\n this.step.set(undefined);\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subs?.forEach((sub) => sub.unsubscribe());\r\n }\r\n\r\n private updateVersionTags(): void {\r\n if (!this.result()) {\r\n this.versionTags.set([]);\r\n return;\r\n }\r\n\r\n // extract version tags from result steps features named 'version'\r\n const tags = new Set<string>();\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version') {\r\n tags.add(feature.value);\r\n }\r\n }\r\n }\r\n this.versionTags.set(Array.from(tags).sort());\r\n }\r\n\r\n private getTagFromVersion(version?: string | null): string | undefined {\r\n if (!this.result() || !version) {\r\n return undefined;\r\n }\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version' && feature.value === version) {\r\n return step.outputTag;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private updateForm(result?: CharChainResult): void {\r\n this.selectionFeatures.set([]);\r\n\r\n if (!result) {\r\n this.step.set(undefined);\r\n this.selection.set(undefined);\r\n this.tags.set([]);\r\n this.versionTags.set([]);\r\n } else {\r\n this.tags.set(result.chainTags.filter((t) => t.length > 0 && t !== 'v0'));\r\n this.updateVersionTags();\r\n }\r\n\r\n // reset step selection tracking when result changes\r\n this._stepSelectionDone.set(false);\r\n }\r\n\r\n private getNodeFeatures(id: number): Feature[] {\r\n if (!this.step()) {\r\n return [];\r\n }\r\n return (\r\n this.step()!.featureSet.nodeFeatures[this.step()!.outputTag + '_' + id] ||\r\n []\r\n );\r\n }\r\n\r\n private findNode(id: number): CharNode | null {\r\n if (!this.step()) {\r\n return null;\r\n }\r\n for (let key of Object.keys(this.result()!.taggedNodes)) {\r\n const node = this.result()!.taggedNodes[key].find((n) => n.id === id);\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public onTextCharPick(event: BaseTextCharEvent): void {\r\n const features = this.getNodeFeatures(event.char.id);\r\n const node = this.findNode(event.char.id)!;\r\n this.selection.set(`${event.char.label} (${node.sourceTag})`);\r\n this.selectionFeatures.set([...features]);\r\n }\r\n\r\n public onTextRangePick(range: VarBaseTextRange): void {\r\n if (range.run === 1) {\r\n // already handled by onStepCharPick\r\n return;\r\n }\r\n this.selection.set(range.at + '×' + range.run);\r\n const end = range.at + range.run;\r\n\r\n const features: Feature[] = [];\r\n const tagNodes = this.result()!.taggedNodes[this.tag.value!];\r\n\r\n for (let node of tagNodes) {\r\n // if in range, intersect features\r\n if (node.id >= range.at && node.id < end) {\r\n const nodeFeatures = this.getNodeFeatures(node.id);\r\n\r\n if (node.id === range.at) {\r\n for (let f of nodeFeatures) {\r\n features.push(f);\r\n }\r\n } else {\r\n // features = intersection of features and charFeatures\r\n features.splice(\r\n 0,\r\n features.length,\r\n ...features.filter((f) =>\r\n nodeFeatures.some((cf) => cf.name === f.name)\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.selectionFeatures.set(features);\r\n }\r\n\r\n public onStepChange(step?: ChainOperationContextStep): void {\r\n this.selectionFeatures.set([]);\r\n if (step) {\r\n // setting the tag will trigger the step change\r\n this.tag.setValue(step.outputTag);\r\n }\r\n }\r\n}\r\n","@if (result()) {\r\n<div id=\"container\">\r\n <div id=\"bar\" class=\"form-row\">\r\n <!-- version -->\r\n @if (versionTags().length) {\r\n <mat-form-field>\r\n <mat-label>version</mat-label>\r\n <mat-select [formControl]=\"versionTag\">\r\n <mat-option [value]=\"null\">-</mat-option>\r\n @for (t of versionTags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <!-- tag -->\r\n @if (tags().length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- step -->\r\n @if (step()) {\r\n <div id=\"step\">\r\n <!-- text -->\r\n <div id=\"text\">\r\n <gve-base-text-view\r\n [text]=\"result()!.taggedNodes[step()!.outputTag]\"\r\n [colorCallback]=\"getCharColor\"\r\n (charPick)=\"onTextCharPick($event)\"\r\n (rangePick)=\"onTextRangePick($event)\"\r\n />\r\n </div>\r\n <!-- features -->\r\n <div id=\"feats\" class=\"form-row-top\">\r\n <div id=\"g-feats\">\r\n <div class=\"feat-header\">{{ step()!.outputTag }}</div>\r\n <gve-feature-set-view [features]=\"step()!.featureSet.features\" />\r\n </div>\r\n <div id=\"n-feats\">\r\n @if (selectionFeatures().length) {\r\n <div class=\"feat-header\">{{ selection() }}</div>\r\n <gve-feature-set-view [features]=\"selectionFeatures()\" />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- steps map -->\r\n <div id=\"map\">\r\n <gve-steps-map\r\n [steps]=\"result()!.steps\"\r\n [selectedStep]=\"step()\"\r\n (selectedStepChange)=\"onStepChange($event)\"\r\n />\r\n </div>\r\n</div>\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CharChain, CharChainNode } from './gve-api.service';\r\n\r\n// You can use this online tool to visualize the graph:\r\n// https://dreampuf.github.io/GraphvizOnline\r\n// You can also append ?engine=dot#... where ... is the graphviz code.\r\n\r\n// https://graphviz.org/docs/attr-types/rankdir\r\nexport type GraphvizRankdir = 'TB' | 'LR' | 'BT' | 'RL';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveGraphvizService {\r\n private hashString(str: string): number {\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\r\n hash = hash & hash; // convert to 32bit integer\r\n }\r\n return Math.abs(hash);\r\n }\r\n\r\n private hslToRgb(hue: number, saturation: number, lightness: number): string {\r\n const chroma =\r\n ((1 - Math.abs((2 * lightness) / 100 - 1)) * saturation) / 100;\r\n const x = chroma * (1 - Math.abs(((hue / 60) % 2) - 1));\r\n const m = lightness / 100 - chroma / 2;\r\n let r = 0,\r\n g = 0,\r\n b = 0;\r\n\r\n if (hue >= 0 && hue < 60) {\r\n r = chroma;\r\n g = x;\r\n } else if (hue >= 60 && hue < 120) {\r\n r = x;\r\n g = chroma;\r\n } else if (hue >= 120 && hue < 180) {\r\n g = chroma;\r\n b = x;\r\n } else if (hue >= 180 && hue < 240) {\r\n g = x;\r\n b = chroma;\r\n } else if (hue >= 240 && hue < 300) {\r\n r = x;\r\n b = chroma;\r\n } else if (hue >= 300 && hue < 360) {\r\n r = chroma;\r\n b = x;\r\n }\r\n\r\n r = Math.round((r + m) * 255);\r\n g = Math.round((g + m) * 255);\r\n b = Math.round((b + m) * 255);\r\n\r\n return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;\r\n }\r\n\r\n private getColorForTag(tag: string): string {\r\n const hash = this.hashString(tag);\r\n const hue = (hash * 137) % 360; // Use a prime number to spread out the hues\r\n const saturation = 60 + (hash % 40); // Saturation between 60% and 100%\r\n const lightness = 50 + (hash % 30); // Lightness between 50% and 80%\r\n return this.hslToRgb(hue, saturation, lightness);\r\n }\r\n\r\n private getExcludedNodeIds(chain: CharChain, tags?: string[]): Set<number> {\r\n // get only the desired links\r\n const links = chain.links.filter((link) =>\r\n tags ? tags.includes(link.tag) : true\r\n );\r\n // return all the nodes not referenced by the links\r\n const excluded = new Set<number>();\r\n chain.nodes.forEach((node) => {\r\n excluded.add(node.id);\r\n });\r\n links.forEach((link) => {\r\n excluded.delete(link.sourceId);\r\n excluded.delete(link.targetId);\r\n });\r\n return excluded;\r\n }\r\n\r\n /**\r\n * Represent the received chain as a Graphviz digraph.\r\n *\r\n * @param chain The source chain if any.\r\n * @param tags The tags to show. When set, only the links with these tags are shown.\r\n * @param rankdir The rank direction.\r\n * @returns Graphviz representation of the chain.\r\n */\r\n public generateGraph(\r\n chain?: CharChain,\r\n tags?: string[],\r\n rankdir: GraphvizRankdir = 'LR'\r\n ): string {\r\n if (!chain) {\r\n return 'digraph G {}';\r\n }\r\n\r\n const sb: string[] = [];\r\n const excludedNodeIds = this.getExcludedNodeIds(chain, tags);\r\n\r\n sb.push('digraph G {');\r\n sb.push(' bgcolor=transparent;');\r\n sb.push(' node [style=filled];');\r\n sb.push(` rankdir=${rankdir};`);\r\n chain.nodes.forEach((node) => {\r\n // note that in label we must escape the double quotes\r\n sb.push(\r\n ` ${node.id} [label=\"${node.label === '\"' ? '\"' : node.label}\"` +\r\n (node.sourceTag\r\n ? ` fillcolor=\"${this.getColorForTag(node.sourceTag)}\"`\r\n : '') +\r\n (node.sourceTag && excludedNodeIds.has(node.id)\r\n ? ` xlabel=\"${node.sourceTag}\"`\r\n : '') +\r\n '];'\r\n );\r\n });\r\n chain.links.forEach((link) => {\r\n if (\r\n !link.sourceId ||\r\n !link.targetId ||\r\n (tags && !tags.includes(link.tag))\r\n ) {\r\n return;\r\n }\r\n const color = this.getColorForTag(link.tag);\r\n sb.push(\r\n ` ${link.sourceId} -> ${link.targetId} [label=\"${link.tag}\", color=\"${color}\"];`\r\n );\r\n });\r\n sb.push('}');\r\n return sb.join('\\n');\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n} from '@angular/core';\r\n\r\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Clipboard } from '@angular/cdk/clipboard';\r\n\r\nimport { VizComponent } from '@myrmidon/ngx-viz';\r\n\r\nimport {\r\n GraphvizRankdir,\r\n GveGraphvizService,\r\n} from '../../services/gve-graphviz.service';\r\nimport { CharChain } from '../../services/gve-api.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\n\r\n@Component({\r\n selector: 'gve-chain-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n VizComponent\r\n],\r\n templateUrl: './chain-view.component.html',\r\n styleUrl: './chain-view.component.css',\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n})\r\nexport class ChainViewComponent implements OnDestroy {\r\n private readonly _sub?: Subscription;\r\n\r\n /**\r\n * The chain to display.\r\n */\r\n public readonly chain = input<CharChain | undefined>();\r\n\r\n /**\r\n * The direction of the graph.\r\n */\r\n public readonly direction = input<GraphvizRankdir>('LR');\r\n\r\n /**\r\n * All the distinct tags in the chain.\r\n */\r\n public readonly tags = computed(() => {\r\n const chain = this.chain();\r\n if (!chain) {\r\n return [];\r\n }\r\n const set = new Set<string>();\r\n for (const link of chain.links) {\r\n set.add(link.tag);\r\n }\r\n return Array.from(set).sort();\r\n });\r\n\r\n /**\r\n * The tags to show, or empty to show all of them.\r\n */\r\n public readonly selectedTags = model<string[]>([]);\r\n\r\n /**\r\n * The Graphviz representation of the chain.\r\n */\r\n public readonly graph = computed(() => {\r\n let tags: string[] | undefined = this.selectedTags();\r\n if (tags && tags.length === 0) {\r\n tags = undefined;\r\n }\r\n return this._graphviz.generateGraph(this.chain(), tags, this.direction());\r\n });\r\n\r\n public userTags: FormControl<string[]> = new FormControl([], {\r\n nonNullable: true,\r\n });\r\n\r\n constructor(\r\n private _graphviz: GveGraphvizService,\r\n private _settings: SettingsService,\r\n private _clipboard: Clipboard,\r\n private _snackbar: MatSnackBar\r\n ) {\r\n // when the user changes the tags, update the selected tags\r\n this._sub = this.userTags.valueChanges.subscribe((value: string[]) => {\r\n this.selectedTags.set([...value]);\r\n });\r\n\r\n effect(() => {\r\n // update the user tags when tags change\r\n const tags = this.tags();\r\n let userTags: string[] = [];\r\n if (tags.length > 1) {\r\n // pick first and last tag from tags\r\n userTags = [tags[0], tags[tags.length - 1]];\r\n } else {\r\n // if there is only one tag, pick it\r\n userTags = [...tags];\r\n }\r\n this.userTags.setValue(userTags);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public copyGraph(): void {\r\n const graph = this.graph();\r\n if (!graph) {\r\n return;\r\n }\r\n this._clipboard.copy(graph);\r\n this._snackbar.open('Graph copied to clipboard', 'OK', {\r\n duration: 2000,\r\n });\r\n }\r\n\r\n public openExternalEditor(): void {\r\n let url = this._settings.get<string>(\r\n 'graphviz-editor',\r\n 'https://dreampuf.github.io/GraphvizOnline?engine=dot#CODE'\r\n );\r\n if (!url) {\r\n return;\r\n }\r\n const graph = this.graph();\r\n if (!graph) {\r\n return;\r\n }\r\n if (url.indexOf('CODE') > -1) {\r\n url = url.replace('CODE', encodeURIComponent(graph));\r\n }\r\n window.open(url, '_blank');\r\n }\r\n}\r\n","<div id=\"container\">\r\n <div>\r\n <ngx-viz [code]=\"graph()\" />\r\n </div>\r\n <div class=\"button-row\">\r\n <!-- select -->\r\n <mat-form-field>\r\n <mat-label>tags</mat-label>\r\n <mat-select [formControl]=\"userTags\" multiple>\r\n @for (tag of tags(); track tag) {\r\n <mat-option [value]=\"tag\">{{ tag }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- copy -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy graphviz code\"\r\n [disabled]=\"!graph()\"\r\n (click)=\"copyGraph()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <!--editor -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open in editor\"\r\n [disabled]=\"!graph()\"\r\n (click)=\"openExternalEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n computed,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n/**\r\n * 🔑 `gve-ln-heights-editor`\r\n *\r\n * A component to edit line heights.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `lineCount` (`number`): the number of lines.\r\n * - ▶️ `heights` (`Record<number, number>`): the line heights.\r\n * - 🔥 `heightsChange` (`EventEmitter<Record<number, number>>`): the event\r\n * emitted when the heights change.\r\n */\r\n@Component({\r\n selector: 'gve-ln-heights-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './ln-heights-editor.component.html',\r\n styleUrl: './ln-heights-editor.component.css',\r\n})\r\nexport class LnHeightsEditorComponent implements OnInit, OnDestroy {\r\n private _subs?: Subscription[];\r\n private _heights?: Record<number, number>;\r\n\r\n public lineNumber: FormControl<number>;\r\n public height: FormControl<number>;\r\n\r\n /**\r\n * The total number of lines in the text.\r\n */\r\n public readonly lineCount = input<number>(0);\r\n\r\n /**\r\n * The heights map of the lines. Each key is a line number and the value is\r\n * the height of the line.\r\n */\r\n public readonly heights = input<Record<number, number> | undefined>();\r\n\r\n /**\r\n * The event emitted when the heights change.\r\n */\r\n public readonly heightsChange = output<Record<number, number> | undefined>();\r\n\r\n // when lineCount changes, update lineNumbers\r\n public readonly lineNumbers = computed(() =>\r\n Array.from({ length: this.lineCount() }, (_, i) => i + 1)\r\n );\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.lineNumber = formBuilder.control(0, { nonNullable: true });\r\n this.height = formBuilder.control(0, { nonNullable: true });\r\n }\r\n\r\n private pruneHeights(): void {\r\n // remove all the heigths with value=0\r\n this._heights = Object.fromEntries(\r\n Object.entries(this._heights || {}).filter(([_, v]) => v !== 0)\r\n );\r\n // if heights are now empty, set to undefined\r\n if (Object.keys(this._heights).length === 0) {\r\n this._heights = undefined;\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [];\r\n // update heights[ln] when height changes and emit heightsChange\r\n this._subs.push(\r\n this.height.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) {\r\n this._heights = {};\r\n }\r\n const ln = this.lineNumber.value;\r\n const newHeights = { ...(this._heights || {}) };\r\n newHeights[ln] = value;\r\n this._heights = Object.fromEntries(\r\n Object.entries(newHeights).filter(([_, v]) => v !== 0)\r\n );\r\n if (Object.keys(this._heights).length === 0) {\r\n this._heights = undefined;\r\n }\r\n this.heightsChange.emit(this._heights);\r\n })\r\n );\r\n\r\n // update height when line number changes\r\n this._subs.push(\r\n this.lineNumber.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) return;\r\n this.height.setValue(this._heights[value] || 0);\r\n })\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subs?.forEach((sub) => sub.unsubscribe());\r\n }\r\n\r\n public reset(): void {\r\n this._heights = undefined;\r\n this.heightsChange.emit(undefined);\r\n }\r\n}\r\n","@if (lineNumbers().length) {\r\n <div class=\"form-row\">\r\n <!-- line number -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>line</mat-label>\r\n <mat-select [formControl]=\"lineNumber\">\r\n @for (n of lineNumbers(); track n) {\r\n <mat-option [value]=\"n\">\r\n {{ n }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n @if (lineNumber.value) {\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input matInput type=\"number\" [formControl]=\"height\" min=\"0\" />\r\n </mat-form-field>\r\n }\r\n\r\n <!-- reset button -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Remove all the heights\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </div>\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n model,\r\n OnInit,\r\n Optional,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharNode, SnapshotViewService } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { PayloadMatDialogConfig } from '../../models';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-text-editor`\r\n *\r\n * A component to edit a snapshot text. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `text` (`CharNode[]`): the text to edit.\r\n * - 🔥 `textChange` (`CharNode[]`): event emitted when text changes.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './snapshot-text-editor.component.html',\r\n styleUrl: './snapshot-text-editor.component.css',\r\n})\r\nexport class SnapshotTextEditorComponent implements OnInit {\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public readonly text = model<CharNode[]>([]);\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<SnapshotTextEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ text?: CharNode[] }>\r\n ) {\r\n this.userText = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(5000)],\r\n });\r\n this.form = new FormGroup({\r\n userText: this.userText,\r\n });\r\n\r\n // when text changes, update the user text\r\n effect(() => {\r\n this.updateUserText(this.text());\r\n });\r\n }\r\n\r\n private updateUserText(nodes: CharNode[]): void {\r\n this.userText.setValue(nodes.map((node) => node.label).join(''));\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.text) {\r\n this.text.set(this.data.payload.text);\r\n }\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userText.setValue(this.userText.value.trim());\r\n if (!this.userText.value) {\r\n return;\r\n }\r\n this.text.set(SnapshotViewService.stringToBaseChars(this.userText.value));\r\n this.dialogRef?.close(this.text());\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Set Base Text</h2>\r\n </div>\r\n }\r\n <form [formGroup]=\"form\" (submit)=\"save()\">\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>base text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"8\"></textarea>\r\n @if ($any(userText).errors?.required && (userText.dirty ||\r\n userText.touched)) {\r\n <mat-error>text required</mat-error>\r\n } @if ($any(userText).errors?.maxLength && (userText.dirty ||\r\n userText.touched)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Set base text\"\r\n [disabled]=\"form.invalid\"\r\n (click)=\"save()\"\r\n >\r\n set\r\n </button>\r\n </div>\r\n </fieldset>\r\n </form>\r\n</div>\r\n","import {\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { customAlphabet } from 'nanoid';\r\n\r\nimport { deepCopy, FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharDecoration,\r\n CharNode,\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS,\r\n Feature,\r\n GveAnimationTimeline,\r\n GveVisualEvent,\r\n Snapshot,\r\n SnapshotViewComponent,\r\n SnapshotViewData,\r\n SnapshotViewRenderEvent,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationEditorComponent,\r\n FeatureDefinitions,\r\n} from '../chain-operation-editor/chain-operation-editor.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChain,\r\n CharChainResult,\r\n GveApiService,\r\n} from '../../services/gve-api.service';\r\nimport { ChainResultViewComponent } from '../chain-result-view/chain-result-view.component';\r\nimport { LnHeightsEditorComponent } from '../ln-heights-editor/ln-heights-editor.component';\r\nimport { AnimationTimelineSetComponent } from '../animation-timeline-set/animation-timeline-set.component';\r\nimport { BatchOperationEditorComponent } from '../batch-operation-editor/batch-operation-editor.component';\r\nimport { SnapshotTextEditorComponent } from '../snapshot-text-editor/snapshot-text-editor.component';\r\nimport { ChainViewComponent } from '../chain-view/chain-view.component';\r\n\r\n// default snapshot view title\r\nconst VIEW_TITLE = 'preview';\r\n\r\n// suffix for IDs of SVG elements to be made transparent at first rendition\r\nconst SVG_TRANSP_SUFFIX = '_t';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-editor`\r\n *\r\n * A component to edit a text snapshot. This is the top level component in the GVE core\r\n * library.\r\n *\r\n * - ▶️ `snapshot` (`Snapshot`): the snapshot to edit.\r\n * - ▶️ `batchOps` (`string`): the batch operations text to set for the editor.\r\n * - ▶️ `noSave` (`boolean`): true to disable saving.\r\n * - 🔥 `snapshotChange` (`Snapshot`): emitted when the user saves the edited snapshot.\r\n * - 🔥 `snapshotCancel` (`void`): emitted when the user cancels the snapshot editing.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-editor',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatSliderModule,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ChainOperationEditorComponent,\r\n ChainResultViewComponent,\r\n BaseTextViewComponent,\r\n LnHeightsEditorComponent,\r\n AnimationTimelineSetComponent,\r\n FlatLookupPipe,\r\n ChainViewComponent,\r\n ],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './snapshot-editor.component.html',\r\n styleUrl: './snapshot-editor.component.css',\r\n})\r\nexport class SnapshotEditorComponent {\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n private _renderer?: SnapshotViewService;\r\n private _previewing?: boolean;\r\n private _transparentIds?: string[];\r\n private _stepPickFrozen?: boolean;\r\n private _handlingOver?: boolean;\r\n private _lastOverId?: string;\r\n\r\n @ViewChild('snapshotView', { static: false })\r\n public snapshotView?: ElementRef<SnapshotViewComponent>;\r\n\r\n /**\r\n * The snapshot to edit.\r\n */\r\n public readonly snapshot = model<Snapshot | undefined>();\r\n\r\n /**\r\n * The batch operations text to set for the editor.\r\n */\r\n public readonly batchOps = input<string | undefined>();\r\n\r\n /**\r\n * True to disable saving.\r\n */\r\n public readonly noSave = input<boolean | undefined>();\r\n\r\n /**\r\n * True to enable debug mode for view rendition.\r\n */\r\n public readonly debug = input<boolean | undefined>();\r\n\r\n /**\r\n * True to not show character decoration according to the trace\r\n * features in nodes.\r\n */\r\n public readonly noDecoration = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for element features, including names and values.\r\n */\r\n public readonly elementFeatureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for diplomatic features, including names and values.\r\n */\r\n public readonly diplomaticFeatureDefs = input<\r\n FeatureDefinitions | undefined\r\n >();\r\n\r\n /**\r\n * Emitted when the user cancels the snapshot editing.\r\n */\r\n public readonly snapshotCancel = output();\r\n\r\n // general\r\n public width: FormControl<number>;\r\n public height: FormControl<number>;\r\n public style: FormControl<string | null>;\r\n // base text\r\n public baseText: FormControl<CharNode[]>;\r\n public offsetX: FormControl<number>;\r\n public offsetY: FormControl<number>;\r\n public lineHeightOffset: FormControl<number>;\r\n public lnHeights: FormControl<Record<number, number> | null>;\r\n public charSpacingOffset: FormControl<number>;\r\n public spcWidthOffset: FormControl<number>;\r\n public textStyle: FormControl<string | null>;\r\n // operations\r\n public operations: FormControl<CharChainOperation[]>;\r\n public opStyle: FormControl<string | null>;\r\n public form: FormGroup;\r\n // image and defs\r\n public imageUrl: FormControl<string | null>;\r\n public imageOpacity: FormControl<number>;\r\n public imageX: FormControl<number>;\r\n public imageY: FormControl<number>;\r\n public imageWidth: FormControl<number>;\r\n public imageHeight: FormControl<number>;\r\n public defs: FormControl<string | null>;\r\n // timelines\r\n public timelines: FormControl<GveAnimationTimeline[]>;\r\n\r\n public readonly showChain: FormControl<boolean> = new FormControl<boolean>(\r\n false,\r\n { nonNullable: true }\r\n );\r\n\r\n public readonly chain = signal<CharChain | undefined>(undefined);\r\n\r\n // list of operations output tags\r\n public readonly opTags = signal<string[]>([]);\r\n // list of operation diplomatic.g element IDs\r\n public readonly opElementIds = signal<string[]>([]);\r\n // the currently picked base text range\r\n public readonly textRange = signal<VarBaseTextRange | undefined>(undefined);\r\n // the lines count for the current base text\r\n public readonly lineCount = signal<number>(0);\r\n // the currently edited operation\r\n public readonly editedOp = signal<CharChainOperation | undefined>(undefined);\r\n public readonly editedOpIndex = signal<number>(-1);\r\n\r\n public readonly busy = signal<boolean>(false);\r\n\r\n public readonly opTypeMap = {\r\n 0: 'replace',\r\n 1: 'delete',\r\n 2: 'add-before',\r\n 3: 'add-after',\r\n 4: 'move-before',\r\n 5: 'move-after',\r\n 6: 'swap',\r\n 7: 'annotate',\r\n };\r\n\r\n // snapshot view data\r\n public viewTitle = VIEW_TITLE;\r\n public viewData?: SnapshotViewData;\r\n public visualInfo?: string;\r\n public rulers = true;\r\n\r\n // operations execution result\r\n public result?: CharChainResult;\r\n public resultOperationId?: string;\r\n public initialStepIndex = -1;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n private _dialog: MatDialog,\r\n private _dialogService: DialogService,\r\n private _snackbar: MatSnackBar\r\n ) {\r\n // general\r\n this.width = new FormControl<number>(800, { nonNullable: true });\r\n this.height = new FormControl<number>(600, { nonNullable: true });\r\n this.style = new FormControl<string | null>(null);\r\n // base text\r\n this.baseText = new FormControl<CharNode[]>([], {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n });\r\n this.offsetX = new FormControl<number>(0, { nonNullable: true });\r\n this.offsetY = new FormControl<number>(0, { nonNullable: true });\r\n this.lineHeightOffset = new FormControl<number>(\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS.lineHeightOffset,\r\n { nonNullable: true }\r\n );\r\n this.lnHeights = new FormControl<Record<number, number> | null>(null);\r\n this.charSpacingOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.spcWidthOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.textStyle = new FormControl<string | null>(null);\r\n\r\n // operations\r\n this.operations = new FormControl<CharChainOperation[]>([], {\r\n nonNullable: true,\r\n });\r\n this.opStyle = new FormControl<string | null>(null);\r\n // image\r\n this.imageUrl = new FormControl<string | null>(null);\r\n this.imageOpacity = new FormControl<number>(1, { nonNullable: true });\r\n this.imageX = new FormControl<number>(0, { nonNullable: true });\r\n this.imageY = new FormControl<number>(0, { nonNullable: true });\r\n this.imageWidth = new FormControl<number>(0, { nonNullable: true });\r\n this.imageHeight = new FormControl<number>(0, { nonNullable: true });\r\n this.defs = new FormControl<string | null>(null);\r\n\r\n // timelines\r\n this.timelines = new FormControl<GveAnimationTimeline[]>([], {\r\n nonNullable: true,\r\n });\r\n\r\n // form\r\n this.form = formBuilder.group({\r\n width: this.width,\r\n height: this.height,\r\n style: this.style,\r\n baseText: this.baseText,\r\n offsetX: this.offsetX,\r\n offsetY: this.offsetY,\r\n lineHeightOffset: this.lineHeightOffset,\r\n lnHeights: this.lnHeights,\r\n charSpacingOffset: this.charSpacingOffset,\r\n spcWidthOffset: this.spcWidthOffset,\r\n textStyle: this.textStyle,\r\n operations: this.operations,\r\n opStyle: this.opStyle,\r\n // image\r\n imageUrl: this.imageUrl,\r\n imageOpacity: this.imageOpacity,\r\n imageX: this.imageX,\r\n imageY: this.imageY,\r\n imageWidth: this.imageWidth,\r\n imageHeight: this.imageHeight,\r\n defs: this.defs,\r\n // timelines\r\n timelines: this.timelines,\r\n });\r\n\r\n // when snapshot changes, update the form\r\n effect(() => {\r\n this.updateForm(this.snapshot());\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n });\r\n }\r\n\r\n /**\r\n * Set the view data for the snapshot view.\r\n *\r\n * @param snapshot The optional snapshot data to use. If not provided,\r\n * a snapshot will be created from the form data.\r\n * @param title The optional title to set for the view.\r\n */\r\n private setViewData(snapshot?: Snapshot, title = VIEW_TITLE): void {\r\n console.log('set view data');\r\n\r\n // get the snapshot to use\r\n if (!snapshot) {\r\n snapshot = this.getSnapshot();\r\n }\r\n\r\n // update view data\r\n this.viewTitle = title;\r\n this.visualInfo = undefined;\r\n this.viewData = {\r\n snapshot: snapshot,\r\n options: {\r\n debug: this.debug(),\r\n delayedRender: true,\r\n showRulers: true,\r\n showGrid: true,\r\n panZoom: true,\r\n transparentIds: this._transparentIds,\r\n },\r\n };\r\n\r\n console.log('view data: ', this.viewData);\r\n }\r\n\r\n private updateForm(snapshot: Snapshot | undefined) {\r\n this._transparentIds = undefined;\r\n this.initialStepIndex = -1;\r\n\r\n if (!snapshot) {\r\n this.form.reset();\r\n } else {\r\n this.width.setValue(snapshot.size.width);\r\n this.height.setValue(snapshot.size.height);\r\n this.style.setValue(snapshot.style || null);\r\n this.imageUrl.setValue(snapshot.image?.url || null);\r\n this.imageOpacity.setValue(snapshot.image?.opacity || 0);\r\n this.imageX.setValue(snapshot.image?.canvas?.x || 0);\r\n this.imageY.setValue(snapshot.image?.canvas?.y || 0);\r\n this.imageWidth.setValue(snapshot.image?.canvas?.width || 0);\r\n this.imageHeight.setValue(snapshot.image?.canvas?.height || 0);\r\n this.defs.setValue(snapshot.defs || null);\r\n if (Array.isArray(snapshot.text)) {\r\n this.baseText.setValue(snapshot.text);\r\n } else {\r\n this.baseText.setValue(\r\n SnapshotViewService.stringToBaseChars(snapshot.text)\r\n );\r\n }\r\n this.offsetX.setValue(snapshot.textOptions?.offset?.x || 0);\r\n this.offsetY.setValue(snapshot.textOptions?.offset?.y || 0);\r\n this.lineHeightOffset.setValue(snapshot.textOptions?.lineHeightOffset);\r\n this.lnHeights.setValue(snapshot.textOptions?.minLineHeights || null);\r\n this.charSpacingOffset.setValue(snapshot.textOptions?.charSpacingOffset);\r\n this.spcWidthOffset.setValue(snapshot.textOptions?.spcWidthOffset);\r\n this.textStyle.setValue(snapshot.textStyle || null);\r\n this.operations.setValue(snapshot.operations);\r\n this.opStyle.setValue(snapshot.opStyle || null);\r\n // timelines\r\n const timelines: GveAnimationTimeline[] = [];\r\n if (snapshot.timelines) {\r\n for (let tag in snapshot.timelines) {\r\n timelines.push(snapshot.timelines[tag]);\r\n }\r\n }\r\n this.timelines.setValue(timelines);\r\n }\r\n this.updateLineCount(this.baseText.value);\r\n this.updateOpLists();\r\n\r\n this.form.markAsPristine();\r\n }\r\n\r\n // #region base text\r\n public inputBaseText(): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(SnapshotTextEditorComponent, {\r\n data: { payload: { text: this.baseText.value } },\r\n width: '80%',\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((text: CharNode[]) => {\r\n if (text?.length) {\r\n // update the form control and reset the current text range\r\n this.baseText.setValue(text);\r\n this.baseText.updateValueAndValidity();\r\n this.baseText.markAsDirty();\r\n this.textRange.set(undefined);\r\n\r\n // update the line count\r\n this.updateLineCount(text);\r\n\r\n // remove all operations and update the view data\r\n this.removeAllOperations();\r\n\r\n // remove all timelines\r\n this.timelines.reset();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the line count based on the received text.\r\n * @param text The text to use for counting lines.\r\n */\r\n private updateLineCount(text: CharNode[]) {\r\n if (!text.length) {\r\n this.lineCount.set(0);\r\n } else {\r\n this.lineCount.set(text.filter((c) => c.data === '\\n').length + 1);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by the base text editor to pick a text range.\r\n * @param range The picked range.\r\n */\r\n public onRangePick(range?: VarBaseTextRange) {\r\n this.textRange.set(range);\r\n }\r\n // #endregion\r\n\r\n // #region operations\r\n /**\r\n * Update the lists of operation output tags and element IDs by collecting\r\n * all the operation tags and the IDs of the elements in their diplomatic.g\r\n * SVG code if any.\r\n */\r\n private updateOpLists() {\r\n const tags = new Set<string>();\r\n const ids = new Set<string>();\r\n\r\n let n = 0;\r\n for (const op of this.operations.value) {\r\n // output tag\r\n n++;\r\n tags.add(op.outputTag || `v${n}`);\r\n\r\n // element IDs\r\n if (op.diplomatics?.g) {\r\n this.parseSvgIds(op.diplomatics.g)?.forEach((id) => ids.add(id));\r\n }\r\n }\r\n\r\n this.opTags.set([...tags]);\r\n this.opElementIds.set([...ids]);\r\n }\r\n\r\n /**\r\n * Edit a new operation.\r\n */\r\n public editNewOperation() {\r\n // create a new operation and edit it\r\n this.editedOp.set({\r\n id: this._nanoid(),\r\n type: 0,\r\n at: this.textRange()?.at || 0,\r\n run: this.textRange()?.run || 1,\r\n });\r\n this.editedOpIndex.set(-1);\r\n }\r\n\r\n /**\r\n * Edit (a copy of) the operation at the specified index.\r\n * @param index The operation index.\r\n */\r\n public editOperation(index: number) {\r\n this.editedOpIndex.set(index);\r\n this.editedOp.set(deepCopy(this.operations.value[index]));\r\n }\r\n\r\n /**\r\n * Close the currently edited operation.\r\n */\r\n private closeEditedOperation() {\r\n this.editedOpIndex.set(-1);\r\n this.editedOp.set(undefined);\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to cancel\r\n * the current operation edits.\r\n */\r\n public onOperationCancel() {\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to change\r\n * the currently edited operation, or add a new one if that\r\n * was a new operation.\r\n * @param op The changed operation.\r\n */\r\n public onOperationChange(op?: CharChainOperation | null) {\r\n if (!op) {\r\n return;\r\n }\r\n console.log('operation change');\r\n const operations = [...this.operations.value];\r\n\r\n // replace or add the operation\r\n let i = this.editedOpIndex();\r\n if (this.editedOpIndex() > -1) {\r\n operations.splice(this.editedOpIndex(), 1, op);\r\n } else {\r\n operations.push(op);\r\n i = operations.length - 1;\r\n }\r\n\r\n // update the operations form control\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // update the operation lists\r\n this.updateOpLists();\r\n\r\n // run to the edited operation\r\n this.runTo(i);\r\n\r\n // close the edited operation\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Delete the operation at the specified index.\r\n * @param index The index of the operation to delete.\r\n */\r\n public deleteOperation(index: number) {\r\n this._dialogService\r\n .confirm(\r\n 'Confirm Deletion',\r\n `Delete operation \"${this.operations.value[index].id}\"?`\r\n )\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n // close the edited operation if it is the one being deleted\r\n if (this.editedOpIndex() === index) {\r\n this.closeEditedOperation();\r\n }\r\n // reset the result operation ID if it is the one being deleted\r\n if (this.resultOperationId === this.operations.value[index].id) {\r\n this.resultOperationId = undefined;\r\n }\r\n // delete the operation and update the form control\r\n const operations = [...this.operations.value];\r\n operations.splice(index, 1);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // update the operation lists\r\n this.updateOpLists();\r\n\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Parse the operations from their text and append them to the current\r\n * snapshot operations.\r\n */\r\n public parseOperations() {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(BatchOperationEditorComponent, {\r\n data: { preset: this.batchOps },\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((batchOps: CharChainOperation[]) => {\r\n if (batchOps) {\r\n const operations = [...this.operations.value];\r\n operations.push(...batchOps);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n // update the operation lists\r\n this.updateOpLists();\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove all the operations, close the edited operation and update the view data.\r\n */\r\n private removeAllOperations(): void {\r\n this.resultOperationId = undefined;\r\n this.closeEditedOperation();\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.opTags.set([]);\r\n this.opElementIds.set([]);\r\n this.setViewData();\r\n this.result = undefined;\r\n }\r\n\r\n /**\r\n * Remove all the operations.\r\n */\r\n public clearOperations(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Remove all operations?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.removeAllOperations();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Parse all the id attributes from the received SVG code and\r\n * return them as an array.\r\n *\r\n * @param svg The SVG content to parse or undefined.\r\n * @returns Array of IDs found in the SVG content or undefined.\r\n */\r\n private parseSvgIds(svg?: string): string[] | undefined {\r\n if (!svg) {\r\n return undefined;\r\n }\r\n\r\n const regex = /<[^>]+\\bid=([\"'])(.*?)\\1/g;\r\n const ids: string[] = [];\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(svg)) !== null) {\r\n ids.push(match[2]);\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n private getTransparentIds(g?: string): string[] | undefined {\r\n if (!g) {\r\n return undefined;\r\n }\r\n return this.parseSvgIds(g)?.filter((id) => id.endsWith(SVG_TRANSP_SUFFIX));\r\n }\r\n\r\n /**\r\n * Supply operation nodes to the snapshot text nodes. An execution result is\r\n * a compact object, so that to build a snapshot accumulating all the nodes\r\n * and their features up to the last executed operation, we need to start\r\n * with the base text nodes, and then examine each execution step in the\r\n * result. Each step contains only those nodes used by the version of the\r\n * text corresponding to its stage. Among them, some are new nodes, and some\r\n * are base text nodes. Also, the step contains the full set of features\r\n * current at its time, both for the text as a whole and for each node.\r\n * This method accumulates the nodes and their features up to the specified\r\n * step, updating the features of the nodes already present in the snapshot\r\n * text nodes, and adding the new nodes.\r\n *\r\n * @param snapshot The snapshot to supply the nodes to.\r\n * @param result The operations execution result.\r\n * @param tag The output tag of the operation to supply the nodes from.\r\n */\r\n private supplyOpNodes(\r\n snapshot: Snapshot,\r\n result: CharChainResult,\r\n tag: string\r\n ): void {\r\n // get the original nodes from the snapshot base text\r\n const nodes = snapshot.text as CharNode[];\r\n\r\n // find the max ID in the original nodes, so that any ID greater than it\r\n // belongs to new nodes\r\n const maxOriginalId = nodes.reduce((max, n) => Math.max(max, n.id), 0);\r\n const stepIndex = result.steps.findIndex((s) => s.outputTag === tag);\r\n\r\n // for each step up to the specified one, add the nodes introduced by the step\r\n // and update the features from each step node that is already present\r\n for (let i = 0; i <= stepIndex; i++) {\r\n // get the nodes of the step\r\n const stepNodes = result.taggedNodes[result.steps[i].outputTag];\r\n\r\n for (const stepNode of stepNodes) {\r\n // if the node was added, add it\r\n if (\r\n stepNode.id > maxOriginalId &&\r\n !nodes.find((n) => n.id === stepNode.id)\r\n ) {\r\n nodes.push(stepNode);\r\n } else {\r\n // if the node was already in the original nodes, update its features\r\n const existing = nodes.findIndex((n) => n.id === stepNode.id);\r\n if (existing > -1) {\r\n nodes[existing].features = stepNode.features;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // update the snapshot text nodes\r\n snapshot.text = nodes;\r\n }\r\n\r\n /**\r\n * Run the operations up to the specified index (included).\r\n * This is called when:\r\n * - a preview is requested by the operation editor.\r\n * - the currently edited operation is saved.\r\n * - the user picks a step in the chain result view.\r\n * - runToLast is called, which happens when:\r\n * - setting the snapshot.\r\n * - parsing a batch of operations.\r\n * - deleting an operation.\r\n *\r\n * @param index The index of the operation to run to.\r\n * @param lastOperation The operation to use in place of the existing\r\n * operation in the snapshot at index. This is used when previewing\r\n * the edited operation from within the operation editor.\r\n * @returns A promise that resolves to the execution result.\r\n */\r\n public runTo(index: number, lastOperation?: CharChainOperation): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n console.log('run to: ' + index);\r\n\r\n // get the snapshot to run operations on\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n\r\n // remove from the snapshot the operations past the specified index,\r\n // also replacing the last operation when this was received as a parameter\r\n if (lastOperation) {\r\n snapshot.operations = snapshot.operations.slice(0, index);\r\n snapshot.operations.push(lastOperation);\r\n } else {\r\n lastOperation = snapshot.operations[index];\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n }\r\n\r\n // update result operation ID\r\n this.resultOperationId = snapshot.operations[index].id;\r\n\r\n // extract the IDs from the last operation's diplomatics and filter\r\n // them so that only the ones ending with _t are kept. By convention,\r\n // all the IDs ending with this suffix are to be made invisible at\r\n // their first rendition (opacity=0). An animation will then make\r\n // them visible.\r\n this._transparentIds = this.getTransparentIds(\r\n snapshot.operations[index].diplomatics?.g\r\n );\r\n\r\n // run the operations\r\n this.busy.set(true);\r\n this.initialStepIndex = index;\r\n this._api\r\n .runOperations(snapshot.text as CharNode[], snapshot.operations)\r\n .subscribe({\r\n next: (wrapper) => {\r\n // handle operation (non-fatal) error or result\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n return;\r\n }\r\n\r\n // set the result\r\n console.log('result:', wrapper.result);\r\n this.result = wrapper.result;\r\n\r\n // supply the last operation output tag from its result step if not set\r\n if (!lastOperation.outputTag) {\r\n const step = wrapper.result!.steps.find(\r\n (s) => s.operation.id === lastOperation.id\r\n );\r\n lastOperation.outputTag = step!.outputTag;\r\n }\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(\r\n snapshot,\r\n wrapper.result!,\r\n lastOperation.outputTag\r\n );\r\n\r\n // update the view data\r\n this.setViewData(snapshot, lastOperation!.outputTag);\r\n\r\n // play animation if any\r\n const tl = this.timelines.value.find(\r\n (t) => t.tag === lastOperation!.outputTag\r\n );\r\n if (tl) {\r\n // play the timeline\r\n setTimeout(() => {\r\n this.playTimeline(tl);\r\n }, 0);\r\n }\r\n\r\n // get the chain model if requested\r\n if (this.showChain.value) {\r\n this.getChainAt(index);\r\n }\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._transparentIds = undefined;\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Run the operations up to the last operation if any, updating the\r\n * execution result. The execution result is always the result from\r\n * all the operations, as users must be able to browse across its steps.\r\n */\r\n public runToLast(): void {\r\n if (this.operations.value.length) {\r\n this.runTo(this.operations.value.length - 1);\r\n } else {\r\n this.setViewData();\r\n this.result = undefined;\r\n }\r\n }\r\n\r\n public getChainAt(index: number, lastOperation?: CharChainOperation): void {\r\n // get the snapshot to run operations on\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n\r\n // remove from the snapshot the operations past the specified index,\r\n // also replacing the last operation when this was received as a parameter\r\n if (lastOperation) {\r\n snapshot.operations = snapshot.operations.slice(0, index);\r\n snapshot.operations.push(lastOperation);\r\n } else {\r\n lastOperation = snapshot.operations[index];\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n }\r\n this.busy.set(true);\r\n this._api\r\n .getChain(snapshot.text as CharNode[], snapshot.operations)\r\n .subscribe({\r\n next: (wrapper) => {\r\n // handle operation (non-fatal) error or result\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n this.chain.set(undefined);\r\n } else {\r\n this.chain.set(wrapper.result);\r\n }\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._transparentIds = undefined;\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update the snapshot view by running the operations up to the\r\n * currently edited operation if any.\r\n *\r\n * @param operation The operation being previewed.\r\n */\r\n public onOperationPreview(operation: CharChainOperation): void {\r\n // no multiple previews or previewing a new operation\r\n if (this._previewing || this.editedOpIndex() < 0) {\r\n return;\r\n }\r\n this._previewing = true;\r\n setTimeout(() => {\r\n this.runTo(this.editedOpIndex(), operation);\r\n this._previewing = false;\r\n }, 0);\r\n }\r\n // #endregion\r\n\r\n private playTimeline(tl: GveAnimationTimeline): void {\r\n const shadowRoot = this.snapshotView?.nativeElement?.shadowRoot;\r\n if (tl && shadowRoot) {\r\n console.log('play timeline', tl);\r\n this._renderer?.playTimeline(tl, undefined, shadowRoot);\r\n } else {\r\n if (!this.snapshotView) {\r\n console.warn('no snapshotView for timeline');\r\n } else {\r\n console.warn('no shadowRoot for timeline');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by the chain result view to pick a step.\r\n *\r\n * @param step The step to pick.\r\n */\r\n public onStepPick(step: ChainOperationContextStep): void {\r\n if (!this.result || this._stepPickFrozen) {\r\n return;\r\n }\r\n\r\n // get base text snapshot\r\n const snapshot = this.getSnapshot();\r\n\r\n // get the step index\r\n const index = snapshot.operations.findIndex(\r\n (o) => o.id === step.operation.id\r\n );\r\n\r\n // remove snapshot operations after the picked step to avoid\r\n // their visuals creep into the snapshot view\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n\r\n // update result operation ID\r\n this.resultOperationId = snapshot.operations[index].id;\r\n\r\n // extract the IDs from the last operation's diplomatics and filter\r\n // them so that only the ones ending with _t are kept. By convention,\r\n // all the IDs ending with this suffix are to be made invisible at\r\n // their first rendition (opacity=0). An animation will then make\r\n // them visible.\r\n this._transparentIds = this.getTransparentIds(\r\n snapshot.operations[index].diplomatics?.g\r\n );\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(snapshot, this.result, step.outputTag);\r\n\r\n // update the view data\r\n this.setViewData(snapshot, step.outputTag);\r\n\r\n // play animation if any\r\n const tl = this.timelines.value.find((t) => t.tag === step.outputTag);\r\n if (tl) {\r\n // play the timeline\r\n setTimeout(() => {\r\n this.playTimeline(tl);\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by a visual in the snapshot view.\r\n *\r\n * @param event The event.\r\n */\r\n public onVisualEvent(event: CustomEvent<GveVisualEvent>): void {\r\n if (this._handlingOver) {\r\n return;\r\n }\r\n const d = event.detail;\r\n\r\n if (d.event.type === 'mouseover') {\r\n const visual = d.source;\r\n if (visual.id === this._lastOverId) {\r\n return;\r\n }\r\n this._handlingOver = true;\r\n const sb: string[] = [];\r\n // id (type)\r\n sb.push('#' + visual.id);\r\n sb.push(` (${visual.type})`);\r\n // : label and features\r\n if (visual.data?.label) {\r\n sb.push(': ');\r\n sb.push(visual.data.label);\r\n }\r\n if (visual.data?.features?.length) {\r\n sb.push(' ');\r\n sb.push(\r\n visual.data.features\r\n .map((f: Feature) => `${f.name}=${f.value}`)\r\n .join('\\n')\r\n );\r\n }\r\n // (@x,y width×height)\r\n sb.push(\r\n ` (@${visual.x.toFixed(1)},${visual.y.toFixed(1)} ` +\r\n `◻${visual.width.toFixed(1)}×${visual.height.toFixed(1)})`\r\n );\r\n this.visualInfo = sb.join('');\r\n this._lastOverId = visual.id;\r\n }\r\n\r\n this._handlingOver = false;\r\n }\r\n\r\n /**\r\n * Handle the change of line heights by updating the form control.\r\n *\r\n * @param heights The line heights.\r\n */\r\n public onHeightsChange(heights: Record<number, number> | undefined): void {\r\n this.lnHeights.setValue(heights || null);\r\n this.lnHeights.markAsDirty();\r\n this.lnHeights.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Handle the change of timelines by updating the form control.\r\n *\r\n * @param timelines The timelines.\r\n */\r\n public onTimelinesChange(timelines?: GveAnimationTimeline[] | null): void {\r\n if (!timelines) {\r\n return;\r\n }\r\n this.timelines.setValue(timelines);\r\n this.timelines.markAsDirty();\r\n this.timelines.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Emit the cancel event for this snapshot edit.\r\n */\r\n public close(): void {\r\n this.snapshotCancel.emit();\r\n }\r\n\r\n /**\r\n * Handle the render event from the snapshot view to get a reference\r\n * to the renderer.\r\n *\r\n * @param event The rendition event.\r\n */\r\n public onSnapshotRender(event: CustomEvent<SnapshotViewRenderEvent>): void {\r\n this._renderer = (event.detail as SnapshotViewRenderEvent).renderer;\r\n }\r\n\r\n public onImageLoad(imageElement: HTMLImageElement) {\r\n const size = {\r\n width: imageElement.naturalWidth,\r\n height: imageElement.naturalHeight,\r\n };\r\n if (!this.imageWidth.value) {\r\n this.imageWidth.setValue(size.width);\r\n this.imageWidth.updateValueAndValidity();\r\n this.imageWidth.markAsDirty();\r\n }\r\n if (!this.imageHeight.value) {\r\n this.imageHeight.setValue(size.height);\r\n this.imageHeight.updateValueAndValidity();\r\n this.imageHeight.markAsDirty();\r\n }\r\n }\r\n\r\n public onImageOpacityChange(value: number): void {\r\n this.imageOpacity.setValue(value);\r\n this.imageOpacity.updateValueAndValidity();\r\n this.imageOpacity.markAsDirty();\r\n if (this._renderer) {\r\n this._renderer.setImageOpacity(value);\r\n }\r\n }\r\n\r\n public resetImgMetadata(): void {\r\n this.imageX.reset();\r\n this.imageY.reset();\r\n this.imageWidth.reset();\r\n this.imageHeight.reset();\r\n }\r\n\r\n /**\r\n * Toggle rulers in the snapshot view.\r\n */\r\n public toggleRulers(): void {\r\n if (!this._renderer) {\r\n return;\r\n }\r\n this.rulers = this._renderer.toggleRulers();\r\n }\r\n\r\n private defaultCharDecorator(\r\n char: CharNode,\r\n lineNumber: number,\r\n x: number,\r\n y: number\r\n ): CharDecoration | null {\r\n const features = char.features;\r\n const segOut = features?.find((f) => f.name === '$seg-out');\r\n const seg2Out = features?.find((f) => f.name === '$seg2-out');\r\n const segIn = features?.find((f) => f.name === '$seg-in');\r\n const seg2In = features?.find((f) => f.name === '$seg2-in');\r\n\r\n if (!segOut && !seg2Out && !segIn && !seg2In) {\r\n return null;\r\n }\r\n\r\n const decoration: CharDecoration = {};\r\n if (segOut || seg2Out) {\r\n decoration.fill = segOut ? '#9B2915' : '#9B6F91';\r\n }\r\n // if (segIn || seg2In) {\r\n // decoration.stroke = segIn ? '#E9B44C' : '#DF928E';\r\n // decoration.strokeWidth = 3;\r\n // }\r\n\r\n return decoration;\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data.\r\n *\r\n * @returns New snapshot object.\r\n */\r\n private getSnapshot(): Snapshot {\r\n const snapshot: Snapshot = {\r\n size: {\r\n width: this.width.value,\r\n height: this.height.value,\r\n },\r\n style: this.style.value || undefined,\r\n defs: this.defs.value || undefined,\r\n // snapshot nodes might be changed, so we copy them\r\n // to avoid changing the original snapshot\r\n text: deepCopy(this.baseText.value),\r\n textStyle: this.textStyle.value || undefined,\r\n textOptions: {\r\n lineHeightOffset: this.lineHeightOffset.value,\r\n minLineHeights: this.lnHeights.value || undefined,\r\n charSpacingOffset: this.charSpacingOffset.value,\r\n spcWidthOffset: this.spcWidthOffset.value,\r\n offset: {\r\n x: this.offsetX.value,\r\n y: this.offsetY.value,\r\n },\r\n },\r\n operations: [...this.operations.value],\r\n opStyle: this.opStyle.value || undefined,\r\n };\r\n\r\n // add char decoration unless opted out\r\n if (!this.noDecoration()) {\r\n snapshot.textOptions.charDecorator = this.defaultCharDecorator;\r\n }\r\n\r\n // image\r\n if (this.imageUrl.value) {\r\n snapshot.image = {\r\n url: this.imageUrl.value,\r\n opacity: this.imageOpacity.value || undefined,\r\n };\r\n if (\r\n this.imageX.value ||\r\n this.imageY.value ||\r\n this.imageWidth.value ||\r\n this.imageHeight.value\r\n ) {\r\n snapshot.image.canvas = {\r\n x: this.imageX.value,\r\n y: this.imageY.value,\r\n width: this.imageWidth.value,\r\n height: this.imageHeight.value,\r\n };\r\n }\r\n }\r\n\r\n // timelines\r\n if (this.timelines.value.length) {\r\n snapshot.timelines = {};\r\n this.timelines.value.forEach((t) => {\r\n snapshot.timelines![t.tag] = t;\r\n });\r\n } else {\r\n snapshot.timelines = undefined;\r\n }\r\n\r\n return snapshot;\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data and emit it\r\n * in the snapshot change event.\r\n */\r\n public save(): void {\r\n if (this.form.invalid || this.noSave()) {\r\n return;\r\n }\r\n this.snapshot.set(this.getSnapshot());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>article</mat-icon> <span class=\"label\">text</span>\r\n </ng-template>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <!-- base text -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"mat-warn\"\r\n matTooltip=\"Enter base text\"\r\n (click)=\"inputBaseText()\"\r\n [disabled]=\"busy()\"\r\n >\r\n <mat-icon>edit</mat-icon> base text\r\n </button>\r\n\r\n @if (textRange()) {\r\n <span id=\"text-range\"\r\n >{{ textRange()!.at }}×{{ textRange()!.run }}</span\r\n >\r\n }\r\n </div>\r\n <!-- base text metadata -->\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div class=\"boxed\">\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount()\"\r\n [heights]=\"lnHeights.value || undefined\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\r\n <!-- text characters -->\r\n <gve-base-text-view\r\n [text]=\"baseText.value\"\r\n [hasLineNumber]=\"true\"\r\n (rangePick)=\"onRangePick($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>edit</mat-icon> <span class=\"label\">operations</span>\r\n </ng-template>\r\n\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- chain -->\r\n <mat-checkbox [formControl]=\"showChain\">show chain</mat-checkbox>\r\n\r\n <div class=\"form-row right\">\r\n <!-- remove ops -->\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy()\"\r\n (click)=\"clearOperations()\"\r\n >\r\n <mat-icon>delete_forever</mat-icon> clear\r\n </button>\r\n\r\n <!-- batch add ops -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n matTooltip=\"Add a batch of operations\"\r\n class=\"mat-primary\"\r\n [disabled]=\"busy()\"\r\n (click)=\"parseOperations()\"\r\n >\r\n <mat-icon>post_add</mat-icon> batch\r\n </button>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th>nr.</th>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [class.selected]=\"operation.id === resultOperationId\"\r\n [class.edited]=\"operation.id === editedOp()?.id\"\r\n >\r\n <td class=\"fit-width\">{{ index + 1 }}.</td>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup : opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>{{ operation.features?.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n @if (editedOp()) {\r\n <mat-expansion-panel [expanded]=\"editedOp()\" [disabled]=\"!editedOp()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp()?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [featureDefs]=\"featureDefs()\"\r\n [elementFeatureDefs]=\"elementFeatureDefs()\"\r\n [diplomaticFeatureDefs]=\"diplomaticFeatureDefs()\"\r\n [hidePreview]=\"editedOpIndex() === -1\"\r\n [operation]=\"editedOp()\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>image</mat-icon> <span class=\"label\">image</span>\r\n </ng-template>\r\n\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n <!-- reset -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Reset image metadata\"\r\n (click)=\"resetImgMetadata()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </div>\r\n <div>\r\n <!-- image opacity -->\r\n <mat-slider\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.01\"\r\n thumbLabel\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n matTooltip=\"Image opacity\"\r\n >\r\n <input\r\n matSliderThumb\r\n [value]=\"imageOpacity.value\"\r\n (valueChange)=\"onImageOpacityChange($event)\"\r\n />\r\n </mat-slider>\r\n <span id=\"opacity-value\">{{\r\n imageOpacity.value | number : \"1.2-2\"\r\n }}</span>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img\r\n #imgElement\r\n alt=\"background\"\r\n [src]=\"imageUrl.value\"\r\n width=\"600\"\r\n (load)=\"onImageLoad(imgElement)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- timelines -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>animation</mat-icon> <span class=\"label\">animation</span>\r\n </ng-template>\r\n\r\n <gve-animation-timeline-set\r\n [tags]=\"opTags()\"\r\n [elementIds]=\"opElementIds()\"\r\n [timelines]=\"timelines.value\"\r\n (timelinesChange)=\"onTimelinesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- progress -->\r\n <div>\r\n @if (busy()) {\r\n <mat-progress-bar mode=\"indeterminate\" />\r\n }\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result\"\r\n [initialStepIndex]=\"initialStepIndex\"\r\n (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n\r\n <!-- snapshot view -->\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n </legend>\r\n <!-- snapshot view -->\r\n <gve-snapshot-view\r\n #snapshotView\r\n [debug]=\"debug()\"\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div class=\"button-row\">\r\n <!-- toggle ruler -->\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n <!-- run to last -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"primary\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"runToLast()\"\r\n >\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\r\n\r\n <!-- chain view -->\r\n @if (chain()) {\r\n <div id=\"chain-view\">\r\n <gve-chain-view [chain]=\"chain()\" />\r\n </div>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave()) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n","/*\r\n * Public API Surface of gve-core\r\n */\r\n\r\nexport * from './lib/models';\r\nexport * from './lib/components/animation-timeline/animation-timeline.component';\r\nexport * from './lib/components/animation-timeline-set/animation-timeline-set.component';\r\nexport * from './lib/components/animation-tween/animation-tween.component';\r\nexport * from './lib/components/base-text-char/base-text-char.component';\r\nexport * from './lib/components/base-text-editor/base-text-editor.component';\r\nexport * from './lib/components/base-text-view/base-text-view.component';\r\nexport * from './lib/components/batch-operation-editor/batch-operation-editor.component';\r\nexport * from './lib/components/chain-operation-editor/chain-operation-editor.component';\r\nexport * from './lib/components/chain-result-view/chain-result-view.component';\r\nexport * from './lib/components/chain-view/chain-view.component';\r\nexport * from './lib/components/feature-editor/feature-editor.component';\r\nexport * from './lib/components/feature-set-editor/feature-set-editor.component';\r\nexport * from './lib/components/feature-set-view/feature-set-view.component';\r\nexport * from './lib/components/ln-heights-editor/ln-heights-editor.component';\r\nexport * from './lib/components/operation-source-editor/operation-source-editor.component';\r\nexport * from './lib/components/snapshot-editor/snapshot-editor.component';\r\nexport * from './lib/components/snapshot-text-editor/snapshot-text-editor.component';\r\nexport * from './lib/components/steps-map/steps-map.component';\r\n\r\nexport * from './lib/services/gve-api.service';\r\nexport * from './lib/services/gve-graphviz.service';\r\nexport * from './lib/services/settings.service';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i5","i6","i8","i1","i4","i2","debounceTime","i3.SettingsService","i7","i9","i10","i11","i13","i14","i15","i1.GveGraphvizService","i2.SettingsService","i2.GveApiService","i16"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA;;;;;;;;;;AAUG;MAiBU,uBAAuB,CAAA;AAgClC,IAAA,WAAA,CAAY,WAAwB,EAAA;AA7BpC;;AAEG;QACa,IAAK,CAAA,KAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAE9D;;;AAGG;QACa,IAAU,CAAA,UAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAE1D;;AAEG;QACa,IAAW,CAAA,WAAA,GAAG,MAAM,EAAE;QAEtB,IAAK,CAAA,KAAA,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;QAcrD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE;AACnC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7D,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE;AACtC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7D,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE;AACpC,YAAA,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC;AACtD,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC;AAC1D,QAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;QAE1C,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC/B,SAAC,CAAC;;IAGG,QAAQ,GAAA;;AAEb,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;aACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE;AAC9C,aAAA,SAAS,CAAC,CAAC,SAAS,KAAI;YACvB,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,SAAS,CAAC;;AAE3C,SAAC,CAAC;;IAGC,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;;AAGnB,IAAA,YAAY,CAAC,IAAY,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;;AAG7B,IAAA,aAAa,CAAC,IAAY,EAAA;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE;;IAG9B,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;;AAGjB,IAAA,aAAa,CACnB,OAAwB,EAAA;AAExB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAClB,YAAA,OAAO,IAAI;;AAEb,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACzB,YAAA,OAAO,IAAI;;QACX,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;;;AAIjB,IAAA,UAAU,CAAC,KAAyB,EAAA;QAC1C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACjB;;QAEF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;;IAGpB,QAAQ,GAAA;QACd,OAAO;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS;AAC1C,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;AACpC,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACrB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS;YACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS;SACnD;;AAGI,IAAA,OAAO,CAAC,GAAW,EAAA;AACxB,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;;IAGrB,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACpB;;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;;8GAlJtB,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,yZCzDpC,y9IA0IA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9FI,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,UAAA,EAAA,IAAA,EAAA,eAAe,qNACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,qLACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EACf,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,EAAA,aAAa,8BACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhBnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EACtB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB;wBACjB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,y9IAAA,EAAA,MAAA,EAAA,CAAA,qIAAA,CAAA,EAAA;;;AExBH;;;;;;;;;;;;;AAaG;MAmBU,0BAA0B,CAAA;AAmCrC,IAAA,WAAA,CAAY,WAAwB,EAAA;AAlCpC;;AAEG;QACa,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAoC;AAEpE;;;AAGG;QACa,IAAU,CAAA,UAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAE1D;;AAEG;AACa,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAW,EAAE,gDAAC;AAE1C;;AAEG;QACa,IAAc,CAAA,cAAA,GAAG,MAAM,EAAwB;AAE/D;;AAEG;QACa,IAAc,CAAA,cAAA,GAAG,MAAM,EAAE;AAEzB,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAS,CAAC,CAAC,4DAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAgC,SAAS,uDAAC;QAQ5E,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE;AACjC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7D,SAAA,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE;AACpC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,kBAAkB,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC3D,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC;AAEzD,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,SAAA,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAClC,SAAC,CAAC;;AAGI,IAAA,aAAa,CACnB,OAAwB,EAAA;AAExB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAClB,YAAA,OAAO,IAAI;;AAEb,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACzB,YAAA,OAAO,IAAI;;QACX,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;;;AAIjB,IAAA,UAAU,CAAC,QAA+B,EAAA;QAChD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACjB;;QAEF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;;IAGrB,QAAQ,GAAA;QACb,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACnB,YAAA,KAAK,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,QAAQ,EAAE,EAAE;AACb,SAAA,CAAC;;AAGG,IAAA,SAAS,CAAC,KAAa,EAAA;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGnD,IAAA,WAAW,CAAC,KAAa,EAAA;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AACrE,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;;IAG/B,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAGxB,IAAA,SAAS,CAAC,KAAyB,EAAA;QACxC,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAM,CAAC,CAAC;;aAC/C;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAC7B,KAAK,KAAK,IAAI,CAAC,gBAAgB,EAAE,GAAG,KAAM,GAAG,CAAC,CAC/C,CACF;;AAEH,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;QACpC,IAAI,CAAC,UAAU,EAAE;;AAGZ,IAAA,WAAW,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb;;QAEF,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACrC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;AACjC,QAAA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;AAEvB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;;AAG/B,IAAA,aAAa,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC;;QAEF,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACrC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;AACjC,QAAA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;AAEvB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;;IAG9B,WAAW,GAAA;QACjB,OAAO;AACL,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;AACzB,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACzB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS;SACnC;;IAGI,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;;IAGrB,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACrB;;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAG,CAAC;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;;8GAzKjB,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7DvC,8sJAkKA,EDpHI,MAAA,EAAA,CAAA,4gBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,+9BACnB,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,kBAAkB,EAClB,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,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+sBACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKd,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAlBtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EACzB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB;wBACjB,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,gBAAgB;wBAChB;AACH,qBAAA,EAAA,QAAA,EAAA,8sJAAA,EAAA,MAAA,EAAA,CAAA,4gBAAA,CAAA,EAAA;;;AEtCD;;;;;;;;;;;AAWG;MAmBU,6BAA6B,CAAA;AA2BxC,IAAA,WAAA,CAAoB,cAA6B,EAAA;QAA7B,IAAc,CAAA,cAAA,GAAd,cAAc;AA1BlC;;AAEG;AACa,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAyB,EAAE,qDAAC;AAE7D;;;AAGG;QACa,IAAU,CAAA,UAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAE1D;;AAEG;AACa,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAW,EAAE,gDAAC;AAE1C;;AAEG;QACa,IAAe,CAAA,eAAA,GAAG,MAAM,EAAE;AAE1B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CACrC,SAAS,0DACV;AACe,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAS,CAAC,CAAC,uDAAC;;IAIzC,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;IAGnB,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA,GAAG,EAAE,EAAE;AACP,YAAA,MAAM,EAAE,EAAE;AACX,SAAA,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAGnB,IAAA,YAAY,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGtB,IAAA,gBAAgB,CAAC,QAA8B,EAAA;QACpD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE;AAC7B,YAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;;aACnB;AACL,YAAA,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC;;;QAInD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;QAE7B,IAAI,CAAC,aAAa,EAAE;;AAGf,IAAA,cAAc,CAAC,KAAa,EAAA;AACjC,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC,kBAAkB,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG;AACpE,aAAA,SAAS,CAAC,CAAC,GAAG,KAAI;YACjB,IAAI,GAAG,EAAE;gBACP,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;AACvC,gBAAA,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;;AAEjC,SAAC,CAAC;;8GAvEK,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjD1C,+rDA2DA,EDzBI,MAAA,EAAA,CAAA,mUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,8BACnB,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,8BACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,0BAA0B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKjB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAlBzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAC7B,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB;wBACjB,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,gBAAgB;wBAChB,0BAA0B;AAC3B,qBAAA,EAAA,QAAA,EAAA,+rDAAA,EAAA,MAAA,EAAA,CAAA,mUAAA,CAAA,EAAA;;;AEjBH;;;;;AAKG;MAOU,qBAAqB,CAAA;AANlC,IAAA,WAAA,GAAA;AAOE;;AAEG;QACa,IAAI,CAAA,IAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA4B;AAExD;;AAEG;QACa,IAAQ,CAAA,QAAA,GAAG,MAAM,EAAqB;QAEtC,IAAY,CAAA,YAAA,GAAG,SAAS;QACxB,IAAkB,CAAA,kBAAA,GAAG,SAAS;QAC9B,IAAa,CAAA,aAAA,GAAG,GAAG;AAKpC;AAHQ,IAAA,WAAW,CAAC,KAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAG,EAAE,KAAK,EAAE,CAAC;;8GAhBxC,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,ECxClC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,qjBAoBA,EDgBY,MAAA,EAAA,CAAA,kXAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,gSAAE,mBAAmB,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAInC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EACrB,OAAA,EAAA,CAAC,eAAe,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,qjBAAA,EAAA,MAAA,EAAA,CAAA,kXAAA,CAAA,EAAA;;;AElBjD;;;;;;;;;;;;;;;;;;;AAmBG;MAOU,qBAAqB,CAAA;AA0DhC,IAAA,WAAA,GAAA;AAvDA;;AAEG;AACa,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,SAAS,wDAAC;AAE/C;;AAEG;AACa,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAC,SAAS,8DAAC;AAErD;;AAEG;AACa,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,SAAS,0DAAC;AAEjD;;AAEG;AACa,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,KAAK,yDAAC;AAE5C;;AAEG;AACa,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,EAAE,gDAAC;AAE5C;;;AAGG;QACa,IAAa,CAAA,aAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAElC;AAEH;;;AAGG;QACa,IAAmB,CAAA,mBAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAExC;AAEH;;AAEG;QACa,IAAQ,CAAA,QAAA,GAAG,MAAM,EAAqB;AAEtD;;;;AAIG;QACa,IAAS,CAAA,SAAA,GAAG,MAAM,EAAoB;AAEtC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAmB,EAAE,iDAAC;;QAIlD,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,UAAU,CACb,IAAI,CAAC,IAAI,EAAE,EACX,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,mBAAmB,EAAE,CAC3B;AACH,SAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;AACpC,SAAC,CAAC;;AAGI,IAAA,UAAU,CAChB,IAAgB,EAChB,aAAiD,EACjD,mBAAuD,EAAA;QAEvD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB;;QAGF,MAAM,QAAQ,GAAqB,EAAE;AACrC,QAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAEjB,MAAM,KAAK,GAAG,IAAkB;AAEhC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,IAAI,GAAiB;AACzB,gBAAA,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;AACf,gBAAA,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;AACpB,gBAAA,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;AACrB,gBAAA,KAAK,EAAE;AACL,sBAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY;AAC9C,sBAAE,IAAI,CAAC,YAAY,EAAE;AACvB,gBAAA,WAAW,EAAE;AACX,sBAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB;AAC1D,sBAAE,IAAI,CAAC,kBAAkB,EAAE;AAC7B,gBAAA,MAAM,EAAE,GAAG;aACZ;AACD,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK;AAC1B,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW;AAEtC,YAAA,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAExC,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AACvB,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;;;AAIrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;;IAGlB,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAAE;QAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KACrC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACb,YAAA,IAAI,CAAC,CAAC;AAAE,gBAAA,OAAO,CAAC;YAChB,OAAO;AACL,gBAAA,GAAG,CAAC;gBACJ,KAAK,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;gBACxC,WAAW,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,EAAE;aAC3D;SACF,CAAC,CACH;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAGnB,IAAA,UAAU,CAAC,KAAwB,EAAA;;AAExC,QAAA,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;YAChB;;;QAIF,IAAI,CAAC,WAAW,EAAE;;AAGlB,QAAA,MAAM,gBAAgB,GACpB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC/B,YAAA,IAAI,CAAC,iBAAiB,KAAK,KAAK,CAAC,IAAI;AACrC,YAAA,KAAK,CAAC,KAAK,EAAE,OAAO;AAEtB,QAAA,IAAI,WAA6B;AAEjC,QAAA,IAAI,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC9C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AAChE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;;YAGhE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KACrC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACb,gBAAA,IAAI,CAAC,CAAC;AAAE,oBAAA,OAAO,CAAC;AAChB,gBAAA,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,EAAE;oBAClC,OAAO;AACL,wBAAA,GAAG,CAAC;wBACJ,QAAQ,EAAE,CAAC,CAAC,KAAK;wBACjB,cAAc,EAAE,CAAC,CAAC,WAAW;AAC7B,wBAAA,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE;AAC5B,wBAAA,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE;qBACnC;;AAEH,gBAAA,OAAO,CAAC;aACT,CAAC,CACH;AACD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;AAExB,YAAA,WAAW,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE;;aAC9C;;YAEL,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KACrC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACb,gBAAA,IAAI,CAAC,CAAC;AAAE,oBAAA,OAAO,CAAC;gBAChB,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;AAC1B,oBAAA,MAAM,WAAW,GAAG;AAClB,wBAAA,GAAG,CAAC;wBACJ,QAAQ,EAAE,CAAC,CAAC,KAAK;wBACjB,cAAc,EAAE,CAAC,CAAC,WAAW;AAC7B,wBAAA,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE;AAC5B,wBAAA,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE;qBACnC;;AAED,oBAAA,IAAI,CAAC,iBAAiB,GAAG,WAAW;AACpC,oBAAA,OAAO,WAAW;;AAEpB,gBAAA,OAAO,CAAC;aACT,CAAC,CACH;AACD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;AAExB,YAAA,WAAW,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;;;AAI7C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;;8GAvMvB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5ClC,wWAaA,EAAA,MAAA,EAAA,CAAA,oJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED2BY,qBAAqB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAIpB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,qBAAqB,CAAC,EAAA,QAAA,EAAA,wWAAA,EAAA,MAAA,EAAA,CAAA,oJAAA,CAAA,EAAA;;;AEQlC;;;;;;;;;;;;;;;;;;AAkBG;MAgBU,sBAAsB,CAAA;AA8CjC,IAAA,WAAA,CAAY,WAAwB,EAAA;AAxCpC;;;AAGG;QACa,IAAS,CAAA,SAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA2B;AAE5D;;;;AAIG;QACa,IAAU,CAAA,UAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA0B;AAE5D;;AAEG;QACa,IAAO,CAAA,OAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA0C;AAEzE;;;AAGG;AACa,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,iDAAC;AAEpC;;AAEG;QACa,IAAa,CAAA,aAAA,GAAG,MAAM,EAAE;AAExB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAA0B,SAAS,mDAAC;QAYlE,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAS,EAAE,EAAE;AAC1C,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC3D,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE;YACnC,UAAU,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACxC,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE;AAC9D,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAClE,QAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACjE,QAAA,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACrE,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;AAChC,SAAA,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE;gBACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CACd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAC1D;aACF,EAAE,GAAG,CAAC;AACT,SAAC,CAAC;;IAGG,QAAQ,GAAA;;AAEb,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;aACnB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE;AAC9C,aAAA,SAAS,CAAC,CAAC,IAAI,KAAI;AAClB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE;AAC7C,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;;AAEpE,SAAC,CAAC;;IAGC,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;;IAGlB,gBAAgB,CACtB,EAAW,EACX,UAAuB,EAAA;QAEvB,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,SAAS;;QAElB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,EAAE,UAAU,CAAC;AAC/C,QAAA,OAAO,UAAU,GAAG,UAAW,CAAC,EAAE,CAAC,GAAG,SAAS;;AAGzC,IAAA,UAAU,CAAC,OAA0B,EAAA;QAC3C,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;;aACZ;AACL,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;AAClC,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,QAAQ,CAAC;YACvE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;YACjD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;AACzD,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;;IAIjB,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;;IAGpB,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACpB;;QAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CACd,IAAI,CAAC,KAAK;AACR,cAAE;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;AAC9B,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;AAC/B,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;AAC/B,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;AAC7B,gBAAA,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;AACtC;AACH,cAAE;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;AAC9B,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;AAChC,aAAA,CACN;;8GAnJQ,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,0wBClFnC,6wGAoGA,EAAA,MAAA,EAAA,CAAA,+FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9BI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,UAAA,EAAA,IAAA,EACnB,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,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,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,uYAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+sBACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAflC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EACrB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB;wBACjB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,6wGAAA,EAAA,MAAA,EAAA,CAAA,+FAAA,CAAA,EAAA;gFAQqB,WAAW,EAAA,CAAA;sBAAhC,SAAS;uBAAC,SAAS;;;AEpDtB;;;;;;;;;;;;;;;;;;;;;AAqBG;MAkBU,yBAAyB,CAAA;AA8CpC,IAAA,WAAA,CAAY,WAAwB,EAAA;QA3CpB,IAAQ,CAAA,QAAA,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;AAE3C;;;AAGG;AACa,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,iDAAC;AAEpC;;;AAGG;QACa,IAAS,CAAA,SAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA2B;AAE5D;;;;AAIG;QACa,IAAU,CAAA,UAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA0B;AAE5D;;;;;AAKG;AACa,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,CAAC,2DAAC;AAE1C;;AAEG;AACa,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAiC,EAAE,oDAAC;AAEpD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAEpC,SAAS,yDAAC;AACI,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAS,CAAC,CAAC,8DAAC;AAChD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAiC,EAAE,4DAAC;QAMlE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,CAAC;;QAGtD,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAC7D,SAAC,CAAC;;IAGI,kBAAkB,CACxB,QAAwC,EACxC,IAAoB,EAAA;AAEpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAC1B,YAAA,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACzE,SAAC,CAAC,IAAI,EAAE,CACT;;IAGI,QAAQ,GAAA;;AAEb,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;aACrB,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAC9C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;AACjD,SAAC,CAAC;;IAGC,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;;IAGnB,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACrB,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,gBAAgB,CAAC,QAAQ;AACrC,SAAA,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAG1B,IAAA,WAAW,CAAC,OAAmC,EAAA;QACpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;;AAGxD,IAAA,aAAa,CAAC,OAAmC,EAAA;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;AAC9C,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb;;QAEF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrC,QAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAGtB,IAAA,eAAe,CAAC,OAAoC,EAAA;QACzD,IAAI,CAAC,OAAO,EAAE;YACZ;;QAEF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAErC,QAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7C,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE;AACrC,gBAAA,IACE,OAAO,CAAC,SAAS,KAAK,gBAAgB,CAAC,MAAM;oBAC7C,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,gBAAgB,CAAC,MAAM,EACjD;AACA,oBAAA,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;;;;QAK3B,IAAI,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,EAAE;AACpC,YAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;;aACjB;AACL,YAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC;;QAGxD,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;;IAGtB,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;8GApItB,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzEtC,i9HAyIA,ED9EI,MAAA,EAAA,CAAA,mWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,ykBACnB,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,0WAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,8BACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEhB,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,YAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EADtB,cAAc,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAML,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAjBrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EACzB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,gBAAgB;wBAChB,cAAc;wBACd,sBAAsB;AACvB,qBAAA,EAAA,QAAA,EAAA,i9HAAA,EAAA,MAAA,EAAA,CAAA,mWAAA,CAAA,EAAA;;;AEzCH;;;;;;;;AAQG;MAgBU,uBAAuB,CAAA;IAiClC,WAAY,CAAA,WAAwB,EAAU,cAA6B,EAAA;QAA7B,IAAc,CAAA,cAAA,GAAd,cAAc;AAhC5D;;;;AAIG;QACa,IAAI,CAAA,IAAA,GAAG,KAAK,CAAC,QAAQ,CAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EACnC,SAAS,EAAE,CAAC,KAAsC,KAAI;AACpD,oBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,wBAAA,OAAO,SAAS;;AAElB,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,wBAAA,OAAO,KAAK;;AAEd,oBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,wBAAA,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,KAAK,CAAC;;AAErD,oBAAA,OAAO,SAAS;AAClB,iBAAC,EAZmC,CAAA,GAAA,CAAA;AACpC,gBAAA,SAAS,EAAE,CAAC,KAAsC,KAAI;AACpD,oBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,wBAAA,OAAO,SAAS;;AAElB,oBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,wBAAA,OAAO,KAAK;;AAEd,oBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,wBAAA,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,KAAK,CAAC;;AAErD,oBAAA,OAAO,SAAS;iBACjB;AACF,aAAA,CAAA,CAAA,CAAC;AAEF;;AAEG;QACa,IAAU,CAAA,UAAA,GAAG,MAAM,EAAc;AAEjC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAuB,SAAS,wDAAC;AACtD,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAqB,SAAS,6DAAC;AACzD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA+B,SAAS,qDAAC;QAMzE,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE;AACtC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/D,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AAChB,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;;iBAChB;gBACL,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,IAAI,CAAC,IAAI;qBACN,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK;AAClB,qBAAA,IAAI,CAAC,EAAE,CAAC,CACZ;AACD,gBAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;AAC9B,gBAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;;AAE1C,SAAC,CAAC;;IAGI,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;;AAGhC,IAAA,cAAc,CAAC,KAAwB,EAAA;AAC5C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGvC,IAAA,gBAAgB,CAAC,QAAmB,EAAA;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE;YACT;;AAEF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAC/B,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAC1C;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5C,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGtB,IAAA,WAAW,CAAC,KAAuB,EAAA;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;IAGpB,iBAAiB,GAAA;;;IAIjB,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC,SAAS,EAAE,aAAa;AAChC,aAAA,SAAS,CAAC,CAAC,GAAY,KAAI;YAC1B,IAAI,GAAG,EAAE;AACP,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC3D;;AAEL,SAAC,CAAC;;8GAjGK,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,uPCpDpC,y7DAkEA,EAAA,MAAA,EAAA,CAAA,8OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,UAAA,EAAA,IAAA,EACnB,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,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,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,8BACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,qBAAqB,sOACrB,yBAAyB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKhB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAfnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACvB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,gBAAgB;wBAChB,qBAAqB;wBACrB,yBAAyB;AAC1B,qBAAA,EAAA,QAAA,EAAA,y7DAAA,EAAA,MAAA,EAAA,CAAA,8OAAA,CAAA,EAAA;;;AEsEH;;AAEG;MAIU,aAAa,CAAA;AACxB,IAAA,WAAA,CACU,KAAiB,EACjB,MAAoB,EACpB,IAAgB,EAAA;QAFhB,IAAK,CAAA,KAAA,GAAL,KAAK;QACL,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAI,CAAA,IAAA,GAAJ,IAAI;;AAGd;;;;;AAKG;AACI,IAAA,eAAe,CACpB,IAAY,EAAA;QAEZ,OAAO,IAAI,CAAC;aACT,IAAI,CACH,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA,qBAAA,CAAuB,EACjD;YACE,IAAI;SACL;aAEF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;AAG9C;;;;;;AAMG;IACI,aAAa,CAClB,IAAgB,EAChB,UAAgC,EAAA;QAEhC,OAAO,IAAI,CAAC;aACT,IAAI,CACH,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA,mBAAA,CAAqB,EAC/C;YACE,IAAI;YACJ,UAAU;SACX;aAEF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;AAG9C;;;;;AAKG;AACI,IAAA,OAAO,CACZ,UAAgC,EAAA;QAEhC,OAAO,IAAI,CAAC;aACT,IAAI,CACH,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA,oBAAA,CAAsB,EAChD;YACE,UAAU;SACX;aAEF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;AAG9C;;;;;;;;AAQG;IACI,QAAQ,CACb,IAAgB,EAChB,UAAgC,EAAA;QAEhC,OAAO,IAAI,CAAC;aACT,IAAI,CACH,CAAG,EAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA,yBAAA,CAA2B,EACrD;YACE,IAAI;YACJ,UAAU;SACX;aAEF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;8GAxFnC,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAE,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;;2FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC9FD;;;;;;;;AAQG;MAaU,6BAA6B,CAAA;IAkBxC,WACE,CAAA,WAAwB,EAChB,IAAmB;;AAGpB,IAAA,SAAuD,EAGvD,IAAkD,EAAA;QANjD,IAAI,CAAA,IAAA,GAAJ,IAAI;QAGL,IAAS,CAAA,SAAA,GAAT,SAAS;QAGT,IAAI,CAAA,IAAA,GAAJ,IAAI;AAzBG,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAU,KAAK,gDAAC;AAC7B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAqB,SAAS,sDAAC;AAKlE;;;AAGG;QACa,IAAM,CAAA,MAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;AAEpD;;AAEG;QACa,IAAgB,CAAA,gBAAA,GAAG,MAAM,EAAwB;QAY/D,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,EAAE;AACnD,YAAA,UAAU,CAAC,QAAQ;AACnB,YAAA,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3B,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI;AACpB,SAAA,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC;AAClD,SAAC,CAAC;;IAGG,QAAQ,GAAA;QACb,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;YAC9B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;;;AAI7C,IAAA,eAAe,CAAC,IAAa,EAAA;QAClC,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACxB;;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;QAE9B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AACxC,YAAA,IAAI,EAAE,CAAC,OAAO,KAAI;AAChB,gBAAA,IAAI,OAAO,CAAC,KAAK,EAAE;oBACjB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;oBAClC;;gBAEF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;AAChD,gBAAA,IAAI,IAAI,CAAC,SAAS,EAAE;oBAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;;aAEvC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;gBACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;aACnC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;aACrB;AACF,SAAA,CAAC;;IAGG,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;;AA3Ed,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,qHAyB9B,eAAe,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAzBd,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClD1C,qmHAuHA,EAAA,MAAA,EAAA,CAAA,oUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9EI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKL,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAZzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAC7B,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;AACf,qBAAA,EAAA,QAAA,EAAA,qmHAAA,EAAA,MAAA,EAAA,CAAA,oUAAA,CAAA,EAAA;;0BA0BE;;0BAEA;;0BACA,MAAM;2BAAC,eAAe;;;AExD3B;;;;;;;;;;;;;;;AAeG;MAeU,8BAA8B,CAAA;AA2BzC,IAAA,WAAA,CAAY,WAAwB,EAAA;AA1BpC;;AAEG;QACa,IAAM,CAAA,MAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA+B;AAE7D;;AAEG;QACa,IAAG,CAAA,GAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,KAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA2B;AAEtD;;AAEG;QACa,IAAK,CAAA,KAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA2B;AAExD;;AAEG;QACI,IAAY,CAAA,YAAA,GAAG,MAAM,EAAE;AAS5B,QAAA,IAAI,CAAC,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE;AAC5B,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC3D,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE;AAC9B,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC3D,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE;AAC7B,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE;YAChC,UAAU,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACzC,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,SAAA,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAChC,SAAC,CAAC;;AAGI,IAAA,UAAU,CAAC,MAAwB,EAAA;QACzC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACjB;;QAEF,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;;IAGrB,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;;IAGnB,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACrB;;AAEF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACd,YAAA,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK;AACjB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACrB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACrB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS;AACnC,SAAA,CAAC;;8GAhFO,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,ECjD3C,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,y4FA2FA,EDrDI,MAAA,EAAA,CAAA,kZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,4zCACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+sBACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKP,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAd1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAC9B,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf;AACH,qBAAA,EAAA,QAAA,EAAA,y4FAAA,EAAA,MAAA,EAAA,CAAA,kZAAA,CAAA,EAAA;;;AE3CD;;AAEG;MACU,aAAa,CAAA;AACxB;;AAEG;AACH,IAAA,OAAO,cAAc,GAAA;QACnB,OAAO,CAAC,OAAwB,KAAmC;AACjE,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAClB,gBAAA,OAAO,IAAI;;AAEb,YAAA,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE;YAC9B,IAAI,KAAK,GAAG,IAAI;AAChB,YAAA,IAAI,OAAO;AAEX,YAAA,IAAI;AACF,gBAAA,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC;gBAClE,OAAO;AACL,oBAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,KAAK,KAAK,GAAG,GAAG,CAAC,eAAe,GAAG,IAAI;;YACrE,OAAO,CAAC,EAAE;AACV,gBAAA,KAAK,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE;;AAGlD,YAAA,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE;gBACrB,MAAM,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC;AACnD,gBAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3D,oBAAA,KAAK,GAAG,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE;;;AAIxD,YAAA,OAAO,KAAK;AACd,SAAC;;AAEJ;;ACjCD;;AAEG;MAIU,eAAe,CAAA;AAH5B,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,MAAM,GAAyB,IAAI,GAAG,EAAmB;AACzD,QAAA,IAAA,CAAA,QAAQ,GACvB,IAAI,eAAe,CAAgB,IAAI,CAAC;AAiB1C;;AAEG;QACI,IAAc,CAAA,cAAA,GAAG,KAAK;AA2L9B;AA7MC;;AAEG;AACH,IAAA,IAAW,cAAc,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;;AAgBrC;;;;;AAKG;AACK,IAAA,YAAY,CAAC,GAAW,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG;;AAG5C,IAAA,SAAS,CAAC,OAAiB,EAAA;AACjC,QAAA,OAAO,OAAO,KAAK,SAAS,GAAG,IAAI,CAAC,cAAc,GAAG,OAAO;;AAG9D;;;;;;AAMG;AACI,IAAA,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,OAAiB,EAAA;AACnD,QAAA,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;QAC3B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE;AAClD,YAAA,IAAI;AACF,gBAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;YAChD,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,CAAA,kBAAA,EAAqB,GAAG,CAAmB,iBAAA,CAAA,EAAE,CAAC,CAAC;;;AAGjE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;AAGzB;;;;;AAKG;IACI,OAAO,CACZ,QAAmD,EACnD,OAAiB,EAAA;QAEjB,IAAI,CAAC,QAAQ,EAAE;YACb;;AAEF,QAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;AAC1B,YAAA,IAAI,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;AAChC,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;;;;AAK3C;;;;;;;AAOG;AACI,IAAA,GAAG,CAAI,GAAW,EAAE,YAAkB,EAAE,OAAiB,EAAA;AAC9D,QAAA,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;;QAG5B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAM;;;AAIlC,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;YAC3B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;YACvC,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI;oBACF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM;oBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC;AACjC,oBAAA,OAAO,WAAW;;gBAClB,OAAO,CAAC,EAAE;oBACV,OAAO,CAAC,KAAK,CACX,CAAA,6BAAA,EAAgC,GAAG,CAAqB,mBAAA,CAAA,EACxD,CAAC,CACF;;;;;AAMP,QAAA,OAAO,YAAY;;AAGrB;;;;;;AAMG;IACI,QAAQ,CAAC,GAAW,EAAE,OAAiB,EAAA;AAC5C,QAAA,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,OAAO,IAAI;;AAEb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI;;AAGtE;;;;;AAKG;AACI,IAAA,OAAO,CAAC,OAAiB,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAgB,IAAI,GAAG,EAAU;;AAG3C,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC3B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,gBAAA,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE;AAC9D,oBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;;;;;AAMnB,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;AAG9C,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;AAGzB;;;;;AAKG;IACI,MAAM,CAAC,GAAW,EAAE,OAAiB,EAAA;AAC1C,QAAA,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC3B,YAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;;AAE9B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;AAGzB;;;;;AAKG;AACI,IAAA,KAAK,CAAC,OAAiB,EAAA;;AAE5B,QAAA,MAAM,WAAW,GAAgB,IAAI,GAAG,EAAU;AAElD,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;;AAElB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACzC,wBAAA,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;;;;AAIxB,gBAAA,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;;iBACrD;gBACL,YAAY,CAAC,KAAK,EAAE;;;;QAKxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;AACvB,YAAA,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;AACzB,SAAC,CAAC;;;AAIF,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;8GAhN5C,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;2FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACmED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDG;MAwBU,6BAA6B,CAAA;AA6FxC,IAAA,WAAA,CACE,WAAwB,EAChB,UAAqB,EACrB,SAA0B,EAC1B,cAA6B,EAAA;QAF7B,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAc,CAAA,cAAA,GAAd,cAAc;;QA/FP,IAAY,CAAA,YAAA,GAAyB,EAAE;AAEvC,QAAA,IAAA,CAAA,OAAO,GAAG,cAAc,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAIjE;;AAEG;QACa,IAAS,CAAA,SAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;AAEnE;;AAEG;QACa,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA4B;AAE5D;;AAEG;QACa,IAAW,CAAA,WAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuB;AAE1D;;AAEG;QACa,IAAW,CAAA,WAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;AAErE;;AAEG;QACa,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;AAE5E;;AAEG;QACa,IAAqB,CAAA,qBAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAE1C;AAEH;;AAEG;QACa,IAAe,CAAA,eAAA,GAAG,MAAM,EAAsB;AAE9D;;AAEG;QACa,IAAgB,CAAA,gBAAA,GAAG,MAAM,EAAsB;AAE/D;;AAEG;QACa,IAAe,CAAA,eAAA,GAAG,MAAM,EAAE;AAE1B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAS,CAAC,oDAAC;AAC5B,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAqB,SAAS,8CAAC;AAC1C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAU,KAAK,iDAAC;AAC9B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,oDAAC;AACjC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,oDAAC;;;AAGjC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAe,EAAE,oDAAC;AACnC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAqB,SAAS,2DAAC;;AAEvD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAA8B,SAAS,wDAAC;AAC7D,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAS,CAAC,CAAC,6DAAC;AAiCpD,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;;AAEf,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACjE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,CAAC;AACvD,QAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAY,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAoB,EAAE,EAAE;AACxD,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,CAAgB,aAAa,CAAC,OAAO,EAAE;YACpE,UAAU,EAAE,UAAU,CAAC,QAAQ;AAC/B,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;QACF,IAAI,CAAC,EAAE,GAAG,WAAW,CAAC,OAAO,CAAS,CAAC,EAAE;YACvC,UAAU,EAAE,UAAU,CAAC,QAAQ;AAC/B,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAU,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC3E,QAAA,IAAI,CAAC,EAAE,GAAG,WAAW,CAAC,OAAO,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAU,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC3E,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,CAAC;QACzD,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAS,CAAC,EAAE;YACxC,UAAU,EAAE,UAAU,CAAC,QAAQ;AAC/B,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,CAAC;;QAGrD,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAS,EAAE,EAAE;AACzC,YAAA,UAAU,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;AAC5C,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,OAAO,CACxC,EAAE,EACF,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB;QACD,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,OAAO,CAAU,KAAK,EAAE;AACvD,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,CAAY,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAE3E,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,SAAA,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AACnC,SAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,IAAI,SAAS,CAAC;YACxD,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,cAAc,EAAE;AACrB,gBAAA,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;;AAErD,SAAC,CAAC;;IAGG,QAAQ,GAAA;;QAEb,IAAI,CAAC,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,IAAI,CAAC;aACP,IAAI,CACH,MAAM,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO,CAAC,EAC9DE,cAAY,CAAC,GAAG,CAAC;aAElB,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,cAAc,EAAE;SACtB,CAAC,CACL;;QAGD,IAAI,CAAC,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAC5D;;IAGI,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC7C,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE;YAC5B,GAAG,CAAC,WAAW,EAAE;;;AAIb,IAAA,cAAc,CAAC,QAAuB,EAAA;QAC5C,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE;AACpE,YAAA,OAAO,IAAI;;AAEb,QAAA,IACE,QAAQ,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK;AACtD,YAAA,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EACxD;AACA,YAAA,OAAO,IAAI;;QAEb,IACE,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK;YAC1C,QAAQ,EAAE,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI;YACxC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAClD;AACA,YAAA,OAAO,IAAI;;;AAGb,QAAA,MAAM,OAAO,GAAG,QAAQ,EAAE,WAAW;QACrC,IACE,OAAO,EAAE,gBAAgB;AACvB,YAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,gBAAgB;AAChD,YAAA,OAAO,EAAE,iBAAiB;AACxB,gBAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,iBAAiB;AACjD,YAAA,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,cAAc,EACxE;AACA,YAAA,OAAO,IAAI;;AAEb,QAAA,OAAO,KAAK;;AAGP,IAAA,cAAc,CAAC,MAA6B,EAAA;AACjD,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC9B,MAAM,CAAC,aAAa,CAAC;AACnB,YAAA,OAAO,EAAE;AACP,gBAAA,IAAI,EAAE,OAAO;AACd,aAAA;AACD,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,eAAe,EAAE,IAAI;AACtB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,YAAY;AACf,YAAA,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AACvE,QAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;AAClC,QAAA,IAAI,CAAC,OAAO,GAAG,MAA6C;QAE5D,IAAI,CAAC,YAAY,CAAC,IAAI;;QAEpB,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAI;AACzC,YAAA,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAa,CAAC,QAAQ,EAAE;YAC1C,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AAC3B,gBAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvB,gBAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;AACtB,gBAAA,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE;;SAEpC,CAAC,CACH;;AAGI,IAAA,gBAAgB,CAAC,QAA4B,EAAA;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;;AAGtB,IAAA,kBAAkB,CAAC,QAAmB,EAAA;AAC3C,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;;;IAIxB,SAAS,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAGzB,IAAA,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;IAGrD,WAAW,GAAA;QAChB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;;AAG3B,IAAA,cAAc,CAAC,MAAuB,EAAA;QAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACvC,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,EAAE;AACnC,YAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;;aACf;YACL,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,MAAM;;AAE5C,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE;;;;IAKb,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YACnB;;AAEF,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QAC5C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG;;AAEZ,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;QAC/D,CAAC,CAAC,QAAQ,GAAG,CAAA,IAAA,EAAO,IAAI,CAAI,CAAA,EAAA,IAAI,MAAM;QACtC,CAAC,CAAC,KAAK,EAAE;AACT,QAAA,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;;IAG1B,aAAa,GAAA;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAC5B,YAAY,EACZ;;SAED;QACD,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;gBAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEtC,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;;;IAIvB,OAAO,GAAA;QACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,IAAI,GAAG,MAAM;AACnB,QAAA,KAAK,CAAC,MAAM,GAAG,MAAM;AACrB,QAAA,KAAK,CAAC,QAAQ,GAAG,MAAK;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YAC7B,IAAI,IAAI,EAAE;AACR,gBAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,gBAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAI;oBACpB,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAgB,CAAC;AACzD,iBAAC;AACD,gBAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;;AAE3B,SAAC;QACD,KAAK,CAAC,KAAK,EAAE;;IAGR,mBAAmB,GAAA;QACxB,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;AAC3C,YAAA,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC;AACnC,SAAC,CAAC;;AAGI,IAAA,QAAQ,CAAC,GAAY,EAAA;QAC3B,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,EAAE;;AAEX,QAAA,IAAI;;AAEF,YAAA,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE;YAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC;AACxD,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;;;;;AAMzD,YAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,gBAAA,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACtD,gBAAA,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACtD,gBAAA,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,CAAC,CAAC,CAAI,CAAA,EAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC;;AAG7D,YAAA,OAAO,QAAwB;;QAC/B,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACxC,YAAA,OAAO,EAAE;;;IAIN,cAAc,GAAA;AACnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;AAC/C,QAAA,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC;;IAG9B,WAAW,GAAA;;AAEhB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK;QAC1B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YACzB,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAM,GAAA,EAAA,GAAG,CAAM,IAAA,CAAA,CAAC;;;;;AAMzC,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;;AAI7C,IAAA,mBAAmB,CAAC,OAAmB,EAAA;AAC5C,QAAA,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE;AACrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE;AACrD,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC5B,YAAA,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;YAC7B,CAAC,EAAE,GAAG,QAAQ;AACf,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGvB,IAAA,qBAAqB,CAAC,OAAmB,EAAA;AAC9C,QAAA,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE;QACrB,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AACzD,QAAA,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE;YACxB;;AAGF,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC,SAAS,EAAE,0BAA0B;AAC7C,aAAA,SAAS,CAAC,CAAC,GAAY,KAAI;YAC1B,IAAI,GAAG,EAAE;AACP,gBAAA,OAAO,eAAe,CAAC,EAAE,CAAC;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC;AAE9C,gBAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE;AACjC,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;;;AAGzC,SAAC,CAAC;;AAGC,IAAA,uBAAuB,CAAC,QAAmB,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC5B,gBAAA,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;AAC7B,gBAAA,CAAC,IAAI,CAAC,eAAe,EAAG,GAAG,QAAQ;AACpC,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;;;;IAK/B,YAAY,GAAA;QAClB,IAAI,EAAE,GAAG,KAAK,EACZ,KAAK,GAAG,KAAK,EACb,KAAK,GAAG,KAAK;AACf,QAAA,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK;YACrB,KAAK,aAAa,CAAC,SAAS;YAC5B,KAAK,aAAa,CAAC,UAAU;gBAC3B,EAAE,GAAG,IAAI;gBACT;YACF,KAAK,aAAa,CAAC,IAAI;gBACrB,EAAE,GAAG,IAAI;gBACT,KAAK,GAAG,IAAI;gBACZ;YACF,KAAK,aAAa,CAAC,QAAQ;YAC3B,KAAK,aAAa,CAAC,SAAS;YAC5B,KAAK,aAAa,CAAC,OAAO;gBACxB,KAAK,GAAG,IAAI;gBACZ;;AAEJ,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAExB,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;;QAEjB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;;QAEpB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;;;AAId,IAAA,UAAU,CAAC,SAAqC,EAAA;QACtD,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACjB,IAAI,CAAC,YAAY,EAAE;YACnB;;;AAIF,QAAA,IAAI,SAAS,CAAC,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;;aACpB;YACL,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;;QAG7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC;AAC9C,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CACzB,SAAS,CAAC,WAAW,EAAE,eAAe,IAAI,KAAK,CAChD;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC;QAE/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC;QACrD,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;AAE5C,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,IAAI,EAAE,CAAC;AAE3E,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAE1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAE1D,IAAI,CAAC,YAAY,EAAE;;IAGd,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;;IAGrB,YAAY,GAAA;QAClB,OAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS;AAClC,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,SAAS;AACxC,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS;AACvE,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS;AACpE,YAAA,WAAW,EAAE;AACX,gBAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;AACjB,gBAAA,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;AACzC,gBAAA,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;AAC/B,gBAAA,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK;AAC5C,aAAA;AACD,YAAA,EAAE,EAAE,IAAI,CAAC,EAAE,EAAG;AACd,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACrB,YAAA,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK;AACjB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS;AAC5C,YAAA,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,SAAS;AAC9B,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS;AAC5C,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,SAAS;AAC1C,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS;AAC5C,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;AACnB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS;AACpC,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS;SACrC;;IAGI,cAAc,GAAA;QACnB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;;IAG1C,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACpB;;QAGF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAG,CAAC;;8GAvjBnC,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,ECpJ1C,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,o3aA2ZA,ED3RI,MAAA,EAAA,CAAA,qvDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,4zCACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,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,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+sBACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,eAAe,EAEf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,KAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,yBAAyB,EACzB,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,8BAA8B,kJAF9B,YAAY,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAOH,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAvBzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAC7B,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,cAAc;wBACd,eAAe;wBACf,iBAAiB;wBACjB,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,gBAAgB;wBAChB,eAAe;wBACf,YAAY;wBACZ,yBAAyB;wBACzB,8BAA8B;AAC/B,qBAAA,EAAA,QAAA,EAAA,o3aAAA,EAAA,MAAA,EAAA,CAAA,qvDAAA,CAAA,EAAA;;;AE7HH;;;;;;;;;;;;;;;;AAgBG;MAcU,uBAAuB,CAAA;AAkClC,IAAA,WAAA,CAAY,WAAwB,EAAA;AA/BpC;;AAEG;AACa,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAiC,EAAE,oDAAC;AAEpE;;;AAGG;QACa,IAAS,CAAA,SAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA2B;AAE5D;;;;AAIG;QACa,IAAU,CAAA,UAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA0B;AAE5D;;;;;AAKG;AACa,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,CAAC,2DAAC;AAE1B,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAiC,EAAE,4DAAC;QAM3E,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;;QAGvC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,kBAAkB,EAAE;AAC3B,SAAC,CAAC;;AAGI,IAAA,kBAAkB,CAAC,IAAoB,EAAA;AAC7C,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACjC,YAAA,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACxE,CAAC,CACH;;IAGI,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;aACrB,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAC9C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChC,SAAC,CAAC;QACJ,IAAI,CAAC,kBAAkB,EAAE;;IAGpB,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;;8GA/Df,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,ECjDpC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,gkDAsDA,EDfI,MAAA,EAAA,CAAA,oaAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAf,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,6XACd,cAAc,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKL,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACvB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,cAAc;AACf,qBAAA,EAAA,QAAA,EAAA,gkDAAA,EAAA,MAAA,EAAA,CAAA,oaAAA,CAAA,EAAA;;;AE7BH;;;;;;;;;;;;;;;;;;AAkBG;MAOU,iBAAiB,CAAA;AAwB5B,IAAA,WAAA,GAAA;;AAtBQ,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,4DAAC;;AAEhC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,KAAK,+DAAC;;AAG3B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAA8B,EAAE,iDAAC;AAE/D;;AAEG;AACa,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAA8B,EAAE,iDAAC;AAE9D;;AAEG;QACa,IAAY,CAAA,YAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAyC;AAE7E;;AAEG;AACa,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,OAAO,wDAAC;;QAI3C,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;YACjC,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,gBAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;;iBACzB;AACL,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;;;AAIpB,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,SAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;;YAEV,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;AAC1D,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;AACjC,gBAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE;;gBAG/C,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3C,IAAI,mBAAmB,EAAE;;AAEvB,wBAAA,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,CAAC;;yBAC5C;;AAEL,wBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;;AAI9D,oBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;;;AAGxC,SAAC,CAAC;;AAGI,IAAA,uBAAuB,CAAC,IAA+B,EAAA;AAC7D,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;;AAGjC,QAAA,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC;QAE3E,IAAI,UAAU,EAAE;;AAEd,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;;aACtB;;YAEL,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AACtD,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;;;IAI5B,eAAe,GAAA;;QAEpB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,SAAC,CAAC;;AAGI,IAAA,WAAW,CAAC,KAA8C,EAAA;QAChE,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB;;QAGF,MAAM,KAAK,GAAgC,EAAE;AAC7C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAG,CAAC,CAAC,CAAC;AAC7B,YAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;;AAExD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGhB,IAAA,WAAW,CAAC,IAA+B,EAAA;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;;8GApGlB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzC9B,yqBAuBA,EDcY,MAAA,EAAA,CAAA,wWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAI/D,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,yqBAAA,EAAA,MAAA,EAAA,CAAA,wWAAA,CAAA,EAAA;;;AED7E;;;;;;;;;;;;AAYG;MAgBU,wBAAwB,CAAA;AAoCnC,IAAA,WAAA,CAAY,WAAwB,EAAA;;AA/B5B,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;;AAElC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,4DAAC;AAExC;;AAEG;QACa,IAAM,CAAA,MAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA+B;AAE7D;;;AAGG;QACa,IAAgB,CAAA,gBAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;AAE9D;;AAEG;QACa,IAAQ,CAAA,QAAA,GAAG,MAAM,EAA6B;AAE9C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAW,EAAE,uDAAC;AAClC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,EAAE,gDAAC;AAC3B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAC3B,SAAS,gDACV;AACe,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAqB,SAAS,qDAAC;AACjD,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAqB,EAAE,6DAAC;;QAOhE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;QAGhD,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,CAAC;QAC1D,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,OAAO,CAAgB,IAAI,CAAC;;QAGnD,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;YAE9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACjD,SAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;;YAEV,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACzD,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE;AACnC,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE;;gBAG5C,IAAI,aAAa,EAAE,KAAK,EAAE,MAAM,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9D,oBAAA,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,YAAY,CAAC;AACxD,oBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;;;AAGvC,SAAC,CAAC;;IAGI,sBAAsB,CAC5B,MAAuB,EACvB,gBAAwB,EAAA;;AAGxB,QAAA,MAAM,cAAc,GAClB,gBAAgB,GAAG;AACjB,cAAE,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG;cACtB,gBAAgB;;AAGtB,QAAA,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;YAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;;AAG/C,YAAA,IAAI,UAAU,CAAC,SAAS,EAAE;;gBAExB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;;;;IAKtC,QAAQ,GAAA;QACb,IAAI,CAAC,KAAK,GAAG;;YAEX,IAAI,CAAC,UAAU,CAAC;iBACb,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAC9C,iBAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,gBAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC1D,aAAC,CAAC;;YAGJ,IAAI,CAAC,GAAG,CAAC;iBACN,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAC9C,iBAAA,SAAS,CAAC,CAAC,KAAK,KAAI;gBACnB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAC9D;AACD,gBAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;oBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAG,CAAC;;AAEpC,aAAC,CAAC;SACL;;IAGI,eAAe,GAAA;;QAEpB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,SAAC,CAAC;;AAGG,IAAA,YAAY,CAAC,IAAc,EAAA;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,OAAO,QAAQ,EAAE,IAAI,CACnB,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;AAEtD,cAAE;cACA,IAAI;;AAGF,IAAA,iBAAiB,CAAC,gBAAyB,EAAA;QACjD,IAAI,gBAAgB,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;AAC1D,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,IAAI,CAAC,MAAM,EAAG,CAAC,KAAK,CAClB,gBAAgB,GAAG;kBACf,IAAI,CAAC,MAAM,EAAG,CAAC,KAAK,CAAC,MAAM,GAAG;AAChC,kBAAE,gBAAgB,CACrB,CACF;;aACI;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;;;IAIrB,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;;IAGzC,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB;;;AAIF,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;QAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAG,CAAC,KAAK,EAAE;YACvC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;AAC9C,gBAAA,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;AAC9B,oBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;;;;AAI7B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;;AAGvC,IAAA,iBAAiB,CAAC,OAAuB,EAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,OAAO,SAAS;;QAElB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAG,CAAC,KAAK,EAAE;YACvC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;AAC9C,gBAAA,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE;oBAC3D,OAAO,IAAI,CAAC,SAAS;;;;AAI3B,QAAA,OAAO,SAAS;;AAGV,IAAA,UAAU,CAAC,MAAwB,EAAA;AACzC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QAE9B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACxB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;;aACnB;YACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YACzE,IAAI,CAAC,iBAAiB,EAAE;;;AAI1B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG5B,IAAA,eAAe,CAAC,EAAU,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AAChB,YAAA,OAAO,EAAE;;QAEX,QACE,IAAI,CAAC,IAAI,EAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAG,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC;AACvE,YAAA,EAAE;;AAIE,IAAA,QAAQ,CAAC,EAAU,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AAChB,YAAA,OAAO,IAAI;;AAEb,QAAA,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAG,CAAC,WAAW,CAAC,EAAE;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YACrE,IAAI,IAAI,EAAE;AACR,gBAAA,OAAO,IAAI;;;AAGf,QAAA,OAAO,IAAI;;AAGN,IAAA,cAAc,CAAC,KAAwB,EAAA;AAC5C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AACpD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAE;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAK,EAAA,EAAA,IAAI,CAAC,SAAS,CAAA,CAAA,CAAG,CAAC;QAC7D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;;AAGpC,IAAA,eAAe,CAAC,KAAuB,EAAA;AAC5C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE;;YAEnB;;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG;QAEhC,MAAM,QAAQ,GAAc,EAAE;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAM,CAAC;AAE5D,QAAA,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE;;AAEzB,YAAA,IAAI,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE;gBACxC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAElD,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE;AACxB,oBAAA,KAAK,IAAI,CAAC,IAAI,YAAY,EAAE;AAC1B,wBAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;;;qBAEb;;AAEL,oBAAA,QAAQ,CAAC,MAAM,CACb,CAAC,EACD,QAAQ,CAAC,MAAM,EACf,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KACnB,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAC9C,CACF;;;;AAKP,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAG/B,IAAA,YAAY,CAAC,IAAgC,EAAA;AAClD,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,EAAE;;YAER,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;;;8GA1Q1B,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,oZChErC,y7DAkEA,EAAA,MAAA,EAAA,CAAA,8oBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDdI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,EAClB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,8BACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,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,EAAAA,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,WAAA,EAAA,IAAA,EACf,uBAAuB,EACvB,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,8IACjB,qBAAqB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,MAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKZ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAfpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EACxB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,uBAAuB;wBACvB,iBAAiB;wBACjB,qBAAqB;AACtB,qBAAA,EAAA,QAAA,EAAA,y7DAAA,EAAA,MAAA,EAAA,CAAA,8oBAAA,CAAA,EAAA;;;ME/CU,kBAAkB,CAAA;AACrB,IAAA,UAAU,CAAC,GAAW,EAAA;QAC5B,IAAI,IAAI,GAAG,CAAC;AACZ,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAC/C,YAAA,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;;AAErB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGf,IAAA,QAAQ,CAAC,GAAW,EAAE,UAAkB,EAAE,SAAiB,EAAA;QACjE,MAAM,MAAM,GACV,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,UAAU,IAAI,GAAG;QAChE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,SAAS,GAAG,GAAG,GAAG,MAAM,GAAG,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,EACP,CAAC,GAAG,CAAC,EACL,CAAC,GAAG,CAAC;QAEP,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE;YACxB,CAAC,GAAG,MAAM;YACV,CAAC,GAAG,CAAC;;aACA,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE;YACjC,CAAC,GAAG,CAAC;YACL,CAAC,GAAG,MAAM;;aACL,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;YAClC,CAAC,GAAG,MAAM;YACV,CAAC,GAAG,CAAC;;aACA,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;YAClC,CAAC,GAAG,CAAC;YACL,CAAC,GAAG,MAAM;;aACL,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;YAClC,CAAC,GAAG,CAAC;YACL,CAAC,GAAG,MAAM;;aACL,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;YAClC,CAAC,GAAG,MAAM;YACV,CAAC,GAAG,CAAC;;AAGP,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AAC7B,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AAC7B,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AAE7B,QAAA,OAAO,CAAI,CAAA,EAAA,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;;AAGnE,IAAA,cAAc,CAAC,GAAW,EAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACjC,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;QAC/B,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC;;IAG1C,kBAAkB,CAAC,KAAgB,EAAE,IAAe,EAAA;;AAE1D,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KACpC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CACtC;;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU;QAClC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC3B,YAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACvB,SAAC,CAAC;AACF,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC9B,YAAA,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChC,SAAC,CAAC;AACF,QAAA,OAAO,QAAQ;;AAGjB;;;;;;;AAOG;AACI,IAAA,aAAa,CAClB,KAAiB,EACjB,IAAe,EACf,UAA2B,IAAI,EAAA;QAE/B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,cAAc;;QAGvB,MAAM,EAAE,GAAa,EAAE;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC;AAE5D,QAAA,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC;AACtB,QAAA,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC;AACjC,QAAA,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC;AACjC,QAAA,EAAE,CAAC,IAAI,CAAC,aAAa,OAAO,CAAA,CAAA,CAAG,CAAC;QAChC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;;YAE3B,EAAE,CAAC,IAAI,CACL,CAAA,EAAA,EAAK,IAAI,CAAC,EAAE,CAAY,SAAA,EAAA,IAAI,CAAC,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAG,CAAA,CAAA;iBAC7D,IAAI,CAAC;sBACF,CAAe,YAAA,EAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAG,CAAA;sBACrD,EAAE,CAAC;iBACN,IAAI,CAAC,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC5C,sBAAE,CAAA,SAAA,EAAY,IAAI,CAAC,SAAS,CAAG,CAAA;sBAC7B,EAAE,CAAC;AACP,gBAAA,IAAI,CACP;AACH,SAAC,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YAC3B,IACE,CAAC,IAAI,CAAC,QAAQ;gBACd,CAAC,IAAI,CAAC,QAAQ;AACd,iBAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAClC;gBACA;;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;AAC3C,YAAA,EAAE,CAAC,IAAI,CACL,KAAK,IAAI,CAAC,QAAQ,CAAO,IAAA,EAAA,IAAI,CAAC,QAAQ,CAAA,SAAA,EAAY,IAAI,CAAC,GAAG,aAAa,KAAK,CAAA,GAAA,CAAK,CAClF;AACH,SAAC,CAAC;AACF,QAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;AACZ,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;;8GA1HX,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCiCY,kBAAkB,CAAA;AAgD7B,IAAA,WAAA,CACU,SAA6B,EAC7B,SAA0B,EAC1B,UAAqB,EACrB,SAAsB,EAAA;QAHtB,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAS,CAAA,SAAA,GAAT,SAAS;AAjDnB;;AAEG;QACa,IAAK,CAAA,KAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAyB;AAEtD;;AAEG;AACa,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAkB,IAAI,qDAAC;AAExD;;AAEG;AACa,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACnC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC1B,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,OAAO,EAAE;;AAEX,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;AAC7B,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,gBAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;;YAEnB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC/B,SAAC,gDAAC;AAEF;;AAEG;AACa,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAW,EAAE,wDAAC;AAElD;;AAEG;AACa,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AACpC,YAAA,IAAI,IAAI,GAAyB,IAAI,CAAC,YAAY,EAAE;YACpD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7B,IAAI,GAAG,SAAS;;AAElB,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAC3E,SAAC,iDAAC;AAEK,QAAA,IAAA,CAAA,QAAQ,GAA0B,IAAI,WAAW,CAAC,EAAE,EAAE;AAC3D,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;;AASA,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAe,KAAI;YACnE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AACnC,SAAC,CAAC;QAEF,MAAM,CAAC,MAAK;;AAEV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,IAAI,QAAQ,GAAa,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;AAEnB,gBAAA,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;iBACtC;;AAEL,gBAAA,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC;;AAEtB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAClC,SAAC,CAAC;;IAGG,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;;IAGnB,SAAS,GAAA;AACd,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,CAAC,KAAK,EAAE;YACV;;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,2BAA2B,EAAE,IAAI,EAAE;AACrD,YAAA,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;;IAGG,kBAAkB,GAAA;AACvB,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAC1B,iBAAiB,EACjB,2DAA2D,CAC5D;QACD,IAAI,CAAC,GAAG,EAAE;YACR;;AAEF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,CAAC,KAAK,EAAE;YACV;;QAEF,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;AAC5B,YAAA,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;;AAEtD,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;;8GAxGjB,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAgB,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAjB,IAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAK,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EC7C/B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,q9BAoCA,EDHI,MAAA,EAAA,CAAA,+JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,yTACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,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,EAAAA,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,EAAA,gBAAgB,6TAChB,YAAY,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAMH,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAf9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EACjB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,gBAAgB;wBAChB;qBACH,EAGU,OAAA,EAAA,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,q9BAAA,EAAA,MAAA,EAAA,CAAA,+JAAA,CAAA,EAAA;;;AEzBnC;;;;;;;;;;AAUG;MAeU,wBAAwB,CAAA;AA4BnC,IAAA,WAAA,CAAY,WAAwB,EAAA;AArBpC;;AAEG;AACa,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,CAAC,qDAAC;AAE5C;;;AAGG;QACa,IAAO,CAAA,OAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsC;AAErE;;AAEG;QACa,IAAa,CAAA,aAAA,GAAG,MAAM,EAAsC;;AAG5D,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MACrC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,uDAC1D;AAGC,QAAA,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;;IAGrD,YAAY,GAAA;;AAElB,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAChC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAChE;;AAED,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3C,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;;;IAItB,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;;QAEf,IAAI,CAAC,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,MAAM,CAAC;aACT,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAC9C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,gBAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAEpB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;AAChC,YAAA,MAAM,UAAU,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;AAC/C,YAAA,UAAU,CAAC,EAAE,CAAC,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAChC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACvD;AACD,YAAA,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3C,gBAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;;YAE3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SACvC,CAAC,CACL;;QAGD,IAAI,CAAC,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,UAAU,CAAC;aACb,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;AAC9C,aAAA,SAAS,CAAC,CAAC,KAAK,KAAI;YACnB,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE;AACpB,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAChD,CAAC,CACL;;IAGI,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;;IAG1C,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;;8GApFzB,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EC3CrC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,s9BAkCA,EDFI,MAAA,EAAA,CAAA,mHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,s6BACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,EACd,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,+sBACf,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKP,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAdpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EACxB,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,eAAe;wBACf,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,s9BAAA,EAAA,MAAA,EAAA,CAAA,mHAAA,CAAA,EAAA;;;AEbH;;;;;;;;AAQG;MAaU,2BAA2B,CAAA;AAMtC,IAAA,WAAA,CACE,WAAwB;;AAGjB,IAAA,SAAqD,EAGrD,IAAoD,EAAA;QAHpD,IAAS,CAAA,SAAA,GAAT,SAAS;QAGT,IAAI,CAAA,IAAA,GAAJ,IAAI;AATG,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,EAAE,gDAAC;QAW1C,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAS,EAAE,EAAE;AAC9C,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9D,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC;YACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAClC,SAAC,CAAC;;AAGI,IAAA,cAAc,CAAC,KAAiB,EAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;;IAGjC,QAAQ,GAAA;QACb,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;AAC5B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;;;IAIlC,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;;IAGlB,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACrB;;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACxB;;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;;AAtDzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,2FAY5B,eAAe,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAZd,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/CxC,k/CAiDA,EAAA,MAAA,EAAA,CAAA,+QAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,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,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAKL,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAZvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAC3B,OAAA,EAAA;wBACP,mBAAmB;wBACnB,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;AACf,qBAAA,EAAA,QAAA,EAAA,k/CAAA,EAAA,MAAA,EAAA,CAAA,+QAAA,CAAA,EAAA;;0BAaE;;0BAEA;;0BACA,MAAM;2BAAC,eAAe;;;AEiB3B;AACA,MAAM,UAAU,GAAG,SAAS;AAE5B;AACA,MAAM,iBAAiB,GAAG,IAAI;AAE9B;;;;;;;;;;;AAWG;MA+BU,uBAAuB,CAAA;IAmIlC,WACE,CAAA,WAAwB,EAChB,IAAmB,EACnB,OAAkB,EAClB,cAA6B,EAC7B,SAAsB,EAAA;QAHtB,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAO,CAAA,OAAA,GAAP,OAAO;QACP,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAS,CAAA,SAAA,GAAT,SAAS;AAvIF,QAAA,IAAA,CAAA,OAAO,GAAG,cAAc,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAWjE;;AAEG;QACa,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAExD;;AAEG;QACa,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;AAEtD;;AAEG;QACa,IAAM,CAAA,MAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuB;AAErD;;AAEG;QACa,IAAK,CAAA,KAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuB;AAEpD;;;AAGG;QACa,IAAY,CAAA,YAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuB;AAE3D;;AAEG;QACa,IAAW,CAAA,WAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;AAErE;;AAEG;QACa,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;AAE5E;;AAEG;QACa,IAAqB,CAAA,qBAAA,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAE1C;AAEH;;AAEG;QACa,IAAc,CAAA,cAAA,GAAG,MAAM,EAAE;AA8BzB,QAAA,IAAA,CAAA,SAAS,GAAyB,IAAI,WAAW,CAC/D,KAAK,EACL,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB;AAEe,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAwB,SAAS,iDAAC;;AAGhD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAW,EAAE,kDAAC;;AAE7B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAW,EAAE,wDAAC;;AAEnC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA+B,SAAS,qDAAC;;AAE3D,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAS,CAAC,qDAAC;;AAE7B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAiC,SAAS,oDAAC;AAC5D,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAS,CAAC,CAAC,yDAAC;AAElC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAU,KAAK,gDAAC;AAE7B,QAAA,IAAA,CAAA,SAAS,GAAG;AAC1B,YAAA,CAAC,EAAE,SAAS;AACZ,YAAA,CAAC,EAAE,QAAQ;AACX,YAAA,CAAC,EAAE,YAAY;AACf,YAAA,CAAC,EAAE,WAAW;AACd,YAAA,CAAC,EAAE,aAAa;AAChB,YAAA,CAAC,EAAE,YAAY;AACf,YAAA,CAAC,EAAE,MAAM;AACT,YAAA,CAAC,EAAE,UAAU;SACd;;QAGM,IAAS,CAAA,SAAA,GAAG,UAAU;QAGtB,IAAM,CAAA,MAAA,GAAG,IAAI;QAKb,IAAgB,CAAA,gBAAA,GAAG,CAAC,CAAC;;AAU1B,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAS,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAS,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACjE,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC;;AAEjD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAa,EAAE,EAAE;AAC9C,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AAClC,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,WAAW,CACrC,6BAA6B,CAAC,gBAAgB,EAC9C,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAgC,IAAI,CAAC;AACrE,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC1E,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACvE,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC;;AAGrD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,WAAW,CAAuB,EAAE,EAAE;AAC1D,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC;;QAEnD,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC;AACpD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACrE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACnE,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAgB,IAAI,CAAC;;AAGhD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAyB,EAAE,EAAE;AAC3D,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC;;AAGF,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;;YAErB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;;YAEf,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,SAAA,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,SAAS,EAAE;aACjB,EAAE,CAAC,CAAC;AACP,SAAC,CAAC;;AAGJ;;;;;;AAMG;AACK,IAAA,WAAW,CAAC,QAAmB,EAAE,KAAK,GAAG,UAAU,EAAA;AACzD,QAAA,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;;QAG5B,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;;;AAI/B,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC3B,IAAI,CAAC,QAAQ,GAAG;AACd,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,OAAO,EAAE;AACP,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,gBAAA,aAAa,EAAE,IAAI;AACnB,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,IAAI,CAAC,eAAe;AACrC,aAAA;SACF;QAED,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC;;AAGnC,IAAA,UAAU,CAAC,QAA8B,EAAA;AAC/C,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS;AAChC,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAE1B,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;;aACZ;YACL,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC;AACnD,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC;AACxD,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;AACpD,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;AACpD,YAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC;AAC5D,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;YACzC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAChC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;;iBAChC;AACL,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,mBAAmB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CACrD;;AAEH,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;AACtE,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,cAAc,IAAI,IAAI,CAAC;YACrE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;YACxE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;YAClE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC;;YAE/C,MAAM,SAAS,GAA2B,EAAE;AAC5C,YAAA,IAAI,QAAQ,CAAC,SAAS,EAAE;AACtB,gBAAA,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE;oBAClC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;;;AAG3C,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;;QAEpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;;;IAIrB,aAAa,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;YACf;;QAGF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE;AAC/D,YAAA,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE;AAChD,YAAA,KAAK,EAAE,KAAK;AACb,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,IAAgB,KAAI;AACrD,YAAA,IAAI,IAAI,EAAE,MAAM,EAAE;;AAEhB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5B,gBAAA,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE;AACtC,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;AAC3B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;;AAG7B,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;;gBAG1B,IAAI,CAAC,mBAAmB,EAAE;;AAG1B,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;AAE1B,SAAC,CAAC;;AAGJ;;;AAGG;AACK,IAAA,eAAe,CAAC,IAAgB,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;;aAChB;YACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;;;AAItE;;;AAGG;AACI,IAAA,WAAW,CAAC,KAAwB,EAAA;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;;;AAK3B;;;;AAIG;IACK,aAAa,GAAA;AACnB,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;QAE7B,IAAI,CAAC,GAAG,CAAC;QACT,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;;AAEtC,YAAA,CAAC,EAAE;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,IAAI,CAAI,CAAA,EAAA,CAAC,CAAE,CAAA,CAAC;;AAGjC,YAAA,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE;gBACrB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;;QAIpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;;AAGjC;;AAEG;IACI,gBAAgB,GAAA;;AAErB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAChB,YAAA,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE;AAClB,YAAA,IAAI,EAAE,CAAC;YACP,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC;YAC7B,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC;AAChC,SAAA,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAG5B;;;AAGG;AACI,IAAA,aAAa,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;AAG3D;;AAEG;IACK,oBAAoB,GAAA;QAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;;AAG9B;;;AAGG;IACI,iBAAiB,GAAA;QACtB,IAAI,CAAC,oBAAoB,EAAE;;AAG7B;;;;;AAKG;AACI,IAAA,iBAAiB,CAAC,EAA8B,EAAA;QACrD,IAAI,CAAC,EAAE,EAAE;YACP;;AAEF,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC/B,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;;AAG7C,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE;QAC5B,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,EAAE;AAC7B,YAAA,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;;aACzC;AACL,YAAA,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,YAAA,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;;;AAI3B,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE;;QAGxC,IAAI,CAAC,aAAa,EAAE;;AAGpB,QAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;;QAGb,IAAI,CAAC,oBAAoB,EAAE;;AAG7B;;;AAGG;AACI,IAAA,eAAe,CAAC,KAAa,EAAA;AAClC,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CACN,kBAAkB,EAClB,CAAA,kBAAA,EAAqB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI;AAEzD,aAAA,SAAS,CAAC,CAAC,GAAY,KAAI;YAC1B,IAAI,GAAG,EAAE;;AAEP,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,EAAE;oBAClC,IAAI,CAAC,oBAAoB,EAAE;;;AAG7B,gBAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE;AAC9D,oBAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;;;gBAGpC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAC7C,gBAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3B,gBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;AACpC,gBAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;AAC7B,gBAAA,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE;;gBAGxC,IAAI,CAAC,aAAa,EAAE;;gBAGpB,UAAU,CAAC,MAAK;oBACd,IAAI,CAAC,SAAS,EAAE;iBACjB,EAAE,CAAC,CAAC;;AAET,SAAC,CAAC;;AAGN;;;AAGG;IACI,eAAe,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;YACf;;QAGF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE;AACjE,YAAA,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE;AAChC,SAAA,CAAC;QAEF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,QAA8B,KAAI;YACnE,IAAI,QAAQ,EAAE;gBACZ,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAC7C,gBAAA,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;AAC5B,gBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;AACpC,gBAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;AAC7B,gBAAA,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE;;gBAExC,IAAI,CAAC,aAAa,EAAE;;gBAEpB,UAAU,CAAC,MAAK;oBACd,IAAI,CAAC,SAAS,EAAE;iBACjB,EAAE,CAAC,CAAC;;AAET,SAAC,CAAC;;AAGJ;;AAEG;IACK,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;QAClC,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS;;AAGzB;;AAEG;IACI,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC;AACF,aAAA,OAAO,CAAC,SAAS,EAAE,wBAAwB;AAC3C,aAAA,SAAS,CAAC,CAAC,GAAY,KAAI;YAC1B,IAAI,GAAG,EAAE;gBACP,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,SAAC,CAAC;;AAGN;;;;;;AAMG;AACK,IAAA,WAAW,CAAC,GAAY,EAAA;QAC9B,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,SAAS;;QAGlB,MAAM,KAAK,GAAG,2BAA2B;QACzC,MAAM,GAAG,GAAa,EAAE;AACxB,QAAA,IAAI,KAA6B;AAEjC,QAAA,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE;YACzC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;AAGpB,QAAA,OAAO,GAAG;;AAGJ,IAAA,iBAAiB,CAAC,CAAU,EAAA;QAClC,IAAI,CAAC,CAAC,EAAE;AACN,YAAA,OAAO,SAAS;;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;;AAG5E;;;;;;;;;;;;;;;;AAgBG;AACK,IAAA,aAAa,CACnB,QAAkB,EAClB,MAAuB,EACvB,GAAW,EAAA;;AAGX,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAkB;;;QAIzC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC;;;AAIpE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE;;AAEnC,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAE/D,YAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;;AAEhC,gBAAA,IACE,QAAQ,CAAC,EAAE,GAAG,aAAa;AAC3B,oBAAA,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,EACxC;AACA,oBAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;;qBACf;;AAEL,oBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;AAC7D,oBAAA,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE;wBACjB,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ;;;;;;AAOpD,QAAA,QAAQ,CAAC,IAAI,GAAG,KAAK;;AAGvB;;;;;;;;;;;;;;;;AAgBG;IACI,KAAK,CAAC,KAAa,EAAE,aAAkC,EAAA;AAC5D,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;YACf;;AAEF,QAAA,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC;;AAG/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClB;;;;QAKF,IAAI,aAAa,EAAE;AACjB,YAAA,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AACzD,YAAA,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;;aAClC;AACL,YAAA,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;AAC1C,YAAA,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;;;QAI/D,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;;;;;;AAOtD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAC3C,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAC1C;;AAGD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAC7B,QAAA,IAAI,CAAC;aACF,aAAa,CAAC,QAAQ,CAAC,IAAkB,EAAE,QAAQ,CAAC,UAAU;AAC9D,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,OAAO,KAAI;;AAEhB,gBAAA,IAAI,OAAO,CAAC,KAAK,EAAE;oBACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;oBACxC;;;gBAIF,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;AACtC,gBAAA,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;;AAG5B,gBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;oBAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAO,CAAC,KAAK,CAAC,IAAI,CACrC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAC3C;AACD,oBAAA,aAAa,CAAC,SAAS,GAAG,IAAK,CAAC,SAAS;;;AAI3C,gBAAA,IAAI,CAAC,aAAa,CAChB,QAAQ,EACR,OAAO,CAAC,MAAO,EACf,aAAa,CAAC,SAAS,CACxB;;gBAGD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAc,CAAC,SAAS,CAAC;;gBAGpD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAClC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,aAAc,CAAC,SAAS,CAC1C;gBACD,IAAI,EAAE,EAAE;;oBAEN,UAAU,CAAC,MAAK;AACd,wBAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;qBACtB,EAAE,CAAC,CAAC;;;AAIP,gBAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,oBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;;aAEzB;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,gBAAA,IAAI,CAAC,eAAe,GAAG,SAAS;gBAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC;aACtD;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;aACrB;AACF,SAAA,CAAC;;AAGN;;;;AAIG;IACI,SAAS,GAAA;QACd,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;;aACvC;YACL,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,MAAM,GAAG,SAAS;;;IAIpB,UAAU,CAAC,KAAa,EAAE,aAAkC,EAAA;;AAEjE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClB;;;;QAKF,IAAI,aAAa,EAAE;AACjB,YAAA,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AACzD,YAAA,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;;aAClC;AACL,YAAA,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;AAC1C,YAAA,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;;AAE/D,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC;aACF,QAAQ,CAAC,QAAQ,CAAC,IAAkB,EAAE,QAAQ,CAAC,UAAU;AACzD,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,OAAO,KAAI;;AAEhB,gBAAA,IAAI,OAAO,CAAC,KAAK,EAAE;oBACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACxC,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;;qBACpB;oBACL,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;;aAEjC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,gBAAA,IAAI,CAAC,eAAe,GAAG,SAAS;gBAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC;aACtD;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;aACrB;AACF,SAAA,CAAC;;AAGN;;;;;AAKG;AACI,IAAA,kBAAkB,CAAC,SAA6B,EAAA;;QAErD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE;YAChD;;AAEF,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC;AAC3C,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;SACzB,EAAE,CAAC,CAAC;;;AAIC,IAAA,YAAY,CAAC,EAAwB,EAAA;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU;AAC/D,QAAA,IAAI,EAAE,IAAI,UAAU,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;;aAClD;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,gBAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;;iBACvC;AACL,gBAAA,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC;;;;AAKhD;;;;AAIG;AACI,IAAA,UAAU,CAAC,IAA+B,EAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE;YACxC;;;AAIF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;;QAGnC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CACzC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAClC;;;AAID,QAAA,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;;QAG7D,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;;;;;;AAOtD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAC3C,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAC1C;;AAGD,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;;QAGzD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;;QAG1C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC;QACrE,IAAI,EAAE,EAAE;;YAEN,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;aACtB,EAAE,CAAC,CAAC;;;AAIT;;;;AAIG;AACI,IAAA,aAAa,CAAC,KAAkC,EAAA;AACrD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB;;AAEF,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;QAEtB,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;AAChC,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM;YACvB,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE;gBAClC;;AAEF,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;YACzB,MAAM,EAAE,GAAa,EAAE;;YAEvB,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,IAAI,CAAG,CAAA,CAAA,CAAC;;AAE5B,YAAA,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;AACtB,gBAAA,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBACb,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;YAE5B,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE;AACjC,gBAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;AACZ,gBAAA,EAAE,CAAC,IAAI,CACL,MAAM,CAAC,IAAI,CAAC;AACT,qBAAA,GAAG,CAAC,CAAC,CAAU,KAAK,CAAA,EAAG,CAAC,CAAC,IAAI,CAAI,CAAA,EAAA,CAAC,CAAC,KAAK,EAAE;AAC1C,qBAAA,IAAI,CAAC,IAAI,CAAC,CACd;;;YAGH,EAAE,CAAC,IAAI,CACL,CAAA,GAAA,EAAM,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA;AACjD,gBAAA,CAAA,CAAA,EAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAC7D;YACD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7B,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,EAAE;;AAG9B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;AAG5B;;;;AAIG;AACI,IAAA,eAAe,CAAC,OAA2C,EAAA;QAChE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;;AAGzC;;;;AAIG;AACI,IAAA,iBAAiB,CAAC,SAAyC,EAAA;QAChE,IAAI,CAAC,SAAS,EAAE;YACd;;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;;AAGzC;;AAEG;IACI,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;;AAG5B;;;;;AAKG;AACI,IAAA,gBAAgB,CAAC,KAA2C,EAAA;QACjE,IAAI,CAAC,SAAS,GAAI,KAAK,CAAC,MAAkC,CAAC,QAAQ;;AAG9D,IAAA,WAAW,CAAC,YAA8B,EAAA;AAC/C,QAAA,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,YAAY,CAAC,YAAY;YAChC,MAAM,EAAE,YAAY,CAAC,aAAa;SACnC;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;YAC1B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;;AAE/B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;YAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACtC,YAAA,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE;AACzC,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;;;AAI3B,IAAA,oBAAoB,CAAC,KAAa,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC;;;IAIlC,gBAAgB,GAAA;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;;AAG1B;;AAEG;IACI,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;;QAEF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;;AAGrC,IAAA,oBAAoB,CAC1B,IAAc,EACd,UAAkB,EAClB,CAAS,EACT,CAAS,EAAA;AAET,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC9B,QAAA,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AAC3D,QAAA,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AAC7D,QAAA,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AACzD,QAAA,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AAE3D,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;AAC5C,YAAA,OAAO,IAAI;;QAGb,MAAM,UAAU,GAAmB,EAAE;AACrC,QAAA,IAAI,MAAM,IAAI,OAAO,EAAE;AACrB,YAAA,UAAU,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS;;;;;;AAOlD,QAAA,OAAO,UAAU;;AAGnB;;;;AAIG;IACK,WAAW,GAAA;AACjB,QAAA,MAAM,QAAQ,GAAa;AACzB,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AACvB,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AAC1B,aAAA;AACD,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS;AACpC,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS;;;YAGlC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnC,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS;AAC5C,YAAA,WAAW,EAAE;AACX,gBAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK;AAC7C,gBAAA,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS;AACjD,gBAAA,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK;AAC/C,gBAAA,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK;AACzC,gBAAA,MAAM,EAAE;AACN,oBAAA,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;AACrB,oBAAA,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;AACtB,iBAAA;AACF,aAAA;YACD,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtC,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,SAAS;SACzC;;AAGD,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YACxB,QAAQ,CAAC,WAAW,CAAC,aAAa,GAAG,IAAI,CAAC,oBAAoB;;;AAIhE,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACvB,QAAQ,CAAC,KAAK,GAAG;AACf,gBAAA,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;AACxB,gBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,SAAS;aAC9C;AACD,YAAA,IACE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACjB,IAAI,CAAC,MAAM,CAAC,KAAK;gBACjB,IAAI,CAAC,UAAU,CAAC,KAAK;AACrB,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EACtB;AACA,gBAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG;AACtB,oBAAA,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACpB,oBAAA,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACpB,oBAAA,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;AAC5B,oBAAA,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK;iBAC/B;;;;QAKL,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE;AAC/B,YAAA,QAAQ,CAAC,SAAS,GAAG,EAAE;YACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;gBACjC,QAAQ,CAAC,SAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,aAAC,CAAC;;aACG;AACL,YAAA,QAAQ,CAAC,SAAS,GAAG,SAAS;;AAGhC,QAAA,OAAO,QAAQ;;AAGjB;;;AAGG;IACI,IAAI,GAAA;QACT,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACtC;;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;;8GA9lC5B,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAkB,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAlB,IAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAK,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5HpC,w/hBAsgBA,EDraI,MAAA,EAAA,CAAA,ykDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,EACnB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,UAAA,EAAA,IAAA,EAAA,eAAe,0iBACf,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,iBAAiB,EACjB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,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,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,ydAClB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,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,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EACb,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,iYACd,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,eAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAiB,8BACjB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,6BAA6B,4PAC7B,wBAAwB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,qBAAqB,EACrB,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,MAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,wBAAwB,gIACxB,6BAA6B,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAE7B,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EADlB,cAAc,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAOL,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA9BnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EACtB,OAAA,EAAA;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,eAAe;wBACf,qBAAqB;wBACrB,iBAAiB;wBACjB,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,oBAAoB;wBACpB,eAAe;wBACf,iBAAiB;wBACjB,aAAa;wBACb,gBAAgB;wBAChB,6BAA6B;wBAC7B,wBAAwB;wBACxB,qBAAqB;wBACrB,wBAAwB;wBACxB,6BAA6B;wBAC7B,cAAc;wBACd,kBAAkB;qBACnB,EACQ,OAAA,EAAA,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,w/hBAAA,EAAA,MAAA,EAAA,CAAA,ykDAAA,CAAA,EAAA;6LAc1B,YAAY,EAAA,CAAA;sBADlB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;AErI9C;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-api.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/validators/svg-validators.ts","../../../../projects/myrmidon/gve-core/src/lib/services/settings.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-graphviz.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-view/chain-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-view/chain-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/ln-heights-editor/ln-heights-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/ln-heights-editor/ln-heights-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.html","../../../../projects/myrmidon/gve-core/src/public-api.ts","../../../../projects/myrmidon/gve-core/src/myrmidon-gve-core.ts"],"sourcesContent":["import {\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { GveAnimationTween, TweenType } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-animation-tween`\r\n *\r\n * A component to edit an animation tween.\r\n * Used by the `gve-animation-timeline` component.\r\n *\r\n * - ▶️ `tween` (`GveAnimationTween`): the tween to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - 🔥 `tweenChange` (`GveAnimationTween`): emitted when the tween is changed.\r\n * - 🔥 `tweenCancel` (`void`): emitted when the user cancels the edit.\r\n */\r\n@Component({\r\n selector: 'gve-animation-tween',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './animation-tween.component.html',\r\n styleUrl: './animation-tween.component.css',\r\n})\r\nexport class AnimationTweenComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n\r\n /**\r\n * The tween to edit.\r\n */\r\n public readonly tween = model<GveAnimationTween | undefined>();\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n public readonly elementIds = input<string[] | undefined>();\r\n\r\n /**\r\n * Emitted when the user cancels the edit.\r\n */\r\n public readonly tweenCancel = output();\r\n\r\n public readonly types = ['to', 'from', 'fromTo', 'set'];\r\n\r\n public label: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public type: FormControl<TweenType>;\r\n public selector: FormControl<string>;\r\n public vars: FormControl<string>;\r\n public vars2: FormControl<string | null>;\r\n public position: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public elementId: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.label = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.note = formBuilder.control(null);\r\n this.type = formBuilder.control('to', { nonNullable: true });\r\n this.selector = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(200)],\r\n });\r\n this.vars = formBuilder.control('{}', {\r\n nonNullable: true,\r\n validators: [Validators.required, this.jsonValidator],\r\n });\r\n this.vars2 = formBuilder.control(null, this.jsonValidator);\r\n this.position = formBuilder.control(null, Validators.maxLength(100));\r\n this.form = formBuilder.group({\r\n label: this.label,\r\n note: this.note,\r\n type: this.type,\r\n selector: this.selector,\r\n vars: this.vars,\r\n vars2: this.vars2,\r\n position: this.position,\r\n });\r\n\r\n this.elementId = formBuilder.control(null);\r\n\r\n effect(() => {\r\n this.updateForm(this.tween());\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // set selector when elementId changes\r\n this._sub = this.elementId.valueChanges\r\n .pipe(debounceTime(200), distinctUntilChanged())\r\n .subscribe((elementId) => {\r\n if (elementId) {\r\n this.selector.setValue('#' + elementId);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public onVarsChange(vars: string): void {\r\n this.vars.setValue(vars);\r\n this.vars.markAsDirty();\r\n this.vars.updateValueAndValidity();\r\n }\r\n\r\n public onVars2Change(vars: string): void {\r\n this.vars2.setValue(vars);\r\n this.vars2.markAsDirty();\r\n this.vars2.updateValueAndValidity();\r\n }\r\n\r\n public close(): void {\r\n this.tweenCancel.emit();\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(tween?: GveAnimationTween): void {\r\n if (!tween) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.label.setValue(tween.label);\r\n this.note.setValue(tween.note || null);\r\n this.type.setValue(tween.type);\r\n this.selector.setValue(tween.selector);\r\n this.vars.setValue(tween.vars || '{}');\r\n this.vars2.setValue(tween.vars2 || null);\r\n this.position.setValue(tween.position || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getTween(): GveAnimationTween {\r\n return {\r\n label: this.label.value,\r\n note: this.note.value?.trim() || undefined,\r\n type: this.type.value,\r\n selector: this.selector.value.trim(),\r\n vars: this.vars.value,\r\n vars2: this.vars2.value || undefined,\r\n position: this.position.value?.trim() || undefined,\r\n };\r\n }\r\n\r\n public openUrl(url: string): void {\r\n window.open(url, '_blank');\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this.tween.set(this.getTween());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n @if ($any(label).errors?.required && (label.dirty || label.touched)) {\r\n <mat-error>label required</mat-error>\r\n } @if ($any(label).errors?.maxLength && (label.dirty || label.touched)) {\r\n <mat-error>label too long</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n @for (t of types; track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- position -->\r\n <mat-form-field>\r\n <mat-label>position</mat-label>\r\n <input matInput [formControl]=\"position\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n [attr.aria-label]=\"'Information about position'\"\r\n (click)=\"\r\n openUrl(\r\n 'https://gsap.com/docs/v3/GSAP/Timeline/#positioning-animations-in-a-timeline'\r\n )\r\n \"\r\n >\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n <mat-hint>time label < > += -=</mat-hint>\r\n @if ( $any(position).errors?.maxLength && (position.dirty ||\r\n position.touched) ) {\r\n <mat-error>position too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- selector -->\r\n <mat-form-field>\r\n <mat-label>selector</mat-label>\r\n <input matInput [formControl]=\"selector\" />\r\n <mat-hint>CSS selector</mat-hint>\r\n @if ( $any(selector).errors?.required && (selector.dirty ||\r\n selector.touched) ) {\r\n <mat-error>selector required</mat-error>\r\n } @if ( $any(selector).errors?.maxLength && (selector.dirty ||\r\n selector.touched) ) {\r\n <mat-error>selector too long</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- element id -->\r\n @if ((elementIds())?.length) {\r\n <mat-form-field>\r\n <mat-label>element ID</mat-label>\r\n <mat-select [formControl]=\"elementId\">\r\n @for (id of elementIds(); track id) {\r\n <mat-option [value]=\"id\">{{ id }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n <mat-error>note too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n @if ($any(vars).errors?.required && (vars.dirty || vars.touched)) {\r\n <mat-error>vars required</mat-error>\r\n } @if ($any(vars).errors?.json && (vars.dirty || vars.touched)) {\r\n <mat-error>invalid JSON</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 'fromTo') {\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>2nd vars</mat-label>\r\n <textarea matInput [formControl]=\"vars2\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n @if ($any(vars2).errors?.required && (vars2.dirty || vars2.touched)) {\r\n <mat-error>vars required</mat-error>\r\n } @if ($any(vars2).errors?.json && (vars2.dirty || vars2.touched)) {\r\n <mat-error>invalid JSON</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close tween\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-icon-button\r\n matTooltip=\"Save tween\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, model, output, signal } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { deepCopy, NgxToolsValidators } from '@myrmidon/ngx-tools';\r\nimport {\r\n GveAnimationTimeline,\r\n GveAnimationTween,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTweenComponent } from '../animation-tween/animation-tween.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline`\r\n *\r\n * A component to edit an animation timeline.\r\n * Used by the `gve-animation-timeline-set` component.\r\n *\r\n * - ▶️ `timeline` (`GveAnimationTimeline`): the animation timeline to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected\r\n * by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelineChange` (`GveAnimationTimeline`): emitted when the timeline\r\n * is changed.\r\n * - 🔥 `timelineCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n AnimationTweenComponent\r\n],\r\n templateUrl: './animation-timeline.component.html',\r\n styleUrl: './animation-timeline.component.css',\r\n})\r\nexport class AnimationTimelineComponent {\r\n /**\r\n * The animation timeline to edit.\r\n */\r\n public readonly timeline = model<GveAnimationTimeline | undefined>();\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n public readonly elementIds = input<string[] | undefined>();\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n public readonly tags = input<string[]>([]);\r\n\r\n /**\r\n * Emitted when the timeline is changed.\r\n */\r\n public readonly timelineChange = output<GveAnimationTimeline>();\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n public readonly timelineCancel = output();\r\n\r\n public readonly editedTweenIndex = signal<number>(-1);\r\n public readonly editedTween = signal<GveAnimationTween | undefined>(undefined);\r\n\r\n public tag: FormControl<string>;\r\n public tweens: FormControl<GveAnimationTween[]>;\r\n public vars: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.tag = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.tweens = formBuilder.control([], {\r\n nonNullable: true,\r\n validators: NgxToolsValidators.strictMinLengthValidator(1),\r\n });\r\n this.vars = formBuilder.control(null, this.jsonValidator);\r\n\r\n this.form = formBuilder.group({\r\n tag: this.tag,\r\n tweens: this.tweens,\r\n vars: this.vars,\r\n });\r\n\r\n // when the timeline changes, update the form\r\n effect(() => {\r\n this.updateForm(this.timeline());\r\n });\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(timeline?: GveAnimationTimeline) {\r\n if (!timeline) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.tag.setValue(timeline.tag);\r\n this.tweens.setValue(timeline.tweens);\r\n this.vars.setValue(timeline.vars || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public addTween(): void {\r\n this.editedTweenIndex.set(-1);\r\n this.editedTween.set({\r\n label: 'tween #' + (this.tweens.value.length + 1),\r\n type: 'to',\r\n selector: '',\r\n });\r\n }\r\n\r\n public editTween(index: number): void {\r\n this.editedTweenIndex.set(index);\r\n this.editedTween.set(deepCopy(this.tweens.value[index]));\r\n }\r\n\r\n public deleteTween(index: number): void {\r\n this.tweens.setValue(this.tweens.value.filter((_, i) => i !== index));\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public closeTween(): void {\r\n this.editedTween.set(undefined);\r\n this.editedTweenIndex.set(-1);\r\n }\r\n\r\n public saveTween(tween?: GveAnimationTween): void {\r\n if (this.editedTweenIndex() === -1) {\r\n this.tweens.setValue([...this.tweens.value, tween!]);\r\n } else {\r\n this.tweens.setValue(\r\n this.tweens.value.map((t, index) =>\r\n index === this.editedTweenIndex() ? tween! : t\r\n )\r\n );\r\n }\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n this.closeTween();\r\n }\r\n\r\n public moveTweenUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index - 1];\r\n tweens[index - 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public moveTweenDown(index: number): void {\r\n if (index >= this.tweens.value.length - 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index + 1];\r\n tweens[index + 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n private getTimeline(): GveAnimationTimeline {\r\n return {\r\n tag: this.tag.value || '',\r\n tweens: this.tweens.value,\r\n vars: this.vars.value || undefined,\r\n };\r\n }\r\n\r\n public close(): void {\r\n this.timelineCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.timeline.set(this.getTimeline());\r\n this.timelineChange.emit(this.timeline()!);\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\r\n @if (tags().length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(tag).errors?.required && (tag.dirty || tag.touched)) {\r\n <mat-error>tag required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n @if ($any(tag).errors?.required && (tag.dirty || tag.touched)) {\r\n <mat-error>tag required</mat-error>\r\n } @if ($any(tag).errors?.maxLength && (tag.dirty || tag.touched)) {\r\n <mat-error>tag too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n @if ($any(vars).errors?.json && (vars.dirty || vars.touched)) {\r\n <mat-error>invalid JSON</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- tweens -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr [class.selected]=\"index === editedTweenIndex()\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- tween editor -->\r\n @if (editedTween()) {\r\n <mat-expansion-panel [expanded]=\"editedTween()\" [disabled]=\"!editedTween()\">\r\n @if (editedTween()) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween #{{ editedTweenIndex() + 1 }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds()\"\r\n [tween]=\"editedTween()\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (tweenCancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close timeline\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save timeline\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, input, model, output, signal } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { deepCopy } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { GveAnimationTimeline } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTimelineComponent } from '../animation-timeline/animation-timeline.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline-set`\r\n *\r\n * A component to edit a set of animation timelines.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `timelines` (`GveAnimationTimeline[]`): the animation timelines to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelinesChange` (`GveAnimationTimeline[]`): emitted when the timelines are changed.\r\n * - 🔥 `timelinesCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline-set',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n AnimationTimelineComponent,\r\n ],\r\n templateUrl: './animation-timeline-set.component.html',\r\n styleUrl: './animation-timeline-set.component.css',\r\n})\r\nexport class AnimationTimelineSetComponent {\r\n /**\r\n * The animation timelines to edit.\r\n */\r\n public readonly timelines = model<GveAnimationTimeline[]>([]);\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n public readonly elementIds = input<string[] | undefined>();\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n public readonly tags = input<string[]>([]);\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n public readonly timelinesCancel = output();\r\n\r\n public readonly editedTimeline = signal<GveAnimationTimeline | undefined>(\r\n undefined\r\n );\r\n public readonly editedIndex = signal<number>(-1);\r\n\r\n constructor(private _dialogService: DialogService) {}\r\n\r\n public closeTimeline(): void {\r\n this.editedTimeline.set(undefined);\r\n this.editedIndex.set(-1);\r\n }\r\n\r\n public newTimeline(): void {\r\n this.editedTimeline.set({\r\n tag: '',\r\n tweens: [],\r\n });\r\n this.editedIndex.set(-1);\r\n }\r\n\r\n public editTimeline(index: number): void {\r\n this.editedTimeline.set(deepCopy(this.timelines()[index]));\r\n this.editedIndex.set(index);\r\n }\r\n\r\n public onTimelineChange(timeline: GveAnimationTimeline): void {\r\n const timelines = [...this.timelines()];\r\n if (this.editedIndex() === -1) {\r\n timelines.push(timeline);\r\n } else {\r\n timelines.splice(this.editedIndex(), 1, timeline);\r\n }\r\n\r\n // sort timelines by tag\r\n timelines.sort((a, b) => a.tag.localeCompare(b.tag));\r\n this.timelines.set(timelines);\r\n\r\n this.closeTimeline();\r\n }\r\n\r\n public deleteTimeline(index: number): void {\r\n this._dialogService\r\n .confirm('Confirm Deletion', `Delete ${this.timelines()[index].tag}?`)\r\n .subscribe((yes) => {\r\n if (yes) {\r\n const timelines = [...this.timelines()];\r\n timelines.splice(index, 1);\r\n this.timelines.set(timelines);\r\n }\r\n });\r\n }\r\n}\r\n","<div>\r\n <!-- add -->\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n (click)=\"newTimeline()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tag</th>\r\n <th>tweens</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of timelines(); track t.tag; let index = $index) {\r\n <tr [class.selected]=\"editedIndex() === index\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button type=\"button\" mat-icon-button (click)=\"editTimeline(index)\">\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button type=\"button\" mat-icon-button (click)=\"deleteTimeline(index)\">\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ t.tag }}</td>\r\n <td>{{ t.tweens.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- editor -->\r\n @if (editedTimeline()) {\r\n <mat-expansion-panel [disabled]=\"!editedTimeline\" [expanded]=\"editedTimeline\">\r\n <mat-expansion-panel-header>\r\n timeline {{ editedTimeline()?.tag }}\r\n </mat-expansion-panel-header>\r\n <gve-animation-timeline\r\n [elementIds]=\"elementIds()\"\r\n [tags]=\"tags()\"\r\n [timeline]=\"editedTimeline()\"\r\n (timelineChange)=\"onTimelineChange($event!)\"\r\n (timelineCancel)=\"closeTimeline()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n</div>\r\n","import { Component, input, output } from '@angular/core';\r\nimport { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { ColorToContrastPipe } from '@myrmidon/ngx-tools';\r\n\r\n/**\r\n * A single character from a base text.\r\n */\r\nexport interface BaseTextChar {\r\n id: number;\r\n value: string;\r\n label: string;\r\n color: string;\r\n oldColor?: string;\r\n borderColor: string;\r\n oldBorderColor?: string;\r\n emSize: number;\r\n}\r\n\r\n/**\r\n * Event emitted by the base text character component when a character\r\n * is clicked.\r\n */\r\nexport interface BaseTextCharEvent {\r\n char: BaseTextChar;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-char`\r\n *\r\n * A component that displays a single character from a base text.\r\n * Used by `gve-base-text-view`.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-char',\r\n imports: [MatRippleModule, ColorToContrastPipe],\r\n templateUrl: './base-text-char.component.html',\r\n styleUrl: './base-text-char.component.css',\r\n})\r\nexport class BaseTextCharComponent {\r\n /**\r\n * The character to display.\r\n */\r\n public readonly char = input<BaseTextChar | undefined>();\r\n\r\n /**\r\n * Emitted when the character is clicked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n public readonly defaultColor = '#D8D8D8';\r\n public readonly defaultBorderColor = '#D8D8D8';\r\n public readonly defaultEmSize = 1.5;\r\n\r\n public onCharClick(event: MouseEvent): void {\r\n this.charPick.emit({ char: this.char()!, event });\r\n }\r\n}\r\n","@if (char()) {\r\n<div matRipple id=\"container\" (click)=\"onCharClick($event)\">\r\n <div\r\n id=\"c-label\"\r\n [style.fontSize]=\"char()!.emSize + 'em'\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n >\r\n {{ char()!.label }}\r\n </div>\r\n <div\r\n id=\"c-id\"\r\n [style.fontSize]=\"char()!.emSize / 2 + 'em'\"\r\n [style.color]=\"char()!.color | colorToContrast\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n [style.backgroundColor]=\"char()!.color\"\r\n >\r\n {{ char()!.id }}\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { CharNode } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n BaseTextChar,\r\n BaseTextCharComponent,\r\n BaseTextCharEvent,\r\n} from '../base-text-char/base-text-char.component';\r\n\r\n/**\r\n * A range in the base text.\r\n */\r\nexport interface VarBaseTextRange {\r\n at: number;\r\n run: number;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-view`\r\n *\r\n * A component to display a selectable base text. Its input is either a string or an\r\n * array of `CharNode`'s.\r\n * Used by the chain result view component and the base text editor component.\r\n *\r\n * - ▶️ `defaultColor` (`string`): the default color for the text.\r\n * - ▶️ `colorCallback` (callback): an optional callback to get the color of a\r\n * character node.\r\n * - ▶️ `defaultBorderColor` (`string`): the default border color for the text.\r\n * - ▶️ `borderColorCallback` (callback): an optional callback to get the border color\r\n * of a character node.\r\n * - ▶️ `selectionColor` (`string`): the color for the selected text.\r\n * - ▶️ `hasLineNumber` (`boolean`): true if line numbers should be displayed next\r\n * to each line.\r\n * - ▶️ `text` (`string` | `CharNode[]`): the text to display.\r\n * - 🔥 `charPick` (`BaseTextCharEvent`): emitted when a character is picked.\r\n * - 🔥 `rangePick` (`VarBaseTextRange`): emitted when a range is picked.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-view',\r\n imports: [BaseTextCharComponent],\r\n templateUrl: './base-text-view.component.html',\r\n styleUrl: './base-text-view.component.css',\r\n})\r\nexport class BaseTextViewComponent {\r\n private _lastSelectedPosition?: number;\r\n\r\n /**\r\n * The default color for the text.\r\n */\r\n public readonly defaultColor = input('#DBDBDB');\r\n\r\n /**\r\n * The default border color for the text.\r\n */\r\n public readonly defaultBorderColor = input('#DBDBDB');\r\n\r\n /**\r\n * The color for the selected text.\r\n */\r\n public readonly selectionColor = input('#3E92CC');\r\n\r\n /**\r\n * True if line numbers should be displayed next to each line.\r\n */\r\n public readonly hasLineNumber = input(false);\r\n\r\n /**\r\n * The text to display.\r\n */\r\n public readonly text = input<CharNode[]>([]);\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly colorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly borderColorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * Emitted when a character is picked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n /**\r\n * Emitted when a range is picked. This is preceded by a character pick event.\r\n * The range is defined by the starting character and the number of characters.\r\n * The range is inclusive.\r\n */\r\n public readonly rangePick = output<VarBaseTextRange>();\r\n\r\n /**\r\n * The base characters organized by lines, computed from text input.\r\n */\r\n private readonly baseLines = computed(() => {\r\n return this.buildLines(\r\n this.text(),\r\n this.colorCallback(),\r\n this.borderColorCallback()\r\n );\r\n });\r\n\r\n /**\r\n * Signal for tracking selected range state.\r\n */\r\n private readonly selectedRange = signal<{\r\n start: number;\r\n end: number;\r\n } | null>(null);\r\n\r\n /**\r\n * The lines with selection state applied, computed from base lines and selection.\r\n */\r\n public readonly lines = computed(() => {\r\n const base = this.baseLines();\r\n const range = this.selectedRange();\r\n\r\n if (!range) {\r\n return base;\r\n }\r\n\r\n const { start, end } = range;\r\n let position = 0;\r\n\r\n return base.map((line) =>\r\n line.map((char) => {\r\n const currentPos = position++;\r\n if (currentPos >= start && currentPos <= end) {\r\n return {\r\n ...char,\r\n oldColor: char.oldColor || char.color,\r\n oldBorderColor: char.oldBorderColor || char.borderColor,\r\n color: this.selectionColor(),\r\n borderColor: this.selectionColor(),\r\n };\r\n }\r\n return char;\r\n })\r\n );\r\n });\r\n\r\n constructor() {\r\n // reset selection when text changes\r\n effect(() => {\r\n this.text();\r\n this._lastSelectedPosition = undefined;\r\n this.selectedRange.set(null);\r\n });\r\n }\r\n\r\n private buildLines(\r\n text: CharNode[],\r\n colorCallback?: (node: CharNode) => string | null,\r\n borderColorCallback?: (node: CharNode) => string | null\r\n ): BaseTextChar[][] {\r\n if (!text || text.length === 0) {\r\n return [];\r\n }\r\n\r\n const newLines: BaseTextChar[][] = [];\r\n newLines.push([]);\r\n\r\n const nodes = text as CharNode[];\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const char: BaseTextChar = {\r\n id: nodes[i].id,\r\n value: nodes[i].data,\r\n label: nodes[i].label,\r\n color: colorCallback\r\n ? colorCallback(nodes[i]) || this.defaultColor()\r\n : this.defaultColor(),\r\n borderColor: borderColorCallback\r\n ? borderColorCallback(nodes[i]) || this.defaultBorderColor()\r\n : this.defaultBorderColor(),\r\n emSize: 1.5,\r\n };\r\n char.oldColor = char.color;\r\n char.oldBorderColor = char.borderColor;\r\n\r\n newLines[newLines.length - 1].push(char);\r\n\r\n if (char.value === '\\n') {\r\n newLines.push([]);\r\n }\r\n }\r\n\r\n return newLines;\r\n }\r\n\r\n public onCharPick(event: BaseTextCharEvent): void {\r\n // guard against null/undefined event.char\r\n if (!event?.char) {\r\n return;\r\n }\r\n\r\n // find the position of the clicked character in the flat array\r\n const clickedPosition = this.findCharPosition(event.char.id);\r\n if (clickedPosition === -1) {\r\n return; // character not found\r\n }\r\n\r\n // calculate selection state\r\n const isRangeSelection =\r\n this._lastSelectedPosition !== undefined &&\r\n this._lastSelectedPosition !== clickedPosition &&\r\n event.event?.ctrlKey;\r\n\r\n let rangeToEmit: VarBaseTextRange;\r\n\r\n if (isRangeSelection && this._lastSelectedPosition !== undefined) {\r\n // range selection: use positions, not IDs\r\n const minPos = Math.min(this._lastSelectedPosition, clickedPosition);\r\n const maxPos = Math.max(this._lastSelectedPosition, clickedPosition);\r\n\r\n // update selection range\r\n this.selectedRange.set({ start: minPos, end: maxPos });\r\n\r\n // emit range based on the first character's ID at minPos and the count\r\n const firstCharId = this.getCharIdAtPosition(minPos);\r\n rangeToEmit = { at: firstCharId, run: maxPos - minPos + 1 };\r\n } else {\r\n // single character selection\r\n this.selectedRange.set({ start: clickedPosition, end: clickedPosition });\r\n\r\n // update last selected character and position\r\n this._lastSelectedPosition = clickedPosition;\r\n\r\n rangeToEmit = { at: event.char.id, run: 1 };\r\n }\r\n\r\n // emit events last, after all internal state is updated\r\n this.charPick.emit(event);\r\n this.rangePick.emit(rangeToEmit);\r\n }\r\n\r\n /**\r\n * Find the position (index in flat array) of a character by its ID.\r\n * Returns -1 if not found.\r\n */\r\n private findCharPosition(charId: number): number {\r\n const baseLines = this.baseLines();\r\n let position = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (char.id === charId) {\r\n return position;\r\n }\r\n position++;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * Get the character ID at a specific position in the flat array.\r\n * Returns the ID or -1 if position is out of bounds.\r\n */\r\n private getCharIdAtPosition(position: number): number {\r\n const baseLines = this.baseLines();\r\n let currentPos = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (currentPos === position) {\r\n return char.id;\r\n }\r\n currentPos++;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n}\r\n","<div id=\"text\">\r\n @for (line of lines(); track $index) {\r\n <div class=\"line\">\r\n @if (hasLineNumber()) {\r\n <div class=\"nr\">\r\n {{ lines().indexOf(line) + 1 }}\r\n </div>\r\n } @for (c of line; track c.id) {\r\n <gve-base-text-char [char]=\"c\" (charPick)=\"onCharPick($event)\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n Component,\r\n effect,\r\n ElementRef,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\n// material\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport {\r\n Feature,\r\n FeatureSetPolicy,\r\n LabeledId,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * Features map. This is used for features from closed sets,\r\n * and lists the possible values for each feature.\r\n * The key is the feature name, and the value is an array of\r\n * labeled IDs representing the allowed values for that feature.\r\n */\r\nexport interface FeatureMap {\r\n [key: string]: LabeledId[];\r\n}\r\n\r\n/**\r\n * 🔑 `gve-feature-editor`\r\n *\r\n * Component for editing a single feature, whose model is a name=value\r\n * pair, plus a set policy value which defines the desired behavior\r\n * when adding that feature to a set.\r\n * Used by `gve-feature-set-editor`.\r\n *\r\n * - ▶️ `feature` (`Feature`): the feature to edit.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of\r\n * features. Each item in the list is an object with _id_ and _label_\r\n * properties.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When\r\n * specified and the user selects a feature name present in the map keys,\r\n * the corresponding values will be used to populate the value selection.\r\n * - 🔥 `featureChange` (`Feature`): emitted when feature has changed.\r\n * - 🔥 `featureCancel`: emitted when the user cancels the feature editing.\r\n */\r\n@Component({\r\n selector: 'gve-feature-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './feature-editor.component.html',\r\n styleUrl: './feature-editor.component.css',\r\n})\r\nexport class FeatureEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private _frozen?: boolean;\r\n\r\n @ViewChild('nameCtl') nameControl?: ElementRef;\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The feature to edit.\r\n */\r\n public readonly feature = model<Feature | OperationFeature | undefined>();\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(false);\r\n\r\n /**\r\n * Event emitted when the user cancels the feature editing.\r\n */\r\n public readonly featureCancel = output();\r\n\r\n public readonly nameIds = signal<LabeledId[] | undefined>(undefined);\r\n\r\n public name: FormControl<string>;\r\n public value: FormControl<string>;\r\n public setPolicy: FormControl<FeatureSetPolicy>;\r\n // var feature controls\r\n public isNegated: FormControl<boolean>;\r\n public isGlobal: FormControl<boolean>;\r\n public isShortLived: FormControl<boolean>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.name = formBuilder.control<string>('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.value = formBuilder.control('', {\r\n validators: [Validators.maxLength(5000)],\r\n nonNullable: true,\r\n });\r\n this.setPolicy = formBuilder.control(FeatureSetPolicy.multiple, {\r\n nonNullable: true,\r\n });\r\n this.isNegated = formBuilder.control(false, { nonNullable: true });\r\n this.isGlobal = formBuilder.control(false, { nonNullable: true });\r\n this.isShortLived = formBuilder.control(false, { nonNullable: true });\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n value: this.value,\r\n setPolicy: this.setPolicy,\r\n isNegated: this.isNegated,\r\n isGlobal: this.isGlobal,\r\n isShortLived: this.isShortLived,\r\n });\r\n\r\n // when feature changes, update the form\r\n effect(() => {\r\n this.updateForm(this.feature());\r\n setTimeout(() => {\r\n this.nameControl?.nativeElement?.focus();\r\n this.nameIds.set(\r\n this.getLabeledIdsFor(this.name.value, this.featValues())\r\n );\r\n }, 500);\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever the name changes, update the value selection\r\n this._sub = this.name.valueChanges\r\n .pipe(debounceTime(300), distinctUntilChanged())\r\n .subscribe((name) => {\r\n if (!this._frozen && this.featNames()?.length) {\r\n this.value.reset();\r\n this.nameIds.set(this.getLabeledIdsFor(name, this.featValues()));\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(\r\n id?: string,\r\n featValues?: FeatureMap\r\n ): LabeledId[] | undefined {\r\n if (!id) {\r\n return undefined;\r\n }\r\n console.log('getLabeledIdsFor', id, featValues);\r\n return featValues ? featValues![id] : undefined;\r\n }\r\n\r\n private updateForm(feature?: OperationFeature): void {\r\n if (!feature) {\r\n this.form.reset();\r\n } else {\r\n this._frozen = true;\r\n this.name.setValue(feature.name);\r\n this.value.setValue(feature.value);\r\n this.setPolicy.setValue(feature.setPolicy || FeatureSetPolicy.multiple);\r\n this.isNegated.setValue(feature.isNegated || false);\r\n this.isGlobal.setValue(feature.isGlobal || false);\r\n this.isShortLived.setValue(feature.isShortLived || false);\r\n this._frozen = false;\r\n }\r\n }\r\n\r\n public cancel(): void {\r\n this.featureCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this.feature.set(\r\n this.isVar()\r\n ? {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n isNegated: this.isNegated.value,\r\n isGlobal: this.isGlobal.value,\r\n isShortLived: this.isShortLived.value,\r\n }\r\n : {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n }\r\n );\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n @if (featNames()?.length) {\r\n <!-- name (bound) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <mat-select #nameCtl [formControl]=\"name\">\r\n @for (i of featNames(); track i) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- name (free) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input #nameCtl matInput [formControl]=\"name\" />\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n } @if ($any(name).errors?.maxLength && (name.dirty || name.touched)) {\r\n <mat-error>name too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- value (bound) -->\r\n @if (nameIds()?.length) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <mat-select [formControl]=\"value\">\r\n @for (e of nameIds(); track e) {\r\n <mat-option [value]=\"e.id\">{{ e.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- value (free) -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n } @if ($any(value).errors?.maxLength && (value.dirty || value.touched)) {\r\n <mat-error>value too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- setPolicy -->\r\n <mat-form-field>\r\n <mat-label>set policy</mat-label>\r\n <mat-select [formControl]=\"setPolicy\">\r\n <mat-option [value]=\"0\">multiple</mat-option>\r\n <mat-option [value]=\"1\">single</mat-option>\r\n <mat-option [value]=\"2\">single first</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n @if (isVar()) {\r\n <div class=\"form-row\">\r\n <!-- isNegated -->\r\n <mat-checkbox [formControl]=\"isNegated\">negated</mat-checkbox>\r\n\r\n <!-- isShortLived -->\r\n <mat-checkbox [formControl]=\"isShortLived\">short-lived</mat-checkbox>\r\n\r\n <!-- isGlobal -->\r\n <mat-checkbox [formControl]=\"isGlobal\">global</mat-checkbox>\r\n </div>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import {\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { deepCopy, FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n FeatureSetPolicy,\r\n LabeledId,\r\n Feature,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n FeatureEditorComponent,\r\n FeatureMap,\r\n} from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-editor`\r\n *\r\n * Component for editing a set of features. It shows a list of features,\r\n * allowing to edit each of them or adding new ones. Optionally you can\r\n * specify a list of feature names and values to use in the selection.\r\n * Used by base text editor and chain operation editor components.\r\n *\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is equal to or greater than the threshold. Default is 5.\r\n * - ▶️ `features` (`Feature[]`): the features to edit.\r\n * - ▶️ `isVar`: true if the feature is a variant operation feature, which\r\n * has additional properties like negation, global, and short-lived.\r\n * - 🔥 `featuresChange` (`Feature[]`): emitted when features have changed.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n FlatLookupPipe,\r\n FeatureEditorComponent,\r\n ],\r\n templateUrl: './feature-set-editor.component.html',\r\n styleUrl: './feature-set-editor.component.css',\r\n})\r\nexport class FeatureSetEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n\r\n public readonly POLICIES = ['M', 'S', 'SF'];\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(true);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than or equal to the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n /**\r\n * The features to edit.\r\n */\r\n public readonly features = model<Feature[] | OperationFeature[]>([]);\r\n\r\n public readonly editedFeature = signal<\r\n Feature | OperationFeature | undefined\r\n >(undefined);\r\n public readonly editedFeatureIndex = signal<number>(-1);\r\n public filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control<string | null>(null);\r\n\r\n // when features change, apply the filter\r\n effect(() => {\r\n this.applyFeatureFilter(this.features(), this.filter.value);\r\n });\r\n }\r\n\r\n private applyFeatureFilter(\r\n features: Feature[] | OperationFeature[],\r\n name?: string | null\r\n ): void {\r\n this.filteredFeatures.set(\r\n features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n }) || []\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n // when the filter changes, apply the filter\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(this.features(), value);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public addFeature(): void {\r\n this.editedFeature.set({\r\n name: '',\r\n value: '',\r\n setPolicy: FeatureSetPolicy.multiple,\r\n });\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n\r\n public editFeature(feature: Feature | OperationFeature): void {\r\n this.editedFeature.set(deepCopy(feature));\r\n this.editedFeatureIndex.set(this.features().indexOf(feature));\r\n }\r\n\r\n public deleteFeature(feature: Feature | OperationFeature): void {\r\n const index = this.features().indexOf(feature);\r\n if (index < 0) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n features.splice(index, 1);\r\n this.features.set(features);\r\n }\r\n\r\n public onFeatureChange(feature?: Feature | OperationFeature): void {\r\n if (!feature) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n\r\n for (let i = features.length - 1; i >= 0; i--) {\r\n if (features[i].name === feature.name) {\r\n if (\r\n feature.setPolicy === FeatureSetPolicy.single ||\r\n features[i].setPolicy === FeatureSetPolicy.single\r\n ) {\r\n features.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n if (this.editedFeatureIndex() === -1) {\r\n features.push(feature);\r\n } else {\r\n features.splice(this.editedFeatureIndex(), 1, feature);\r\n }\r\n\r\n this.onFeatureCancel();\r\n this.features.set(features);\r\n }\r\n\r\n public onFeatureCancel(): void {\r\n this.editedFeature.set(undefined);\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n}\r\n","<div>\r\n <div class=\"form-row\">\r\n <!-- filter -->\r\n @if (filterThreshold() === 0 || features().length >= filterThreshold()) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"filter\" [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- add feature button -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Add a new feature\"\r\n (click)=\"addFeature()\"\r\n [class.in-row-button]=\"\r\n filterThreshold() === 0 || features()!.length >= filterThreshold()\r\n \"\r\n >\r\n <mat-icon>add</mat-icon>\r\n feature\r\n </button>\r\n </div>\r\n\r\n <!-- list -->\r\n @if (features().length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>feature</th>\r\n <th>value</th>\r\n <th>policy</th>\r\n @if (isVar()) {\r\n <th>flags</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track feature; let i = $index) {\r\n <tr [class.selected]=\"i === editedFeatureIndex()\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Edit this feature\"\r\n (click)=\"editFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Delete this feature\"\r\n (click)=\"deleteFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @if (featNames()?.length) {\r\n <span>{{\r\n feature.name | flatLookup : featNames : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </td>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup : featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n <td>\r\n <span>{{ POLICIES[feature.setPolicy] }}</span>\r\n </td>\r\n @if (isVar()) {\r\n <td>\r\n @if ($any(feature).isNegated) {\r\n <span class=\"icon\" matTooltip=\"Negated: remove if present\">\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </span>\r\n } @if ($any(feature).isGlobal) {\r\n <span class=\"icon\" matTooltip=\"Global: apply to whole output\">\r\n <mat-icon class=\"mat-primary\">public</mat-icon>\r\n </span>\r\n } @if ($any(feature).isShortLived) {\r\n <span class=\"icon\" matTooltip=\"Short-lived: removed on next operation\">\r\n <mat-icon class=\"mat-accent\">timer</mat-icon>\r\n </span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- editor -->\r\n @if (editedFeature()) {\r\n <mat-expansion-panel\r\n [disabled]=\"!editedFeature()\"\r\n [expanded]=\"editedFeature()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <span>{{ editedFeature()?.name || \"feature\" }}</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-feature-editor\r\n [isVar]=\"isVar()\"\r\n [featNames]=\"featNames()\"\r\n [featValues]=\"featValues()\"\r\n [feature]=\"editedFeature()\"\r\n (featureChange)=\"onFeatureChange($event)\"\r\n (featureCancel)=\"onFeatureCancel()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n</div>\r\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport {\r\n CharNode,\r\n Feature,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-base-text-editor`\r\n *\r\n * Editor for snapshot's base text. This can receive a string or an array\r\n * of `CharNode` objects, and lets the user edit the text, character by\r\n * character, optionally also setting its features.\r\n *\r\n * Used by the `gve-snapshot-editor` component.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n BaseTextViewComponent,\r\n FeatureSetEditorComponent,\r\n ],\r\n templateUrl: './base-text-editor.component.html',\r\n styleUrl: './base-text-editor.component.css',\r\n})\r\nexport class BaseTextEditorComponent {\r\n /**\r\n * The text to edit. In input this can be a string, an array of `CharNode`\r\n * objects, or undefined. In output this will be an array of `CharNode`\r\n * objects.\r\n */\r\n public readonly text = input.required({\r\n transform: (value: CharNode[] | string | undefined) => {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n return SnapshotViewService.stringToBaseChars(value);\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n /**\r\n * Emitted for the edited text as an array of `CharNode`'s whenever it changes.\r\n */\r\n public readonly textChange = output<CharNode[]>();\r\n\r\n public readonly selectedChar = signal<CharNode | undefined>(undefined);\r\n public readonly selectedCharLabel = signal<string | undefined>(undefined);\r\n public readonly textRange = signal<VarBaseTextRange | undefined>(undefined);\r\n\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder, private _dialogService: DialogService) {\r\n this.userText = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(10000)],\r\n });\r\n this.form = formBuilder.group({\r\n userText: this.userText,\r\n });\r\n\r\n effect(() => {\r\n this.resetSelectedChar();\r\n if (!this.text()) {\r\n this.userText.reset();\r\n } else {\r\n this.userText.setValue(\r\n this.text()!\r\n .map((c) => c.data)\r\n .join('')\r\n );\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n private resetSelectedChar(): void {\r\n this.selectedChar.set(undefined);\r\n this.selectedCharLabel.set(undefined);\r\n }\r\n\r\n public onSelectedChar(event: BaseTextCharEvent): void {\r\n this.selectedChar.set(this.text()!.find((c) => c.id === event.char.id));\r\n this.selectedCharLabel.set(event.char.label);\r\n }\r\n\r\n public onFeaturesChange(features: Feature[]): void {\r\n const char = this.selectedChar();\r\n if (!char) {\r\n return;\r\n }\r\n const chars = this.text()!.map((c) =>\r\n c.id === char.id ? { ...c, features } : c\r\n );\r\n this.selectedChar.set({ ...char, features });\r\n this.textChange.emit(chars);\r\n }\r\n\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange.set(range);\r\n }\r\n\r\n public patchTextFromUser(): void {\r\n // TODO\r\n }\r\n\r\n public setTextFromUser(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Reset text?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.textChange.emit(\r\n SnapshotViewService.stringToBaseChars(this.userText.value)\r\n );\r\n }\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n @if ( $any(userText).errors?.required && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text required</mat-error>\r\n } @if ( $any(userText).errors?.maxLength && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\r\n </button> -->\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text() || []\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange.set($event)\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange()) {\r\n <div id=\"text-range\">{{ textRange()!.at }} × {{ textRange()!.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar()) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar()!.features || []\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { Observable, catchError } from 'rxjs';\r\n\r\nimport { ErrorService, EnvService } from '@myrmidon/ngx-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharNode,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { ResultWrapper } from '../models';\r\n\r\n/**\r\n * Execution step of a char-based chain operation.\r\n */\r\nexport interface ChainOperationContextStep {\r\n /**\r\n * The operation that was executed.\r\n */\r\n operation: CharChainOperation;\r\n /**\r\n * The input version tag.\r\n */\r\n inputTag: string;\r\n /**\r\n * The output version tag.\r\n */\r\n outputTag: string;\r\n /**\r\n * The string synthetically representing the resulting text\r\n * version.\r\n */\r\n result?: string;\r\n /**\r\n * The features emitted up to the executed operation.\r\n * These are the features of the text as a whole, and\r\n * those belonging to specific nodes, each keyed under\r\n * a string built with `v` + output version tag + `_`\r\n * + node ID (e.g. `v1_2` for node with ID 2 at version 1).\r\n */\r\n featureSet: {\r\n features: OperationFeature[];\r\n nodeFeatures: Record<string, OperationFeature[]>;\r\n };\r\n /**\r\n * The reference node IDs of the operation which was\r\n * executed.\r\n */\r\n refNodeIds: number[];\r\n}\r\n\r\n/**\r\n * Result of execution of a char-based chain.\r\n */\r\nexport interface CharChainResult {\r\n /**\r\n * The execution steps of the chain.\r\n */\r\n steps: ChainOperationContextStep[];\r\n /**\r\n * The chain dump, which is the text representation of the chain.\r\n */\r\n chainDump: string;\r\n /**\r\n * The list of all unique tags in the chain.\r\n */\r\n chainTags: string[];\r\n /**\r\n * The sets of nodes in their order, for each version tag.\r\n * These nodes are collected by following the path defined\r\n * by the set of links of each version tag; so each of the\r\n * sets contains only the nodes used at that step to build\r\n * the text version, with their features up to that stage.\r\n */\r\n taggedNodes: { [key: string]: CharNode[] };\r\n}\r\n\r\n/**\r\n * The input and output tags of a char-based chain operation.\r\n */\r\nexport interface ChainOperationTags {\r\n inputTag: string;\r\n outputTag: string;\r\n}\r\n\r\n/**\r\n * The node of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainNode {\r\n id: number;\r\n label: string;\r\n data: string;\r\n sourceTag?: string;\r\n}\r\n\r\n/**\r\n * The link of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainLink {\r\n tag: string;\r\n sourceId: number;\r\n targetId: number;\r\n}\r\n\r\n/**\r\n * The character-based chain, as resulting from running operations\r\n * on a base text, used for diagnostic or demonstration purposes.\r\n */\r\nexport interface CharChain {\r\n nodes: CharChainNode[];\r\n links: CharChainLink[];\r\n}\r\n\r\n/**\r\n * Service to interact with the GVE API.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveApiService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService\r\n ) {}\r\n\r\n /**\r\n * Parse the specified text into operations. Each operation is a line\r\n * of the text.\r\n * @param text The text to parse.\r\n * @returns The operations.\r\n */\r\n public parseOperations(\r\n text: string\r\n ): Observable<ResultWrapper<CharChainOperation[]>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainOperation[]>>(\r\n `${this._env.get('apiUrl')}text/operations/parse`,\r\n {\r\n text,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Run operations on the specified text.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public runOperations(\r\n text: CharNode[],\r\n operations: CharChainOperation[]\r\n ): Observable<ResultWrapper<CharChainResult>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainResult>>(\r\n `${this._env.get('apiUrl')}text/operations/run`,\r\n {\r\n text,\r\n operations,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the input and output tags for the given operations.\r\n *\r\n * @param operations The operations.\r\n * @returns Result wrapper.\r\n */\r\n public getTags(\r\n operations: CharChainOperation[]\r\n ): Observable<ResultWrapper<string[]>> {\r\n return this._http\r\n .post<ResultWrapper<string[]>>(\r\n `${this._env.get('apiUrl')}text/operations/tags`,\r\n {\r\n operations,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the chain corresponding to the operations run on the\r\n * specified text. This is used for diagnostic or demonstration\r\n * purposes.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public getChain(\r\n text: CharNode[],\r\n operations: CharChainOperation[]\r\n ): Observable<ResultWrapper<CharChain>> {\r\n return this._http\r\n .post<ResultWrapper<CharChain>>(\r\n `${this._env.get('apiUrl')}text/operations/run/chain`,\r\n {\r\n text,\r\n operations,\r\n }\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n input,\r\n OnInit,\r\n Optional,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharChainOperation } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { PayloadMatDialogConfig } from '../../models';\r\nimport { GveApiService } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-batch-operation-editor`\r\n *\r\n * A component to edit a batch of operations. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `preset` (`string`): the optional preset text to parse.\r\n * - 🔥 `operationsChange` (`CharChainOperation[]`): event emitted when operations change.\r\n */\r\n@Component({\r\n selector: 'gve-batch-operation-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './batch-operation-editor.component.html',\r\n styleUrl: './batch-operation-editor.component.css',\r\n})\r\nexport class BatchOperationEditorComponent implements OnInit {\r\n public readonly busy = signal<boolean>(false);\r\n public readonly parseError = signal<string | undefined>(undefined);\r\n\r\n public text: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n /**\r\n * The preset text to parse if any. Usually you start with a blank\r\n * text, but sometimes you might want to pre-set it.\r\n */\r\n public readonly preset = input<string | undefined>();\r\n\r\n /**\r\n * Emitted when operations change.\r\n */\r\n public readonly operationsChange = output<CharChainOperation[]>();\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<BatchOperationEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ preset?: string }>\r\n ) {\r\n this.text = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(2000),\r\n ]);\r\n this.form = formBuilder.group({\r\n inputOps: this.text,\r\n });\r\n\r\n effect(() => {\r\n this.parseOperations(this.preset() || undefined);\r\n });\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.preset) {\r\n this.parseOperations(this.data?.payload?.preset);\r\n }\r\n }\r\n\r\n public parseOperations(text?: string): void {\r\n if (this.busy() || !text) {\r\n return;\r\n }\r\n this.busy.set(true);\r\n this.parseError.set(undefined);\r\n\r\n this._api.parseOperations(text).subscribe({\r\n next: (wrapper) => {\r\n if (wrapper.error) {\r\n this.parseError.set(wrapper.error);\r\n return;\r\n }\r\n this.operationsChange.emit(wrapper.result || []);\r\n if (this.dialogRef) {\r\n this.dialogRef.close(wrapper.result);\r\n }\r\n },\r\n error: (error) => {\r\n this.parseError.set(error.message);\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Add Operations</h2>\r\n </div>\r\n }\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"text\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n @if (parseError()) {\r\n <div class=\"error\">{{ parseError() }}</div>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or output tags,\r\n separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>@</code> to AT to use character indexes (0-N)\r\n rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>, separated by\r\n space, where:\r\n </li>\r\n <li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove feature (no\r\n value). Suffixes: <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple), <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text into operations\"\r\n [disabled]=\"!text.value || busy()\"\r\n (click)=\"parseOperations(text.value!)\"\r\n >\r\n batch add\r\n </button>\r\n </div>\r\n </fieldset>\r\n</div>\r\n","\r\nimport { Component, effect, input, model, output } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LabeledId, OperationSource } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-operation-source-editor`\r\n *\r\n * A component to edit an operation source.\r\n * Used by chain operation editor component.\r\n *\r\n * - ▶️ `source` (`OperationSource`): the source to edit.\r\n * - ▶️ `ids` (`LabeledId[]`): the list of source IDs, when using a closed\r\n * list for them.\r\n * - ▶️ `types` (`LabeledId[]`): the list of source types, when using a closed\r\n * list for them.\r\n * - 🔥 `sourceChange` (`EventEmitter<OperationSource>`): the event emitted\r\n * when the source changes.\r\n * - 🔥 `sourceCancel` (`EventEmitter<void>`): the event emitted when the\r\n * edit is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-operation-source-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule\r\n],\r\n templateUrl: './operation-source-editor.component.html',\r\n styleUrl: './operation-source-editor.component.css',\r\n})\r\nexport class OperationSourceEditorComponent {\r\n /**\r\n * The source to edit.\r\n */\r\n public readonly source = model<OperationSource | undefined>();\r\n\r\n /**\r\n * The list of source IDs when it's a closed set.\r\n */\r\n public readonly ids = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The list of source types when it's a closed set.\r\n */\r\n public readonly types = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The event emitted when the edit is canceled.\r\n */\r\n public sourceCancel = output();\r\n\r\n public id: FormControl<string>;\r\n public type: FormControl<string>;\r\n public rank: FormControl<number>;\r\n public note: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.id = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.type = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.rank = new FormControl(0, {\r\n nonNullable: true,\r\n });\r\n this.note = new FormControl(null, {\r\n validators: [Validators.maxLength(1000)],\r\n });\r\n this.form = formBuilder.group({\r\n id: this.id,\r\n type: this.type,\r\n rank: this.rank,\r\n note: this.note,\r\n });\r\n\r\n // when source changes, update form\r\n effect(() => {\r\n this.updateForm(this.source());\r\n });\r\n }\r\n\r\n private updateForm(source?: OperationSource): void {\r\n if (!source) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.id.setValue(source.id);\r\n this.type.setValue(source.type);\r\n this.rank.setValue(source.rank || 0);\r\n this.note.setValue(source.note || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public cancel(): void {\r\n this.sourceCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.source.set({\r\n id: this.id.value,\r\n type: this.type.value,\r\n rank: this.rank.value,\r\n note: this.note.value || undefined,\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <!-- id (bound) -->\r\n @if (ids()?.length) {\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <mat-select [formControl]=\"id\">\r\n @for (i of ids(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- id (free) -->\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <input matInput [formControl]=\"id\" />\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n } @if ($any(id.errors)?.maxLength && (id.dirty || id.touched)) {\r\n <mat-error>id too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- type (bound) -->\r\n @if (types()?.length) {\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n @for (i of types(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- type (free) -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <input matInput [formControl]=\"type\" />\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n } @if ($any(type.errors)?.maxLength && (type.dirty || type.touched)) {\r\n <mat-error>type too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput [formControl]=\"note\" class=\"long-text\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\n\r\n/**\r\n * Validators for SVG.\r\n */\r\nexport class SvgValidators {\r\n /**\r\n * Validator for a valid SVG `g` root element in GVE.\r\n */\r\n static rootGValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n const parser = new DOMParser();\r\n let error = null;\r\n let svgRoot;\r\n\r\n try {\r\n const doc = parser.parseFromString(control.value, 'image/svg+xml');\r\n svgRoot =\r\n doc.documentElement.nodeName === 'svg' ? doc.documentElement : null;\r\n } catch (e) {\r\n error = { svgInvalid: { value: control.value } };\r\n }\r\n\r\n if (!error && svgRoot) {\r\n const gElements = svgRoot.getElementsByTagName('g');\r\n if (gElements.length !== 1 || svgRoot.childNodes.length > 1) {\r\n error = { svgInvalidRoot: { value: control.value } };\r\n }\r\n }\r\n\r\n return error;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Service to store and retrieve dynamic settings.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SettingsService {\r\n private readonly _cache: Map<string, unknown> = new Map<string, unknown>();\r\n private readonly _subject: BehaviorSubject<string | null> =\r\n new BehaviorSubject<string | null>(null);\r\n\r\n /**\r\n * Observable emitting the key of the setting that has changed.\r\n */\r\n public get settingChange$(): Observable<string | null> {\r\n return this._subject.asObservable();\r\n }\r\n\r\n /**\r\n * Prefix to scope the keys. This prefix is used internally to scope the keys\r\n * so that they cannot conflict with other keys in the local storage.\r\n * The prefix is totally transparent to the user of the service, who should\r\n * use the keys without the prefix.\r\n */\r\n public keyPrefix?: string;\r\n\r\n /**\r\n * True to persist the settings in the local storage by default.\r\n */\r\n public persistDefault = false;\r\n\r\n /**\r\n * Scopes the key by prefixing it with the keyPrefix if any.\r\n *\r\n * @param key The key to scope.\r\n * @returns The scoped key.\r\n */\r\n private getScopedKey(key: string): string {\r\n return this.keyPrefix ? this.keyPrefix + key : key;\r\n }\r\n\r\n private isPersist(persist?: boolean): boolean {\r\n return persist === undefined ? this.persistDefault : persist;\r\n }\r\n\r\n /**\r\n * Sets a setting's value.\r\n *\r\n * @param key The key.\r\n * @param value The value.\r\n * @param persist True to persist this setting in local storage.\r\n */\r\n public set(key: string, value: any, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.set(key, value);\r\n if (this.isPersist(persist) && value !== undefined) {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n } catch (e) {\r\n console.error(`Error saving key \"${key}\" to localStorage`, e);\r\n }\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Set multiple settings at once from the specified settings object.\r\n *\r\n * @param settings The settings to set.\r\n * @param persist True to persist these settings in local storage.\r\n */\r\n public setFrom(\r\n settings: { [key: string]: any } | undefined | null,\r\n persist?: boolean\r\n ): void {\r\n if (!settings) {\r\n return;\r\n }\r\n for (const key in settings) {\r\n if (settings.hasOwnProperty(key)) {\r\n this.set(key, settings[key], persist);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get a setting's value of type T.\r\n *\r\n * @param key The key.\r\n * @param defaultValue The default value to get when the setting\r\n * is not found in the store.\r\n * @returns The value.\r\n */\r\n public get<T>(key: string, defaultValue?: any, persist?: boolean): T {\r\n key = this.getScopedKey(key);\r\n\r\n // immediately return value from cache\r\n if (this._cache.has(key)) {\r\n return this._cache.get(key) as T;\r\n }\r\n\r\n // try loading value from local storage\r\n if (this.isPersist(persist)) {\r\n const value = localStorage.getItem(key);\r\n if (value) {\r\n try {\r\n const parsedValue = JSON.parse(value) as T;\r\n this._cache.set(key, parsedValue);\r\n return parsedValue;\r\n } catch (e) {\r\n console.error(\r\n `Error parsing value for key \"${key}\" from localStorage`,\r\n e\r\n );\r\n }\r\n }\r\n }\r\n\r\n // not found, return default value\r\n return defaultValue;\r\n }\r\n\r\n /**\r\n * Check if a key exists in the store.\r\n *\r\n * @param key The key.\r\n * @param persist True to check if the key exists in local storage.\r\n * @returns True if the key exists in the store.\r\n */\r\n public contains(key: string, persist?: boolean): boolean {\r\n key = this.getScopedKey(key);\r\n if (this._cache.has(key)) {\r\n return true;\r\n }\r\n return this.isPersist(persist) && localStorage.getItem(key) !== null;\r\n }\r\n\r\n /**\r\n * Get all the keys of the settings in the store.\r\n *\r\n * @param persist True to include keys from local storage.\r\n * @returns The keys of the settings in the store.\r\n */\r\n public getKeys(persist?: boolean): string[] {\r\n const keys: Set<string> = new Set<string>();\r\n\r\n // collect keys from local storage\r\n if (this.isPersist(persist)) {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && (!this.keyPrefix || key.startsWith(this.keyPrefix))) {\r\n keys.add(key);\r\n }\r\n }\r\n }\r\n\r\n // collect keys from cache\r\n this._cache.forEach((_, key) => keys.add(key));\r\n\r\n // return keys as array\r\n return Array.from(keys);\r\n }\r\n\r\n /**\r\n * Remove a setting if present.\r\n *\r\n * @param key The key.\r\n * @param persist True to remove the setting from local storage.\r\n */\r\n public remove(key: string, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.delete(key);\r\n\r\n if (this.isPersist(persist)) {\r\n localStorage.removeItem(key);\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Clear all settings. Warning: this will remove all settings from the\r\n * local storage if no key prefix is set.\r\n *\r\n * @param persist True to remove all settings from local storage.\r\n */\r\n public clear(persist?: boolean): void {\r\n // remove from local storage all the settings\r\n const removedKeys: Set<string> = new Set<string>();\r\n\r\n if (this.isPersist(persist)) {\r\n if (this.keyPrefix) {\r\n // collect keys to remove from local storage\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(this.keyPrefix)) {\r\n removedKeys.add(key);\r\n }\r\n }\r\n // remove collected keys from local storage\r\n removedKeys.forEach((key) => localStorage.removeItem(key));\r\n } else {\r\n localStorage.clear();\r\n }\r\n }\r\n\r\n // remove from cache all the items emitting change events\r\n this._cache.forEach((_, key) => {\r\n this._cache.delete(key);\r\n this._subject.next(key);\r\n removedKeys.delete(key);\r\n });\r\n\r\n // emit changes for the remaining removed keys\r\n // for when the cache was not in sync with the local storage\r\n removedKeys.forEach((key) => this._subject.next(key));\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, filter } from 'rxjs/operators';\r\n\r\n// material\r\nimport { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n// vendor\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { customAlphabet } from 'nanoid';\r\n\r\n// myrmidon\r\nimport { deepCopy, SafeHtmlPipe } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport {\r\n CharChainOperation,\r\n Feature,\r\n OperationFeature,\r\n OperationType,\r\n OperationSource,\r\n SnapshotBase,\r\n LabeledId,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\n// local\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\nimport { OperationSourceEditorComponent } from '../operation-source-editor/operation-source-editor.component';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { SvgValidators } from '../../validators/svg-validators';\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\nimport { VarBaseTextRange } from '../base-text-view/base-text-view.component';\r\n\r\n/**\r\n * Definitions for features, including names and values.\r\n */\r\nexport interface FeatureDefinitions {\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n names?: LabeledId[];\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n values?: FeatureMap;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-chain-operation-editor`\r\n *\r\n * A component for editing a variant generation operation.\r\n * Used by the `gve-snapshot-editor` component.\r\n * - ▶️ `operation` (`CharChainOperation`): the operation to edit.\r\n * - ▶️ `snapshot` (`SnapshotBase`): the snapshot the operation refers to.\r\n * - ▶️ `hidePreview` (`boolean`): whether to hide the preview request button.\r\n * - 🔥 `operationChange` (`CharChainOperation`): emitted when the operation\r\n * is changed.\r\n * - 🔥 `operationPreview` (`CharChainOperation`): emitted when the operation\r\n * preview is requested.\r\n * - 🔥 `operationCancel` (`void`): emitted when operation editing is cancelled.\r\n *\r\n * The editor is composed of many sections:\r\n * - **general**:\r\n * - ID: each operation has an ID, automatically assigned. This is not used in\r\n * the context of the operation or of its transformations, but is provided as a\r\n * reference.\r\n * - at and run: coordinates for the selection of the base text targeted by\r\n * this operation. Check `idx` when `at` is index-based rather than ID-based.\r\n * - to and to-run: a second coordinate, used by some operations.\r\n * - value: the text value argument, for those operations requiring it.\r\n * - rank and group ID.\r\n * - input and output tags.\r\n * - features. These are metadata attached to this operation, and can be any\r\n * type of name=value pairs.\r\n * - **sources**: sources are a special type of metadata used when your text\r\n * versions come from more than a single source. In this case, you can specify\r\n * the source(s) for each operation, just like in a traditional apparatus you\r\n * specify witnesses for each variant. Each source has an ID, a type, a\r\n * probability rank (0=not specified, else 1-N), and an optional free text note.\r\n * - **diplomatic**: SVG `g` code. The diplomatic section is the approximate\r\n * diplomatic representation of the layout of the annotated text. It essentially\r\n * consists in a freely editable SVG code, always grouped into a single root `g`\r\n * element, encoding all the graphical traits representing this operation.\r\n * The visual part of each operation can be placed everywhere on the snapshot,\r\n * as specified by its coordinates.\r\n * - **elements**: features of any of the SVG code elements having an ID.\r\n * The elements section lists all the SVG elements having an `id` attribute in\r\n * the SVG code of the diplomatic section. The ID allows you to attach\r\n * any number of features (metadata modeled as name=value pairs) to each of\r\n * these elements. Among these features, you may use `style` or `class` for\r\n * renditional purposes, and any other name for your own metadata. Note that\r\n * element IDs will be required also when dealing with animations. So, ensure\r\n * to assign an ID to each element you want to animate.\r\n * - **dp feats**: diplomatic features: these are features (metadata modeled\r\n * as name=value pairs) for the diplomatic representation of this operation\r\n * as a whole.\r\n */\r\n@Component({\r\n selector: 'gve-chain-operation-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n ClipboardModule,\r\n MatBadgeModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n SafeHtmlPipe,\r\n FeatureSetEditorComponent,\r\n OperationSourceEditorComponent,\r\n ],\r\n templateUrl: './chain-operation-editor.component.html',\r\n styleUrl: './chain-operation-editor.component.css',\r\n})\r\nexport class ChainOperationEditorComponent implements OnInit, OnDestroy {\r\n // monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private readonly _subs: Subscription[];\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n private _editorModel?: monaco.editor.ITextModel;\r\n private _editor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n /**\r\n * The operation to edit.\r\n */\r\n public readonly operation = model<CharChainOperation | undefined>();\r\n\r\n /**\r\n * The snapshot the operation refers to.\r\n */\r\n public readonly snapshot = input<SnapshotBase | undefined>();\r\n\r\n /**\r\n * Whether to hide the preview request button.\r\n */\r\n public readonly hidePreview = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for element features, including names and values.\r\n */\r\n public readonly elementFeatureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for diplomatic features, including names and values.\r\n */\r\n public readonly diplomaticFeatureDefs = input<\r\n FeatureDefinitions | undefined\r\n >();\r\n\r\n /**\r\n * Set when the edited operation's text range is to be patched.\r\n */\r\n public readonly rangePatch = input<VarBaseTextRange | undefined>();\r\n\r\n /**\r\n * Emitted when the operation is changed.\r\n */\r\n public readonly operationChange = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when the operation preview is requested.\r\n */\r\n public readonly operationPreview = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when operation editing is cancelled.\r\n */\r\n public readonly operationCancel = output();\r\n\r\n public readonly tabIndex = signal<number>(0);\r\n public readonly id = signal<string | undefined>(undefined);\r\n public readonly hasTo = signal<boolean>(false);\r\n public readonly hasToRun = signal<boolean>(false);\r\n public readonly hasValue = signal<boolean>(false);\r\n // elements parsed from SVG and having an id attribute;\r\n // we can attach features to each of these elements\r\n public readonly elements = signal<SVGElement[]>([]);\r\n public readonly editedElementId = signal<string | undefined>(undefined);\r\n // source\r\n public readonly editedSource = signal<OperationSource | undefined>(undefined);\r\n public readonly editedSourceIndex = signal<number>(-1);\r\n\r\n // general\r\n public rank: FormControl<number>;\r\n public groupId: FormControl<string | null>;\r\n public features: FormControl<Feature[]>;\r\n public sources: FormControl<OperationSource[]>;\r\n public type: FormControl<OperationType>;\r\n public at: FormControl<number>;\r\n public atAsIndex: FormControl<boolean>;\r\n public to: FormControl<number>;\r\n public toAsIndex: FormControl<boolean>;\r\n public inputTag: FormControl<string | null>;\r\n public outputTag: FormControl<string | null>;\r\n public run: FormControl<number>;\r\n public toRun: FormControl<number>;\r\n public value: FormControl<string | null>;\r\n // svg\r\n public svg: FormControl<string>;\r\n // elements\r\n public elementFeatures: FormControl<Record<string, Feature[]>>;\r\n // diplomatic\r\n public newTextHidden: FormControl<boolean>;\r\n public dpFeatures: FormControl<Feature[]>;\r\n // root\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _clipboard: Clipboard,\r\n private _settings: SettingsService,\r\n private _dialogService: DialogService\r\n ) {\r\n this._subs = [];\r\n // general\r\n this.rank = formBuilder.control<number>(0, { nonNullable: true });\r\n this.groupId = formBuilder.control<string | null>(null);\r\n this.features = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n this.sources = formBuilder.control<OperationSource[]>([], {\r\n nonNullable: true,\r\n });\r\n this.type = formBuilder.control<OperationType>(OperationType.replace, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.at = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.atAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.to = formBuilder.control<number>(0, { nonNullable: true });\r\n this.toAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.inputTag = formBuilder.control<string | null>(null);\r\n this.outputTag = formBuilder.control<string | null>(null);\r\n this.run = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.toRun = formBuilder.control<number>(0, { nonNullable: true });\r\n this.value = formBuilder.control<string | null>(null);\r\n\r\n // svg\r\n this.svg = formBuilder.control<string>('', {\r\n validators: [SvgValidators.rootGValidator()],\r\n nonNullable: true,\r\n });\r\n this.elementFeatures = formBuilder.control<Record<string, Feature[]>>(\r\n {},\r\n { nonNullable: true }\r\n );\r\n this.newTextHidden = formBuilder.control<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.dpFeatures = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n\r\n this.form = formBuilder.group({\r\n rank: this.rank,\r\n groupId: this.groupId,\r\n features: this.features,\r\n sources: this.sources,\r\n type: this.type,\r\n at: this.at,\r\n atAsIndex: this.atAsIndex,\r\n to: this.to,\r\n toAsIndex: this.toAsIndex,\r\n inputTag: this.inputTag,\r\n outputTag: this.outputTag,\r\n run: this.run,\r\n toRun: this.toRun,\r\n value: this.value,\r\n svg: this.svg,\r\n elementFeatures: this.elementFeatures,\r\n newTextHidden: this.newTextHidden,\r\n dpFeatures: this.dpFeatures,\r\n });\r\n\r\n // when operation changes, update form\r\n effect(() => {\r\n this.updateForm(this.operation());\r\n });\r\n\r\n // when snapshot changes, update SVG\r\n effect(() => {\r\n const snapshot = this.snapshot();\r\n const dirty = this.hasTextChanges(snapshot || undefined);\r\n if (dirty) {\r\n this.requestPreview();\r\n this._editorModel?.setValue(this.svg.value || '');\r\n }\r\n });\r\n\r\n // when rangePatch changes, patch operation range (at and run,\r\n // resetting atAsIndex to false)\r\n effect(() => {\r\n const range = this.rangePatch();\r\n\r\n if (range) {\r\n console.log('patching range', range);\r\n\r\n this.at.setValue(range.at);\r\n this.at.markAsDirty();\r\n this.at.updateValueAndValidity();\r\n\r\n this.atAsIndex.setValue(false);\r\n this.atAsIndex.markAsDirty();\r\n this.atAsIndex.updateValueAndValidity();\r\n\r\n this.run.setValue(range.run);\r\n this.run.markAsDirty();\r\n this.run.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever svg or base change, update preview\r\n this._subs.push(\r\n this.form.valueChanges\r\n .pipe(\r\n filter((changes) => 'svg' in changes || 'snapshot' in changes),\r\n debounceTime(500)\r\n )\r\n .subscribe(() => {\r\n this.requestPreview();\r\n })\r\n );\r\n\r\n // whenever type changes, update args UI\r\n this._subs.push(\r\n this.type.valueChanges.subscribe(() => this.updateArgsUI())\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._disposables.forEach((d) => d.dispose());\r\n for (const sub of this._subs) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n private toggleLfEscape(\r\n text: string | null | undefined,\r\n on: boolean\r\n ): string | null | undefined {\r\n if (!text) return text;\r\n return on ? text.replace(/\\\\/g, '\\n') : text.replace(/\\n/g, '\\\\');\r\n }\r\n\r\n private hasTextChanges(snapshot?: SnapshotBase): boolean {\r\n if ((!snapshot && this.snapshot()) || (snapshot && !this.snapshot())) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.size?.width !== this.snapshot()?.size?.width ||\r\n snapshot?.size?.height !== this.snapshot()?.size?.height\r\n ) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.style !== this.snapshot()?.style ||\r\n snapshot?.text !== this.snapshot()?.text ||\r\n snapshot?.textStyle !== this.snapshot()?.textStyle\r\n ) {\r\n return true;\r\n }\r\n // compare textOptions returning true if any different\r\n const options = snapshot?.textOptions;\r\n if (\r\n options?.lineHeightOffset !==\r\n this.snapshot()?.textOptions?.lineHeightOffset ||\r\n options?.charSpacingOffset !==\r\n this.snapshot()?.textOptions?.charSpacingOffset ||\r\n options?.spcWidthOffset !== this.snapshot()?.textOptions?.spcWidthOffset\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public onCreateEditor(editor: monaco.editor.IEditor) {\r\n console.log('creating editor');\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._editorModel =\r\n this._editorModel || monaco.editor.createModel(this.svg.value, 'xml');\r\n editor.setModel(this._editorModel);\r\n this._editor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n // when the editor content changes, update the SVG control value\r\n this._editorModel.onDidChangeContent((e) => {\r\n console.log('change content');\r\n const code = this._editorModel!.getValue();\r\n if (code !== this.svg.value) {\r\n this.svg.setValue(code);\r\n this.svg.markAsDirty();\r\n this.svg.updateValueAndValidity();\r\n }\r\n })\r\n );\r\n }\r\n\r\n public onFeaturesChange(features: OperationFeature[]): void {\r\n this.features.setValue(features);\r\n this.features.markAsDirty();\r\n }\r\n\r\n public onDpFeaturesChange(features: Feature[]): void {\r\n this.dpFeatures.setValue(features);\r\n this.dpFeatures.markAsDirty();\r\n }\r\n\r\n // #region sources\r\n public addSource(): void {\r\n this.editedSource.set({ id: '', type: '' });\r\n this.editedSourceIndex.set(-1);\r\n }\r\n\r\n public editSource(index: number): void {\r\n this.editedSourceIndex.set(index);\r\n this.editedSource.set(deepCopy(this.sources.value[index]));\r\n }\r\n\r\n public closeSource(): void {\r\n this.editedSourceIndex.set(-1);\r\n this.editedSource.set(undefined);\r\n }\r\n\r\n public onSourceChange(source: OperationSource): void {\r\n const sources = [...this.sources.value];\r\n if (this.editedSourceIndex() === -1) {\r\n sources.push(source);\r\n } else {\r\n sources[this.editedSourceIndex()] = source;\r\n }\r\n this.sources.setValue(sources);\r\n this.closeSource();\r\n }\r\n // #endregion\r\n\r\n // #region svg\r\n public saveSvg(): void {\r\n if (!this.svg.value) {\r\n return;\r\n }\r\n const blob = new Blob([this.svg.value], { type: 'application/xml' });\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // create filename from date and time\r\n const now = new Date();\r\n const date = now.toISOString().split('T')[0];\r\n const time = now.toTimeString().split(' ')[0].replace(':', '-');\r\n a.download = `svg-${date}_${time}.svg`;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n public openSvgEditor(): void {\r\n const url = this._settings.get<string>(\r\n 'svg-editor',\r\n 'https://editor.method.ac/'\r\n // 'https://boxy-svg.com/app'\r\n );\r\n if (url) {\r\n if (this.svg.value) {\r\n this._clipboard.copy(this.svg.value);\r\n }\r\n window.open(url, '_blank');\r\n }\r\n }\r\n\r\n public loadSvg(): void {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = '.svg';\r\n input.onchange = () => {\r\n const file = input.files?.[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n this._editorModel?.setValue(e.target?.result as string);\r\n };\r\n reader.readAsText(file);\r\n }\r\n };\r\n input.click();\r\n }\r\n\r\n public setSvgFromClipboard(): void {\r\n navigator.clipboard.readText().then((text) => {\r\n this._editorModel?.setValue(text);\r\n });\r\n }\r\n\r\n private parseSvg(svg?: string): SVGElement[] {\r\n if (!svg) {\r\n return [];\r\n }\r\n try {\r\n // parse SVG code extracting all the SVG elements with an id attribute\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(svg, 'image/svg+xml');\r\n const elements = Array.from(doc.querySelectorAll('[id]'));\r\n\r\n // for each element, read x and y and add a transform with a translate\r\n // equal to -x and -y so that the element is at the origin. This is useful\r\n // so that the element can be previewed in its box without wasting space\r\n // just because it happens not to be placed at the SVG origin\r\n for (const element of elements) {\r\n const x = parseFloat(element.getAttribute('x') || '0');\r\n const y = parseFloat(element.getAttribute('y') || '0');\r\n element.setAttribute('transform', `translate(${-x},${-y})`);\r\n }\r\n\r\n return elements as SVGElement[];\r\n } catch (e) {\r\n this.svg.setErrors({ invalidSvg: true });\r\n return [];\r\n }\r\n }\r\n\r\n public removeDecimals(): void {\r\n const svg = this.svg.value;\r\n const newSvg = svg.replace(/(\\d+)\\.\\d+/g, '$1');\r\n this._editorModel?.setValue(newSvg);\r\n }\r\n\r\n public wrapInGroup(): void {\r\n // wrap SVG code in <g>...</g> if it does not already start with <g>\r\n const svg = this.svg.value;\r\n if (!svg.startsWith('<g')) {\r\n this._editorModel?.setValue(`<g>${svg}</g>`);\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region element features\r\n public onTabIndexChange(index: number): void {\r\n this.tabIndex.set(index);\r\n if (index === 3) {\r\n this.elements.set(this.parseSvg(this.svg.value));\r\n }\r\n }\r\n\r\n public editElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const features = this.elementFeatures.value[id] || [];\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [id]: features,\r\n });\r\n this.editedElementId.set(id);\r\n }\r\n\r\n public deleteElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const elementFeatures = { ...this.elementFeatures.value };\r\n if (!elementFeatures[id]) {\r\n return;\r\n }\r\n\r\n this._dialogService\r\n .confirm('Confirm', 'Delete element features?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n delete elementFeatures[id];\r\n this.elementFeatures.setValue(elementFeatures);\r\n\r\n if (this.editedElementId() === id) {\r\n this.editedElementId.set(undefined);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public onElementFeaturesChange(features: Feature[]): void {\r\n if (this.editedElementId()) {\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [this.editedElementId()!]: features,\r\n });\r\n this.editedElementId.set(undefined);\r\n }\r\n }\r\n // #endregion\r\n\r\n private updateArgsUI(): void {\r\n let to = false,\r\n toRun = false,\r\n value = false;\r\n switch (this.type.value) {\r\n case OperationType.moveAfter:\r\n case OperationType.moveBefore:\r\n to = true;\r\n break;\r\n case OperationType.swap:\r\n to = true;\r\n toRun = true;\r\n break;\r\n case OperationType.addAfter:\r\n case OperationType.addBefore:\r\n case OperationType.replace:\r\n value = true;\r\n break;\r\n }\r\n this.hasTo.set(to);\r\n this.hasToRun.set(toRun);\r\n this.hasValue.set(value);\r\n\r\n if (!to) {\r\n this.to.reset();\r\n }\r\n if (!toRun) {\r\n this.toRun.reset();\r\n }\r\n if (!value) {\r\n this.value.reset();\r\n }\r\n }\r\n\r\n private updateForm(operation?: CharChainOperation | null): void {\r\n if (!operation) {\r\n this.form.reset();\r\n this.updateArgsUI();\r\n return;\r\n }\r\n\r\n // get or generate ID\r\n if (operation.id) {\r\n this.id.set(operation.id);\r\n } else {\r\n this.id.set(this._nanoid());\r\n }\r\n\r\n this.rank.setValue(operation.rank || 0);\r\n this.groupId.setValue(operation.groupId || null);\r\n this.features.setValue(operation.features || []);\r\n this.sources.setValue(operation.sources || []);\r\n this.newTextHidden.setValue(\r\n operation.diplomatics?.isNewTextHidden || false\r\n );\r\n this.dpFeatures.setValue(operation.diplomatics?.features || []);\r\n\r\n this.type.setValue(operation.type);\r\n this.at.setValue(operation.at);\r\n this.atAsIndex.setValue(operation.atAsIndex || false);\r\n this.to.setValue(operation.to || 0);\r\n this.toAsIndex.setValue(operation.toAsIndex || false);\r\n this.inputTag.setValue(operation.inputTag || null);\r\n this.outputTag.setValue(operation.outputTag || null);\r\n this.run.setValue(operation.run);\r\n this.toRun.setValue(operation.toRun || 0);\r\n // escape line feeds in value for editing\r\n this.value.setValue(this.toggleLfEscape(operation.value, true) || null);\r\n\r\n this.svg.setValue(operation.diplomatics?.g || '');\r\n this._editorModel?.setValue(this.svg.value || '');\r\n this.elementFeatures.setValue(operation.diplomatics?.elementFeatures || {});\r\n\r\n this.form.markAsPristine();\r\n\r\n this.elements.set(this.parseSvg(operation.diplomatics?.g));\r\n\r\n this.updateArgsUI();\r\n }\r\n\r\n public cancel(): void {\r\n this.operationCancel.emit();\r\n }\r\n\r\n private getOperation(): CharChainOperation {\r\n return {\r\n rank: this.rank.value || undefined,\r\n groupId: this.groupId.value || undefined,\r\n features: this.features.value?.length ? this.features.value : undefined,\r\n sources: this.sources.value?.length ? this.sources.value : undefined,\r\n diplomatics: {\r\n g: this.svg.value,\r\n isNewTextHidden: this.newTextHidden.value,\r\n features: this.dpFeatures.value,\r\n elementFeatures: this.elementFeatures.value,\r\n },\r\n id: this.id()!,\r\n type: this.type.value,\r\n at: this.at.value,\r\n atAsIndex: this.atAsIndex.value || undefined,\r\n to: this.to.value || undefined,\r\n toAsIndex: this.toAsIndex.value || undefined,\r\n inputTag: this.inputTag.value || undefined,\r\n outputTag: this.outputTag.value || undefined,\r\n run: this.run.value,\r\n toRun: this.toRun.value || undefined,\r\n // un-escape line feeds in value for storage\r\n value: this.toggleLfEscape(this.value.value, false) || undefined,\r\n };\r\n }\r\n\r\n public requestPreview(): void {\r\n this.operationPreview.emit(this.getOperation());\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n\r\n this.operation.set(this.getOperation());\r\n this.operationChange.emit(this.operation()!);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex()\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id() }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\"\r\n ><mat-icon>layers</mat-icon> replace</mat-option\r\n >\r\n <mat-option [value]=\"1\"\r\n ><mat-icon>close</mat-icon>delete</mat-option\r\n >\r\n <mat-option [value]=\"2\"\r\n ><mat-icon>last_page</mat-icon>add-before</mat-option\r\n >\r\n <mat-option [value]=\"3\"\r\n ><mat-icon>first_page</mat-icon>add-after</mat-option\r\n >\r\n <mat-option [value]=\"4\"\r\n ><mat-icon>login</mat-icon>move-before</mat-option\r\n >\r\n <mat-option [value]=\"5\"\r\n ><mat-icon>logout</mat-icon>move-after</mat-option\r\n >\r\n <mat-option [value]=\"6\"\r\n ><mat-icon>compare_arrows</mat-icon>swap</mat-option\r\n >\r\n <mat-option [value]=\"7\"\r\n ><mat-icon>edit_note</mat-icon>annotate</mat-option\r\n >\r\n </mat-select>\r\n @if ($any(type).errors?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n @if ($any(at).errors?.required && (at.dirty || at.touched)) {\r\n <mat-error>at required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n @if ($any(run).errors?.required && (run.dirty || run.touched)) {\r\n <mat-error>run required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n @if ($any(to).errors?.required && (to.dirty || to.touched)) {\r\n <mat-error>to required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n @if ( $any(toRun).errors?.required && (toRun.dirty || toRun.touched) )\r\n {\r\n <mat-error>to run required</mat-error>\r\n }\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue()) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n @if ($any(rank).errors?.required && (rank.dirty || rank.touched)) {\r\n <mat-error>rank required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n @if ( $any(groupId).errors?.required && (groupId.dirty ||\r\n groupId.touched) ) {\r\n <mat-error>group ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [featNames]=\"featureDefs()?.names\"\r\n [featValues]=\"featureDefs()?.values\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr [class.selected]=\"s === editedSource()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (editedSource()) {\r\n <!-- source editor -->\r\n <mat-expansion-panel\r\n [disabled]=\"!editedSource()\"\r\n [expanded]=\"editedSource()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource()\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-decimals\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Remove decimals\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"removeDecimals()\"\r\n >\r\n <mat-icon>pin</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-group\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Wrap code in group\"\r\n (click)=\"wrapInGroup()\"\r\n >\r\n <mat-icon>code</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements(); track e.id) {\r\n <tr [class.selected]=\"e.id === editedElementId()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit element features\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete all element features\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n [disabled]=\"!$any(elementFeatures.value)[e.id]?.length\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n <span\r\n [matBadge]=\"$any(elementFeatures.value)[e.id]?.length || 0\"\r\n [matBadgeHidden]=\"!$any(elementFeatures.value)[e.id]?.length\"\r\n matBadgeOverlap=\"false\"\r\n >{{ e.id }}</span\r\n >\r\n </td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (editedElementId()) {\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId()\"\r\n [expanded]=\"editedElementId()\"\r\n >\r\n <mat-expansion-panel-header>{{\r\n editedElementId()\r\n }}</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [featNames]=\"elementFeatureDefs()?.names\"\r\n [featValues]=\"elementFeatureDefs()?.values\"\r\n [features]=\"elementFeatures.value[editedElementId()!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <div>\r\n <mat-checkbox [formControl]=\"newTextHidden\">hide new text</mat-checkbox>\r\n </div>\r\n <gve-feature-set-editor\r\n [featNames]=\"diplomaticFeatureDefs()?.names\"\r\n [featValues]=\"diplomaticFeatureDefs()?.values\"\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview()) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, Input, signal } from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n Feature,\r\n LabeledId,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-view`\r\n *\r\n * A component to display a list of features.\r\n * Used by the chain result view component.\r\n *\r\n * - ▶️ `features` (`Feature[]`): the features to display.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n FlatLookupPipe,\r\n ],\r\n templateUrl: './feature-set-view.component.html',\r\n styleUrl: './feature-set-view.component.css',\r\n})\r\nexport class FeatureSetViewComponent {\r\n private _sub?: Subscription;\r\n\r\n /**\r\n * The features.\r\n */\r\n public readonly features = input<Feature[] | OperationFeature[]>([]);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n public readonly filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control(null);\r\n\r\n // when features change, reset the filter and apply it\r\n effect(() => {\r\n const features = this.features();\r\n this.filter.reset();\r\n this.applyFeatureFilter();\r\n });\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures.set(\r\n this.features().filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n })\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(value);\r\n });\r\n this.applyFeatureFilter();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n}\r\n","<div>\r\n <!-- filter -->\r\n <div>\r\n @if (filterThreshold() === 0 || features()!.length > filterThreshold()) {\r\n <div class=\"form-row\">\r\n <mat-form-field id=\"filter\">\r\n <mat-label>filter</mat-label>\r\n <input matInput [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n <span id=\"badge\">{{ filteredFeatures().length }}</span>\r\n </div>\r\n }\r\n\r\n <!-- list -->\r\n @if (filteredFeatures().length) {\r\n <table>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track $index) {\r\n <tr>\r\n <th>\r\n @if (featNames.length) {\r\n <span>{{\r\n feature.name | flatLookup : featNames : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </th>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup : featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { ChainOperationContextStep } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-steps-map`\r\n *\r\n * A map of steps in a chain operation context. This shows the list of\r\n * steps in the execution of a set of operations, and allows the user to\r\n * pick a step to view.\r\n *\r\n * Used by the `gve-chain-result-view` component.\r\n *\r\n * - ▶️ `steps` (`ChainOperationContextStep[]`): the steps to display.\r\n * - ▶️ `selectedStep` (`ChainOperationContextStep`): the step that is\r\n * currently selected.\r\n * - ▶️ `textFontSize` (`string`): the font size of the steps text.\r\n * - 🔥 `selectedStepChange` (`ChainOperationContextStep`): emitted when\r\n * the selectd step has been changed by the user. This is not emitted\r\n * when the selected step is changed programmatically, unless this is\r\n * the first time the steps are set. In that case, the last step is\r\n * automatically selected.\r\n */\r\n@Component({\r\n selector: 'gve-steps-map',\r\n imports: [CommonModule, MatButtonModule, MatRippleModule, MatTooltipModule],\r\n templateUrl: './steps-map.component.html',\r\n styleUrl: './steps-map.component.css',\r\n})\r\nexport class StepsMapComponent implements AfterViewInit {\r\n // track view initialization\r\n private _viewInitialized = signal(false);\r\n // track whether we've processed the steps/selection\r\n private _selectionProcessed = signal(false);\r\n\r\n // the lines of each version text, keyed under the output tag\r\n public readonly lines = signal<{ [key: string]: string[] }>({});\r\n\r\n /**\r\n * The steps to display.\r\n */\r\n public readonly steps = input<ChainOperationContextStep[]>([]);\r\n\r\n /**\r\n * The step that is currently selected.\r\n */\r\n public readonly selectedStep = model<ChainOperationContextStep | undefined>();\r\n\r\n /**\r\n * The font size of the steps text.\r\n */\r\n public readonly textFontSize = input('0.8em');\r\n\r\n constructor() {\r\n // handle steps updates\r\n effect(() => {\r\n const currentSteps = this.steps();\r\n if (currentSteps && currentSteps.length > 0) {\r\n this.updateLines(currentSteps);\r\n } else {\r\n this.lines.set({});\r\n }\r\n\r\n // reset selection processing when steps change\r\n this._selectionProcessed.set(false);\r\n });\r\n\r\n // handle synchronization between steps and selectedStep\r\n effect(() => {\r\n // only proceed if view is initialized and we haven't processed selection yet\r\n if (this._viewInitialized() && !this._selectionProcessed()) {\r\n const currentSteps = this.steps();\r\n const currentSelectedStep = this.selectedStep();\r\n\r\n // if we have steps, handle selection\r\n if (currentSteps && currentSteps.length > 0) {\r\n if (currentSelectedStep) {\r\n // if we have both inputs, verify selection is valid\r\n this.validateAndSetSelection(currentSelectedStep);\r\n } else {\r\n // auto-select last step if no selection provided\r\n this.selectedStep.set(currentSteps[currentSteps.length - 1]);\r\n }\r\n\r\n // mark as processed\r\n this._selectionProcessed.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private validateAndSetSelection(step: ChainOperationContextStep): void {\r\n const currentSteps = this.steps();\r\n\r\n // check if the selected step exists in the steps array\r\n const stepExists = currentSteps.some((s) => s.outputTag === step.outputTag);\r\n\r\n if (stepExists) {\r\n // valid selection, keep it\r\n this.selectedStep.set(step);\r\n } else {\r\n // invalid selection, default to last step\r\n const lastStep = currentSteps[currentSteps.length - 1];\r\n this.selectedStep.set(lastStep);\r\n }\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for selection processing\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n private updateLines(steps: ChainOperationContextStep[] | undefined) {\r\n if (!steps) {\r\n this.lines.set({});\r\n return;\r\n }\r\n\r\n const lines: { [key: string]: string[] } = {};\r\n for (let i = 0; i < steps.length; i++) {\r\n const step = this.steps()![i];\r\n lines[step.outputTag] = step.result?.split('\\n') || [];\r\n }\r\n this.lines.set(lines);\r\n }\r\n\r\n public onStepClick(step: ChainOperationContextStep) {\r\n this.selectedStep.set(step);\r\n }\r\n}\r\n","<div>\r\n @if (steps().length) { @for (step of steps(); track step.outputTag) {\r\n <div\r\n matRipple\r\n class=\"step form-row\"\r\n [class.selected]=\"step === selectedStep()\"\r\n (click)=\"onStepClick(step)\"\r\n >\r\n <!-- tag -->\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} ▶ </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <!-- text lines -->\r\n <div class=\"text\" [style.fontSize]=\"textFontSize()\">\r\n @for (line of lines()[step.outputTag]; track $index) {\r\n <div class=\"line\">{{ line }}</div>\r\n }\r\n <div></div>\r\n </div>\r\n </div>\r\n } }\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n effect,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport {\r\n CharNode,\r\n Feature,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { FeatureSetViewComponent } from '../feature-set-view/feature-set-view.component';\r\nimport { StepsMapComponent } from '../steps-map/steps-map.component';\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChainResult,\r\n} from '../../services/gve-api.service';\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport { MatTooltip } from \"@angular/material/tooltip\";\r\n\r\n/**\r\n * 🔑 `gve-chain-result-view`\r\n *\r\n * Component to display a chain result. This provides a version picker\r\n * by staged version or simple step, and shows the selected step's text\r\n * and features, plus a steps map. User can pick a step from both the\r\n * pickers or the map.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `result` (`CharChainResult`): the result to display.\r\n * - 🔥 `stepPick` (`ChainOperationContextStep`): emitted when a\r\n * result's step is picked by the user.\r\n */\r\n@Component({\r\n selector: 'gve-chain-result-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n FeatureSetViewComponent,\r\n StepsMapComponent,\r\n BaseTextViewComponent,\r\n MatTooltip\r\n],\r\n templateUrl: './chain-result-view.component.html',\r\n styleUrl: './chain-result-view.component.css',\r\n})\r\nexport class ChainResultViewComponent\r\n implements OnInit, OnDestroy, AfterViewInit\r\n{\r\n private _subs?: Subscription[];\r\n // track if we've already performed step selection\r\n private _stepSelectionDone = signal(false);\r\n // track if component view is initialized\r\n private _viewInitialized = signal(false);\r\n\r\n /**\r\n * The result to display.\r\n */\r\n public readonly result = input<CharChainResult | undefined>();\r\n\r\n /**\r\n * The index of the initial step to display after the result is set.\r\n * If the index is negative, it is counted from the end of the steps.\r\n */\r\n public readonly initialStepIndex = input<number | undefined>();\r\n\r\n /**\r\n * Emitted when a result's step is picked by the user.\r\n */\r\n public readonly stepPick = output<ChainOperationContextStep>();\r\n\r\n public readonly versionTags = signal<string[]>([]);\r\n public readonly tags = signal<string[]>([]);\r\n public readonly step = signal<ChainOperationContextStep | undefined>(\r\n undefined\r\n );\r\n public readonly selection = signal<string | undefined>(undefined);\r\n public readonly selectionFeatures = signal<OperationFeature[]>([]);\r\n public readonly selectionRange = signal<VarBaseTextRange | undefined>(\r\n undefined\r\n );\r\n\r\n /**\r\n * True to disable range picking. For instance the snapshot editor,\r\n * which uses rangePick to set the edited operation's range, disables\r\n * this when no operation is being edited.\r\n */\r\n public readonly disabledRangePick = input<boolean>(true);\r\n\r\n /**\r\n * Emitted when a range is picked.\r\n */\r\n public readonly rangePick = output<VarBaseTextRange>();\r\n\r\n public versionTag: FormControl<string | null>;\r\n public tag: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // bind callback methods\r\n this.getCharColor = this.getCharColor.bind(this);\r\n // this.getCharBorderColor = this.getCharBorderColor.bind(this);\r\n\r\n this.versionTag = formBuilder.control<string | null>(null);\r\n this.tag = formBuilder.control<string | null>(null);\r\n\r\n // when result changes, update the form\r\n effect(() => {\r\n this.updateForm(this.result());\r\n // select the initial step if set\r\n this.selectInitialStep(this.initialStepIndex());\r\n });\r\n\r\n // when either the result or initialStepIndex changes, try to select a step\r\n effect(() => {\r\n // only proceed if we haven't already done selection and view is ready\r\n if (!this._stepSelectionDone() && this._viewInitialized()) {\r\n const currentResult = this.result();\r\n const currentIndex = this.initialStepIndex();\r\n\r\n // if we have both pieces of data needed for selection, do it\r\n if (currentResult?.steps?.length && currentIndex !== undefined) {\r\n this.doInitialStepSelection(currentResult, currentIndex);\r\n this._stepSelectionDone.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private doInitialStepSelection(\r\n result: CharChainResult,\r\n initialStepIndex: number\r\n ): void {\r\n // calculate the effective index (handling negative indices)\r\n const effectiveIndex =\r\n initialStepIndex < 0\r\n ? result.steps.length + initialStepIndex\r\n : initialStepIndex;\r\n\r\n // ensure the index is valid\r\n if (effectiveIndex >= 0 && effectiveIndex < result.steps.length) {\r\n const targetStep = result.steps[effectiveIndex];\r\n\r\n // if we have a tag control (which we do based on your code)\r\n if (targetStep.outputTag) {\r\n // using the tag control ensures all the necessary updates happen\r\n this.tag.setValue(targetStep.outputTag);\r\n }\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [\r\n // whenever the staged version tag changes, update the tag\r\n this.versionTag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.tag.setValue(this.getTagFromVersion(value) || null);\r\n }),\r\n\r\n // whenever the tag changes, update the step\r\n this.tag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.selectionFeatures.set([]); // reset selection features\r\n this.step.set(\r\n this.result()?.steps.find((step) => step.outputTag === value)\r\n );\r\n if (this.step()) {\r\n this.stepPick.emit(this.step()!);\r\n }\r\n }),\r\n ];\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for initial selection\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n public getCharColor(node: CharNode): string | null {\r\n const features = this.getNodeFeatures(node.id);\r\n return features?.some(\r\n (f) => f.name === '$seg-out' || f.name === '$seg2-out'\r\n )\r\n ? 'orange'\r\n : null;\r\n }\r\n\r\n private selectInitialStep(initialStepIndex?: number): void {\r\n if (initialStepIndex !== undefined && this.result()?.steps) {\r\n this.step.set(\r\n this.result()!.steps[\r\n initialStepIndex < 0\r\n ? this.result()!.steps.length + initialStepIndex\r\n : initialStepIndex\r\n ]\r\n );\r\n } else {\r\n this.step.set(undefined);\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subs?.forEach((sub) => sub.unsubscribe());\r\n }\r\n\r\n private updateVersionTags(): void {\r\n if (!this.result()) {\r\n this.versionTags.set([]);\r\n return;\r\n }\r\n\r\n // extract version tags from result steps features named 'version'\r\n const tags = new Set<string>();\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version') {\r\n tags.add(feature.value);\r\n }\r\n }\r\n }\r\n this.versionTags.set(Array.from(tags).sort());\r\n }\r\n\r\n private getTagFromVersion(version?: string | null): string | undefined {\r\n if (!this.result() || !version) {\r\n return undefined;\r\n }\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version' && feature.value === version) {\r\n return step.outputTag;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private updateForm(result?: CharChainResult): void {\r\n this.selectionFeatures.set([]);\r\n\r\n if (!result) {\r\n this.step.set(undefined);\r\n this.selection.set(undefined);\r\n this.tags.set([]);\r\n this.versionTags.set([]);\r\n } else {\r\n this.tags.set(result.chainTags.filter((t) => t.length > 0 && t !== 'v0'));\r\n this.updateVersionTags();\r\n }\r\n\r\n // reset step selection tracking when result changes\r\n this._stepSelectionDone.set(false);\r\n }\r\n\r\n private getNodeFeatures(id: number): Feature[] {\r\n if (!this.step()) {\r\n return [];\r\n }\r\n return (\r\n this.step()!.featureSet.nodeFeatures[this.step()!.outputTag + '_' + id] ||\r\n []\r\n );\r\n }\r\n\r\n private findNode(id: number): CharNode | null {\r\n if (!this.step()) {\r\n return null;\r\n }\r\n for (let key of Object.keys(this.result()!.taggedNodes)) {\r\n const node = this.result()!.taggedNodes[key].find((n) => n.id === id);\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public onTextCharPick(event: BaseTextCharEvent): void {\r\n const features = this.getNodeFeatures(event.char.id);\r\n const node = this.findNode(event.char.id)!;\r\n this.selection.set(`${event.char.label} (${node.sourceTag})`);\r\n this.selectionFeatures.set([...features]);\r\n\r\n this.selectionRange.set({ at: event.char.id, run: 1 });\r\n }\r\n\r\n public onTextRangePick(range: VarBaseTextRange): void {\r\n if (range.run === 1) {\r\n // already handled by onStepCharPick\r\n return;\r\n }\r\n this.selection.set(range.at + '×' + range.run);\r\n this.selectionRange.set(range);\r\n const end = range.at + range.run;\r\n\r\n const features: Feature[] = [];\r\n const tagNodes = this.result()!.taggedNodes[this.tag.value!];\r\n\r\n for (let node of tagNodes) {\r\n // if in range, intersect features\r\n if (node.id >= range.at && node.id < end) {\r\n const nodeFeatures = this.getNodeFeatures(node.id);\r\n\r\n if (node.id === range.at) {\r\n for (let f of nodeFeatures) {\r\n features.push(f);\r\n }\r\n } else {\r\n // features = intersection of features and charFeatures\r\n features.splice(\r\n 0,\r\n features.length,\r\n ...features.filter((f) =>\r\n nodeFeatures.some((cf) => cf.name === f.name)\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.selectionFeatures.set(features);\r\n }\r\n\r\n public onStepChange(step?: ChainOperationContextStep): void {\r\n this.selectionFeatures.set([]);\r\n if (step) {\r\n // setting the tag will trigger the step change\r\n this.tag.setValue(step.outputTag);\r\n }\r\n }\r\n\r\n public pickRange(): void {\r\n if (this.selectionRange()) {\r\n this.rangePick.emit(this.selectionRange()!);\r\n }\r\n }\r\n}\r\n","@if (result()) {\r\n<div id=\"container\">\r\n <div id=\"bar\" class=\"form-row\">\r\n <!-- version -->\r\n @if (versionTags().length) {\r\n <mat-form-field>\r\n <mat-label>version</mat-label>\r\n <mat-select [formControl]=\"versionTag\">\r\n <mat-option [value]=\"null\">-</mat-option>\r\n @for (t of versionTags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <!-- tag -->\r\n @if (tags().length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <!-- range picker -->\r\n @if (selectionRange()) {\r\n <div class=\"range\">\r\n {{ selectionRange()!.at }}×{{ selectionRange()!.run }}\r\n </div>\r\n @if (!disabledRangePick()) {\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Pick this range for the edited operation\"\r\n (click)=\"pickRange()\"\r\n [disabled]=\"disabledRangePick()\"\r\n >\r\n <mat-icon class=\"mat-warn\">file_open</mat-icon>\r\n </button>\r\n } }\r\n </div>\r\n\r\n <!-- step -->\r\n @if (step()) {\r\n <div id=\"step\">\r\n <!-- text -->\r\n <div id=\"text\">\r\n <gve-base-text-view\r\n [text]=\"result()!.taggedNodes[step()!.outputTag]\"\r\n [colorCallback]=\"getCharColor\"\r\n (charPick)=\"onTextCharPick($event)\"\r\n (rangePick)=\"onTextRangePick($event)\"\r\n />\r\n </div>\r\n <!-- features -->\r\n <div id=\"feats\" class=\"form-row-top\">\r\n <div id=\"g-feats\">\r\n <div class=\"feat-header\">{{ step()!.outputTag }}</div>\r\n <gve-feature-set-view [features]=\"step()!.featureSet.features\" />\r\n </div>\r\n <div id=\"n-feats\">\r\n @if (selectionFeatures().length) {\r\n <div class=\"feat-header\">{{ selection() }}</div>\r\n <gve-feature-set-view [features]=\"selectionFeatures()\" />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- steps map -->\r\n <div id=\"map\">\r\n <gve-steps-map\r\n [steps]=\"result()!.steps\"\r\n [selectedStep]=\"step()\"\r\n (selectedStepChange)=\"onStepChange($event)\"\r\n />\r\n </div>\r\n</div>\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CharChain, CharChainNode } from './gve-api.service';\r\n\r\n// You can use this online tool to visualize the graph:\r\n// https://dreampuf.github.io/GraphvizOnline\r\n// You can also append ?engine=dot#... where ... is the graphviz code.\r\n\r\n// https://graphviz.org/docs/attr-types/rankdir\r\nexport type GraphvizRankdir = 'TB' | 'LR' | 'BT' | 'RL';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveGraphvizService {\r\n private hashString(str: string): number {\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\r\n hash = hash & hash; // convert to 32bit integer\r\n }\r\n return Math.abs(hash);\r\n }\r\n\r\n private hslToRgb(hue: number, saturation: number, lightness: number): string {\r\n const chroma =\r\n ((1 - Math.abs((2 * lightness) / 100 - 1)) * saturation) / 100;\r\n const x = chroma * (1 - Math.abs(((hue / 60) % 2) - 1));\r\n const m = lightness / 100 - chroma / 2;\r\n let r = 0,\r\n g = 0,\r\n b = 0;\r\n\r\n if (hue >= 0 && hue < 60) {\r\n r = chroma;\r\n g = x;\r\n } else if (hue >= 60 && hue < 120) {\r\n r = x;\r\n g = chroma;\r\n } else if (hue >= 120 && hue < 180) {\r\n g = chroma;\r\n b = x;\r\n } else if (hue >= 180 && hue < 240) {\r\n g = x;\r\n b = chroma;\r\n } else if (hue >= 240 && hue < 300) {\r\n r = x;\r\n b = chroma;\r\n } else if (hue >= 300 && hue < 360) {\r\n r = chroma;\r\n b = x;\r\n }\r\n\r\n r = Math.round((r + m) * 255);\r\n g = Math.round((g + m) * 255);\r\n b = Math.round((b + m) * 255);\r\n\r\n return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;\r\n }\r\n\r\n private getColorForTag(tag: string): string {\r\n const hash = this.hashString(tag);\r\n const hue = (hash * 137) % 360; // Use a prime number to spread out the hues\r\n const saturation = 60 + (hash % 40); // Saturation between 60% and 100%\r\n const lightness = 50 + (hash % 30); // Lightness between 50% and 80%\r\n return this.hslToRgb(hue, saturation, lightness);\r\n }\r\n\r\n private getExcludedNodeIds(chain: CharChain, tags?: string[]): Set<number> {\r\n // get only the desired links\r\n const links = chain.links.filter((link) =>\r\n tags ? tags.includes(link.tag) : true\r\n );\r\n // return all the nodes not referenced by the links\r\n const excluded = new Set<number>();\r\n chain.nodes.forEach((node) => {\r\n excluded.add(node.id);\r\n });\r\n links.forEach((link) => {\r\n excluded.delete(link.sourceId);\r\n excluded.delete(link.targetId);\r\n });\r\n return excluded;\r\n }\r\n\r\n /**\r\n * Represent the received chain as a Graphviz digraph.\r\n *\r\n * @param chain The source chain if any.\r\n * @param tags The tags to show. When set, only the links with these tags are shown.\r\n * @param rankdir The rank direction.\r\n * @returns Graphviz representation of the chain.\r\n */\r\n public generateGraph(\r\n chain?: CharChain,\r\n tags?: string[],\r\n rankdir: GraphvizRankdir = 'LR'\r\n ): string {\r\n if (!chain) {\r\n return 'digraph G {}';\r\n }\r\n\r\n const sb: string[] = [];\r\n const excludedNodeIds = this.getExcludedNodeIds(chain, tags);\r\n\r\n sb.push('digraph G {');\r\n sb.push(' bgcolor=transparent;');\r\n sb.push(' node [style=filled];');\r\n sb.push(` rankdir=${rankdir};`);\r\n chain.nodes.forEach((node) => {\r\n // note that in label we must escape the double quotes\r\n sb.push(\r\n ` ${node.id} [label=\"${node.label === '\"' ? '\"' : node.label}\"` +\r\n (node.sourceTag\r\n ? ` fillcolor=\"${this.getColorForTag(node.sourceTag)}\"`\r\n : '') +\r\n (node.sourceTag && excludedNodeIds.has(node.id)\r\n ? ` xlabel=\"${node.sourceTag}\"`\r\n : '') +\r\n '];'\r\n );\r\n });\r\n chain.links.forEach((link) => {\r\n if (\r\n !link.sourceId ||\r\n !link.targetId ||\r\n (tags && !tags.includes(link.tag))\r\n ) {\r\n return;\r\n }\r\n const color = this.getColorForTag(link.tag);\r\n sb.push(\r\n ` ${link.sourceId} -> ${link.targetId} [label=\"${link.tag}\", color=\"${color}\"];`\r\n );\r\n });\r\n sb.push('}');\r\n return sb.join('\\n');\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n} from '@angular/core';\r\n\r\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Clipboard } from '@angular/cdk/clipboard';\r\n\r\nimport { VizComponent } from '@myrmidon/ngx-viz';\r\n\r\nimport {\r\n GraphvizRankdir,\r\n GveGraphvizService,\r\n} from '../../services/gve-graphviz.service';\r\nimport { CharChain } from '../../services/gve-api.service';\r\nimport { SettingsService } from '../../services/settings.service';\r\n\r\n@Component({\r\n selector: 'gve-chain-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n VizComponent\r\n],\r\n templateUrl: './chain-view.component.html',\r\n styleUrl: './chain-view.component.css',\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n})\r\nexport class ChainViewComponent implements OnDestroy {\r\n private readonly _sub?: Subscription;\r\n\r\n /**\r\n * The chain to display.\r\n */\r\n public readonly chain = input<CharChain | undefined>();\r\n\r\n /**\r\n * The direction of the graph.\r\n */\r\n public readonly direction = input<GraphvizRankdir>('LR');\r\n\r\n /**\r\n * All the distinct tags in the chain.\r\n */\r\n public readonly tags = computed(() => {\r\n const chain = this.chain();\r\n if (!chain) {\r\n return [];\r\n }\r\n const set = new Set<string>();\r\n for (const link of chain.links) {\r\n set.add(link.tag);\r\n }\r\n return Array.from(set).sort();\r\n });\r\n\r\n /**\r\n * The tags to show, or empty to show all of them.\r\n */\r\n public readonly selectedTags = model<string[]>([]);\r\n\r\n /**\r\n * The Graphviz representation of the chain.\r\n */\r\n public readonly graph = computed(() => {\r\n let tags: string[] | undefined = this.selectedTags();\r\n if (tags && tags.length === 0) {\r\n tags = undefined;\r\n }\r\n return this._graphviz.generateGraph(this.chain(), tags, this.direction());\r\n });\r\n\r\n public userTags: FormControl<string[]> = new FormControl([], {\r\n nonNullable: true,\r\n });\r\n\r\n constructor(\r\n private _graphviz: GveGraphvizService,\r\n private _settings: SettingsService,\r\n private _clipboard: Clipboard,\r\n private _snackbar: MatSnackBar\r\n ) {\r\n // when the user changes the tags, update the selected tags\r\n this._sub = this.userTags.valueChanges.subscribe((value: string[]) => {\r\n this.selectedTags.set([...value]);\r\n });\r\n\r\n effect(() => {\r\n // update the user tags when tags change\r\n const tags = this.tags();\r\n let userTags: string[] = [];\r\n if (tags.length > 1) {\r\n // pick first and last tag from tags\r\n userTags = [tags[0], tags[tags.length - 1]];\r\n } else {\r\n // if there is only one tag, pick it\r\n userTags = [...tags];\r\n }\r\n this.userTags.setValue(userTags);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public copyGraph(): void {\r\n const graph = this.graph();\r\n if (!graph) {\r\n return;\r\n }\r\n this._clipboard.copy(graph);\r\n this._snackbar.open('Graph copied to clipboard', 'OK', {\r\n duration: 2000,\r\n });\r\n }\r\n\r\n public openExternalEditor(): void {\r\n let url = this._settings.get<string>(\r\n 'graphviz-editor',\r\n 'https://dreampuf.github.io/GraphvizOnline?engine=dot#CODE'\r\n );\r\n if (!url) {\r\n return;\r\n }\r\n const graph = this.graph();\r\n if (!graph) {\r\n return;\r\n }\r\n if (url.indexOf('CODE') > -1) {\r\n url = url.replace('CODE', encodeURIComponent(graph));\r\n }\r\n window.open(url, '_blank');\r\n }\r\n}\r\n","<div id=\"container\">\r\n <div>\r\n <ngx-viz [code]=\"graph()\" />\r\n </div>\r\n <div class=\"button-row\">\r\n <!-- select -->\r\n <mat-form-field>\r\n <mat-label>tags</mat-label>\r\n <mat-select [formControl]=\"userTags\" multiple>\r\n @for (tag of tags(); track tag) {\r\n <mat-option [value]=\"tag\">{{ tag }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- copy -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy graphviz code\"\r\n [disabled]=\"!graph()\"\r\n (click)=\"copyGraph()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <!--editor -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open in editor\"\r\n [disabled]=\"!graph()\"\r\n (click)=\"openExternalEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n computed,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n/**\r\n * 🔑 `gve-ln-heights-editor`\r\n *\r\n * A component to edit line heights.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `lineCount` (`number`): the number of lines.\r\n * - ▶️ `heights` (`Record<number, number>`): the line heights.\r\n * - 🔥 `heightsChange` (`EventEmitter<Record<number, number>>`): the event\r\n * emitted when the heights change.\r\n */\r\n@Component({\r\n selector: 'gve-ln-heights-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './ln-heights-editor.component.html',\r\n styleUrl: './ln-heights-editor.component.css',\r\n})\r\nexport class LnHeightsEditorComponent implements OnInit, OnDestroy {\r\n private _subs?: Subscription[];\r\n private _heights?: Record<number, number>;\r\n\r\n public lineNumber: FormControl<number>;\r\n public height: FormControl<number>;\r\n\r\n /**\r\n * The total number of lines in the text.\r\n */\r\n public readonly lineCount = input<number>(0);\r\n\r\n /**\r\n * The heights map of the lines. Each key is a line number and the value is\r\n * the height of the line.\r\n */\r\n public readonly heights = input<Record<number, number> | undefined>();\r\n\r\n /**\r\n * The event emitted when the heights change.\r\n */\r\n public readonly heightsChange = output<Record<number, number> | undefined>();\r\n\r\n // when lineCount changes, update lineNumbers\r\n public readonly lineNumbers = computed(() =>\r\n Array.from({ length: this.lineCount() }, (_, i) => i + 1)\r\n );\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.lineNumber = formBuilder.control(0, { nonNullable: true });\r\n this.height = formBuilder.control(0, { nonNullable: true });\r\n }\r\n\r\n private pruneHeights(): void {\r\n // remove all the heigths with value=0\r\n this._heights = Object.fromEntries(\r\n Object.entries(this._heights || {}).filter(([_, v]) => v !== 0)\r\n );\r\n // if heights are now empty, set to undefined\r\n if (Object.keys(this._heights).length === 0) {\r\n this._heights = undefined;\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [];\r\n // update heights[ln] when height changes and emit heightsChange\r\n this._subs.push(\r\n this.height.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) {\r\n this._heights = {};\r\n }\r\n const ln = this.lineNumber.value;\r\n const newHeights = { ...(this._heights || {}) };\r\n newHeights[ln] = value;\r\n this._heights = Object.fromEntries(\r\n Object.entries(newHeights).filter(([_, v]) => v !== 0)\r\n );\r\n if (Object.keys(this._heights).length === 0) {\r\n this._heights = undefined;\r\n }\r\n this.heightsChange.emit(this._heights);\r\n })\r\n );\r\n\r\n // update height when line number changes\r\n this._subs.push(\r\n this.lineNumber.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) return;\r\n this.height.setValue(this._heights[value] || 0);\r\n })\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subs?.forEach((sub) => sub.unsubscribe());\r\n }\r\n\r\n public reset(): void {\r\n this._heights = undefined;\r\n this.heightsChange.emit(undefined);\r\n }\r\n}\r\n","@if (lineNumbers().length) {\r\n <div class=\"form-row\">\r\n <!-- line number -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>line</mat-label>\r\n <mat-select [formControl]=\"lineNumber\">\r\n @for (n of lineNumbers(); track n) {\r\n <mat-option [value]=\"n\">\r\n {{ n }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n @if (lineNumber.value) {\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input matInput type=\"number\" [formControl]=\"height\" min=\"0\" />\r\n </mat-form-field>\r\n }\r\n\r\n <!-- reset button -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Remove all the heights\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </div>\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n model,\r\n OnInit,\r\n Optional,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharNode, SnapshotViewService } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { PayloadMatDialogConfig } from '../../models';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-text-editor`\r\n *\r\n * A component to edit a snapshot text. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `text` (`CharNode[]`): the text to edit.\r\n * - 🔥 `textChange` (`CharNode[]`): event emitted when text changes.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './snapshot-text-editor.component.html',\r\n styleUrl: './snapshot-text-editor.component.css',\r\n})\r\nexport class SnapshotTextEditorComponent implements OnInit {\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public readonly text = model<CharNode[]>([]);\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<SnapshotTextEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ text?: CharNode[] }>\r\n ) {\r\n this.userText = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(5000)],\r\n });\r\n this.form = new FormGroup({\r\n userText: this.userText,\r\n });\r\n\r\n // when text changes, update the user text\r\n effect(() => {\r\n this.updateUserText(this.text());\r\n });\r\n }\r\n\r\n private updateUserText(nodes: CharNode[]): void {\r\n this.userText.setValue(nodes.map((node) => node.data).join(''));\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.text) {\r\n this.text.set(this.data.payload.text);\r\n }\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userText.setValue(this.userText.value.trim());\r\n if (!this.userText.value) {\r\n return;\r\n }\r\n this.text.set(SnapshotViewService.stringToBaseChars(this.userText.value));\r\n this.dialogRef?.close(this.text());\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Set Base Text</h2>\r\n </div>\r\n }\r\n <form [formGroup]=\"form\" (submit)=\"save()\">\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>base text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"8\"></textarea>\r\n @if ($any(userText).errors?.required && (userText.dirty ||\r\n userText.touched)) {\r\n <mat-error>text required</mat-error>\r\n } @if ($any(userText).errors?.maxLength && (userText.dirty ||\r\n userText.touched)) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Set base text\"\r\n [disabled]=\"form.invalid\"\r\n (click)=\"save()\"\r\n >\r\n set\r\n </button>\r\n </div>\r\n </fieldset>\r\n </form>\r\n</div>\r\n","import {\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { customAlphabet } from 'nanoid';\r\n\r\nimport { deepCopy, FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharDecoration,\r\n CharNode,\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS,\r\n Feature,\r\n GveAnimationTimeline,\r\n GveVisualEvent,\r\n Snapshot,\r\n SnapshotViewComponent,\r\n SnapshotViewData,\r\n SnapshotViewRenderEvent,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationEditorComponent,\r\n FeatureDefinitions,\r\n} from '../chain-operation-editor/chain-operation-editor.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChain,\r\n CharChainResult,\r\n GveApiService,\r\n} from '../../services/gve-api.service';\r\nimport { ChainResultViewComponent } from '../chain-result-view/chain-result-view.component';\r\nimport { LnHeightsEditorComponent } from '../ln-heights-editor/ln-heights-editor.component';\r\nimport { AnimationTimelineSetComponent } from '../animation-timeline-set/animation-timeline-set.component';\r\nimport { BatchOperationEditorComponent } from '../batch-operation-editor/batch-operation-editor.component';\r\nimport { SnapshotTextEditorComponent } from '../snapshot-text-editor/snapshot-text-editor.component';\r\nimport { ChainViewComponent } from '../chain-view/chain-view.component';\r\n\r\n// default snapshot view title\r\nconst VIEW_TITLE = 'preview';\r\n\r\n// suffix for IDs of SVG elements to be made transparent at first rendition\r\nconst SVG_TRANSP_SUFFIX = '_t';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-editor`\r\n *\r\n * A component to edit a text snapshot. This is the top level component in the GVE core\r\n * library.\r\n *\r\n * - ▶️ `snapshot` (`Snapshot`): the snapshot to edit.\r\n * - ▶️ `batchOps` (`string`): the batch operations text to set for the editor.\r\n * - ▶️ `noSave` (`boolean`): true to disable saving.\r\n * - 🔥 `snapshotChange` (`Snapshot`): emitted when the user saves the edited snapshot.\r\n * - 🔥 `snapshotCancel` (`void`): emitted when the user cancels the snapshot editing.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-editor',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatSliderModule,\r\n MatSlideToggle,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ChainOperationEditorComponent,\r\n ChainResultViewComponent,\r\n BaseTextViewComponent,\r\n LnHeightsEditorComponent,\r\n AnimationTimelineSetComponent,\r\n FlatLookupPipe,\r\n ChainViewComponent,\r\n ],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './snapshot-editor.component.html',\r\n styleUrl: './snapshot-editor.component.css',\r\n})\r\nexport class SnapshotEditorComponent {\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n private _renderer?: SnapshotViewService;\r\n private _previewing?: boolean;\r\n private _transparentIds?: string[];\r\n private _stepPickFrozen?: boolean;\r\n private _handlingOver?: boolean;\r\n private _lastOverId?: string;\r\n\r\n @ViewChild('snapshotView', { static: false })\r\n public snapshotView?: ElementRef<SnapshotViewComponent>;\r\n\r\n /**\r\n * The snapshot to edit.\r\n */\r\n public readonly snapshot = model<Snapshot | undefined>();\r\n\r\n /**\r\n * The batch operations text to set for the editor.\r\n */\r\n public readonly batchOps = input<string | undefined>();\r\n\r\n /**\r\n * True to disable saving.\r\n */\r\n public readonly noSave = input<boolean | undefined>();\r\n\r\n /**\r\n * True to enable debug mode for view rendition.\r\n */\r\n public readonly debug = input<boolean | undefined>();\r\n\r\n /**\r\n * True to not show character decoration according to the trace\r\n * features in nodes.\r\n */\r\n public readonly noDecoration = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for element features, including names and values.\r\n */\r\n public readonly elementFeatureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Definitions for diplomatic features, including names and values.\r\n */\r\n public readonly diplomaticFeatureDefs = input<\r\n FeatureDefinitions | undefined\r\n >();\r\n\r\n /**\r\n * Emitted when the user cancels the snapshot editing.\r\n */\r\n public readonly snapshotCancel = output();\r\n\r\n // general\r\n public width: FormControl<number>;\r\n public height: FormControl<number>;\r\n public style: FormControl<string | null>;\r\n // base text\r\n public baseText: FormControl<CharNode[]>;\r\n public offsetX: FormControl<number>;\r\n public offsetY: FormControl<number>;\r\n public lineHeightOffset: FormControl<number>;\r\n public lnHeights: FormControl<Record<number, number> | null>;\r\n public charSpacingOffset: FormControl<number>;\r\n public spcWidthOffset: FormControl<number>;\r\n public textStyle: FormControl<string | null>;\r\n // operations\r\n public operations: FormControl<CharChainOperation[]>;\r\n public opStyle: FormControl<string | null>;\r\n public form: FormGroup;\r\n // image and defs\r\n public imageUrl: FormControl<string | null>;\r\n public imageOpacity: FormControl<number>;\r\n public imageX: FormControl<number>;\r\n public imageY: FormControl<number>;\r\n public imageWidth: FormControl<number>;\r\n public imageHeight: FormControl<number>;\r\n public defs: FormControl<string | null>;\r\n // timelines\r\n public timelines: FormControl<GveAnimationTimeline[]>;\r\n\r\n public readonly showChain: FormControl<boolean> = new FormControl<boolean>(\r\n false,\r\n { nonNullable: true }\r\n );\r\n public readonly featDetails: FormControl<boolean> = new FormControl<boolean>(\r\n false,\r\n { nonNullable: true }\r\n );\r\n\r\n public readonly chain = signal<CharChain | undefined>(undefined);\r\n\r\n // list of operations output tags\r\n public readonly opTags = signal<string[]>([]);\r\n // list of operation diplomatic.g element IDs\r\n public readonly opElementIds = signal<string[]>([]);\r\n // the currently picked base text range\r\n public readonly textRange = signal<VarBaseTextRange | undefined>(undefined);\r\n // the lines count for the current base text\r\n public readonly lineCount = signal<number>(0);\r\n // the currently edited operation\r\n public readonly editedOp = signal<CharChainOperation | undefined>(undefined);\r\n public readonly editedOpIndex = signal<number>(-1);\r\n // the patch to apply to the edited operation's range\r\n public readonly editedOpRangePatch = signal<VarBaseTextRange | undefined>(\r\n undefined\r\n );\r\n\r\n public readonly busy = signal<boolean>(false);\r\n\r\n public readonly opTypeMap = {\r\n 0: 'replace',\r\n 1: 'delete',\r\n 2: 'add-before',\r\n 3: 'add-after',\r\n 4: 'move-before',\r\n 5: 'move-after',\r\n 6: 'swap',\r\n 7: 'annotate',\r\n };\r\n\r\n // snapshot view data\r\n public viewTitle = VIEW_TITLE;\r\n public viewData?: SnapshotViewData;\r\n public visualInfo?: string;\r\n public rulers = true;\r\n\r\n // operations execution result\r\n public result?: CharChainResult;\r\n public resultOperationId?: string;\r\n public initialStepIndex = -1;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n private _dialog: MatDialog,\r\n private _dialogService: DialogService,\r\n private _snackbar: MatSnackBar\r\n ) {\r\n // general\r\n this.width = new FormControl<number>(800, { nonNullable: true });\r\n this.height = new FormControl<number>(600, { nonNullable: true });\r\n this.style = new FormControl<string | null>(null);\r\n // base text\r\n this.baseText = new FormControl<CharNode[]>([], {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n });\r\n this.offsetX = new FormControl<number>(0, { nonNullable: true });\r\n this.offsetY = new FormControl<number>(0, { nonNullable: true });\r\n this.lineHeightOffset = new FormControl<number>(\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS.lineHeightOffset,\r\n { nonNullable: true }\r\n );\r\n this.lnHeights = new FormControl<Record<number, number> | null>(null);\r\n this.charSpacingOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.spcWidthOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.textStyle = new FormControl<string | null>(null);\r\n\r\n // operations\r\n this.operations = new FormControl<CharChainOperation[]>([], {\r\n nonNullable: true,\r\n });\r\n this.opStyle = new FormControl<string | null>(null);\r\n // image\r\n this.imageUrl = new FormControl<string | null>(null);\r\n this.imageOpacity = new FormControl<number>(1, { nonNullable: true });\r\n this.imageX = new FormControl<number>(0, { nonNullable: true });\r\n this.imageY = new FormControl<number>(0, { nonNullable: true });\r\n this.imageWidth = new FormControl<number>(0, { nonNullable: true });\r\n this.imageHeight = new FormControl<number>(0, { nonNullable: true });\r\n this.defs = new FormControl<string | null>(null);\r\n\r\n // timelines\r\n this.timelines = new FormControl<GveAnimationTimeline[]>([], {\r\n nonNullable: true,\r\n });\r\n\r\n // form\r\n this.form = formBuilder.group({\r\n width: this.width,\r\n height: this.height,\r\n style: this.style,\r\n baseText: this.baseText,\r\n offsetX: this.offsetX,\r\n offsetY: this.offsetY,\r\n lineHeightOffset: this.lineHeightOffset,\r\n lnHeights: this.lnHeights,\r\n charSpacingOffset: this.charSpacingOffset,\r\n spcWidthOffset: this.spcWidthOffset,\r\n textStyle: this.textStyle,\r\n operations: this.operations,\r\n opStyle: this.opStyle,\r\n // image\r\n imageUrl: this.imageUrl,\r\n imageOpacity: this.imageOpacity,\r\n imageX: this.imageX,\r\n imageY: this.imageY,\r\n imageWidth: this.imageWidth,\r\n imageHeight: this.imageHeight,\r\n defs: this.defs,\r\n // timelines\r\n timelines: this.timelines,\r\n });\r\n\r\n // when snapshot changes, update the form\r\n effect(() => {\r\n this.updateForm(this.snapshot());\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n });\r\n }\r\n\r\n /**\r\n * Set the view data for the snapshot view.\r\n *\r\n * @param snapshot The optional snapshot data to use. If not provided,\r\n * a snapshot will be created from the form data.\r\n * @param title The optional title to set for the view.\r\n */\r\n private setViewData(snapshot?: Snapshot, title = VIEW_TITLE): void {\r\n console.log('set view data');\r\n\r\n // get the snapshot to use\r\n if (!snapshot) {\r\n snapshot = this.getSnapshot();\r\n }\r\n\r\n // update view data\r\n this.viewTitle = title;\r\n this.visualInfo = undefined;\r\n this.viewData = {\r\n snapshot: snapshot,\r\n options: {\r\n debug: this.debug(),\r\n delayedRender: true,\r\n showRulers: true,\r\n showGrid: true,\r\n panZoom: true,\r\n transparentIds: this._transparentIds,\r\n },\r\n };\r\n\r\n console.log('view data: ', this.viewData);\r\n }\r\n\r\n private updateForm(snapshot: Snapshot | undefined) {\r\n this._transparentIds = undefined;\r\n this.initialStepIndex = -1;\r\n\r\n if (!snapshot) {\r\n this.form.reset();\r\n } else {\r\n this.width.setValue(snapshot.size.width);\r\n this.height.setValue(snapshot.size.height);\r\n this.style.setValue(snapshot.style || null);\r\n this.imageUrl.setValue(snapshot.image?.url || null);\r\n this.imageOpacity.setValue(snapshot.image?.opacity || 0);\r\n this.imageX.setValue(snapshot.image?.canvas?.x || 0);\r\n this.imageY.setValue(snapshot.image?.canvas?.y || 0);\r\n this.imageWidth.setValue(snapshot.image?.canvas?.width || 0);\r\n this.imageHeight.setValue(snapshot.image?.canvas?.height || 0);\r\n this.defs.setValue(snapshot.defs || null);\r\n if (Array.isArray(snapshot.text)) {\r\n this.baseText.setValue(snapshot.text);\r\n } else {\r\n this.baseText.setValue(\r\n SnapshotViewService.stringToBaseChars(snapshot.text)\r\n );\r\n }\r\n this.offsetX.setValue(snapshot.textOptions?.offset?.x || 0);\r\n this.offsetY.setValue(snapshot.textOptions?.offset?.y || 0);\r\n this.lineHeightOffset.setValue(snapshot.textOptions?.lineHeightOffset);\r\n this.lnHeights.setValue(snapshot.textOptions?.minLineHeights || null);\r\n this.charSpacingOffset.setValue(snapshot.textOptions?.charSpacingOffset);\r\n this.spcWidthOffset.setValue(snapshot.textOptions?.spcWidthOffset);\r\n this.textStyle.setValue(snapshot.textStyle || null);\r\n this.operations.setValue(snapshot.operations);\r\n this.opStyle.setValue(snapshot.opStyle || null);\r\n // timelines\r\n const timelines: GveAnimationTimeline[] = [];\r\n if (snapshot.timelines) {\r\n for (let tag in snapshot.timelines) {\r\n timelines.push(snapshot.timelines[tag]);\r\n }\r\n }\r\n this.timelines.setValue(timelines);\r\n }\r\n this.updateLineCount(this.baseText.value);\r\n this.updateOpLists();\r\n\r\n this.form.markAsPristine();\r\n }\r\n\r\n // #region base text\r\n public inputBaseText(): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(SnapshotTextEditorComponent, {\r\n data: { payload: { text: [...this.baseText.value] } },\r\n width: '80%',\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((text: CharNode[]) => {\r\n if (text?.length) {\r\n // update the form control and reset the current text range\r\n this.baseText.setValue(text);\r\n this.baseText.updateValueAndValidity();\r\n this.baseText.markAsDirty();\r\n this.textRange.set(undefined);\r\n\r\n // update the line count\r\n this.updateLineCount(text);\r\n\r\n // remove all operations and update the view data\r\n this.removeAllOperations();\r\n\r\n // remove all timelines\r\n this.timelines.reset();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the line count based on the received text.\r\n * @param text The text to use for counting lines.\r\n */\r\n private updateLineCount(text: CharNode[]) {\r\n if (!text.length) {\r\n this.lineCount.set(0);\r\n } else {\r\n this.lineCount.set(text.filter((c) => c.data === '\\n').length + 1);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by the base text editor to pick a text range.\r\n * @param range The picked range.\r\n * @param applyToOp True to also apply the picked range to the edited operation.\r\n */\r\n public onRangePick(range?: VarBaseTextRange, applyToOp = false): void {\r\n this.textRange.set(range);\r\n\r\n if (applyToOp) {\r\n this.editedOpRangePatch.set({ ...range } as VarBaseTextRange);\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region operations\r\n /**\r\n * Update the lists of operation output tags and element IDs by collecting\r\n * all the operation tags and the IDs of the elements in their diplomatic.g\r\n * SVG code if any.\r\n */\r\n private updateOpLists() {\r\n const tags = new Set<string>();\r\n const ids = new Set<string>();\r\n\r\n let n = 0;\r\n for (const op of this.operations.value) {\r\n // output tag\r\n n++;\r\n tags.add(op.outputTag || `v${n}`);\r\n\r\n // element IDs\r\n if (op.diplomatics?.g) {\r\n this.parseSvgIds(op.diplomatics.g)?.forEach((id) => ids.add(id));\r\n }\r\n }\r\n\r\n this.opTags.set([...tags]);\r\n this.opElementIds.set([...ids]);\r\n }\r\n\r\n /**\r\n * Edit a new operation.\r\n */\r\n public editNewOperation() {\r\n // create a new operation and edit it, using as the initial range\r\n // the base text range if any\r\n const range = this.textRange();\r\n\r\n this.editedOp.set({\r\n id: this._nanoid(),\r\n type: 0,\r\n at: range?.at || 0,\r\n run: range?.run || 1,\r\n });\r\n this.editedOpIndex.set(-1);\r\n }\r\n\r\n /**\r\n * Edit (a copy of) the operation at the specified index.\r\n * @param index The operation index.\r\n */\r\n public editOperation(index: number) {\r\n this.editedOpIndex.set(index);\r\n this.editedOp.set(deepCopy(this.operations.value[index]));\r\n }\r\n\r\n /**\r\n * Close the currently edited operation.\r\n */\r\n private closeEditedOperation() {\r\n this.editedOpIndex.set(-1);\r\n this.editedOp.set(undefined);\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to cancel\r\n * the current operation edits.\r\n */\r\n public onOperationCancel() {\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to change\r\n * the currently edited operation, or add a new one if that\r\n * was a new operation.\r\n * @param op The changed operation.\r\n */\r\n public onOperationChange(op?: CharChainOperation | null) {\r\n if (!op) {\r\n return;\r\n }\r\n console.log('operation change');\r\n const operations = [...this.operations.value];\r\n\r\n // replace or add the operation\r\n let i = this.editedOpIndex();\r\n if (this.editedOpIndex() > -1) {\r\n operations.splice(this.editedOpIndex(), 1, op);\r\n } else {\r\n operations.push(op);\r\n i = operations.length - 1;\r\n }\r\n\r\n // update the operations form control\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // update the operation lists\r\n this.updateOpLists();\r\n\r\n // run to the edited operation\r\n this.runTo(i);\r\n\r\n // close the edited operation\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Delete the operation at the specified index.\r\n * @param index The index of the operation to delete.\r\n */\r\n public deleteOperation(index: number) {\r\n this._dialogService\r\n .confirm(\r\n 'Confirm Deletion',\r\n `Delete operation \"${this.operations.value[index].id}\"?`\r\n )\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n // close the edited operation if it is the one being deleted\r\n if (this.editedOpIndex() === index) {\r\n this.closeEditedOperation();\r\n }\r\n // reset the result operation ID if it is the one being deleted\r\n if (this.resultOperationId === this.operations.value[index].id) {\r\n this.resultOperationId = undefined;\r\n }\r\n // delete the operation and update the form control\r\n const operations = [...this.operations.value];\r\n operations.splice(index, 1);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // update the operation lists\r\n this.updateOpLists();\r\n\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Parse the operations from their text and append them to the current\r\n * snapshot operations.\r\n */\r\n public parseOperations() {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(BatchOperationEditorComponent, {\r\n data: { preset: this.batchOps },\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((batchOps: CharChainOperation[]) => {\r\n if (batchOps) {\r\n const operations = [...this.operations.value];\r\n operations.push(...batchOps);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n // update the operation lists\r\n this.updateOpLists();\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove all the operations, close the edited operation and update the view data.\r\n */\r\n private removeAllOperations(): void {\r\n this.resultOperationId = undefined;\r\n this.closeEditedOperation();\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.opTags.set([]);\r\n this.opElementIds.set([]);\r\n this.setViewData();\r\n this.result = undefined;\r\n }\r\n\r\n /**\r\n * Remove all the operations.\r\n */\r\n public clearOperations(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Remove all operations?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.removeAllOperations();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Parse all the id attributes from the received SVG code and\r\n * return them as an array.\r\n *\r\n * @param svg The SVG content to parse or undefined.\r\n * @returns Array of IDs found in the SVG content or undefined.\r\n */\r\n private parseSvgIds(svg?: string): string[] | undefined {\r\n if (!svg) {\r\n return undefined;\r\n }\r\n\r\n const regex = /<[^>]+\\bid=([\"'])(.*?)\\1/g;\r\n const ids: string[] = [];\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(svg)) !== null) {\r\n ids.push(match[2]);\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n private getTransparentIds(g?: string): string[] | undefined {\r\n if (!g) {\r\n return undefined;\r\n }\r\n return this.parseSvgIds(g)?.filter((id) => id.endsWith(SVG_TRANSP_SUFFIX));\r\n }\r\n\r\n /**\r\n * Supply operation nodes to the snapshot text nodes. An execution result is\r\n * a compact object, so that to build a snapshot accumulating all the nodes\r\n * and their features up to the last executed operation, we need to start\r\n * with the base text nodes, and then examine each execution step in the\r\n * result. Each step contains only those nodes used by the version of the\r\n * text corresponding to its stage. Among them, some are new nodes, and some\r\n * are base text nodes. Also, the step contains the full set of features\r\n * current at its time, both for the text as a whole and for each node.\r\n * This method accumulates the nodes and their features up to the specified\r\n * step, updating the features of the nodes already present in the snapshot\r\n * text nodes, and adding the new nodes.\r\n *\r\n * @param snapshot The snapshot to supply the nodes to.\r\n * @param result The operations execution result.\r\n * @param tag The output tag of the operation to supply the nodes from.\r\n */\r\n private supplyOpNodes(\r\n snapshot: Snapshot,\r\n result: CharChainResult,\r\n tag: string\r\n ): void {\r\n // get the original nodes from the snapshot base text\r\n const nodes = snapshot.text as CharNode[];\r\n\r\n // find the max ID in the original nodes, so that any ID greater than it\r\n // belongs to new nodes\r\n const maxOriginalId = nodes.reduce((max, n) => Math.max(max, n.id), 0);\r\n const stepIndex = result.steps.findIndex((s) => s.outputTag === tag);\r\n\r\n // for each step up to the specified one, add the nodes introduced by the step\r\n // and update the features from each step node that is already present\r\n for (let i = 0; i <= stepIndex; i++) {\r\n // get the nodes of the step\r\n const stepNodes = result.taggedNodes[result.steps[i].outputTag];\r\n\r\n for (const stepNode of stepNodes) {\r\n // if the node was added, add it\r\n if (\r\n stepNode.id > maxOriginalId &&\r\n !nodes.find((n) => n.id === stepNode.id)\r\n ) {\r\n nodes.push(stepNode);\r\n } else {\r\n // if the node was already in the original nodes, update its features\r\n const existing = nodes.findIndex((n) => n.id === stepNode.id);\r\n if (existing > -1) {\r\n nodes[existing].features = stepNode.features;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // update the snapshot text nodes\r\n snapshot.text = nodes;\r\n }\r\n\r\n /**\r\n * Run the operations up to the specified index (included).\r\n * This is called when:\r\n * - a preview is requested by the operation editor.\r\n * - the currently edited operation is saved.\r\n * - the user picks a step in the chain result view.\r\n * - runToLast is called, which happens when:\r\n * - setting the snapshot.\r\n * - parsing a batch of operations.\r\n * - deleting an operation.\r\n *\r\n * @param index The index of the operation to run to.\r\n * @param lastOperation The operation to use in place of the existing\r\n * operation in the snapshot at index. This is used when previewing\r\n * the edited operation from within the operation editor.\r\n * @returns A promise that resolves to the execution result.\r\n */\r\n public runTo(index: number, lastOperation?: CharChainOperation): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n console.log('run to: ' + index);\r\n\r\n // get the snapshot to run operations on\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n\r\n // remove from the snapshot the operations past the specified index,\r\n // also replacing the last operation when this was received as a parameter\r\n if (lastOperation) {\r\n snapshot.operations = snapshot.operations.slice(0, index);\r\n snapshot.operations.push(lastOperation);\r\n } else {\r\n lastOperation = snapshot.operations[index];\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n }\r\n\r\n // update result operation ID\r\n this.resultOperationId = snapshot.operations[index].id;\r\n\r\n // extract the IDs from the last operation's diplomatics and filter\r\n // them so that only the ones ending with _t are kept. By convention,\r\n // all the IDs ending with this suffix are to be made invisible at\r\n // their first rendition (opacity=0). An animation will then make\r\n // them visible.\r\n this._transparentIds = this.getTransparentIds(\r\n snapshot.operations[index].diplomatics?.g\r\n );\r\n\r\n // run the operations\r\n this.busy.set(true);\r\n this.initialStepIndex = index;\r\n this._api\r\n .runOperations(snapshot.text as CharNode[], snapshot.operations)\r\n .subscribe({\r\n next: (wrapper) => {\r\n // handle operation (non-fatal) error or result\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n return;\r\n }\r\n\r\n // set the result\r\n console.log('result:', wrapper.result);\r\n this.result = wrapper.result;\r\n\r\n // supply the last operation output tag from its result step if not set\r\n if (!lastOperation.outputTag) {\r\n const step = wrapper.result!.steps.find(\r\n (s) => s.operation.id === lastOperation.id\r\n );\r\n lastOperation.outputTag = step!.outputTag;\r\n }\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(\r\n snapshot,\r\n wrapper.result!,\r\n lastOperation.outputTag\r\n );\r\n\r\n // update the view data\r\n this.setViewData(snapshot, lastOperation!.outputTag);\r\n\r\n // play animation if any\r\n const tl = this.timelines.value.find(\r\n (t) => t.tag === lastOperation!.outputTag\r\n );\r\n if (tl) {\r\n // play the timeline\r\n setTimeout(() => {\r\n this.playTimeline(tl);\r\n }, 0);\r\n }\r\n\r\n // get the chain model if requested\r\n if (this.showChain.value) {\r\n this.getChainAt(index);\r\n }\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._transparentIds = undefined;\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Run the operations up to the last operation if any, updating the\r\n * execution result. The execution result is always the result from\r\n * all the operations, as users must be able to browse across its steps.\r\n */\r\n public runToLast(): void {\r\n if (this.operations.value.length) {\r\n this.runTo(this.operations.value.length - 1);\r\n } else {\r\n this.setViewData();\r\n this.result = undefined;\r\n }\r\n }\r\n\r\n public getChainAt(index: number, lastOperation?: CharChainOperation): void {\r\n // get the snapshot to run operations on\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n\r\n // remove from the snapshot the operations past the specified index,\r\n // also replacing the last operation when this was received as a parameter\r\n if (lastOperation) {\r\n snapshot.operations = snapshot.operations.slice(0, index);\r\n snapshot.operations.push(lastOperation);\r\n } else {\r\n lastOperation = snapshot.operations[index];\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n }\r\n this.busy.set(true);\r\n this._api\r\n .getChain(snapshot.text as CharNode[], snapshot.operations)\r\n .subscribe({\r\n next: (wrapper) => {\r\n // handle operation (non-fatal) error or result\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n this.chain.set(undefined);\r\n } else {\r\n this.chain.set(wrapper.result);\r\n }\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._transparentIds = undefined;\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update the snapshot view by running the operations up to the\r\n * currently edited operation if any.\r\n *\r\n * @param operation The operation being previewed.\r\n */\r\n public onOperationPreview(operation: CharChainOperation): void {\r\n // no multiple previews or previewing a new operation\r\n if (this._previewing || this.editedOpIndex() < 0) {\r\n return;\r\n }\r\n this._previewing = true;\r\n setTimeout(() => {\r\n this.runTo(this.editedOpIndex(), operation);\r\n this._previewing = false;\r\n }, 0);\r\n }\r\n // #endregion\r\n\r\n private playTimeline(tl: GveAnimationTimeline): void {\r\n const shadowRoot = this.snapshotView?.nativeElement?.shadowRoot;\r\n if (tl && shadowRoot) {\r\n console.log('play timeline', tl);\r\n this._renderer?.playTimeline(tl, undefined, shadowRoot);\r\n } else {\r\n if (!this.snapshotView) {\r\n console.warn('no snapshotView for timeline');\r\n } else {\r\n console.warn('no shadowRoot for timeline');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by the chain result view to pick a step.\r\n *\r\n * @param step The step to pick.\r\n */\r\n public onStepPick(step: ChainOperationContextStep): void {\r\n if (!this.result || this._stepPickFrozen) {\r\n return;\r\n }\r\n\r\n // get base text snapshot\r\n const snapshot = this.getSnapshot();\r\n\r\n // get the step index\r\n const index = snapshot.operations.findIndex(\r\n (o) => o.id === step.operation.id\r\n );\r\n\r\n // remove snapshot operations after the picked step to avoid\r\n // their visuals creep into the snapshot view\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n\r\n // update result operation ID\r\n this.resultOperationId = snapshot.operations[index].id;\r\n\r\n // extract the IDs from the last operation's diplomatics and filter\r\n // them so that only the ones ending with _t are kept. By convention,\r\n // all the IDs ending with this suffix are to be made invisible at\r\n // their first rendition (opacity=0). An animation will then make\r\n // them visible.\r\n this._transparentIds = this.getTransparentIds(\r\n snapshot.operations[index].diplomatics?.g\r\n );\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(snapshot, this.result, step.outputTag);\r\n\r\n // update the view data\r\n this.setViewData(snapshot, step.outputTag);\r\n\r\n // play animation if any\r\n const tl = this.timelines.value.find((t) => t.tag === step.outputTag);\r\n if (tl) {\r\n // play the timeline\r\n setTimeout(() => {\r\n this.playTimeline(tl);\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by a visual in the snapshot view.\r\n *\r\n * @param event The event.\r\n */\r\n public onVisualEvent(event: CustomEvent<GveVisualEvent>): void {\r\n if (this._handlingOver) {\r\n return;\r\n }\r\n const d = event.detail;\r\n\r\n if (d.event.type === 'mouseover') {\r\n const visual = d.source;\r\n if (visual.id === this._lastOverId) {\r\n return;\r\n }\r\n this._handlingOver = true;\r\n const sb: string[] = [];\r\n // id (type)\r\n sb.push('#' + visual.id);\r\n sb.push(` (${visual.type})`);\r\n // : label and features\r\n if (visual.data?.label) {\r\n sb.push(': ');\r\n sb.push(visual.data.label);\r\n }\r\n if (visual.data?.features?.length) {\r\n sb.push(' ');\r\n sb.push(\r\n visual.data.features\r\n .map((f: Feature) => `${f.name}=${f.value}`)\r\n .join('\\n')\r\n );\r\n }\r\n // (@x,y width×height)\r\n sb.push(\r\n ` (@${visual.x.toFixed(1)},${visual.y.toFixed(1)} ` +\r\n `◻${visual.width.toFixed(1)}×${visual.height.toFixed(1)})`\r\n );\r\n this.visualInfo = sb.join('');\r\n this._lastOverId = visual.id;\r\n }\r\n\r\n this._handlingOver = false;\r\n }\r\n\r\n /**\r\n * Handle the change of line heights by updating the form control.\r\n *\r\n * @param heights The line heights.\r\n */\r\n public onHeightsChange(heights: Record<number, number> | undefined): void {\r\n this.lnHeights.setValue(heights || null);\r\n this.lnHeights.markAsDirty();\r\n this.lnHeights.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Handle the change of timelines by updating the form control.\r\n *\r\n * @param timelines The timelines.\r\n */\r\n public onTimelinesChange(timelines?: GveAnimationTimeline[] | null): void {\r\n if (!timelines) {\r\n return;\r\n }\r\n this.timelines.setValue(timelines);\r\n this.timelines.markAsDirty();\r\n this.timelines.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Emit the cancel event for this snapshot edit.\r\n */\r\n public close(): void {\r\n this.snapshotCancel.emit();\r\n }\r\n\r\n /**\r\n * Handle the render event from the snapshot view to get a reference\r\n * to the renderer.\r\n *\r\n * @param event The rendition event.\r\n */\r\n public onSnapshotRender(event: CustomEvent<SnapshotViewRenderEvent>): void {\r\n this._renderer = (event.detail as SnapshotViewRenderEvent).renderer;\r\n }\r\n\r\n public onImageLoad(imageElement: HTMLImageElement) {\r\n const size = {\r\n width: imageElement.naturalWidth,\r\n height: imageElement.naturalHeight,\r\n };\r\n if (!this.imageWidth.value) {\r\n this.imageWidth.setValue(size.width);\r\n this.imageWidth.updateValueAndValidity();\r\n this.imageWidth.markAsDirty();\r\n }\r\n if (!this.imageHeight.value) {\r\n this.imageHeight.setValue(size.height);\r\n this.imageHeight.updateValueAndValidity();\r\n this.imageHeight.markAsDirty();\r\n }\r\n }\r\n\r\n public onImageOpacityChange(value: number): void {\r\n this.imageOpacity.setValue(value);\r\n this.imageOpacity.updateValueAndValidity();\r\n this.imageOpacity.markAsDirty();\r\n if (this._renderer) {\r\n this._renderer.setImageOpacity(value);\r\n }\r\n }\r\n\r\n public resetImgMetadata(): void {\r\n this.imageX.reset();\r\n this.imageY.reset();\r\n this.imageWidth.reset();\r\n this.imageHeight.reset();\r\n }\r\n\r\n /**\r\n * Toggle rulers in the snapshot view.\r\n */\r\n public toggleRulers(): void {\r\n if (!this._renderer) {\r\n return;\r\n }\r\n this.rulers = this._renderer.toggleRulers();\r\n }\r\n\r\n private defaultCharDecorator(\r\n char: CharNode,\r\n lineNumber: number,\r\n x: number,\r\n y: number\r\n ): CharDecoration | null {\r\n const features = char.features;\r\n const segOut = features?.find((f) => f.name === '$seg-out');\r\n const seg2Out = features?.find((f) => f.name === '$seg2-out');\r\n const segIn = features?.find((f) => f.name === '$seg-in');\r\n const seg2In = features?.find((f) => f.name === '$seg2-in');\r\n\r\n if (!segOut && !seg2Out && !segIn && !seg2In) {\r\n return null;\r\n }\r\n\r\n const decoration: CharDecoration = {};\r\n if (segOut || seg2Out) {\r\n decoration.fill = segOut ? '#9B2915' : '#9B6F91';\r\n }\r\n // if (segIn || seg2In) {\r\n // decoration.stroke = segIn ? '#E9B44C' : '#DF928E';\r\n // decoration.strokeWidth = 3;\r\n // }\r\n\r\n return decoration;\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data.\r\n *\r\n * @returns New snapshot object.\r\n */\r\n private getSnapshot(): Snapshot {\r\n const snapshot: Snapshot = {\r\n size: {\r\n width: this.width.value,\r\n height: this.height.value,\r\n },\r\n style: this.style.value || undefined,\r\n defs: this.defs.value || undefined,\r\n // snapshot nodes might be changed, so we copy them\r\n // to avoid changing the original snapshot\r\n text: deepCopy(this.baseText.value),\r\n textStyle: this.textStyle.value || undefined,\r\n textOptions: {\r\n lineHeightOffset: this.lineHeightOffset.value,\r\n minLineHeights: this.lnHeights.value || undefined,\r\n charSpacingOffset: this.charSpacingOffset.value,\r\n spcWidthOffset: this.spcWidthOffset.value,\r\n offset: {\r\n x: this.offsetX.value,\r\n y: this.offsetY.value,\r\n },\r\n },\r\n operations: [...this.operations.value],\r\n opStyle: this.opStyle.value || undefined,\r\n };\r\n\r\n // add char decoration unless opted out\r\n if (!this.noDecoration()) {\r\n snapshot.textOptions.charDecorator = this.defaultCharDecorator;\r\n }\r\n\r\n // image\r\n if (this.imageUrl.value) {\r\n snapshot.image = {\r\n url: this.imageUrl.value,\r\n opacity: this.imageOpacity.value || undefined,\r\n };\r\n if (\r\n this.imageX.value ||\r\n this.imageY.value ||\r\n this.imageWidth.value ||\r\n this.imageHeight.value\r\n ) {\r\n snapshot.image.canvas = {\r\n x: this.imageX.value,\r\n y: this.imageY.value,\r\n width: this.imageWidth.value,\r\n height: this.imageHeight.value,\r\n };\r\n }\r\n }\r\n\r\n // timelines\r\n if (this.timelines.value.length) {\r\n snapshot.timelines = {};\r\n this.timelines.value.forEach((t) => {\r\n snapshot.timelines![t.tag] = t;\r\n });\r\n } else {\r\n snapshot.timelines = undefined;\r\n }\r\n\r\n return snapshot;\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data and emit it\r\n * in the snapshot change event.\r\n */\r\n public save(): void {\r\n if (this.form.invalid || this.noSave()) {\r\n return;\r\n }\r\n this.snapshot.set(this.getSnapshot());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>article</mat-icon> <span class=\"label\">text</span>\r\n </ng-template>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <!-- base text -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"mat-warn\"\r\n matTooltip=\"Enter base text\"\r\n (click)=\"inputBaseText()\"\r\n [disabled]=\"busy()\"\r\n >\r\n <mat-icon>edit</mat-icon> base text\r\n </button>\r\n\r\n @if (textRange()) {\r\n <span id=\"text-range\"\r\n >{{ textRange()!.at }}×{{ textRange()!.run }}</span\r\n >\r\n }\r\n </div>\r\n <!-- base text metadata -->\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div class=\"boxed\">\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount()\"\r\n [heights]=\"lnHeights.value || undefined\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\r\n <!-- text characters -->\r\n <gve-base-text-view\r\n [text]=\"baseText.value\"\r\n [hasLineNumber]=\"true\"\r\n (rangePick)=\"onRangePick($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>edit</mat-icon> <span class=\"label\">operations</span>\r\n </ng-template>\r\n\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- chain -->\r\n <mat-slide-toggle [formControl]=\"showChain\"\r\n >show chain</mat-slide-toggle\r\n >\r\n\r\n <!-- feat details -->\r\n <mat-slide-toggle [formControl]=\"featDetails\"\r\n >feat. details</mat-slide-toggle\r\n >\r\n\r\n <div class=\"form-row right\">\r\n <!-- remove ops -->\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy()\"\r\n (click)=\"clearOperations()\"\r\n >\r\n <mat-icon>delete_forever</mat-icon> clear\r\n </button>\r\n\r\n <!-- batch add ops -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n matTooltip=\"Add a batch of operations\"\r\n class=\"mat-primary\"\r\n [disabled]=\"busy()\"\r\n (click)=\"parseOperations()\"\r\n >\r\n <mat-icon>post_add</mat-icon> batch\r\n </button>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th>nr.</th>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [class.selected]=\"operation.id === resultOperationId\"\r\n [class.edited]=\"operation.id === editedOp()?.id\"\r\n >\r\n <td class=\"fit-width\">{{ index + 1 }}.</td>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup : opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>\r\n @if (operation.features?.length) { @if (featDetails.value) {\r\n <div class=\"form-row\">\r\n @for (feat of operation.features; track $index; let\r\n i=$index) {\r\n <div class=\"feature\">\r\n <span class=\"fname\">{{\r\n feat.name\r\n | flatLookup : featureDefs()?.names : \"id\" : \"label\"\r\n }}</span\r\n >=<span\r\n class=\"fvalue\"\r\n >{{ feat.value | flatLookup:(featureDefs()?.values?.[feat.name]): \"id\" : \"label\" }}</span\r\n >\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n {{ operation.features?.length }}\r\n } }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n @if (editedOp()) {\r\n <mat-expansion-panel [expanded]=\"editedOp()\" [disabled]=\"!editedOp()\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp()?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [featureDefs]=\"featureDefs()\"\r\n [elementFeatureDefs]=\"elementFeatureDefs()\"\r\n [diplomaticFeatureDefs]=\"diplomaticFeatureDefs()\"\r\n [hidePreview]=\"editedOpIndex() === -1\"\r\n [operation]=\"editedOp()\"\r\n [rangePatch]=\"editedOpRangePatch()\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>image</mat-icon> <span class=\"label\">image</span>\r\n </ng-template>\r\n\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n <!-- reset -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Reset image metadata\"\r\n (click)=\"resetImgMetadata()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </div>\r\n <div>\r\n <!-- image opacity -->\r\n <mat-slider\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.01\"\r\n thumbLabel\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n matTooltip=\"Image opacity\"\r\n >\r\n <input\r\n matSliderThumb\r\n [value]=\"imageOpacity.value\"\r\n (valueChange)=\"onImageOpacityChange($event)\"\r\n />\r\n </mat-slider>\r\n <span id=\"opacity-value\">{{\r\n imageOpacity.value | number : \"1.2-2\"\r\n }}</span>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img\r\n #imgElement\r\n alt=\"background\"\r\n [src]=\"imageUrl.value\"\r\n width=\"600\"\r\n (load)=\"onImageLoad(imgElement)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- timelines -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>animation</mat-icon> <span class=\"label\">animation</span>\r\n </ng-template>\r\n\r\n <gve-animation-timeline-set\r\n [tags]=\"opTags()\"\r\n [elementIds]=\"opElementIds()\"\r\n [timelines]=\"timelines.value\"\r\n (timelinesChange)=\"onTimelinesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- progress -->\r\n <div>\r\n @if (busy()) {\r\n <mat-progress-bar mode=\"indeterminate\" />\r\n }\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result\"\r\n [initialStepIndex]=\"initialStepIndex\"\r\n [disabledRangePick]=\"editedOp() ? false : true\"\r\n (stepPick)=\"onStepPick($event)\"\r\n (rangePick)=\"onRangePick($event, true)\"\r\n />\r\n </fieldset>\r\n }\r\n\r\n <!-- snapshot view -->\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n </legend>\r\n <!-- snapshot view -->\r\n <gve-snapshot-view\r\n #snapshotView\r\n [debug]=\"debug()\"\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div class=\"button-row\">\r\n <!-- toggle ruler -->\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n <!-- run to last -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"primary\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"runToLast()\"\r\n >\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\r\n\r\n <!-- chain view -->\r\n @if (chain()) {\r\n <div id=\"chain-view\">\r\n <gve-chain-view [chain]=\"chain()\" />\r\n </div>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave()) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n","/*\r\n * Public API Surface of gve-core\r\n */\r\n\r\nexport * from './lib/models';\r\nexport * from './lib/components/animation-timeline/animation-timeline.component';\r\nexport * from './lib/components/animation-timeline-set/animation-timeline-set.component';\r\nexport * from './lib/components/animation-tween/animation-tween.component';\r\nexport * from './lib/components/base-text-char/base-text-char.component';\r\nexport * from './lib/components/base-text-editor/base-text-editor.component';\r\nexport * from './lib/components/base-text-view/base-text-view.component';\r\nexport * from './lib/components/batch-operation-editor/batch-operation-editor.component';\r\nexport * from './lib/components/chain-operation-editor/chain-operation-editor.component';\r\nexport * from './lib/components/chain-result-view/chain-result-view.component';\r\nexport * from './lib/components/chain-view/chain-view.component';\r\nexport * from './lib/components/feature-editor/feature-editor.component';\r\nexport * from './lib/components/feature-set-editor/feature-set-editor.component';\r\nexport * from './lib/components/feature-set-view/feature-set-view.component';\r\nexport * from './lib/components/ln-heights-editor/ln-heights-editor.component';\r\nexport * from './lib/components/operation-source-editor/operation-source-editor.component';\r\nexport * from './lib/components/snapshot-editor/snapshot-editor.component';\r\nexport * from './lib/components/snapshot-text-editor/snapshot-text-editor.component';\r\nexport * from './lib/components/steps-map/steps-map.component';\r\n\r\nexport * from './lib/services/gve-api.service';\r\nexport * from './lib/services/gve-graphviz.service';\r\nexport * from './lib/services/settings.service';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i4","i5","i6","i8","i1","i2","debounceTime","i3.SettingsService","i7","i9","i10","i11","i13","i14","i1.GveGraphvizService","i2.SettingsService","i2.GveApiService","i15"],"mappings":"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"}
|