ngx-iso-form 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -129,7 +129,7 @@ Please declare all your translation rules under 'iso' object.
129
129
  "GrpHdr":{
130
130
  "label": "Group Header"
131
131
  },
132
- "document_bktocstmrstmt_grphdr_credttm": {
132
+ "Document_BkToCstmrStmt_GrpHdr_CreDtTm": {
133
133
  "label": "Create Datetime",
134
134
  "general":{
135
135
  "format":"YYYY-MM-DDThh:mm:ss.sss+/-"
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWlzby1mb3JtL3NyYy9saWIvTW9kZWxzL1NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYUVsZW1lbnQge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGRhdGFUeXBlOiBzdHJpbmc7XHJcbiAgICBtaW5PY2N1cnM6IHN0cmluZztcclxuICAgIG1heE9jY3Vyczogc3RyaW5nO1xyXG4gICAgbWluTGVuZ3RoOiBzdHJpbmc7XHJcbiAgICBtYXhMZW5ndGg6IHN0cmluZztcclxuICAgIHBhdHRlcm46IHN0cmluZztcclxuICAgIGZyYWN0aW9uRGlnaXRzOiBzdHJpbmc7XHJcbiAgICB0b3RhbERpZ2l0czogc3RyaW5nO1xyXG4gICAgbWluSW5jbHVzaXZlOiBzdHJpbmc7XHJcbiAgICBtYXhJbmNsdXNpdmU6IHN0cmluZztcclxuICAgIHZhbHVlczogc3RyaW5nW107XHJcbiAgICBpc0N1cnJlbmN5OiBib29sZWFuO1xyXG4gICAgeHBhdGg6IHN0cmluZztcclxuICAgIGVsZW1lbnRzOiBTY2hlbWFFbGVtZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hTW9kZWwgZXh0ZW5kcyBTY2hlbWFFbGVtZW50e1xyXG4gICAgdW5pcXVlSWQ/OnN0cmluZztcclxuICAgIGhpZGRlbj86IGJvb2xlYW47XHJcbiAgICB2YWx1ZT86c3RyaW5nO1xyXG4gICAgbXVsdGk/OnN0cmluZztcclxuICAgIGlzRm9ybUNvbnRyb2xzPzpib29sZWFuO1xyXG4gICAgY2hpbGRyZW4/OiBTY2hlbWFNb2RlbFtdO1xyXG4gICAgY2hvaWNlRm9ybUNvbnRyb2w/OiBBYnN0cmFjdENvbnRyb2w8YW55LGFueT47XHJcbn0iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWlzby1mb3JtL3NyYy9saWIvTW9kZWxzL1NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYUVsZW1lbnQge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGRhdGFUeXBlOiBzdHJpbmc7XHJcbiAgICBtaW5PY2N1cnM6IHN0cmluZztcclxuICAgIG1heE9jY3Vyczogc3RyaW5nO1xyXG4gICAgbWluTGVuZ3RoOiBzdHJpbmc7XHJcbiAgICBtYXhMZW5ndGg6IHN0cmluZztcclxuICAgIHBhdHRlcm46IHN0cmluZztcclxuICAgIGZyYWN0aW9uRGlnaXRzOiBzdHJpbmc7XHJcbiAgICB0b3RhbERpZ2l0czogc3RyaW5nO1xyXG4gICAgbWluSW5jbHVzaXZlOiBzdHJpbmc7XHJcbiAgICBtYXhJbmNsdXNpdmU6IHN0cmluZztcclxuICAgIHZhbHVlczogc3RyaW5nW107XHJcbiAgICBpc0N1cnJlbmN5OiBib29sZWFuO1xyXG4gICAgeHBhdGg6IHN0cmluZztcclxuICAgIGVsZW1lbnRzOiBTY2hlbWFFbGVtZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hTW9kZWwgZXh0ZW5kcyBTY2hlbWFFbGVtZW50e1xyXG4gICAgdW5pcXVlSWQ/OnN0cmluZztcclxuICAgIGhpZGRlbj86IGJvb2xlYW47XHJcbiAgICB2YWx1ZT86c3RyaW5nO1xyXG4gICAgbXVsdGk/OnN0cmluZztcclxuICAgIGlzRm9ybUNvbnRyb2xzPzpib29sZWFuO1xyXG4gICAgY2hpbGRyZW4/OiBTY2hlbWFNb2RlbFtdO1xyXG4gICAgY2hvaWNlS2V5Pzogc3RyaW5nO1xyXG59Il19
@@ -36,7 +36,9 @@ export class NgxIsoFormComponent {
36
36
  this.service._formModel = [this.structuredClone(this.schema)];
37
37
  this.service._formModel[0].elements = [];
38
38
  let group = {};
39
- group[this.schema.id] = this.service.getFormGroupControls(this.schema.elements, this.service._formModel[0].elements);
39
+ const schemaElements = this.schema.elements.length > 0 ? this.structuredClone(this.schema.elements) : this.schema.elements;
40
+ const formElements = this.service._formModel[0].elements.length > 0 ? this.structuredClone(this.service._formModel[0].elements) : this.service._formModel[0].elements;
41
+ group[this.schema.id] = this.service.getFormGroupControls(schemaElements, formElements);
40
42
  this._form = new FormGroup(group);
41
43
  if (!this._isFormInitiate) {
42
44
  this.initiateFormModel();
@@ -48,7 +50,6 @@ export class NgxIsoFormComponent {
48
50
  cloneData = structuredClone(data);
49
51
  }
50
52
  catch (e) {
51
- debugger;
52
53
  cloneData = JSON.parse(JSON.stringify(data));
53
54
  }
54
55
  return cloneData;
@@ -165,15 +166,19 @@ export class NgxIsoFormComponent {
165
166
  return formControl;
166
167
  }
167
168
  getFormControl(node) {
168
- debugger;
169
169
  return this.service.getFormControl('');
170
170
  }
171
+ getChoiceFormControl(choiceKey) {
172
+ const formControl = this.service.getFormControl('');
173
+ formControl.setValue(choiceKey);
174
+ return formControl;
175
+ }
171
176
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: NgxIsoFormComponent, deps: [{ token: i1.NgxIsoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
172
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: NgxIsoFormComponent, selector: "ngx-iso-form", inputs: { form: "form", schema: "schema" }, usesOnChanges: true, ngImport: i0, template: "<form *ngIf=\"_form && schema\" [formGroup]=\"_form\">\r\n <div class=\"form-group\">\r\n <ng-template #nodeTemplateRef let-node=\"node\" let-formElement=\"formElement\" let-index=\"index\"\r\n let-parentNode=\"parentNode\" let-parentFormElement=\"parentFormElement\">\r\n <ng-container *ngIf=\"node.multi then arr else obj\"></ng-container>\r\n <ng-template #arr>\r\n <ng-template *ngFor=\"let model of node.elements;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: formElement,\r\n parentFormElement: parentFormElement,\r\n parentNode: node,\r\n index: i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #obj>\r\n <ng-container *ngIf=\"node.elements.length\">\r\n <mat-accordion [formGroup]=\"formElement\" *ngIf=\"!node.hidden\">\r\n <mat-expansion-panel multi [expanded]=\"expand(node.minOccurs)\" #expan>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ node.name | trans: node.id : node.name }}\r\n </mat-panel-title>\r\n <mat-panel-description *ngIf=\"maxOccurs(node.maxOccurs)\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addSection($event, node,parentNode, parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeSection($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <ng-container *ngIf=\"expan.expanded\">\r\n <mat-form-field *ngIf=\"node.dataType === 'choice'\">\r\n <mat-label>{{ node.name | trans: node.id : node.name }}</mat-label>\r\n <mat-select (selectionChange)=\"onChoiceSelectionChange($event.value,formElement, node)\" [formControl]=\"node.choiceFormControl\">\r\n <mat-option *ngFor=\"let item of node.elements\" [value]=\"item.id\">\r\n {{item.name}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <ng-container *ngIf=\"!isEmpty(formElement)\">\r\n <ng-template *ngFor=\"let model of node.elements; let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(formElement,model),\r\n parentFormElement: formElement\r\n }\">\r\n </ng-template>\r\n </ng-container>\r\n <div *ngIf=\"node.elements.length === 0\">\r\n <ngx-iso-control *ngIf=\"!node.hidden\" [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </div>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <ng-container *ngIf=\"!node.elements.length && !node.hidden\">\r\n <div *ngIf=\"maxOccurs(node.maxOccurs)\" class=\"form-add-section\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addNewControl($event, node,parentNode,parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeNewControl($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </div>\r\n <ngx-iso-control [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngFor=\"let model of getFormModel; let i = index\">\r\n <ng-container *ngIf=\"isArray(model);then formArray else formObject\">\r\n </ng-container>\r\n <ng-template #formArray>\r\n <ng-template *ngFor=\"let key of model;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: key,\r\n formElement: getElement(_form,key),\r\n parentFormElement: _form,\r\n index:i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #formObject>\r\n <ng-template [ngTemplateOutlet]=\"nodeTemplateRef\" [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(_form,model),\r\n parentFormElement: _form,\r\n index: i,\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host .mat-expansion-panel-header-description{justify-content:space-between;align-items:center}:host .mat-expansion-panel{width:100%;margin:5px 0}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i4.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i4.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i4.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i4.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.NgxIsoControlComponent, selector: "ngx-iso-control", inputs: ["formControl", "control"] }, { kind: "pipe", type: i11.IsoTranslatePipe, name: "trans" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
177
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.2", type: NgxIsoFormComponent, selector: "ngx-iso-form", inputs: { form: "form", schema: "schema" }, usesOnChanges: true, ngImport: i0, template: "<form *ngIf=\"_form && schema\" [formGroup]=\"_form\">\r\n <div class=\"form-group\">\r\n <ng-template #nodeTemplateRef let-node=\"node\" let-formElement=\"formElement\" let-index=\"index\"\r\n let-parentNode=\"parentNode\" let-parentFormElement=\"parentFormElement\">\r\n <ng-container *ngIf=\"node.multi then arr else obj\"></ng-container>\r\n <ng-template #arr>\r\n <ng-template *ngFor=\"let model of node.elements;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: formElement,\r\n parentFormElement: parentFormElement,\r\n parentNode: node,\r\n index: i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #obj>\r\n <ng-container *ngIf=\"node.elements.length\">\r\n <mat-accordion [formGroup]=\"formElement\" *ngIf=\"!node.hidden\">\r\n <mat-expansion-panel multi [expanded]=\"expand(node.minOccurs)\" #expan>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ node.name | trans: node.id : node.name }}\r\n </mat-panel-title>\r\n <mat-panel-description *ngIf=\"maxOccurs(node.maxOccurs)\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addSection($event, node,parentNode, parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeSection($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <ng-container *ngIf=\"expan.expanded\">\r\n <mat-form-field *ngIf=\"node.dataType === 'choice'\">\r\n <mat-label>{{ node.name | trans: node.id : node.name }}</mat-label>\r\n <mat-select (selectionChange)=\"onChoiceSelectionChange($event.value,formElement, node)\" [formControl]=\"getChoiceFormControl(node.choiceKey)\">\r\n <mat-option *ngFor=\"let item of node.elements\" [value]=\"item.id\">\r\n {{item.name}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <ng-container *ngIf=\"!isEmpty(formElement)\">\r\n <ng-template *ngFor=\"let model of node.elements; let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(formElement,model),\r\n parentFormElement: formElement\r\n }\">\r\n </ng-template>\r\n </ng-container>\r\n <div *ngIf=\"node.elements.length === 0\">\r\n <ngx-iso-control *ngIf=\"!node.hidden\" [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </div>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <ng-container *ngIf=\"!node.elements.length && !node.hidden\">\r\n <div *ngIf=\"maxOccurs(node.maxOccurs)\" class=\"form-add-section\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addNewControl($event, node,parentNode,parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeNewControl($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </div>\r\n <ngx-iso-control [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngFor=\"let model of getFormModel; let i = index\">\r\n <ng-container *ngIf=\"isArray(model);then formArray else formObject\">\r\n </ng-container>\r\n <ng-template #formArray>\r\n <ng-template *ngFor=\"let key of model;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: key,\r\n formElement: getElement(_form,key),\r\n parentFormElement: _form,\r\n index:i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #formObject>\r\n <ng-template [ngTemplateOutlet]=\"nodeTemplateRef\" [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(_form,model),\r\n parentFormElement: _form,\r\n index: i,\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host .mat-expansion-panel-header-description{justify-content:space-between;align-items:center}:host .mat-expansion-panel{width:100%;margin:5px 0}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i4.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i4.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i4.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i4.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.NgxIsoControlComponent, selector: "ngx-iso-control", inputs: ["formControl", "control"] }, { kind: "pipe", type: i11.IsoTranslatePipe, name: "trans" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
173
178
  }
174
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: NgxIsoFormComponent, decorators: [{
175
180
  type: Component,
176
- args: [{ selector: 'ngx-iso-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form *ngIf=\"_form && schema\" [formGroup]=\"_form\">\r\n <div class=\"form-group\">\r\n <ng-template #nodeTemplateRef let-node=\"node\" let-formElement=\"formElement\" let-index=\"index\"\r\n let-parentNode=\"parentNode\" let-parentFormElement=\"parentFormElement\">\r\n <ng-container *ngIf=\"node.multi then arr else obj\"></ng-container>\r\n <ng-template #arr>\r\n <ng-template *ngFor=\"let model of node.elements;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: formElement,\r\n parentFormElement: parentFormElement,\r\n parentNode: node,\r\n index: i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #obj>\r\n <ng-container *ngIf=\"node.elements.length\">\r\n <mat-accordion [formGroup]=\"formElement\" *ngIf=\"!node.hidden\">\r\n <mat-expansion-panel multi [expanded]=\"expand(node.minOccurs)\" #expan>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ node.name | trans: node.id : node.name }}\r\n </mat-panel-title>\r\n <mat-panel-description *ngIf=\"maxOccurs(node.maxOccurs)\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addSection($event, node,parentNode, parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeSection($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <ng-container *ngIf=\"expan.expanded\">\r\n <mat-form-field *ngIf=\"node.dataType === 'choice'\">\r\n <mat-label>{{ node.name | trans: node.id : node.name }}</mat-label>\r\n <mat-select (selectionChange)=\"onChoiceSelectionChange($event.value,formElement, node)\" [formControl]=\"node.choiceFormControl\">\r\n <mat-option *ngFor=\"let item of node.elements\" [value]=\"item.id\">\r\n {{item.name}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <ng-container *ngIf=\"!isEmpty(formElement)\">\r\n <ng-template *ngFor=\"let model of node.elements; let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(formElement,model),\r\n parentFormElement: formElement\r\n }\">\r\n </ng-template>\r\n </ng-container>\r\n <div *ngIf=\"node.elements.length === 0\">\r\n <ngx-iso-control *ngIf=\"!node.hidden\" [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </div>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <ng-container *ngIf=\"!node.elements.length && !node.hidden\">\r\n <div *ngIf=\"maxOccurs(node.maxOccurs)\" class=\"form-add-section\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addNewControl($event, node,parentNode,parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeNewControl($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </div>\r\n <ngx-iso-control [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngFor=\"let model of getFormModel; let i = index\">\r\n <ng-container *ngIf=\"isArray(model);then formArray else formObject\">\r\n </ng-container>\r\n <ng-template #formArray>\r\n <ng-template *ngFor=\"let key of model;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: key,\r\n formElement: getElement(_form,key),\r\n parentFormElement: _form,\r\n index:i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #formObject>\r\n <ng-template [ngTemplateOutlet]=\"nodeTemplateRef\" [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(_form,model),\r\n parentFormElement: _form,\r\n index: i,\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host .mat-expansion-panel-header-description{justify-content:space-between;align-items:center}:host .mat-expansion-panel{width:100%;margin:5px 0}\n"] }]
181
+ args: [{ selector: 'ngx-iso-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form *ngIf=\"_form && schema\" [formGroup]=\"_form\">\r\n <div class=\"form-group\">\r\n <ng-template #nodeTemplateRef let-node=\"node\" let-formElement=\"formElement\" let-index=\"index\"\r\n let-parentNode=\"parentNode\" let-parentFormElement=\"parentFormElement\">\r\n <ng-container *ngIf=\"node.multi then arr else obj\"></ng-container>\r\n <ng-template #arr>\r\n <ng-template *ngFor=\"let model of node.elements;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: formElement,\r\n parentFormElement: parentFormElement,\r\n parentNode: node,\r\n index: i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #obj>\r\n <ng-container *ngIf=\"node.elements.length\">\r\n <mat-accordion [formGroup]=\"formElement\" *ngIf=\"!node.hidden\">\r\n <mat-expansion-panel multi [expanded]=\"expand(node.minOccurs)\" #expan>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ node.name | trans: node.id : node.name }}\r\n </mat-panel-title>\r\n <mat-panel-description *ngIf=\"maxOccurs(node.maxOccurs)\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addSection($event, node,parentNode, parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeSection($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <ng-container *ngIf=\"expan.expanded\">\r\n <mat-form-field *ngIf=\"node.dataType === 'choice'\">\r\n <mat-label>{{ node.name | trans: node.id : node.name }}</mat-label>\r\n <mat-select (selectionChange)=\"onChoiceSelectionChange($event.value,formElement, node)\" [formControl]=\"getChoiceFormControl(node.choiceKey)\">\r\n <mat-option *ngFor=\"let item of node.elements\" [value]=\"item.id\">\r\n {{item.name}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <ng-container *ngIf=\"!isEmpty(formElement)\">\r\n <ng-template *ngFor=\"let model of node.elements; let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(formElement,model),\r\n parentFormElement: formElement\r\n }\">\r\n </ng-template>\r\n </ng-container>\r\n <div *ngIf=\"node.elements.length === 0\">\r\n <ngx-iso-control *ngIf=\"!node.hidden\" [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </div>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <ng-container *ngIf=\"!node.elements.length && !node.hidden\">\r\n <div *ngIf=\"maxOccurs(node.maxOccurs)\" class=\"form-add-section\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addNewControl($event, node,parentNode,parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeNewControl($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </div>\r\n <ngx-iso-control [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngFor=\"let model of getFormModel; let i = index\">\r\n <ng-container *ngIf=\"isArray(model);then formArray else formObject\">\r\n </ng-container>\r\n <ng-template #formArray>\r\n <ng-template *ngFor=\"let key of model;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: key,\r\n formElement: getElement(_form,key),\r\n parentFormElement: _form,\r\n index:i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #formObject>\r\n <ng-template [ngTemplateOutlet]=\"nodeTemplateRef\" [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(_form,model),\r\n parentFormElement: _form,\r\n index: i,\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host .mat-expansion-panel-header-description{justify-content:space-between;align-items:center}:host .mat-expansion-panel{width:100%;margin:5px 0}\n"] }]
177
182
  }], ctorParameters: function () { return [{ type: i1.NgxIsoService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { form: [{
178
183
  type: Input,
179
184
  args: [{ required: true }]
@@ -181,4 +186,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImpor
181
186
  type: Input,
182
187
  args: [{ required: true }]
183
188
  }] } });
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlzby1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pc28tZm9ybS9zcmMvbGliL25neC1pc28tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaXNvLWZvcm0vc3JjL2xpYi9uZ3gtaXNvLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsS0FBSyxFQUdOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFFVixNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBWXhCLE1BQU0sT0FBTyxtQkFBbUI7SUFPOUIsWUFBb0IsT0FBc0IsRUFBVSxlQUFrQztRQUFsRSxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQW1CO0lBQ3RGLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksRUFBRTtZQUN2RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFO1lBQ25ELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFjLFlBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUN6QyxJQUFJLEtBQUssR0FBUSxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFTO1FBQy9CLElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSTtZQUNGLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkM7UUFBQyxPQUFNLENBQUMsRUFBRTtZQUNULFFBQVEsQ0FBQTtZQUNSLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLEVBQUU7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN6QixDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RDtJQUNILENBQUM7SUFFUyx1QkFBdUIsQ0FBQyxFQUFVLEVBQUUsV0FBZ0IsRUFBRSxLQUFrQjtRQUNoRixLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQW9CLEVBQUUsRUFBRTtZQUM5QyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUN0QixXQUFXLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNyQixPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtvQkFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQy9FLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDM0M7cUJBQU07b0JBQ0wsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2hELFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDN0M7YUFFRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLFNBQVMsQ0FBQyxTQUFpQjtRQUNuQyxPQUFPLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRVMsTUFBTSxDQUFDLFNBQWlCO1FBQ2hDLE9BQU8sU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFUyxVQUFVLENBQUMsTUFBYSxFQUFFLElBQWlCLEVBQUUsVUFBdUIsRUFBRSxhQUF3QjtRQUN0RyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQWMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFjLENBQUM7UUFDbkUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2hGLE9BQU87U0FDUjtRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFRLEVBQUUsQ0FBQztRQUN4QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xILFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRVMsYUFBYSxDQUFDLE1BQWEsRUFBRSxVQUF1QixFQUFFLGFBQXdCLEVBQUUsS0FBYTtRQUNyRyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQWMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFjLENBQUM7UUFDekUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRVMsYUFBYSxDQUFDLE1BQWEsRUFBRSxJQUFpQixFQUFFLFVBQXVCLEVBQUUsYUFBd0I7UUFDekcsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNoRixPQUFPO1NBQ1I7UUFDRCxNQUFNLE9BQU8sR0FBYyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQWMsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pCLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVTLGdCQUFnQixDQUFDLE1BQWEsRUFBRSxVQUF1QixFQUFFLGFBQXdCLEVBQUUsS0FBYTtRQUN4RyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQWMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFjLENBQUM7UUFDekUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRVMsT0FBTyxDQUFDLEtBQTBCO1FBQzFDLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRVMsT0FBTyxDQUFDLFdBQXNCO1FBQ3RDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRVMsVUFBVSxDQUFDLFdBQXNCLEVBQUUsT0FBWTtRQUN2RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDMUQ7YUFBTTtZQUNMLFFBQVEsR0FBRyxPQUFPLENBQUM7U0FDcEI7UUFFRCxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLFdBQVcsR0FBSSxXQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsV0FBVztnQkFDZCxNQUFNLHlCQUF5QixRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDaEQ7UUFDRCxJQUFJLFdBQVcsWUFBWSxTQUFTLEVBQUU7WUFDcEMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDeEQsSUFBSSxJQUFJLFlBQVksV0FBVztvQkFDN0IsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDOUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksU0FBUztnQkFDWCxPQUFPLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxjQUFjLENBQUMsSUFBaUI7UUFDeEMsUUFBUSxDQUFBO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDOzhHQS9LVSxtQkFBbUI7a0dBQW5CLG1CQUFtQixxSEN6QmhDLGczSkFpR087OzJGRHhFTSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsY0FBYyxtQkFHUCx1QkFBdUIsQ0FBQyxNQUFNO29JQUdwQixJQUFJO3NCQUE5QixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDRSxNQUFNO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRm9ybUdyb3VwLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBBYnN0cmFjdENvbnRyb2xcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTY2hlbWFNb2RlbCB9IGZyb20gJy4vTW9kZWxzL1NjaGVtYSc7XG5pbXBvcnQgeyBOZ3hJc29TZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtaXNvLWZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBJc29Gb3JtIH0gZnJvbSAnLi9Nb2RlbHMvSXNvRm9ybSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1pc28tZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtaXNvLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtaXNvLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTmd4SXNvRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGZvcm06IElzb0Zvcm07XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHNjaGVtYTogU2NoZW1hTW9kZWw7XG4gIHByb3RlY3RlZCBfZm9ybTogRm9ybUdyb3VwO1xuICBwcml2YXRlIF9pc0Zvcm1Jbml0aWF0ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfbmdNb2RlbDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogTmd4SXNvU2VydmljZSwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzY2hlbWEnXSAmJiBjaGFuZ2VzWydzY2hlbWEnXS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuaW5pdGlhdGVGb3JtKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb3JtJ10gJiYgY2hhbmdlc1snZm9ybSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5pbml0aWF0ZUZvcm1Nb2RlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ2V0SXNvRm9ybSgpOiBhbnkge1xuICAgIGlmICh0aGlzLl9mb3JtKVxuICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5zYW5pdGl6ZSh0aGlzLl9mb3JtLnZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZ2V0Rm9ybU1vZGVsKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLl9mb3JtTW9kZWw7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYXRlRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UuX2Zvcm1Nb2RlbCA9IFt0aGlzLnN0cnVjdHVyZWRDbG9uZSh0aGlzLnNjaGVtYSldO1xuICAgIHRoaXMuc2VydmljZS5fZm9ybU1vZGVsWzBdLmVsZW1lbnRzID0gW107XG4gICAgbGV0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICBncm91cFt0aGlzLnNjaGVtYS5pZF0gPSB0aGlzLnNlcnZpY2UuZ2V0Rm9ybUdyb3VwQ29udHJvbHModGhpcy5zY2hlbWEuZWxlbWVudHMsIHRoaXMuc2VydmljZS5fZm9ybU1vZGVsWzBdLmVsZW1lbnRzKTtcbiAgICB0aGlzLl9mb3JtID0gbmV3IEZvcm1Hcm91cChncm91cCk7XG4gICAgaWYgKCF0aGlzLl9pc0Zvcm1Jbml0aWF0ZSkge1xuICAgICAgdGhpcy5pbml0aWF0ZUZvcm1Nb2RlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RydWN0dXJlZENsb25lKGRhdGE6IGFueSk6IGFueSB7XG4gICAgbGV0IGNsb25lRGF0YTtcbiAgICB0cnkge1xuICAgICAgY2xvbmVEYXRhID0gc3RydWN0dXJlZENsb25lKGRhdGEpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgZGVidWdnZXJcbiAgICAgIGNsb25lRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmVEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWF0ZUZvcm1Nb2RlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZm9ybSkge1xuICAgICAgdGhpcy5fbmdNb2RlbCA9IHRoaXMuZm9ybS5fbW9kZWw7XG4gICAgICB0aGlzLmZvcm0uZ2V0Rm9ybU1vZGVsID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJc29Gb3JtO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2lzRm9ybUluaXRpYXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VydmljZS5pbml0Rm9ybU1vZGVsKHRoaXMuX25nTW9kZWwsIHRoaXMuX2Zvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNob2ljZVNlbGVjdGlvbkNoYW5nZShpZDogc3RyaW5nLCBmb3JtRWxlbWVudDogYW55LCBub2RlczogU2NoZW1hTW9kZWwpOiB2b2lkIHtcbiAgICBub2Rlcy5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBTY2hlbWFNb2RlbCkgPT4ge1xuICAgICAgZWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuICAgICAgZm9ybUVsZW1lbnQucmVtb3ZlQ29udHJvbChlbGVtZW50LmlkKTtcbiAgICAgIGlmIChlbGVtZW50LmlkID09PSBpZCkge1xuICAgICAgICBlbGVtZW50LmhpZGRlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuc2VydmljZS5nZXRGb3JtR3JvdXBDb250cm9scyhlbGVtZW50LmVsZW1lbnRzLCBbXSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgZm9ybUVsZW1lbnQuYWRkQ29udHJvbChlbGVtZW50LmlkLCBncm91cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuc2VydmljZS5nZXRGb3JtQ29udHJvbCgnJyk7XG4gICAgICAgICAgZm9ybUVsZW1lbnQuYWRkQ29udHJvbChlbGVtZW50LmlkLCBjb250cm9sKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWF4T2NjdXJzKG1heE9jY3Vyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1heE9jY3VycyAhPT0gbnVsbCAmJiBtYXhPY2N1cnMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNlcnZpY2UubWF4T2NjdXJzKG1heE9jY3Vycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXhwYW5kKG1pbk9jY3Vyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1pbk9jY3VycyAhPT0gbnVsbCAmJiBtaW5PY2N1cnMgIT09IHVuZGVmaW5lZCAmJiBwYXJzZUludChtaW5PY2N1cnMsIDEwKSA+IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkU2VjdGlvbigkZXZlbnQ6IEV2ZW50LCBub2RlOiBTY2hlbWFNb2RlbCwgcGFyZW50Tm9kZTogU2NoZW1hTW9kZWwsIHBhcmVudEZvcm1FbGU6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb250cm9sOiBGb3JtQXJyYXkgPSBwYXJlbnRGb3JtRWxlLmdldChub2RlLmlkKSBhcyBGb3JtQXJyYXk7XG4gICAgaWYgKG5vZGUubWF4T2NjdXJzICYmIHBhcnNlSW50KG5vZGUubWF4T2NjdXJzLCAxMCkgPD0gcGFyZW50Tm9kZS5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3RWxlID0gdGhpcy5zdHJ1Y3R1cmVkQ2xvbmUocGFyZW50Tm9kZS5lbGVtZW50c1swXSk7XG4gICAgY29uc3QgbmV3S2V5czogYW55ID0gW107XG4gICAgY29uc3QgZ3JvdXBDb250cm9scyA9IHRoaXMuc2VydmljZS5nZXRGb3JtR3JvdXBDb250cm9scyhuZXdFbGUuZWxlbWVudHMsIG5ld0tleXMsIHBhcmVudE5vZGUuZWxlbWVudHMubGVuZ3RoIC0gMSk7XG4gICAgcGFyZW50Tm9kZS5lbGVtZW50cy5wdXNoKG5ld0VsZSk7XG4gICAgY29udHJvbC5wdXNoKGdyb3VwQ29udHJvbHMpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVTZWN0aW9uKCRldmVudDogRXZlbnQsIHBhcmVudE5vZGU6IFNjaGVtYU1vZGVsLCBwYXJlbnRGb3JtRWxlOiBGb3JtR3JvdXAsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY29udHJvbDogRm9ybUFycmF5ID0gcGFyZW50Rm9ybUVsZS5nZXQocGFyZW50Tm9kZS5pZCkgYXMgRm9ybUFycmF5O1xuICAgIHBhcmVudE5vZGUuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBjb250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTmV3Q29udHJvbCgkZXZlbnQ6IEV2ZW50LCBub2RlOiBTY2hlbWFNb2RlbCwgcGFyZW50Tm9kZTogU2NoZW1hTW9kZWwsIHBhcmVudEZvcm1FbGU6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAobm9kZS5tYXhPY2N1cnMgJiYgcGFyc2VJbnQobm9kZS5tYXhPY2N1cnMsIDEwKSA8PSBwYXJlbnROb2RlLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sOiBGb3JtQXJyYXkgPSBwYXJlbnRGb3JtRWxlLmdldChub2RlLmlkKSBhcyBGb3JtQXJyYXk7XG4gICAgY29uc3QgbmV3Q29udHJvbCA9IHRoaXMuc2VydmljZS5nZXRGb3JtQ29udHJvbCgnJyk7XG4gICAgY29uc3QgbmV3RWxlID0gdGhpcy5zdHJ1Y3R1cmVkQ2xvbmUocGFyZW50Tm9kZS5lbGVtZW50c1twYXJlbnROb2RlLmVsZW1lbnRzLmxlbmd0aCAtIDFdKTtcbiAgICBjb250cm9sLnB1c2gobmV3Q29udHJvbCk7XG4gICAgcGFyZW50Tm9kZS5lbGVtZW50cy5wdXNoKG5ld0VsZSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24uZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbW92ZU5ld0NvbnRyb2woJGV2ZW50OiBFdmVudCwgcGFyZW50Tm9kZTogU2NoZW1hTW9kZWwsIHBhcmVudEZvcm1FbGU6IEZvcm1Hcm91cCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb250cm9sOiBGb3JtQXJyYXkgPSBwYXJlbnRGb3JtRWxlLmdldChwYXJlbnROb2RlLmlkKSBhcyBGb3JtQXJyYXk7XG4gICAgcGFyZW50Tm9kZS5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGNvbnRyb2wucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0FycmF5KG15S2V5OiBPYmplY3QgfCBBcnJheTxhbnk+KTogYm9vbGVhbiB7XG4gICAgaWYgKG15S2V5IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNFbXB0eShmb3JtRWxlbWVudDogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGZvcm1FbGVtZW50LmNvbnRyb2xzKS5sZW5ndGggPT09IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudChmb3JtRWxlbWVudDogRm9ybUdyb3VwLCBlbGVtZW50OiBhbnkpOiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZWxlbWVudC5oaWRkZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IF9lbGVtZW50O1xuICAgIGlmIChlbGVtZW50Lm11bHRpKSB7XG4gICAgICBfZWxlbWVudCA9IGVsZW1lbnQuZWxlbWVudHNbZWxlbWVudC5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIGxldCBmb3JtQ29udHJvbCA9IGZvcm1FbGVtZW50LmNvbnRyb2xzW19lbGVtZW50LmlkXTtcbiAgICBpZiAoIWZvcm1Db250cm9sKSB7XG4gICAgICBmb3JtQ29udHJvbCA9IChmb3JtRWxlbWVudCBhcyBhbnkpW19lbGVtZW50LmlkXTtcbiAgICAgIGlmICghZm9ybUNvbnRyb2wpXG4gICAgICAgIHRocm93IGBGb3JtQ29udHJvbCBub3QgZm91bmQgJHtfZWxlbWVudC5pZH1gO1xuICAgIH1cbiAgICBpZiAoZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IGZvcm1Db250cm9sLmNvbnRyb2xzLmZpbmQoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEZvcm1Db250cm9sKVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaXRlbS5jb250cm9scykuZmluZCgoY3RybCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjdHJsLmluZGV4T2YoZWxlbWVudC5pZCkgPiAtMTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgaWYgKGZvcm1Hcm91cClcbiAgICAgICAgcmV0dXJuIGZvcm1Db250cm9sLmF0KGZvcm1Db250cm9sLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybUNvbnRyb2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Rm9ybUNvbnRyb2wobm9kZTogU2NoZW1hTW9kZWwpOiBGb3JtQ29udHJvbCB7XG4gICAgZGVidWdnZXJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmdldEZvcm1Db250cm9sKCcnKTtcbiAgfVxufVxuIiwiPGZvcm0gKm5nSWY9XCJfZm9ybSAmJiBzY2hlbWFcIiBbZm9ybUdyb3VwXT1cIl9mb3JtXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbm9kZVRlbXBsYXRlUmVmIGxldC1ub2RlPVwibm9kZVwiIGxldC1mb3JtRWxlbWVudD1cImZvcm1FbGVtZW50XCIgbGV0LWluZGV4PVwiaW5kZXhcIlxyXG4gICAgICBsZXQtcGFyZW50Tm9kZT1cInBhcmVudE5vZGVcIiBsZXQtcGFyZW50Rm9ybUVsZW1lbnQ9XCJwYXJlbnRGb3JtRWxlbWVudFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZS5tdWx0aSB0aGVuIGFyciBlbHNlIG9ialwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Fycj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nRm9yPVwibGV0IG1vZGVsIG9mIG5vZGUuZWxlbWVudHM7bGV0IGkgPSBpbmRleFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZVJlZlwiXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgbm9kZTogbW9kZWwsXHJcbiAgICAgICAgICBmb3JtRWxlbWVudDogZm9ybUVsZW1lbnQsXHJcbiAgICAgICAgICBwYXJlbnRGb3JtRWxlbWVudDogcGFyZW50Rm9ybUVsZW1lbnQsXHJcbiAgICAgICAgICBwYXJlbnROb2RlOiBub2RlLFxyXG4gICAgICAgICAgaW5kZXg6IGlcclxuICAgICAgICB9XCI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNvYmo+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGUuZWxlbWVudHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8bWF0LWFjY29yZGlvbiBbZm9ybUdyb3VwXT1cImZvcm1FbGVtZW50XCIgKm5nSWY9XCIhbm9kZS5oaWRkZW5cIj5cclxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgbXVsdGkgW2V4cGFuZGVkXT1cImV4cGFuZChub2RlLm1pbk9jY3VycylcIiAjZXhwYW4+XHJcbiAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAge3sgbm9kZS5uYW1lIHwgdHJhbnM6IG5vZGUuaWQgOiBub2RlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbiAqbmdJZj1cIm1heE9jY3Vycyhub2RlLm1heE9jY3VycylcIj5cclxuICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpbmRleCA8IDFcIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZFNlY3Rpb24oJGV2ZW50LCBub2RlLHBhcmVudE5vZGUsIHBhcmVudEZvcm1FbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImluZGV4ID4gMFwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlU2VjdGlvbigkZXZlbnQscGFyZW50Tm9kZSxwYXJlbnRGb3JtRWxlbWVudCxpbmRleClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHBhbi5leHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwibm9kZS5kYXRhVHlwZSA9PT0gJ2Nob2ljZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBub2RlLm5hbWUgfCB0cmFuczogbm9kZS5pZCA6IG5vZGUubmFtZSB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2hvaWNlU2VsZWN0aW9uQ2hhbmdlKCRldmVudC52YWx1ZSxmb3JtRWxlbWVudCwgbm9kZSlcIiBbZm9ybUNvbnRyb2xdPVwibm9kZS5jaG9pY2VGb3JtQ29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG5vZGUuZWxlbWVudHNcIiBbdmFsdWVdPVwiaXRlbS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tpdGVtLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFbXB0eShmb3JtRWxlbWVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBub2RlLmVsZW1lbnRzOyBsZXQgaSA9IGluZGV4XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICBub2RlOiBtb2RlbCxcclxuICAgICAgICAgICAgZm9ybUVsZW1lbnQ6IGdldEVsZW1lbnQoZm9ybUVsZW1lbnQsbW9kZWwpLFxyXG4gICAgICAgICAgICBwYXJlbnRGb3JtRWxlbWVudDogZm9ybUVsZW1lbnRcclxuICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm5vZGUuZWxlbWVudHMubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtaXNvLWNvbnRyb2wgKm5nSWY9XCIhbm9kZS5oaWRkZW5cIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUVsZW1lbnRcIiBbY29udHJvbF09XCJub2RlXCI+PC9uZ3gtaXNvLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbm9kZS5lbGVtZW50cy5sZW5ndGggJiYgIW5vZGUuaGlkZGVuXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibWF4T2NjdXJzKG5vZGUubWF4T2NjdXJzKVwiIGNsYXNzPVwiZm9ybS1hZGQtc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImluZGV4IDwgMVwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkTmV3Q29udHJvbCgkZXZlbnQsIG5vZGUscGFyZW50Tm9kZSxwYXJlbnRGb3JtRWxlbWVudClcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpbmRleCA+IDBcIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlbW92ZU5ld0NvbnRyb2woJGV2ZW50LHBhcmVudE5vZGUscGFyZW50Rm9ybUVsZW1lbnQsaW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPnJlbW92ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmd4LWlzby1jb250cm9sIFtmb3JtQ29udHJvbF09XCJmb3JtRWxlbWVudFwiIFtjb250cm9sXT1cIm5vZGVcIj48L25neC1pc28tY29udHJvbD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtb2RlbCBvZiBnZXRGb3JtTW9kZWw7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQXJyYXkobW9kZWwpO3RoZW4gZm9ybUFycmF5IGVsc2UgZm9ybU9iamVjdFwiPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNmb3JtQXJyYXk+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0Zvcj1cImxldCBrZXkgb2YgbW9kZWw7bGV0IGkgPSBpbmRleFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZVJlZlwiXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgbm9kZToga2V5LFxyXG4gICAgICAgICAgZm9ybUVsZW1lbnQ6IGdldEVsZW1lbnQoX2Zvcm0sa2V5KSxcclxuICAgICAgICAgIHBhcmVudEZvcm1FbGVtZW50OiBfZm9ybSxcclxuICAgICAgICAgIGluZGV4OmlcclxuICAgICAgICB9XCI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNmb3JtT2JqZWN0PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlVGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgbm9kZTogbW9kZWwsXHJcbiAgICAgICAgICBmb3JtRWxlbWVudDogZ2V0RWxlbWVudChfZm9ybSxtb2RlbCksXHJcbiAgICAgICAgICBwYXJlbnRGb3JtRWxlbWVudDogX2Zvcm0sXHJcbiAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICB9XCI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+Il19
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlzby1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pc28tZm9ybS9zcmMvbGliL25neC1pc28tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaXNvLWZvcm0vc3JjL2xpYi9uZ3gtaXNvLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsS0FBSyxFQUdOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFFVixNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBWXhCLE1BQU0sT0FBTyxtQkFBbUI7SUFPOUIsWUFBb0IsT0FBc0IsRUFBVSxlQUFrQztRQUFsRSxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQW1CO0lBQ3RGLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksRUFBRTtZQUN2RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFO1lBQ25ELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFjLFlBQVk7UUFDeEIsT0FBTyxJQUFJ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Q0FBQyxJQUFpQjtRQUN4QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxTQUFnQjtRQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7OEdBckxVLG1CQUFtQjtrR0FBbkIsbUJBQW1CLHFIQ3pCaEMsODNKQWlHTzs7MkZEeEVNLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxjQUFjLG1CQUdQLHVCQUF1QixDQUFDLE1BQU07b0lBR3BCLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNFLE1BQU07c0JBQWhDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3JtR3JvdXAsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQXJyYXksXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFNjaGVtYU1vZGVsIH0gZnJvbSAnLi9Nb2RlbHMvU2NoZW1hJztcbmltcG9ydCB7IE5neElzb1NlcnZpY2UgfSBmcm9tICcuL25neC1pc28tZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IElzb0Zvcm0gfSBmcm9tICcuL01vZGVscy9Jc29Gb3JtJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWlzby1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1pc28tZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25neC1pc28tZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hJc29Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZm9ybTogSXNvRm9ybTtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2NoZW1hOiBTY2hlbWFNb2RlbDtcbiAgcHJvdGVjdGVkIF9mb3JtOiBGb3JtR3JvdXA7XG4gIHByaXZhdGUgX2lzRm9ybUluaXRpYXRlOiBib29sZWFuO1xuICBwcml2YXRlIF9uZ01vZGVsOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBOZ3hJc29TZXJ2aWNlLCBwcml2YXRlIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NjaGVtYSddICYmIGNoYW5nZXNbJ3NjaGVtYSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5pbml0aWF0ZUZvcm0oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2Zvcm0nXSAmJiBjaGFuZ2VzWydmb3JtJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmluaXRpYXRlRm9ybU1vZGVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBnZXRJc29Gb3JtKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuX2Zvcm0pXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnNhbml0aXplKHRoaXMuX2Zvcm0udmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBnZXRGb3JtTW9kZWwoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuX2Zvcm1Nb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5fZm9ybU1vZGVsID0gW3RoaXMuc3RydWN0dXJlZENsb25lKHRoaXMuc2NoZW1hKV07XG4gICAgdGhpcy5zZXJ2aWNlLl9mb3JtTW9kZWxbMF0uZWxlbWVudHMgPSBbXTtcbiAgICBsZXQgZ3JvdXA6IGFueSA9IHt9O1xuICAgIGNvbnN0IHNjaGVtYUVsZW1lbnRzID0gIHRoaXMuc2NoZW1hLmVsZW1lbnRzLmxlbmd0aCA+IDAgPyB0aGlzLnN0cnVjdHVyZWRDbG9uZSh0aGlzLnNjaGVtYS5lbGVtZW50cykgOiB0aGlzLnNjaGVtYS5lbGVtZW50cztcbiAgICBjb25zdCBmb3JtRWxlbWVudHMgPSB0aGlzLnNlcnZpY2UuX2Zvcm1Nb2RlbFswXS5lbGVtZW50cy5sZW5ndGggPiAwID8gdGhpcy5zdHJ1Y3R1cmVkQ2xvbmUodGhpcy5zZXJ2aWNlLl9mb3JtTW9kZWxbMF0uZWxlbWVudHMpIDogdGhpcy5zZXJ2aWNlLl9mb3JtTW9kZWxbMF0uZWxlbWVudHM7XG4gICAgZ3JvdXBbdGhpcy5zY2hlbWEuaWRdID0gdGhpcy5zZXJ2aWNlLmdldEZvcm1Hcm91cENvbnRyb2xzKHNjaGVtYUVsZW1lbnRzLCBmb3JtRWxlbWVudHMpO1xuICAgIHRoaXMuX2Zvcm0gPSBuZXcgRm9ybUdyb3VwKGdyb3VwKTtcbiAgICBpZiAoIXRoaXMuX2lzRm9ybUluaXRpYXRlKSB7XG4gICAgICB0aGlzLmluaXRpYXRlRm9ybU1vZGVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdHJ1Y3R1cmVkQ2xvbmUoZGF0YTogYW55KTogYW55IHtcbiAgICBsZXQgY2xvbmVEYXRhO1xuICAgIHRyeSB7XG4gICAgICBjbG9uZURhdGEgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGF0YSk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBjbG9uZURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhdGVGb3JtTW9kZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Zvcm0pIHtcbiAgICAgIHRoaXMuX25nTW9kZWwgPSB0aGlzLmZvcm0uX21vZGVsO1xuICAgICAgdGhpcy5mb3JtLmdldEZvcm1Nb2RlbCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SXNvRm9ybTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9pc0Zvcm1Jbml0aWF0ZSA9IHRydWU7XG4gICAgICB0aGlzLnNlcnZpY2UuaW5pdEZvcm1Nb2RlbCh0aGlzLl9uZ01vZGVsLCB0aGlzLl9mb3JtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaG9pY2VTZWxlY3Rpb25DaGFuZ2UoaWQ6IHN0cmluZywgZm9ybUVsZW1lbnQ6IGFueSwgbm9kZXM6IFNjaGVtYU1vZGVsKTogdm9pZCB7XG4gICAgbm9kZXMuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogU2NoZW1hTW9kZWwpID0+IHtcbiAgICAgIGVsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIGZvcm1FbGVtZW50LnJlbW92ZUNvbnRyb2woZWxlbWVudC5pZCk7XG4gICAgICBpZiAoZWxlbWVudC5pZCA9PT0gaWQpIHtcbiAgICAgICAgZWxlbWVudC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLnNlcnZpY2UuZ2V0Rm9ybUdyb3VwQ29udHJvbHMoZWxlbWVudC5lbGVtZW50cywgW10sIDAsIHRydWUpO1xuICAgICAgICAgIGZvcm1FbGVtZW50LmFkZENvbnRyb2woZWxlbWVudC5pZCwgZ3JvdXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnNlcnZpY2UuZ2V0Rm9ybUNvbnRyb2woJycpO1xuICAgICAgICAgIGZvcm1FbGVtZW50LmFkZENvbnRyb2woZWxlbWVudC5pZCwgY29udHJvbCk7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1heE9jY3VycyhtYXhPY2N1cnM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYXhPY2N1cnMgIT09IG51bGwgJiYgbWF4T2NjdXJzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZXJ2aWNlLm1heE9jY3VycyhtYXhPY2N1cnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4cGFuZChtaW5PY2N1cnM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtaW5PY2N1cnMgIT09IG51bGwgJiYgbWluT2NjdXJzICE9PSB1bmRlZmluZWQgJiYgcGFyc2VJbnQobWluT2NjdXJzLCAxMCkgPiAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZFNlY3Rpb24oJGV2ZW50OiBFdmVudCwgbm9kZTogU2NoZW1hTW9kZWwsIHBhcmVudE5vZGU6IFNjaGVtYU1vZGVsLCBwYXJlbnRGb3JtRWxlOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY29udHJvbDogRm9ybUFycmF5ID0gcGFyZW50Rm9ybUVsZS5nZXQobm9kZS5pZCkgYXMgRm9ybUFycmF5O1xuICAgIGlmIChub2RlLm1heE9jY3VycyAmJiBwYXJzZUludChub2RlLm1heE9jY3VycywgMTApIDw9IHBhcmVudE5vZGUuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0VsZSA9IHRoaXMuc3RydWN0dXJlZENsb25lKHBhcmVudE5vZGUuZWxlbWVudHNbMF0pO1xuICAgIGNvbnN0IG5ld0tleXM6IGFueSA9IFtdO1xuICAgIGNvbnN0IGdyb3VwQ29udHJvbHMgPSB0aGlzLnNlcnZpY2UuZ2V0Rm9ybUdyb3VwQ29udHJvbHMobmV3RWxlLmVsZW1lbnRzLCBuZXdLZXlzLCBwYXJlbnROb2RlLmVsZW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIHBhcmVudE5vZGUuZWxlbWVudHMucHVzaChuZXdFbGUpO1xuICAgIGNvbnRyb2wucHVzaChncm91cENvbnRyb2xzKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlU2VjdGlvbigkZXZlbnQ6IEV2ZW50LCBwYXJlbnROb2RlOiBTY2hlbWFNb2RlbCwgcGFyZW50Rm9ybUVsZTogRm9ybUdyb3VwLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGNvbnRyb2w6IEZvcm1BcnJheSA9IHBhcmVudEZvcm1FbGUuZ2V0KHBhcmVudE5vZGUuaWQpIGFzIEZvcm1BcnJheTtcbiAgICBwYXJlbnROb2RlLmVsZW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgY29udHJvbC5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24uZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5ld0NvbnRyb2woJGV2ZW50OiBFdmVudCwgbm9kZTogU2NoZW1hTW9kZWwsIHBhcmVudE5vZGU6IFNjaGVtYU1vZGVsLCBwYXJlbnRGb3JtRWxlOiBGb3JtR3JvdXApOiB2b2lkIHtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKG5vZGUubWF4T2NjdXJzICYmIHBhcnNlSW50KG5vZGUubWF4T2NjdXJzLCAxMCkgPD0gcGFyZW50Tm9kZS5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbDogRm9ybUFycmF5ID0gcGFyZW50Rm9ybUVsZS5nZXQobm9kZS5pZCkgYXMgRm9ybUFycmF5O1xuICAgIGNvbnN0IG5ld0NvbnRyb2wgPSB0aGlzLnNlcnZpY2UuZ2V0Rm9ybUNvbnRyb2woJycpO1xuICAgIGNvbnN0IG5ld0VsZSA9IHRoaXMuc3RydWN0dXJlZENsb25lKHBhcmVudE5vZGUuZWxlbWVudHNbcGFyZW50Tm9kZS5lbGVtZW50cy5sZW5ndGggLSAxXSk7XG4gICAgY29udHJvbC5wdXNoKG5ld0NvbnRyb2wpO1xuICAgIHBhcmVudE5vZGUuZWxlbWVudHMucHVzaChuZXdFbGUpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVOZXdDb250cm9sKCRldmVudDogRXZlbnQsIHBhcmVudE5vZGU6IFNjaGVtYU1vZGVsLCBwYXJlbnRGb3JtRWxlOiBGb3JtR3JvdXAsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY29udHJvbDogRm9ybUFycmF5ID0gcGFyZW50Rm9ybUVsZS5nZXQocGFyZW50Tm9kZS5pZCkgYXMgRm9ybUFycmF5O1xuICAgIHBhcmVudE5vZGUuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBjb250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBcnJheShteUtleTogT2JqZWN0IHwgQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgIGlmIChteUtleSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRW1wdHkoZm9ybUVsZW1lbnQ6IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhmb3JtRWxlbWVudC5jb250cm9scykubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnQoZm9ybUVsZW1lbnQ6IEZvcm1Hcm91cCwgZWxlbWVudDogYW55KTogQWJzdHJhY3RDb250cm9sPGFueSwgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGVsZW1lbnQuaGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBfZWxlbWVudDtcbiAgICBpZiAoZWxlbWVudC5tdWx0aSkge1xuICAgICAgX2VsZW1lbnQgPSBlbGVtZW50LmVsZW1lbnRzW2VsZW1lbnQuZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIF9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICBsZXQgZm9ybUNvbnRyb2wgPSBmb3JtRWxlbWVudC5jb250cm9sc1tfZWxlbWVudC5pZF07XG4gICAgaWYgKCFmb3JtQ29udHJvbCkge1xuICAgICAgZm9ybUNvbnRyb2wgPSAoZm9ybUVsZW1lbnQgYXMgYW55KVtfZWxlbWVudC5pZF07XG4gICAgICBpZiAoIWZvcm1Db250cm9sKVxuICAgICAgICB0aHJvdyBgRm9ybUNvbnRyb2wgbm90IGZvdW5kICR7X2VsZW1lbnQuaWR9YDtcbiAgICB9XG4gICAgaWYgKGZvcm1Db250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBmb3JtQ29udHJvbC5jb250cm9scy5maW5kKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBGb3JtQ29udHJvbClcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGl0ZW0uY29udHJvbHMpLmZpbmQoKGN0cmwpID0+IHtcbiAgICAgICAgICByZXR1cm4gY3RybC5pbmRleE9mKGVsZW1lbnQuaWQpID4gLTE7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIGlmIChmb3JtR3JvdXApXG4gICAgICAgIHJldHVybiBmb3JtQ29udHJvbC5hdChmb3JtQ29udHJvbC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1Db250cm9sO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZvcm1Db250cm9sKG5vZGU6IFNjaGVtYU1vZGVsKTogRm9ybUNvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0Rm9ybUNvbnRyb2woJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENob2ljZUZvcm1Db250cm9sKGNob2ljZUtleTpzdHJpbmcpe1xuICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5zZXJ2aWNlLmdldEZvcm1Db250cm9sKCcnKTtcbiAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShjaG9pY2VLZXkpO1xuICAgIHJldHVybiBmb3JtQ29udHJvbDtcbiAgfVxufVxuIiwiPGZvcm0gKm5nSWY9XCJfZm9ybSAmJiBzY2hlbWFcIiBbZm9ybUdyb3VwXT1cIl9mb3JtXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbm9kZVRlbXBsYXRlUmVmIGxldC1ub2RlPVwibm9kZVwiIGxldC1mb3JtRWxlbWVudD1cImZvcm1FbGVtZW50XCIgbGV0LWluZGV4PVwiaW5kZXhcIlxyXG4gICAgICBsZXQtcGFyZW50Tm9kZT1cInBhcmVudE5vZGVcIiBsZXQtcGFyZW50Rm9ybUVsZW1lbnQ9XCJwYXJlbnRGb3JtRWxlbWVudFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZS5tdWx0aSB0aGVuIGFyciBlbHNlIG9ialwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Fycj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nRm9yPVwibGV0IG1vZGVsIG9mIG5vZGUuZWxlbWVudHM7bGV0IGkgPSBpbmRleFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZVJlZlwiXHJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgbm9kZTogbW9kZWwsXHJcbiAgICAgICAgICBmb3JtRWxlbWVudDogZm9ybUVsZW1lbnQsXHJcbiAgICAgICAgICBwYXJlbnRGb3JtRWxlbWVudDogcGFyZW50Rm9ybUVsZW1lbnQsXHJcbiAgICAgICAgICBwYXJlbnROb2RlOiBub2RlLFxyXG4gICAgICAgICAgaW5kZXg6IGlcclxuICAgICAgICB9XCI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNvYmo+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGUuZWxlbWVudHMubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8bWF0LWFjY29yZGlvbiBbZm9ybUdyb3VwXT1cImZvcm1FbGVtZW50XCIgKm5nSWY9XCIhbm9kZS5oaWRkZW5cIj5cclxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgbXVsdGkgW2V4cGFuZGVkXT1cImV4cGFuZChub2RlLm1pbk9jY3VycylcIiAjZXhwYW4+XHJcbiAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAge3sgbm9kZS5uYW1lIHwgdHJhbnM6IG5vZGUuaWQgOiBub2RlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbiAqbmdJZj1cIm1heE9jY3Vycyhub2RlLm1heE9jY3VycylcIj5cclxuICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpbmRleCA8IDFcIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZFNlY3Rpb24oJGV2ZW50LCBub2RlLHBhcmVudE5vZGUsIHBhcmVudEZvcm1FbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImluZGV4ID4gMFwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlU2VjdGlvbigkZXZlbnQscGFyZW50Tm9kZSxwYXJlbnRGb3JtRWxlbWVudCxpbmRleClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHBhbi5leHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwibm9kZS5kYXRhVHlwZSA9PT0gJ2Nob2ljZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBub2RlLm5hbWUgfCB0cmFuczogbm9kZS5pZCA6IG5vZGUubmFtZSB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2hvaWNlU2VsZWN0aW9uQ2hhbmdlKCRldmVudC52YWx1ZSxmb3JtRWxlbWVudCwgbm9kZSlcIiBbZm9ybUNvbnRyb2xdPVwiZ2V0Q2hvaWNlRm9ybUNvbnRyb2wobm9kZS5jaG9pY2VLZXkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygbm9kZS5lbGVtZW50c1wiIFt2YWx1ZV09XCJpdGVtLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VtcHR5KGZvcm1FbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nRm9yPVwibGV0IG1vZGVsIG9mIG5vZGUuZWxlbWVudHM7IGxldCBpID0gaW5kZXhcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlVGVtcGxhdGVSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICAgIG5vZGU6IG1vZGVsLFxyXG4gICAgICAgICAgICBmb3JtRWxlbWVudDogZ2V0RWxlbWVudChmb3JtRWxlbWVudCxtb2RlbCksXHJcbiAgICAgICAgICAgIHBhcmVudEZvcm1FbGVtZW50OiBmb3JtRWxlbWVudFxyXG4gICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibm9kZS5lbGVtZW50cy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgPG5neC1pc28tY29udHJvbCAqbmdJZj1cIiFub2RlLmhpZGRlblwiIFtmb3JtQ29udHJvbF09XCJmb3JtRWxlbWVudFwiIFtjb250cm9sXT1cIm5vZGVcIj48L25neC1pc28tY29udHJvbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFub2RlLmVsZW1lbnRzLmxlbmd0aCAmJiAhbm9kZS5oaWRkZW5cIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJtYXhPY2N1cnMobm9kZS5tYXhPY2N1cnMpXCIgY2xhc3M9XCJmb3JtLWFkZC1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaW5kZXggPCAxXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGROZXdDb250cm9sKCRldmVudCwgbm9kZSxwYXJlbnROb2RlLHBhcmVudEZvcm1FbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImluZGV4ID4gMFwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlTmV3Q29udHJvbCgkZXZlbnQscGFyZW50Tm9kZSxwYXJlbnRGb3JtRWxlbWVudCxpbmRleClcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZ3gtaXNvLWNvbnRyb2wgW2Zvcm1Db250cm9sXT1cImZvcm1FbGVtZW50XCIgW2NvbnRyb2xdPVwibm9kZVwiPjwvbmd4LWlzby1jb250cm9sPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGdldEZvcm1Nb2RlbDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBcnJheShtb2RlbCk7dGhlbiBmb3JtQXJyYXkgZWxzZSBmb3JtT2JqZWN0XCI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Zvcm1BcnJheT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nRm9yPVwibGV0IGtleSBvZiBtb2RlbDtsZXQgaSA9IGluZGV4XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlUmVmXCJcclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICBub2RlOiBrZXksXHJcbiAgICAgICAgICBmb3JtRWxlbWVudDogZ2V0RWxlbWVudChfZm9ybSxrZXkpLFxyXG4gICAgICAgICAgcGFyZW50Rm9ybUVsZW1lbnQ6IF9mb3JtLFxyXG4gICAgICAgICAgaW5kZXg6aVxyXG4gICAgICAgIH1cIj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Zvcm1PYmplY3Q+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICBub2RlOiBtb2RlbCxcclxuICAgICAgICAgIGZvcm1FbGVtZW50OiBnZXRFbGVtZW50KF9mb3JtLG1vZGVsKSxcclxuICAgICAgICAgIHBhcmVudEZvcm1FbGVtZW50OiBfZm9ybSxcclxuICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgIH1cIj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT4iXX0=
@@ -4,7 +4,7 @@ import { BrowserModule } from '@angular/platform-browser';
4
4
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
5
5
  import { MatExpansionModule } from '@angular/material/expansion';
6
6
  import { MatFormFieldModule } from '@angular/material/form-field';
7
- import { MatNativeDateModule } from '@angular/material/core';
7
+ import { DateAdapter, MAT_DATE_FORMATS, MatNativeDateModule } from '@angular/material/core';
8
8
  import { MatIconModule } from '@angular/material/icon';
9
9
  import { MatInputModule } from '@angular/material/input';
10
10
  import { MatButtonModule } from '@angular/material/button';
@@ -18,7 +18,7 @@ import { NgxDynamicComponent } from './shared/components/dynamic/ngx-dynamic.com
18
18
  import { IsoTranslatePipe } from './shared/pipe/translate.pipe';
19
19
  import { IsoErrorPipe } from './shared/pipe/error.pipe';
20
20
  import { IsoGeneralPipe } from './shared/pipe/general.pipe';
21
- import { ControlService } from './shared/services';
21
+ import { CUSTOM_DATE_FORMATS, CustomDateAdapter } from './shared/services/custom-date-adapter';
22
22
  import * as i0 from "@angular/core";
23
23
  // // AoT requires an exported function for factories
24
24
  // export function HttpLoaderFactory(http: HttpClient) {
@@ -54,7 +54,8 @@ export class NgxIsoFormModule {
54
54
  MatSelectModule,
55
55
  MatIconModule], exports: [NgxIsoFormComponent] }); }
56
56
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: NgxIsoFormModule, providers: [
57
- ControlService
57
+ { provide: DateAdapter, useClass: CustomDateAdapter },
58
+ { provide: MAT_DATE_FORMATS, useValue: CUSTOM_DATE_FORMATS }
58
59
  ], imports: [BrowserModule,
59
60
  BrowserAnimationsModule,
60
61
  TranslateModule,
@@ -105,11 +106,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImpor
105
106
  MatIconModule,
106
107
  ],
107
108
  providers: [
108
- ControlService
109
+ { provide: DateAdapter, useClass: CustomDateAdapter },
110
+ { provide: MAT_DATE_FORMATS, useValue: CUSTOM_DATE_FORMATS }
109
111
  ],
110
112
  exports: [
111
113
  NgxIsoFormComponent
112
114
  ]
113
115
  }]
114
116
  }] });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlzby1mb3JtLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pc28tZm9ybS9zcmMvbGliL25neC1pc28tZm9ybS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsV0FBVyxFQUNYLFVBQVUsRUFDVixjQUFjLEVBQ2QsWUFBWSxFQUNaLGNBQWMsRUFDZCxjQUFjLEVBQ2QsY0FBYyxHQUNmLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUduRCxxREFBcUQ7QUFDckQsd0RBQXdEO0FBQ3hELDBDQUEwQztBQUMxQyxJQUFJO0FBMENKLE1BQU0sT0FBTyxnQkFBZ0I7OEdBQWhCLGdCQUFnQjsrR0FBaEIsZ0JBQWdCLGlCQXRDekIsbUJBQW1CO1lBQ25CLHNCQUFzQjtZQUN0QixtQkFBbUI7WUFDbkIsdUJBQXVCO1lBQ3ZCLFdBQVc7WUFDWCxjQUFjO1lBQ2QsVUFBVTtZQUNWLGNBQWM7WUFDZCxZQUFZO1lBQ1osY0FBYztZQUNkLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixjQUFjLGFBR2QsYUFBYTtZQUNiLHVCQUF1QjtZQUN2QixlQUFlO1lBQ2YsV0FBVztZQUNYLG1CQUFtQjtZQUNuQixrQkFBa0I7WUFDbEIsa0JBQWtCO1lBQ2xCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixlQUFlO1lBQ2YsYUFBYSxhQU1iLG1CQUFtQjsrR0FHVixnQkFBZ0IsYUFQaEI7WUFDVCxjQUFjO1NBQ2YsWUFoQkMsYUFBYTtZQUNiLHVCQUF1QjtZQUN2QixlQUFlO1lBQ2YsV0FBVztZQUNYLG1CQUFtQjtZQUNuQixrQkFBa0I7WUFDbEIsa0JBQWtCO1lBQ2xCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixlQUFlO1lBQ2YsYUFBYTs7MkZBU0osZ0JBQWdCO2tCQXhDNUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osbUJBQW1CO3dCQUNuQixzQkFBc0I7d0JBQ3RCLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3dCQUN2QixXQUFXO3dCQUNYLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLGNBQWM7cUJBQ2Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGFBQWE7d0JBQ2IsdUJBQXVCO3dCQUN2QixlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGFBQWE7cUJBQ2Q7b0JBQ0QsU0FBUyxFQUFFO3dCQUNULGNBQWM7cUJBQ2Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLG1CQUFtQjtxQkFDcEI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zXCJcclxuaW1wb3J0IHsgQnJvd3Nlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBNYXRFeHBhbnNpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcblxyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTmd4SXNvQ29udHJvbENvbXBvbmVudCxcclxuICBJc29CYXNlQ29udHJvbENvbXBvbmVudCxcclxuICBJc29NYXRJbnB1dCxcclxuICBJc29NYXREYXRlLFxyXG4gIElzb01hdFRleHRhcmVhLFxyXG4gIElzb01hdFNlbGVjdCxcclxuICBJc29NYXRDaGVja2JveCxcclxuICBJc29NYXREYXRlVGltZSxcclxuICBJc29NYXRDdXJyZW5jeSxcclxufSBmcm9tICcuL2NvbXBvbmVudHMnO1xyXG5cclxuaW1wb3J0IHsgTmd4SXNvRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vbmd4LWlzby1mb3JtLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnREaXJlY3RpdmUgfSBmcm9tICcuL3NoYXJlZC9kaXJlY3RpdmVzL2NvbXBvbmVudC1jb250ZW50LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE5neER5bmFtaWNDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2R5bmFtaWMvbmd4LWR5bmFtaWMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSXNvVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4vc2hhcmVkL3BpcGUvdHJhbnNsYXRlLnBpcGUnO1xyXG5pbXBvcnQgeyBJc29FcnJvclBpcGUgfSBmcm9tICcuL3NoYXJlZC9waXBlL2Vycm9yLnBpcGUnO1xyXG5pbXBvcnQgeyBJc29HZW5lcmFsUGlwZSB9IGZyb20gJy4vc2hhcmVkL3BpcGUvZ2VuZXJhbC5waXBlJztcclxuaW1wb3J0IHsgQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcyc7XHJcblxyXG5cclxuLy8gLy8gQW9UIHJlcXVpcmVzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uIGZvciBmYWN0b3JpZXNcclxuLy8gZXhwb3J0IGZ1bmN0aW9uIEh0dHBMb2FkZXJGYWN0b3J5KGh0dHA6IEh0dHBDbGllbnQpIHtcclxuLy8gICByZXR1cm4gbmV3IFRyYW5zbGF0ZUh0dHBMb2FkZXIoaHR0cCk7XHJcbi8vIH1cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBOZ3hJc29Gb3JtQ29tcG9uZW50LFxyXG4gICAgTmd4SXNvQ29udHJvbENvbXBvbmVudCxcclxuICAgIE5neER5bmFtaWNDb21wb25lbnQsXHJcbiAgICBJc29CYXNlQ29udHJvbENvbXBvbmVudCxcclxuICAgIElzb01hdElucHV0LFxyXG4gICAgSXNvTWF0VGV4dGFyZWEsXHJcbiAgICBJc29NYXREYXRlLFxyXG4gICAgSXNvTWF0RGF0ZVRpbWUsXHJcbiAgICBJc29NYXRTZWxlY3QsXHJcbiAgICBJc29NYXRDaGVja2JveCxcclxuICAgIElzb01hdEN1cnJlbmN5LFxyXG4gICAgQ29tcG9uZW50RGlyZWN0aXZlLFxyXG4gICAgSXNvVHJhbnNsYXRlUGlwZSxcclxuICAgIElzb0Vycm9yUGlwZSxcclxuICAgIElzb0dlbmVyYWxQaXBlXHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBCcm93c2VyTW9kdWxlLFxyXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRFeHBhbnNpb25Nb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdE5hdGl2ZURhdGVNb2R1bGUsXHJcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgQ29udHJvbFNlcnZpY2VcclxuICBdLFxyXG4gIGV4cG9ydHM6IFtcclxuICAgIE5neElzb0Zvcm1Db21wb25lbnRcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hJc29Gb3JtTW9kdWxlIHsgfVxyXG4iXX0=
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlzby1mb3JtLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pc28tZm9ybS9zcmMvbGliL25neC1pc28tZm9ybS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsY0FBYyxFQUNkLFlBQVksRUFDWixjQUFjLEVBQ2QsY0FBYyxFQUNkLGNBQWMsR0FDZixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOztBQUcvRixxREFBcUQ7QUFDckQsd0RBQXdEO0FBQ3hELDBDQUEwQztBQUMxQyxJQUFJO0FBMkNKLE1BQU0sT0FBTyxnQkFBZ0I7OEdBQWhCLGdCQUFnQjsrR0FBaEIsZ0JBQWdCLGlCQXZDekIsbUJBQW1CO1lBQ25CLHNCQUFzQjtZQUN0QixtQkFBbUI7WUFDbkIsdUJBQXVCO1lBQ3ZCLFdBQVc7WUFDWCxjQUFjO1lBQ2QsVUFBVTtZQUNWLGNBQWM7WUFDZCxZQUFZO1lBQ1osY0FBYztZQUNkLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixjQUFjLGFBR2QsYUFBYTtZQUNiLHVCQUF1QjtZQUN2QixlQUFlO1lBQ2YsV0FBVztZQUNYLG1CQUFtQjtZQUNuQixrQkFBa0I7WUFDbEIsa0JBQWtCO1lBQ2xCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixlQUFlO1lBQ2YsYUFBYSxhQU9iLG1CQUFtQjsrR0FHVixnQkFBZ0IsYUFSaEI7WUFDVCxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFO1lBQ3JELEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRTtTQUM3RCxZQWpCQyxhQUFhO1lBQ2IsdUJBQXVCO1lBQ3ZCLGVBQWU7WUFDZixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLGtCQUFrQjtZQUNsQixrQkFBa0I7WUFDbEIsY0FBYztZQUNkLG1CQUFtQjtZQUNuQixtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLGVBQWU7WUFDZixhQUFhOzsyRkFVSixnQkFBZ0I7a0JBekM1QixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWixtQkFBbUI7d0JBQ25CLHNCQUFzQjt3QkFDdEIsbUJBQW1CO3dCQUNuQix1QkFBdUI7d0JBQ3ZCLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxVQUFVO3dCQUNWLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixjQUFjO3dCQUNkLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osY0FBYztxQkFDZjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsYUFBYTt3QkFDYix1QkFBdUI7d0JBQ3ZCLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsYUFBYTtxQkFDZDtvQkFDRCxTQUFTLEVBQUU7d0JBQ1QsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRTt3QkFDckQsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFO3FCQUM3RDtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsbUJBQW1CO3FCQUNwQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnNcIlxyXG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IE1hdEV4cGFuc2lvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcblxyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTmd4SXNvQ29udHJvbENvbXBvbmVudCxcclxuICBJc29CYXNlQ29udHJvbENvbXBvbmVudCxcclxuICBJc29NYXRJbnB1dCxcclxuICBJc29NYXREYXRlLFxyXG4gIElzb01hdFRleHRhcmVhLFxyXG4gIElzb01hdFNlbGVjdCxcclxuICBJc29NYXRDaGVja2JveCxcclxuICBJc29NYXREYXRlVGltZSxcclxuICBJc29NYXRDdXJyZW5jeSxcclxufSBmcm9tICcuL2NvbXBvbmVudHMnO1xyXG5cclxuaW1wb3J0IHsgTmd4SXNvRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vbmd4LWlzby1mb3JtLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnREaXJlY3RpdmUgfSBmcm9tICcuL3NoYXJlZC9kaXJlY3RpdmVzL2NvbXBvbmVudC1jb250ZW50LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE5neER5bmFtaWNDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2R5bmFtaWMvbmd4LWR5bmFtaWMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSXNvVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4vc2hhcmVkL3BpcGUvdHJhbnNsYXRlLnBpcGUnO1xyXG5pbXBvcnQgeyBJc29FcnJvclBpcGUgfSBmcm9tICcuL3NoYXJlZC9waXBlL2Vycm9yLnBpcGUnO1xyXG5pbXBvcnQgeyBJc29HZW5lcmFsUGlwZSB9IGZyb20gJy4vc2hhcmVkL3BpcGUvZ2VuZXJhbC5waXBlJztcclxuaW1wb3J0IHsgQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IENVU1RPTV9EQVRFX0ZPUk1BVFMsIEN1c3RvbURhdGVBZGFwdGVyIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvY3VzdG9tLWRhdGUtYWRhcHRlcic7XHJcblxyXG5cclxuLy8gLy8gQW9UIHJlcXVpcmVzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uIGZvciBmYWN0b3JpZXNcclxuLy8gZXhwb3J0IGZ1bmN0aW9uIEh0dHBMb2FkZXJGYWN0b3J5KGh0dHA6IEh0dHBDbGllbnQpIHtcclxuLy8gICByZXR1cm4gbmV3IFRyYW5zbGF0ZUh0dHBMb2FkZXIoaHR0cCk7XHJcbi8vIH1cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBOZ3hJc29Gb3JtQ29tcG9uZW50LFxyXG4gICAgTmd4SXNvQ29udHJvbENvbXBvbmVudCxcclxuICAgIE5neER5bmFtaWNDb21wb25lbnQsXHJcbiAgICBJc29CYXNlQ29udHJvbENvbXBvbmVudCxcclxuICAgIElzb01hdElucHV0LFxyXG4gICAgSXNvTWF0VGV4dGFyZWEsXHJcbiAgICBJc29NYXREYXRlLFxyXG4gICAgSXNvTWF0RGF0ZVRpbWUsXHJcbiAgICBJc29NYXRTZWxlY3QsXHJcbiAgICBJc29NYXRDaGVja2JveCxcclxuICAgIElzb01hdEN1cnJlbmN5LFxyXG4gICAgQ29tcG9uZW50RGlyZWN0aXZlLFxyXG4gICAgSXNvVHJhbnNsYXRlUGlwZSxcclxuICAgIElzb0Vycm9yUGlwZSxcclxuICAgIElzb0dlbmVyYWxQaXBlXHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBCcm93c2VyTW9kdWxlLFxyXG4gICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRFeHBhbnNpb25Nb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdE5hdGl2ZURhdGVNb2R1bGUsXHJcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgeyBwcm92aWRlOiBEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IEN1c3RvbURhdGVBZGFwdGVyIH0sXHJcbiAgICB7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBDVVNUT01fREFURV9GT1JNQVRTIH1cclxuICBdLFxyXG4gIGV4cG9ydHM6IFtcclxuICAgIE5neElzb0Zvcm1Db21wb25lbnRcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hJc29Gb3JtTW9kdWxlIHsgfVxyXG4iXX0=