@sumaris-net/ngx-components 2.12.25-rc4 → 2.12.26-rc1

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 (73) hide show
  1. package/esm2022/src/app/admin/users/users.mjs +5 -11
  2. package/esm2022/src/app/core/account/account.page.mjs +5 -12
  3. package/esm2022/src/app/core/account/new-token.modal.mjs +8 -15
  4. package/esm2022/src/app/core/account/password/change-password.form.mjs +5 -10
  5. package/esm2022/src/app/core/account/token.table.mjs +5 -12
  6. package/esm2022/src/app/core/auth/auth.form.mjs +5 -11
  7. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +5 -13
  8. package/esm2022/src/app/core/form/entity/editor.class.mjs +15 -20
  9. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +10 -18
  10. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +11 -21
  11. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +5 -21
  12. package/esm2022/src/app/core/form/form.class.mjs +13 -13
  13. package/esm2022/src/app/core/form/list/list.form.mjs +10 -20
  14. package/esm2022/src/app/core/form/properties/properties.form.mjs +17 -26
  15. package/esm2022/src/app/core/form/properties/properties.table.mjs +5 -7
  16. package/esm2022/src/app/core/form/username/username.form.mjs +5 -10
  17. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +13 -15
  18. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +13 -15
  19. package/esm2022/src/app/core/settings/settings.page.mjs +25 -35
  20. package/esm2022/src/app/core/table/async-table.class.mjs +21 -30
  21. package/esm2022/src/app/core/table/column/actions-column.component.mjs +4 -4
  22. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +31 -4
  23. package/esm2022/src/app/core/table/column/row-field.component.mjs +6 -11
  24. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +2 -2
  25. package/esm2022/src/app/core/table/memory-table.class.mjs +4 -4
  26. package/esm2022/src/app/core/table/table.class.mjs +21 -33
  27. package/esm2022/src/app/core/table/testing/table.testing.mjs +7 -12
  28. package/esm2022/src/app/core/table/testing/table2.testing.mjs +9 -13
  29. package/esm2022/src/app/shared/form/field.component.mjs +14 -16
  30. package/esm2022/src/app/shared/help/help.modal.mjs +20 -25
  31. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +14 -18
  32. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +5 -12
  33. package/esm2022/src/app/shared/material/text/text-form.component.mjs +5 -12
  34. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +6 -13
  35. package/esm2022/src/app/social/message/message.form.mjs +5 -10
  36. package/fesm2022/sumaris-net.ngx-components.mjs +332 -493
  37. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  38. package/package.json +1 -1
  39. package/src/app/admin/users/users.d.ts +2 -4
  40. package/src/app/core/account/account.page.d.ts +2 -4
  41. package/src/app/core/account/new-token.modal.d.ts +2 -3
  42. package/src/app/core/account/password/change-password.form.d.ts +2 -4
  43. package/src/app/core/account/token.table.d.ts +3 -6
  44. package/src/app/core/auth/auth.form.d.ts +3 -5
  45. package/src/app/core/form/array/testing/form-array.test.d.ts +2 -5
  46. package/src/app/core/form/entity/editor.class.d.ts +9 -8
  47. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +3 -4
  48. package/src/app/core/form/entity/entity-editor.class.d.ts +4 -6
  49. package/src/app/core/form/entity/tab-editor.class.d.ts +2 -11
  50. package/src/app/core/form/form.class.d.ts +5 -3
  51. package/src/app/core/form/list/list.form.d.ts +3 -8
  52. package/src/app/core/form/properties/properties.form.d.ts +3 -7
  53. package/src/app/core/form/properties/properties.table.d.ts +2 -3
  54. package/src/app/core/form/username/username.form.d.ts +3 -5
  55. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -5
  56. package/src/app/core/menu/testing/menu.testing.d.ts +1 -5
  57. package/src/app/core/settings/settings.page.d.ts +3 -9
  58. package/src/app/core/table/async-table.class.d.ts +15 -13
  59. package/src/app/core/table/column/nav-actions-column.component.d.ts +15 -1
  60. package/src/app/core/table/column/row-field.component.d.ts +2 -2
  61. package/src/app/core/table/memory-table.class.d.ts +2 -2
  62. package/src/app/core/table/table.class.d.ts +15 -14
  63. package/src/app/core/table/testing/table.testing.d.ts +2 -4
  64. package/src/app/core/table/testing/table2.testing.d.ts +2 -4
  65. package/src/app/shared/form/field.component.d.ts +5 -5
  66. package/src/app/shared/help/help.modal.d.ts +7 -8
  67. package/src/app/shared/inputs.d.ts +1 -1
  68. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +6 -7
  69. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +2 -5
  70. package/src/app/shared/material/text/text-form.component.d.ts +3 -6
  71. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +2 -5
  72. package/src/app/social/message/message.form.d.ts +2 -4
  73. package/src/assets/manifest.json +1 -1
@@ -21,7 +21,6 @@ import * as i10 from "../../shared/material/chips/material.chips";
21
21
  import * as i11 from "@angular/material/chips";
22
22
  export class MessageForm extends AppForm {
23
23
  formBuilder;
24
- cd;
25
24
  mobile;
26
25
  suggestFn;
27
26
  subjectMinLength = 5;
@@ -32,10 +31,9 @@ export class MessageForm extends AppForm {
32
31
  canRecipientFilter = false;
33
32
  recipientFilterCount = 0;
34
33
  types = MessageTypeList;
35
- constructor(injector, formBuilder, cd) {
36
- super(injector);
34
+ constructor(formBuilder) {
35
+ super();
37
36
  this.formBuilder = formBuilder;
38
- this.cd = cd;
39
37
  this.mobile = this.settings.mobile;
40
38
  }
41
39
  ngOnInit() {
@@ -111,16 +109,13 @@ export class MessageForm extends AppForm {
111
109
  }
112
110
  formGroup.updateValueAndValidity();
113
111
  }
114
- markForCheck() {
115
- this.cd.markForCheck();
116
- }
117
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MessageForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MessageForm, deps: [{ token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component });
118
113
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MessageForm, selector: "app-message-form", inputs: { suggestFn: "suggestFn", subjectMinLength: "subjectMinLength", subjectMaxLength: "subjectMaxLength", bodyMaxLength: "bodyMaxLength", bodyAutoHeight: "bodyAutoHeight", canSelectType: "canSelectType", canRecipientFilter: "canRecipientFilter", recipientFilterCount: "recipientFilterCount" }, usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" class=\"form-container\">\n <!-- type -->\n <mat-form-field *ngIf=\"canSelectType\">\n <mat-label>{{ 'SOCIAL.MESSAGE.TYPE' | translate }}</mat-label>\n <mat-select formControlName=\"type\">\n <ng-container *ngFor=\"let item of types\">\n <mat-option [value]=\"item.id\" *ngIf=\"item.id !== 'FEED' || canRecipientFilter\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label | translate }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n\n <!-- Recipients -->\n <mat-chips-field\n *ngIf=\"(form.controls.type.valueChanges | async) !== 'FEED'; else recipientFilter\"\n formControlName=\"recipients\"\n chipColor=\"accent\"\n [placeholder]=\"'SOCIAL.MESSAGE.RECIPIENTS' | translate\"\n [config]=\"autocompleteFields.recipients\"\n [equals]=\"isSamePerson\"\n ></mat-chips-field>\n <ng-template #recipientFilter>\n <mat-form-field>\n <mat-chip-grid>\n <mat-chip-row>\n {{ 'SOCIAL.MESSAGE.RECIPIENT_FILTER_COUNT' | translate: { count: recipientFilterCount } }}\n </mat-chip-row>\n </mat-chip-grid>\n <input matInput hidden type=\"number\" />\n </mat-form-field>\n </ng-template>\n\n <!-- Subject -->\n <mat-form-field>\n <mat-label>{{ 'SOCIAL.MESSAGE.SUBJECT' | translate }}</mat-label>\n <input matInput type=\"text\" formControlName=\"subject\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"form.controls.subject.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('minlength')\">\n {{ 'ERROR.FIELD_MIN_LENGTH_COMPACT' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH_COMPACT' | translate }}\n </mat-error>\n <mat-hint *ngIf=\"subjectMaxLength\" align=\"end\">\n {{\n 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.subject.value?.length || 0, max: subjectMaxLength }\n }}\n </mat-hint>\n </mat-form-field>\n\n <!-- Body -->\n <mat-form-field>\n <mat-label>{{ 'SOCIAL.MESSAGE.BODY_HELP' | translate }}</mat-label>\n <textarea\n matInput\n type=\"text\"\n formControlName=\"body\"\n [class.fixed-height]=\"!bodyAutoHeight\"\n [cdkTextareaAutosize]=\"bodyAutoHeight\"\n (keydown.control.enter)=\"doSubmit($event)\"\n ></textarea>\n <mat-error *ngIf=\"form.controls.body.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH' | translate: form.controls.body.errors.maxlength }}\n </mat-error>\n <mat-hint *ngIf=\"bodyMaxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.body.value?.length || 0, max: bodyMaxLength } }}\n </mat-hint>\n </mat-form-field>\n</form>\n", styles: ["textarea.fixed-height{height:11.5em}textarea{min-height:11.5em}\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: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "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: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i7.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i10.MatChipsField, selector: "mat-chips-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "mobile", "readonly", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "chipColor", "debug", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "class", "filter", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "component", type: i11.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "component", type: i11.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
119
114
  }
120
115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MessageForm, decorators: [{
121
116
  type: Component,
122
117
  args: [{ selector: 'app-message-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" class=\"form-container\">\n <!-- type -->\n <mat-form-field *ngIf=\"canSelectType\">\n <mat-label>{{ 'SOCIAL.MESSAGE.TYPE' | translate }}</mat-label>\n <mat-select formControlName=\"type\">\n <ng-container *ngFor=\"let item of types\">\n <mat-option [value]=\"item.id\" *ngIf=\"item.id !== 'FEED' || canRecipientFilter\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label | translate }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n\n <!-- Recipients -->\n <mat-chips-field\n *ngIf=\"(form.controls.type.valueChanges | async) !== 'FEED'; else recipientFilter\"\n formControlName=\"recipients\"\n chipColor=\"accent\"\n [placeholder]=\"'SOCIAL.MESSAGE.RECIPIENTS' | translate\"\n [config]=\"autocompleteFields.recipients\"\n [equals]=\"isSamePerson\"\n ></mat-chips-field>\n <ng-template #recipientFilter>\n <mat-form-field>\n <mat-chip-grid>\n <mat-chip-row>\n {{ 'SOCIAL.MESSAGE.RECIPIENT_FILTER_COUNT' | translate: { count: recipientFilterCount } }}\n </mat-chip-row>\n </mat-chip-grid>\n <input matInput hidden type=\"number\" />\n </mat-form-field>\n </ng-template>\n\n <!-- Subject -->\n <mat-form-field>\n <mat-label>{{ 'SOCIAL.MESSAGE.SUBJECT' | translate }}</mat-label>\n <input matInput type=\"text\" formControlName=\"subject\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"form.controls.subject.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('minlength')\">\n {{ 'ERROR.FIELD_MIN_LENGTH_COMPACT' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.subject.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH_COMPACT' | translate }}\n </mat-error>\n <mat-hint *ngIf=\"subjectMaxLength\" align=\"end\">\n {{\n 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.subject.value?.length || 0, max: subjectMaxLength }\n }}\n </mat-hint>\n </mat-form-field>\n\n <!-- Body -->\n <mat-form-field>\n <mat-label>{{ 'SOCIAL.MESSAGE.BODY_HELP' | translate }}</mat-label>\n <textarea\n matInput\n type=\"text\"\n formControlName=\"body\"\n [class.fixed-height]=\"!bodyAutoHeight\"\n [cdkTextareaAutosize]=\"bodyAutoHeight\"\n (keydown.control.enter)=\"doSubmit($event)\"\n ></textarea>\n <mat-error *ngIf=\"form.controls.body.hasError('maxlength')\">\n {{ 'ERROR.FIELD_MAX_LENGTH' | translate: form.controls.body.errors.maxlength }}\n </mat-error>\n <mat-hint *ngIf=\"bodyMaxLength\" align=\"end\">\n {{ 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.body.value?.length || 0, max: bodyMaxLength } }}\n </mat-hint>\n </mat-form-field>\n</form>\n", styles: ["textarea.fixed-height{height:11.5em}textarea{min-height:11.5em}\n"] }]
123
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { suggestFn: [{
118
+ }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }], propDecorators: { suggestFn: [{
124
119
  type: Input
125
120
  }], subjectMinLength: [{
126
121
  type: Input
@@ -137,4 +132,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
137
132
  }], recipientFilterCount: [{
138
133
  type: Input
139
134
  }] } });
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvbWVzc2FnZS9tZXNzYWdlLmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9tZXNzYWdlL21lc3NhZ2UuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFZLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQXdDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBVyxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQVUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHN0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBUXhDLE1BQU0sT0FBTyxXQUFZLFNBQVEsT0FBZ0I7SUFnQnJDO0lBQ1M7SUFoQlYsTUFBTSxDQUFVO0lBRWhCLFNBQVMsQ0FBa0M7SUFDM0MsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztJQUN2QixhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDdEIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixrQkFBa0IsR0FBRyxLQUFLLENBQUM7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QUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO2dCQUNELE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM5QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNoRCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUVELFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzt3R0E1R1UsV0FBVzs0RkFBWCxXQUFXLHlYQ2xCeEIsOHlGQXVFQTs7NEZEckRhLFdBQVc7a0JBTnZCLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU07OElBS3RDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlVHlwZUxpc3QsIE1lc3NhZ2VUeXBlcyB9IGZyb20gJy4vbWVzc2FnZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBGb3JtIH0gZnJvbSAnLi4vLi4vY29yZS9mb3JtL2Zvcm0uY2xhc3MnO1xuaW1wb3J0IHsgU3RhdHVzSWRzIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9tb2RlbC5lbnVtJztcbmltcG9ydCB7IFBlcnNvbiwgUGVyc29uVXRpbHMgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL3BlcnNvbi5tb2RlbCc7XG5pbXBvcnQgeyBTdWdnZXN0Rm4gfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgUGVyc29uRmlsdGVyIH0gZnJvbSAnLi4vLi4vYWRtaW4vc2VydmljZXMvZmlsdGVyL3BlcnNvbi5maWx0ZXInO1xuaW1wb3J0IHsgRW50aXR5VXRpbHMgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlLCBpc05vdE5pbCwgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1tZXNzYWdlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS5mb3JtLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZXNzYWdlLmZvcm0uc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUZvcm0gZXh0ZW5kcyBBcHBGb3JtPE1lc3NhZ2U+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcmVhZG9ubHkgbW9iaWxlOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHN1Z2dlc3RGbjogU3VnZ2VzdEZuPFBlcnNvbiwgUGVyc29uRmlsdGVyPjtcbiAgQElucHV0KCkgc3ViamVjdE1pbkxlbmd0aCA9IDU7XG4gIEBJbnB1dCgpIHN1YmplY3RNYXhMZW5ndGggPSAyNTU7XG4gIEBJbnB1dCgpIGJvZHlNYXhMZW5ndGggPSAyMDAwO1xuICBASW5wdXQoKSBib2R5QXV0b0hlaWdodCA9IHRydWU7XG4gIEBJbnB1dCgpIGNhblNlbGVjdFR5cGUgPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuUmVjaXBpZW50RmlsdGVyID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlY2lwaWVudEZpbHRlckNvdW50ID0gMDtcblxuICB0eXBlcyA9IE1lc3NhZ2VUeXBlTGlzdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMuc2V0dGluZ3MubW9iaWxlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRGb3JtKFxuICAgICAgdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIHR5cGU6IFtNZXNzYWdlVHlwZXMuSU5CT1hfTUVTU0FHRSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHJlY2lwaWVudHM6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgcmVjaXBpZW50RmlsdGVyOiBbbnVsbF0sXG4gICAgICAgIHN1YmplY3Q6IFtcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHRoaXMuc3ViamVjdE1heExlbmd0aFxuICAgICAgICAgICAgPyBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMuc3ViamVjdE1pbkxlbmd0aCksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMuc3ViamVjdE1heExlbmd0aCldKVxuICAgICAgICAgICAgOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICBdLFxuICAgICAgICBib2R5OiBbbnVsbCwgdGhpcy5ib2R5TWF4TGVuZ3RoID8gVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLmJvZHlNYXhMZW5ndGgpXSkgOiBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLl9mb3JtXG4gICAgICAgIC5nZXQoJ3R5cGUnKVxuICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZmlsdGVyKGlzTm90TmlsKSlcbiAgICAgICAgLnN1YnNjcmliZSgodHlwZSkgPT4gdGhpcy51cGRhdGVGb3JtR3JvdXAodGhpcy5fZm9ybSwgeyB0eXBlIH0pKVxuICAgICk7XG5cbiAgICAvLyBQZXJzb24gY29tYm9cbiAgICBjb25zdCBwZXJzb25BdHRyaWJ1dGVzID0gdGhpcy5zZXR0aW5ncy5nZXRGaWVsZERpc3BsYXlBdHRyaWJ1dGVzKCdwZXJzb24nLCBbJ2xhc3ROYW1lJywgJ2ZpcnN0TmFtZScsICdkZXBhcnRtZW50Lm5hbWUnXSk7XG4gICAgdGhpcy5yZWdpc3RlckF1dG9jb21wbGV0ZUZpZWxkKCdyZWNpcGllbnRzJywge1xuICAgICAgc2hvd0FsbE9uRm9jdXM6IGZhbHNlLFxuICAgICAgc3VnZ2VzdEZuOiB0aGlzLnN1Z2dlc3RGbixcbiAgICAgIGZpbHRlcjoge1xuICAgICAgICBzdGF0dXNJZHM6IFtTdGF0dXNJZHMuVEVNUE9SQVJZLCBTdGF0dXNJZHMuRU5BQkxFXSxcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiBwZXJzb25BdHRyaWJ1dGVzLFxuICAgICAgY29sdW1uTmFtZXM6IHBlcnNvbkF0dHJpYnV0ZXMubWFwKChhdHRyKSA9PiBgVVNFUi4ke2NoYW5nZUNhc2VUb1VuZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2UoKX1gKSxcbiAgICAgIGRpc3BsYXlXaXRoOiBQZXJzb25VdGlscy5wZXJzb25Ub1N0cmluZyxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbW9iaWxlOiB0aGlzLm1vYmlsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGlzU2FtZVBlcnNvbihvMTogUGVyc29uLCBvMjogUGVyc29uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEVudGl0eVV0aWxzLmVxdWFscyhvMSwgbzIsICdpZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1Hcm91cChmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXAsIG9wdHM/OiB7IHR5cGU/OiBzdHJpbmc7IHJlY2lwaWVudFJlcXVpcmVkPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW21lc3NhZ2UtZm9ybV0gVXBkYXRpbmcgZm9ybSBncm91cC4uLicsIG9wdHMpO1xuXG4gICAgLy8gUmVjaXBpZW50IHZhbGlkYXRvclxuICAgIGNvbnN0IHJlY2lwaWVudHNSZXF1aXJlZCA9IHRvQm9vbGVhbihvcHRzPy5yZWNpcGllbnRSZXF1aXJlZCwgb3B0cz8udHlwZSAhPT0gTWVzc2FnZVR5cGVzLkZFRUQpO1xuICAgIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KCdyZWNpcGllbnRzJyk7XG4gICAgICBpZiAocmVjaXBpZW50c1JlcXVpcmVkKSB7XG4gICAgICAgIGlmICghY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkpIHtcbiAgICAgICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgICAgIGNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNpcGllbnQgZmlsdGVyIHZhbGlkYXRvclxuICAgIGNvbnN0IHJlY2lwaWVudEZpbHRlclJlcXVpcmVkID0gdGhpcy5jYW5SZWNpcGllbnRGaWx0ZXIgJiYgIXJlY2lwaWVudHNSZXF1aXJlZDtcbiAgICB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldCgncmVjaXBpZW50RmlsdGVyJyk7XG4gICAgICBpZiAocmVjaXBpZW50RmlsdGVyUmVxdWlyZWQpIHtcbiAgICAgICAgaWYgKCFjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLmVuYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpKSB7XG4gICAgICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIj5cbiAgPCEtLSB0eXBlIC0tPlxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJjYW5TZWxlY3RUeXBlXCI+XG4gICAgPG1hdC1sYWJlbD57eyAnU09DSUFMLk1FU1NBR0UuVFlQRScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHR5cGVzXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtLmlkXCIgKm5nSWY9XCJpdGVtLmlkICE9PSAnRkVFRCcgfHwgY2FuUmVjaXBpZW50RmlsdGVyXCI+XG4gICAgICAgICAgPGlvbi1pY29uIFtuYW1lXT1cIml0ZW0uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAge3sgaXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPCEtLSBSZWNpcGllbnRzIC0tPlxuICA8bWF0LWNoaXBzLWZpZWxkXG4gICAgKm5nSWY9XCIoZm9ybS5jb250cm9scy50eXBlLnZhbHVlQ2hhbmdlcyB8IGFzeW5jKSAhPT0gJ0ZFRUQnOyBlbHNlIHJlY2lwaWVudEZpbHRlclwiXG4gICAgZm9ybUNvbnRyb2xOYW1lPVwicmVjaXBpZW50c1wiXG4gICAgY2hpcENvbG9yPVwiYWNjZW50XCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiJ1NPQ0lBTC5NRVNTQUdFLlJFQ0lQSUVOVFMnIHwgdHJhbnNsYXRlXCJcbiAgICBbY29uZmlnXT1cImF1dG9jb21wbGV0ZUZpZWxkcy5yZWNpcGllbnRzXCJcbiAgICBbZXF1YWxzXT1cImlzU2FtZVBlcnNvblwiXG4gID48L21hdC1jaGlwcy1maWVsZD5cbiAgPG5nLXRlbXBsYXRlICNyZWNpcGllbnRGaWx0ZXI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1jaGlwLWdyaWQ+XG4gICAgICAgIDxtYXQtY2hpcC1yb3c+XG4gICAgICAgICAge3sgJ1NPQ0lBTC5NRVNTQUdFLlJFQ0lQSUVOVF9GSUxURVJfQ09VTlQnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiByZWNpcGllbnRGaWx0ZXJDb3VudCB9IH19XG4gICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiB0eXBlPVwibnVtYmVyXCIgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDwhLS0gU3ViamVjdCAtLT5cbiAgPG1hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtbGFiZWw+e3sgJ1NPQ0lBTC5NRVNTQUdFLlNVQkpFQ1QnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwic3ViamVjdFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIC8+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMuc3ViamVjdC5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLnN1YmplY3QuaGFzRXJyb3IoJ21pbmxlbmd0aCcpXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTUlOX0xFTkdUSF9DT01QQUNUJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLnN1YmplY3QuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTUFYX0xFTkdUSF9DT01QQUNUJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtaGludCAqbmdJZj1cInN1YmplY3RNYXhMZW5ndGhcIiBhbGlnbj1cImVuZFwiPlxuICAgICAge3tcbiAgICAgICAgJ0lORk8uVEVYVF9QUk9HUkVTUycgfCB0cmFuc2xhdGU6IHsgY3VycmVudDogZm9ybS5jb250cm9scy5zdWJqZWN0LnZhbHVlPy5sZW5ndGggfHwgMCwgbWF4OiBzdWJqZWN0TWF4TGVuZ3RoIH1cbiAgICAgIH19XG4gICAgPC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8IS0tIEJvZHkgLS0+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPnt7ICdTT0NJQUwuTUVTU0FHRS5CT0RZX0hFTFAnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgPHRleHRhcmVhXG4gICAgICBtYXRJbnB1dFxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYm9keVwiXG4gICAgICBbY2xhc3MuZml4ZWQtaGVpZ2h0XT1cIiFib2R5QXV0b0hlaWdodFwiXG4gICAgICBbY2RrVGV4dGFyZWFBdXRvc2l6ZV09XCJib2R5QXV0b0hlaWdodFwiXG4gICAgICAoa2V5ZG93bi5jb250cm9sLmVudGVyKT1cImRvU3VibWl0KCRldmVudClcIlxuICAgID48L3RleHRhcmVhPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLmJvZHkuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTUFYX0xFTkdUSCcgfCB0cmFuc2xhdGU6IGZvcm0uY29udHJvbHMuYm9keS5lcnJvcnMubWF4bGVuZ3RoIH19XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1oaW50ICpuZ0lmPVwiYm9keU1heExlbmd0aFwiIGFsaWduPVwiZW5kXCI+XG4gICAgICB7eyAnSU5GTy5URVhUX1BST0dSRVNTJyB8IHRyYW5zbGF0ZTogeyBjdXJyZW50OiBmb3JtLmNvbnRyb2xzLmJvZHkudmFsdWU/Lmxlbmd0aCB8fCAwLCBtYXg6IGJvZHlNYXhMZW5ndGggfSB9fVxuICAgIDwvbWF0LWhpbnQ+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Zvcm0+XG4iXX0=
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvbWVzc2FnZS9tZXNzYWdlLmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9tZXNzYWdlL21lc3NhZ2UuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBd0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFXLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBVSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUc3RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFReEMsTUFBTSxPQUFPLFdBQVksU0FBUSxPQUFnQjtJQWMzQjtJQWJYLE1BQU0sQ0FBVTtJQUVoQixTQUFTLENBQWtDO0lBQzNDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUNyQixnQkFBZ0IsR0FBRyxHQUFHLENBQUM7SUFDdkIsYUFBYSxHQUFHLElBQUksQ0FBQztJQUNyQixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLG9C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LENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzlDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELENBQUM7Z0JBQ0QsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDckMsQ0FBQzt3R0FwR1UsV0FBVzs0RkFBWCxXQUFXLHlYQ2xCeEIsOHlGQXVFQTs7NEZEckRhLFdBQVc7a0JBTnZCLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU07dUZBS3RDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVR5cGVMaXN0LCBNZXNzYWdlVHlwZXMgfSBmcm9tICcuL21lc3NhZ2UubW9kZWwnO1xuaW1wb3J0IHsgQXBwRm9ybSB9IGZyb20gJy4uLy4uL2NvcmUvZm9ybS9mb3JtLmNsYXNzJztcbmltcG9ydCB7IFN0YXR1c0lkcyB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvbW9kZWwuZW51bSc7XG5pbXBvcnQgeyBQZXJzb24sIFBlcnNvblV0aWxzIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9wZXJzb24ubW9kZWwnO1xuaW1wb3J0IHsgU3VnZ2VzdEZuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IFBlcnNvbkZpbHRlciB9IGZyb20gJy4uLy4uL2FkbWluL3NlcnZpY2VzL2ZpbHRlci9wZXJzb24uZmlsdGVyJztcbmltcG9ydCB7IEVudGl0eVV0aWxzIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgY2hhbmdlQ2FzZVRvVW5kZXJzY29yZSwgaXNOb3ROaWwsIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbWVzc2FnZS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lc3NhZ2UuZm9ybS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVzc2FnZS5mb3JtLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VGb3JtIGV4dGVuZHMgQXBwRm9ybTxNZXNzYWdlPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHJlYWRvbmx5IG1vYmlsZTogYm9vbGVhbjtcblxuICBASW5wdXQoKSBzdWdnZXN0Rm46IFN1Z2dlc3RGbjxQZXJzb24sIFBlcnNvbkZpbHRlcj47XG4gIEBJbnB1dCgpIHN1YmplY3RNaW5MZW5ndGggPSA1O1xuICBASW5wdXQoKSBzdWJqZWN0TWF4TGVuZ3RoID0gMjU1O1xuICBASW5wdXQoKSBib2R5TWF4TGVuZ3RoID0gMjAwMDtcbiAgQElucHV0KCkgYm9keUF1dG9IZWlnaHQgPSB0cnVlO1xuICBASW5wdXQoKSBjYW5TZWxlY3RUeXBlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhblJlY2lwaWVudEZpbHRlciA9IGZhbHNlO1xuICBASW5wdXQoKSByZWNpcGllbnRGaWx0ZXJDb3VudCA9IDA7XG5cbiAgdHlwZXMgPSBNZXNzYWdlVHlwZUxpc3Q7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMuc2V0dGluZ3MubW9iaWxlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRGb3JtKFxuICAgICAgdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIHR5cGU6IFtNZXNzYWdlVHlwZXMuSU5CT1hfTUVTU0FHRSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHJlY2lwaWVudHM6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgcmVjaXBpZW50RmlsdGVyOiBbbnVsbF0sXG4gICAgICAgIHN1YmplY3Q6IFtcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHRoaXMuc3ViamVjdE1heExlbmd0aFxuICAgICAgICAgICAgPyBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMuc3ViamVjdE1pbkxlbmd0aCksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMuc3ViamVjdE1heExlbmd0aCldKVxuICAgICAgICAgICAgOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICBdLFxuICAgICAgICBib2R5OiBbbnVsbCwgdGhpcy5ib2R5TWF4TGVuZ3RoID8gVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLmJvZHlNYXhMZW5ndGgpXSkgOiBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLl9mb3JtXG4gICAgICAgIC5nZXQoJ3R5cGUnKVxuICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZmlsdGVyKGlzTm90TmlsKSlcbiAgICAgICAgLnN1YnNjcmliZSgodHlwZSkgPT4gdGhpcy51cGRhdGVGb3JtR3JvdXAodGhpcy5fZm9ybSwgeyB0eXBlIH0pKVxuICAgICk7XG5cbiAgICAvLyBQZXJzb24gY29tYm9cbiAgICBjb25zdCBwZXJzb25BdHRyaWJ1dGVzID0gdGhpcy5zZXR0aW5ncy5nZXRGaWVsZERpc3BsYXlBdHRyaWJ1dGVzKCdwZXJzb24nLCBbJ2xhc3ROYW1lJywgJ2ZpcnN0TmFtZScsICdkZXBhcnRtZW50Lm5hbWUnXSk7XG4gICAgdGhpcy5yZWdpc3RlckF1dG9jb21wbGV0ZUZpZWxkKCdyZWNpcGllbnRzJywge1xuICAgICAgc2hvd0FsbE9uRm9jdXM6IGZhbHNlLFxuICAgICAgc3VnZ2VzdEZuOiB0aGlzLnN1Z2dlc3RGbixcbiAgICAgIGZpbHRlcjoge1xuICAgICAgICBzdGF0dXNJZHM6IFtTdGF0dXNJZHMuVEVNUE9SQVJZLCBTdGF0dXNJZHMuRU5BQkxFXSxcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiBwZXJzb25BdHRyaWJ1dGVzLFxuICAgICAgY29sdW1uTmFtZXM6IHBlcnNvbkF0dHJpYnV0ZXMubWFwKChhdHRyKSA9PiBgVVNFUi4ke2NoYW5nZUNhc2VUb1VuZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2UoKX1gKSxcbiAgICAgIGRpc3BsYXlXaXRoOiBQZXJzb25VdGlscy5wZXJzb25Ub1N0cmluZyxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbW9iaWxlOiB0aGlzLm1vYmlsZSxcbiAgICB9KTtcbiAgfVxuXG4gIGlzU2FtZVBlcnNvbihvMTogUGVyc29uLCBvMjogUGVyc29uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEVudGl0eVV0aWxzLmVxdWFscyhvMSwgbzIsICdpZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1Hcm91cChmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXAsIG9wdHM/OiB7IHR5cGU/OiBzdHJpbmc7IHJlY2lwaWVudFJlcXVpcmVkPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW21lc3NhZ2UtZm9ybV0gVXBkYXRpbmcgZm9ybSBncm91cC4uLicsIG9wdHMpO1xuXG4gICAgLy8gUmVjaXBpZW50IHZhbGlkYXRvclxuICAgIGNvbnN0IHJlY2lwaWVudHNSZXF1aXJlZCA9IHRvQm9vbGVhbihvcHRzPy5yZWNpcGllbnRSZXF1aXJlZCwgb3B0cz8udHlwZSAhPT0gTWVzc2FnZVR5cGVzLkZFRUQpO1xuICAgIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KCdyZWNpcGllbnRzJyk7XG4gICAgICBpZiAocmVjaXBpZW50c1JlcXVpcmVkKSB7XG4gICAgICAgIGlmICghY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkpIHtcbiAgICAgICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgICAgIGNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLmRpc2FibGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNpcGllbnQgZmlsdGVyIHZhbGlkYXRvclxuICAgIGNvbnN0IHJlY2lwaWVudEZpbHRlclJlcXVpcmVkID0gdGhpcy5jYW5SZWNpcGllbnRGaWx0ZXIgJiYgIXJlY2lwaWVudHNSZXF1aXJlZDtcbiAgICB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldCgncmVjaXBpZW50RmlsdGVyJyk7XG4gICAgICBpZiAocmVjaXBpZW50RmlsdGVyUmVxdWlyZWQpIHtcbiAgICAgICAgaWYgKCFjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLmVuYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpKSB7XG4gICAgICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIj5cbiAgPCEtLSB0eXBlIC0tPlxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJjYW5TZWxlY3RUeXBlXCI+XG4gICAgPG1hdC1sYWJlbD57eyAnU09DSUFMLk1FU1NBR0UuVFlQRScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHR5cGVzXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtLmlkXCIgKm5nSWY9XCJpdGVtLmlkICE9PSAnRkVFRCcgfHwgY2FuUmVjaXBpZW50RmlsdGVyXCI+XG4gICAgICAgICAgPGlvbi1pY29uIFtuYW1lXT1cIml0ZW0uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAge3sgaXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPCEtLSBSZWNpcGllbnRzIC0tPlxuICA8bWF0LWNoaXBzLWZpZWxkXG4gICAgKm5nSWY9XCIoZm9ybS5jb250cm9scy50eXBlLnZhbHVlQ2hhbmdlcyB8IGFzeW5jKSAhPT0gJ0ZFRUQnOyBlbHNlIHJlY2lwaWVudEZpbHRlclwiXG4gICAgZm9ybUNvbnRyb2xOYW1lPVwicmVjaXBpZW50c1wiXG4gICAgY2hpcENvbG9yPVwiYWNjZW50XCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiJ1NPQ0lBTC5NRVNTQUdFLlJFQ0lQSUVOVFMnIHwgdHJhbnNsYXRlXCJcbiAgICBbY29uZmlnXT1cImF1dG9jb21wbGV0ZUZpZWxkcy5yZWNpcGllbnRzXCJcbiAgICBbZXF1YWxzXT1cImlzU2FtZVBlcnNvblwiXG4gID48L21hdC1jaGlwcy1maWVsZD5cbiAgPG5nLXRlbXBsYXRlICNyZWNpcGllbnRGaWx0ZXI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1jaGlwLWdyaWQ+XG4gICAgICAgIDxtYXQtY2hpcC1yb3c+XG4gICAgICAgICAge3sgJ1NPQ0lBTC5NRVNTQUdFLlJFQ0lQSUVOVF9GSUxURVJfQ09VTlQnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiByZWNpcGllbnRGaWx0ZXJDb3VudCB9IH19XG4gICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiB0eXBlPVwibnVtYmVyXCIgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDwhLS0gU3ViamVjdCAtLT5cbiAgPG1hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtbGFiZWw+e3sgJ1NPQ0lBTC5NRVNTQUdFLlNVQkpFQ1QnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwic3ViamVjdFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHJlcXVpcmVkIC8+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMuc3ViamVjdC5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLnN1YmplY3QuaGFzRXJyb3IoJ21pbmxlbmd0aCcpXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTUlOX0xFTkdUSF9DT01QQUNUJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLnN1YmplY3QuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTUFYX0xFTkdUSF9DT01QQUNUJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICAgIDxtYXQtaGludCAqbmdJZj1cInN1YmplY3RNYXhMZW5ndGhcIiBhbGlnbj1cImVuZFwiPlxuICAgICAge3tcbiAgICAgICAgJ0lORk8uVEVYVF9QUk9HUkVTUycgfCB0cmFuc2xhdGU6IHsgY3VycmVudDogZm9ybS5jb250cm9scy5zdWJqZWN0LnZhbHVlPy5sZW5ndGggfHwgMCwgbWF4OiBzdWJqZWN0TWF4TGVuZ3RoIH1cbiAgICAgIH19XG4gICAgPC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8IS0tIEJvZHkgLS0+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPnt7ICdTT0NJQUwuTUVTU0FHRS5CT0RZX0hFTFAnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgPHRleHRhcmVhXG4gICAgICBtYXRJbnB1dFxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYm9keVwiXG4gICAgICBbY2xhc3MuZml4ZWQtaGVpZ2h0XT1cIiFib2R5QXV0b0hlaWdodFwiXG4gICAgICBbY2RrVGV4dGFyZWFBdXRvc2l6ZV09XCJib2R5QXV0b0hlaWdodFwiXG4gICAgICAoa2V5ZG93bi5jb250cm9sLmVudGVyKT1cImRvU3VibWl0KCRldmVudClcIlxuICAgID48L3RleHRhcmVhPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLmJvZHkuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTUFYX0xFTkdUSCcgfCB0cmFuc2xhdGU6IGZvcm0uY29udHJvbHMuYm9keS5lcnJvcnMubWF4bGVuZ3RoIH19XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1oaW50ICpuZ0lmPVwiYm9keU1heExlbmd0aFwiIGFsaWduPVwiZW5kXCI+XG4gICAgICB7eyAnSU5GTy5URVhUX1BST0dSRVNTJyB8IHRyYW5zbGF0ZTogeyBjdXJyZW50OiBmb3JtLmNvbnRyb2xzLmJvZHkudmFsdWU/Lmxlbmd0aCB8fCAwLCBtYXg6IGJvZHlNYXhMZW5ndGggfSB9fVxuICAgIDwvbWF0LWhpbnQ+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Zvcm0+XG4iXX0=