@acrodata/gui 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
2
2
  import { FormArray, FormControl, FormGroup } from '@angular/forms';
3
3
  import { Subscription } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
@@ -37,6 +37,10 @@ export class GuiForm {
37
37
  * The model to be represented by the form.
38
38
  */
39
39
  this.model = {};
40
+ /**
41
+ * Fired on model value change
42
+ */
43
+ this.modelChange = new EventEmitter();
40
44
  this.formFields = [];
41
45
  this.formSubscription = Subscription.EMPTY;
42
46
  }
@@ -52,6 +56,7 @@ export class GuiForm {
52
56
  ngOnInit() {
53
57
  this.formSubscription = this.form.valueChanges.subscribe(value => {
54
58
  Object.assign(this.model, value);
59
+ this.modelChange.emit(value);
55
60
  });
56
61
  }
57
62
  ngOnDestroy() {
@@ -206,18 +211,20 @@ export class GuiForm {
206
211
  tabs.mode = mode;
207
212
  }
208
213
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiForm, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
209
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiForm, selector: "gui-form", inputs: { form: "form", config: "config", model: "model" }, host: { classAttribute: "gui-form" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let item of formFields\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n <ng-container [ngSwitch]=\"item.type\" [formGroup]=\"form\">\n <!-- Text -->\n <gui-field-group *ngSwitchCase=\"'text'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\"></gui-input-text>\n </gui-field-group>\n <!-- Number -->\n <gui-field-group *ngSwitchCase=\"'number'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\"></gui-input-number>\n </gui-field-group>\n <!-- Select -->\n <gui-field-group *ngSwitchCase=\"'select'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\"></gui-select>\n </gui-field-group>\n <!-- Switch -->\n <gui-field-group *ngSwitchCase=\"'switch'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\"></gui-switch>\n </gui-field-group>\n <!-- Slider -->\n <gui-field-group *ngSwitchCase=\"'slider'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\"></gui-slider>\n </gui-field-group>\n <!-- Button Toggle -->\n <gui-field-group *ngSwitchCase=\"'buttonToggle'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\"></gui-button-toggle>\n </gui-field-group>\n <!-- Fill -->\n <gui-field-group *ngSwitchCase=\"'fill'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\"></gui-fill>\n </gui-field-group>\n <!-- File -->\n <gui-field-group *ngSwitchCase=\"'file'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image -->\n <gui-field-group *ngSwitchCase=\"'image'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Video -->\n <gui-field-group *ngSwitchCase=\"'video'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Audio -->\n <gui-field-group *ngSwitchCase=\"'audio'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image Select -->\n <gui-field-group *ngSwitchCase=\"'imageSelect'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\"></gui-image-select>\n </gui-field-group>\n <!-- Textarea -->\n <gui-field-group *ngSwitchCase=\"'textarea'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\"></gui-textarea>\n </gui-field-group>\n <!-- Hidden Input -->\n <input *ngSwitchCase=\"'hidden'\" type=\"hidden\" [formControlName]=\"item.key\">\n\n <!-- Inline Group -->\n <gui-inline-group *ngSwitchCase=\"'inline'\" [config]=\"item\" [formGroupName]=\"item.key\">\n <ng-container *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </gui-inline-group>\n\n <!-- Group -->\n <mat-expansion-panel *ngSwitchCase=\"'group'\" [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <div *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Tabs -->\n <mat-expansion-panel *ngSwitchCase=\"'tabs'\" [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n <!-- Show operation buttons after panel opened -->\n <ng-container *ngIf=\"item.expanded\">\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'nav')\"\n [color]=\"item.mode!=='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_horizontal\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'list')\"\n [color]=\"item.mode==='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_vertical\"></mat-icon>\n </button>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </ng-container>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <!-- Horizontal nav mode -->\n <mat-tab-group *ngIf=\"item.mode!=='list'\" class=\"gui-tabs\"\n [mat-stretch-tabs]=\"false\" disableRipple>\n <mat-tab *ngFor=\"let tab of item.children; index as i\" [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </mat-tab>\n </mat-tab-group>\n\n <!-- Vertical list mode -->\n <div class=\"gui-list\" *ngIf=\"item.mode==='list'\">\n <div class=\"gui-list-item\" *ngFor=\"let tab of item.children; index as i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\">{{tab.name | ejs:{i} }}</span>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Menu -->\n <mat-tab-group class=\"gui-menu\" *ngSwitchCase=\"'menu'\" [formGroupName]=\"item.key\" disableRipple>\n <mat-tab *ngFor=\"let menuChild of item.children\" [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n <ng-container *ngIf=\"menuChild.type==='menuItem'\">\n <!-- Must wrap with div -->\n <div *ngFor=\"let controlItem of menuChild.children\" [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n </ng-container>\n <!-- Support for unlimited nesting -->\n <ng-container *ngIf=\"menuChild.type==='menu'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </ng-container>\n</ng-template>\n", styles: [".gui-form{--mat-form-field-container-text-size: 12px;--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 40px;--mat-expansion-header-expanded-state-height: 40px;position:relative;font-size:12px}.gui-form .mat-expansion-panel{--mat-expansion-container-shape: 0;box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-icon{display:inline-flex;justify-content:center;align-items:center;padding:0!important}.gui-form .mat-icon svg{width:14px;height:14px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-text-field-wrapper,.gui-form .mat-mdc-form-field-hint-wrapper{position:relative;padding:0 8px;border-radius:var(--mdc-filled-text-field-container-shape)}.gui-form .mat-mdc-form-field-infix{min-height:auto;padding:0!important}.gui-form .mat-mdc-form-field-hint-spacer,.gui-form .mat-mdc-form-field-bottom-align:before,.gui-form .mdc-line-ripple{display:none}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading .gui-list-item-title{flex:1}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i5.MatTabContent, selector: "[matTabContent]" }, { kind: "directive", type: i5.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i6.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i6.MatExpansionPanelContent, selector: "ng-template[matExpansionPanelContent]" }, { kind: "component", type: i7.GuiInputText, selector: "gui-input-text", inputs: ["config", "disabled"] }, { kind: "component", type: i8.GuiInputNumber, selector: "gui-input-number", inputs: ["config", "disabled"] }, { kind: "component", type: i9.GuiSelect, selector: "gui-select", inputs: ["config", "disabled"] }, { kind: "component", type: i10.GuiSwitch, selector: "gui-switch", inputs: ["config", "disabled"] }, { kind: "component", type: i11.GuiSlider, selector: "gui-slider", inputs: ["config", "disabled"] }, { kind: "component", type: i12.GuiButtonToggle, selector: "gui-button-toggle", inputs: ["config", "disabled"] }, { kind: "component", type: i13.GuiFill, selector: "gui-fill", inputs: ["config", "disabled"] }, { kind: "component", type: i14.GuiFieldGroup, selector: "gui-field-group", inputs: ["config"] }, { kind: "component", type: i15.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "component", type: i16.GuiInlineGroup, selector: "gui-inline-group", inputs: ["config"] }, { kind: "component", type: i17.GuiImageSelect, selector: "gui-image-select", inputs: ["config", "disabled"] }, { kind: "component", type: i18.GuiTextarea, selector: "gui-textarea", inputs: ["config", "disabled"] }, { kind: "component", type: i19.GuiFileUploader, selector: "gui-file-uploader", inputs: ["type", "name", "accept", "disabled"], outputs: ["fileChange"] }, { kind: "directive", type: i20.GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }, { kind: "pipe", type: i20.GuiEjsPipe, name: "ejs" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
214
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiForm, selector: "gui-form", inputs: { form: "form", config: "config", model: "model" }, outputs: { modelChange: "modelChange" }, host: { classAttribute: "gui-form" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let item of formFields\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n <ng-container [ngSwitch]=\"item.type\" [formGroup]=\"form\">\n <!-- Text -->\n <gui-field-group *ngSwitchCase=\"'text'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\"></gui-input-text>\n </gui-field-group>\n <!-- Number -->\n <gui-field-group *ngSwitchCase=\"'number'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\"></gui-input-number>\n </gui-field-group>\n <!-- Select -->\n <gui-field-group *ngSwitchCase=\"'select'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\"></gui-select>\n </gui-field-group>\n <!-- Switch -->\n <gui-field-group *ngSwitchCase=\"'switch'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\"></gui-switch>\n </gui-field-group>\n <!-- Slider -->\n <gui-field-group *ngSwitchCase=\"'slider'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\"></gui-slider>\n </gui-field-group>\n <!-- Button Toggle -->\n <gui-field-group *ngSwitchCase=\"'buttonToggle'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\"></gui-button-toggle>\n </gui-field-group>\n <!-- Fill -->\n <gui-field-group *ngSwitchCase=\"'fill'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\"></gui-fill>\n </gui-field-group>\n <!-- File -->\n <gui-field-group *ngSwitchCase=\"'file'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image -->\n <gui-field-group *ngSwitchCase=\"'image'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\"\n [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Video -->\n <gui-field-group *ngSwitchCase=\"'video'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\"\n [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Audio -->\n <gui-field-group *ngSwitchCase=\"'audio'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\"\n [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image Select -->\n <gui-field-group *ngSwitchCase=\"'imageSelect'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\"></gui-image-select>\n </gui-field-group>\n <!-- Textarea -->\n <gui-field-group *ngSwitchCase=\"'textarea'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\"></gui-textarea>\n </gui-field-group>\n <!-- Hidden Input -->\n <input *ngSwitchCase=\"'hidden'\" type=\"hidden\" [formControlName]=\"item.key\">\n\n <!-- Inline Group -->\n <gui-inline-group *ngSwitchCase=\"'inline'\" [config]=\"item\" [formGroupName]=\"item.key\">\n <ng-container *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </gui-inline-group>\n\n <!-- Group -->\n <mat-expansion-panel *ngSwitchCase=\"'group'\" [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <div *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Tabs -->\n <mat-expansion-panel *ngSwitchCase=\"'tabs'\" [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n <!-- Show operation buttons after panel opened -->\n <ng-container *ngIf=\"item.expanded\">\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'nav')\"\n [color]=\"item.mode!=='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_horizontal\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'list')\"\n [color]=\"item.mode==='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_vertical\"></mat-icon>\n </button>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </ng-container>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <!-- Horizontal nav mode -->\n <mat-tab-group *ngIf=\"item.mode!=='list'\" class=\"gui-tabs\"\n [mat-stretch-tabs]=\"false\" disableRipple>\n <mat-tab *ngFor=\"let tab of item.children; index as i\" [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </mat-tab>\n </mat-tab-group>\n\n <!-- Vertical list mode -->\n <div class=\"gui-list\" *ngIf=\"item.mode==='list'\">\n <div class=\"gui-list-item\" *ngFor=\"let tab of item.children; index as i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\">{{tab.name | ejs:{i} }}</span>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Menu -->\n <mat-tab-group class=\"gui-menu\" *ngSwitchCase=\"'menu'\" [formGroupName]=\"item.key\" disableRipple>\n <mat-tab *ngFor=\"let menuChild of item.children\" [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n <ng-container *ngIf=\"menuChild.type==='menuItem'\">\n <!-- Must wrap with div -->\n <div *ngFor=\"let controlItem of menuChild.children\" [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n </ng-container>\n <!-- Support for unlimited nesting -->\n <ng-container *ngIf=\"menuChild.type==='menu'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </ng-container>\n</ng-template>\n", styles: [".gui-form{--mat-form-field-container-text-size: 12px;--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 32px;--mat-expansion-header-expanded-state-height: 32px;position:relative;font-size:12px}.gui-form .mat-expansion-panel{--mat-expansion-container-shape: 0;box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-icon{display:inline-flex;justify-content:center;align-items:center;padding:0!important}.gui-form .mat-icon svg{width:14px;height:14px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-text-field-wrapper,.gui-form .mat-mdc-form-field-hint-wrapper{position:relative;padding:0 8px;border-radius:var(--mdc-filled-text-field-container-shape)}[dir=rtl] .gui-form .mat-mdc-text-field-wrapper,[dir=rtl] .gui-form .mat-mdc-form-field-hint-wrapper{padding:0 8px}.gui-form .mat-mdc-form-field-infix{min-height:auto;padding:0!important}.gui-form .mat-mdc-form-field-hint-spacer,.gui-form .mat-mdc-form-field-bottom-align:before,.gui-form .mdc-line-ripple{display:none}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading .gui-list-item-title{flex:1}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: 4px;padding:4px;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:4px}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;border-width:0;border-radius:var(--mdc-tab-indicator-active-indicator-shape);background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i5.MatTabContent, selector: "[matTabContent]" }, { kind: "directive", type: i5.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i6.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i6.MatExpansionPanelContent, selector: "ng-template[matExpansionPanelContent]" }, { kind: "component", type: i7.GuiInputText, selector: "gui-input-text", inputs: ["config", "disabled"] }, { kind: "component", type: i8.GuiInputNumber, selector: "gui-input-number", inputs: ["config", "disabled"] }, { kind: "component", type: i9.GuiSelect, selector: "gui-select", inputs: ["config", "disabled"] }, { kind: "component", type: i10.GuiSwitch, selector: "gui-switch", inputs: ["config", "disabled"] }, { kind: "component", type: i11.GuiSlider, selector: "gui-slider", inputs: ["config", "disabled"] }, { kind: "component", type: i12.GuiButtonToggle, selector: "gui-button-toggle", inputs: ["config", "disabled"] }, { kind: "component", type: i13.GuiFill, selector: "gui-fill", inputs: ["config", "disabled"] }, { kind: "component", type: i14.GuiFieldGroup, selector: "gui-field-group", inputs: ["config"] }, { kind: "component", type: i15.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "component", type: i16.GuiInlineGroup, selector: "gui-inline-group", inputs: ["config"] }, { kind: "component", type: i17.GuiImageSelect, selector: "gui-image-select", inputs: ["config", "disabled"] }, { kind: "component", type: i18.GuiTextarea, selector: "gui-textarea", inputs: ["config", "disabled"] }, { kind: "component", type: i19.GuiFileUploader, selector: "gui-file-uploader", inputs: ["config", "disabled", "type", "name", "accept"], outputs: ["fileChange"] }, { kind: "directive", type: i20.GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }, { kind: "pipe", type: i20.GuiEjsPipe, name: "ejs" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
210
215
  }
211
216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiForm, decorators: [{
212
217
  type: Component,
213
218
  args: [{ selector: 'gui-form', host: {
214
219
  class: 'gui-form',
215
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let item of formFields\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n <ng-container [ngSwitch]=\"item.type\" [formGroup]=\"form\">\n <!-- Text -->\n <gui-field-group *ngSwitchCase=\"'text'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\"></gui-input-text>\n </gui-field-group>\n <!-- Number -->\n <gui-field-group *ngSwitchCase=\"'number'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\"></gui-input-number>\n </gui-field-group>\n <!-- Select -->\n <gui-field-group *ngSwitchCase=\"'select'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\"></gui-select>\n </gui-field-group>\n <!-- Switch -->\n <gui-field-group *ngSwitchCase=\"'switch'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\"></gui-switch>\n </gui-field-group>\n <!-- Slider -->\n <gui-field-group *ngSwitchCase=\"'slider'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\"></gui-slider>\n </gui-field-group>\n <!-- Button Toggle -->\n <gui-field-group *ngSwitchCase=\"'buttonToggle'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\"></gui-button-toggle>\n </gui-field-group>\n <!-- Fill -->\n <gui-field-group *ngSwitchCase=\"'fill'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\"></gui-fill>\n </gui-field-group>\n <!-- File -->\n <gui-field-group *ngSwitchCase=\"'file'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image -->\n <gui-field-group *ngSwitchCase=\"'image'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Video -->\n <gui-field-group *ngSwitchCase=\"'video'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Audio -->\n <gui-field-group *ngSwitchCase=\"'audio'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image Select -->\n <gui-field-group *ngSwitchCase=\"'imageSelect'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\"></gui-image-select>\n </gui-field-group>\n <!-- Textarea -->\n <gui-field-group *ngSwitchCase=\"'textarea'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\"></gui-textarea>\n </gui-field-group>\n <!-- Hidden Input -->\n <input *ngSwitchCase=\"'hidden'\" type=\"hidden\" [formControlName]=\"item.key\">\n\n <!-- Inline Group -->\n <gui-inline-group *ngSwitchCase=\"'inline'\" [config]=\"item\" [formGroupName]=\"item.key\">\n <ng-container *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </gui-inline-group>\n\n <!-- Group -->\n <mat-expansion-panel *ngSwitchCase=\"'group'\" [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <div *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Tabs -->\n <mat-expansion-panel *ngSwitchCase=\"'tabs'\" [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n <!-- Show operation buttons after panel opened -->\n <ng-container *ngIf=\"item.expanded\">\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'nav')\"\n [color]=\"item.mode!=='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_horizontal\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'list')\"\n [color]=\"item.mode==='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_vertical\"></mat-icon>\n </button>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </ng-container>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <!-- Horizontal nav mode -->\n <mat-tab-group *ngIf=\"item.mode!=='list'\" class=\"gui-tabs\"\n [mat-stretch-tabs]=\"false\" disableRipple>\n <mat-tab *ngFor=\"let tab of item.children; index as i\" [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </mat-tab>\n </mat-tab-group>\n\n <!-- Vertical list mode -->\n <div class=\"gui-list\" *ngIf=\"item.mode==='list'\">\n <div class=\"gui-list-item\" *ngFor=\"let tab of item.children; index as i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\">{{tab.name | ejs:{i} }}</span>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Menu -->\n <mat-tab-group class=\"gui-menu\" *ngSwitchCase=\"'menu'\" [formGroupName]=\"item.key\" disableRipple>\n <mat-tab *ngFor=\"let menuChild of item.children\" [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n <ng-container *ngIf=\"menuChild.type==='menuItem'\">\n <!-- Must wrap with div -->\n <div *ngFor=\"let controlItem of menuChild.children\" [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n </ng-container>\n <!-- Support for unlimited nesting -->\n <ng-container *ngIf=\"menuChild.type==='menu'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </ng-container>\n</ng-template>\n", styles: [".gui-form{--mat-form-field-container-text-size: 12px;--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 40px;--mat-expansion-header-expanded-state-height: 40px;position:relative;font-size:12px}.gui-form .mat-expansion-panel{--mat-expansion-container-shape: 0;box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-icon{display:inline-flex;justify-content:center;align-items:center;padding:0!important}.gui-form .mat-icon svg{width:14px;height:14px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-text-field-wrapper,.gui-form .mat-mdc-form-field-hint-wrapper{position:relative;padding:0 8px;border-radius:var(--mdc-filled-text-field-container-shape)}.gui-form .mat-mdc-form-field-infix{min-height:auto;padding:0!important}.gui-form .mat-mdc-form-field-hint-spacer,.gui-form .mat-mdc-form-field-bottom-align:before,.gui-form .mdc-line-ripple{display:none}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading .gui-list-item-title{flex:1}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}\n"] }]
220
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let item of formFields\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n <ng-container [ngSwitch]=\"item.type\" [formGroup]=\"form\">\n <!-- Text -->\n <gui-field-group *ngSwitchCase=\"'text'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\"></gui-input-text>\n </gui-field-group>\n <!-- Number -->\n <gui-field-group *ngSwitchCase=\"'number'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\"></gui-input-number>\n </gui-field-group>\n <!-- Select -->\n <gui-field-group *ngSwitchCase=\"'select'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\"></gui-select>\n </gui-field-group>\n <!-- Switch -->\n <gui-field-group *ngSwitchCase=\"'switch'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\"></gui-switch>\n </gui-field-group>\n <!-- Slider -->\n <gui-field-group *ngSwitchCase=\"'slider'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\"></gui-slider>\n </gui-field-group>\n <!-- Button Toggle -->\n <gui-field-group *ngSwitchCase=\"'buttonToggle'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\"></gui-button-toggle>\n </gui-field-group>\n <!-- Fill -->\n <gui-field-group *ngSwitchCase=\"'fill'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\"></gui-fill>\n </gui-field-group>\n <!-- File -->\n <gui-field-group *ngSwitchCase=\"'file'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image -->\n <gui-field-group *ngSwitchCase=\"'image'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\"\n [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Video -->\n <gui-field-group *ngSwitchCase=\"'video'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\"\n [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Audio -->\n <gui-field-group *ngSwitchCase=\"'audio'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\"\n [formControlName]=\"item.key\" [config]=\"item\"></gui-file-uploader>\n </gui-field-group>\n <!-- Image Select -->\n <gui-field-group *ngSwitchCase=\"'imageSelect'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\"></gui-image-select>\n </gui-field-group>\n <!-- Textarea -->\n <gui-field-group *ngSwitchCase=\"'textarea'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\"></gui-textarea>\n </gui-field-group>\n <!-- Hidden Input -->\n <input *ngSwitchCase=\"'hidden'\" type=\"hidden\" [formControlName]=\"item.key\">\n\n <!-- Inline Group -->\n <gui-inline-group *ngSwitchCase=\"'inline'\" [config]=\"item\" [formGroupName]=\"item.key\">\n <ng-container *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </gui-inline-group>\n\n <!-- Group -->\n <mat-expansion-panel *ngSwitchCase=\"'group'\" [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <div *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Tabs -->\n <mat-expansion-panel *ngSwitchCase=\"'tabs'\" [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\"></gui-field-label>\n <!-- Show operation buttons after panel opened -->\n <ng-container *ngIf=\"item.expanded\">\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'nav')\"\n [color]=\"item.mode!=='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_horizontal\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"changeTabsMode($event, item, 'list')\"\n [color]=\"item.mode==='list'?'primary':''\" type=\"button\">\n <mat-icon svgIcon=\"dots_vertical\"></mat-icon>\n </button>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </ng-container>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <!-- Horizontal nav mode -->\n <mat-tab-group *ngIf=\"item.mode!=='list'\" class=\"gui-tabs\"\n [mat-stretch-tabs]=\"false\" disableRipple>\n <mat-tab *ngFor=\"let tab of item.children; index as i\" [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </mat-tab>\n </mat-tab-group>\n\n <!-- Vertical list mode -->\n <div class=\"gui-list\" *ngIf=\"item.mode==='list'\">\n <div class=\"gui-list-item\" *ngFor=\"let tab of item.children; index as i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\">{{tab.name | ejs:{i} }}</span>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button (click)=\"addTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"plus\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"removeTab($event, form.get(item.key), item, i)\"\n type=\"button\" [disabled]=\"item.disabled\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Menu -->\n <mat-tab-group class=\"gui-menu\" *ngSwitchCase=\"'menu'\" [formGroupName]=\"item.key\" disableRipple>\n <mat-tab *ngFor=\"let menuChild of item.children\" [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n <ng-container *ngIf=\"menuChild.type==='menuItem'\">\n <!-- Must wrap with div -->\n <div *ngFor=\"let controlItem of menuChild.children\" [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n </ng-container>\n <!-- Support for unlimited nesting -->\n <ng-container *ngIf=\"menuChild.type==='menu'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </ng-container>\n</ng-template>\n", styles: [".gui-form{--mat-form-field-container-text-size: 12px;--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 32px;--mat-expansion-header-expanded-state-height: 32px;position:relative;font-size:12px}.gui-form .mat-expansion-panel{--mat-expansion-container-shape: 0;box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-icon{display:inline-flex;justify-content:center;align-items:center;padding:0!important}.gui-form .mat-icon svg{width:14px;height:14px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-text-field-wrapper,.gui-form .mat-mdc-form-field-hint-wrapper{position:relative;padding:0 8px;border-radius:var(--mdc-filled-text-field-container-shape)}[dir=rtl] .gui-form .mat-mdc-text-field-wrapper,[dir=rtl] .gui-form .mat-mdc-form-field-hint-wrapper{padding:0 8px}.gui-form .mat-mdc-form-field-infix{min-height:auto;padding:0!important}.gui-form .mat-mdc-form-field-hint-spacer,.gui-form .mat-mdc-form-field-bottom-align:before,.gui-form .mdc-line-ripple{display:none}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading .gui-list-item-title{flex:1}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: 4px;padding:4px;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:4px}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;border-width:0;border-radius:var(--mdc-tab-indicator-active-indicator-shape);background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
216
221
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { form: [{
217
222
  type: Input
218
223
  }], config: [{
219
224
  type: Input
220
225
  }], model: [{
221
226
  type: Input
227
+ }], modelChange: [{
228
+ type: Output
222
229
  }] } });
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxLQUFLLEVBS0wsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhcEMsTUFBTSxPQUFPLE9BQU87SUFvQmxCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbkIxQzs7V0FFRztRQUNNLFNBQUksR0FBRyxJQUFJLFNBQVMsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQUV2Qzs7V0FFRztRQUNNLFdBQU0sR0FBYyxFQUFFLENBQUM7UUFFaEM7O1dBRUc7UUFDTSxVQUFLLEdBQVEsRUFBRSxDQUFDO1FBRXpCLGVBQVUsR0FBaUIsRUFBRSxDQUFDO1FBRTlCLHFCQUFnQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFFTyxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxpQkFBaUI7WUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5RTtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJ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ICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHdWlDb250cm9sLCBHdWlGaWVsZFR5cGUsIEd1aUZpZWxkcywgR3VpVGFic01vZGUgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2d1aS1mb3JtLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ndWktZm9ybS5zY3NzJ10sXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2d1aS1mb3JtJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEd1aUZvcm0gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGluc3RhbmNlIHdoaWNoIGFsbG93IHRvIHRyYWNrIG1vZGVsIHZhbHVlIGFuZCB2YWxpZGF0aW9uIHN0YXR1cy5cbiAgICovXG4gIEBJbnB1dCgpIGZvcm0gPSBuZXcgRm9ybUdyb3VwPGFueT4oe30pO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQgY29uZmlndXJhdGlvbnMgZm9yIGJ1aWxkaW5nIHRoZSBmb3JtLlxuICAgKi9cbiAgQElucHV0KCkgY29uZmlnOiBHdWlGaWVsZHMgPSB7fTtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBmb3JtLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZWw6IGFueSA9IHt9O1xuXG4gIGZvcm1GaWVsZHM6IEd1aUNvbnRyb2xbXSA9IFtdO1xuXG4gIGZvcm1TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scyA9IHt9OyAvLyByZXNldCBjb250cm9sc1xuICAgICAgdGhpcy5mb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheSh0aGlzLmZvcm0sIHRoaXMuY29uZmlnLCB0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSAmJiB0aGlzLm1vZGVsICYmIE9iamVjdC5rZXlzKHRoaXMubW9kZWwpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5tb2RlbCwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgb2JqZWN0IGNvbmZpZyB0byBhcnJheSBjb25maWcgYW5kIHJlZ2lzdGVyIGludG8gdGhlIHJlYWN0aXZlIGZvcm0uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtICAgICAgICAgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbmZpZyAgICAgICBUaGUgY29uZmlnIG9mIHRoZSBmb3JtIGZpZWxkc1xuICAgKiBAcGFyYW0gbW9kZWwgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICogQHBhcmFtIHBhcmVudFR5cGUgICBUaGUgdHlwZSBvZiB0aGUgZm9ybSBmaWVsZCBwYXJlbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgICAgICBUaGUgcmVhY3RpdmUgZm9ybSBvcHRpb25zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGb3JtRmllbGRBcnJheShcbiAgICBmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksXG4gICAgY29uZmlnOiBHdWlGaWVsZHMgfCBHdWlDb250cm9sW10gPSB7fSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCxcbiAgICBwYXJlbnRUeXBlOiBHdWlGaWVsZFR5cGUgPSAnZ3JvdXAnLFxuICAgIG9wdGlvbnM6IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0gPSB7IGVtaXRFdmVudDogZmFsc2UgfVxuICApIHtcbiAgICBjb25zdCB0ZW1wQXJyID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7XG4gICAgICAvLyBJbmZlcnJpbmcgdGhlIGZvcm0gdHlwZSBieSB0aGUgZGF0YSB0eXBlIG9mIGBjaGlsZHJlbmBcbiAgICAgIC8vIDEuIGB1bmRlZmluZWRgID0+IEZvcm1Db250cm9sXG4gICAgICAvLyAyLiBgYXJyYXlgICAgICA9PiBGb3JtQXJyYXlcbiAgICAgIC8vIDMuIGBvYmplY3RgICAgID0+IEZvcm1Hcm91cFxuICAgICAgY29uc3QgX2NoaWxkcmVuID0gKGNvbmZpZyBhcyBhbnkpW2tleV0udGVtcGxhdGUgPyBbXSA6IChjb25maWcgYXMgYW55KVtrZXldLmNoaWxkcmVuO1xuICAgICAgY29uc3QgX3R5cGUgPSAhX2NoaWxkcmVuID8gJ2NvbnRyb2wnIDogQXJyYXkuaXNBcnJheShfY2hpbGRyZW4pID8gJ2FycmF5JyA6ICdncm91cCc7XG5cbiAgICAgIGNvbnN0IGl0ZW06IEd1aUNvbnRyb2wgPSB7XG4gICAgICAgIF90eXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgIG1vZGVsOiBtb2RlbFtrZXldLFxuICAgICAgICBkZWZhdWx0OiBkZWZhdWx0VmFsdWU/LltrZXldLFxuICAgICAgICBpbmRleDogTnVtYmVyKGtleSksIC8vIHRoZSBzdHJpbmcga2V5IHdpbGwgYmUgYE5hTmBcbiAgICAgICAgLi4uKGNvbmZpZyBhcyBhbnkpW2tleV0sXG4gICAgICB9O1xuXG4gICAgICAvLyBUaGUgYGdyb3VwYCB0eXBlIGdlbmVyYWxseSBoYXZlIG5vIGBkZWZhdWx0YCwgc28gd2Ugc2hvdWxkXG4gICAgICAvLyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgbWFudWFsbHlcbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuICYmIG1vZGVsW2tleV0gPT0gbnVsbCAmJiBpdGVtLmRlZmF1bHQgPT0gbnVsbCkge1xuICAgICAgICBpdGVtLm1vZGVsID0gbW9kZWxba2V5XSA9IGl0ZW0uX3R5cGUgPT09ICdhcnJheScgPyBbXSA6IHt9O1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBtb2RlbCBieSB0aGUgYGRlZmF1bHRgIGtleSBvZiB0aGUgZmllbGQgY29uZmlnXG4gICAgICBpZiAodHlwZW9mIG1vZGVsID09PSAnb2JqZWN0JyAmJiBtb2RlbFtrZXldID09IG51bGwpIHtcbiAgICAgICAgbW9kZWxba2V5XSA9IGl0ZW0uZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBqdWRnbWVudCBvbiBgdGFic2AgdHlwZSwgdGhlIGBjaGlsZHJlbmAga2V5IHdpbGwgYmUgaWdub3JlZCBpZlxuICAgICAgLy8gdGhlcmUgaGFzIGEgYHRlbXBsYXRlYCBrZXlcbiAgICAgIGlmIChpdGVtLnRlbXBsYXRlKSB7XG4gICAgICAgIC8vIElmIG1vZGVsIGlzIGFuIGFycmF5IGFuZCBub3QgZW1wdHksIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAgICAgIC8vIHdpbGwgdXNlIHRoZSBtb2RlbCdzIHZhbHVlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0ubW9kZWwpICYmIGl0ZW0ubW9kZWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGl0ZW0uZGVmYXVsdCA9IGl0ZW0ubW9kZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0uZGVmYXVsdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgaXRlbS5jaGlsZHJlbiA9IGl0ZW0uZGVmYXVsdC5tYXAoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odmFsdWUsIGl0ZW0udGVtcGxhdGU/LmRlZmF1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGVmYXVsdDogdmFsdWUsXG4gICAgICAgICAgICAgIC4uLml0ZW0udGVtcGxhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5fdHlwZSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHsgdmFsdWU6IGl0ZW0uZGVmYXVsdCwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfTtcbiAgICAgICAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICBmb3JtLnJlZ2lzdGVyQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5fdHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBsZXQgZm9ybUFycmF5ID0gbmV3IEZvcm1BcnJheTxhbnk+KFtdKTtcbiAgICAgICAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICBmb3JtQXJyYXkgPSBmb3JtLnJlZ2lzdGVyQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1BcnJheShbXSkpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgZm9ybUFycmF5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1BcnJheSxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLl90eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIGxldCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICAgICAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICBmb3JtR3JvdXAgPSBmb3JtLnJlZ2lzdGVyQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1Hcm91cCh7fSkpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgZm9ybUdyb3VwLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1Hcm91cCxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBBcnI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICBUaGUgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIGZvcm0gIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0YWJzICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHRhYnMgYXJyYXlcbiAgICovXG4gIGFkZFRhYihlOiBNb3VzZUV2ZW50LCBmb3JtOiBGb3JtQXJyYXksIHRhYnM6IEd1aUNvbnRyb2wsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBpbnNlcnRJbmRleCA9IGluZGV4ID09PSB2b2lkIDAgPyB0YWJzLmNoaWxkcmVuIS5sZW5ndGggOiBpbmRleCArIDE7XG4gICAgLy8gU2F2ZSB0aGUgaW5kZXggb2YgdGhlIGluc2VydGlvbiBpbiB0aGUgY29uZmlnXG4gICAgdGFicy50ZW1wbGF0ZSEuaW5kZXggPSBpbnNlcnRJbmRleDtcbiAgICAvLyBUaGUga2V5IGluIHRoZSBvYmplY3QgYW5kIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBzYW1lXG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPj0gaW5zZXJ0SW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghICs9IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4IS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFRoZSBjb25zdHJ1Y3RlZCBvYmplY3QgbG9va3MgbGlrZSB0aGlzIGBbeyBrZXk6ICd0YWInLCBjaGlsZHJlbjogdGVtcGxhdGUgfV1gXG4gICAgLy8gVGhlIGtleSBzaG91bGQgcHJlZmVyYWJseSBiZSBgbnVsbGBcbiAgICBjb25zdCBuZXdUYWIgPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgZm9ybSxcbiAgICAgIHsgW2luc2VydEluZGV4XTogdGFicy50ZW1wbGF0ZSB9IGFzIEd1aUZpZWxkcyxcbiAgICAgIHt9LFxuICAgICAgbnVsbCxcbiAgICAgICd0YWJzJyxcbiAgICAgIHsgZW1pdEV2ZW50OiB0cnVlIH1cbiAgICApO1xuICAgIHRhYnMuY2hpbGRyZW4hLnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3VGFiWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0YWIgaXRlbS5cbiAgICpcbiAgICogQHBhcmFtIGUgICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gZm9ybSAgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIHRhYnMgIFRoZSBjb25maWcgb2YgdGhlIHRhYnMgZmllbGRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgcmVtb3ZlVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm06IEZvcm1BcnJheSwgdGFiczogR3VpQ29udHJvbCwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gaW5kZXggPT09IHZvaWQgMCA/IHRhYnMuY2hpbGRyZW4hLmxlbmd0aCAtIDEgOiBpbmRleDtcbiAgICB0YWJzLmNoaWxkcmVuIS5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA+IHJlbW92ZUluZGV4KSB7XG4gICAgICAgIGNoaWxkLmluZGV4ISAtPSAxO1xuICAgICAgICBjaGlsZC5rZXkgPSBjaGlsZC5pbmRleCEudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIGZvcm0ucmVtb3ZlQXQocmVtb3ZlSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZGlzcGxheSBtb2RlIG9mIHRhYnMuXG4gICAqXG4gICAqIEBwYXJhbSBlICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gdGFicyBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBtb2RlIFRoZSBkaXNwbGF5IG1vZGUgb2YgdGFic1xuICAgKi9cbiAgY2hhbmdlVGFic01vZGUoZTogTW91c2VFdmVudCwgdGFiczogR3VpQ29udHJvbCwgbW9kZT86IEd1aVRhYnNNb2RlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0YWJzLm1vZGUgPSBtb2RlO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmb3JtRmllbGRzXCI+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybX1cIj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNjb250cm9sVHlwZSBsZXQtaXRlbSBsZXQtcGFyZW50PVwicGFyZW50XCIgbGV0LWZvcm09XCJmb3JtR3JvdXBcIj5cbiAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaXRlbS50eXBlXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPCEtLSBUZXh0IC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWlucHV0LXRleHQgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLWlucHV0LXRleHQ+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBOdW1iZXIgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1pbnB1dC1udW1iZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLWlucHV0LW51bWJlcj5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIFNlbGVjdCAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktc2VsZWN0PlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gU3dpdGNoIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidzd2l0Y2gnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktc3dpdGNoIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1zd2l0Y2g+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBTbGlkZXIgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ3NsaWRlcidcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1zbGlkZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLXNsaWRlcj5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIEJ1dHRvbiBUb2dnbGUgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvblRvZ2dsZSdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1idXR0b24tdG9nZ2xlIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1idXR0b24tdG9nZ2xlPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gRmlsbCAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCInZmlsbCdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1maWxsIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1maWxsPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gRmlsZSAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCInZmlsZSdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj48L2d1aS1maWxlLXVwbG9hZGVyPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gSW1hZ2UgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2ltYWdlJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImltYWdlXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiPjwvZ3VpLWZpbGUtdXBsb2FkZXI+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBWaWRlbyAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCIndmlkZW8nXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktZmlsZS11cGxvYWRlciB0eXBlPVwidmlkZW9cIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+PC9ndWktZmlsZS11cGxvYWRlcj5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIEF1ZGlvIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidhdWRpbydcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJhdWRpb1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj48L2d1aS1maWxlLXVwbG9hZGVyPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gSW1hZ2UgU2VsZWN0IC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZVNlbGVjdCdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1pbWFnZS1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLWltYWdlLXNlbGVjdD5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIFRleHRhcmVhIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0YXJlYSdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS10ZXh0YXJlYSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktdGV4dGFyZWE+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBIaWRkZW4gSW5wdXQgLS0+XG4gICAgPGlucHV0ICpuZ1N3aXRjaENhc2U9XCInaGlkZGVuJ1wiIHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XG5cbiAgICA8IS0tIElubGluZSBHcm91cCAtLT5cbiAgICA8Z3VpLWlubGluZS1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2lubGluZSdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgaXRlbS5jaGlsZHJlblwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9ndWktaW5saW5lLWdyb3VwPlxuXG4gICAgPCEtLSBHcm91cCAtLT5cbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdTd2l0Y2hDYXNlPVwiJ2dyb3VwJ1wiIFtmb3JtR3JvdXBOYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbKGV4cGFuZGVkKV09XCJpdGVtLmV4cGFuZGVkXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1maWVsZC1sYWJlbD5cbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgaXRlbS5jaGlsZHJlblwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KX1cIj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXG4gICAgPCEtLSBUYWJzIC0tPlxuICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ1N3aXRjaENhc2U9XCIndGFicydcIiBbZm9ybUFycmF5TmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktZmllbGQtbGFiZWw+XG4gICAgICAgIDwhLS0gU2hvdyBvcGVyYXRpb24gYnV0dG9ucyBhZnRlciBwYW5lbCBvcGVuZWQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmV4cGFuZGVkXCI+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImNoYW5nZVRhYnNNb2RlKCRldmVudCwgaXRlbSwgJ25hdicpXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpdGVtLm1vZGUhPT0nbGlzdCc/J3ByaW1hcnknOicnXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkb3RzX2hvcml6b250YWxcIj48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICdsaXN0JylcIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIml0ZW0ubW9kZT09PSdsaXN0Jz8ncHJpbWFyeSc6JydcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRvdHNfdmVydGljYWxcIj48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnRlbXBsYXRlICYmIChpdGVtLmFkZGFibGUgfHwgaXRlbS5hZGRhYmxlPT09dW5kZWZpbmVkKVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJwbHVzXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkZWxldGVcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgIDwhLS0gTGF6eSByZW5kZXJpbmcgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgbWF0RXhwYW5zaW9uUGFuZWxDb250ZW50PlxuICAgICAgICA8IS0tIEhvcml6b250YWwgbmF2IG1vZGUgLS0+XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiaXRlbS5tb2RlIT09J2xpc3QnXCIgY2xhc3M9XCJndWktdGFic1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFttYXQtc3RyZXRjaC10YWJzXT1cImZhbHNlXCIgZGlzYWJsZVJpcHBsZT5cbiAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgdGFiIG9mIGl0ZW0uY2hpbGRyZW47IGluZGV4IGFzIGlcIiBbZGlzYWJsZWRdPVwidGFiLmRpc2FibGVkXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwhLS0gRm9ybUNvbnRyb2wgJiBGb3JtQXJyYXkgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYi5jaGlsZHJlbiB8fCB0YWIuY2hpbGRyZW4ubGVuZ3RoPT09MCB8fCB0YWIudHlwZT09PSd0YWJzJ1wiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IHRhYiwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleV0pfVwiPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8IS0tIEZvcm1Hcm91cCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWIuY2hpbGRyZW4/Lmxlbmd0aD4wICYmIHRhYi50eXBlIT09J3RhYnMnXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoaWxkIG9mIHRhYi5jaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleSwgaV0pfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgICAgICAgPCEtLSBWZXJ0aWNhbCBsaXN0IG1vZGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdFwiICpuZ0lmPVwiaXRlbS5tb2RlPT09J2xpc3QnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgdGFiIG9mIGl0ZW0uY2hpbGRyZW47IGluZGV4IGFzIGlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJndWktbGlzdC1pdGVtLXRpdGxlXCI+e3t0YWIubmFtZSB8IGVqczp7aX0gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnRlbXBsYXRlICYmIChpdGVtLmFkZGFibGUgfHwgaXRlbS5hZGRhYmxlPT09dW5kZWZpbmVkKVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJwbHVzXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPCEtLSBGb3JtQ29udHJvbCAmIEZvcm1BcnJheSAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicydcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdGFiLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5XSl9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gRm9ybUdyb3VwIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFiLmNoaWxkcmVuPy5sZW5ndGg+MCAmJiB0YWIudHlwZSE9PSd0YWJzJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoaWxkIG9mIHRhYi5jaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIGldKX1cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG5cbiAgICA8IS0tIE1lbnUgLS0+XG4gICAgPG1hdC10YWItZ3JvdXAgY2xhc3M9XCJndWktbWVudVwiICpuZ1N3aXRjaENhc2U9XCInbWVudSdcIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiIGRpc2FibGVSaXBwbGU+XG4gICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgbWVudUNoaWxkIG9mIGl0ZW0uY2hpbGRyZW5cIiBbbGFiZWxdPVwibWVudUNoaWxkLm5hbWVcIlxuICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnVDaGlsZC5kaXNhYmxlZFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVudUNoaWxkLnR5cGU9PT0nbWVudUl0ZW0nXCI+XG4gICAgICAgICAgICA8IS0tIE11c3Qgd3JhcCB3aXRoIGRpdiAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnRyb2xJdGVtIG9mIG1lbnVDaGlsZC5jaGlsZHJlblwiIFtmb3JtR3JvdXBOYW1lXT1cIm1lbnVDaGlsZC5rZXlcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjb250cm9sSXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIG1lbnVDaGlsZC5rZXldKX1cIj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0gU3VwcG9ydCBmb3IgdW5saW1pdGVkIG5lc3RpbmcgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lbnVDaGlsZC50eXBlPT09J21lbnUnXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBtZW51Q2hpbGQsIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbWF0LXRhYj5cbiAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFwQyxNQUFNLE9BQU8sT0FBTztJQXlCbEIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF4QjFDOztXQUVHO1FBQ00sU0FBSSxHQUFHLElBQUksU0FBUyxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXZDOztXQUVHO1FBQ00sV0FBTSxHQUFjLEVBQUUsQ0FBQztRQUVoQzs7V0FFRztRQUNNLFVBQUssR0FBUSxFQUFFLENBQUM7UUFFekI7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFM0MsZUFBVSxHQUFpQixFQUFFLENBQUM7UUFFOUIscUJBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztJQUVPLENBQUM7SUFFOUMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtZQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFN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LElBQUk7c0JBQVosS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEd1aUNvbnRyb2wsIEd1aUZpZWxkVHlwZSwgR3VpRmllbGRzLCBHdWlUYWJzTW9kZSB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3VpLWZvcm0uaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2d1aS1mb3JtLnNjc3MnXSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZ3VpLWZvcm0nLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRm9ybSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGhlIGZvcm0gaW5zdGFuY2Ugd2hpY2ggYWxsb3cgdG8gdHJhY2sgbW9kZWwgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdHVzLlxuICAgKi9cbiAgQElucHV0KCkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8YW55Pih7fSk7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc6IEd1aUZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBtb2RlbDogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIEZpcmVkIG9uIG1vZGVsIHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgQE91dHB1dCgpIG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGZvcm1GaWVsZHM6IEd1aUNvbnRyb2xbXSA9IFtdO1xuXG4gIGZvcm1TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scyA9IHt9OyAvLyByZXNldCBjb250cm9sc1xuICAgICAgdGhpcy5mb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheSh0aGlzLmZvcm0sIHRoaXMuY29uZmlnLCB0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSAmJiB0aGlzLm1vZGVsICYmIE9iamVjdC5rZXlzKHRoaXMubW9kZWwpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5tb2RlbCwgdmFsdWUpO1xuICAgICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIG9iamVjdCBjb25maWcgdG8gYXJyYXkgY29uZmlnIGFuZCByZWdpc3RlciBpbnRvIHRoZSByZWFjdGl2ZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAgICAgICAgIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICogQHBhcmFtIG1vZGVsICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbFxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqIEBwYXJhbSBwYXJlbnRUeXBlICAgVGhlIHR5cGUgb2YgdGhlIGZvcm0gZmllbGQgcGFyZW50XG4gICAqIEBwYXJhbSBvcHRpb25zICAgICAgVGhlIHJlYWN0aXZlIGZvcm0gb3B0aW9uc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgZm9ybTogRm9ybUdyb3VwIHwgRm9ybUFycmF5LFxuICAgIGNvbmZpZzogR3VpRmllbGRzIHwgR3VpQ29udHJvbFtdID0ge30sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICBkZWZhdWx0VmFsdWU6IGFueSA9IG51bGwsXG4gICAgcGFyZW50VHlwZTogR3VpRmllbGRUeXBlID0gJ2dyb3VwJyxcbiAgICBvcHRpb25zOiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9ID0geyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgKSB7XG4gICAgY29uc3QgdGVtcEFyciA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkge1xuICAgICAgLy8gSW5mZXJyaW5nIHRoZSBmb3JtIHR5cGUgYnkgdGhlIGRhdGEgdHlwZSBvZiBgY2hpbGRyZW5gXG4gICAgICAvLyAxLiBgdW5kZWZpbmVkYCA9PiBGb3JtQ29udHJvbFxuICAgICAgLy8gMi4gYGFycmF5YCAgICAgPT4gRm9ybUFycmF5XG4gICAgICAvLyAzLiBgb2JqZWN0YCAgICA9PiBGb3JtR3JvdXBcbiAgICAgIGNvbnN0IF9jaGlsZHJlbiA9IChjb25maWcgYXMgYW55KVtrZXldLnRlbXBsYXRlID8gW10gOiAoY29uZmlnIGFzIGFueSlba2V5XS5jaGlsZHJlbjtcbiAgICAgIGNvbnN0IF90eXBlID0gIV9jaGlsZHJlbiA/ICdjb250cm9sJyA6IEFycmF5LmlzQXJyYXkoX2NoaWxkcmVuKSA/ICdhcnJheScgOiAnZ3JvdXAnO1xuXG4gICAgICBjb25zdCBpdGVtOiBHdWlDb250cm9sID0ge1xuICAgICAgICBfdHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICBtb2RlbDogbW9kZWxba2V5XSxcbiAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlPy5ba2V5XSxcbiAgICAgICAgaW5kZXg6IE51bWJlcihrZXkpLCAvLyB0aGUgc3RyaW5nIGtleSB3aWxsIGJlIGBOYU5gXG4gICAgICAgIC4uLihjb25maWcgYXMgYW55KVtrZXldLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhlIGBncm91cGAgdHlwZSBnZW5lcmFsbHkgaGF2ZSBubyBgZGVmYXVsdGAsIHNvIHdlIHNob3VsZFxuICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG1hbnVhbGx5XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBtb2RlbFtrZXldID09IG51bGwgJiYgaXRlbS5kZWZhdWx0ID09IG51bGwpIHtcbiAgICAgICAgaXRlbS5tb2RlbCA9IG1vZGVsW2tleV0gPSBpdGVtLl90eXBlID09PSAnYXJyYXknID8gW10gOiB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgbW9kZWwgYnkgdGhlIGBkZWZhdWx0YCBrZXkgb2YgdGhlIGZpZWxkIGNvbmZpZ1xuICAgICAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gJ29iamVjdCcgJiYgbW9kZWxba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIG1vZGVsW2tleV0gPSBpdGVtLmRlZmF1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwganVkZ21lbnQgb24gYHRhYnNgIHR5cGUsIHRoZSBgY2hpbGRyZW5gIGtleSB3aWxsIGJlIGlnbm9yZWQgaWZcbiAgICAgIC8vIHRoZXJlIGhhcyBhIGB0ZW1wbGF0ZWAga2V5XG4gICAgICBpZiAoaXRlbS50ZW1wbGF0ZSkge1xuICAgICAgICAvLyBJZiBtb2RlbCBpcyBhbiBhcnJheSBhbmQgbm90IGVtcHR5LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZm9ybSBmaWVsZFxuICAgICAgICAvLyB3aWxsIHVzZSB0aGUgbW9kZWwncyB2YWx1ZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtLm1vZGVsKSAmJiBpdGVtLm1vZGVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpdGVtLmRlZmF1bHQgPSBpdGVtLm1vZGVsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmRlZmF1bHQ/Lmxlbmd0aCkge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBpdGVtLmRlZmF1bHQubWFwKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHZhbHVlLCBpdGVtLnRlbXBsYXRlPy5kZWZhdWx0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHZhbHVlLFxuICAgICAgICAgICAgICAuLi5pdGVtLnRlbXBsYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uX3R5cGUgPT09ICdjb250cm9sJykge1xuICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7IHZhbHVlOiBpdGVtLmRlZmF1bHQsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH07XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uX3R5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgbGV0IGZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXk8YW55PihbXSk7XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybUFycmF5ID0gZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQXJyYXkoW10pKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGZvcm0uaW5zZXJ0KGl0ZW0uaW5kZXggfHwgZm9ybS5sZW5ndGgsIGZvcm1BcnJheSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmNoaWxkcmVuID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheShcbiAgICAgICAgICBmb3JtQXJyYXksXG4gICAgICAgICAgaXRlbS5jaGlsZHJlbixcbiAgICAgICAgICBpdGVtLm1vZGVsLFxuICAgICAgICAgIGl0ZW0uZGVmYXVsdCxcbiAgICAgICAgICBpdGVtLnR5cGVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5fdHlwZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBsZXQgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybUdyb3VwID0gZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtR3JvdXAoe30pKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGZvcm0uaW5zZXJ0KGl0ZW0uaW5kZXggfHwgZm9ybS5sZW5ndGgsIGZvcm1Hcm91cCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmNoaWxkcmVuID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheShcbiAgICAgICAgICBmb3JtR3JvdXAsXG4gICAgICAgICAgaXRlbS5jaGlsZHJlbixcbiAgICAgICAgICBpdGVtLm1vZGVsLFxuICAgICAgICAgIGl0ZW0uZGVmYXVsdCxcbiAgICAgICAgICBpdGVtLnR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGVtcEFyci5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wQXJyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHRhYiBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBmb3JtICBUaGUgcmVhY3RpdmUgZm9ybSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGFicyAgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSB0YWJzIGFycmF5XG4gICAqL1xuICBhZGRUYWIoZTogTW91c2VFdmVudCwgZm9ybTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBpbmRleD86IG51bWJlcikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgaW5zZXJ0SW5kZXggPSBpbmRleCA9PT0gdm9pZCAwID8gdGFicy5jaGlsZHJlbiEubGVuZ3RoIDogaW5kZXggKyAxO1xuICAgIC8vIFNhdmUgdGhlIGluZGV4IG9mIHRoZSBpbnNlcnRpb24gaW4gdGhlIGNvbmZpZ1xuICAgIHRhYnMudGVtcGxhdGUhLmluZGV4ID0gaW5zZXJ0SW5kZXg7XG4gICAgLy8gVGhlIGtleSBpbiB0aGUgb2JqZWN0IGFuZCB0aGUgaW5kZXggaW4gdGhlIGFycmF5IHNob3VsZCBiZSB0aGUgc2FtZVxuICAgIHRhYnMuY2hpbGRyZW4hLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID49IGluc2VydEluZGV4KSB7XG4gICAgICAgIGNoaWxkLmluZGV4ISArPSAxO1xuICAgICAgICBjaGlsZC5rZXkgPSBjaGlsZC5pbmRleCEudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBUaGUgY29uc3RydWN0ZWQgb2JqZWN0IGxvb2tzIGxpa2UgdGhpcyBgW3sga2V5OiAndGFiJywgY2hpbGRyZW46IHRlbXBsYXRlIH1dYFxuICAgIC8vIFRoZSBrZXkgc2hvdWxkIHByZWZlcmFibHkgYmUgYG51bGxgXG4gICAgY29uc3QgbmV3VGFiID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheShcbiAgICAgIGZvcm0sXG4gICAgICB7IFtpbnNlcnRJbmRleF06IHRhYnMudGVtcGxhdGUgfSBhcyBHdWlGaWVsZHMsXG4gICAgICB7fSxcbiAgICAgIG51bGwsXG4gICAgICAndGFicycsXG4gICAgICB7IGVtaXRFdmVudDogdHJ1ZSB9XG4gICAgKTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIG5ld1RhYlswXSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICBUaGUgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIGZvcm0gIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0YWJzICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHRhYnMgYXJyYXlcbiAgICovXG4gIHJlbW92ZVRhYihlOiBNb3VzZUV2ZW50LCBmb3JtOiBGb3JtQXJyYXksIHRhYnM6IEd1aUNvbnRyb2wsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IGluZGV4ID09PSB2b2lkIDAgPyB0YWJzLmNoaWxkcmVuIS5sZW5ndGggLSAxIDogaW5kZXg7XG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPiByZW1vdmVJbmRleCkge1xuICAgICAgICBjaGlsZC5pbmRleCEgLT0gMTtcbiAgICAgICAgY2hpbGQua2V5ID0gY2hpbGQuaW5kZXghLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFicy5jaGlsZHJlbiEuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICBmb3JtLnJlbW92ZUF0KHJlbW92ZUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGRpc3BsYXkgbW9kZSBvZiB0YWJzLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICBUaGUgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIHRhYnMgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gbW9kZSBUaGUgZGlzcGxheSBtb2RlIG9mIHRhYnNcbiAgICovXG4gIGNoYW5nZVRhYnNNb2RlKGU6IE1vdXNlRXZlbnQsIHRhYnM6IEd1aUNvbnRyb2wsIG1vZGU/OiBHdWlUYWJzTW9kZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGFicy5tb2RlID0gbW9kZTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZm9ybUZpZWxkc1wiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm19XCI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2Zvcm0+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFR5cGUgbGV0LWl0ZW0gbGV0LXBhcmVudD1cInBhcmVudFwiIGxldC1mb3JtPVwiZm9ybUdyb3VwXCI+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIml0ZW0udHlwZVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDwhLS0gVGV4dCAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1pbnB1dC10ZXh0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1pbnB1dC10ZXh0PlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gTnVtYmVyIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktaW5wdXQtbnVtYmVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1pbnB1dC1udW1iZXI+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBTZWxlY3QgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ3NlbGVjdCdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLXNlbGVjdD5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIFN3aXRjaCAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCInc3dpdGNoJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLXN3aXRjaCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktc3dpdGNoPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gU2xpZGVyIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidzbGlkZXInXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktc2xpZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1zbGlkZXI+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBCdXR0b24gVG9nZ2xlIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIididXR0b25Ub2dnbGUnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktYnV0dG9uLXRvZ2dsZSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktYnV0dG9uLXRvZ2dsZT5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIEZpbGwgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGwnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktZmlsbCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktZmlsbD5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIEZpbGUgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGUnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktZmlsZS11cGxvYWRlciBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktZmlsZS11cGxvYWRlcj5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIEltYWdlIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZSdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLWZpbGUtdXBsb2FkZXI+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBWaWRlbyAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCIndmlkZW8nXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktZmlsZS11cGxvYWRlciB0eXBlPVwidmlkZW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1maWxlLXVwbG9hZGVyPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gQXVkaW8gLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2F1ZGlvJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImF1ZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktZmlsZS11cGxvYWRlcj5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIEltYWdlIFNlbGVjdCAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCInaW1hZ2VTZWxlY3QnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktaW1hZ2Utc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIj48L2d1aS1pbWFnZS1zZWxlY3Q+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBUZXh0YXJlYSAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCIndGV4dGFyZWEnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktdGV4dGFyZWEgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLXRleHRhcmVhPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gSGlkZGVuIElucHV0IC0tPlxuICAgIDxpbnB1dCAqbmdTd2l0Y2hDYXNlPVwiJ2hpZGRlbidcIiB0eXBlPVwiaGlkZGVuXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiPlxuXG4gICAgPCEtLSBJbmxpbmUgR3JvdXAgLS0+XG4gICAgPGd1aS1pbmxpbmUtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidpbmxpbmUnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KX1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZ3VpLWlubGluZS1ncm91cD5cblxuICAgIDwhLS0gR3JvdXAgLS0+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nU3dpdGNoQ2FzZT1cIidncm91cCdcIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCI+PC9ndWktZmllbGQtbGFiZWw+XG4gICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgPCEtLSBMYXp5IHJlbmRlcmluZyAtLT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBtYXRFeHBhbnNpb25QYW5lbENvbnRlbnQ+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChpdGVtLmtleSl9XCI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cblxuICAgIDwhLS0gVGFicyAtLT5cbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdTd2l0Y2hDYXNlPVwiJ3RhYnMnXCIgW2Zvcm1BcnJheU5hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFsoZXhwYW5kZWQpXT1cIml0ZW0uZXhwYW5kZWRcIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPlxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICA8Z3VpLWZpZWxkLWxhYmVsIFtjb25maWddPVwiaXRlbVwiPjwvZ3VpLWZpZWxkLWxhYmVsPlxuICAgICAgICA8IS0tIFNob3cgb3BlcmF0aW9uIGJ1dHRvbnMgYWZ0ZXIgcGFuZWwgb3BlbmVkIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHBhbmRlZFwiPlxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICduYXYnKVwiXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwiaXRlbS5tb2RlIT09J2xpc3QnPydwcmltYXJ5JzonJ1wiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZG90c19ob3Jpem9udGFsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiY2hhbmdlVGFic01vZGUoJGV2ZW50LCBpdGVtLCAnbGlzdCcpXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpdGVtLm1vZGU9PT0nbGlzdCc/J3ByaW1hcnknOicnXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkb3RzX3ZlcnRpY2FsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZW1wbGF0ZSAmJiAoaXRlbS5hZGRhYmxlIHx8IGl0ZW0uYWRkYWJsZT09PXVuZGVmaW5lZClcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwicGx1c1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZW1vdmVUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgPCEtLSBIb3Jpem9udGFsIG5hdiBtb2RlIC0tPlxuICAgICAgICA8bWF0LXRhYi1ncm91cCAqbmdJZj1cIml0ZW0ubW9kZSE9PSdsaXN0J1wiIGNsYXNzPVwiZ3VpLXRhYnNcIlxuICAgICAgICAgICAgICAgICAgICAgICBbbWF0LXN0cmV0Y2gtdGFic109XCJmYWxzZVwiIGRpc2FibGVSaXBwbGU+XG4gICAgICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiBpdGVtLmNoaWxkcmVuOyBpbmRleCBhcyBpXCIgW2Rpc2FibGVkXT1cInRhYi5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXY+e3t0YWIubmFtZSB8IGVqczp7aX0gfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIEZvcm1Db250cm9sICYgRm9ybUFycmF5IC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicydcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiB0YWIsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXldKX1cIj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBGb3JtR3JvdXAgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFiLmNoaWxkcmVuPy5sZW5ndGg+MCAmJiB0YWIudHlwZSE9PSd0YWJzJ1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaGlsZCBvZiB0YWIuY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIGldKX1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuXG4gICAgICAgIDwhLS0gVmVydGljYWwgbGlzdCBtb2RlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3RcIiAqbmdJZj1cIml0ZW0ubW9kZT09PSdsaXN0J1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IHRhYiBvZiBpdGVtLmNoaWxkcmVuOyBpbmRleCBhcyBpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS10aXRsZVwiPnt7dGFiLm5hbWUgfCBlanM6e2l9IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZW1wbGF0ZSAmJiAoaXRlbS5hZGRhYmxlIHx8IGl0ZW0uYWRkYWJsZT09PXVuZGVmaW5lZClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwicGx1c1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDwhLS0gRm9ybUNvbnRyb2wgJiBGb3JtQXJyYXkgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFiLmNoaWxkcmVuIHx8IHRhYi5jaGlsZHJlbi5sZW5ndGg9PT0wIHx8IHRhYi50eXBlPT09J3RhYnMnXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IHRhYiwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleV0pfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8IS0tIEZvcm1Hcm91cCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYi5jaGlsZHJlbj8ubGVuZ3RoPjAgJiYgdGFiLnR5cGUhPT0ndGFicydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaGlsZCBvZiB0YWIuY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBpXSl9XCI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXG4gICAgPCEtLSBNZW51IC0tPlxuICAgIDxtYXQtdGFiLWdyb3VwIGNsYXNzPVwiZ3VpLW1lbnVcIiAqbmdTd2l0Y2hDYXNlPVwiJ21lbnUnXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIiBkaXNhYmxlUmlwcGxlPlxuICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IG1lbnVDaGlsZCBvZiBpdGVtLmNoaWxkcmVuXCIgW2xhYmVsXT1cIm1lbnVDaGlsZC5uYW1lXCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51Q2hpbGQuZGlzYWJsZWRcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lbnVDaGlsZC50eXBlPT09J21lbnVJdGVtJ1wiPlxuICAgICAgICAgICAgPCEtLSBNdXN0IHdyYXAgd2l0aCBkaXYgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb250cm9sSXRlbSBvZiBtZW51Q2hpbGQuY2hpbGRyZW5cIiBbZm9ybUdyb3VwTmFtZV09XCJtZW51Q2hpbGQua2V5XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY29udHJvbEl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBtZW51Q2hpbGQua2V5XSl9XCI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8IS0tIFN1cHBvcnQgZm9yIHVubGltaXRlZCBuZXN0aW5nIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZW51Q2hpbGQudHlwZT09PSdtZW51J1wiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogbWVudUNoaWxkLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KX1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L21hdC10YWI+XG4gICAgPC9tYXQtdGFiLWdyb3VwPlxuXG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -28,6 +28,16 @@ export const svgIcons = {
28
28
  <svg viewBox="0 0 24 24">
29
29
  <path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
30
30
  </svg>
31
+ `,
32
+ file_outline: `
33
+ <svg viewBox="0 0 24 24">
34
+ <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z" />
35
+ </svg>
36
+ `,
37
+ file_upload: `
38
+ <svg viewBox="0 0 24 24">
39
+ <path d="M2 12H4V17H20V12H22V17C22 18.11 21.11 19 20 19H4C2.9 19 2 18.11 2 17V12M12 2L6.46 7.46L7.88 8.88L11 5.75V15H13V5.75L16.13 8.88L17.55 7.45L12 2Z" />
40
+ </svg>
31
41
  `,
32
42
  };
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWljb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2d1aS1pY29ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQThCO0lBQ2pELGVBQWUsRUFBRTs7OztHQUloQjtJQUNELGFBQWEsRUFBRTs7OztHQUlkO0lBQ0QsSUFBSSxFQUFFOzs7O0dBSUw7SUFDRCxNQUFNLEVBQUU7Ozs7R0FJUDtJQUNELElBQUksRUFBRTs7OztHQUlMO0lBQ0QsS0FBSyxFQUFFOzs7O0dBSU47Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHN2Z0ljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICBkb3RzX2hvcml6b250YWw6IGBcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgPHBhdGggZD1cIk0xNiwxMkEyLDIgMCAwLDEgMTgsMTBBMiwyIDAgMCwxIDIwLDEyQTIsMiAwIDAsMSAxOCwxNEEyLDIgMCAwLDEgMTYsMTJNMTAsMTJBMiwyIDAgMCwxIDEyLDEwQTIsMiAwIDAsMSAxNCwxMkEyLDIgMCAwLDEgMTIsMTRBMiwyIDAgMCwxIDEwLDEyTTQsMTJBMiwyIDAgMCwxIDYsMTBBMiwyIDAgMCwxIDgsMTJBMiwyIDAgMCwxIDYsMTRBMiwyIDAgMCwxIDQsMTJaXCI+PC9wYXRoPlxuICA8L3N2Zz5cbiAgYCxcbiAgZG90c192ZXJ0aWNhbDogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTEyLDE2QTIsMiAwIDAsMSAxNCwxOEEyLDIgMCAwLDEgMTIsMjBBMiwyIDAgMCwxIDEwLDE4QTIsMiAwIDAsMSAxMiwxNk0xMiwxMEEyLDIgMCAwLDEgMTQsMTJBMiwyIDAgMCwxIDEyLDE0QTIsMiAwIDAsMSAxMCwxMkEyLDIgMCAwLDEgMTIsMTBNMTIsNEEyLDIgMCAwLDEgMTQsNkEyLDIgMCAwLDEgMTIsOEEyLDIgMCAwLDEgMTAsNkEyLDIgMCAwLDEgMTIsNFpcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICBwbHVzOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGQ9XCJNMTksMTNIMTNWMTlIMTFWMTNINVYxMUgxMVY1SDEzVjExSDE5VjEzWlwiPjwvcGF0aD5cbiAgPC9zdmc+XG4gIGAsXG4gIGRlbGV0ZTogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTE5LDRIMTUuNUwxNC41LDNIOS41TDguNSw0SDVWNkgxOU02LDE5QTIsMiAwIDAsMCA4LDIxSDE2QTIsMiAwIDAsMCAxOCwxOVY3SDZWMTlaXCI+PC9wYXRoPlxuICA8L3N2Zz5cbiAgYCxcbiAgbGluazogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01elwiPjwvcGF0aD5cbiAgPC9zdmc+XG4gIGAsXG4gIGNsb3NlOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGQ9XCJNMTksNi40MUwxNy41OSw1TDEyLDEwLjU5TDYuNDEsNUw1LDYuNDFMMTAuNTksMTJMNSwxNy41OUw2LjQxLDE5TDEyLDEzLjQxTDE3LjU5LDE5TDE5LDE3LjU5TDEzLjQxLDEyTDE5LDYuNDFaXCI+PC9wYXRoPlxuICA8L3N2Zz5cbiAgYCxcbn07XG4iXX0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWljb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2d1aS1pY29ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQThCO0lBQ2pELGVBQWUsRUFBRTs7OztHQUloQjtJQUNELGFBQWEsRUFBRTs7OztHQUlkO0lBQ0QsSUFBSSxFQUFFOzs7O0dBSUw7SUFDRCxNQUFNLEVBQUU7Ozs7R0FJUDtJQUNELElBQUksRUFBRTs7OztHQUlMO0lBQ0QsS0FBSyxFQUFFOzs7O0dBSU47SUFDRCxZQUFZLEVBQUU7Ozs7R0FJYjtJQUNELFdBQVcsRUFBRTs7OztHQUlaO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBzdmdJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgZG90c19ob3Jpem9udGFsOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGQ9XCJNMTYsMTJBMiwyIDAgMCwxIDE4LDEwQTIsMiAwIDAsMSAyMCwxMkEyLDIgMCAwLDEgMTgsMTRBMiwyIDAgMCwxIDE2LDEyTTEwLDEyQTIsMiAwIDAsMSAxMiwxMEEyLDIgMCAwLDEgMTQsMTJBMiwyIDAgMCwxIDEyLDE0QTIsMiAwIDAsMSAxMCwxMk00LDEyQTIsMiAwIDAsMSA2LDEwQTIsMiAwIDAsMSA4LDEyQTIsMiAwIDAsMSA2LDE0QTIsMiAwIDAsMSA0LDEyWlwiPjwvcGF0aD5cbiAgPC9zdmc+XG4gIGAsXG4gIGRvdHNfdmVydGljYWw6IGBcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgPHBhdGggZD1cIk0xMiwxNkEyLDIgMCAwLDEgMTQsMThBMiwyIDAgMCwxIDEyLDIwQTIsMiAwIDAsMSAxMCwxOEEyLDIgMCAwLDEgMTIsMTZNMTIsMTBBMiwyIDAgMCwxIDE0LDEyQTIsMiAwIDAsMSAxMiwxNEEyLDIgMCAwLDEgMTAsMTJBMiwyIDAgMCwxIDEyLDEwTTEyLDRBMiwyIDAgMCwxIDE0LDZBMiwyIDAgMCwxIDEyLDhBMiwyIDAgMCwxIDEwLDZBMiwyIDAgMCwxIDEyLDRaXCI+PC9wYXRoPlxuICA8L3N2Zz5cbiAgYCxcbiAgcGx1czogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTE5LDEzSDEzVjE5SDExVjEzSDVWMTFIMTFWNUgxM1YxMUgxOVYxM1pcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICBkZWxldGU6IGBcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgPHBhdGggZD1cIk0xOSw0SDE1LjVMMTQuNSwzSDkuNUw4LjUsNEg1VjZIMTlNNiwxOUEyLDIgMCAwLDAgOCwyMUgxNkEyLDIgMCAwLDAgMTgsMTlWN0g2VjE5WlwiPjwvcGF0aD5cbiAgPC9zdmc+XG4gIGAsXG4gIGxpbms6IGBcbiAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgPHBhdGggZD1cIk0zLjkgMTJjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFoNFY3SDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDVoNHYtMS45SDdjLTEuNzEgMC0zLjEtMS4zOS0zLjEtMy4xek04IDEzaDh2LTJIOHYyem05LTZoLTR2MS45aDRjMS43MSAwIDMuMSAxLjM5IDMuMSAzLjFzLTEuMzkgMy4xLTMuMSAzLjFoLTRWMTdoNGMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXpcIj48L3BhdGg+XG4gIDwvc3ZnPlxuICBgLFxuICBjbG9zZTogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTE5LDYuNDFMMTcuNTksNUwxMiwxMC41OUw2LjQxLDVMNSw2LjQxTDEwLjU5LDEyTDUsMTcuNTlMNi40MSwxOUwxMiwxMy40MUwxNy41OSwxOUwxOSwxNy41OUwxMy40MSwxMkwxOSw2LjQxWlwiPjwvcGF0aD5cbiAgPC9zdmc+XG4gIGAsXG4gIGZpbGVfb3V0bGluZTogYFxuICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICA8cGF0aCBkPVwiTTE0LDJINkEyLDIgMCAwLDAgNCw0VjIwQTIsMiAwIDAsMCA2LDIySDE4QTIsMiAwIDAsMCAyMCwyMFY4TDE0LDJNMTgsMjBINlY0SDEzVjlIMThWMjBaXCIgLz5cbiAgPC9zdmc+XG4gIGAsXG4gIGZpbGVfdXBsb2FkOiBgXG4gIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgIDxwYXRoIGQ9XCJNMiAxMkg0VjE3SDIwVjEySDIyVjE3QzIyIDE4LjExIDIxLjExIDE5IDIwIDE5SDRDMi45IDE5IDIgMTguMTEgMiAxN1YxMk0xMiAyTDYuNDYgNy40Nkw3Ljg4IDguODhMMTEgNS43NVYxNUgxM1Y1Ljc1TDE2LjEzIDguODhMMTcuNTUgNy40NUwxMiAyWlwiIC8+XG4gIDwvc3ZnPlxuICBgLFxufTtcbiJdfQ==
@@ -39,7 +39,7 @@ export class GuiImageSelect {
39
39
  useExisting: forwardRef(() => GuiImageSelect),
40
40
  multi: true,
41
41
  },
42
- ], ngImport: i0, template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mtx-select [items]=\"config.options||[]\" appendTo=\".gui-form\" bindValue=\"value\"\n [(ngModel)]=\"value\"\n (change)=\"onValueChange()\"\n (open)=\"onPanelOpened()\">\n <ng-template ng-label-tmp let-opt=\"item\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n <ng-template ng-option-tmp let-opt=\"item\" let-index=\"index\" let-search=\"searchTerm\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n </mtx-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType==='inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option img,.gui-image-select .ng-select .ng-value img{height:100%;width:120px;object-fit:contain;border-radius:4px;background-color:var(--mat-option-hover-state-layer-color)}.gui-image-select .ng-select{padding:0 8px;margin:0 -8px}.gui-image-select .ng-select .ng-value-container{height:64px}.gui-image-select .ng-select .ng-value{display:inline-flex;align-items:center;gap:8px;height:100%;padding:8px 0}.gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{display:flex;align-items:center;gap:8px;height:64px;padding:8px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i4.MtxSelect, selector: "mtx-select", inputs: ["disabled", "addTag", "addTagText", "appearance", "appendTo", "bindLabel", "bindValue", "closeOnSelect", "clearAllText", "clearable", "clearOnBackspace", "compareWith", "dropdownPosition", "groupBy", "groupValue", "selectableGroup", "selectableGroupAsModel", "hideSelected", "isOpen", "loading", "loadingText", "labelForId", "markFirst", "maxSelectedItems", "multiple", "notFoundText", "searchable", "readonly", "searchFn", "searchWhileComposing", "selectOnTab", "trackByFn", "inputAttrs", "tabIndex", "openOnEnter", "minTermLength", "editableSearchTerm", "keyDownFn", "virtualScroll", "typeToSearchText", "typeahead", "clearSearchOnAdd", "items", "value", "id", "placeholder", "required", "errorStateMatcher", "aria-label", "aria-labelledby"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"], exportAs: ["mtxSelect"] }, { kind: "directive", type: i4.MtxSelectOptionTemplate, selector: "[ng-option-tmp]" }, { kind: "directive", type: i4.MtxSelectLabelTemplate, selector: "[ng-label-tmp]" }, { kind: "component", type: i5.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
42
+ ], ngImport: i0, template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mtx-select [items]=\"config.options||[]\" appendTo=\".gui-form\" bindValue=\"value\"\n [(ngModel)]=\"value\" [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n (change)=\"onValueChange()\"\n (open)=\"onPanelOpened()\">\n <ng-template ng-label-tmp let-opt=\"item\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n <ng-template ng-option-tmp let-opt=\"item\" let-index=\"index\" let-search=\"searchTerm\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n </mtx-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType==='inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option img,.gui-image-select .ng-select .ng-value img{height:100%;max-width:120px;object-fit:contain;border-radius:4px;background-color:var(--mat-option-hover-state-layer-color)}.gui-image-select .ng-select{padding:0 8px;margin:0 -8px}.gui-image-select .ng-select .ng-value-container{height:64px}.gui-image-select .ng-select .ng-value{display:inline-flex;align-items:center;gap:8px;height:100%;padding:8px 0}.gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{display:flex;align-items:center;gap:8px;height:64px;padding:8px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i4.MtxSelect, selector: "mtx-select", inputs: ["disabled", "addTag", "addTagText", "appearance", "appendTo", "bindLabel", "bindValue", "closeOnSelect", "clearAllText", "clearable", "clearOnBackspace", "compareWith", "dropdownPosition", "groupBy", "groupValue", "selectableGroup", "selectableGroupAsModel", "hideSelected", "isOpen", "loading", "loadingText", "labelForId", "markFirst", "maxSelectedItems", "multiple", "notFoundText", "searchable", "readonly", "searchFn", "searchWhileComposing", "selectOnTab", "trackByFn", "inputAttrs", "tabIndex", "openOnEnter", "minTermLength", "editableSearchTerm", "keyDownFn", "virtualScroll", "typeToSearchText", "typeahead", "clearSearchOnAdd", "items", "value", "id", "placeholder", "required", "errorStateMatcher", "aria-label", "aria-labelledby"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"], exportAs: ["mtxSelect"] }, { kind: "directive", type: i4.MtxSelectOptionTemplate, selector: "[ng-option-tmp]" }, { kind: "directive", type: i4.MtxSelectLabelTemplate, selector: "[ng-label-tmp]" }, { kind: "component", type: i5.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
43
43
  }
44
44
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiImageSelect, decorators: [{
45
45
  type: Component,
@@ -51,10 +51,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
51
51
  useExisting: forwardRef(() => GuiImageSelect),
52
52
  multi: true,
53
53
  },
54
- ], template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mtx-select [items]=\"config.options||[]\" appendTo=\".gui-form\" bindValue=\"value\"\n [(ngModel)]=\"value\"\n (change)=\"onValueChange()\"\n (open)=\"onPanelOpened()\">\n <ng-template ng-label-tmp let-opt=\"item\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n <ng-template ng-option-tmp let-opt=\"item\" let-index=\"index\" let-search=\"searchTerm\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n </mtx-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType==='inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option img,.gui-image-select .ng-select .ng-value img{height:100%;width:120px;object-fit:contain;border-radius:4px;background-color:var(--mat-option-hover-state-layer-color)}.gui-image-select .ng-select{padding:0 8px;margin:0 -8px}.gui-image-select .ng-select .ng-value-container{height:64px}.gui-image-select .ng-select .ng-value{display:inline-flex;align-items:center;gap:8px;height:100%;padding:8px 0}.gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{display:flex;align-items:center;gap:8px;height:64px;padding:8px}\n"] }]
54
+ ], template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mtx-select [items]=\"config.options||[]\" appendTo=\".gui-form\" bindValue=\"value\"\n [(ngModel)]=\"value\" [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n (change)=\"onValueChange()\"\n (open)=\"onPanelOpened()\">\n <ng-template ng-label-tmp let-opt=\"item\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n <ng-template ng-option-tmp let-opt=\"item\" let-index=\"index\" let-search=\"searchTerm\">\n <img [src]=\"opt.src\" [alt]=\"opt.label\" />\n <span>{{opt.label}}</span>\n </ng-template>\n </mtx-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType==='inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option img,.gui-image-select .ng-select .ng-value img{height:100%;max-width:120px;object-fit:contain;border-radius:4px;background-color:var(--mat-option-hover-state-layer-color)}.gui-image-select .ng-select{padding:0 8px;margin:0 -8px}.gui-image-select .ng-select .ng-value-container{height:64px}.gui-image-select .ng-select .ng-value{display:inline-flex;align-items:center;gap:8px;height:100%;padding:8px 0}.gui-form .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{display:flex;align-items:center;gap:8px;height:64px;padding:8px}\n"] }]
55
55
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
56
56
  type: Input
57
57
  }], disabled: [{
58
58
  type: Input
59
59
  }] } });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2ltYWdlLXNlbGVjdC9pbWFnZS1zZWxlY3QudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvaW1hZ2Utc2VsZWN0L2ltYWdlLXNlbGVjdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQW9CekUsTUFBTSxPQUFPLGNBQWM7SUFTekIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFSakMsV0FBTSxHQUF3QixFQUFFLENBQUM7UUFDakMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUlsQixhQUFRLEdBQTZCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUM5QyxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRUksQ0FBQztJQUU5QyxVQUFVLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUE0QjtRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBYztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxhQUFhLEtBQUksQ0FBQzs4R0FqQ1AsY0FBYztrR0FBZCxjQUFjLHVKQVJkO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkMxQkgsNjNCQW9CQTs7MkZEUWEsY0FBYztrQkFqQjFCLFNBQVM7K0JBQ0Usa0JBQWtCLFFBR3RCO3dCQUNKLEtBQUssRUFBRSw0QkFBNEI7cUJBQ3BDLGlCQUNjLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDOzRCQUM3QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjt3R0FHUSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgR3VpQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1pbWFnZS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2Utc2VsZWN0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1zZWxlY3Quc2NzcyddLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdndWktZmllbGQgZ3VpLWltYWdlLXNlbGVjdCcsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEd1aUltYWdlU2VsZWN0KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEd1aUltYWdlU2VsZWN0IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBjb25maWc6IFBhcnRpYWw8R3VpQ29udHJvbD4gPSB7fTtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICB2YWx1ZTogdW5rbm93bjtcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25WYWx1ZUNoYW5nZSgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgb25QYW5lbE9wZW5lZCgpIHt9XG59XG4iLCI8bWF0LWZvcm0tZmllbGQ+XG4gIDxzcGFuICpuZ0lmPVwiY29uZmlnLnByZWZpeFwiIG1hdFByZWZpeD57e2NvbmZpZy5wcmVmaXh9fTwvc3Bhbj5cbiAgPG10eC1zZWxlY3QgW2l0ZW1zXT1cImNvbmZpZy5vcHRpb25zfHxbXVwiIGFwcGVuZFRvPVwiLmd1aS1mb3JtXCIgYmluZFZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAob3Blbik9XCJvblBhbmVsT3BlbmVkKClcIj5cbiAgICA8bmctdGVtcGxhdGUgbmctbGFiZWwtdG1wIGxldC1vcHQ9XCJpdGVtXCI+XG4gICAgICA8aW1nIFtzcmNdPVwib3B0LnNyY1wiIFthbHRdPVwib3B0LmxhYmVsXCIgLz5cbiAgICAgIDxzcGFuPnt7b3B0LmxhYmVsfX08L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtb3B0PVwiaXRlbVwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LXNlYXJjaD1cInNlYXJjaFRlcm1cIj5cbiAgICAgIDxpbWcgW3NyY109XCJvcHQuc3JjXCIgW2FsdF09XCJvcHQubGFiZWxcIiAvPlxuICAgICAgPHNwYW4+e3tvcHQubGFiZWx9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L210eC1zZWxlY3Q+XG4gIDxzcGFuICpuZ0lmPVwiY29uZmlnLnN1ZmZpeFwiIG1hdFN1ZmZpeD57e2NvbmZpZy5zdWZmaXh9fTwvc3Bhbj5cbiAgPG1hdC1oaW50ICpuZ0lmPVwiY29uZmlnLnBhcmVudFR5cGU9PT0naW5saW5lJ1wiPlxuICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJjb25maWdcIj48L2d1aS1maWVsZC1sYWJlbD5cbiAgPC9tYXQtaGludD5cbjwvbWF0LWZvcm0tZmllbGQ+XG4iXX0=
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2ltYWdlLXNlbGVjdC9pbWFnZS1zZWxlY3QudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvaW1hZ2Utc2VsZWN0L2ltYWdlLXNlbGVjdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQW9CekUsTUFBTSxPQUFPLGNBQWM7SUFTekIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFSakMsV0FBTSxHQUF3QixFQUFFLENBQUM7UUFDakMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUlsQixhQUFRLEdBQTZCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUM5QyxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRUksQ0FBQztJQUU5QyxVQUFVLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUE0QjtRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBYztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxhQUFhLEtBQUksQ0FBQzs4R0FqQ1AsY0FBYztrR0FBZCxjQUFjLHVKQVJkO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkMxQkgsNjhCQXFCQTs7MkZET2EsY0FBYztrQkFqQjFCLFNBQVM7K0JBQ0Usa0JBQWtCLFFBR3RCO3dCQUNKLEtBQUssRUFBRSw0QkFBNEI7cUJBQ3BDLGlCQUNjLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDOzRCQUM3QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjt3R0FHUSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgR3VpQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1pbWFnZS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2Utc2VsZWN0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1zZWxlY3Quc2NzcyddLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdndWktZmllbGQgZ3VpLWltYWdlLXNlbGVjdCcsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEd1aUltYWdlU2VsZWN0KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEd1aUltYWdlU2VsZWN0IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBjb25maWc6IFBhcnRpYWw8R3VpQ29udHJvbD4gPSB7fTtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICB2YWx1ZTogdW5rbm93bjtcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25WYWx1ZUNoYW5nZSgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgb25QYW5lbE9wZW5lZCgpIHt9XG59XG4iLCI8bWF0LWZvcm0tZmllbGQ+XG4gIDxzcGFuICpuZ0lmPVwiY29uZmlnLnByZWZpeFwiIG1hdFByZWZpeD57e2NvbmZpZy5wcmVmaXh9fTwvc3Bhbj5cbiAgPG10eC1zZWxlY3QgW2l0ZW1zXT1cImNvbmZpZy5vcHRpb25zfHxbXVwiIGFwcGVuZFRvPVwiLmd1aS1mb3JtXCIgYmluZFZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy5wbGFjZWhvbGRlcnx8JydcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgIChvcGVuKT1cIm9uUGFuZWxPcGVuZWQoKVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBuZy1sYWJlbC10bXAgbGV0LW9wdD1cIml0ZW1cIj5cbiAgICAgIDxpbWcgW3NyY109XCJvcHQuc3JjXCIgW2FsdF09XCJvcHQubGFiZWxcIiAvPlxuICAgICAgPHNwYW4+e3tvcHQubGFiZWx9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1vcHQ9XCJpdGVtXCIgbGV0LWluZGV4PVwiaW5kZXhcIiBsZXQtc2VhcmNoPVwic2VhcmNoVGVybVwiPlxuICAgICAgPGltZyBbc3JjXT1cIm9wdC5zcmNcIiBbYWx0XT1cIm9wdC5sYWJlbFwiIC8+XG4gICAgICA8c3Bhbj57e29wdC5sYWJlbH19PC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbXR4LXNlbGVjdD5cbiAgPHNwYW4gKm5nSWY9XCJjb25maWcuc3VmZml4XCIgbWF0U3VmZml4Pnt7Y29uZmlnLnN1ZmZpeH19PC9zcGFuPlxuICA8bWF0LWhpbnQgKm5nSWY9XCJjb25maWcucGFyZW50VHlwZT09PSdpbmxpbmUnXCI+XG4gICAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cImNvbmZpZ1wiPjwvZ3VpLWZpZWxkLWxhYmVsPlxuICA8L21hdC1oaW50PlxuPC9tYXQtZm9ybS1maWVsZD5cbiJdfQ==
@@ -38,7 +38,7 @@ export class GuiInputNumber {
38
38
  useExisting: forwardRef(() => GuiInputNumber),
39
39
  multi: true,
40
40
  },
41
- ], ngImport: i0, template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <input matInput type=\"number\"\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [step]=\"config.step\"\n [min]=\"config.min!\"\n [max]=\"config.max!\"\n (change)=\"onValueChange()\">\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-input-number .mat-mdc-text-field-wrapper{padding-right:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
41
+ ], ngImport: i0, template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <input matInput type=\"number\"\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [step]=\"config.step\"\n [min]=\"config.min!\"\n [max]=\"config.max!\"\n (change)=\"onValueChange()\">\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-input-number .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .gui-input-number .mat-mdc-text-field-wrapper{padding-left:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
42
42
  }
43
43
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiInputNumber, decorators: [{
44
44
  type: Component,
@@ -50,7 +50,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
50
50
  useExisting: forwardRef(() => GuiInputNumber),
51
51
  multi: true,
52
52
  },
53
- ], template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <input matInput type=\"number\"\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [step]=\"config.step\"\n [min]=\"config.min!\"\n [max]=\"config.max!\"\n (change)=\"onValueChange()\">\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-input-number .mat-mdc-text-field-wrapper{padding-right:0}\n"] }]
53
+ ], template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <input matInput type=\"number\"\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [step]=\"config.step\"\n [min]=\"config.min!\"\n [max]=\"config.max!\"\n (change)=\"onValueChange()\">\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-input-number .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .gui-input-number .mat-mdc-text-field-wrapper{padding-left:0}\n"] }]
54
54
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
55
55
  type: Input
56
56
  }], disabled: [{
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2ludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgR3VpRmllbGRUeXBlID1cbiAgfCAnZ3JvdXAnXG4gIHwgJ2lubGluZSdcbiAgfCAndGFicydcbiAgfCAndGFiJ1xuICB8ICdtZW51J1xuICB8ICdtZW51SXRlbSdcbiAgfCAndGV4dCdcbiAgfCAnbnVtYmVyJ1xuICB8ICdzd2l0Y2gnXG4gIHwgJ3NlbGVjdCdcbiAgfCAnaW1hZ2VTZWxlY3QnXG4gIHwgJ2J1dHRvblRvZ2dsZSdcbiAgfCAnc2xpZGVyJ1xuICB8ICdmaWxsJ1xuICB8ICdpbWFnZSdcbiAgfCAndmlkZW8nXG4gIHwgJ2F1ZGlvJ1xuICB8ICdmaWxlJ1xuICB8ICd0ZXh0YXJlYSdcbiAgfCAnaGlkZGVuJztcblxuZXhwb3J0IHR5cGUgR3VpRmlsbE1vZGUgPSAnZmxhdCcgfCAnZ3JhZGllbnQnIHwgJ2ltYWdlJztcblxuZXhwb3J0IHR5cGUgR3VpU2xpZGVyTW9kZSA9ICdub3JtYWwnIHwgJ3JhbmdlJztcblxuZXhwb3J0IHR5cGUgR3VpVGFic01vZGUgPSAnbmF2JyB8ICdsaXN0JztcblxuZXhwb3J0IHR5cGUgR3VpQmFzaWNWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEd1aURlZmF1bHRWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpRmllbGQge1xuICB0eXBlOiBHdWlGaWVsZFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmYXVsdD86IEd1aURlZmF1bHRWYWx1ZTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGNvbD86IG51bWJlcjtcbiAgLy8gZ3JvdXAgJiBzdWJncm91cCAmIG1lbnUgJiB0YWJzICYgaW5saW5lXG4gIGNoaWxkcmVuPzogR3VpRmllbGRzIHwgR3VpRmllbGRbXTtcbiAgLy8gZ3JvdXAgJiB0YWJzXG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcbiAgLy8gbnVtYmVyICYgc2xpZGVyXG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBzdGVwPzogbnVtYmVyO1xuICAvLyB0ZXh0ICYgbnVtYmVyICYgc2xpZGVyICYgc2VsZWN0XG4gIHByZWZpeD86IHN0cmluZztcbiAgc3VmZml4Pzogc3RyaW5nO1xuICAvLyBzZWxlY3QgJiBidXR0b25Ub2dnbGUgJiBpbWFnZVNlbGVjdFxuICBvcHRpb25zPzogR3VpRmllbGRPcHRpb25bXTtcbiAgLy8gc2VsZWN0XG4gIHVzZUZvbnQ/OiBib29sZWFuO1xuICAvLyBzZWxlY3QgJiBidXR0b25Ub2dnbGVcbiAgbXVsdGlwbGU/OiBib29sZWFuO1xuICAvLyBidXR0b25Ub2dnbGVcbiAgdXNlSWNvbj86IGJvb2xlYW47XG4gIC8vIHRhYnNcbiAgdGVtcGxhdGU/OiBQYXJ0aWFsPEd1aUZpZWxkPjtcbiAgYWRkYWJsZT86IGJvb2xlYW47XG4gIC8vIGZpbGwgJiBzbGlkZXIgJiB0YWJzXG4gIG1vZGU/OiBHdWlGaWxsTW9kZSB8IEd1aVNsaWRlck1vZGUgfCBHdWlUYWJzTW9kZTtcbiAgLy8gdGV4dGFyZWFcbiAgcm93cz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlGaWVsZHMge1xuICBba2V5OiBzdHJpbmddOiBHdWlGaWVsZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlGaWVsZE9wdGlvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHNyYz86IHN0cmluZztcbiAgY29sPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUNvbnRyb2wgZXh0ZW5kcyBHdWlGaWVsZCB7XG4gIF90eXBlOiAnY29udHJvbCcgfCAnZ3JvdXAnIHwgJ2FycmF5JztcbiAga2V5OiBzdHJpbmc7XG4gIHBhcmVudFR5cGU6IEd1aUZpZWxkVHlwZTtcbiAgbW9kZWw/OiBhbnk7XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIGluZGV4PzogbnVtYmVyO1xuICBjaGlsZHJlbj86IEd1aUNvbnRyb2xbXTtcbiAgdGVtcGxhdGU/OiBQYXJ0aWFsPEd1aUNvbnRyb2w+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUNvbnRyb2xzIHtcbiAgW2tleTogc3RyaW5nXTogR3VpQ29udHJvbDtcbn1cbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2ludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgR3VpRmllbGRUeXBlID1cbiAgfCAnZ3JvdXAnXG4gIHwgJ2lubGluZSdcbiAgfCAndGFicydcbiAgfCAndGFiJ1xuICB8ICdtZW51J1xuICB8ICdtZW51SXRlbSdcbiAgfCAndGV4dCdcbiAgfCAnbnVtYmVyJ1xuICB8ICdzd2l0Y2gnXG4gIHwgJ3NsaWRlcidcbiAgfCAnZmlsbCdcbiAgfCAnc2VsZWN0J1xuICB8ICdidXR0b25Ub2dnbGUnXG4gIHwgJ2ltYWdlU2VsZWN0J1xuICB8ICd0ZXh0YXJlYSdcbiAgfCAnaGlkZGVuJ1xuICB8ICdpbWFnZSdcbiAgfCAndmlkZW8nXG4gIHwgJ2F1ZGlvJ1xuICB8ICdmaWxlJztcblxuZXhwb3J0IHR5cGUgR3VpRmlsbE1vZGUgPSAnZmxhdCcgfCAnZ3JhZGllbnQnIHwgJ2ltYWdlJztcblxuZXhwb3J0IHR5cGUgR3VpU2xpZGVyTW9kZSA9ICdub3JtYWwnIHwgJ3JhbmdlJztcblxuZXhwb3J0IHR5cGUgR3VpVGFic01vZGUgPSAnbmF2JyB8ICdsaXN0JztcblxuZXhwb3J0IHR5cGUgR3VpQmFzaWNWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEd1aURlZmF1bHRWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpRmllbGQge1xuICB0eXBlOiBHdWlGaWVsZFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmYXVsdD86IEd1aURlZmF1bHRWYWx1ZTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGNvbD86IG51bWJlcjtcbiAgLy8gZ3JvdXAgJiBzdWJncm91cCAmIG1lbnUgJiB0YWJzICYgaW5saW5lXG4gIGNoaWxkcmVuPzogR3VpRmllbGRzIHwgR3VpRmllbGRbXTtcbiAgLy8gZ3JvdXAgJiB0YWJzXG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcbiAgLy8gbnVtYmVyICYgc2xpZGVyXG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBzdGVwPzogbnVtYmVyO1xuICAvLyB0ZXh0ICYgbnVtYmVyICYgc2xpZGVyICYgc2VsZWN0XG4gIHByZWZpeD86IHN0cmluZztcbiAgc3VmZml4Pzogc3RyaW5nO1xuICAvLyBzZWxlY3QgJiBidXR0b25Ub2dnbGUgJiBpbWFnZVNlbGVjdFxuICBvcHRpb25zPzogR3VpRmllbGRPcHRpb25bXTtcbiAgLy8gc2VsZWN0XG4gIHVzZUZvbnQ/OiBib29sZWFuO1xuICAvLyBzZWxlY3QgJiBidXR0b25Ub2dnbGVcbiAgbXVsdGlwbGU/OiBib29sZWFuO1xuICAvLyBidXR0b25Ub2dnbGVcbiAgdXNlSWNvbj86IGJvb2xlYW47XG4gIC8vIHRhYnNcbiAgdGVtcGxhdGU/OiBQYXJ0aWFsPEd1aUZpZWxkPjtcbiAgYWRkYWJsZT86IGJvb2xlYW47XG4gIC8vIGZpbGwgJiBzbGlkZXIgJiB0YWJzXG4gIG1vZGU/OiBHdWlGaWxsTW9kZSB8IEd1aVNsaWRlck1vZGUgfCBHdWlUYWJzTW9kZTtcbiAgLy8gdGV4dGFyZWFcbiAgcm93cz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlGaWVsZHMge1xuICBba2V5OiBzdHJpbmddOiBHdWlGaWVsZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlGaWVsZE9wdGlvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHNyYz86IHN0cmluZztcbiAgY29sPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUNvbnRyb2wgZXh0ZW5kcyBHdWlGaWVsZCB7XG4gIF90eXBlOiAnY29udHJvbCcgfCAnZ3JvdXAnIHwgJ2FycmF5JztcbiAga2V5OiBzdHJpbmc7XG4gIHBhcmVudFR5cGU6IEd1aUZpZWxkVHlwZTtcbiAgbW9kZWw/OiBhbnk7XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIGluZGV4PzogbnVtYmVyO1xuICBjaGlsZHJlbj86IEd1aUNvbnRyb2xbXTtcbiAgdGVtcGxhdGU/OiBQYXJ0aWFsPEd1aUNvbnRyb2w+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUNvbnRyb2xzIHtcbiAgW2tleTogc3RyaW5nXTogR3VpQ29udHJvbDtcbn1cbiJdfQ==
@@ -40,7 +40,7 @@ export class GuiSelect {
40
40
  useExisting: forwardRef(() => GuiSelect),
41
41
  multi: true,
42
42
  },
43
- ], ngImport: i0, template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mat-select panelClass=\"gui-select\" hideSingleSelectionIndicator disableRipple\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [multiple]=\"config.multiple || false\"\n (selectionChange)=\"onValueChange()\">\n <mat-option *ngFor=\"let opt of config.options\" [value]=\"opt.value\" [disabled]=\"opt.disabled\">\n <span [style]=\"{fontFamily: config.useFont ? opt.value : ''}\">{{opt.label}}</span>\n </mat-option>\n </mat-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-select{--mat-select-trigger-text-size: 12px;--mat-option-label-text-size: 12px}.gui-select .mat-mdc-option{min-height:var(--mat-option-label-text-line-height);padding:0 8px}.gui-select .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:8px}.gui-select .mat-pseudo-checkbox{width:16px;height:16px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
43
+ ], ngImport: i0, template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mat-select panelClass=\"gui-select\" hideSingleSelectionIndicator disableRipple\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [multiple]=\"config.multiple || false\"\n (selectionChange)=\"onValueChange()\">\n <mat-option *ngFor=\"let opt of config.options\" [value]=\"opt.value\" [disabled]=\"opt.disabled\">\n <span [style]=\"{fontFamily: config.useFont ? opt.value : ''}\">{{opt.label}}</span>\n </mat-option>\n </mat-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-select{--mat-select-trigger-text-size: 12px;--mat-option-label-text-size: 12px}.gui-select .mat-mdc-option{min-height:var(--mat-option-label-text-line-height);padding:0 8px}.gui-select .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:8px}.gui-select .mat-pseudo-checkbox{width:16px;height:16px;border-width:1px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
44
44
  }
45
45
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiSelect, decorators: [{
46
46
  type: Component,
@@ -52,7 +52,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
52
52
  useExisting: forwardRef(() => GuiSelect),
53
53
  multi: true,
54
54
  },
55
- ], template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mat-select panelClass=\"gui-select\" hideSingleSelectionIndicator disableRipple\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [multiple]=\"config.multiple || false\"\n (selectionChange)=\"onValueChange()\">\n <mat-option *ngFor=\"let opt of config.options\" [value]=\"opt.value\" [disabled]=\"opt.disabled\">\n <span [style]=\"{fontFamily: config.useFont ? opt.value : ''}\">{{opt.label}}</span>\n </mat-option>\n </mat-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-select{--mat-select-trigger-text-size: 12px;--mat-option-label-text-size: 12px}.gui-select .mat-mdc-option{min-height:var(--mat-option-label-text-line-height);padding:0 8px}.gui-select .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:8px}.gui-select .mat-pseudo-checkbox{width:16px;height:16px}\n"] }]
55
+ ], template: "<mat-form-field>\n <span *ngIf=\"config.prefix\" matPrefix>{{config.prefix}}</span>\n <mat-select panelClass=\"gui-select\" hideSingleSelectionIndicator disableRipple\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder||''\"\n [multiple]=\"config.multiple || false\"\n (selectionChange)=\"onValueChange()\">\n <mat-option *ngFor=\"let opt of config.options\" [value]=\"opt.value\" [disabled]=\"opt.disabled\">\n <span [style]=\"{fontFamily: config.useFont ? opt.value : ''}\">{{opt.label}}</span>\n </mat-option>\n </mat-select>\n <span *ngIf=\"config.suffix\" matSuffix>{{config.suffix}}</span>\n <mat-hint *ngIf=\"config.parentType === 'inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n </mat-hint>\n</mat-form-field>\n", styles: [".gui-select{--mat-select-trigger-text-size: 12px;--mat-option-label-text-size: 12px}.gui-select .mat-mdc-option{min-height:var(--mat-option-label-text-line-height);padding:0 8px}.gui-select .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:8px}.gui-select .mat-pseudo-checkbox{width:16px;height:16px;border-width:1px}\n"] }]
56
56
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
57
57
  type: Input
58
58
  }], disabled: [{