@bizdoc/core 1.16.15 → 1.16.16

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.
@@ -42,7 +42,6 @@ let FormDesignerComponent = class FormDesignerComponent {
42
42
  this.form = this._fb.group({
43
43
  subject: null,
44
44
  value: null,
45
- cube: null,
46
45
  summary: null,
47
46
  sections: this._fb.array([])
48
47
  });
@@ -219,16 +218,16 @@ let FormDesignerComponent = class FormDesignerComponent {
219
218
  }
220
219
  };
221
220
  FormDesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FormDesignerComponent, deps: [{ token: i1.FormBuilder }, { token: i2.PaneRef }, { token: i0.ChangeDetectorRef }, { token: i3.PromptService }, { token: i4.SessionService }, { token: i0.ElementRef }, { token: i5.UtilityRef }], target: i0.ɵɵFactoryTarget.Component });
222
- FormDesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FormDesignerComponent, selector: "ng-component", host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, ngImport: i0, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"save()\" [disabled]=\"!dirty || loading || saving\" [bizdocTooltip]=\"'Save'|translate\"><mat-icon>save</mat-icon></button>\r\n <button mat-icon-button (click)=\"undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"historyIndex === -1\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"historyIndex === history.length - 1\"><mat-icon>redo</mat-icon></button>\r\n</mat-toolbar>\r\n<button mat-icon-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n<form autocomplete=\"off\" [formGroup]=\"form\" *ngIf=\"model\">\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Subject'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"subject\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Summary'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"summary\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Analysis'|translate}}</mat-label>\r\n <mat-select formControlName=\"cube\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option *ngFor=\"let c of cubes\" [value]=\"c.name\">{{c.title}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, form.get('sections'))\">\r\n <section class=\"column\" *ngFor=\"let s of form.get('sections').controls; let si = index\" cdkDrag [attr.data-index]=\"si\">\r\n <div class=\"row\">\r\n <mat-icon class=\"section-drag\" cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"s\">\r\n <mat-form-field>\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"s.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"s.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, s.get('rows'))\">\r\n <div *ngFor=\"let r of s.get('rows').controls; let ri = index\" class=\"row designer-row\" cdkDrag [attr.data-index]=\"ri\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"drop($event, r.get('fields'))\" class=\"row\">\r\n <div *ngFor=\"let f of r.get('fields').controls; let fi = index\" cdkDrag class=\"designer-field row\" [attr.data-index]=\"fi\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"f\">\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput required formControlName=\"name\" />\r\n <mat-error *ngIf=\"f.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"f.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Label'|translate}}</mat-label>\r\n <input matInput required formControlName=\"label\" />\r\n <mat-error *ngIf=\"f.get('label').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Label'\"></mat-error>\r\n </mat-form-field>\r\n <mat-checkbox formControlName=\"required\">{{'Mandatory'|translate}}</mat-checkbox>\r\n <ng-container [ngSwitch]=\"f.get('kind').value\">\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Text'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Number'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <mat-form-field *ngSwitchCase=\"'Select'\">\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of datatypes\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"s.get('dataType').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'DataType'\"></mat-error>\r\n </mat-form-field>\r\n <div *ngSwitchDefault>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"kind\">\r\n <mat-option value=\"String\">{{'Text'|translate}}</mat-option>\r\n <mat-option value=\"PhoneNumber\">{{'Tel'|translate}}</mat-option>\r\n <mat-option value=\"EmailAddress\">{{'Email'|translate}}</mat-option>\r\n <mat-option value=\"Url\">{{'Url'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"actions\">\r\n <button mat-stroked-button (click)=\"removeField(r, f)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <!--<div *cdkDragPlaceholder class=\"drag-placeholder\"></div>-->\r\n </div>\r\n </div>\r\n <div class=\"column\">\r\n <button mat-stroked-button [matMenuTriggerFor]=\"fieldKindMenu\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #fieldKindMenu>\r\n <button mat-menu-item (click)=\"addField(s, r, 'String', $event)\">{{'Input'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Date', $event)\">{{'Date'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Number', $event)\">{{'Numeric'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Select', $event)\">{{'Select'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Checkbox', $event)\">{{'Checkbox'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Switch', $event)\">{{'Switch'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Text', $event)\">{{'Text'|translate}}</button>\r\n </mat-menu>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"removeRow(s, r)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <button mat-stroked-button (click)=\"addRow(s, $event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n <button mat-stroked-button (click)=\"removeSection(s)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </section>\r\n <button mat-stroked-button (click)=\"addSection($event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n </div>\r\n</form>\r\n", styles: ["form{margin:8px}section,.designer-row,.designer-field{border:2px solid transparent;border-radius:3px;padding:8px}section:hover,.designer-row:hover,.designer-field:hover{border:2px dotted}section .designer-row{margin:5px 0}section .designer-row .designer-field{flex:1}.drag-placeholder{border:2px dashed}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { 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.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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i8.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i10.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i16.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i16.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i17.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i18.AceInput, selector: "bizdoc-ace-input", inputs: ["params", "placeholder", "required", "disabled", "value"] }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }] });
221
+ FormDesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FormDesignerComponent, selector: "ng-component", host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, ngImport: i0, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"save()\" [disabled]=\"!dirty || loading || saving\" [bizdocTooltip]=\"'Save'|translate\"><mat-icon>save</mat-icon></button>\r\n <button mat-icon-button (click)=\"undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"historyIndex === -1\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"historyIndex === history.length - 1\"><mat-icon>redo</mat-icon></button>\r\n</mat-toolbar>\r\n<button mat-icon-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n<form autocomplete=\"off\" [formGroup]=\"form\" *ngIf=\"model\">\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Subject'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"subject\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Summary'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"summary\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, form.get('sections'))\">\r\n <section class=\"column\" *ngFor=\"let s of form.get('sections').controls; let si = index\" cdkDrag [attr.data-index]=\"si\">\r\n <div class=\"row\">\r\n <mat-icon class=\"section-drag\" cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"s\">\r\n <mat-form-field>\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"s.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"s.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, s.get('rows'))\">\r\n <div *ngFor=\"let r of s.get('rows').controls; let ri = index\" class=\"row designer-row\" cdkDrag [attr.data-index]=\"ri\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"drop($event, r.get('fields'))\" class=\"row\">\r\n <div *ngFor=\"let f of r.get('fields').controls; let fi = index\" cdkDrag class=\"designer-field row\" [attr.data-index]=\"fi\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"f\">\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput required formControlName=\"name\" />\r\n <mat-error *ngIf=\"f.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"f.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Label'|translate}}</mat-label>\r\n <input matInput required formControlName=\"label\" />\r\n <mat-error *ngIf=\"f.get('label').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Label'\"></mat-error>\r\n </mat-form-field>\r\n <mat-checkbox formControlName=\"required\">{{'Mandatory'|translate}}</mat-checkbox>\r\n <ng-container [ngSwitch]=\"f.get('kind').value\">\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Text'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Number'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <mat-form-field *ngSwitchCase=\"'Select'\">\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of datatypes\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"s.get('dataType').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'DataType'\"></mat-error>\r\n </mat-form-field>\r\n <div *ngSwitchDefault>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"kind\">\r\n <mat-option value=\"String\">{{'Text'|translate}}</mat-option>\r\n <mat-option value=\"PhoneNumber\">{{'Tel'|translate}}</mat-option>\r\n <mat-option value=\"EmailAddress\">{{'Email'|translate}}</mat-option>\r\n <mat-option value=\"Url\">{{'Url'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"actions\">\r\n <button mat-stroked-button (click)=\"removeField(r, f)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <!--<div *cdkDragPlaceholder class=\"drag-placeholder\"></div>-->\r\n </div>\r\n </div>\r\n <div class=\"column\">\r\n <button mat-stroked-button [matMenuTriggerFor]=\"fieldKindMenu\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #fieldKindMenu>\r\n <button mat-menu-item (click)=\"addField(s, r, 'String', $event)\">{{'Input'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Date', $event)\">{{'Date'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Number', $event)\">{{'Numeric'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Select', $event)\">{{'Select'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Checkbox', $event)\">{{'Checkbox'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Switch', $event)\">{{'Switch'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Text', $event)\">{{'Text'|translate}}</button>\r\n </mat-menu>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"removeRow(s, r)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <button mat-stroked-button (click)=\"addRow(s, $event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n <button mat-stroked-button (click)=\"removeSection(s)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </section>\r\n <button mat-stroked-button (click)=\"addSection($event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n </div>\r\n</form>\r\n", styles: ["form{margin:8px}section,.designer-row,.designer-field{border:2px solid transparent;border-radius:3px;padding:8px}section:hover,.designer-row:hover,.designer-field:hover{border:2px dotted}section .designer-row{margin:5px 0}section .designer-row .designer-field{flex:1}.drag-placeholder{border:2px dashed}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { 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.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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i8.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i10.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i16.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i16.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i17.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i18.AceInput, selector: "bizdoc-ace-input", inputs: ["params", "placeholder", "required", "disabled", "value"] }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }] });
223
222
  FormDesignerComponent = __decorate([
224
223
  BizDoc({ selector: 'bizdoc-form-designer' })
225
224
  ], FormDesignerComponent);
226
225
  export { FormDesignerComponent };
227
226
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FormDesignerComponent, decorators: [{
228
227
  type: Component,
229
- args: [{ template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"save()\" [disabled]=\"!dirty || loading || saving\" [bizdocTooltip]=\"'Save'|translate\"><mat-icon>save</mat-icon></button>\r\n <button mat-icon-button (click)=\"undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"historyIndex === -1\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"historyIndex === history.length - 1\"><mat-icon>redo</mat-icon></button>\r\n</mat-toolbar>\r\n<button mat-icon-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n<form autocomplete=\"off\" [formGroup]=\"form\" *ngIf=\"model\">\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Subject'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"subject\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Summary'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"summary\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Analysis'|translate}}</mat-label>\r\n <mat-select formControlName=\"cube\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option *ngFor=\"let c of cubes\" [value]=\"c.name\">{{c.title}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, form.get('sections'))\">\r\n <section class=\"column\" *ngFor=\"let s of form.get('sections').controls; let si = index\" cdkDrag [attr.data-index]=\"si\">\r\n <div class=\"row\">\r\n <mat-icon class=\"section-drag\" cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"s\">\r\n <mat-form-field>\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"s.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"s.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, s.get('rows'))\">\r\n <div *ngFor=\"let r of s.get('rows').controls; let ri = index\" class=\"row designer-row\" cdkDrag [attr.data-index]=\"ri\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"drop($event, r.get('fields'))\" class=\"row\">\r\n <div *ngFor=\"let f of r.get('fields').controls; let fi = index\" cdkDrag class=\"designer-field row\" [attr.data-index]=\"fi\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"f\">\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput required formControlName=\"name\" />\r\n <mat-error *ngIf=\"f.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"f.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Label'|translate}}</mat-label>\r\n <input matInput required formControlName=\"label\" />\r\n <mat-error *ngIf=\"f.get('label').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Label'\"></mat-error>\r\n </mat-form-field>\r\n <mat-checkbox formControlName=\"required\">{{'Mandatory'|translate}}</mat-checkbox>\r\n <ng-container [ngSwitch]=\"f.get('kind').value\">\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Text'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Number'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <mat-form-field *ngSwitchCase=\"'Select'\">\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of datatypes\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"s.get('dataType').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'DataType'\"></mat-error>\r\n </mat-form-field>\r\n <div *ngSwitchDefault>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"kind\">\r\n <mat-option value=\"String\">{{'Text'|translate}}</mat-option>\r\n <mat-option value=\"PhoneNumber\">{{'Tel'|translate}}</mat-option>\r\n <mat-option value=\"EmailAddress\">{{'Email'|translate}}</mat-option>\r\n <mat-option value=\"Url\">{{'Url'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"actions\">\r\n <button mat-stroked-button (click)=\"removeField(r, f)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <!--<div *cdkDragPlaceholder class=\"drag-placeholder\"></div>-->\r\n </div>\r\n </div>\r\n <div class=\"column\">\r\n <button mat-stroked-button [matMenuTriggerFor]=\"fieldKindMenu\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #fieldKindMenu>\r\n <button mat-menu-item (click)=\"addField(s, r, 'String', $event)\">{{'Input'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Date', $event)\">{{'Date'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Number', $event)\">{{'Numeric'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Select', $event)\">{{'Select'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Checkbox', $event)\">{{'Checkbox'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Switch', $event)\">{{'Switch'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Text', $event)\">{{'Text'|translate}}</button>\r\n </mat-menu>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"removeRow(s, r)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <button mat-stroked-button (click)=\"addRow(s, $event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n <button mat-stroked-button (click)=\"removeSection(s)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </section>\r\n <button mat-stroked-button (click)=\"addSection($event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n </div>\r\n</form>\r\n", styles: ["form{margin:8px}section,.designer-row,.designer-field{border:2px solid transparent;border-radius:3px;padding:8px}section:hover,.designer-row:hover,.designer-field:hover{border:2px dotted}section .designer-row{margin:5px 0}section .designer-row .designer-field{flex:1}.drag-placeholder{border:2px dashed}\n"] }]
228
+ args: [{ template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"save()\" [disabled]=\"!dirty || loading || saving\" [bizdocTooltip]=\"'Save'|translate\"><mat-icon>save</mat-icon></button>\r\n <button mat-icon-button (click)=\"undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"historyIndex === -1\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"historyIndex === history.length - 1\"><mat-icon>redo</mat-icon></button>\r\n</mat-toolbar>\r\n<button mat-icon-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n<form autocomplete=\"off\" [formGroup]=\"form\" *ngIf=\"model\">\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Subject'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"subject\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Summary'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"summary\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, form.get('sections'))\">\r\n <section class=\"column\" *ngFor=\"let s of form.get('sections').controls; let si = index\" cdkDrag [attr.data-index]=\"si\">\r\n <div class=\"row\">\r\n <mat-icon class=\"section-drag\" cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"s\">\r\n <mat-form-field>\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"s.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"s.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event, s.get('rows'))\">\r\n <div *ngFor=\"let r of s.get('rows').controls; let ri = index\" class=\"row designer-row\" cdkDrag [attr.data-index]=\"ri\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"drop($event, r.get('fields'))\" class=\"row\">\r\n <div *ngFor=\"let f of r.get('fields').controls; let fi = index\" cdkDrag class=\"designer-field row\" [attr.data-index]=\"fi\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"column\" [formGroup]=\"f\">\r\n <mat-form-field>\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput required formControlName=\"name\" />\r\n <mat-error *ngIf=\"f.get('name').hasError('pattern')\" [innerHTML]=\"'ProgramPatternErr'|translate\"></mat-error>\r\n <mat-error *ngIf=\"f.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Field'\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Label'|translate}}</mat-label>\r\n <input matInput required formControlName=\"label\" />\r\n <mat-error *ngIf=\"f.get('label').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'Label'\"></mat-error>\r\n </mat-form-field>\r\n <mat-checkbox formControlName=\"required\">{{'Mandatory'|translate}}</mat-checkbox>\r\n <ng-container [ngSwitch]=\"f.get('kind').value\">\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Text'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Number'\">\r\n </div>\r\n <div *ngSwitchCase=\"'Date'\">\r\n </div>\r\n <mat-form-field *ngSwitchCase=\"'Select'\">\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of datatypes\" [value]=\"t.name\">{{t.title}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"s.get('dataType').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:'DataType'\"></mat-error>\r\n </mat-form-field>\r\n <div *ngSwitchDefault>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"kind\">\r\n <mat-option value=\"String\">{{'Text'|translate}}</mat-option>\r\n <mat-option value=\"PhoneNumber\">{{'Tel'|translate}}</mat-option>\r\n <mat-option value=\"EmailAddress\">{{'Email'|translate}}</mat-option>\r\n <mat-option value=\"Url\">{{'Url'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"actions\">\r\n <button mat-stroked-button (click)=\"removeField(r, f)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <!--<div *cdkDragPlaceholder class=\"drag-placeholder\"></div>-->\r\n </div>\r\n </div>\r\n <div class=\"column\">\r\n <button mat-stroked-button [matMenuTriggerFor]=\"fieldKindMenu\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #fieldKindMenu>\r\n <button mat-menu-item (click)=\"addField(s, r, 'String', $event)\">{{'Input'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Date', $event)\">{{'Date'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Number', $event)\">{{'Numeric'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Select', $event)\">{{'Select'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Checkbox', $event)\">{{'Checkbox'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Switch', $event)\">{{'Switch'|translate}}</button>\r\n <button mat-menu-item (click)=\"addField(s, r, 'Text', $event)\">{{'Text'|translate}}</button>\r\n </mat-menu>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"removeRow(s, r)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <button mat-stroked-button (click)=\"addRow(s, $event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n <span class=\"divider\"></span>\r\n <button mat-stroked-button (click)=\"settings = !settings\" [bizdocTooltip]=\"'Settings'|translate\" type=\"button\"><mat-icon>settings</mat-icon></button>\r\n <button mat-stroked-button (click)=\"removeSection(s)\" [bizdocTooltip]=\"'Discard'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </div>\r\n <div class=\"column\" *ngIf=\"settings\">\r\n <mat-form-field>\r\n <mat-label>{{'Value'|translate}}</mat-label>\r\n <bizdoc-ace-input formControlName=\"value\"></bizdoc-ace-input>\r\n <mat-hint> {{ 'Expression'|translate }}</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </section>\r\n <button mat-stroked-button (click)=\"addSection($event)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add</mat-icon></button>\r\n </div>\r\n</form>\r\n", styles: ["form{margin:8px}section,.designer-row,.designer-field{border:2px solid transparent;border-radius:3px;padding:8px}section:hover,.designer-row:hover,.designer-field:hover{border:2px dotted}section .designer-row{margin:5px 0}section .designer-row .designer-field{flex:1}.drag-placeholder{border:2px dashed}\n"] }]
230
229
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.PaneRef }, { type: i0.ChangeDetectorRef }, { type: i3.PromptService }, { type: i4.SessionService }, { type: i0.ElementRef }, { type: i5.UtilityRef }]; }, propDecorators: { handleKeyboardEvent: [{
231
230
  type: HostListener,
232
231
  args: ['document:keydown', ['$event']]
233
232
  }] } });
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9hZG1pbi9mb3JtL2Rlc2lnbmVyL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vZm9ybS9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQy9GLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT2xELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDO0FBRTlCLE1BQU07SUFNTyxxQkFBcUIsU0FBckIscUJBQXFCO0lBb0JoQyxZQUNVLEdBQWdCLEVBQ2hCLEtBQW1CLEVBQ25CLEdBQXNCLEVBQ3RCLEdBQWtCLEVBQ2xCLFFBQXdCLEVBQ3hCLEdBQWUsRUFDZixJQUFpRztRQU5qRyxRQUFHLEdBQUgsR0FBRyxDQUFhO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBZTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFnQjtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBNkY7UUExQjNHLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixVQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2IsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVOLFlB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QyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnRHJvcCB9IGZyb20gXCJAYW5ndWxhci9jZGsvZHJhZy1kcm9wXCI7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEJpekRvYyB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgY2xlYW51cCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL2Z1bmN0aW9uc1wiO1xyXG5pbXBvcnQgeyBDdWJlLCBGaWVsZFR5cGUsIFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9tb2RlbHNcIjtcclxuaW1wb3J0IHsgUHJvbXB0U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3Byb21wdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBhbmVSZWYgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zbG90cy9wYW5lLXJlZlwiO1xyXG5pbXBvcnQgeyBVdGlsaXR5UmVmIH0gZnJvbSBcIi4uLy4uL3V0aWxpdHktcmVmXCI7XHJcblxyXG5jb25zdCBOQU1FID0gL15bQS1aYS16XStcXHcqJC87XHJcblxyXG4vKiogKi9cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICdkZXNpZ25lci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2Rlc2lnbmVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuQEJpekRvYyh7IHNlbGVjdG9yOiAnYml6ZG9jLWZvcm0tZGVzaWduZXInIH0pXHJcbmV4cG9ydCBjbGFzcyBGb3JtRGVzaWduZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG4gIHRvb2xzID0gdHJ1ZTtcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuICBtb2RlbDogQm94Rm9ybU1ldGFkYXRhO1xyXG4gIHJlYWRvbmx5IGhpc3Rvcnk6IHN0cmluZ1tdID0gW107XHJcbiAgaGlzdG9yeUluZGV4ID0gLTE7XHJcbiAgcmVhZG9ubHkgZGF0YXR5cGVzOiBUeXBlW107XHJcbiAgcmVhZG9ubHkgY3ViZXM6IEN1YmVbXTtcclxuICByZWFkb25seSBmb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgc3ViamVjdDogbnVsbCxcclxuICAgIHZhbHVlOiBudWxsLFxyXG4gICAgY3ViZTogbnVsbCxcclxuICAgIHN1bW1hcnk6IG51bGwsXHJcbiAgICBzZWN0aW9uczogdGhpcy5fZmIuYXJyYXkoW10pXHJcbiAgfSk7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBkaXJ0eSA9IGZhbHNlO1xyXG4gIHNldHRpbmdzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZm9ybUlkOiBzdHJpbmc7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9wYW5lOiBQYW5lUmVmPGFueT4sXHJcbiAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9wczogUHJvbXB0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3Nlc3Npb246IFNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIF9yZWY6IFV0aWxpdHlSZWY8Ym9vbGVhbiwgeyBtZXRhZGF0YTogQm94Rm9ybU1ldGFkYXRhLCBmb3JtSWQ6IHN0cmluZyB9LCBCb3hGb3JtTWV0YWRhdGEsIHN0cmluZz4pIHtcclxuICAgIHRoaXMuZGF0YXR5cGVzID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLnR5cGVzO1xyXG4gICAgdGhpcy5jdWJlcyA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5jdWJlcztcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wYW5lLnF1ZXJ5UGFyYW1zQ2hhbmdlLnN1YnNjcmliZShwID0+IHtcclxuICAgICAgY29uc3QgeyBmb3JtSWQgfSA9IHA7XHJcbiAgICAgIGZvcm1JZCAmJiB0aGlzLl9vcGVuKGZvcm1JZCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZSgpLlxyXG4gICAgICBzdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgLy90aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubW9kZWwsIHYpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfb3Blbihmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcmVmLnBvcHVsYXRlKGZvcm1JZCkuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICB0aGlzLl9mb3JtSWQgPSBmb3JtSWQ7XHJcbiAgICAgIHRoaXMuX2Fzc2lnbihyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfYXNzaWduKG1vZGVsOiBCb3hGb3JtTWV0YWRhdGEpIHtcclxuICAgIHRoaXMubW9kZWwgPSBtb2RlbCB8fCB7IHNlY3Rpb25zOiBbXSB9O1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSAodGhpcy5mb3JtLmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXkpO1xyXG4gICAgc2VjdGlvbnMuY2xlYXIoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5tb2RlbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgbW9kZWwuc2VjdGlvbnM/LmZvckVhY2gocyA9PiBzZWN0aW9ucy5wdXNoKHRoaXMuX3NlY3Rpb25mb3JtKHMpLCB7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZWN0aW9uZm9ybShzZWN0aW9uOiBTZWN0aW9uTW9kZWwpIHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9mYi5jb250cm9sKHNlY3Rpb24ubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybihOQU1FKV0pO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgbmFtZSxcclxuICAgICAgdGl0bGU6IHNlY3Rpb24udGl0bGUsXHJcbiAgICAgIG11bHRpTGluZTogc2VjdGlvbi5tdWx0aUxpbmUgfHwgZmFsc2UsXHJcbiAgICAgIHZhbHVlOiBzZWN0aW9uLnZhbHVlIHx8IG51bGwsXHJcbiAgICAgIHJvd3M6IHRoaXMuX2ZiLmFycmF5KHNlY3Rpb24ucm93cz8ubWFwKHIgPT5cclxuICAgICAgICB0aGlzLl9yb3dmb3JtKHIpKSB8fCBbXSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIHByaXZhdGUgX3Jvd2Zvcm0ocm93OiBSb3dNb2RlbCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBmaWVsZHM6IHRoaXMuX2ZiLmFycmF5KHJvdy5maWVsZHMubWFwKGYgPT4gdGhpcy5fZmllbGRmb3JtKGYpKSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIHByaXZhdGUgX2ZpZWxkZm9ybShmaWVsZDogRmllbGRNb2RlbCk6IGFueSB7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZmIuY29udHJvbChmaWVsZC5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKE5BTUUpXSksXHJcbiAgICAgIGxhYmVsID0gdGhpcy5fZmIuY29udHJvbChmaWVsZC5sYWJlbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBsYWJlbCxcclxuICAgICAga2luZDogZmllbGQua2luZCxcclxuICAgICAgZGF0YVR5cGU6IGZpZWxkLmRhdGFUeXBlLFxyXG4gICAgICByZXF1aXJlZDogZmllbGQucmVxdWlyZWRcclxuICAgIH0pXHJcbiAgfVxyXG4gIGFkZFNlY3Rpb24oZXZ0PzogRXZlbnQpIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgbGV0IG4gPSAwLCBuYW1lLCB0aXRsZTtcclxuICAgIGRvIHtcclxuICAgICAgbisrO1xyXG4gICAgICBuYW1lID0gJ3NlY3Rpb24nICsgJ18nICsgbjtcclxuICAgICAgdGl0bGUgPSAnU2VjdGlvbicgKyAnICcgKyBuO1xyXG4gICAgfSB3aGlsZSAodGhpcy5tb2RlbC5zZWN0aW9ucy5maW5kKHMgPT4gcy5uYW1lID09PSBuYW1lIHx8IHMudGl0bGUgPT09IHRpdGxlKSk7XHJcbiAgICAodGhpcy5mb3JtLmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXkpLnB1c2godGhpcy5fc2VjdGlvbmZvcm0oe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgcm93czogW3sgZmllbGRzOiBbXSB9XVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzZWN0aW9uOmxhc3QtY2hpbGQgYnV0dG9uJyk/LmZvY3VzKClcclxuICB9XHJcbiAgYWRkUm93KHNlY3Rpb246IEZvcm1Hcm91cCwgZXZ0PzogRXZlbnQpIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgKHNlY3Rpb24uZ2V0KCdyb3dzJykgYXMgRm9ybUFycmF5KS5wdXNoKHRoaXMuX3Jvd2Zvcm0oe1xyXG4gICAgICBmaWVsZHM6IFtdXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYHNlY3Rpb25bZGF0YS1pbmRleD0nJHsodGhpcy5mb3JtLmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmluZGV4T2Yoc2VjdGlvbil9J10gLmRlc2lnbmVyLXJvdzpsYXN0LWNoaWxkIGJ1dHRvbmApPy5mb2N1cygpXHJcbiAgfVxyXG4gIGFkZEZpZWxkKHNlY3Rpb246IEZvcm1Hcm91cCwgcm93OiBGb3JtR3JvdXAsIGtpbmQ6IEZpZWxkVHlwZSwgZXZ0PzogRXZlbnQpIHtcclxuICAgIGxldCBuID0gMCwgbmFtZSwgbGFiZWw7XHJcbiAgICBkbyB7XHJcbiAgICAgIG4rKztcclxuICAgICAgbmFtZSA9ICdmaWVsZCcgKyAnXycgKyBuO1xyXG4gICAgICBsYWJlbCA9ICdGaWVsZCcgKyAnICcgKyBuO1xyXG4gICAgfSB3aGlsZSAoKHNlY3Rpb24uZ2V0KCdyb3dzJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5cclxuICAgICAgZmluZChyID0+IChyLmdldCgnZmllbGRzJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5maW5kKGYgPT4gZi52YWx1ZS5uYW1lID09PSBuYW1lIHx8IGYudmFsdWUubGFiZWwgPT09IGxhYmVsKSAhPSBudWxsKSk7XHJcbiAgICB0aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgIChyb3cuZ2V0KCdmaWVsZHMnKSBhcyBGb3JtQXJyYXkpLnB1c2godGhpcy5fZmllbGRmb3JtKHtcclxuICAgICAga2luZCxcclxuICAgICAgbmFtZSxcclxuICAgICAgbGFiZWwsXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgcSA9IGBzZWN0aW9uW2RhdGEtaW5kZXg9JyR7KHRoaXMuZm9ybS5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5pbmRleE9mKHNlY3Rpb24pfSddIC5kZXNpZ25lci1yb3dbZGF0YS1pbmRleD0nJHsoc2VjdGlvbi5nZXQoJ3Jvd3MnKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmluZGV4T2Yocm93KX0nXSAuZGVzaWduZXItZmllbGQ6bGFzdC1jaGlsZCBpbnB1dGA7XHJcbiAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihxKT8uZm9jdXMoKVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmVtb3ZlRmllbGQocm93OiBGb3JtR3JvdXAsIGZpZWxkOiBGb3JtR3JvdXApIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgKHJvdy5nZXQoJ2ZpZWxkcycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMucmVtb3ZlKGZpZWxkKTtcclxuICB9XHJcbiAgcmVtb3ZlU2VjdGlvbihzZWN0aW9uOiBGb3JtR3JvdXApIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgKHRoaXMuZm9ybS5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5yZW1vdmUoc2VjdGlvbik7XHJcbiAgfVxyXG4gIHJlbW92ZVJvdyhzZWN0aW9uOiBGb3JtR3JvdXAsIHJvdzogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgIChzZWN0aW9uLmdldCgncm93cycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMucmVtb3ZlKHJvdyk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX25vdGlmeUNoYW5nZSgpIHtcclxuICAgIHRoaXMuaGlzdG9yeS5wdXNoKEpTT04uc3RyaW5naWZ5KHRoaXMubW9kZWwpKTtcclxuICAgIHRoaXMuaGlzdG9yeUluZGV4ID0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDE7XHJcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcmVzdG9yZSgpIHtcclxuICAgIHRoaXMuX2Fzc2lnbihKU09OLnBhcnNlKHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleF0pKTtcclxuICB9XHJcbiAgdW5kbygpIHtcclxuICAgIHRoaXMuX3Jlc3RvcmUoKTtcclxuICAgIHRoaXMuaGlzdG9yeUluZGV4LS07XHJcbiAgfVxyXG4gIHJlZG8oKSB7XHJcbiAgICB0aGlzLl9yZXN0b3JlKCk7XHJcbiAgICB0aGlzLmhpc3RvcnlJbmRleCsrO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDdHJsLXMgc2F2ZTsgQ3RybC16IHVuZG9cclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuY3RybEtleSkge1xyXG4gICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDgzIHx8IGV2ZW50LndoaWNoID09PSAxMTUpIHtcclxuICAgICAgICB0aGlzLmRpcnR5ICYmIHRoaXMuc2F2ZSgpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8Rm9ybUdyb3VwPiwgY29sbGVjdGlvbjogRm9ybUFycmF5KSB7XHJcbiAgICB0aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2xsZWN0aW9uLmF0KGV2ZW50LnByZXZpb3VzSW5kZXgpO1xyXG4gICAgICBjb2xsZWN0aW9uLnJlbW92ZUF0KGV2ZW50LnByZXZpb3VzSW5kZXgpO1xyXG4gICAgICBjb2xsZWN0aW9uLmluc2VydChldmVudC5jdXJyZW50SW5kZXgsIGVsZW1lbnQpO1xyXG4gICAgICAvL21vdmVJdGVtSW5BcnJheShldmVudC5jb250YWluZXIuZGF0YSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vICB0cmFuc2ZlckFycmF5SXRlbShcclxuICAgICAgLy8gICAgZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YSxcclxuICAgICAgLy8gICAgZXZlbnQuY29udGFpbmVyLmRhdGEsXHJcbiAgICAgIC8vICAgIGV2ZW50LnByZXZpb3VzSW5kZXgsXHJcbiAgICAgIC8vICAgIGV2ZW50LmN1cnJlbnRJbmRleCxcclxuICAgICAgLy8gICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNhdmUoKSB7XHJcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XHJcbiAgICB0aGlzLl9yZWYuZXhlY3V0ZSh7IG1ldGFkYXRhOiBjbGVhbnVwKHRoaXMubW9kZWwpLCBmb3JtSWQ6IHRoaXMuX2Zvcm1JZCB9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9wcy50b2FzdCgnQ2hhbmdlc1NhdmVkJyk7XHJcbiAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5mb3Jtcy5maW5kKGYgPT4gZi5uYW1lID09IHRoaXMuX2Zvcm1JZCk7XHJcbiAgICAgIGlmIChmb3JtKSBmb3JtLm9wdGlvbnMgPSB0aGlzLm1vZGVsO1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLl9wcy5lcnJvcigpO1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQm94Rm9ybU1ldGFkYXRhIHtcclxuICBzZWN0aW9uczogU2VjdGlvbk1vZGVsW107XHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbiAgc3ViamVjdD86IHN0cmluZztcclxuICBzdW1tYXJ5Pzogc3RyaW5nO1xyXG4gIGN1YmU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBTZWN0aW9uTW9kZWwge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHZhbHVlPzogc3RyaW5nO1xyXG4gIG11bHRpTGluZT86IGJvb2xlYW47XHJcbiAgcm93czogUm93TW9kZWxbXTtcclxufVxyXG5pbnRlcmZhY2UgUm93TW9kZWwge1xyXG4gIGZpZWxkczogRmllbGRNb2RlbFtdO1xyXG59XHJcbmludGVyZmFjZSBGaWVsZE1vZGVsIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBraW5kOiBGaWVsZFR5cGU7XHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIGRhdGFUeXBlPzogc3RyaW5nO1xyXG4gIG1pbj86IGFueTtcclxuICBtYXg/OiBhbnk7XHJcbn1cclxuIiwiPG1hdC10b29sYmFyPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiIWRpcnR5IHx8IGxvYWRpbmcgfHwgc2F2aW5nXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1NhdmUnfHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj5zYXZlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidW5kbygpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1VuZG8nIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cImhpc3RvcnlJbmRleCA9PT0gLTFcIj48bWF0LWljb24+dW5kbzwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZG8oKVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZWRvJyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJoaXN0b3J5SW5kZXggPT09IGhpc3RvcnkubGVuZ3RoIC0gMVwiPjxtYXQtaWNvbj5yZWRvPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuPC9tYXQtdG9vbGJhcj5cclxuPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNldHRpbmdzID0gIXNldHRpbmdzXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1NldHRpbmdzJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKm5nSWY9XCJtb2RlbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiAqbmdJZj1cInNldHRpbmdzXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVmFsdWUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxiaXpkb2MtYWNlLWlucHV0IGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+PC9iaXpkb2MtYWNlLWlucHV0PlxyXG4gICAgICA8bWF0LWhpbnQ+IHt7ICdFeHByZXNzaW9uJ3x0cmFuc2xhdGUgfX08L21hdC1oaW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydTdWJqZWN0J3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8Yml6ZG9jLWFjZS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzdWJqZWN0XCI+PC9iaXpkb2MtYWNlLWlucHV0PlxyXG4gICAgICA8bWF0LWhpbnQ+IHt7ICdFeHByZXNzaW9uJ3x0cmFuc2xhdGUgfX08L21hdC1oaW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydTdW1tYXJ5J3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8Yml6ZG9jLWFjZS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzdW1tYXJ5XCI+PC9iaXpkb2MtYWNlLWlucHV0PlxyXG4gICAgICA8bWF0LWhpbnQ+IHt7ICdFeHByZXNzaW9uJ3x0cmFuc2xhdGUgfX08L21hdC1oaW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydBbmFseXNpcyd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3ViZVwiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjIG9mIGN1YmVzXCIgW3ZhbHVlXT1cImMubmFtZVwiPnt7Yy50aXRsZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgZm9ybS5nZXQoJ3NlY3Rpb25zJykpXCI+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImNvbHVtblwiICpuZ0Zvcj1cImxldCBzIG9mIGZvcm0uZ2V0KCdzZWN0aW9ucycpLmNvbnRyb2xzOyBsZXQgc2kgPSBpbmRleFwiIGNka0RyYWcgW2F0dHIuZGF0YS1pbmRleF09XCJzaVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic2VjdGlvbi1kcmFnXCIgY2RrRHJhZ0hhbmRsZT5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiIFtmb3JtR3JvdXBdPVwic1wiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7J1RpdGxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eydOYW1lJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzLmdldCgnbmFtZScpLmhhc0Vycm9yKCdwYXR0ZXJuJylcIiBbaW5uZXJIVE1MXT1cIidQcm9ncmFtUGF0dGVybkVycid8dHJhbnNsYXRlXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzLmdldCgnbmFtZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTonRmllbGQnXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50LCBzLmdldCgncm93cycpKVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByIG9mIHMuZ2V0KCdyb3dzJykuY29udHJvbHM7IGxldCByaSA9IGluZGV4XCIgY2xhc3M9XCJyb3cgZGVzaWduZXItcm93XCIgY2RrRHJhZyBbYXR0ci5kYXRhLWluZGV4XT1cInJpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNka0RyYWdIYW5kbGU+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50LCByLmdldCgnZmllbGRzJykpXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGYgb2Ygci5nZXQoJ2ZpZWxkcycpLmNvbnRyb2xzOyBsZXQgZmkgPSBpbmRleFwiIGNka0RyYWcgY2xhc3M9XCJkZXNpZ25lci1maWVsZCByb3dcIiBbYXR0ci5kYXRhLWluZGV4XT1cImZpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiIFtmb3JtR3JvdXBdPVwiZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3snTmFtZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmLmdldCgnbmFtZScpLmhhc0Vycm9yKCdwYXR0ZXJuJylcIiBbaW5uZXJIVE1MXT1cIidQcm9ncmFtUGF0dGVybkVycid8dHJhbnNsYXRlXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZi5nZXQoJ25hbWUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6J0ZpZWxkJ1wiPjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eydMYWJlbCd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJsYWJlbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZi5nZXQoJ2xhYmVsJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOidMYWJlbCdcIj48L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwicmVxdWlyZWRcIj57eydNYW5kYXRvcnknfHRyYW5zbGF0ZX19PC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZi5nZXQoJ2tpbmQnKS52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidUZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInRGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCInU2VsZWN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7J0RhdGFUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXRhVHlwZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB0IG9mIGRhdGF0eXBlc1wiIFt2YWx1ZV09XCJ0Lm5hbWVcIj57e3QudGl0bGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicy5nZXQoJ2RhdGFUeXBlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOidEYXRhVHlwZSdcIj48L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7J1R5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwia2luZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdHJpbmdcIj57eydUZXh0J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGhvbmVOdW1iZXJcIj57eydUZWwnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJFbWFpbEFkZHJlc3NcIj57eydFbWFpbCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlVybFwiPnt7J1VybCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJyZW1vdmVGaWVsZChyLCBmKVwiIFtiaXpkb2NUb29sdGlwXT1cIidEaXNjYXJkJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8IS0tPGRpdiAqY2RrRHJhZ1BsYWNlaG9sZGVyIGNsYXNzPVwiZHJhZy1wbGFjZWhvbGRlclwiPjwvZGl2Pi0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImZpZWxkS2luZE1lbnVcIiBbYml6ZG9jVG9vbHRpcF09XCInQWRkJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmFkZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2ZpZWxkS2luZE1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWRkRmllbGQocywgciwgJ1N0cmluZycsICRldmVudClcIj57eydJbnB1dCd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhZGRGaWVsZChzLCByLCAnRGF0ZScsICRldmVudClcIj57eydEYXRlJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFkZEZpZWxkKHMsIHIsICdOdW1iZXInLCAkZXZlbnQpXCI+e3snTnVtZXJpYyd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhZGRGaWVsZChzLCByLCAnU2VsZWN0JywgJGV2ZW50KVwiPnt7J1NlbGVjdCd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhZGRGaWVsZChzLCByLCAnQ2hlY2tib3gnLCAkZXZlbnQpXCI+e3snQ2hlY2tib3gnfHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWRkRmllbGQocywgciwgJ1N3aXRjaCcsICRldmVudClcIj57eydTd2l0Y2gnfHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWRkRmllbGQocywgciwgJ1RleHQnLCAkZXZlbnQpXCI+e3snVGV4dCd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlUm93KHMsIHIpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0Rpc2NhcmQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwiYWRkUm93KHMsICRldmVudClcIiBbYml6ZG9jVG9vbHRpcF09XCInQWRkJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmFkZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJzZXR0aW5ncyA9ICFzZXR0aW5nc1wiIFtiaXpkb2NUb29sdGlwXT1cIidTZXR0aW5ncyd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5zZXR0aW5nczwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cInJlbW92ZVNlY3Rpb24ocylcIiBbYml6ZG9jVG9vbHRpcF09XCInRGlzY2FyZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiICpuZ0lmPVwic2V0dGluZ3NcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7J1ZhbHVlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGJpemRvYy1hY2UtaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIj48L2JpemRvYy1hY2UtaW5wdXQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQ+IHt7ICdFeHByZXNzaW9uJ3x0cmFuc2xhdGUgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zZWN0aW9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImFkZFNlY3Rpb24oJGV2ZW50KVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9hZG1pbi9mb3JtL2Rlc2lnbmVyL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vZm9ybS9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQy9GLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT2xELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDO0FBRTlCLE1BQU07SUFNTyxxQkFBcUIsU0FBckIscUJBQXFCO0lBbUJoQyxZQUNVLEdBQWdCLEVBQ2hCLEtBQW1CLEVBQ25CLEdBQXNCLEVBQ3RCLEdBQWtCLEVBQ2xCLFFBQXdCLEVBQ3hCLEdBQWUsRUFDZixJQUFpRztRQU5qRyxRQUFHLEdBQUgsR0FBRyxDQUFhO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBZTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFnQjtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBNkY7UUF6QjNHLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixVQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2IsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVOLFlB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c0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2RyYWctZHJvcFwiO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBCaXpEb2MgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IGNsZWFudXAgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHsgQ3ViZSwgRmllbGRUeXBlLCBUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbW9kZWxzXCI7XHJcbmltcG9ydCB7IFByb21wdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9wcm9tcHQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3Nlc3Npb24uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQYW5lUmVmIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvc2xvdHMvcGFuZS1yZWZcIjtcclxuaW1wb3J0IHsgVXRpbGl0eVJlZiB9IGZyb20gXCIuLi8uLi91dGlsaXR5LXJlZlwiO1xyXG5cclxuY29uc3QgTkFNRSA9IC9eW0EtWmEtel0rXFx3KiQvO1xyXG5cclxuLyoqICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnZGVzaWduZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydkZXNpZ25lci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbkBCaXpEb2MoeyBzZWxlY3RvcjogJ2JpemRvYy1mb3JtLWRlc2lnbmVyJyB9KVxyXG5leHBvcnQgY2xhc3MgRm9ybURlc2lnbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuICB0b29scyA9IHRydWU7XHJcbiAgc2F2aW5nID0gZmFsc2U7XHJcbiAgbW9kZWw6IEJveEZvcm1NZXRhZGF0YTtcclxuICByZWFkb25seSBoaXN0b3J5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGhpc3RvcnlJbmRleCA9IC0xO1xyXG4gIHJlYWRvbmx5IGRhdGF0eXBlczogVHlwZVtdO1xyXG4gIHJlYWRvbmx5IGN1YmVzOiBDdWJlW107XHJcbiAgcmVhZG9ubHkgZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgIHN1YmplY3Q6IG51bGwsXHJcbiAgICB2YWx1ZTogbnVsbCxcclxuICAgIHN1bW1hcnk6IG51bGwsXHJcbiAgICBzZWN0aW9uczogdGhpcy5fZmIuYXJyYXkoW10pXHJcbiAgfSk7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBkaXJ0eSA9IGZhbHNlO1xyXG4gIHNldHRpbmdzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZm9ybUlkOiBzdHJpbmc7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9wYW5lOiBQYW5lUmVmPGFueT4sXHJcbiAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9wczogUHJvbXB0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3Nlc3Npb246IFNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIF9yZWY6IFV0aWxpdHlSZWY8Ym9vbGVhbiwgeyBtZXRhZGF0YTogQm94Rm9ybU1ldGFkYXRhLCBmb3JtSWQ6IHN0cmluZyB9LCBCb3hGb3JtTWV0YWRhdGEsIHN0cmluZz4pIHtcclxuICAgIHRoaXMuZGF0YXR5cGVzID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLnR5cGVzO1xyXG4gICAgdGhpcy5jdWJlcyA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5jdWJlcztcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wYW5lLnF1ZXJ5UGFyYW1zQ2hhbmdlLnN1YnNjcmliZShwID0+IHtcclxuICAgICAgY29uc3QgeyBmb3JtSWQgfSA9IHA7XHJcbiAgICAgIGZvcm1JZCAmJiB0aGlzLl9vcGVuKGZvcm1JZCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZSgpLlxyXG4gICAgICBzdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgLy90aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubW9kZWwsIHYpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfb3Blbihmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcmVmLnBvcHVsYXRlKGZvcm1JZCkuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICB0aGlzLl9mb3JtSWQgPSBmb3JtSWQ7XHJcbiAgICAgIHRoaXMuX2Fzc2lnbihyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfYXNzaWduKG1vZGVsOiBCb3hGb3JtTWV0YWRhdGEpIHtcclxuICAgIHRoaXMubW9kZWwgPSBtb2RlbCB8fCB7IHNlY3Rpb25zOiBbXSB9O1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSAodGhpcy5mb3JtLmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXkpO1xyXG4gICAgc2VjdGlvbnMuY2xlYXIoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5tb2RlbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgbW9kZWwuc2VjdGlvbnM/LmZvckVhY2gocyA9PiBzZWN0aW9ucy5wdXNoKHRoaXMuX3NlY3Rpb25mb3JtKHMpLCB7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZWN0aW9uZm9ybShzZWN0aW9uOiBTZWN0aW9uTW9kZWwpIHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9mYi5jb250cm9sKHNlY3Rpb24ubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybihOQU1FKV0pO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgbmFtZSxcclxuICAgICAgdGl0bGU6IHNlY3Rpb24udGl0bGUsXHJcbiAgICAgIG11bHRpTGluZTogc2VjdGlvbi5tdWx0aUxpbmUgfHwgZmFsc2UsXHJcbiAgICAgIHZhbHVlOiBzZWN0aW9uLnZhbHVlIHx8IG51bGwsXHJcbiAgICAgIHJvd3M6IHRoaXMuX2ZiLmFycmF5KHNlY3Rpb24ucm93cz8ubWFwKHIgPT5cclxuICAgICAgICB0aGlzLl9yb3dmb3JtKHIpKSB8fCBbXSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIHByaXZhdGUgX3Jvd2Zvcm0ocm93OiBSb3dNb2RlbCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBmaWVsZHM6IHRoaXMuX2ZiLmFycmF5KHJvdy5maWVsZHMubWFwKGYgPT4gdGhpcy5fZmllbGRmb3JtKGYpKSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIHByaXZhdGUgX2ZpZWxkZm9ybShmaWVsZDogRmllbGRNb2RlbCk6IGFueSB7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZmIuY29udHJvbChmaWVsZC5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKE5BTUUpXSksXHJcbiAgICAgIGxhYmVsID0gdGhpcy5fZmIuY29udHJvbChmaWVsZC5sYWJlbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBsYWJlbCxcclxuICAgICAga2luZDogZmllbGQua2luZCxcclxuICAgICAgZGF0YVR5cGU6IGZpZWxkLmRhdGFUeXBlLFxyXG4gICAgICByZXF1aXJlZDogZmllbGQucmVxdWlyZWRcclxuICAgIH0pXHJcbiAgfVxyXG4gIGFkZFNlY3Rpb24oZXZ0PzogRXZlbnQpIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgbGV0IG4gPSAwLCBuYW1lLCB0aXRsZTtcclxuICAgIGRvIHtcclxuICAgICAgbisrO1xyXG4gICAgICBuYW1lID0gJ3NlY3Rpb24nICsgJ18nICsgbjtcclxuICAgICAgdGl0bGUgPSAnU2VjdGlvbicgKyAnICcgKyBuO1xyXG4gICAgfSB3aGlsZSAodGhpcy5tb2RlbC5zZWN0aW9ucy5maW5kKHMgPT4gcy5uYW1lID09PSBuYW1lIHx8IHMudGl0bGUgPT09IHRpdGxlKSk7XHJcbiAgICAodGhpcy5mb3JtLmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXkpLnB1c2godGhpcy5fc2VjdGlvbmZvcm0oe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgcm93czogW3sgZmllbGRzOiBbXSB9XVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzZWN0aW9uOmxhc3QtY2hpbGQgYnV0dG9uJyk/LmZvY3VzKClcclxuICB9XHJcbiAgYWRkUm93KHNlY3Rpb246IEZvcm1Hcm91cCwgZXZ0PzogRXZlbnQpIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgKHNlY3Rpb24uZ2V0KCdyb3dzJykgYXMgRm9ybUFycmF5KS5wdXNoKHRoaXMuX3Jvd2Zvcm0oe1xyXG4gICAgICBmaWVsZHM6IFtdXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYHNlY3Rpb25bZGF0YS1pbmRleD0nJHsodGhpcy5mb3JtLmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmluZGV4T2Yoc2VjdGlvbil9J10gLmRlc2lnbmVyLXJvdzpsYXN0LWNoaWxkIGJ1dHRvbmApPy5mb2N1cygpXHJcbiAgfVxyXG4gIGFkZEZpZWxkKHNlY3Rpb246IEZvcm1Hcm91cCwgcm93OiBGb3JtR3JvdXAsIGtpbmQ6IEZpZWxkVHlwZSwgZXZ0PzogRXZlbnQpIHtcclxuICAgIGxldCBuID0gMCwgbmFtZSwgbGFiZWw7XHJcbiAgICBkbyB7XHJcbiAgICAgIG4rKztcclxuICAgICAgbmFtZSA9ICdmaWVsZCcgKyAnXycgKyBuO1xyXG4gICAgICBsYWJlbCA9ICdGaWVsZCcgKyAnICcgKyBuO1xyXG4gICAgfSB3aGlsZSAoKHNlY3Rpb24uZ2V0KCdyb3dzJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5cclxuICAgICAgZmluZChyID0+IChyLmdldCgnZmllbGRzJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5maW5kKGYgPT4gZi52YWx1ZS5uYW1lID09PSBuYW1lIHx8IGYudmFsdWUubGFiZWwgPT09IGxhYmVsKSAhPSBudWxsKSk7XHJcbiAgICB0aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgIChyb3cuZ2V0KCdmaWVsZHMnKSBhcyBGb3JtQXJyYXkpLnB1c2godGhpcy5fZmllbGRmb3JtKHtcclxuICAgICAga2luZCxcclxuICAgICAgbmFtZSxcclxuICAgICAgbGFiZWwsXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgcSA9IGBzZWN0aW9uW2RhdGEtaW5kZXg9JyR7KHRoaXMuZm9ybS5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5pbmRleE9mKHNlY3Rpb24pfSddIC5kZXNpZ25lci1yb3dbZGF0YS1pbmRleD0nJHsoc2VjdGlvbi5nZXQoJ3Jvd3MnKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmluZGV4T2Yocm93KX0nXSAuZGVzaWduZXItZmllbGQ6bGFzdC1jaGlsZCBpbnB1dGA7XHJcbiAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihxKT8uZm9jdXMoKVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmVtb3ZlRmllbGQocm93OiBGb3JtR3JvdXAsIGZpZWxkOiBGb3JtR3JvdXApIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgKHJvdy5nZXQoJ2ZpZWxkcycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMucmVtb3ZlKGZpZWxkKTtcclxuICB9XHJcbiAgcmVtb3ZlU2VjdGlvbihzZWN0aW9uOiBGb3JtR3JvdXApIHtcclxuICAgIHRoaXMuX25vdGlmeUNoYW5nZSgpO1xyXG4gICAgKHRoaXMuZm9ybS5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5KS5jb250cm9scy5yZW1vdmUoc2VjdGlvbik7XHJcbiAgfVxyXG4gIHJlbW92ZVJvdyhzZWN0aW9uOiBGb3JtR3JvdXAsIHJvdzogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgIChzZWN0aW9uLmdldCgncm93cycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMucmVtb3ZlKHJvdyk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX25vdGlmeUNoYW5nZSgpIHtcclxuICAgIHRoaXMuaGlzdG9yeS5wdXNoKEpTT04uc3RyaW5naWZ5KHRoaXMubW9kZWwpKTtcclxuICAgIHRoaXMuaGlzdG9yeUluZGV4ID0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDE7XHJcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcmVzdG9yZSgpIHtcclxuICAgIHRoaXMuX2Fzc2lnbihKU09OLnBhcnNlKHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleF0pKTtcclxuICB9XHJcbiAgdW5kbygpIHtcclxuICAgIHRoaXMuX3Jlc3RvcmUoKTtcclxuICAgIHRoaXMuaGlzdG9yeUluZGV4LS07XHJcbiAgfVxyXG4gIHJlZG8oKSB7XHJcbiAgICB0aGlzLl9yZXN0b3JlKCk7XHJcbiAgICB0aGlzLmhpc3RvcnlJbmRleCsrO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDdHJsLXMgc2F2ZTsgQ3RybC16IHVuZG9cclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuY3RybEtleSkge1xyXG4gICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDgzIHx8IGV2ZW50LndoaWNoID09PSAxMTUpIHtcclxuICAgICAgICB0aGlzLmRpcnR5ICYmIHRoaXMuc2F2ZSgpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8Rm9ybUdyb3VwPiwgY29sbGVjdGlvbjogRm9ybUFycmF5KSB7XHJcbiAgICB0aGlzLl9ub3RpZnlDaGFuZ2UoKTtcclxuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2xsZWN0aW9uLmF0KGV2ZW50LnByZXZpb3VzSW5kZXgpO1xyXG4gICAgICBjb2xsZWN0aW9uLnJlbW92ZUF0KGV2ZW50LnByZXZpb3VzSW5kZXgpO1xyXG4gICAgICBjb2xsZWN0aW9uLmluc2VydChldmVudC5jdXJyZW50SW5kZXgsIGVsZW1lbnQpO1xyXG4gICAgICAvL21vdmVJdGVtSW5BcnJheShldmVudC5jb250YWluZXIuZGF0YSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vICB0cmFuc2ZlckFycmF5SXRlbShcclxuICAgICAgLy8gICAgZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YSxcclxuICAgICAgLy8gICAgZXZlbnQuY29udGFpbmVyLmRhdGEsXHJcbiAgICAgIC8vICAgIGV2ZW50LnByZXZpb3VzSW5kZXgsXHJcbiAgICAgIC8vICAgIGV2ZW50LmN1cnJlbnRJbmRleCxcclxuICAgICAgLy8gICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNhdmUoKSB7XHJcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XHJcbiAgICB0aGlzLl9yZWYuZXhlY3V0ZSh7IG1ldGFkYXRhOiBjbGVhbnVwKHRoaXMubW9kZWwpLCBmb3JtSWQ6IHRoaXMuX2Zvcm1JZCB9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9wcy50b2FzdCgnQ2hhbmdlc1NhdmVkJyk7XHJcbiAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5mb3Jtcy5maW5kKGYgPT4gZi5uYW1lID09IHRoaXMuX2Zvcm1JZCk7XHJcbiAgICAgIGlmIChmb3JtKSBmb3JtLm9wdGlvbnMgPSB0aGlzLm1vZGVsO1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLl9wcy5lcnJvcigpO1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQm94Rm9ybU1ldGFkYXRhIHtcclxuICBzZWN0aW9uczogU2VjdGlvbk1vZGVsW107XHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbiAgc3ViamVjdD86IHN0cmluZztcclxuICBzdW1tYXJ5Pzogc3RyaW5nO1xyXG4gIGN1YmU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBTZWN0aW9uTW9kZWwge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHZhbHVlPzogc3RyaW5nO1xyXG4gIG11bHRpTGluZT86IGJvb2xlYW47XHJcbiAgcm93czogUm93TW9kZWxbXTtcclxufVxyXG5pbnRlcmZhY2UgUm93TW9kZWwge1xyXG4gIGZpZWxkczogRmllbGRNb2RlbFtdO1xyXG59XHJcbmludGVyZmFjZSBGaWVsZE1vZGVsIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBraW5kOiBGaWVsZFR5cGU7XHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIGRhdGFUeXBlPzogc3RyaW5nO1xyXG4gIG1pbj86IGFueTtcclxuICBtYXg/OiBhbnk7XHJcbn1cclxuIiwiPG1hdC10b29sYmFyPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiIWRpcnR5IHx8IGxvYWRpbmcgfHwgc2F2aW5nXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1NhdmUnfHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj5zYXZlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidW5kbygpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1VuZG8nIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cImhpc3RvcnlJbmRleCA9PT0gLTFcIj48bWF0LWljb24+dW5kbzwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlZG8oKVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZWRvJyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJoaXN0b3J5SW5kZXggPT09IGhpc3RvcnkubGVuZ3RoIC0gMVwiPjxtYXQtaWNvbj5yZWRvPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuPC9tYXQtdG9vbGJhcj5cclxuPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNldHRpbmdzID0gIXNldHRpbmdzXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1NldHRpbmdzJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKm5nSWY9XCJtb2RlbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiAqbmdJZj1cInNldHRpbmdzXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVmFsdWUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxiaXpkb2MtYWNlLWlucHV0IGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+PC9iaXpkb2MtYWNlLWlucHV0PlxyXG4gICAgICA8bWF0LWhpbnQ+IHt7ICdFeHByZXNzaW9uJ3x0cmFuc2xhdGUgfX08L21hdC1oaW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydTdWJqZWN0J3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8Yml6ZG9jLWFjZS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzdWJqZWN0XCI+PC9iaXpkb2MtYWNlLWlucHV0PlxyXG4gICAgICA8bWF0LWhpbnQ+IHt7ICdFeHByZXNzaW9uJ3x0cmFuc2xhdGUgfX08L21hdC1oaW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydTdW1tYXJ5J3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8Yml6ZG9jLWFjZS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzdW1tYXJ5XCI+PC9iaXpkb2MtYWNlLWlucHV0PlxyXG4gICAgICA8bWF0LWhpbnQ+IHt7ICdFeHByZXNzaW9uJ3x0cmFuc2xhdGUgfX08L21hdC1oaW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIGZvcm0uZ2V0KCdzZWN0aW9ucycpKVwiPlxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJjb2x1bW5cIiAqbmdGb3I9XCJsZXQgcyBvZiBmb3JtLmdldCgnc2VjdGlvbnMnKS5jb250cm9sczsgbGV0IHNpID0gaW5kZXhcIiBjZGtEcmFnIFthdHRyLmRhdGEtaW5kZXhdPVwic2lcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNlY3Rpb24tZHJhZ1wiIGNka0RyYWdIYW5kbGU+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiBbZm9ybUdyb3VwXT1cInNcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eydUaXRsZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3snTmFtZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicy5nZXQoJ25hbWUnKS5oYXNFcnJvcigncGF0dGVybicpXCIgW2lubmVySFRNTF09XCInUHJvZ3JhbVBhdHRlcm5FcnInfHRyYW5zbGF0ZVwiPjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicy5nZXQoJ25hbWUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6J0ZpZWxkJ1wiPjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgcy5nZXQoJ3Jvd3MnKSlcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgciBvZiBzLmdldCgncm93cycpLmNvbnRyb2xzOyBsZXQgcmkgPSBpbmRleFwiIGNsYXNzPVwicm93IGRlc2lnbmVyLXJvd1wiIGNka0RyYWcgW2F0dHIuZGF0YS1pbmRleF09XCJyaVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8ZGl2IGNka0Ryb3BMaXN0IGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgci5nZXQoJ2ZpZWxkcycpKVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmIG9mIHIuZ2V0KCdmaWVsZHMnKS5jb250cm9sczsgbGV0IGZpID0gaW5kZXhcIiBjZGtEcmFnIGNsYXNzPVwiZGVzaWduZXItZmllbGQgcm93XCIgW2F0dHIuZGF0YS1pbmRleF09XCJmaVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2RrRHJhZ0hhbmRsZT5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiBbZm9ybUdyb3VwXT1cImZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7J05hbWUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZi5nZXQoJ25hbWUnKS5oYXNFcnJvcigncGF0dGVybicpXCIgW2lubmVySFRNTF09XCInUHJvZ3JhbVBhdHRlcm5FcnInfHRyYW5zbGF0ZVwiPjwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImYuZ2V0KCduYW1lJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOidGaWVsZCdcIj48L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3snTGFiZWwnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImYuZ2V0KCdsYWJlbCcpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTonTGFiZWwnXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cInJlcXVpcmVkXCI+e3snTWFuZGF0b3J5J3x0cmFuc2xhdGV9fTwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImYuZ2V0KCdraW5kJykudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidEYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInVGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ051bWJlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiJ1NlbGVjdCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eydEYXRhVHlwZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YVR5cGVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdCBvZiBkYXRhdHlwZXNcIiBbdmFsdWVdPVwidC5uYW1lXCI+e3t0LnRpdGxlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInMuZ2V0KCdkYXRhVHlwZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTonRGF0YVR5cGUnXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eydUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImtpbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RyaW5nXCI+e3snVGV4dCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBob25lTnVtYmVyXCI+e3snVGVsJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiRW1haWxBZGRyZXNzXCI+e3snRW1haWwnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJVcmxcIj57eydVcmwnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlRmllbGQociwgZilcIiBbYml6ZG9jVG9vbHRpcF09XCInRGlzY2FyZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPCEtLTxkaXYgKmNka0RyYWdQbGFjZWhvbGRlciBjbGFzcz1cImRyYWctcGxhY2Vob2xkZXJcIj48L2Rpdj4tLT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJmaWVsZEtpbmRNZW51XCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1tZW51ICNmaWVsZEtpbmRNZW51PlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFkZEZpZWxkKHMsIHIsICdTdHJpbmcnLCAkZXZlbnQpXCI+e3snSW5wdXQnfHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWRkRmllbGQocywgciwgJ0RhdGUnLCAkZXZlbnQpXCI+e3snRGF0ZSd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhZGRGaWVsZChzLCByLCAnTnVtYmVyJywgJGV2ZW50KVwiPnt7J051bWVyaWMnfHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWRkRmllbGQocywgciwgJ1NlbGVjdCcsICRldmVudClcIj57eydTZWxlY3QnfHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWRkRmllbGQocywgciwgJ0NoZWNrYm94JywgJGV2ZW50KVwiPnt7J0NoZWNrYm94J3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFkZEZpZWxkKHMsIHIsICdTd2l0Y2gnLCAkZXZlbnQpXCI+e3snU3dpdGNoJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFkZEZpZWxkKHMsIHIsICdUZXh0JywgJGV2ZW50KVwiPnt7J1RleHQnfHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cInJlbW92ZVJvdyhzLCByKVwiIFtiaXpkb2NUb29sdGlwXT1cIidEaXNjYXJkJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImFkZFJvdyhzLCAkZXZlbnQpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwic2V0dGluZ3MgPSAhc2V0dGluZ3NcIiBbYml6ZG9jVG9vbHRpcF09XCInU2V0dGluZ3MnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+c2V0dGluZ3M8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJyZW1vdmVTZWN0aW9uKHMpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0Rpc2NhcmQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIiAqbmdJZj1cInNldHRpbmdzXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57eydWYWx1ZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxiaXpkb2MtYWNlLWlucHV0IGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+PC9iaXpkb2MtYWNlLWlucHV0PlxyXG4gICAgICAgICAgPG1hdC1oaW50PiB7eyAnRXhwcmVzc2lvbid8dHJhbnNsYXRlIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc2VjdGlvbj5cclxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJhZGRTZWN0aW9uKCRldmVudClcIiBbYml6ZG9jVG9vbHRpcF09XCInQWRkJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmFkZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19