@arsedizioni/ars-utils 18.1.25 → 18.1.26

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.
@@ -54,11 +54,11 @@ export class PromptDialogComponent {
54
54
  this.done.emit({ value: this.value, options: this.data.options });
55
55
  }
56
56
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: PromptDialogComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
57
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: PromptDialogComponent, isStandalone: true, selector: "ng-component", outputs: { done: "done" }, host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "f", first: true, predicate: ["f"], descendants: true }], ngImport: i0, template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n @if (!data.type) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"text\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" maxlength=\"200\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 1) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"date\" matInput [(ngModel)]=\"value\" name=\"_value\" #_value=\"ngModel\" [required]=\"data.required\">\r\n @if (_value.invalid) {\r\n <mat-error>Data non valida.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 2) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"number\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" [min]=\"data.minValue\" [max]=\"data.maxValue\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 3) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <textarea cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" cdkTextareaAutosize cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"\r\n maxlength=\"1000\"></textarea>\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-hint align=\"end\">{{_value.value?.length || 0}}/1000 </mat-hint>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 5) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <mat-select [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\" [required]=\"data.required\">\r\n @for (i of data.initialValue; track i) {\r\n <mat-option [value]=\"i.value\">\r\n {{i.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n @if (data.options) {\r\n <div>\r\n @for (o of data.options; track o; let i = $index) {\r\n <div>\r\n <mat-checkbox color=\"primary\" [(ngModel)]=\"o.value\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <br>\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid\" \r\n (click)=\"ok()\">{{data.okCaption}}</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\"\r\n >{{data.cancelCaption}}</button>\r\n </div>\r\n</div>", styles: [":root{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { 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: "directive", type: i5.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] }); }
57
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: PromptDialogComponent, isStandalone: true, selector: "ng-component", outputs: { done: "done" }, host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "f", first: true, predicate: ["f"], descendants: true }], ngImport: i0, template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n @if (!data.type) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"text\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" maxlength=\"200\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 1) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"date\" matInput [(ngModel)]=\"value\" name=\"_value\" #_value=\"ngModel\" [required]=\"data.required\">\r\n @if (_value.invalid) {\r\n <mat-error>Data non valida.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 2) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"number\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" [min]=\"data.minValue\" [max]=\"data.maxValue\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 3) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <textarea cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" cdkTextareaAutosize cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"\r\n maxlength=\"1000\"></textarea>\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-hint align=\"end\">{{_value.value?.length || 0}}/1000 </mat-hint>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 5) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <mat-select [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\" [required]=\"data.required\">\r\n @for (i of data.initialValue; track i) {\r\n <mat-option [value]=\"i.value\">\r\n {{i.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n @if (data.options) {\r\n <div>\r\n @for (o of data.options; track o; let i = $index) {\r\n <div>\r\n <mat-checkbox color=\"primary\" [(ngModel)]=\"o.value\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <br>\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid\" \r\n (click)=\"ok()\">{{data.okCaption}}</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\"\r\n >{{data.cancelCaption}}</button>\r\n </div>\r\n</div>", styles: ["html{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){html{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;font-weight:700;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { 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: "directive", type: i5.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] }); }
58
58
  }
59
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: PromptDialogComponent, decorators: [{
60
60
  type: Component,
61
- args: [{ host: { 'Bind': SystemUtils.generateUUID() }, standalone: true, imports: [MatDialogTitle, MatDialogContent, FormsModule, FlexModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, TextFieldModule, MatSelectModule, MatOptionModule, MatCheckboxModule, MatDialogActions, MatDialogClose], template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n @if (!data.type) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"text\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" maxlength=\"200\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 1) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"date\" matInput [(ngModel)]=\"value\" name=\"_value\" #_value=\"ngModel\" [required]=\"data.required\">\r\n @if (_value.invalid) {\r\n <mat-error>Data non valida.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 2) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"number\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" [min]=\"data.minValue\" [max]=\"data.maxValue\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 3) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <textarea cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" cdkTextareaAutosize cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"\r\n maxlength=\"1000\"></textarea>\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-hint align=\"end\">{{_value.value?.length || 0}}/1000 </mat-hint>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 5) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <mat-select [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\" [required]=\"data.required\">\r\n @for (i of data.initialValue; track i) {\r\n <mat-option [value]=\"i.value\">\r\n {{i.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n @if (data.options) {\r\n <div>\r\n @for (o of data.options; track o; let i = $index) {\r\n <div>\r\n <mat-checkbox color=\"primary\" [(ngModel)]=\"o.value\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <br>\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid\" \r\n (click)=\"ok()\">{{data.okCaption}}</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\"\r\n >{{data.cancelCaption}}</button>\r\n </div>\r\n</div>", styles: [":root{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
61
+ args: [{ host: { 'Bind': SystemUtils.generateUUID() }, standalone: true, imports: [MatDialogTitle, MatDialogContent, FormsModule, FlexModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, TextFieldModule, MatSelectModule, MatOptionModule, MatCheckboxModule, MatDialogActions, MatDialogClose], template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div mat-dialog-content>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n @if (!data.type) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"text\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" maxlength=\"200\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 1) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"date\" matInput [(ngModel)]=\"value\" name=\"_value\" #_value=\"ngModel\" [required]=\"data.required\">\r\n @if (_value.invalid) {\r\n <mat-error>Data non valida.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 2) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <input type=\"number\" cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" [min]=\"data.minValue\" [max]=\"data.maxValue\">\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 3) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <textarea cdkFocusInitial matInput [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\"\r\n [required]=\"data.required\" cdkTextareaAutosize cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"\r\n maxlength=\"1000\"></textarea>\r\n @if (value) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Pulisci\" (click)=\"value = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-hint align=\"end\">{{_value.value?.length || 0}}/1000 </mat-hint>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n @if (data.type === 5) {\r\n <mat-form-field [appearance]=\"data.appearance\" style=\"width: 100%;\">\r\n <mat-label>{{data.description}}</mat-label>\r\n <mat-select [(ngModel)]=\"value\" #_value=\"ngModel\" name=\"_value\" [required]=\"data.required\">\r\n @for (i of data.initialValue; track i) {\r\n <mat-option [value]=\"i.value\">\r\n {{i.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n @if (_value.invalid) {\r\n <mat-error>Obbligatorio.</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n </div>\r\n @if (data.options) {\r\n <div>\r\n @for (o of data.options; track o; let i = $index) {\r\n <div>\r\n <mat-checkbox color=\"primary\" [(ngModel)]=\"o.value\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n <br>\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid\" \r\n (click)=\"ok()\">{{data.okCaption}}</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\"\r\n >{{data.cancelCaption}}</button>\r\n </div>\r\n</div>", styles: ["html{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){html{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;font-weight:700;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
62
62
  }], ctorParameters: () => [{ type: undefined, decorators: [{
63
63
  type: Inject,
64
64
  args: [MAT_DIALOG_DATA]
@@ -110,4 +110,4 @@ export class _PromptDialogService {
110
110
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: _PromptDialogService, decorators: [{
111
111
  type: Injectable
112
112
  }], ctorParameters: () => [{ type: i11.DialogService }] });
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9wcm9tcHQvcHJvbXB0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9wcm9tcHQvcHJvbXB0LWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFVLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUM3SSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUF3QyxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFB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QU07MkJBQUMsZUFBZTt5Q0FQVCxDQUFDO3NCQUFoQixTQUFTO3VCQUFDLEdBQUc7Z0JBQ0osSUFBSTtzQkFBYixNQUFNOztBQWdDUixNQUFNLE9BQU8sb0JBQW9CO0lBQ2hDLFlBQ1MsT0FBc0I7UUFBdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZTtJQUMzQixDQUFDO0lBRUw7Ozs7Ozs7Ozs7UUFVSTtJQUNKLE1BQU0sQ0FDSixLQUFhLEVBQ2IsT0FBZSxDQUFDLEVBQ2hCLFdBQW1CLEVBQ25CLGVBQW9CLElBQUksRUFDeEIsWUFBb0IsSUFBSSxFQUN4QixnQkFBd0IsU0FBUyxFQUNqQyxVQUFlLElBQUksRUFDbkIsUUFBZ0IsR0FBRztRQUVuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzlDLFNBQVMsRUFBRSxrQkFBa0I7WUFDN0IsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsS0FBSztZQUNuQixJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLEtBQUs7Z0JBQ1osSUFBSSxFQUFFLElBQUk7Z0JBQ1YsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLFlBQVksRUFBRSxZQUFZO2dCQUMxQixTQUFTLEVBQUUsU0FBUztnQkFDcEIsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixPQUFPLEVBQUUsT0FBTzthQUNHO1lBQ3JCLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLEtBQUssR0FBRyxJQUFJO1lBQ3RCLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0E3Q1csb0JBQW9CO2tIQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbmplY3RhYmxlLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0sIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1RpdGxlLCBNYXREaWFsb2dDb250ZW50LCBNYXREaWFsb2dBY3Rpb25zLCBNYXREaWFsb2dDbG9zZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRGF0ZUludGVydmFsIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgUHJvbXB0RGlhbG9nRGF0YSwgUHJvbXB0RGlhbG9nUmVzdWx0LCBQcm9tcHREaWFsb2dUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMnO1xyXG5pbXBvcnQgeyBTeXN0ZW1VdGlscyB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvY29yZSc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgVGV4dEZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RleHQtZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9mbGV4JztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWknO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9tcHQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wcm9tcHQtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTWF0RGlhbG9nVGl0bGUsIE1hdERpYWxvZ0NvbnRlbnQsIEZvcm1zTW9kdWxlLCBGbGV4TW9kdWxlLCAgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBUZXh0RmllbGRNb2R1bGUsIE1hdFNlbGVjdE1vZHVsZSwgIE1hdE9wdGlvbk1vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvbXB0RGlhbG9nQ29tcG9uZW50IHtcclxuICBAVmlld0NoaWxkKCdmJykgZiE6IE5nRm9ybTtcclxuICBAT3V0cHV0KCkgZG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvbXB0RGlhbG9nUmVzdWx0PigpO1xyXG5cclxuICBkYXRhOiBQcm9tcHREaWFsb2dEYXRhO1xyXG4gIHZhbHVlOiBhbnkgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBfZGF0YTogUHJvbXB0RGlhbG9nRGF0YVxyXG4gICkge1xyXG4gICAgdGhpcy5kYXRhID0gX2RhdGEgfHwgeyBhcHBlYXJhbmNlOiAnZmlsbCcsIHRpdGxlOiAnSW5zZXJpc2NpIGRhdG8nLCB0eXBlOiBQcm9tcHREaWFsb2dUeXBlLkRlZmF1bHQgfTtcclxuICAgIGlmICghdGhpcy5kYXRhLmFwcGVhcmFuY2UpIHRoaXMuZGF0YS5hcHBlYXJhbmNlID0gJ2ZpbGwnO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEudGl0bGUpIHRoaXMuZGF0YS50aXRsZSA9ICdJbnNlcmlzY2kgZGF0byc7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS50eXBlKSB0aGlzLmRhdGEudHlwZSA9IFByb21wdERpYWxvZ1R5cGUuRGVmYXVsdDtcclxuICAgIGlmICghdGhpcy5kYXRhLm9rQ2FwdGlvbikgdGhpcy5kYXRhLm9rQ2FwdGlvbiA9ICdPayc7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS5jYW5jZWxDYXB0aW9uKSB0aGlzLmRhdGEuY2FuY2VsQ2FwdGlvbiA9ICdBbm51bGxhJztcclxuICAgIGlmICh0aGlzLmRhdGEudHlwZSA9PT0gUHJvbXB0RGlhbG9nVHlwZS5EYXRlSW50ZXJ2YWwpXHJcbiAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZUludGVydmFsKCk7XHJcbiAgICBpZiAodGhpcy5kYXRhLmluaXRpYWxWYWx1ZSAmJiB0aGlzLmRhdGEudHlwZSAhPT0gUHJvbXB0RGlhbG9nVHlwZS5MaXN0KVxyXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5kYXRhLmluaXRpYWxWYWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb25lXHJcbiAgICovXHJcbiAgb2soKSB7XHJcbiAgICBpZiAodGhpcy5mLmZvcm0uaW52YWxpZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5kb25lLmVtaXQoeyB2YWx1ZTogdGhpcy52YWx1ZSwgb3B0aW9uczogdGhpcy5kYXRhLm9wdGlvbnMgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG4gZXhwb3J0IGNsYXNzIF9Qcm9tcHREaWFsb2dTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyAkZGlhbG9nOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAgKiBQcm9tcHQgdXNlciB0byBpbnNlcnQgYSB2YWx1ZVxyXG4gICAgKiBAcGFyYW0gdGl0bGUgOiB0aGUgZGlhbG9nIHRpdGxlXHJcbiAgICAqIEBwYXJhbSB0eXBlIDogdGhlIGlucHV0IHR5cGU6IDAgPSB0ZXh0LCAxID0gZGF0ZSwgMiA9IG51bWJlclxyXG4gICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gOiB0aGUgcGxhY2Vob2xkZXIgZGVzY3JpcHRpb25cclxuICAgICogQHBhcmFtIGluaXRpYWxWYWx1ZSA6IHRoZSBpbml0aWFsIHZhbHVlXHJcbiAgICAqIEBwYXJhbSBva0NhcHRpb24gOiBvayBidXR0b24gY2FwdGlvblxyXG4gICAgKiBAcGFyYW0gY2FuY2VsQ2FwdGlvbiA6IGNhbmNlbCBidXR0b24gY2FwdGlvblxyXG4gICAgKiBAcGFyYW0gb3B0aW9ucyA6IGNoZWNrYWJsZSBvcHRpb24gbGlzdFxyXG4gICAgKiBAcGFyYW0gd2lkdGg6IHRoZSBwcmVmZXJyZWQgd2lkdGhcclxuICAgICovXHJcbiAgcHJvbXB0KFxyXG4gICAgdGl0bGU6IHN0cmluZyxcclxuICAgIHR5cGU6IG51bWJlciA9IDAsXHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxyXG4gICAgaW5pdGlhbFZhbHVlOiBhbnkgPSBudWxsLFxyXG4gICAgb2tDYXB0aW9uOiBzdHJpbmcgPSAnT2snLFxyXG4gICAgY2FuY2VsQ2FwdGlvbjogc3RyaW5nID0gJ0FubnVsbGEnLFxyXG4gICAgb3B0aW9uczogYW55ID0gbnVsbCxcclxuICAgIHdpZHRoOiBudW1iZXIgPSA1MDBcclxuICApOiBNYXREaWFsb2dSZWY8UHJvbXB0RGlhbG9nQ29tcG9uZW50PiB7XHJcbiAgICByZXR1cm4gdGhpcy4kZGlhbG9nLm9wZW4oUHJvbXB0RGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ2luc2VyaXNjaSB2YWxvcmUnLFxyXG4gICAgICBhdXRvRm9jdXM6IHRydWUsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogZmFsc2UsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXHJcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsVmFsdWUsXHJcbiAgICAgICAgb2tDYXB0aW9uOiBva0NhcHRpb24sXHJcbiAgICAgICAgY2FuY2VsQ2FwdGlvbjogY2FuY2VsQ2FwdGlvbixcclxuICAgICAgICBhcHBlYXJhbmNlOiAnZmlsbCcsXHJcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1xyXG4gICAgICB9IGFzIFByb21wdERpYWxvZ0RhdGEsXHJcbiAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiB3aWR0aCArICdweCcsXHJcbiAgICAgIHdpZHRoOiAnOTklJ1xyXG4gICAgfSk7XHJcbiAgfVxyXG59IiwiPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3tkYXRhLnRpdGxlfX08L2gyPlxyXG48ZGl2IG1hdC1kaWFsb2ctY29udGVudD5cclxuICA8Zm9ybSBuYW1lPVwiZm9ybVwiICNmPVwibmdGb3JtXCIgbm92YWxpZGF0ZT5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjMycHhcIiBmeEZpbGw+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgIEBpZiAoIWRhdGEudHlwZSkge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2RhdGEuZGVzY3JpcHRpb259fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2RrRm9jdXNJbml0aWFsIG1hdElucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiAjX3ZhbHVlPVwibmdNb2RlbFwiIG5hbWU9XCJfdmFsdWVcIlxyXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiZGF0YS5yZXF1aXJlZFwiIG1heGxlbmd0aD1cIjIwMFwiPlxyXG4gICAgICAgICAgQGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIlB1bGlzY2lcIiAoY2xpY2spPVwidmFsdWUgPSAnJ1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBAaWYgKF92YWx1ZS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICA8bWF0LWVycm9yPk9iYmxpZ2F0b3Jpby48L21hdC1lcnJvcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGRhdGEudHlwZSA9PT0gMSkge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2RhdGEuZGVzY3JpcHRpb259fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIG5hbWU9XCJfdmFsdWVcIiAjX3ZhbHVlPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJkYXRhLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICBAaWYgKF92YWx1ZS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICA8bWF0LWVycm9yPkRhdGEgbm9uIHZhbGlkYS48L21hdC1lcnJvcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGRhdGEudHlwZSA9PT0gMikge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2RhdGEuZGVzY3JpcHRpb259fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjZGtGb2N1c0luaXRpYWwgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiICNfdmFsdWU9XCJuZ01vZGVsXCIgbmFtZT1cIl92YWx1ZVwiXHJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJkYXRhLnJlcXVpcmVkXCIgW21pbl09XCJkYXRhLm1pblZhbHVlXCIgW21heF09XCJkYXRhLm1heFZhbHVlXCI+XHJcbiAgICAgICAgICBAaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiUHVsaXNjaVwiIChjbGljayk9XCJ2YWx1ZSA9ICcnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoX3ZhbHVlLmludmFsaWQpIHtcclxuICAgICAgICAgIDxtYXQtZXJyb3I+T2JibGlnYXRvcmlvLjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoZGF0YS50eXBlID09PSAzKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImRhdGEuYXBwZWFyYW5jZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7ZGF0YS5kZXNjcmlwdGlvbn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgY2RrRm9jdXNJbml0aWFsIG1hdElucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiAjX3ZhbHVlPVwibmdNb2RlbFwiIG5hbWU9XCJfdmFsdWVcIlxyXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiZGF0YS5yZXF1aXJlZFwiIGNka1RleHRhcmVhQXV0b3NpemUgY2RrQXV0b3NpemVNaW5Sb3dzPVwiMVwiIGNka0F1dG9zaXplTWF4Um93cz1cIjEwXCJcclxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwMFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICBAaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiUHVsaXNjaVwiIChjbGljayk9XCJ2YWx1ZSA9ICcnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cImVuZFwiPnt7X3ZhbHVlLnZhbHVlPy5sZW5ndGggfHwgMH19LzEwMDAgPC9tYXQtaGludD5cclxuICAgICAgICAgIEBpZiAoX3ZhbHVlLmludmFsaWQpIHtcclxuICAgICAgICAgIDxtYXQtZXJyb3I+T2JibGlnYXRvcmlvLjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoZGF0YS50eXBlID09PSA1KSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImRhdGEuYXBwZWFyYW5jZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7ZGF0YS5kZXNjcmlwdGlvbn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgI192YWx1ZT1cIm5nTW9kZWxcIiBuYW1lPVwiX3ZhbHVlXCIgW3JlcXVpcmVkXT1cImRhdGEucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgQGZvciAoaSBvZiBkYXRhLmluaXRpYWxWYWx1ZTsgdHJhY2sgaSkge1xyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaS52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7aS5uYW1lfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICBAaWYgKF92YWx1ZS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICA8bWF0LWVycm9yPk9iYmxpZ2F0b3Jpby48L21hdC1lcnJvcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIEBpZiAoZGF0YS5vcHRpb25zKSB7XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgQGZvciAobyBvZiBkYXRhLm9wdGlvbnM7IHRyYWNrIG87IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggY29sb3I9XCJwcmltYXJ5XCIgWyhuZ01vZGVsKV09XCJvLnZhbHVlXCIgbmFtZT1cIm9wdF97e2l9fVwiPlxyXG4gICAgICAgICAgICB7e28uZGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxicj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCIgZnhGaWxsPlxyXG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImYuZm9ybS5pbnZhbGlkXCIgXHJcbiAgICAgIChjbGljayk9XCJvaygpXCI+e3tkYXRhLm9rQ2FwdGlvbn19PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgID57e2RhdGEuY2FuY2VsQ2FwdGlvbn19PC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9wcm9tcHQvcHJvbXB0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9wcm9tcHQvcHJvbXB0LWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFVLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUM3SSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUF3QyxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFB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QU07MkJBQUMsZUFBZTt5Q0FQVCxDQUFDO3NCQUFoQixTQUFTO3VCQUFDLEdBQUc7Z0JBQ0osSUFBSTtzQkFBYixNQUFNOztBQWdDUixNQUFNLE9BQU8sb0JBQW9CO0lBQ2hDLFlBQ1MsT0FBc0I7UUFBdEIsWUFBTyxHQUFQLE9BQU8sQ0FBZTtJQUMzQixDQUFDO0lBRUw7Ozs7Ozs7Ozs7UUFVSTtJQUNKLE1BQU0sQ0FDSixLQUFhLEVBQ2IsT0FBZSxDQUFDLEVBQ2hCLFdBQW1CLEVBQ25CLGVBQW9CLElBQUksRUFDeEIsWUFBb0IsSUFBSSxFQUN4QixnQkFBd0IsU0FBUyxFQUNqQyxVQUFlLElBQUksRUFDbkIsUUFBZ0IsR0FBRztRQUVuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzlDLFNBQVMsRUFBRSxrQkFBa0I7WUFDN0IsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsS0FBSztZQUNuQixJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLEtBQUs7Z0JBQ1osSUFBSSxFQUFFLElBQUk7Z0JBQ1YsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLFlBQVksRUFBRSxZQUFZO2dCQUMxQixTQUFTLEVBQUUsU0FBUztnQkFDcEIsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixPQUFPLEVBQUUsT0FBTzthQUNHO1lBQ3JCLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLEtBQUssR0FBRyxJQUFJO1lBQ3RCLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0E3Q1csb0JBQW9CO2tIQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbmplY3RhYmxlLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0sIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1RpdGxlLCBNYXREaWFsb2dDb250ZW50LCBNYXREaWFsb2dBY3Rpb25zLCBNYXREaWFsb2dDbG9zZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRGF0ZUludGVydmFsIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgUHJvbXB0RGlhbG9nRGF0YSwgUHJvbXB0RGlhbG9nUmVzdWx0LCBQcm9tcHREaWFsb2dUeXBlIH0gZnJvbSAnLi4vLi4vZGVmaW5pdGlvbnMnO1xyXG5pbXBvcnQgeyBTeXN0ZW1VdGlscyB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvY29yZSc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgVGV4dEZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RleHQtZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9mbGV4JztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWknO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9tcHQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wcm9tcHQtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTWF0RGlhbG9nVGl0bGUsIE1hdERpYWxvZ0NvbnRlbnQsIEZvcm1zTW9kdWxlLCBGbGV4TW9kdWxlLCAgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBUZXh0RmllbGRNb2R1bGUsIE1hdFNlbGVjdE1vZHVsZSwgIE1hdE9wdGlvbk1vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvbXB0RGlhbG9nQ29tcG9uZW50IHtcclxuICBAVmlld0NoaWxkKCdmJykgZiE6IE5nRm9ybTtcclxuICBAT3V0cHV0KCkgZG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvbXB0RGlhbG9nUmVzdWx0PigpO1xyXG5cclxuICBkYXRhOiBQcm9tcHREaWFsb2dEYXRhO1xyXG4gIHZhbHVlOiBhbnkgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBfZGF0YTogUHJvbXB0RGlhbG9nRGF0YVxyXG4gICkge1xyXG4gICAgdGhpcy5kYXRhID0gX2RhdGEgfHwgeyBhcHBlYXJhbmNlOiAnZmlsbCcsIHRpdGxlOiAnSW5zZXJpc2NpIGRhdG8nLCB0eXBlOiBQcm9tcHREaWFsb2dUeXBlLkRlZmF1bHQgfTtcclxuICAgIGlmICghdGhpcy5kYXRhLmFwcGVhcmFuY2UpIHRoaXMuZGF0YS5hcHBlYXJhbmNlID0gJ2ZpbGwnO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEudGl0bGUpIHRoaXMuZGF0YS50aXRsZSA9ICdJbnNlcmlzY2kgZGF0byc7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS50eXBlKSB0aGlzLmRhdGEudHlwZSA9IFByb21wdERpYWxvZ1R5cGUuRGVmYXVsdDtcclxuICAgIGlmICghdGhpcy5kYXRhLm9rQ2FwdGlvbikgdGhpcy5kYXRhLm9rQ2FwdGlvbiA9ICdPayc7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS5jYW5jZWxDYXB0aW9uKSB0aGlzLmRhdGEuY2FuY2VsQ2FwdGlvbiA9ICdBbm51bGxhJztcclxuICAgIGlmICh0aGlzLmRhdGEudHlwZSA9PT0gUHJvbXB0RGlhbG9nVHlwZS5EYXRlSW50ZXJ2YWwpXHJcbiAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZUludGVydmFsKCk7XHJcbiAgICBpZiAodGhpcy5kYXRhLmluaXRpYWxWYWx1ZSAmJiB0aGlzLmRhdGEudHlwZSAhPT0gUHJvbXB0RGlhbG9nVHlwZS5MaXN0KVxyXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5kYXRhLmluaXRpYWxWYWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb25lXHJcbiAgICovXHJcbiAgb2soKSB7XHJcbiAgICBpZiAodGhpcy5mLmZvcm0uaW52YWxpZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5kb25lLmVtaXQoeyB2YWx1ZTogdGhpcy52YWx1ZSwgb3B0aW9uczogdGhpcy5kYXRhLm9wdGlvbnMgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG4gZXhwb3J0IGNsYXNzIF9Qcm9tcHREaWFsb2dTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyAkZGlhbG9nOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAgKiBQcm9tcHQgdXNlciB0byBpbnNlcnQgYSB2YWx1ZVxyXG4gICAgKiBAcGFyYW0gdGl0bGUgOiB0aGUgZGlhbG9nIHRpdGxlXHJcbiAgICAqIEBwYXJhbSB0eXBlIDogdGhlIGlucHV0IHR5cGU6IDAgPSB0ZXh0LCAxID0gZGF0ZSwgMiA9IG51bWJlclxyXG4gICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gOiB0aGUgcGxhY2Vob2xkZXIgZGVzY3JpcHRpb25cclxuICAgICogQHBhcmFtIGluaXRpYWxWYWx1ZSA6IHRoZSBpbml0aWFsIHZhbHVlXHJcbiAgICAqIEBwYXJhbSBva0NhcHRpb24gOiBvayBidXR0b24gY2FwdGlvblxyXG4gICAgKiBAcGFyYW0gY2FuY2VsQ2FwdGlvbiA6IGNhbmNlbCBidXR0b24gY2FwdGlvblxyXG4gICAgKiBAcGFyYW0gb3B0aW9ucyA6IGNoZWNrYWJsZSBvcHRpb24gbGlzdFxyXG4gICAgKiBAcGFyYW0gd2lkdGg6IHRoZSBwcmVmZXJyZWQgd2lkdGhcclxuICAgICovXHJcbiAgcHJvbXB0KFxyXG4gICAgdGl0bGU6IHN0cmluZyxcclxuICAgIHR5cGU6IG51bWJlciA9IDAsXHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxyXG4gICAgaW5pdGlhbFZhbHVlOiBhbnkgPSBudWxsLFxyXG4gICAgb2tDYXB0aW9uOiBzdHJpbmcgPSAnT2snLFxyXG4gICAgY2FuY2VsQ2FwdGlvbjogc3RyaW5nID0gJ0FubnVsbGEnLFxyXG4gICAgb3B0aW9uczogYW55ID0gbnVsbCxcclxuICAgIHdpZHRoOiBudW1iZXIgPSA1MDBcclxuICApOiBNYXREaWFsb2dSZWY8UHJvbXB0RGlhbG9nQ29tcG9uZW50PiB7XHJcbiAgICByZXR1cm4gdGhpcy4kZGlhbG9nLm9wZW4oUHJvbXB0RGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGFyaWFMYWJlbDogJ2luc2VyaXNjaSB2YWxvcmUnLFxyXG4gICAgICBhdXRvRm9jdXM6IHRydWUsXHJcbiAgICAgIHJlc3RvcmVGb2N1czogZmFsc2UsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXHJcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsVmFsdWUsXHJcbiAgICAgICAgb2tDYXB0aW9uOiBva0NhcHRpb24sXHJcbiAgICAgICAgY2FuY2VsQ2FwdGlvbjogY2FuY2VsQ2FwdGlvbixcclxuICAgICAgICBhcHBlYXJhbmNlOiAnZmlsbCcsXHJcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1xyXG4gICAgICB9IGFzIFByb21wdERpYWxvZ0RhdGEsXHJcbiAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgICAgbWluV2lkdGg6ICczNzVweCcsXHJcbiAgICAgIG1heFdpZHRoOiB3aWR0aCArICdweCcsXHJcbiAgICAgIHdpZHRoOiAnOTklJ1xyXG4gICAgfSk7XHJcbiAgfVxyXG59IiwiPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3tkYXRhLnRpdGxlfX08L2gyPlxyXG48ZGl2IG1hdC1kaWFsb2ctY29udGVudD5cclxuICA8Zm9ybSBuYW1lPVwiZm9ybVwiICNmPVwibmdGb3JtXCIgbm92YWxpZGF0ZT5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjMycHhcIiBmeEZpbGw+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgIEBpZiAoIWRhdGEudHlwZSkge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2RhdGEuZGVzY3JpcHRpb259fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2RrRm9jdXNJbml0aWFsIG1hdElucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiAjX3ZhbHVlPVwibmdNb2RlbFwiIG5hbWU9XCJfdmFsdWVcIlxyXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiZGF0YS5yZXF1aXJlZFwiIG1heGxlbmd0aD1cIjIwMFwiPlxyXG4gICAgICAgICAgQGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIlB1bGlzY2lcIiAoY2xpY2spPVwidmFsdWUgPSAnJ1wiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBAaWYgKF92YWx1ZS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICA8bWF0LWVycm9yPk9iYmxpZ2F0b3Jpby48L21hdC1lcnJvcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGRhdGEudHlwZSA9PT0gMSkge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2RhdGEuZGVzY3JpcHRpb259fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIG5hbWU9XCJfdmFsdWVcIiAjX3ZhbHVlPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJkYXRhLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICBAaWYgKF92YWx1ZS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICA8bWF0LWVycm9yPkRhdGEgbm9uIHZhbGlkYS48L21hdC1lcnJvcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGRhdGEudHlwZSA9PT0gMikge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2RhdGEuZGVzY3JpcHRpb259fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjZGtGb2N1c0luaXRpYWwgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiICNfdmFsdWU9XCJuZ01vZGVsXCIgbmFtZT1cIl92YWx1ZVwiXHJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJkYXRhLnJlcXVpcmVkXCIgW21pbl09XCJkYXRhLm1pblZhbHVlXCIgW21heF09XCJkYXRhLm1heFZhbHVlXCI+XHJcbiAgICAgICAgICBAaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiUHVsaXNjaVwiIChjbGljayk9XCJ2YWx1ZSA9ICcnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoX3ZhbHVlLmludmFsaWQpIHtcclxuICAgICAgICAgIDxtYXQtZXJyb3I+T2JibGlnYXRvcmlvLjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoZGF0YS50eXBlID09PSAzKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImRhdGEuYXBwZWFyYW5jZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7ZGF0YS5kZXNjcmlwdGlvbn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgY2RrRm9jdXNJbml0aWFsIG1hdElucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiAjX3ZhbHVlPVwibmdNb2RlbFwiIG5hbWU9XCJfdmFsdWVcIlxyXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiZGF0YS5yZXF1aXJlZFwiIGNka1RleHRhcmVhQXV0b3NpemUgY2RrQXV0b3NpemVNaW5Sb3dzPVwiMVwiIGNka0F1dG9zaXplTWF4Um93cz1cIjEwXCJcclxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwMFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICBAaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiUHVsaXNjaVwiIChjbGljayk9XCJ2YWx1ZSA9ICcnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cImVuZFwiPnt7X3ZhbHVlLnZhbHVlPy5sZW5ndGggfHwgMH19LzEwMDAgPC9tYXQtaGludD5cclxuICAgICAgICAgIEBpZiAoX3ZhbHVlLmludmFsaWQpIHtcclxuICAgICAgICAgIDxtYXQtZXJyb3I+T2JibGlnYXRvcmlvLjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoZGF0YS50eXBlID09PSA1KSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImRhdGEuYXBwZWFyYW5jZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7ZGF0YS5kZXNjcmlwdGlvbn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgI192YWx1ZT1cIm5nTW9kZWxcIiBuYW1lPVwiX3ZhbHVlXCIgW3JlcXVpcmVkXT1cImRhdGEucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgQGZvciAoaSBvZiBkYXRhLmluaXRpYWxWYWx1ZTsgdHJhY2sgaSkge1xyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaS52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7aS5uYW1lfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICBAaWYgKF92YWx1ZS5pbnZhbGlkKSB7XHJcbiAgICAgICAgICA8bWF0LWVycm9yPk9iYmxpZ2F0b3Jpby48L21hdC1lcnJvcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIEBpZiAoZGF0YS5vcHRpb25zKSB7XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgQGZvciAobyBvZiBkYXRhLm9wdGlvbnM7IHRyYWNrIG87IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggY29sb3I9XCJwcmltYXJ5XCIgWyhuZ01vZGVsKV09XCJvLnZhbHVlXCIgbmFtZT1cIm9wdF97e2l9fVwiPlxyXG4gICAgICAgICAgICB7e28uZGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxicj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCIgZnhGaWxsPlxyXG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImYuZm9ybS5pbnZhbGlkXCIgXHJcbiAgICAgIChjbGljayk9XCJvaygpXCI+e3tkYXRhLm9rQ2FwdGlvbn19PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgID57e2RhdGEuY2FuY2VsQ2FwdGlvbn19PC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
@@ -318,7 +318,7 @@ export class SelectDialogComponent {
318
318
  this.canDelete = false;
319
319
  }
320
320
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SelectDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
321
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: SelectDialogComponent, isStandalone: true, selector: "ng-component", outputs: { done: "done", edit: "edit", view: "view", append: "append", delete: "delete", lookup: "lookup", lookupOptions: "lookupOptions", filter: "filter" }, host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "paginator", first: true, predicate: ["paginator"], descendants: true }, { propertyName: "selection", first: true, predicate: ["selection"], descendants: true }], ngImport: i0, template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div style=\"padding: 0 24px\">\r\n @if (data.description) {\r\n <div style=\"padding-bottom:10px\" [innerHtml]=\"data.description | safeHtml\"></div>\r\n }\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxFill>\r\n @if (!data.canLookupWithOptions) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Cerca...</mat-label>\r\n <input type=\"text\" cdkFocusInitial (keyup.Enter)=\"doFilter()\" matInput\r\n title=\"{{data.canLookup ? 'Digita il testo e premi invio' : 'Digita il testo'}}\" [(ngModel)]=\"filterText\">\r\n @if (filterText) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearFilter()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (!data.canLookupWithOptions && data.canLookup && data.lookupFields) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Come...</mat-label>\r\n <mat-select [(value)]=\"lookupField\">\r\n @for (field of data.lookupFields; track field) {\r\n <mat-option [value]=\"field.value\">\r\n {{field.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (data.canLookupWithOptions) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button aria-label=\"Ricerca\" (click)=\"showFilterOptions()\">\r\n <mat-icon>search</mat-icon>Ricerca\r\n </button>\r\n </div>\r\n }\r\n @if (data.canLookup && data.canFilter) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" style=\"white-space:nowrap\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Filtra\" [attr.aria-label]=\"'Filtra'\"\r\n [matMenuTriggerFor]=\"menuFilter\" color=\"primary\">\r\n <mat-icon>filter_alt</mat-icon> {{filterOptionsInfo}} <mat-icon class=\"icon-menu-drop-down\">\r\n arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #menuFilter=\"matMenu\" class=\"mat-menu-300\">\r\n @for (f of filterOptions; track f) {\r\n\r\n @if (f.divider) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (f.groupName) {\r\n <span style='font-size:small; padding: 2px 4px;'><i><b>{{f.groupName}}</b></i></span>\r\n }\r\n @if (!f.groupName && !f.divider) {\r\n <button mat-menu-item (click)=\"doFilterByOptions(f)\" [attr.aria-label]=\"f.description\">\r\n @if (f.radio && f.value) {\r\n <span style=\"padding-left:40px\"></span>\r\n }\r\n <mat-icon>{{f.icon}}</mat-icon> {{f.title}}\r\n </button>\r\n }\r\n\r\n }\r\n </mat-menu>\r\n </div>\r\n }\r\n @if (canEdit || canAppend || canView || canDelete) {\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\" style=\"white-space:nowrap\">\r\n @if (data.canAppend) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canAppend\" mat-icon-button color=\"primary\"\r\n (click)=\"doAppend()\">\r\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\r\n </button>\r\n }\r\n @if (data.canEdit) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canEdit\" mat-icon-button color=\"primary\"\r\n (click)=\"doEdit()\">\r\n <mat-icon aria-label=\"Modifica\" matTooltip=\"Modifica\">edit</mat-icon>\r\n </button>\r\n }\r\n @if (data.canView) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canView\" mat-icon-button color=\"primary\"\r\n (click)=\"doView()\">\r\n <mat-icon aria-label=\"Mostra\" matTooltip=\"Mostra\">visibility</mat-icon>\r\n </button>\r\n }\r\n @if (data.canDelete) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canDelete\" mat-icon-button color=\"primary\"\r\n (click)=\"doDelete()\">\r\n <mat-icon aria-label=\"Elimina\" matTooltip=\"Elimina\">delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n @if ((data.multi || data.header) && data.items?.length > 0) {\r\n <div>\r\n <div fxLayout=\"row\" fxFalyoutGap=\"10px\" fxFill style=\"padding-top: 10px;\">\r\n <div fxFlex=\"72px\" fxFlexAlign=\"center\" style=\"padding-left: 8px;\">\r\n @if (data.multi) {\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selectionMasterIndeterminate\" [checked]=\"selectionMasterChecked\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (data.header) {\r\n <div [innerHtml]=\"data.header | safeHtml\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n<div mat-dialog-content>\r\n <div fxLayout=\"column\" fxFill>\r\n @if (data.canLookup && (!data.items || data.items.length == 0)) {\r\n <div style=\"padding:24px; text-align: center\"><i>\r\n @if (!data.emptyMessage) {\r\n <span class=\"item-greyed-1\">Nessun elemento da visualizzare.<br>Esegui una nuova ricerca o modifica quella\r\n esistente.\r\n @if (data.maxItems > 0) {\r\n <span>Saranno mostrati al massimo {{data.maxItems}} elementi.</span>\r\n }\r\n </span>\r\n } @else {\r\n <span class=\"item-greyed-1\" [innerHtml]=\"data.emptyMessage | safeHtml\"></span>\r\n }\r\n </i>\r\n </div>\r\n }\r\n <mat-selection-list #selection (selectionChange)=\"select($event)\" dense hideSingleSelectionIndicator=\"true\">\r\n @for (item of (data.items | search: (!data.canLookup ? filterText : '')); track item) {\r\n <mat-list-option [value]=\"item\" [selected]=\"item.selected\" checkboxPosition=\"before\" color=\"primary\">\r\n <div [innerHtml]=\"item.template | safeHtml\"></div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n </div>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"10px\" fxFill>\r\n <div style=\"padding-left:20px\">\r\n @if (selectionInfo) {\r\n <span class=\"small\">selezione: </span><span class=\"bold\">{{selectionInfo}}</span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"center\">\r\n @if (canPaginate) {\r\n <div [hidden]=\"!data.items || data.items.length === 0\">\r\n <mat-paginator #paginator [hidePageSize]=\"true\" [pageSize]=\"data.pageSize\" [showFirstLastButtons]=\"true\"\r\n (page)=\"doLookupPage($event)\"></mat-paginator>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" (click)=\"ok()\" [disabled]=\"okDisabled\">\r\n <span>{{data.mustSelect ? data.okCaption : 'CHIUDI'}}</span>\r\n </button>\r\n @if (data.mustSelect) {\r\n <button mat-button mat-dialog-close cdkFocusInitial color=\"primary\">\r\n <span>ANNULLA</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>", styles: [":root{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i2.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { 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: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i11.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i11.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i11.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i14.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i14.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i15.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "pipe", type: SearchFilterPipe, name: "search" }, { kind: "pipe", type: SafeHtmlPipe, name: "safeHtml" }] }); }
321
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: SelectDialogComponent, isStandalone: true, selector: "ng-component", outputs: { done: "done", edit: "edit", view: "view", append: "append", delete: "delete", lookup: "lookup", lookupOptions: "lookupOptions", filter: "filter" }, host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "paginator", first: true, predicate: ["paginator"], descendants: true }, { propertyName: "selection", first: true, predicate: ["selection"], descendants: true }], ngImport: i0, template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div style=\"padding: 0 24px\">\r\n @if (data.description) {\r\n <div style=\"padding-bottom:10px\" [innerHtml]=\"data.description | safeHtml\"></div>\r\n }\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxFill>\r\n @if (!data.canLookupWithOptions) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Cerca...</mat-label>\r\n <input type=\"text\" cdkFocusInitial (keyup.Enter)=\"doFilter()\" matInput\r\n title=\"{{data.canLookup ? 'Digita il testo e premi invio' : 'Digita il testo'}}\" [(ngModel)]=\"filterText\">\r\n @if (filterText) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearFilter()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (!data.canLookupWithOptions && data.canLookup && data.lookupFields) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Come...</mat-label>\r\n <mat-select [(value)]=\"lookupField\">\r\n @for (field of data.lookupFields; track field) {\r\n <mat-option [value]=\"field.value\">\r\n {{field.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (data.canLookupWithOptions) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button aria-label=\"Ricerca\" (click)=\"showFilterOptions()\">\r\n <mat-icon>search</mat-icon>Ricerca\r\n </button>\r\n </div>\r\n }\r\n @if (data.canLookup && data.canFilter) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" style=\"white-space:nowrap\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Filtra\" [attr.aria-label]=\"'Filtra'\"\r\n [matMenuTriggerFor]=\"menuFilter\" color=\"primary\">\r\n <mat-icon>filter_alt</mat-icon> {{filterOptionsInfo}} <mat-icon class=\"icon-menu-drop-down\">\r\n arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #menuFilter=\"matMenu\" class=\"mat-menu-300\">\r\n @for (f of filterOptions; track f) {\r\n\r\n @if (f.divider) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (f.groupName) {\r\n <span style='font-size:small; padding: 2px 4px;'><i><b>{{f.groupName}}</b></i></span>\r\n }\r\n @if (!f.groupName && !f.divider) {\r\n <button mat-menu-item (click)=\"doFilterByOptions(f)\" [attr.aria-label]=\"f.description\">\r\n @if (f.radio && f.value) {\r\n <span style=\"padding-left:40px\"></span>\r\n }\r\n <mat-icon>{{f.icon}}</mat-icon> {{f.title}}\r\n </button>\r\n }\r\n\r\n }\r\n </mat-menu>\r\n </div>\r\n }\r\n @if (canEdit || canAppend || canView || canDelete) {\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\" style=\"white-space:nowrap\">\r\n @if (data.canAppend) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canAppend\" mat-icon-button color=\"primary\"\r\n (click)=\"doAppend()\">\r\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\r\n </button>\r\n }\r\n @if (data.canEdit) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canEdit\" mat-icon-button color=\"primary\"\r\n (click)=\"doEdit()\">\r\n <mat-icon aria-label=\"Modifica\" matTooltip=\"Modifica\">edit</mat-icon>\r\n </button>\r\n }\r\n @if (data.canView) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canView\" mat-icon-button color=\"primary\"\r\n (click)=\"doView()\">\r\n <mat-icon aria-label=\"Mostra\" matTooltip=\"Mostra\">visibility</mat-icon>\r\n </button>\r\n }\r\n @if (data.canDelete) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canDelete\" mat-icon-button color=\"primary\"\r\n (click)=\"doDelete()\">\r\n <mat-icon aria-label=\"Elimina\" matTooltip=\"Elimina\">delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n @if ((data.multi || data.header) && data.items?.length > 0) {\r\n <div>\r\n <div fxLayout=\"row\" fxFalyoutGap=\"10px\" fxFill style=\"padding-top: 10px;\">\r\n <div fxFlex=\"72px\" fxFlexAlign=\"center\" style=\"padding-left: 8px;\">\r\n @if (data.multi) {\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selectionMasterIndeterminate\" [checked]=\"selectionMasterChecked\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (data.header) {\r\n <div [innerHtml]=\"data.header | safeHtml\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n<div mat-dialog-content>\r\n <div fxLayout=\"column\" fxFill>\r\n @if (data.canLookup && (!data.items || data.items.length == 0)) {\r\n <div style=\"padding:24px; text-align: center\"><i>\r\n @if (!data.emptyMessage) {\r\n <span class=\"item-greyed-1\">Nessun elemento da visualizzare.<br>Esegui una nuova ricerca o modifica quella\r\n esistente.\r\n @if (data.maxItems > 0) {\r\n <span>Saranno mostrati al massimo {{data.maxItems}} elementi.</span>\r\n }\r\n </span>\r\n } @else {\r\n <span class=\"item-greyed-1\" [innerHtml]=\"data.emptyMessage | safeHtml\"></span>\r\n }\r\n </i>\r\n </div>\r\n }\r\n <mat-selection-list #selection (selectionChange)=\"select($event)\" dense hideSingleSelectionIndicator=\"true\">\r\n @for (item of (data.items | search: (!data.canLookup ? filterText : '')); track item) {\r\n <mat-list-option [value]=\"item\" [selected]=\"item.selected\" checkboxPosition=\"before\" color=\"primary\">\r\n <div [innerHtml]=\"item.template | safeHtml\"></div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n </div>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"10px\" fxFill>\r\n <div style=\"padding-left:20px\">\r\n @if (selectionInfo) {\r\n <span class=\"small\">selezione: </span><span class=\"bold\">{{selectionInfo}}</span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"center\">\r\n @if (canPaginate) {\r\n <div [hidden]=\"!data.items || data.items.length === 0\">\r\n <mat-paginator #paginator [hidePageSize]=\"true\" [pageSize]=\"data.pageSize\" [showFirstLastButtons]=\"true\"\r\n (page)=\"doLookupPage($event)\"></mat-paginator>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" (click)=\"ok()\" [disabled]=\"okDisabled\">\r\n <span>{{data.mustSelect ? data.okCaption : 'CHIUDI'}}</span>\r\n </button>\r\n @if (data.mustSelect) {\r\n <button mat-button mat-dialog-close cdkFocusInitial color=\"primary\">\r\n <span>ANNULLA</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>", styles: ["html{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){html{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;font-weight:700;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i2.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { 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: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i11.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i11.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i11.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i12.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i14.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i14.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i15.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "pipe", type: SearchFilterPipe, name: "search" }, { kind: "pipe", type: SafeHtmlPipe, name: "safeHtml" }] }); }
322
322
  }
323
323
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SelectDialogComponent, decorators: [{
324
324
  type: Component,
@@ -344,7 +344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
344
344
  MatPaginatorModule,
345
345
  SearchFilterPipe,
346
346
  SafeHtmlPipe
347
- ], template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div style=\"padding: 0 24px\">\r\n @if (data.description) {\r\n <div style=\"padding-bottom:10px\" [innerHtml]=\"data.description | safeHtml\"></div>\r\n }\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxFill>\r\n @if (!data.canLookupWithOptions) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Cerca...</mat-label>\r\n <input type=\"text\" cdkFocusInitial (keyup.Enter)=\"doFilter()\" matInput\r\n title=\"{{data.canLookup ? 'Digita il testo e premi invio' : 'Digita il testo'}}\" [(ngModel)]=\"filterText\">\r\n @if (filterText) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearFilter()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (!data.canLookupWithOptions && data.canLookup && data.lookupFields) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Come...</mat-label>\r\n <mat-select [(value)]=\"lookupField\">\r\n @for (field of data.lookupFields; track field) {\r\n <mat-option [value]=\"field.value\">\r\n {{field.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (data.canLookupWithOptions) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button aria-label=\"Ricerca\" (click)=\"showFilterOptions()\">\r\n <mat-icon>search</mat-icon>Ricerca\r\n </button>\r\n </div>\r\n }\r\n @if (data.canLookup && data.canFilter) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" style=\"white-space:nowrap\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Filtra\" [attr.aria-label]=\"'Filtra'\"\r\n [matMenuTriggerFor]=\"menuFilter\" color=\"primary\">\r\n <mat-icon>filter_alt</mat-icon> {{filterOptionsInfo}} <mat-icon class=\"icon-menu-drop-down\">\r\n arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #menuFilter=\"matMenu\" class=\"mat-menu-300\">\r\n @for (f of filterOptions; track f) {\r\n\r\n @if (f.divider) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (f.groupName) {\r\n <span style='font-size:small; padding: 2px 4px;'><i><b>{{f.groupName}}</b></i></span>\r\n }\r\n @if (!f.groupName && !f.divider) {\r\n <button mat-menu-item (click)=\"doFilterByOptions(f)\" [attr.aria-label]=\"f.description\">\r\n @if (f.radio && f.value) {\r\n <span style=\"padding-left:40px\"></span>\r\n }\r\n <mat-icon>{{f.icon}}</mat-icon> {{f.title}}\r\n </button>\r\n }\r\n\r\n }\r\n </mat-menu>\r\n </div>\r\n }\r\n @if (canEdit || canAppend || canView || canDelete) {\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\" style=\"white-space:nowrap\">\r\n @if (data.canAppend) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canAppend\" mat-icon-button color=\"primary\"\r\n (click)=\"doAppend()\">\r\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\r\n </button>\r\n }\r\n @if (data.canEdit) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canEdit\" mat-icon-button color=\"primary\"\r\n (click)=\"doEdit()\">\r\n <mat-icon aria-label=\"Modifica\" matTooltip=\"Modifica\">edit</mat-icon>\r\n </button>\r\n }\r\n @if (data.canView) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canView\" mat-icon-button color=\"primary\"\r\n (click)=\"doView()\">\r\n <mat-icon aria-label=\"Mostra\" matTooltip=\"Mostra\">visibility</mat-icon>\r\n </button>\r\n }\r\n @if (data.canDelete) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canDelete\" mat-icon-button color=\"primary\"\r\n (click)=\"doDelete()\">\r\n <mat-icon aria-label=\"Elimina\" matTooltip=\"Elimina\">delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n @if ((data.multi || data.header) && data.items?.length > 0) {\r\n <div>\r\n <div fxLayout=\"row\" fxFalyoutGap=\"10px\" fxFill style=\"padding-top: 10px;\">\r\n <div fxFlex=\"72px\" fxFlexAlign=\"center\" style=\"padding-left: 8px;\">\r\n @if (data.multi) {\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selectionMasterIndeterminate\" [checked]=\"selectionMasterChecked\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (data.header) {\r\n <div [innerHtml]=\"data.header | safeHtml\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n<div mat-dialog-content>\r\n <div fxLayout=\"column\" fxFill>\r\n @if (data.canLookup && (!data.items || data.items.length == 0)) {\r\n <div style=\"padding:24px; text-align: center\"><i>\r\n @if (!data.emptyMessage) {\r\n <span class=\"item-greyed-1\">Nessun elemento da visualizzare.<br>Esegui una nuova ricerca o modifica quella\r\n esistente.\r\n @if (data.maxItems > 0) {\r\n <span>Saranno mostrati al massimo {{data.maxItems}} elementi.</span>\r\n }\r\n </span>\r\n } @else {\r\n <span class=\"item-greyed-1\" [innerHtml]=\"data.emptyMessage | safeHtml\"></span>\r\n }\r\n </i>\r\n </div>\r\n }\r\n <mat-selection-list #selection (selectionChange)=\"select($event)\" dense hideSingleSelectionIndicator=\"true\">\r\n @for (item of (data.items | search: (!data.canLookup ? filterText : '')); track item) {\r\n <mat-list-option [value]=\"item\" [selected]=\"item.selected\" checkboxPosition=\"before\" color=\"primary\">\r\n <div [innerHtml]=\"item.template | safeHtml\"></div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n </div>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"10px\" fxFill>\r\n <div style=\"padding-left:20px\">\r\n @if (selectionInfo) {\r\n <span class=\"small\">selezione: </span><span class=\"bold\">{{selectionInfo}}</span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"center\">\r\n @if (canPaginate) {\r\n <div [hidden]=\"!data.items || data.items.length === 0\">\r\n <mat-paginator #paginator [hidePageSize]=\"true\" [pageSize]=\"data.pageSize\" [showFirstLastButtons]=\"true\"\r\n (page)=\"doLookupPage($event)\"></mat-paginator>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" (click)=\"ok()\" [disabled]=\"okDisabled\">\r\n <span>{{data.mustSelect ? data.okCaption : 'CHIUDI'}}</span>\r\n </button>\r\n @if (data.mustSelect) {\r\n <button mat-button mat-dialog-close cdkFocusInitial color=\"primary\">\r\n <span>ANNULLA</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>", styles: [":root{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
347
+ ], template: "<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div style=\"padding: 0 24px\">\r\n @if (data.description) {\r\n <div style=\"padding-bottom:10px\" [innerHtml]=\"data.description | safeHtml\"></div>\r\n }\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxFill>\r\n @if (!data.canLookupWithOptions) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Cerca...</mat-label>\r\n <input type=\"text\" cdkFocusInitial (keyup.Enter)=\"doFilter()\" matInput\r\n title=\"{{data.canLookup ? 'Digita il testo e premi invio' : 'Digita il testo'}}\" [(ngModel)]=\"filterText\">\r\n @if (filterText) {\r\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearFilter()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (!data.canLookupWithOptions && data.canLookup && data.lookupFields) {\r\n <div fxFlex=\"100\">\r\n <mat-form-field style='width:100%' [appearance]=\"data.appearance\" subscriptSizing=\"dynamic\">\r\n <mat-label>Come...</mat-label>\r\n <mat-select [(value)]=\"lookupField\">\r\n @for (field of data.lookupFields; track field) {\r\n <mat-option [value]=\"field.value\">\r\n {{field.name}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n }\r\n @if (data.canLookupWithOptions) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button aria-label=\"Ricerca\" (click)=\"showFilterOptions()\">\r\n <mat-icon>search</mat-icon>Ricerca\r\n </button>\r\n </div>\r\n }\r\n @if (data.canLookup && data.canFilter) {\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" style=\"white-space:nowrap\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Filtra\" [attr.aria-label]=\"'Filtra'\"\r\n [matMenuTriggerFor]=\"menuFilter\" color=\"primary\">\r\n <mat-icon>filter_alt</mat-icon> {{filterOptionsInfo}} <mat-icon class=\"icon-menu-drop-down\">\r\n arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #menuFilter=\"matMenu\" class=\"mat-menu-300\">\r\n @for (f of filterOptions; track f) {\r\n\r\n @if (f.divider) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (f.groupName) {\r\n <span style='font-size:small; padding: 2px 4px;'><i><b>{{f.groupName}}</b></i></span>\r\n }\r\n @if (!f.groupName && !f.divider) {\r\n <button mat-menu-item (click)=\"doFilterByOptions(f)\" [attr.aria-label]=\"f.description\">\r\n @if (f.radio && f.value) {\r\n <span style=\"padding-left:40px\"></span>\r\n }\r\n <mat-icon>{{f.icon}}</mat-icon> {{f.title}}\r\n </button>\r\n }\r\n\r\n }\r\n </mat-menu>\r\n </div>\r\n }\r\n @if (canEdit || canAppend || canView || canDelete) {\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\" style=\"white-space:nowrap\">\r\n @if (data.canAppend) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canAppend\" mat-icon-button color=\"primary\"\r\n (click)=\"doAppend()\">\r\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\r\n </button>\r\n }\r\n @if (data.canEdit) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canEdit\" mat-icon-button color=\"primary\"\r\n (click)=\"doEdit()\">\r\n <mat-icon aria-label=\"Modifica\" matTooltip=\"Modifica\">edit</mat-icon>\r\n </button>\r\n }\r\n @if (data.canView) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canView\" mat-icon-button color=\"primary\"\r\n (click)=\"doView()\">\r\n <mat-icon aria-label=\"Mostra\" matTooltip=\"Mostra\">visibility</mat-icon>\r\n </button>\r\n }\r\n @if (data.canDelete) {\r\n <button fxFlexAlign=\"center\" type=\"button\" [disabled]=\"!canDelete\" mat-icon-button color=\"primary\"\r\n (click)=\"doDelete()\">\r\n <mat-icon aria-label=\"Elimina\" matTooltip=\"Elimina\">delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n @if ((data.multi || data.header) && data.items?.length > 0) {\r\n <div>\r\n <div fxLayout=\"row\" fxFalyoutGap=\"10px\" fxFill style=\"padding-top: 10px;\">\r\n <div fxFlex=\"72px\" fxFlexAlign=\"center\" style=\"padding-left: 8px;\">\r\n @if (data.multi) {\r\n <mat-checkbox color=\"primary\" (change)=\"$event ? masterSelectionToggle($event) : null\"\r\n [indeterminate]=\"selectionMasterIndeterminate\" [checked]=\"selectionMasterChecked\"\r\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (data.header) {\r\n <div [innerHtml]=\"data.header | safeHtml\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n<div mat-dialog-content>\r\n <div fxLayout=\"column\" fxFill>\r\n @if (data.canLookup && (!data.items || data.items.length == 0)) {\r\n <div style=\"padding:24px; text-align: center\"><i>\r\n @if (!data.emptyMessage) {\r\n <span class=\"item-greyed-1\">Nessun elemento da visualizzare.<br>Esegui una nuova ricerca o modifica quella\r\n esistente.\r\n @if (data.maxItems > 0) {\r\n <span>Saranno mostrati al massimo {{data.maxItems}} elementi.</span>\r\n }\r\n </span>\r\n } @else {\r\n <span class=\"item-greyed-1\" [innerHtml]=\"data.emptyMessage | safeHtml\"></span>\r\n }\r\n </i>\r\n </div>\r\n }\r\n <mat-selection-list #selection (selectionChange)=\"select($event)\" dense hideSingleSelectionIndicator=\"true\">\r\n @for (item of (data.items | search: (!data.canLookup ? filterText : '')); track item) {\r\n <mat-list-option [value]=\"item\" [selected]=\"item.selected\" checkboxPosition=\"before\" color=\"primary\">\r\n <div [innerHtml]=\"item.template | safeHtml\"></div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n </div>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"10px\" fxFill>\r\n <div style=\"padding-left:20px\">\r\n @if (selectionInfo) {\r\n <span class=\"small\">selezione: </span><span class=\"bold\">{{selectionInfo}}</span>\r\n }\r\n </div>\r\n <div fxFlexAlign=\"center\">\r\n @if (canPaginate) {\r\n <div [hidden]=\"!data.items || data.items.length === 0\">\r\n <mat-paginator #paginator [hidePageSize]=\"true\" [pageSize]=\"data.pageSize\" [showFirstLastButtons]=\"true\"\r\n (page)=\"doLookupPage($event)\"></mat-paginator>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button color=\"primary\" (click)=\"ok()\" [disabled]=\"okDisabled\">\r\n <span>{{data.mustSelect ? data.okCaption : 'CHIUDI'}}</span>\r\n </button>\r\n @if (data.mustSelect) {\r\n <button mat-button mat-dialog-close cdkFocusInitial color=\"primary\">\r\n <span>ANNULLA</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>", styles: ["html{--ars-dialog-info-error: #a80710;--ars-dilaog-info-warning: #FFA000;--ars-dialog-info-ok: #388E3C}@media (prefers-color-scheme: dark){html{--ars-dialog-info-error: #ff5449;--ars-dialog-info-warning: #FFC107;--ars-dialog-info-ok: #4CAF50}}.dialog-info{font-size:x-small;font-weight:700;text-align:right;margin:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok)}.dialog-info-red,.dialog-info-error{color:var(--ars-dialog-info-error)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:500;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important;line-height:18px!important}.small{font-size:small!important;line-height:16px!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:14px!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
348
348
  }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
349
349
  type: Inject,
350
350
  args: [MAT_DIALOG_DATA]
@@ -371,4 +371,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
371
371
  }], filter: [{
372
372
  type: Output
373
373
  }] } });
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9zZWxlY3Qvc2VsZWN0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9zZWxlY3Qvc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBZ0IsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0ksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3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QUFXO2dCQUVaLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCwgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94XCI7XHJcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nVGl0bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7IE1hdERpdmlkZXJNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlclwiO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcclxuaW1wb3J0IHsgTWF0TGlzdE1vZHVsZSwgTWF0U2VsZWN0aW9uTGlzdCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9saXN0XCI7XHJcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudVwiO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwXCI7XHJcbmltcG9ydCB7IFNhZmVIdG1sUGlwZSwgU2VhcmNoRmlsdGVyUGlwZSwgU3lzdGVtVXRpbHMgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIFNlbGVjdERpYWxvZ0FwcGVuZCxcclxuICBTZWxlY3REaWFsb2dEYXRhLFxyXG4gIFNlbGVjdERpYWxvZ0RlbGV0ZSxcclxuICBTZWxlY3REaWFsb2dMb29rdXAsXHJcbiAgU2VsZWN0RGlhbG9nUmVzdWx0LFxyXG4gIFNlbGVjdGFibGVJdGVtLFxyXG59IGZyb20gXCIuLi8uLi9kZWZpbml0aW9uc1wiO1xyXG5pbXBvcnQgeyBFeHRlbmRlZE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dCc7XHJcbmltcG9ydCB7IEZsZXhNb2R1bGUgfSBmcm9tIFwiQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2ZsZXhcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9zZWxlY3QtZGlhbG9nLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICBGbGV4TW9kdWxlLFxyXG4gICAgRXh0ZW5kZWRNb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdE9wdGlvbk1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRNZW51TW9kdWxlLFxyXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgIE1hdExpc3RNb2R1bGUsXHJcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxyXG4gICAgTWF0RGlhbG9nQ2xvc2UsXHJcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXHJcbiAgICBTZWFyY2hGaWx0ZXJQaXBlLFxyXG4gICAgU2FmZUh0bWxQaXBlXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlbGVjdERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgncGFnaW5hdG9yJykgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xyXG4gIEBWaWV3Q2hpbGQoXCJzZWxlY3Rpb25cIikgc2VsZWN0aW9uITogTWF0U2VsZWN0aW9uTGlzdDtcclxuXHJcbiAgQE91dHB1dCgpIGRvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERpYWxvZ1Jlc3VsdD4oKTtcclxuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0YWJsZUl0ZW0+KCk7XHJcbiAgQE91dHB1dCgpIHZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGFibGVJdGVtPigpO1xyXG4gIEBPdXRwdXQoKSBhcHBlbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERpYWxvZ0FwcGVuZD4oKTtcclxuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3REaWFsb2dEZWxldGU+KCk7XHJcbiAgQE91dHB1dCgpIGxvb2t1cCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0RGlhbG9nTG9va3VwPigpO1xyXG4gIEBPdXRwdXQoKSBsb29rdXBPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBkYXRhOiBTZWxlY3REaWFsb2dEYXRhO1xyXG4gIGNhbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjYW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FuQXBwZW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FuRGVsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FuUGFnaW5hdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b24gYWN0aXZpdHlcclxuICBva0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gVXNlZCBmb3IgYXJyYXkgZmlsdGVyaW5nXHJcbiAgZmlsdGVyVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICBmaWx0ZXJPcHRpb25zOiBhbnkgPSBbXTtcclxuICBmaWx0ZXJPcHRpb25zSW5mbzogc3RyaW5nID0gXCJUdXR0b1wiO1xyXG5cclxuICAvLyBVc2VkIHRvIHNpbmNyb25pemUgbG9va3VwIGZpZWxkcyBhbmQgcGFyYW1zXHJcbiAgbG9va3VwRmllbGQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgcHJpdmF0ZSBsb29rdXBQYXJhbXM6IGFueTtcclxuXHJcblxyXG4gIC8vIFVzZWQgdG8gZGlzcGxheSBzZWxlY3RlZCBlbGVtZW50c1xyXG4gIHNlbGVjdGlvbkluZm86IHN0cmluZyA9IFwiXCI7XHJcbiAgc2VsZWN0aW9uTWFzdGVySW5kZXRlcm1pbmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGlvbk1hc3RlckNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvLyBwcml2YXRlICRicm9hZGNhc3Q6IEJyb2FkY2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFNlbGVjdERpYWxvZ0NvbXBvbmVudD4sXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgX2RhdGE6IFNlbGVjdERpYWxvZ0RhdGFcclxuICApIHtcclxuICAgIHRoaXMuZGF0YSA9IF9kYXRhIHx8IHsgYXBwZWFyYW5jZTogJ291dGxpbmUnLCB0aXRsZTogJ1NlbGV6aW9uYScgfTtcclxuICAgIGlmICghdGhpcy5kYXRhLmFwcGVhcmFuY2UpIHRoaXMuZGF0YS5hcHBlYXJhbmNlID0gJ291dGxpbmUnO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEudGl0bGUpIHRoaXMuZGF0YS50aXRsZSA9ICdTZWxlemlvbmEnO1xyXG4gICAgaWYgKHRoaXMuZGF0YS5tdWx0aSAmJiAhdGhpcy5kYXRhLml0ZW1zKSB0aGlzLmRhdGEubXVsdGkgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEub2tDYXB0aW9uKSB0aGlzLmRhdGEub2tDYXB0aW9uID0gXCJPS1wiO1xyXG4gICAgdGhpcy5jYW5BcHBlbmQgPSB0aGlzLmRhdGEuY2FuQXBwZW5kO1xyXG4gICAgdGhpcy5jYW5FZGl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhblZpZXcgPSBmYWxzZTtcclxuICAgIHRoaXMuY2FuRGVsZXRlID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kYXRhLmNhbkxvb2t1cCkge1xyXG4gICAgICB0aGlzLmRhdGEuaXRlbXMgPSBbXTtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5sb29rdXBGaWVsZHMgJiYgdGhpcy5kYXRhLmxvb2t1cEZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5sb29rdXBGaWVsZCA9IHRoaXMuZGF0YS5sb29rdXBGaWVsZHNbMF0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGF0YS5jYW5GaWx0ZXIpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMgPSB0aGlzLmRhdGEuZmlsdGVycztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kYXRhLmNhblBhZ2luYXRlKSB7XHJcbiAgICAgICAgdGhpcy5jYW5QYWdpbmF0ZSA9IHRoaXMuZGF0YS5jYW5QYWdpbmF0ZTtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YS5wYWdlU2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhLnBhZ2VTaXplID0gMTAwXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm9rRGlzYWJsZWQgPSB0aGlzLmRhdGEubXVzdFNlbGVjdDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gQXBwbHkgZmlsdGVyIGlmIGV4aXN0c1xyXG4gICAgaWYgKHRoaXMuZGF0YS5maWx0ZXIgfHwgdGhpcy5kYXRhLmxvb2t1cE9uSW5pdCkge1xyXG4gICAgICB0aGlzLmRvRmlsdGVyKHRoaXMuZGF0YS5maWx0ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZXZlcnkgZWxlbWVudCBhcmUgc2VsZWN0ZWRcclxuICAgKi9cclxuICBwcml2YXRlIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMgJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuZGF0YS5pdGVtcy5sZW5ndGhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgZXhpc3RzIGEgc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNTZWxlY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMgJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPiAwXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFzdGVyIHNlbGVjdGlvbiB0b2dnbGVcclxuICAgKi9cclxuICBtYXN0ZXJTZWxlY3Rpb25Ub2dnbGUoYXJnczogYW55KSB7XHJcbiAgICBpZiAoYXJncy5jaGVja2VkKVxyXG4gICAgICAvLyBEZXNlbGVjdCBpZiBub3QgYWxsc2VsZWN0ZWQgc28gdGhhdCB0b2dnbGUgbWFrZXMgdGhlIHJpZ2h0IGNob2ljZVxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwoKTtcclxuICAgIGVsc2UgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uTWFzdGVySW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25NYXN0ZXJDaGVja2VkID0gYXJncy5jaGVja2VkO1xyXG4gICAgdGhpcy5va0Rpc2FibGVkID1cclxuICAgICAgdGhpcy5kYXRhLm11c3RTZWxlY3QgJiZcclxuICAgICAgKCF0aGlzLnNlbGVjdGlvbiB8fCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKTtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25JbmZvKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgc2VsZWN0aW9uL2Rlc2VsZWN0aW9uIG9mIGFuIGl0ZW1cclxuICAgKi9cclxuICBzZWxlY3QoZTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS5tdWx0aSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdEFsbCgpO1xyXG4gICAgICBpZiAoZS5vcHRpb25zPy5sZW5ndGggPiAwKVxyXG4gICAgICAgIGUub3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMub2tEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5va0Rpc2FibGVkID1cclxuICAgICAgICB0aGlzLmRhdGEubXVzdFNlbGVjdCAmJlxyXG4gICAgICAgICghdGhpcy5zZWxlY3Rpb24gfHxcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPT09IDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBlZGl0b3JzXHJcbiAgICB0aGlzLmNhbkFwcGVuZCA9IHRoaXMuZGF0YS5jYW5BcHBlbmQ7XHJcbiAgICB0aGlzLmNhbkVkaXQgPVxyXG4gICAgICB0aGlzLmRhdGEuY2FuRWRpdCAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoID09PSAxO1xyXG4gICAgdGhpcy5jYW5WaWV3ID1cclxuICAgICAgdGhpcy5kYXRhLmNhblZpZXcgJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24gJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aCA9PT0gMTtcclxuICAgIHRoaXMuY2FuRGVsZXRlID1cclxuICAgICAgdGhpcy5kYXRhLmNhbkRlbGV0ZSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuc2VsZWN0aW9uTWFzdGVySW5kZXRlcm1pbmF0ZSA9XHJcbiAgICAgICF0aGlzLmlzQWxsU2VsZWN0ZWQoKSAmJiB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25NYXN0ZXJDaGVja2VkID0gdGhpcy5oYXNTZWxlY3Rpb24oKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSW5mbygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNlbGVjdGlvbiBpbmZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25JbmZvKCkge1xyXG4gICAgLy8gVXBkYXRlIHNlbGVjdGlvbiBpbmZvXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5kYXRhLm11bHRpKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uSW5mbyA9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aCArXHJcbiAgICAgICAgXCIgLyBcIiArXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ub3B0aW9ucy5sZW5ndGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkluZm8gPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBjdXJyZW50IHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25NYXN0ZXJJbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1hc3RlckNoZWNrZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkluZm8gPSBcIlwiO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0IHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIG9rKCkge1xyXG4gICAgaWYgKCF0aGlzLm9rRGlzYWJsZWQpIHtcclxuICAgICAgLy8gTXVsdGkgc2VsZWN0aW9uXHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXM6IGFueSA9IFtdO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaChlbGVtZW50LnZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZG9uZS5lbWl0KHsgc2VsZWN0ZWRJdGVtczogc2VsZWN0ZWRJdGVtcyB9KTtcclxuICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIGZpbHRlclxyXG4gICAqL1xyXG4gIGNsZWFyRmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gXCJcIjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgZmlsdGVyIG9wdGlvbnNcclxuICAgKi9cclxuICBzaG93RmlsdGVyT3B0aW9ucygpIHtcclxuICAgIGlmICh0aGlzLmxvb2t1cE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5sb29rdXBPcHRpb25zLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGZpbHRlclxyXG4gICAqIEBwYXJhbSB0ZXh0IDogdGhlIHN0cmluZyB0byBmaWx0ZXIgdG9cclxuICAgKi9cclxuICBkb0ZpbHRlcih0ZXh0OiBzdHJpbmcgPSBudWxsLCBlOiBhbnkgPSBudWxsKSB7XHJcbiAgICBpZiAodGV4dCkge1xyXG4gICAgICB0aGlzLmZpbHRlclRleHQgPSB0ZXh0O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGF0YS5jYW5Mb29rdXApIHtcclxuICAgICAgaWYgKCFlIHx8IGUua2V5Q29kZSA9PT0gMTMpIHtcclxuICAgICAgICB0aGlzLmxvb2t1cC5lbWl0KHsgaXRlbXM6IHRoaXMuZGF0YS5pdGVtcywgZmlsdGVyOiB0aGlzLmZpbHRlclRleHQgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGZpbHRlciB1c2luZyBmaWx0ZXIgb3B0aW9uc1xyXG4gICAqIEBwYXJhbSBmaWx0ZXJPUHRpb24gOiB0aGUgY3VycmVudCBmaWx0ZXJcclxuICAgKi9cclxuICBkb0ZpbHRlckJ5T3B0aW9ucyhmaWx0ZXJPcHRpb246IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5jYW5Mb29rdXAgJiYgdGhpcy5kYXRhLmNhbkZpbHRlcikge1xyXG4gICAgICB0aGlzLmZpbHRlci5lbWl0KHtcclxuICAgICAgICBpdGVtczogdGhpcy5kYXRhLml0ZW1zLFxyXG4gICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXJUZXh0LFxyXG4gICAgICAgIGZpbHRlck9wdGlvbjogZmlsdGVyT3B0aW9uLFxyXG4gICAgICAgIG93bmVyOiB0aGlzLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGZpbHRlclxyXG4gICAqIEBwYXJhbSBwYXJhbXMgOiB0aGUgb2JqZWN0IHdpdGggY3VycmVudCBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgZG9Mb29rdXAocGFyYW1zOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuY2FuTG9va3VwKSB7XHJcbiAgICAgIHRoaXMubG9va3VwUGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICB0aGlzLmxvb2t1cFBhcmFtcy5maXJzdCA9IDA7XHJcbiAgICAgIHRoaXMubG9va3VwLmVtaXQoeyBpdGVtczogdGhpcy5kYXRhLml0ZW1zLCBwYXJhbXM6IHRoaXMubG9va3VwUGFyYW1zLCBvd25lcjogdGhpcyB9KTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbG9va3VwIHBhZ2luYXRyb1xyXG4gICAqIEBwYXJhbSB0b3RhbCA6IHRoZSBuZXcgdG90YWwgaXRlbXNcclxuICAgKi9cclxuICB1cGRhdGVMb29rdXBQYWdpbmF0b3IodG90YWw6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuY2FuUGFnaW5hdGUpIHtcclxuICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLnBhZ2luYXRvci5sZW5ndGggPSB0b3RhbCA/PyAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFwcGx5IGZpbHRlclxyXG4gICogQHBhcmFtIGUgOiB0aGUgTWF0UGFnaW5hdG9yIFBhZ2VFdmVudCBkYXRhXHJcbiAgKi9cclxuICBwcm90ZWN0ZWQgZG9Mb29rdXBQYWdlKGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5jYW5Mb29rdXAgJiYgdGhpcy5kYXRhLmNhblBhZ2luYXRlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgICAgdGhpcy5sb29rdXBQYXJhbXMuZmlyc3QgPSBlLnBhZ2VJbmRleCAqICh0aGlzLmRhdGEucGFnZVNpemUgPz8gMCk7XHJcbiAgICAgIHRoaXMubG9va3VwLmVtaXQoeyBpdGVtczogdGhpcy5kYXRhLml0ZW1zLCBwYXJhbXM6IHRoaXMubG9va3VwUGFyYW1zLCBvd25lcjogdGhpcyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZFxyXG4gICAqL1xyXG4gIGRvQXBwZW5kKCkge1xyXG4gICAgdGhpcy5hcHBlbmQuZW1pdCh7IGl0ZW1zOiB0aGlzLmRhdGEuaXRlbXMgfSBhcyBTZWxlY3REaWFsb2dBcHBlbmQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRWRpdFxyXG4gICAqL1xyXG4gIGRvRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQpXHJcbiAgICAgIHRoaXMuZWRpdC5lbWl0KHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZFswXS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWaWV3XHJcbiAgICovXHJcbiAgZG9WaWV3KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZClcclxuICAgICAgdGhpcy52aWV3LmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkWzBdLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZVxyXG4gICAqL1xyXG4gIGRvRGVsZXRlKCkge1xyXG4gICAgbGV0IHNlbGVjdGVkSXRlbXM6IGFueSA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgc2VsZWN0ZWRJdGVtcy5wdXNoKGVsZW1lbnQudmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRlbGV0ZS5lbWl0KHtcclxuICAgICAgaXRlbXM6IHRoaXMuZGF0YS5pdGVtcyxcclxuICAgICAgc2VsZWN0ZWRJdGVtczogc2VsZWN0ZWRJdGVtcyxcclxuICAgIH0gYXMgU2VsZWN0RGlhbG9nRGVsZXRlKTtcclxuICAgIHRoaXMuY2FuRGVsZXRlID0gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsIjxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS50aXRsZX19PC9oMj5cclxuPGRpdiBzdHlsZT1cInBhZGRpbmc6IDAgMjRweFwiPlxyXG4gIEBpZiAoZGF0YS5kZXNjcmlwdGlvbikge1xyXG4gIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbToxMHB4XCIgW2lubmVySHRtbF09XCJkYXRhLmRlc2NyaXB0aW9uIHwgc2FmZUh0bWxcIj48L2Rpdj5cclxuICB9XHJcbiAgPGRpdj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjIwcHhcIiBmeEZpbGw+XHJcbiAgICAgIEBpZiAoIWRhdGEuY2FuTG9va3VwV2l0aE9wdGlvbnMpIHtcclxuICAgICAgPGRpdiBmeEZsZXg9XCIxMDBcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9J3dpZHRoOjEwMCUnIFthcHBlYXJhbmNlXT1cImRhdGEuYXBwZWFyYW5jZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+Q2VyY2EuLi48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNka0ZvY3VzSW5pdGlhbCAoa2V5dXAuRW50ZXIpPVwiZG9GaWx0ZXIoKVwiIG1hdElucHV0XHJcbiAgICAgICAgICAgIHRpdGxlPVwie3tkYXRhLmNhbkxvb2t1cCA/ICdEaWdpdGEgaWwgdGVzdG8gZSBwcmVtaSBpbnZpbycgOiAnRGlnaXRhIGlsIHRlc3RvJ319XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJUZXh0XCI+XHJcbiAgICAgICAgICBAaWYgKGZpbHRlclRleHQpIHtcclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCJjbGVhckZpbHRlcigpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKCFkYXRhLmNhbkxvb2t1cFdpdGhPcHRpb25zICYmIGRhdGEuY2FuTG9va3VwICYmIGRhdGEubG9va3VwRmllbGRzKSB7XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMTAwXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPSd3aWR0aDoxMDAlJyBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPkNvbWUuLi48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFsodmFsdWUpXT1cImxvb2t1cEZpZWxkXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGRhdGEubG9va3VwRmllbGRzOyB0cmFjayBmaWVsZCkge1xyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIj5cclxuICAgICAgICAgICAgICB7e2ZpZWxkLm5hbWV9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKGRhdGEuY2FuTG9va3VwV2l0aE9wdGlvbnMpIHtcclxuICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gYXJpYS1sYWJlbD1cIlJpY2VyY2FcIiAoY2xpY2spPVwic2hvd0ZpbHRlck9wdGlvbnMoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPnNlYXJjaDwvbWF0LWljb24+UmljZXJjYVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKGRhdGEuY2FuTG9va3VwICYmIGRhdGEuY2FuRmlsdGVyKSB7XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXBcIj5cclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIkZpbHRyYVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZpbHRyYSdcIlxyXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVGaWx0ZXJcIiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfYWx0PC9tYXQtaWNvbj4ge3tmaWx0ZXJPcHRpb25zSW5mb319IDxtYXQtaWNvbiBjbGFzcz1cImljb24tbWVudS1kcm9wLWRvd25cIj5cclxuICAgICAgICAgICAgYXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bWF0LW1lbnUgI21lbnVGaWx0ZXI9XCJtYXRNZW51XCIgY2xhc3M9XCJtYXQtbWVudS0zMDBcIj5cclxuICAgICAgICAgIEBmb3IgKGYgb2YgZmlsdGVyT3B0aW9uczsgdHJhY2sgZikge1xyXG5cclxuICAgICAgICAgIEBpZiAoZi5kaXZpZGVyKSB7XHJcbiAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoZi5ncm91cE5hbWUpIHtcclxuICAgICAgICAgIDxzcGFuIHN0eWxlPSdmb250LXNpemU6c21hbGw7IHBhZGRpbmc6IDJweCA0cHg7Jz48aT48Yj57e2YuZ3JvdXBOYW1lfX08L2I+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoIWYuZ3JvdXBOYW1lICYmICFmLmRpdmlkZXIpIHtcclxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZG9GaWx0ZXJCeU9wdGlvbnMoZilcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImYuZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgQGlmIChmLnJhZGlvICYmIGYudmFsdWUpIHtcclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nLWxlZnQ6NDBweFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8bWF0LWljb24+e3tmLmljb259fTwvbWF0LWljb24+IHt7Zi50aXRsZX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgICAgQGlmIChjYW5FZGl0IHx8IGNhbkFwcGVuZCB8fCBjYW5WaWV3IHx8IGNhbkRlbGV0ZSkge1xyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeExheW91dEFsaWduPVwiZW5kXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXBcIj5cclxuICAgICAgICBAaWYgKGRhdGEuY2FuQXBwZW5kKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiIWNhbkFwcGVuZFwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImRvQXBwZW5kKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWxhYmVsPVwiQWdnaXVuZ2lcIiBtYXRUb29sdGlwPVwiQWdnaXVuZ2lcIj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGRhdGEuY2FuRWRpdCkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZG9FZGl0KClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWxhYmVsPVwiTW9kaWZpY2FcIiBtYXRUb29sdGlwPVwiTW9kaWZpY2FcIj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmIChkYXRhLmNhblZpZXcpIHtcclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCIhY2FuVmlld1wiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImRvVmlldygpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gYXJpYS1sYWJlbD1cIk1vc3RyYVwiIG1hdFRvb2x0aXA9XCJNb3N0cmFcIj52aXNpYmlsaXR5PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmIChkYXRhLmNhbkRlbGV0ZSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFjYW5EZWxldGVcIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgIChjbGljayk9XCJkb0RlbGV0ZSgpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gYXJpYS1sYWJlbD1cIkVsaW1pbmFcIiBtYXRUb29sdGlwPVwiRWxpbWluYVwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgQGlmICgoZGF0YS5tdWx0aSB8fCBkYXRhLmhlYWRlcikgJiYgZGF0YS5pdGVtcz8ubGVuZ3RoID4gMCkge1xyXG4gIDxkaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGYWx5b3V0R2FwPVwiMTBweFwiIGZ4RmlsbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxMHB4O1wiPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjcycHhcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiA4cHg7XCI+XHJcbiAgICAgICAgQGlmIChkYXRhLm11bHRpKSB7XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpIDogbnVsbFwiXHJcbiAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb25NYXN0ZXJJbmRldGVybWluYXRlXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uTWFzdGVyQ2hlY2tlZFwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlemlvbmEvZGVzZWxlemlvbmEgdHV0dG8nXCIgbWF0VG9vbHRpcD1cIlNlbGV6aW9uYS9kZXNlbGV6aW9uYSB0dXR0b1wiPlxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMTAwXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICBAaWYgKGRhdGEuaGVhZGVyKSB7XHJcbiAgICAgICAgPGRpdiAgW2lubmVySHRtbF09XCJkYXRhLmhlYWRlciB8IHNhZmVIdG1sXCI+PC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZpbGw+XHJcbiAgICBAaWYgKGRhdGEuY2FuTG9va3VwICYmICghZGF0YS5pdGVtcyB8fCBkYXRhLml0ZW1zLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MjRweDsgdGV4dC1hbGlnbjogY2VudGVyXCI+PGk+XHJcbiAgICAgICAgQGlmICghZGF0YS5lbXB0eU1lc3NhZ2UpIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tZ3JleWVkLTFcIj5OZXNzdW4gZWxlbWVudG8gZGEgdmlzdWFsaXp6YXJlLjxicj5Fc2VndWkgdW5hIG51b3ZhIHJpY2VyY2EgbyBtb2RpZmljYSBxdWVsbGFcclxuICAgICAgICAgIGVzaXN0ZW50ZS5cclxuICAgICAgICAgIEBpZiAoZGF0YS5tYXhJdGVtcyA+IDApIHtcclxuICAgICAgICAgIDxzcGFuPlNhcmFubm8gbW9zdHJhdGkgYWwgbWFzc2ltbyB7e2RhdGEubWF4SXRlbXN9fSBlbGVtZW50aS48L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiIFtpbm5lckh0bWxdPVwiZGF0YS5lbXB0eU1lc3NhZ2UgfCBzYWZlSHRtbFwiPjwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvaT5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPG1hdC1zZWxlY3Rpb24tbGlzdCAjc2VsZWN0aW9uIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0KCRldmVudClcIiBkZW5zZSBoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yPVwidHJ1ZVwiPlxyXG4gICAgICBAZm9yIChpdGVtIG9mIChkYXRhLml0ZW1zIHwgc2VhcmNoOiAoIWRhdGEuY2FuTG9va3VwID8gZmlsdGVyVGV4dCA6ICcnKSk7IHRyYWNrIGl0ZW0pIHtcclxuICAgICAgPG1hdC1saXN0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiIFtzZWxlY3RlZF09XCJpdGVtLnNlbGVjdGVkXCIgY2hlY2tib3hQb3NpdGlvbj1cImJlZm9yZVwiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgIDxkaXYgW2lubmVySHRtbF09XCJpdGVtLnRlbXBsYXRlIHwgc2FmZUh0bWxcIj48L2Rpdj5cclxuICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4RmlsbD5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeEZpbGw+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MjBweFwiPlxyXG4gICAgICAgIEBpZiAoc2VsZWN0aW9uSW5mbykge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic21hbGxcIj5zZWxlemlvbmU6IDwvc3Bhbj48c3BhbiBjbGFzcz1cImJvbGRcIj57e3NlbGVjdGlvbkluZm99fTwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgQGlmIChjYW5QYWdpbmF0ZSkge1xyXG4gICAgICAgIDxkaXYgW2hpZGRlbl09XCIhZGF0YS5pdGVtcyB8fCBkYXRhLml0ZW1zLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgPG1hdC1wYWdpbmF0b3IgI3BhZ2luYXRvciBbaGlkZVBhZ2VTaXplXT1cInRydWVcIiBbcGFnZVNpemVdPVwiZGF0YS5wYWdlU2l6ZVwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgKHBhZ2UpPVwiZG9Mb29rdXBQYWdlKCRldmVudClcIj48L21hdC1wYWdpbmF0b3I+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIiBmeEZpbGw+XHJcbiAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJvaygpXCIgIFtkaXNhYmxlZF09XCJva0Rpc2FibGVkXCI+XHJcbiAgICAgICAgPHNwYW4+e3tkYXRhLm11c3RTZWxlY3QgPyBkYXRhLm9rQ2FwdGlvbiA6ICdDSElVREknfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICBAaWYgKGRhdGEubXVzdFNlbGVjdCkge1xyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjZGtGb2N1c0luaXRpYWwgIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuPkFOTlVMTEE8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9zZWxlY3Qvc2VsZWN0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9zZWxlY3Qvc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBZ0IsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0ksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFTMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQnhELE1BQU0sT0FBTyxxQkFBcUI7SUF5Q2hDO0lBQ0Usd0NBQXdDO0lBQ2hDLFNBQThDLEVBQzdCLEtBQXVCO1FBRHhDLGNBQVMsR0FBVCxTQUFTLENBQXFDO1FBdkM5QyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDOUMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBQzFDLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUMxQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDaEQsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ2hELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUNoRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDeEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFHM0MsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3QixnQ0FBZ0M7UUFDaEMsZUFBVSxHQUFZLElBQUksQ0FBQztRQUUzQiwyQkFBMkI7UUFDM0IsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUN4QixzQkFBaUIsR0FBVyxPQUFPLENBQUM7UUFFcEMsOENBQThDO1FBQzlDLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBSXpCLG9DQUFvQztRQUNwQyxrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixpQ0FBNEIsR0FBWSxLQUFLLENBQUM7UUFDOUMsMkJBQXNCLEdBQVksS0FBSyxDQUFDO1FBVXRDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBQ3BELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNyRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDekMsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQTtnQkFDMUIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsUUFBUTtRQUNOLHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLE9BQU8sQ0FDTCxJQUFJLENBQUMsU0FBUztZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZTtZQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWTtRQUNsQixPQUFPLENBQ0wsSUFBSSxDQUFDLFNBQVM7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWU7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUTtZQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILHFCQUFxQixDQUFDLElBQVM7UUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTztZQUNkLG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDOztZQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVU7WUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLENBQU07UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO29CQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7d0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU87WUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQ2pCLElBQUksQ0FBQyxTQUFTO2dCQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxPQUFPO1lBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO2dCQUNqQixJQUFJLENBQUMsU0FBUztnQkFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUztZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztnQkFDbkIsSUFBSSxDQUFDLFNBQVM7Z0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLDRCQUE0QjtZQUMvQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxhQUFhO2dCQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFDOUMsS0FBSztvQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBR0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILEVBQUU7UUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLGtCQUFrQjtZQUNsQixNQUFNLGFBQWEsR0FBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMxRCxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUFlLElBQUksRUFBRSxJQUFTLElBQUk7UUFDekMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsWUFBaUI7UUFDakMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7Z0JBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDdkIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsTUFBVztRQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXZGLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsS0FBYTtRQUNqQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7TUFHRTtJQUNRLFlBQVksQ0FBQyxDQUFNO1FBQzNCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQXdCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sSUFBSSxhQUFhLEdBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMxRCxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUN0QixhQUFhLEVBQUUsYUFBYTtTQUNQLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDOzhHQWhVVSxxQkFBcUIsOENBNEN0QixlQUFlO2tHQTVDZCxxQkFBcUIsNk9BNUJoQixXQUFXLENBQUMsWUFBWSxFQUFFLCtOQ2xDNUMsZ3RQQStLTSx3d0NEeElGLGNBQWMsOEhBQ2QsVUFBVSwraEdBQ1YsY0FBYyw4QkFDZCxrQkFBa0IsMmFBQ2xCLGNBQWMsMFdBQ2QsV0FBVyw4bUJBQ1gsZUFBZSx3VUFDZixhQUFhLG1MQUNiLGVBQWUsbXJCQUNmLGVBQWUsOEJBQ2YsZ0JBQWdCLDZUQUNoQixhQUFhLGd3QkFDYixnQkFBZ0IsbUlBQ2hCLGlCQUFpQiwrV0FDakIsZ0JBQWdCLHdHQUNoQixhQUFhLCtkQUNiLGdCQUFnQiw0SEFDaEIsY0FBYyxvTEFDZCxrQkFBa0IsZ1NBQ2xCLGdCQUFnQiwwQ0FDaEIsWUFBWTs7MkZBR0gscUJBQXFCO2tCQTdCakMsU0FBUzsyQkFDRixFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUUsY0FHaEMsSUFBSSxXQUNQO3dCQUNQLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixZQUFZO3FCQUNiOzswQkE4Q0UsTUFBTTsyQkFBQyxlQUFlO3lDQTNDRCxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0UsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUVaLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCwgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94XCI7XHJcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nVGl0bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7IE1hdERpdmlkZXJNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlclwiO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcclxuaW1wb3J0IHsgTWF0TGlzdE1vZHVsZSwgTWF0U2VsZWN0aW9uTGlzdCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9saXN0XCI7XHJcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudVwiO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwXCI7XHJcbmltcG9ydCB7IFNhZmVIdG1sUGlwZSwgU2VhcmNoRmlsdGVyUGlwZSwgU3lzdGVtVXRpbHMgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIFNlbGVjdERpYWxvZ0FwcGVuZCxcclxuICBTZWxlY3REaWFsb2dEYXRhLFxyXG4gIFNlbGVjdERpYWxvZ0RlbGV0ZSxcclxuICBTZWxlY3REaWFsb2dMb29rdXAsXHJcbiAgU2VsZWN0RGlhbG9nUmVzdWx0LFxyXG4gIFNlbGVjdGFibGVJdGVtLFxyXG59IGZyb20gXCIuLi8uLi9kZWZpbml0aW9uc1wiO1xyXG5pbXBvcnQgeyBFeHRlbmRlZE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dCc7XHJcbmltcG9ydCB7IEZsZXhNb2R1bGUgfSBmcm9tIFwiQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2ZsZXhcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9zZWxlY3QtZGlhbG9nLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICBGbGV4TW9kdWxlLFxyXG4gICAgRXh0ZW5kZWRNb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdE9wdGlvbk1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRNZW51TW9kdWxlLFxyXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgIE1hdExpc3RNb2R1bGUsXHJcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxyXG4gICAgTWF0RGlhbG9nQ2xvc2UsXHJcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXHJcbiAgICBTZWFyY2hGaWx0ZXJQaXBlLFxyXG4gICAgU2FmZUh0bWxQaXBlXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlbGVjdERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgncGFnaW5hdG9yJykgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xyXG4gIEBWaWV3Q2hpbGQoXCJzZWxlY3Rpb25cIikgc2VsZWN0aW9uITogTWF0U2VsZWN0aW9uTGlzdDtcclxuXHJcbiAgQE91dHB1dCgpIGRvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERpYWxvZ1Jlc3VsdD4oKTtcclxuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0YWJsZUl0ZW0+KCk7XHJcbiAgQE91dHB1dCgpIHZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGFibGVJdGVtPigpO1xyXG4gIEBPdXRwdXQoKSBhcHBlbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERpYWxvZ0FwcGVuZD4oKTtcclxuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3REaWFsb2dEZWxldGU+KCk7XHJcbiAgQE91dHB1dCgpIGxvb2t1cCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0RGlhbG9nTG9va3VwPigpO1xyXG4gIEBPdXRwdXQoKSBsb29rdXBPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBkYXRhOiBTZWxlY3REaWFsb2dEYXRhO1xyXG4gIGNhbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjYW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FuQXBwZW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FuRGVsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2FuUGFnaW5hdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b24gYWN0aXZpdHlcclxuICBva0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gVXNlZCBmb3IgYXJyYXkgZmlsdGVyaW5nXHJcbiAgZmlsdGVyVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICBmaWx0ZXJPcHRpb25zOiBhbnkgPSBbXTtcclxuICBmaWx0ZXJPcHRpb25zSW5mbzogc3RyaW5nID0gXCJUdXR0b1wiO1xyXG5cclxuICAvLyBVc2VkIHRvIHNpbmNyb25pemUgbG9va3VwIGZpZWxkcyBhbmQgcGFyYW1zXHJcbiAgbG9va3VwRmllbGQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgcHJpdmF0ZSBsb29rdXBQYXJhbXM6IGFueTtcclxuXHJcblxyXG4gIC8vIFVzZWQgdG8gZGlzcGxheSBzZWxlY3RlZCBlbGVtZW50c1xyXG4gIHNlbGVjdGlvbkluZm86IHN0cmluZyA9IFwiXCI7XHJcbiAgc2VsZWN0aW9uTWFzdGVySW5kZXRlcm1pbmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGlvbk1hc3RlckNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvLyBwcml2YXRlICRicm9hZGNhc3Q6IEJyb2FkY2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFNlbGVjdERpYWxvZ0NvbXBvbmVudD4sXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgX2RhdGE6IFNlbGVjdERpYWxvZ0RhdGFcclxuICApIHtcclxuICAgIHRoaXMuZGF0YSA9IF9kYXRhIHx8IHsgYXBwZWFyYW5jZTogJ291dGxpbmUnLCB0aXRsZTogJ1NlbGV6aW9uYScgfTtcclxuICAgIGlmICghdGhpcy5kYXRhLmFwcGVhcmFuY2UpIHRoaXMuZGF0YS5hcHBlYXJhbmNlID0gJ291dGxpbmUnO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEudGl0bGUpIHRoaXMuZGF0YS50aXRsZSA9ICdTZWxlemlvbmEnO1xyXG4gICAgaWYgKHRoaXMuZGF0YS5tdWx0aSAmJiAhdGhpcy5kYXRhLml0ZW1zKSB0aGlzLmRhdGEubXVsdGkgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEub2tDYXB0aW9uKSB0aGlzLmRhdGEub2tDYXB0aW9uID0gXCJPS1wiO1xyXG4gICAgdGhpcy5jYW5BcHBlbmQgPSB0aGlzLmRhdGEuY2FuQXBwZW5kO1xyXG4gICAgdGhpcy5jYW5FZGl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhblZpZXcgPSBmYWxzZTtcclxuICAgIHRoaXMuY2FuRGVsZXRlID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5kYXRhLmNhbkxvb2t1cCkge1xyXG4gICAgICB0aGlzLmRhdGEuaXRlbXMgPSBbXTtcclxuICAgICAgaWYgKHRoaXMuZGF0YS5sb29rdXBGaWVsZHMgJiYgdGhpcy5kYXRhLmxvb2t1cEZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5sb29rdXBGaWVsZCA9IHRoaXMuZGF0YS5sb29rdXBGaWVsZHNbMF0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGF0YS5jYW5GaWx0ZXIpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMgPSB0aGlzLmRhdGEuZmlsdGVycztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kYXRhLmNhblBhZ2luYXRlKSB7XHJcbiAgICAgICAgdGhpcy5jYW5QYWdpbmF0ZSA9IHRoaXMuZGF0YS5jYW5QYWdpbmF0ZTtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YS5wYWdlU2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhLnBhZ2VTaXplID0gMTAwXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm9rRGlzYWJsZWQgPSB0aGlzLmRhdGEubXVzdFNlbGVjdDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gQXBwbHkgZmlsdGVyIGlmIGV4aXN0c1xyXG4gICAgaWYgKHRoaXMuZGF0YS5maWx0ZXIgfHwgdGhpcy5kYXRhLmxvb2t1cE9uSW5pdCkge1xyXG4gICAgICB0aGlzLmRvRmlsdGVyKHRoaXMuZGF0YS5maWx0ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZXZlcnkgZWxlbWVudCBhcmUgc2VsZWN0ZWRcclxuICAgKi9cclxuICBwcml2YXRlIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMgJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuZGF0YS5pdGVtcy5sZW5ndGhcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgZXhpc3RzIGEgc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNTZWxlY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMgJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPiAwXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFzdGVyIHNlbGVjdGlvbiB0b2dnbGVcclxuICAgKi9cclxuICBtYXN0ZXJTZWxlY3Rpb25Ub2dnbGUoYXJnczogYW55KSB7XHJcbiAgICBpZiAoYXJncy5jaGVja2VkKVxyXG4gICAgICAvLyBEZXNlbGVjdCBpZiBub3QgYWxsc2VsZWN0ZWQgc28gdGhhdCB0b2dnbGUgbWFrZXMgdGhlIHJpZ2h0IGNob2ljZVxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwoKTtcclxuICAgIGVsc2UgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uTWFzdGVySW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25NYXN0ZXJDaGVja2VkID0gYXJncy5jaGVja2VkO1xyXG4gICAgdGhpcy5va0Rpc2FibGVkID1cclxuICAgICAgdGhpcy5kYXRhLm11c3RTZWxlY3QgJiZcclxuICAgICAgKCF0aGlzLnNlbGVjdGlvbiB8fCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKTtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25JbmZvKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgc2VsZWN0aW9uL2Rlc2VsZWN0aW9uIG9mIGFuIGl0ZW1cclxuICAgKi9cclxuICBzZWxlY3QoZTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS5tdWx0aSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdEFsbCgpO1xyXG4gICAgICBpZiAoZS5vcHRpb25zPy5sZW5ndGggPiAwKVxyXG4gICAgICAgIGUub3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMub2tEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5va0Rpc2FibGVkID1cclxuICAgICAgICB0aGlzLmRhdGEubXVzdFNlbGVjdCAmJlxyXG4gICAgICAgICghdGhpcy5zZWxlY3Rpb24gfHxcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPT09IDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBlZGl0b3JzXHJcbiAgICB0aGlzLmNhbkFwcGVuZCA9IHRoaXMuZGF0YS5jYW5BcHBlbmQ7XHJcbiAgICB0aGlzLmNhbkVkaXQgPVxyXG4gICAgICB0aGlzLmRhdGEuY2FuRWRpdCAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoID09PSAxO1xyXG4gICAgdGhpcy5jYW5WaWV3ID1cclxuICAgICAgdGhpcy5kYXRhLmNhblZpZXcgJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24gJiZcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aCA9PT0gMTtcclxuICAgIHRoaXMuY2FuRGVsZXRlID1cclxuICAgICAgdGhpcy5kYXRhLmNhbkRlbGV0ZSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbiAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuc2VsZWN0aW9uTWFzdGVySW5kZXRlcm1pbmF0ZSA9XHJcbiAgICAgICF0aGlzLmlzQWxsU2VsZWN0ZWQoKSAmJiB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25NYXN0ZXJDaGVja2VkID0gdGhpcy5oYXNTZWxlY3Rpb24oKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSW5mbygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNlbGVjdGlvbiBpbmZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25JbmZvKCkge1xyXG4gICAgLy8gVXBkYXRlIHNlbGVjdGlvbiBpbmZvXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5kYXRhLm11bHRpKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uSW5mbyA9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aCArXHJcbiAgICAgICAgXCIgLyBcIiArXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ub3B0aW9ucy5sZW5ndGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkluZm8gPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBjdXJyZW50IHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25NYXN0ZXJJbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1hc3RlckNoZWNrZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkluZm8gPSBcIlwiO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0IHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIG9rKCkge1xyXG4gICAgaWYgKCF0aGlzLm9rRGlzYWJsZWQpIHtcclxuICAgICAgLy8gTXVsdGkgc2VsZWN0aW9uXHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXM6IGFueSA9IFtdO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaChlbGVtZW50LnZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZG9uZS5lbWl0KHsgc2VsZWN0ZWRJdGVtczogc2VsZWN0ZWRJdGVtcyB9KTtcclxuICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIGZpbHRlclxyXG4gICAqL1xyXG4gIGNsZWFyRmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gXCJcIjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgZmlsdGVyIG9wdGlvbnNcclxuICAgKi9cclxuICBzaG93RmlsdGVyT3B0aW9ucygpIHtcclxuICAgIGlmICh0aGlzLmxvb2t1cE9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5sb29rdXBPcHRpb25zLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGZpbHRlclxyXG4gICAqIEBwYXJhbSB0ZXh0IDogdGhlIHN0cmluZyB0byBmaWx0ZXIgdG9cclxuICAgKi9cclxuICBkb0ZpbHRlcih0ZXh0OiBzdHJpbmcgPSBudWxsLCBlOiBhbnkgPSBudWxsKSB7XHJcbiAgICBpZiAodGV4dCkge1xyXG4gICAgICB0aGlzLmZpbHRlclRleHQgPSB0ZXh0O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGF0YS5jYW5Mb29rdXApIHtcclxuICAgICAgaWYgKCFlIHx8IGUua2V5Q29kZSA9PT0gMTMpIHtcclxuICAgICAgICB0aGlzLmxvb2t1cC5lbWl0KHsgaXRlbXM6IHRoaXMuZGF0YS5pdGVtcywgZmlsdGVyOiB0aGlzLmZpbHRlclRleHQgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGZpbHRlciB1c2luZyBmaWx0ZXIgb3B0aW9uc1xyXG4gICAqIEBwYXJhbSBmaWx0ZXJPUHRpb24gOiB0aGUgY3VycmVudCBmaWx0ZXJcclxuICAgKi9cclxuICBkb0ZpbHRlckJ5T3B0aW9ucyhmaWx0ZXJPcHRpb246IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5jYW5Mb29rdXAgJiYgdGhpcy5kYXRhLmNhbkZpbHRlcikge1xyXG4gICAgICB0aGlzLmZpbHRlci5lbWl0KHtcclxuICAgICAgICBpdGVtczogdGhpcy5kYXRhLml0ZW1zLFxyXG4gICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXJUZXh0LFxyXG4gICAgICAgIGZpbHRlck9wdGlvbjogZmlsdGVyT3B0aW9uLFxyXG4gICAgICAgIG93bmVyOiB0aGlzLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGZpbHRlclxyXG4gICAqIEBwYXJhbSBwYXJhbXMgOiB0aGUgb2JqZWN0IHdpdGggY3VycmVudCBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgZG9Mb29rdXAocGFyYW1zOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuY2FuTG9va3VwKSB7XHJcbiAgICAgIHRoaXMubG9va3VwUGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICB0aGlzLmxvb2t1cFBhcmFtcy5maXJzdCA9IDA7XHJcbiAgICAgIHRoaXMubG9va3VwLmVtaXQoeyBpdGVtczogdGhpcy5kYXRhLml0ZW1zLCBwYXJhbXM6IHRoaXMubG9va3VwUGFyYW1zLCBvd25lcjogdGhpcyB9KTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbG9va3VwIHBhZ2luYXRyb1xyXG4gICAqIEBwYXJhbSB0b3RhbCA6IHRoZSBuZXcgdG90YWwgaXRlbXNcclxuICAgKi9cclxuICB1cGRhdGVMb29rdXBQYWdpbmF0b3IodG90YWw6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuY2FuUGFnaW5hdGUpIHtcclxuICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLnBhZ2luYXRvci5sZW5ndGggPSB0b3RhbCA/PyAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFwcGx5IGZpbHRlclxyXG4gICogQHBhcmFtIGUgOiB0aGUgTWF0UGFnaW5hdG9yIFBhZ2VFdmVudCBkYXRhXHJcbiAgKi9cclxuICBwcm90ZWN0ZWQgZG9Mb29rdXBQYWdlKGU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5jYW5Mb29rdXAgJiYgdGhpcy5kYXRhLmNhblBhZ2luYXRlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcclxuICAgICAgdGhpcy5sb29rdXBQYXJhbXMuZmlyc3QgPSBlLnBhZ2VJbmRleCAqICh0aGlzLmRhdGEucGFnZVNpemUgPz8gMCk7XHJcbiAgICAgIHRoaXMubG9va3VwLmVtaXQoeyBpdGVtczogdGhpcy5kYXRhLml0ZW1zLCBwYXJhbXM6IHRoaXMubG9va3VwUGFyYW1zLCBvd25lcjogdGhpcyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZFxyXG4gICAqL1xyXG4gIGRvQXBwZW5kKCkge1xyXG4gICAgdGhpcy5hcHBlbmQuZW1pdCh7IGl0ZW1zOiB0aGlzLmRhdGEuaXRlbXMgfSBhcyBTZWxlY3REaWFsb2dBcHBlbmQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRWRpdFxyXG4gICAqL1xyXG4gIGRvRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQpXHJcbiAgICAgIHRoaXMuZWRpdC5lbWl0KHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZFswXS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWaWV3XHJcbiAgICovXHJcbiAgZG9WaWV3KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZClcclxuICAgICAgdGhpcy52aWV3LmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkWzBdLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZVxyXG4gICAqL1xyXG4gIGRvRGVsZXRlKCkge1xyXG4gICAgbGV0IHNlbGVjdGVkSXRlbXM6IGFueSA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgc2VsZWN0ZWRJdGVtcy5wdXNoKGVsZW1lbnQudmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRlbGV0ZS5lbWl0KHtcclxuICAgICAgaXRlbXM6IHRoaXMuZGF0YS5pdGVtcyxcclxuICAgICAgc2VsZWN0ZWRJdGVtczogc2VsZWN0ZWRJdGVtcyxcclxuICAgIH0gYXMgU2VsZWN0RGlhbG9nRGVsZXRlKTtcclxuICAgIHRoaXMuY2FuRGVsZXRlID0gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsIjxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS50aXRsZX19PC9oMj5cclxuPGRpdiBzdHlsZT1cInBhZGRpbmc6IDAgMjRweFwiPlxyXG4gIEBpZiAoZGF0YS5kZXNjcmlwdGlvbikge1xyXG4gIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbToxMHB4XCIgW2lubmVySHRtbF09XCJkYXRhLmRlc2NyaXB0aW9uIHwgc2FmZUh0bWxcIj48L2Rpdj5cclxuICB9XHJcbiAgPGRpdj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjIwcHhcIiBmeEZpbGw+XHJcbiAgICAgIEBpZiAoIWRhdGEuY2FuTG9va3VwV2l0aE9wdGlvbnMpIHtcclxuICAgICAgPGRpdiBmeEZsZXg9XCIxMDBcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9J3dpZHRoOjEwMCUnIFthcHBlYXJhbmNlXT1cImRhdGEuYXBwZWFyYW5jZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+Q2VyY2EuLi48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNka0ZvY3VzSW5pdGlhbCAoa2V5dXAuRW50ZXIpPVwiZG9GaWx0ZXIoKVwiIG1hdElucHV0XHJcbiAgICAgICAgICAgIHRpdGxlPVwie3tkYXRhLmNhbkxvb2t1cCA/ICdEaWdpdGEgaWwgdGVzdG8gZSBwcmVtaSBpbnZpbycgOiAnRGlnaXRhIGlsIHRlc3RvJ319XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJUZXh0XCI+XHJcbiAgICAgICAgICBAaWYgKGZpbHRlclRleHQpIHtcclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCJjbGVhckZpbHRlcigpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKCFkYXRhLmNhbkxvb2t1cFdpdGhPcHRpb25zICYmIGRhdGEuY2FuTG9va3VwICYmIGRhdGEubG9va3VwRmllbGRzKSB7XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMTAwXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPSd3aWR0aDoxMDAlJyBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPkNvbWUuLi48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFsodmFsdWUpXT1cImxvb2t1cEZpZWxkXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGRhdGEubG9va3VwRmllbGRzOyB0cmFjayBmaWVsZCkge1xyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIj5cclxuICAgICAgICAgICAgICB7e2ZpZWxkLm5hbWV9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKGRhdGEuY2FuTG9va3VwV2l0aE9wdGlvbnMpIHtcclxuICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gYXJpYS1sYWJlbD1cIlJpY2VyY2FcIiAoY2xpY2spPVwic2hvd0ZpbHRlck9wdGlvbnMoKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPnNlYXJjaDwvbWF0LWljb24+UmljZXJjYVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKGRhdGEuY2FuTG9va3VwICYmIGRhdGEuY2FuRmlsdGVyKSB7XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXBcIj5cclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIkZpbHRyYVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZpbHRyYSdcIlxyXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVGaWx0ZXJcIiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfYWx0PC9tYXQtaWNvbj4ge3tmaWx0ZXJPcHRpb25zSW5mb319IDxtYXQtaWNvbiBjbGFzcz1cImljb24tbWVudS1kcm9wLWRvd25cIj5cclxuICAgICAgICAgICAgYXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bWF0LW1lbnUgI21lbnVGaWx0ZXI9XCJtYXRNZW51XCIgY2xhc3M9XCJtYXQtbWVudS0zMDBcIj5cclxuICAgICAgICAgIEBmb3IgKGYgb2YgZmlsdGVyT3B0aW9uczsgdHJhY2sgZikge1xyXG5cclxuICAgICAgICAgIEBpZiAoZi5kaXZpZGVyKSB7XHJcbiAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoZi5ncm91cE5hbWUpIHtcclxuICAgICAgICAgIDxzcGFuIHN0eWxlPSdmb250LXNpemU6c21hbGw7IHBhZGRpbmc6IDJweCA0cHg7Jz48aT48Yj57e2YuZ3JvdXBOYW1lfX08L2I+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoIWYuZ3JvdXBOYW1lICYmICFmLmRpdmlkZXIpIHtcclxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZG9GaWx0ZXJCeU9wdGlvbnMoZilcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImYuZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgQGlmIChmLnJhZGlvICYmIGYudmFsdWUpIHtcclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nLWxlZnQ6NDBweFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8bWF0LWljb24+e3tmLmljb259fTwvbWF0LWljb24+IHt7Zi50aXRsZX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgICAgQGlmIChjYW5FZGl0IHx8IGNhbkFwcGVuZCB8fCBjYW5WaWV3IHx8IGNhbkRlbGV0ZSkge1xyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeExheW91dEFsaWduPVwiZW5kXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTpub3dyYXBcIj5cclxuICAgICAgICBAaWYgKGRhdGEuY2FuQXBwZW5kKSB7XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiIWNhbkFwcGVuZFwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImRvQXBwZW5kKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWxhYmVsPVwiQWdnaXVuZ2lcIiBtYXRUb29sdGlwPVwiQWdnaXVuZ2lcIj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGRhdGEuY2FuRWRpdCkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZG9FZGl0KClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWxhYmVsPVwiTW9kaWZpY2FcIiBtYXRUb29sdGlwPVwiTW9kaWZpY2FcIj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmIChkYXRhLmNhblZpZXcpIHtcclxuICAgICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCIhY2FuVmlld1wiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImRvVmlldygpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gYXJpYS1sYWJlbD1cIk1vc3RyYVwiIG1hdFRvb2x0aXA9XCJNb3N0cmFcIj52aXNpYmlsaXR5PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmIChkYXRhLmNhbkRlbGV0ZSkge1xyXG4gICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFjYW5EZWxldGVcIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgIChjbGljayk9XCJkb0RlbGV0ZSgpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gYXJpYS1sYWJlbD1cIkVsaW1pbmFcIiBtYXRUb29sdGlwPVwiRWxpbWluYVwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgQGlmICgoZGF0YS5tdWx0aSB8fCBkYXRhLmhlYWRlcikgJiYgZGF0YS5pdGVtcz8ubGVuZ3RoID4gMCkge1xyXG4gIDxkaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGYWx5b3V0R2FwPVwiMTBweFwiIGZ4RmlsbCBzdHlsZT1cInBhZGRpbmctdG9wOiAxMHB4O1wiPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjcycHhcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiA4cHg7XCI+XHJcbiAgICAgICAgQGlmIChkYXRhLm11bHRpKSB7XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpIDogbnVsbFwiXHJcbiAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb25NYXN0ZXJJbmRldGVybWluYXRlXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uTWFzdGVyQ2hlY2tlZFwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlemlvbmEvZGVzZWxlemlvbmEgdHV0dG8nXCIgbWF0VG9vbHRpcD1cIlNlbGV6aW9uYS9kZXNlbGV6aW9uYSB0dXR0b1wiPlxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMTAwXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICBAaWYgKGRhdGEuaGVhZGVyKSB7XHJcbiAgICAgICAgPGRpdiAgW2lubmVySHRtbF09XCJkYXRhLmhlYWRlciB8IHNhZmVIdG1sXCI+PC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZpbGw+XHJcbiAgICBAaWYgKGRhdGEuY2FuTG9va3VwICYmICghZGF0YS5pdGVtcyB8fCBkYXRhLml0ZW1zLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6MjRweDsgdGV4dC1hbGlnbjogY2VudGVyXCI+PGk+XHJcbiAgICAgICAgQGlmICghZGF0YS5lbXB0eU1lc3NhZ2UpIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tZ3JleWVkLTFcIj5OZXNzdW4gZWxlbWVudG8gZGEgdmlzdWFsaXp6YXJlLjxicj5Fc2VndWkgdW5hIG51b3ZhIHJpY2VyY2EgbyBtb2RpZmljYSBxdWVsbGFcclxuICAgICAgICAgIGVzaXN0ZW50ZS5cclxuICAgICAgICAgIEBpZiAoZGF0YS5tYXhJdGVtcyA+IDApIHtcclxuICAgICAgICAgIDxzcGFuPlNhcmFubm8gbW9zdHJhdGkgYWwgbWFzc2ltbyB7e2RhdGEubWF4SXRlbXN9fSBlbGVtZW50aS48L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiIFtpbm5lckh0bWxdPVwiZGF0YS5lbXB0eU1lc3NhZ2UgfCBzYWZlSHRtbFwiPjwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvaT5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPG1hdC1zZWxlY3Rpb24tbGlzdCAjc2VsZWN0aW9uIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0KCRldmVudClcIiBkZW5zZSBoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yPVwidHJ1ZVwiPlxyXG4gICAgICBAZm9yIChpdGVtIG9mIChkYXRhLml0ZW1zIHwgc2VhcmNoOiAoIWRhdGEuY2FuTG9va3VwID8gZmlsdGVyVGV4dCA6ICcnKSk7IHRyYWNrIGl0ZW0pIHtcclxuICAgICAgPG1hdC1saXN0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiIFtzZWxlY3RlZF09XCJpdGVtLnNlbGVjdGVkXCIgY2hlY2tib3hQb3NpdGlvbj1cImJlZm9yZVwiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgIDxkaXYgW2lubmVySHRtbF09XCJpdGVtLnRlbXBsYXRlIHwgc2FmZUh0bWxcIj48L2Rpdj5cclxuICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4RmlsbD5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeEZpbGw+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6MjBweFwiPlxyXG4gICAgICAgIEBpZiAoc2VsZWN0aW9uSW5mbykge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic21hbGxcIj5zZWxlemlvbmU6IDwvc3Bhbj48c3BhbiBjbGFzcz1cImJvbGRcIj57e3NlbGVjdGlvbkluZm99fTwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGZ4RmxleEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgQGlmIChjYW5QYWdpbmF0ZSkge1xyXG4gICAgICAgIDxkaXYgW2hpZGRlbl09XCIhZGF0YS5pdGVtcyB8fCBkYXRhLml0ZW1zLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgPG1hdC1wYWdpbmF0b3IgI3BhZ2luYXRvciBbaGlkZVBhZ2VTaXplXT1cInRydWVcIiBbcGFnZVNpemVdPVwiZGF0YS5wYWdlU2l6ZVwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgKHBhZ2UpPVwiZG9Mb29rdXBQYWdlKCRldmVudClcIj48L21hdC1wYWdpbmF0b3I+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIiBmeEZpbGw+XHJcbiAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJvaygpXCIgIFtkaXNhYmxlZF09XCJva0Rpc2FibGVkXCI+XHJcbiAgICAgICAgPHNwYW4+e3tkYXRhLm11c3RTZWxlY3QgPyBkYXRhLm9rQ2FwdGlvbiA6ICdDSElVREknfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICBAaWYgKGRhdGEubXVzdFNlbGVjdCkge1xyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZSBjZGtGb2N1c0luaXRpYWwgIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuPkFOTlVMTEE8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19