@unifylib/ui-lib 1.1.64 → 1.1.67

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.
Files changed (38) hide show
  1. package/cli/generators/dashboard.js +147 -0
  2. package/cli/generators/form-screen.js +95 -0
  3. package/cli/generators/line-editor.js +110 -0
  4. package/cli/generators/permission-matrix.js +115 -0
  5. package/cli/generators/section-form.js +103 -0
  6. package/cli/generators/table-screen.js +181 -0
  7. package/cli/index.js +185 -0
  8. package/cli/utils.js +228 -0
  9. package/esm2022/lib/components/action-comment/action-comment.component.mjs +6 -5
  10. package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +8 -3
  11. package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +3 -3
  12. package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +11 -3
  13. package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +50 -4
  14. package/esm2022/lib/components/base-table/base-table.component.mjs +73 -9
  15. package/esm2022/lib/components/button-actions/button-actions.component.mjs +3 -3
  16. package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +3 -3
  17. package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +9 -4
  18. package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +20 -4
  19. package/esm2022/lib/components/paginator/paginator.component.mjs +26 -6
  20. package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +3 -3
  21. package/esm2022/lib/components/report-form/report-form.component.mjs +3 -3
  22. package/esm2022/lib/components/search-bar/search-bar.component.mjs +5 -4
  23. package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +3 -3
  24. package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +5 -3
  25. package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +3 -3
  26. package/esm2022/lib/components/title-bar/title-bar.component.mjs +3 -3
  27. package/fesm2022/iq-ui-lib.mjs +233 -72
  28. package/fesm2022/iq-ui-lib.mjs.map +1 -1
  29. package/fesm2022/unifylib-ui-lib.mjs +233 -72
  30. package/fesm2022/unifylib-ui-lib.mjs.map +1 -1
  31. package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +2 -0
  32. package/lib/components/auto-complete/auto-complete.component.d.ts +2 -1
  33. package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +4 -0
  34. package/lib/components/base-table/base-table.component.d.ts +10 -1
  35. package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +3 -1
  36. package/lib/components/paginator/paginator.component.d.ts +6 -1
  37. package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +2 -1
  38. package/package.json +1 -1
@@ -227,6 +227,14 @@ export class AutoCompleteComponent {
227
227
  this.myControl.patchValue(defaultValue, { emitEvent: true });
228
228
  }
229
229
  }
230
+ get matErrorDescribedBy() {
231
+ const control = this.form?.get(this.field?.property);
232
+ if (!control || !this.field?.property) {
233
+ return null;
234
+ }
235
+ const visible = (control.value || control.value === 0) && control.status === 'INVALID';
236
+ return visible ? `error-${this.field.property}` : null;
237
+ }
230
238
  getId() {
231
239
  return this.field.property;
232
240
  }
@@ -247,7 +255,7 @@ export class AutoCompleteComponent {
247
255
  }
248
256
  }
249
257
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AutoCompleteComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }, { token: 'secretsManager' }], target: i0.ɵɵFactoryTarget.Component }); }
250
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AutoCompleteComponent, isStandalone: true, selector: "app-auto-complete", inputs: { field: "field", form: "form", defaultValue: "defaultValue", readonly: "readonly", supportingAttributes: "supportingAttributes" }, outputs: { selectedValue: "selectedValue" }, viewQueries: [{ propertyName: "matACTrigger", first: true, predicate: ["autocompleteTrigger"], descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"field\" class=\"main-auto-complete\">\r\n <div class=\"mat-field-wrapper\" [formGroup]=\"form\">\r\n\r\n <div class=\"label-and-asterisk-container\">\r\n <span class=\"custom-label\" id=\"label-{{field.property}}\">\r\n {{ field.label! | translate }}\r\n </span>\r\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\r\n <span *ngIf=\"!field.required\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\r\n </div>\r\n\r\n <mat-form-field class=\"autocomplete-field\" appearance=\"outline\">\r\n <input type=\"text\"\r\n [placeholder]=\"'search_placeholder' | translate\"\r\n [id]=\"getId()\"\r\n [formControl]=\"myControl\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [matAutocomplete]=\"auto\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n matInput\r\n [required]=\"isRequired\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [readonly]=\"readonly\"\r\n >\r\n\r\n <button mat-button matSuffix\r\n color=\"primary\"\r\n class=\"autocomplete-button\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n [attr.id]=\"'autocomplete-trigger-' + field.property\">\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn.bind(this)\"\r\n (optionSelected)=\"itemSelected($event.option.value)\"\r\n (closed)=\"closed()\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngIf=\"items.length > 1 && lookupItems$\" [value]=\"null\">{{ \"none\" | translate }}</mat-option>\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\" [ngClass]=\"_allowSelection(item)\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n\r\n </div>\r\n</ng-container>\r\n", styles: [".main-auto-complete,.mat-field-wrapper{display:flex;flex-direction:column;width:100%}.label-and-asterisk-container{display:flex;align-items:center;gap:4px;margin-bottom:4px}.custom-label{font-weight:500}.required-asterisk{color:red}.optional-text{color:#9b9b9b;font-size:14px;font-weight:400}.autocomplete-field{width:100%;display:flex;align-items:center}.autocomplete-button{margin-left:4px}@media (max-width: 600px){.main-auto-complete,.mat-field-wrapper,.autocomplete-field{flex-direction:column;width:100%}.autocomplete-button{margin-left:0;margin-top:4px}}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] }); }
258
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AutoCompleteComponent, isStandalone: true, selector: "app-auto-complete", inputs: { field: "field", form: "form", defaultValue: "defaultValue", readonly: "readonly", supportingAttributes: "supportingAttributes" }, outputs: { selectedValue: "selectedValue" }, viewQueries: [{ propertyName: "matACTrigger", first: true, predicate: ["autocompleteTrigger"], descendants: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"field\" class=\"main-auto-complete\">\r\n <div class=\"mat-field-wrapper\" [formGroup]=\"form\">\r\n\r\n <div class=\"label-and-asterisk-container\">\r\n <span class=\"custom-label\" id=\"label-{{field.property}}\">\r\n {{ field.label! | translate }}\r\n </span>\r\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\r\n <span *ngIf=\"!field.required\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\r\n </div>\r\n\r\n <mat-form-field class=\"autocomplete-field\" appearance=\"outline\">\r\n <input type=\"text\"\r\n [placeholder]=\"'search_placeholder' | translate\"\r\n [id]=\"getId()\"\r\n [formControl]=\"myControl\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [matAutocomplete]=\"auto\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n matInput\r\n [required]=\"isRequired\"\r\n [attr.aria-labelledby]=\"'label-' + field.property\"\r\n [attr.aria-describedby]=\"matErrorDescribedBy\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [readonly]=\"readonly\"\r\n >\r\n\r\n <button mat-button matSuffix\r\n color=\"primary\"\r\n class=\"autocomplete-button\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n [attr.id]=\"'autocomplete-trigger-' + field.property\">\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn.bind(this)\"\r\n (optionSelected)=\"itemSelected($event.option.value)\"\r\n (closed)=\"closed()\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngIf=\"items.length > 1 && lookupItems$\" [value]=\"null\">{{ \"none\" | translate }}</mat-option>\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\" [ngClass]=\"_allowSelection(item)\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n <ng-content select=\"mat-error\"></ng-content>\r\n </mat-form-field>\r\n\r\n </div>\r\n</ng-container>\r\n", styles: [".main-auto-complete,.mat-field-wrapper{display:flex;flex-direction:column;width:100%}.label-and-asterisk-container{display:flex;align-items:center;gap:4px;margin-bottom:4px}.custom-label{font-weight:500}.required-asterisk{color:red}.optional-text{color:#9b9b9b;font-size:14px;font-weight:400}.autocomplete-field{width:100%;display:flex;align-items:center}.autocomplete-button{margin-left:4px}:host ::ng-deep .autocomplete-field .mat-mdc-form-field-icon-suffix{height:36px!important}:host ::ng-deep .autocomplete-field .mat-mdc-form-field-icon-suffix .autocomplete-button.mat-mdc-button{min-height:36px!important;height:36px!important;--mdc-text-button-container-height: 36px;line-height:36px}:host ::ng-deep .autocomplete-field .mat-mdc-form-field-icon-suffix .autocomplete-button .mat-mdc-button-touch-target{height:36px!important}@media (max-width: 600px){.main-auto-complete,.mat-field-wrapper,.autocomplete-field{flex-direction:column;width:100%}.autocomplete-button{margin-left:0;margin-top:4px}}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] }); }
251
259
  }
252
260
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AutoCompleteComponent, decorators: [{
253
261
  type: Component,
@@ -266,7 +274,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
266
274
  NgForOf,
267
275
  MatIconButton,
268
276
  MatButton,
269
- ], template: "<ng-container *ngIf=\"field\" class=\"main-auto-complete\">\r\n <div class=\"mat-field-wrapper\" [formGroup]=\"form\">\r\n\r\n <div class=\"label-and-asterisk-container\">\r\n <span class=\"custom-label\" id=\"label-{{field.property}}\">\r\n {{ field.label! | translate }}\r\n </span>\r\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\r\n <span *ngIf=\"!field.required\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\r\n </div>\r\n\r\n <mat-form-field class=\"autocomplete-field\" appearance=\"outline\">\r\n <input type=\"text\"\r\n [placeholder]=\"'search_placeholder' | translate\"\r\n [id]=\"getId()\"\r\n [formControl]=\"myControl\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [matAutocomplete]=\"auto\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n matInput\r\n [required]=\"isRequired\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [readonly]=\"readonly\"\r\n >\r\n\r\n <button mat-button matSuffix\r\n color=\"primary\"\r\n class=\"autocomplete-button\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n [attr.id]=\"'autocomplete-trigger-' + field.property\">\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn.bind(this)\"\r\n (optionSelected)=\"itemSelected($event.option.value)\"\r\n (closed)=\"closed()\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngIf=\"items.length > 1 && lookupItems$\" [value]=\"null\">{{ \"none\" | translate }}</mat-option>\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\" [ngClass]=\"_allowSelection(item)\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n\r\n </div>\r\n</ng-container>\r\n", styles: [".main-auto-complete,.mat-field-wrapper{display:flex;flex-direction:column;width:100%}.label-and-asterisk-container{display:flex;align-items:center;gap:4px;margin-bottom:4px}.custom-label{font-weight:500}.required-asterisk{color:red}.optional-text{color:#9b9b9b;font-size:14px;font-weight:400}.autocomplete-field{width:100%;display:flex;align-items:center}.autocomplete-button{margin-left:4px}@media (max-width: 600px){.main-auto-complete,.mat-field-wrapper,.autocomplete-field{flex-direction:column;width:100%}.autocomplete-button{margin-left:0;margin-top:4px}}\n"] }]
277
+ ], template: "<ng-container *ngIf=\"field\" class=\"main-auto-complete\">\r\n <div class=\"mat-field-wrapper\" [formGroup]=\"form\">\r\n\r\n <div class=\"label-and-asterisk-container\">\r\n <span class=\"custom-label\" id=\"label-{{field.property}}\">\r\n {{ field.label! | translate }}\r\n </span>\r\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\r\n <span *ngIf=\"!field.required\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\r\n </div>\r\n\r\n <mat-form-field class=\"autocomplete-field\" appearance=\"outline\">\r\n <input type=\"text\"\r\n [placeholder]=\"'search_placeholder' | translate\"\r\n [id]=\"getId()\"\r\n [formControl]=\"myControl\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [matAutocomplete]=\"auto\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n matInput\r\n [required]=\"isRequired\"\r\n [attr.aria-labelledby]=\"'label-' + field.property\"\r\n [attr.aria-describedby]=\"matErrorDescribedBy\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [readonly]=\"readonly\"\r\n >\r\n\r\n <button mat-button matSuffix\r\n color=\"primary\"\r\n class=\"autocomplete-button\"\r\n (click)=\"autocompleteTrigger.openPanel(); filterLookupItems('', autocompleteTrigger); $event.stopPropagation()\"\r\n [attr.id]=\"'autocomplete-trigger-' + field.property\">\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn.bind(this)\"\r\n (optionSelected)=\"itemSelected($event.option.value)\"\r\n (closed)=\"closed()\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngIf=\"items.length > 1 && lookupItems$\" [value]=\"null\">{{ \"none\" | translate }}</mat-option>\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\" [ngClass]=\"_allowSelection(item)\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n <ng-content select=\"mat-error\"></ng-content>\r\n </mat-form-field>\r\n\r\n </div>\r\n</ng-container>\r\n", styles: [".main-auto-complete,.mat-field-wrapper{display:flex;flex-direction:column;width:100%}.label-and-asterisk-container{display:flex;align-items:center;gap:4px;margin-bottom:4px}.custom-label{font-weight:500}.required-asterisk{color:red}.optional-text{color:#9b9b9b;font-size:14px;font-weight:400}.autocomplete-field{width:100%;display:flex;align-items:center}.autocomplete-button{margin-left:4px}:host ::ng-deep .autocomplete-field .mat-mdc-form-field-icon-suffix{height:36px!important}:host ::ng-deep .autocomplete-field .mat-mdc-form-field-icon-suffix .autocomplete-button.mat-mdc-button{min-height:36px!important;height:36px!important;--mdc-text-button-container-height: 36px;line-height:36px}:host ::ng-deep .autocomplete-field .mat-mdc-form-field-icon-suffix .autocomplete-button .mat-mdc-button-touch-target{height:36px!important}@media (max-width: 600px){.main-auto-complete,.mat-field-wrapper,.autocomplete-field{flex-direction:column;width:100%}.autocomplete-button{margin-left:0;margin-top:4px}}\n"] }]
270
278
  }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }, { type: undefined, decorators: [{
271
279
  type: Inject,
272
280
  args: ['secretsManager']
@@ -289,4 +297,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
289
297
  type: ViewChild,
290
298
  args: [MatAutocompleteTrigger]
291
299
  }] } });
292
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFZLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xHLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd2RixPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyxjQUFj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OlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0ZpZWxkSW5mbywgRmlsdGVyLCBMb29rdXBJdGVtfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbFwiO1xyXG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgTWF0T3B0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2Z9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmFja2VuZFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlc1wiO1xyXG5pbXBvcnQge0dldEl0ZW1zTGlzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZ2V0LWl0ZW1zLWxpc3RcIjtcclxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQge01hdElucHV0TW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcclxuaW1wb3J0IHtBc3luY1BpcGUsIE5nQ2xhc3MsIE5nRm9yT2YsIE5nSWZ9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge2J1aWxkSXRlbXNMaXN0fSBmcm9tIFwiLi4vLi4vdXRpbHMvYmFzZS11dGlsc1wiO1xyXG5pbXBvcnQge1JlcXVpcmVNYXRjaH0gZnJvbSBcIi4uLy4uL3ZhbGlkYXRvcnNcIjtcclxuaW1wb3J0IHtNYXRCdXR0b24sIE1hdEljb25CdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWF1dG8tY29tcGxldGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcixcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIE5nSWYsXHJcbiAgICBNYXRBdXRvY29tcGxldGUsXHJcbiAgICBBc3luY1BpcGUsXHJcbiAgICBNYXRPcHRpb24sXHJcbiAgICBOZ0NsYXNzLFxyXG4gICAgTWF0SWNvbixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRJY29uQnV0dG9uLFxyXG4gICAgTWF0QnV0dG9uLFxyXG5cclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXV0by1jb21wbGV0ZS5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0b0NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZVRyaWdnZXInKSBtYXRBQ1RyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XHJcblxyXG4gIGxvb2t1cEl0ZW1zJDogT2JzZXJ2YWJsZTxMb29rdXBJdGVtW10+IHwgdW5kZWZpbmVkO1xyXG4gIGxvb2t1cEl0ZW1zOiBMb29rdXBJdGVtW10gPSBbXTtcclxuICBpdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICAvLyBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIEBJbnB1dCgpLy8gQHRzLWlnbm9yZVxyXG4gIGZpZWxkOiBGaWVsZEluZm87XHJcblxyXG4gIEBJbnB1dCgpLy8gQHRzLWlnbm9yZVxyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBkZWZhdWx0VmFsdWU6IGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICByZWFkb25seTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc3VwcG9ydGluZ0F0dHJpYnV0ZXM6IGFueTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWRWYWx1ZTogRXZlbnRFbWl0dGVyPExvb2t1cEl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIGF1dG9jb21wbGV0ZVRyaWdnZXIhOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuICBxdWVzdGlvbiA9ICdXb3VsZCB5b3UgbGlrZSB0byBhZGQgP1wiJztcclxuICBjYXNjYWRlZElkOiBudW1iZXIgPSAwO1xyXG4gIGlzUmVxdWlyZWQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHRpbWVyOiBhbnk7XHJcbiAgbXlDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoJ3NlY3JldHNNYW5hZ2VyJykgcHJpdmF0ZSBzZWNyZXRzTWFuYWdlcjogYW55KSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYnVpbGRDb250cm9sKCk7XHJcbiAgICB0aGlzLmV4dHJhY3RXb3JrZmxvd0d1aWRlZENhc2NhZGluZygpO1xyXG4gICAgdGhpcy5nZXRMb29rdXBEYXRhKCk7XHJcbiAgICAvLyB0aGlzLm15Q29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgLy8gICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHRoaXMuZmlsdGVyTG9va3VwSXRlbXModiwgbnVsbCk7XHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgIGlmICh4Py5pZCA9PT0gLTEwMCkge1xyXG4gICAgICAgIHRoaXMubXlDb250cm9sLnJlc2V0KClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkpIHtcclxuICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmNhc2NhZGVkQnlQcm9wZXJ0eSk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXNjYWRlZElkID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmNhc2NhZGVkQnlQcm9wZXJ0eSkudmFsdWU/LmlkO1xyXG4gICAgICAgIHRoaXMubG9va3VwSXRlbXMgPSBbXTtcclxuICAgICAgICB0aGlzLm15Q29udHJvbC5zZXRWYWx1ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgIHRoaXMubXlDb250cm9sLnBhdGNoVmFsdWUodW5kZWZpbmVkLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLnByb3BlcnR5KT8uc2V0VmFsdWUodW5kZWZpbmVkKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5wYXRjaFZhbHVlKHVuZGVmaW5lZCwge2VtaXRFdmVudDogdHJ1ZX0pO1xyXG4gICAgICAgIHRoaXMuZ2V0TG9va3VwRGF0YSgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4dHJhY3RXb3JrZmxvd0d1aWRlZENhc2NhZGluZygpIHtcclxuICAgIGlmICh0aGlzLnN1cHBvcnRpbmdBdHRyaWJ1dGVzICYmIHRoaXMuZmllbGQud29ya2Zsb3dDYXNjYWRpbmdGaWVsZCAmJiB0aGlzLnN1cHBvcnRpbmdBdHRyaWJ1dGVzW3RoaXMuZmllbGQud29ya2Zsb3dDYXNjYWRpbmdGaWVsZF0pIHtcclxuICAgICAgdGhpcy5jYXNjYWRlZElkID0gdGhpcy5zdXBwb3J0aW5nQXR0cmlidXRlc1t0aGlzLmZpZWxkLndvcmtmbG93Q2FzY2FkaW5nRmllbGRdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZENvbnRyb2woKSB7XHJcbiAgICB0aGlzLm15Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCh0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZmllbGQ/LnByb3BlcnR5XSk7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmZpZWxkQWN0aW9uJC5zdWJzY3JpYmUoIGUgPT4ge1xyXG4gICAgICBpZiAoZS5wcm9wZXJ0eSA9PT0gdGhpcy5maWVsZD8ucHJvcGVydHkpIHtcclxuICAgICAgICB0aGlzLmZpZWxkLnJlYWRvbmx5ID0gZS5maWVsZEluZm8ucmVhZG9ubHk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBdHRyaWJ1dGVzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVBdHRyaWJ1dGVzKCk7XHJcblxyXG4gICAgdGhpcy5teUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSggdiA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xyXG4gICAgICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckxvb2t1cEl0ZW1zKHYsIG51bGwpOyB9LCA3MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQXR0cmlidXRlcygpIHtcclxuICAgIHRoaXMubXlDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQucmVhZG9ubHkpIHtcclxuICAgICAgdGhpcy5teUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICB0aGlzLmlzUmVxdWlyZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZC5yZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZmllbGQ/LnByb3BlcnR5XS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgIHRoaXMubXlDb250cm9sLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZmllbGQuYWNjZXB0TmV3SXRlbSkge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMubXlDb250cm9sLnNldFZhbGlkYXRvcnMoUmVxdWlyZU1hdGNoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm15Q29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm0/LmdldCh0aGlzLmZpZWxkPy5wcm9wZXJ0eSk/LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKHtkZWZhdWx0VmFsdWV9OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUoZGVmYXVsdFZhbHVlPy5jdXJyZW50VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMb29rdXBEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSAmJiAhdGhpcy5jYXNjYWRlZElkKSB7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsaXN0SXRlbXMgPSBidWlsZEl0ZW1zTGlzdCgnJywgdGhpcy5maWVsZC5sb29rdXBBcGlQYXRoLCB0aGlzLmZpZWxkLmNhc2NhZGVkQnkpO1xyXG4gICAgICBsaXN0SXRlbXMuY29sdW1ucyA9IFsnaWQnLCdjb2RlJywnZW5nbGlzaE5hbWUnLCdhcmFiaWNOYW1lJ107XHJcblxyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldExvb2t1cEl0ZW1zQnlGaWx0ZXIobGlzdEl0ZW1zLCB0aGlzLmNhc2NhZGVkSWQpLnN1YnNjcmliZSgocmVzcCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3AudmFsaWQpIHtcclxuICAgICAgICAgIHRoaXMubG9va3VwSXRlbXMgPSByZXNwLmJvZHk7XHJcbiAgICAgICAgICB0aGlzLmxvb2t1cEl0ZW1zID0gW107XHJcbiAgICAgICAgICByZXNwLmJvZHkuZm9yRWFjaCgocjogTG9va3VwSXRlbSkgPT4gdGhpcy5sb29rdXBJdGVtcy5wdXNoKHIpKTtcclxuICAgICAgICAgIGlmICghdGhpcy5mb3JtPy5nZXQoJ2lkJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hMb29rdXBWYWx1ZSh0aGlzLmxvb2t1cEl0ZW1zPy5maW5kKGwgPT4gbC5kZWZhdWx0VmFsdWUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucGF0Y2hMb29rdXBWYWx1ZSh0aGlzLm15Q29udHJvbC52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXRlbVNlbGVjdGVkKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5pZCAhPT0gLTEpIHtcclxuICAgICAgaWYgKHZhbHVlLmVuZ2xpc2hOYW1lLmluZGV4T2YodGhpcy5xdWVzdGlvbikgPT09IDApIHtcclxuICAgICAgICB2YWx1ZS5lbmdsaXNoTmFtZSA9IHZhbHVlLmVuZ2xpc2hOYW1lLnN1YnN0cmluZyh0aGlzLnF1ZXN0aW9uLmxlbmd0aCkuc3BsaXQoJ1wiPycpWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWx1ZS5hcmFiaWNOYW1lICYmIHZhbHVlLmFyYWJpY05hbWUuaW5kZXhPZih0aGlzLnF1ZXN0aW9uKSA9PT0gMCkge1xyXG4gICAgICAgIHZhbHVlLmFyYWJpY05hbWUgPSB2YWx1ZS5hcmFiaWNOYW1lLnN1YnN0cmluZyh0aGlzLnF1ZXN0aW9uLmxlbmd0aCkuc3BsaXQoJ1wiPycpWzBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5wcm9wZXJ0eSk/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUuZW1pdCh0aGlzLm15Q29udHJvbC52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGRpc3BsYXlGbihzZWxlY3RlZDogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChzZWxlY3RlZD8uaWQgPCAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkKSlcclxuICAgICAgc2VsZWN0ZWQgPSB0aGlzLmRlZmF1bHRWYWx1ZVxyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXREZWZhdWx0TGFuZygpID09PSAnZW4nXHJcbiAgICAgID8gc2VsZWN0ZWQ/LmVuZ2xpc2hOYW1lXHJcbiAgICAgIDogc2VsZWN0ZWQ/LmFyYWJpY05hbWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgX2FsbG93U2VsZWN0aW9uKG9wdGlvbjogTG9va3VwSXRlbSk6IHsgW2NsYXNzTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdwcmV2ZW50LXNlbGVjdGlvbic6IG9wdGlvbi5pZCA9PT0gLTEsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaXRlbU5hbWVCeUxhZyhpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXREZWZhdWx0TGFuZygpID09PSAnZW4nID8gaXRlbS5lbmdsaXNoTmFtZSA6IGl0ZW0uYXJhYmljTmFtZVxyXG5cclxuICB9XHJcblxyXG4gIGZpbHRlckxvb2t1cEl0ZW1zKG5hbWU6IGFueSwgdHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcikge1xyXG4gICAgaWYgKHRoaXMubXlDb250cm9sLmVuYWJsZWQpIHtcclxuICAgICAgaWYgKHRyaWdnZXIpIHtcclxuICAgICAgICB0cmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBuYW1lID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuYW1lID09PSAnJyAmJiAhdGhpcy5teUNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICB0aGlzLm15Q29udHJvbC5zZXRWYWx1ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgIHRoaXMubXlDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbGlzdEl0ZW1zOiBHZXRJdGVtc0xpc3QgPSBidWlsZEl0ZW1zTGlzdChuYW1lLCB0aGlzLmZpZWxkLmxvb2t1cEFwaVBhdGgsIHRoaXMuZmllbGQuY2FzY2FkZWRCeSk7XHJcbiAgICAgIGxpc3RJdGVtcy5maWx0ZXJzID0gdGhpcy5maWVsZC5sb29rdXBGaWx0ZXJMaXN0O1xyXG4gICAgICB0aGlzLmFkZExvb2t1cEZpbHRlckJ5QW5vdGhlclByb3BlcnRpZXMobGlzdEl0ZW1zKTtcclxuICAgICAgbGlzdEl0ZW1zLmNvbHVtbnMgPSBbJ2lkJywnY29kZScsJ2VuZ2xpc2hOYW1lJywnYXJhYmljTmFtZSddO1xyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldExvb2t1cEl0ZW1zQnlGaWx0ZXIobGlzdEl0ZW1zKTtcclxuICAgICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSkge1xyXG4gICAgICAgIHRoaXMuY2FzY2FkZWRJZCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5jYXNjYWRlZEJ5UHJvcGVydHkpLnZhbHVlPy5pZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmV4dHJhY3RXb3JrZmxvd0d1aWRlZENhc2NhZGluZygpO1xyXG4gICAgICB9XHJcbiAgICAgIGxpc3RJdGVtcy5jb2x1bW5zID0gWydpZCcsJ2NvZGUnLCdlbmdsaXNoTmFtZScsJ2FyYWJpY05hbWUnXTtcclxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRMb29rdXBJdGVtc0J5RmlsdGVyKGxpc3RJdGVtcywgdGhpcy5jYXNjYWRlZElkKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3AudmFsaWQpIHtcclxuICAgICAgICAgIHRoaXMuaXRlbXMgPSByZXNwLmJvZHkuZmlsdGVyKChpdGVtOiB7IGlkOiBhbnk7IH0pID0+IHRoaXMubXlDb250cm9sLnZhbHVlPy5pZCAhPT0gaXRlbS5pZCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpZWxkLmFjY2VwdE5ld0l0ZW0gP1xyXG4gICAgICAgICAgICAgIHRoaXMuaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMiwgZW5nbGlzaE5hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lLCBhcmFiaWNOYW1lOiB0aGlzLnF1ZXN0aW9uICsgbmFtZX0pKSA6XHJcbiAgICAgICAgICAgICAgdGhpcy5pdGVtcz8ucHVzaChuZXcgTG9va3VwSXRlbSh7aWQ6IC0xLCBlbmdsaXNoTmFtZTogJ05vIG1hdGNoIC4uLicsIGFyYWJpY05hbWU6ICfYutmK2LEg2YXZiNis2YjYryAgLi4uICd9KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0aGlzLml0ZW1zPy5sZW5ndGggPT0gMClcclxuICAgICAgICAgIHRoaXMuZmllbGQuYWNjZXB0TmV3SXRlbSAmJiB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeSkudmFsdWUgIT0gbnVsbCA/XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMiwgZW5nbGlzaE5hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lLCBhcmFiaWNOYW1lOiB0aGlzLnF1ZXN0aW9uICsgbmFtZX0pKSA6XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvb2t1cEl0ZW1zJCA9IG9mKHRoaXMuaXRlbXMpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkTG9va3VwRmlsdGVyQnlBbm90aGVyUHJvcGVydGllcyhsaXN0SXRlbXM6IEdldEl0ZW1zTGlzdCkge1xyXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuZmllbGQubG9va3VwRmlsdGVyTGlzdDtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG5ld0ZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuZm9ybT8udmFsdWU/Lltwcm9wLmZpZWxkTmFtZV07XHJcbiAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcgJiYgZmllbGRWYWx1ZSAhPT0gbnVsbCA/IGZpZWxkVmFsdWUuY29kZSA6IGZpZWxkVmFsdWU7XHJcbiAgICAgIGlmICghZmluYWxWYWx1ZSkgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPXR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJiBmaWVsZFZhbHVlICE9PSBudWxsID8gcHJvcC5maWVsZE5hbWUgKyBcIi5cIiArIHRoaXMuZmllbGQuZmxhdHRlbkJ5U3ViQXR0cmlidXRlIDogcHJvcC5maWVsZE5hbWU7XHJcbiAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgIGZpZWxkVHlwZTogJ0ZJTEVEX0ZJTFRFUicsXHJcbiAgICAgICAgZmlsdGVyVHlwZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIG9wZXJhdG9yOiBwcm9wLm9wZXJhdG9yLFxyXG4gICAgICAgIHZhbHVlT2JqZWN0OiBmaW5hbFZhbHVlLFxyXG4gICAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbmV3RmlsdGVycy5wdXNoKGZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5ld0ZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgIGxpc3RJdGVtcy5maWx0ZXJzID0gWy4uLihsaXN0SXRlbXMuZmlsdGVycyB8fCBbXSksIC4uLm5ld0ZpbHRlcnNdO1xyXG4gICAgfVxyXG4gICAgbGlzdEl0ZW1zLmZpbHRlcnMgPSBsaXN0SXRlbXMuZmlsdGVycy5maWx0ZXIoZiA9PiBmLnZhbHVlT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGF0Y2hMb29rdXBWYWx1ZShkZWZhdWx0VmFsdWU6IGFueSkge1xyXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xyXG5cclxuICAgICAgLy8gdGhpcy5mb3JtPy5nZXQodGhpcy5maWVsZC5wcm9wZXJ0eSk/LnBhdGNoVmFsdWUoZGVmYXVsdFZhbHVlKTtcclxuICAgICAgdGhpcy5teUNvbnRyb2wuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTtcclxuICAgICAgdGhpcy5teUNvbnRyb2wucGF0Y2hWYWx1ZShkZWZhdWx0VmFsdWUsIHtlbWl0RXZlbnQ6IHRydWV9KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wZXJ0eTtcclxuICB9XHJcbiAgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyTG9va3VwSXRlbXMoJycsIGF1dG9jb21wbGV0ZVRyaWdnZXIpO1xyXG4gICAgICBhdXRvY29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VkKCkge1xyXG4gICAgaWYgKCF0aGlzLm15Q29udHJvbC52YWx1ZSl7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5wcm9wZXJ0eSk/LnNldFZhbHVlKHRoaXMubXlDb250cm9sLnZhbHVlKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlLmVtaXQodGhpcy5teUNvbnRyb2wudmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5teUNvbnRyb2wudmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMubXlDb250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGRcIiBjbGFzcz1cIm1haW4tYXV0by1jb21wbGV0ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtYXQtZmllbGQtd3JhcHBlclwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cclxuICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJhdXRvY29tcGxldGUtZmllbGRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidzZWFyY2hfcGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgIFtpZF09XCJnZXRJZCgpXCJcclxuICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJteUNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudCwgYXV0b2NvbXBsZXRlVHJpZ2dlcilcIlxyXG4gICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgICAgICAgIChjbGljayk9XCJhdXRvY29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpOyBmaWx0ZXJMb29rdXBJdGVtcygnJywgYXV0b2NvbXBsZXRlVHJpZ2dlcik7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgI2F1dG9jb21wbGV0ZVRyaWdnZXI9XCJtYXRBdXRvY29tcGxldGVUcmlnZ2VyXCJcclxuICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgID5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImF1dG9jb21wbGV0ZVRyaWdnZXIub3BlblBhbmVsKCk7IGZpbHRlckxvb2t1cEl0ZW1zKCcnLCBhdXRvY29tcGxldGVUcmlnZ2VyKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCInYXV0b2NvbXBsZXRlLXRyaWdnZXItJyArIGZpZWxkLnByb3BlcnR5XCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiBhdXRvQWN0aXZlRmlyc3RPcHRpb24gW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGbi5iaW5kKHRoaXMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIml0ZW1TZWxlY3RlZCgkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZWQpPVwiY2xvc2VkKClcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLnJlYWRvbmx5XCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIml0ZW1zLmxlbmd0aCA+IDEgJiYgbG9va3VwSXRlbXMkXCIgW3ZhbHVlXT1cIm51bGxcIj57eyBcIm5vbmVcIiB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxvb2t1cEl0ZW1zJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiBbbmdDbGFzc109XCJfYWxsb3dTZWxlY3Rpb24oaXRlbSlcIj5cclxuICAgICAgICAgICAge3sgaXRlbU5hbWVCeUxhZyhpdGVtKSB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFZLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xHLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd2RixPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyxjQUFj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QkFDZixrQkFBa0I7d0JBQ2xCLHNCQUFzQjt3QkFDdEIsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLElBQUk7d0JBQ0osZUFBZTt3QkFDZixTQUFTO3dCQUNULFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxPQUFPO3dCQUNQLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixTQUFTO3FCQUVWOzswQkEwQ1ksTUFBTTsyQkFBQyxnQkFBZ0I7eUNBckNGLFlBQVk7c0JBQTdDLFNBQVM7dUJBQUMscUJBQXFCO2dCQVVoQyxLQUFLO3NCQURKLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxLQUFLO2dCQUdOLFlBQVk7c0JBRFgsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLGFBQWE7c0JBRFosTUFBTTtnQkFHNEIsbUJBQW1CO3NCQUFyRCxTQUFTO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtGaWVsZEluZm8sIEZpbHRlciwgTG9va3VwSXRlbX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsIE1hdE9wdGlvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZVwiO1xyXG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnN9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXNcIjtcclxuaW1wb3J0IHtHZXRJdGVtc0xpc3R9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2dldC1pdGVtcy1saXN0XCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge01hdEZvcm1GaWVsZE1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHtNYXRJbnB1dE1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XHJcbmltcG9ydCB7QXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0Zvck9mLCBOZ0lmfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtidWlsZEl0ZW1zTGlzdH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtSZXF1aXJlTWF0Y2h9IGZyb20gXCIuLi8uLi92YWxpZGF0b3JzXCI7XHJcbmltcG9ydCB7TWF0QnV0dG9uLCBNYXRJY29uQnV0dG9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1hdXRvLWNvbXBsZXRlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBOZ0lmLFxyXG4gICAgTWF0QXV0b2NvbXBsZXRlLFxyXG4gICAgQXN5bmNQaXBlLFxyXG4gICAgTWF0T3B0aW9uLFxyXG4gICAgTmdDbGFzcyxcclxuICAgIE1hdEljb24sXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgTWF0SWNvbkJ1dHRvbixcclxuICAgIE1hdEJ1dHRvbixcclxuXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2F1dG8tY29tcGxldGUuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBAVmlld0NoaWxkKCdhdXRvY29tcGxldGVUcmlnZ2VyJykgbWF0QUNUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuICBsb29rdXBJdGVtcyQ6IE9ic2VydmFibGU8TG9va3VwSXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuICBsb29rdXBJdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcbiAgaXRlbXM6IExvb2t1cEl0ZW1bXSA9IFtdO1xyXG5cclxuICAvLyBAdHMtaWdub3JlXHJcbiAgLy8gZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBmaWVsZDogRmllbGRJbmZvO1xyXG5cclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgZGVmYXVsdFZhbHVlOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcmVhZG9ubHk6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHN1cHBvcnRpbmdBdHRyaWJ1dGVzOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkVmFsdWU6IEV2ZW50RW1pdHRlcjxMb29rdXBJdGVtPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSBhdXRvY29tcGxldGVUcmlnZ2VyITogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuXHJcbiAgcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdG8gYWRkID9cIic7XHJcbiAgY2FzY2FkZWRJZDogbnVtYmVyID0gMDtcclxuICBpc1JlcXVpcmVkOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG4gIG15Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhY2tlbmRTZXJ2aWNlOiBCYWNrZW5kU2VydmljZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICAgICAgICBASW5qZWN0KCdzZWNyZXRzTWFuYWdlcicpIHByaXZhdGUgc2VjcmV0c01hbmFnZXI6IGFueSkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1aWxkQ29udHJvbCgpO1xyXG4gICAgdGhpcy5leHRyYWN0V29ya2Zsb3dHdWlkZWRDYXNjYWRpbmcoKTtcclxuICAgIHRoaXMuZ2V0TG9va3VwRGF0YSgpO1xyXG4gICAgLy8gdGhpcy5teUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcclxuICAgIC8vICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB0aGlzLmZpbHRlckxvb2t1cEl0ZW1zKHYsIG51bGwpO1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLnByb3BlcnR5KS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICBpZiAoeD8uaWQgPT09IC0xMDApIHtcclxuICAgICAgICB0aGlzLm15Q29udHJvbC5yZXNldCgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAodGhpcy5maWVsZC5jYXNjYWRlZEJ5KSB7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5jYXNjYWRlZEJ5UHJvcGVydHkpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FzY2FkZWRJZCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5jYXNjYWRlZEJ5UHJvcGVydHkpLnZhbHVlPy5pZDtcclxuICAgICAgICB0aGlzLmxvb2t1cEl0ZW1zID0gW107XHJcbiAgICAgICAgdGhpcy5teUNvbnRyb2wuc2V0VmFsdWUodW5kZWZpbmVkKTtcclxuICAgICAgICB0aGlzLm15Q29udHJvbC5wYXRjaFZhbHVlKHVuZGVmaW5lZCwge2VtaXRFdmVudDogdHJ1ZX0pO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5wcm9wZXJ0eSk/LnNldFZhbHVlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLnByb3BlcnR5KT8ucGF0Y2hWYWx1ZSh1bmRlZmluZWQsIHtlbWl0RXZlbnQ6IHRydWV9KTtcclxuICAgICAgICB0aGlzLmdldExvb2t1cERhdGEoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleHRyYWN0V29ya2Zsb3dHdWlkZWRDYXNjYWRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5zdXBwb3J0aW5nQXR0cmlidXRlcyAmJiB0aGlzLmZpZWxkLndvcmtmbG93Q2FzY2FkaW5nRmllbGQgJiYgdGhpcy5zdXBwb3J0aW5nQXR0cmlidXRlc1t0aGlzLmZpZWxkLndvcmtmbG93Q2FzY2FkaW5nRmllbGRdKSB7XHJcbiAgICAgIHRoaXMuY2FzY2FkZWRJZCA9IHRoaXMuc3VwcG9ydGluZ0F0dHJpYnV0ZXNbdGhpcy5maWVsZC53b3JrZmxvd0Nhc2NhZGluZ0ZpZWxkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRDb250cm9sKCkge1xyXG4gICAgdGhpcy5teUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmZpZWxkPy5wcm9wZXJ0eV0pO1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5maWVsZEFjdGlvbiQuc3Vic2NyaWJlKCBlID0+IHtcclxuICAgICAgaWYgKGUucHJvcGVydHkgPT09IHRoaXMuZmllbGQ/LnByb3BlcnR5KSB7XHJcbiAgICAgICAgdGhpcy5maWVsZC5yZWFkb25seSA9IGUuZmllbGRJbmZvLnJlYWRvbmx5O1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXR0cmlidXRlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlQXR0cmlidXRlcygpO1xyXG5cclxuICAgIHRoaXMubXlDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoIHYgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcclxuICAgICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJMb29rdXBJdGVtcyh2LCBudWxsKTsgfSwgNzAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUF0dHJpYnV0ZXMoKSB7XHJcbiAgICB0aGlzLm15Q29udHJvbC5lbmFibGUoKTtcclxuICAgIGlmICh0aGlzLmZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICAgIHRoaXMubXlDb250cm9sLmRpc2FibGUoKTtcclxuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGQucmVxdWlyZWQpIHtcclxuICAgICAgdGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmZpZWxkPy5wcm9wZXJ0eV0uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG4gICAgICB0aGlzLm15Q29udHJvbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgIHRoaXMuaXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmZpZWxkLmFjY2VwdE5ld0l0ZW0pIHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLm15Q29udHJvbC5zZXRWYWxpZGF0b3JzKFJlcXVpcmVNYXRjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5teUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtPy5nZXQodGhpcy5maWVsZD8ucHJvcGVydHkpPy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyh7ZGVmYXVsdFZhbHVlfTogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5wYXRjaExvb2t1cFZhbHVlKGRlZmF1bHRWYWx1ZT8uY3VycmVudFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TG9va3VwRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkgJiYgIXRoaXMuY2FzY2FkZWRJZCkge1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbGlzdEl0ZW1zID0gYnVpbGRJdGVtc0xpc3QoJycsIHRoaXMuZmllbGQubG9va3VwQXBpUGF0aCwgdGhpcy5maWVsZC5jYXNjYWRlZEJ5KTtcclxuICAgICAgbGlzdEl0ZW1zLmNvbHVtbnMgPSBbJ2lkJywnY29kZScsJ2VuZ2xpc2hOYW1lJywnYXJhYmljTmFtZSddO1xyXG5cclxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRMb29rdXBJdGVtc0J5RmlsdGVyKGxpc3RJdGVtcywgdGhpcy5jYXNjYWRlZElkKS5zdWJzY3JpYmUoKHJlc3AgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvb2t1cEl0ZW1zID0gcmVzcC5ib2R5O1xyXG4gICAgICAgICAgdGhpcy5sb29rdXBJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgcmVzcC5ib2R5LmZvckVhY2goKHI6IExvb2t1cEl0ZW0pID0+IHRoaXMubG9va3VwSXRlbXMucHVzaChyKSk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZm9ybT8uZ2V0KCdpZCcpPy52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUodGhpcy5sb29rdXBJdGVtcz8uZmluZChsID0+IGwuZGVmYXVsdFZhbHVlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUodGhpcy5teUNvbnRyb2wudmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGl0ZW1TZWxlY3RlZCh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuaWQgIT09IC0xKSB7XHJcbiAgICAgIGlmICh2YWx1ZS5lbmdsaXNoTmFtZS5pbmRleE9mKHRoaXMucXVlc3Rpb24pID09PSAwKSB7XHJcbiAgICAgICAgdmFsdWUuZW5nbGlzaE5hbWUgPSB2YWx1ZS5lbmdsaXNoTmFtZS5zdWJzdHJpbmcodGhpcy5xdWVzdGlvbi5sZW5ndGgpLnNwbGl0KCdcIj8nKVswXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsdWUuYXJhYmljTmFtZSAmJiB2YWx1ZS5hcmFiaWNOYW1lLmluZGV4T2YodGhpcy5xdWVzdGlvbikgPT09IDApIHtcclxuICAgICAgICB2YWx1ZS5hcmFiaWNOYW1lID0gdmFsdWUuYXJhYmljTmFtZS5zdWJzdHJpbmcodGhpcy5xdWVzdGlvbi5sZW5ndGgpLnNwbGl0KCdcIj8nKVswXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlLmVtaXQodGhpcy5teUNvbnRyb2wudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlci5jbG9zZVBhbmVsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBkaXNwbGF5Rm4oc2VsZWN0ZWQ6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoc2VsZWN0ZWQ/LmlkIDwgMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpXHJcbiAgICAgIHNlbGVjdGVkID0gdGhpcy5kZWZhdWx0VmFsdWVcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0RGVmYXVsdExhbmcoKSA9PT0gJ2VuJ1xyXG4gICAgICA/IHNlbGVjdGVkPy5lbmdsaXNoTmFtZVxyXG4gICAgICA6IHNlbGVjdGVkPy5hcmFiaWNOYW1lO1xyXG4gIH1cclxuXHJcblxyXG4gIF9hbGxvd1NlbGVjdGlvbihvcHRpb246IExvb2t1cEl0ZW0pOiB7IFtjbGFzc05hbWU6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAncHJldmVudC1zZWxlY3Rpb24nOiBvcHRpb24uaWQgPT09IC0xLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGl0ZW1OYW1lQnlMYWcoaXRlbTogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0RGVmYXVsdExhbmcoKSA9PT0gJ2VuJyA/IGl0ZW0uZW5nbGlzaE5hbWUgOiBpdGVtLmFyYWJpY05hbWVcclxuXHJcbiAgfVxyXG5cclxuICBmaWx0ZXJMb29rdXBJdGVtcyhuYW1lOiBhbnksIHRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIHtcclxuICAgIGlmICh0aGlzLm15Q29udHJvbC5lbmFibGVkKSB7XHJcbiAgICAgIGlmICh0cmlnZ2VyKSB7XHJcbiAgICAgICAgdHJpZ2dlci5vcGVuUGFuZWwoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbmFtZSA9ICcnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmFtZSA9PT0gJycgJiYgIXRoaXMubXlDb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5teUNvbnRyb2wuc2V0VmFsdWUodW5kZWZpbmVkKTtcclxuICAgICAgICB0aGlzLm15Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGxpc3RJdGVtczogR2V0SXRlbXNMaXN0ID0gYnVpbGRJdGVtc0xpc3QobmFtZSwgdGhpcy5maWVsZC5sb29rdXBBcGlQYXRoLCB0aGlzLmZpZWxkLmNhc2NhZGVkQnkpO1xyXG4gICAgICBsaXN0SXRlbXMuZmlsdGVycyA9IHRoaXMuZmllbGQubG9va3VwRmlsdGVyTGlzdDtcclxuICAgICAgdGhpcy5hZGRMb29rdXBGaWx0ZXJCeUFub3RoZXJQcm9wZXJ0aWVzKGxpc3RJdGVtcyk7XHJcbiAgICAgIGxpc3RJdGVtcy5jb2x1bW5zID0gWydpZCcsJ2NvZGUnLCdlbmdsaXNoTmFtZScsJ2FyYWJpY05hbWUnXTtcclxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRMb29rdXBJdGVtc0J5RmlsdGVyKGxpc3RJdGVtcyk7XHJcbiAgICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkpIHtcclxuICAgICAgICB0aGlzLmNhc2NhZGVkSWQgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeVByb3BlcnR5KS52YWx1ZT8uaWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5leHRyYWN0V29ya2Zsb3dHdWlkZWRDYXNjYWRpbmcoKTtcclxuICAgICAgfVxyXG4gICAgICBsaXN0SXRlbXMuY29sdW1ucyA9IFsnaWQnLCdjb2RlJywnZW5nbGlzaE5hbWUnLCdhcmFiaWNOYW1lJ107XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZ2V0TG9va3VwSXRlbXNCeUZpbHRlcihsaXN0SXRlbXMsIHRoaXMuY2FzY2FkZWRJZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zID0gcmVzcC5ib2R5LmZpbHRlcigoaXRlbTogeyBpZDogYW55OyB9KSA9PiB0aGlzLm15Q29udHJvbC52YWx1ZT8uaWQgIT09IGl0ZW0uaWQpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLml0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5maWVsZC5hY2NlcHROZXdJdGVtID9cclxuICAgICAgICAgICAgICB0aGlzLml0ZW1zPy5wdXNoKG5ldyBMb29rdXBJdGVtKHtpZDogLTIsIGVuZ2xpc2hOYW1lOiB0aGlzLnF1ZXN0aW9uICsgbmFtZSwgYXJhYmljTmFtZTogdGhpcy5xdWVzdGlvbiArIG5hbWV9KSkgOlxyXG4gICAgICAgICAgICAgIHRoaXMuaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pdGVtcz8ubGVuZ3RoID09IDApXHJcbiAgICAgICAgICB0aGlzLmZpZWxkLmFjY2VwdE5ld0l0ZW0gJiYgdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldCh0aGlzLmZpZWxkLmNhc2NhZGVkQnkpLnZhbHVlICE9IG51bGwgP1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zPy5wdXNoKG5ldyBMb29rdXBJdGVtKHtpZDogLTIsIGVuZ2xpc2hOYW1lOiB0aGlzLnF1ZXN0aW9uICsgbmFtZSwgYXJhYmljTmFtZTogdGhpcy5xdWVzdGlvbiArIG5hbWV9KSkgOlxyXG4gICAgICAgICAgICB0aGlzLml0ZW1zPy5wdXNoKG5ldyBMb29rdXBJdGVtKHtpZDogLTEsIGVuZ2xpc2hOYW1lOiAnTm8gbWF0Y2ggLi4uJywgYXJhYmljTmFtZTogJ9i62YrYsSDZhdmI2KzZiNivICAuLi4gJ30pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb29rdXBJdGVtcyQgPSBvZih0aGlzLml0ZW1zKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZExvb2t1cEZpbHRlckJ5QW5vdGhlclByb3BlcnRpZXMobGlzdEl0ZW1zOiBHZXRJdGVtc0xpc3QpIHtcclxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmZpZWxkLmxvb2t1cEZpbHRlckxpc3Q7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcGVydGllcykpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLmZvcm0/LnZhbHVlPy5bcHJvcC5maWVsZE5hbWVdO1xyXG4gICAgICBjb25zdCBmaW5hbFZhbHVlID0gdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkVmFsdWUgIT09IG51bGwgPyBmaWVsZFZhbHVlLmNvZGUgOiBmaWVsZFZhbHVlO1xyXG4gICAgICBpZiAoIWZpbmFsVmFsdWUpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgY29uc3QgZmllbGROYW1lID10eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcgJiYgZmllbGRWYWx1ZSAhPT0gbnVsbCA/IHByb3AuZmllbGROYW1lICsgXCIuXCIgKyB0aGlzLmZpZWxkLmZsYXR0ZW5CeVN1YkF0dHJpYnV0ZSA6IHByb3AuZmllbGROYW1lO1xyXG4gICAgICBjb25zdCBmaWx0ZXIgPSBuZXcgRmlsdGVyKHtcclxuICAgICAgICBmaWVsZFR5cGU6ICdGSUxFRF9GSUxURVInLFxyXG4gICAgICAgIGZpbHRlclR5cGU6IHVuZGVmaW5lZCxcclxuICAgICAgICBvcGVyYXRvcjogcHJvcC5vcGVyYXRvcixcclxuICAgICAgICB2YWx1ZU9iamVjdDogZmluYWxWYWx1ZSxcclxuICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG5ld0ZpbHRlcnMucHVzaChmaWx0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChuZXdGaWx0ZXJzLmxlbmd0aCkge1xyXG4gICAgICBsaXN0SXRlbXMuZmlsdGVycyA9IFsuLi4obGlzdEl0ZW1zLmZpbHRlcnMgfHwgW10pLCAuLi5uZXdGaWx0ZXJzXTtcclxuICAgIH1cclxuICAgIGxpc3RJdGVtcy5maWx0ZXJzID0gbGlzdEl0ZW1zLmZpbHRlcnMuZmlsdGVyKGYgPT4gZi52YWx1ZU9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhdGNoTG9va3VwVmFsdWUoZGVmYXVsdFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcclxuXHJcbiAgICAgIC8vIHRoaXMuZm9ybT8uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5wYXRjaFZhbHVlKGRlZmF1bHRWYWx1ZSk7XHJcbiAgICAgIHRoaXMubXlDb250cm9sLnNldFZhbHVlKGRlZmF1bHRWYWx1ZSk7XHJcbiAgICAgIHRoaXMubXlDb250cm9sLnBhdGNoVmFsdWUoZGVmYXVsdFZhbHVlLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBtYXRFcnJvckRlc2NyaWJlZEJ5KCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybT8uZ2V0KHRoaXMuZmllbGQ/LnByb3BlcnR5KTtcclxuICAgIGlmICghY29udHJvbCB8fCAhdGhpcy5maWVsZD8ucHJvcGVydHkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCB2aXNpYmxlID1cclxuICAgICAgKGNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZSA9PT0gMCkgJiYgY29udHJvbC5zdGF0dXMgPT09ICdJTlZBTElEJztcclxuICAgIHJldHVybiB2aXNpYmxlID8gYGVycm9yLSR7dGhpcy5maWVsZC5wcm9wZXJ0eX1gIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldElkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcGVydHk7XHJcbiAgfVxyXG4gIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcikge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICB0aGlzLmZpbHRlckxvb2t1cEl0ZW1zKCcnLCBhdXRvY29tcGxldGVUcmlnZ2VyKTtcclxuICAgICAgYXV0b2NvbXBsZXRlVHJpZ2dlci5vcGVuUGFuZWwoKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlZCgpIHtcclxuICAgIGlmICghdGhpcy5teUNvbnRyb2wudmFsdWUpe1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5zZXRWYWx1ZSh0aGlzLm15Q29udHJvbC52YWx1ZSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZS5lbWl0KHRoaXMubXlDb250cm9sLnZhbHVlKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubXlDb250cm9sLnZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLm15Q29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkXCIgY2xhc3M9XCJtYWluLWF1dG8tY29tcGxldGVcIj5cclxuICA8ZGl2IGNsYXNzPVwibWF0LWZpZWxkLXdyYXBwZXJcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XHJcbiAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWZpZWxkXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInc2VhcmNoX3BsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICBbaWRdPVwiZ2V0SWQoKVwiXHJcbiAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibXlDb250cm9sXCJcclxuICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQsIGF1dG9jb21wbGV0ZVRyaWdnZXIpXCJcclxuICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICAoY2xpY2spPVwiYXV0b2NvbXBsZXRlVHJpZ2dlci5vcGVuUGFuZWwoKTsgZmlsdGVyTG9va3VwSXRlbXMoJycsIGF1dG9jb21wbGV0ZVRyaWdnZXIpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibWF0RXJyb3JEZXNjcmliZWRCeVwiXHJcbiAgICAgICAgICAgICAjYXV0b2NvbXBsZXRlVHJpZ2dlcj1cIm1hdEF1dG9jb21wbGV0ZVRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgPlxyXG5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhdXRvY29tcGxldGUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXV0b2NvbXBsZXRlVHJpZ2dlci5vcGVuUGFuZWwoKTsgZmlsdGVyTG9va3VwSXRlbXMoJycsIGF1dG9jb21wbGV0ZVRyaWdnZXIpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmlkXT1cIidhdXRvY29tcGxldGUtdHJpZ2dlci0nICsgZmllbGQucHJvcGVydHlcIj5cclxuICAgICAgICA8bWF0LWljb24+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIGF1dG9BY3RpdmVGaXJzdE9wdGlvbiBbZGlzcGxheVdpdGhdPVwiZGlzcGxheUZuLmJpbmQodGhpcylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwiaXRlbVNlbGVjdGVkKCRldmVudC5vcHRpb24udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJjbG9zZWQoKVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQucmVhZG9ubHlcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiaXRlbXMubGVuZ3RoID4gMSAmJiBsb29rdXBJdGVtcyRcIiBbdmFsdWVdPVwibnVsbFwiPnt7IFwibm9uZVwiIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgbG9va3VwSXRlbXMkIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiIFtuZ0NsYXNzXT1cIl9hbGxvd1NlbGVjdGlvbihpdGVtKVwiPlxyXG4gICAgICAgICAgICB7eyBpdGVtTmFtZUJ5TGFnKGl0ZW0pIH19XHJcbiAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=