@po-ui/ng-components 6.12.1 → 6.13.0

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 (35) hide show
  1. package/esm2020/lib/components/po-button/po-button-base.component.mjs +4 -7
  2. package/esm2020/lib/components/po-field/index.mjs +2 -1
  3. package/esm2020/lib/components/po-field/po-datepicker/po-datepicker-base.component.mjs +8 -3
  4. package/esm2020/lib/components/po-field/po-field.module.mjs +8 -3
  5. package/esm2020/lib/components/po-field/po-radio/po-radio-base.component.mjs +104 -0
  6. package/esm2020/lib/components/po-field/po-radio/po-radio-size.enum.mjs +6 -0
  7. package/esm2020/lib/components/po-field/po-radio/po-radio.component.mjs +100 -0
  8. package/esm2020/lib/components/po-list-view/po-list-view.component.mjs +77 -82
  9. package/esm2020/lib/components/po-list-view/po-list-view.module.mjs +6 -4
  10. package/esm2020/lib/components/po-table/po-table-column-manager/po-table-column-manager.component.mjs +80 -23
  11. package/esm2020/lib/components/po-table/po-table.component.mjs +487 -466
  12. package/esm2020/lib/utils/util.mjs +9 -1
  13. package/fesm2015/po-ui-ng-components.mjs +1079 -781
  14. package/fesm2015/po-ui-ng-components.mjs.map +1 -1
  15. package/fesm2020/po-ui-ng-components.mjs +1063 -781
  16. package/fesm2020/po-ui-ng-components.mjs.map +1 -1
  17. package/lib/components/po-button/po-button-base.component.d.ts +1 -1
  18. package/lib/components/po-field/index.d.ts +1 -0
  19. package/lib/components/po-field/po-field.module.d.ts +23 -22
  20. package/lib/components/po-field/po-radio/po-radio-base.component.d.ts +58 -0
  21. package/lib/components/po-field/po-radio/po-radio-size.enum.d.ts +4 -0
  22. package/lib/components/po-field/po-radio/po-radio.component.d.ts +38 -0
  23. package/lib/components/po-list-view/po-list-view.module.d.ts +6 -4
  24. package/lib/components/po-table/po-table-column-manager/po-table-column-manager.component.d.ts +13 -1
  25. package/lib/components/po-table/po-table.component.d.ts +4 -0
  26. package/lib/utils/util.d.ts +1 -0
  27. package/package.json +4 -4
  28. package/po-ui-ng-components-6.13.0.tgz +0 -0
  29. package/schematics/ng-add/index.js +1 -1
  30. package/schematics/ng-update/v2/index.js +1 -1
  31. package/schematics/ng-update/v3/index.js +1 -1
  32. package/schematics/ng-update/v4/index.js +1 -1
  33. package/schematics/ng-update/v5/index.js +1 -1
  34. package/schematics/ng-update/v6/index.js +1 -1
  35. package/po-ui-ng-components-6.12.1.tgz +0 -0
@@ -9,21 +9,41 @@ import * as i3 from "../../po-popover/po-popover.component";
9
9
  import * as i4 from "../../po-field/po-checkbox-group/po-checkbox-group.component";
10
10
  import * as i5 from "@angular/forms";
11
11
  import * as i6 from "../../po-button/po-button.component";
12
+ import * as i7 from "../../../directives/po-tooltip/po-tooltip.directive";
13
+ function PoTableColumnManagerComponent_po_popover_0_div_10_Template(rf, ctx) { if (rf & 1) {
14
+ const _r5 = i0.ɵɵgetCurrentView();
15
+ i0.ɵɵelementStart(0, "div")(1, "div", 13)(2, "po-button", 14);
16
+ i0.ɵɵlistener("click", function PoTableColumnManagerComponent_po_popover_0_div_10_Template_po_button_click_2_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r5); const option_r3 = restoredCtx.$implicit; const ctx_r4 = i0.ɵɵnextContext(2); ctx_r4.changePosition(option_r3, "up"); return $event.stopPropagation(); });
17
+ i0.ɵɵelementEnd();
18
+ i0.ɵɵelementStart(3, "po-button", 15);
19
+ i0.ɵɵlistener("click", function PoTableColumnManagerComponent_po_popover_0_div_10_Template_po_button_click_3_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r5); const option_r3 = restoredCtx.$implicit; const ctx_r6 = i0.ɵɵnextContext(2); ctx_r6.changePosition(option_r3, "down"); return $event.stopPropagation(); });
20
+ i0.ɵɵelementEnd()()();
21
+ } if (rf & 2) {
22
+ const option_r3 = ctx.$implicit;
23
+ const ctx_r2 = i0.ɵɵnextContext(2);
24
+ i0.ɵɵadvance(2);
25
+ i0.ɵɵproperty("p-tooltip", ctx_r2.literals.up)("p-disabled", ctx_r2.verifyArrowDisabled(option_r3, "up"));
26
+ i0.ɵɵadvance(1);
27
+ i0.ɵɵproperty("p-tooltip", ctx_r2.literals.down)("p-disabled", ctx_r2.verifyArrowDisabled(option_r3, "down"));
28
+ } }
12
29
  function PoTableColumnManagerComponent_po_popover_0_Template(rf, ctx) { if (rf & 1) {
13
- const _r3 = i0.ɵɵgetCurrentView();
30
+ const _r8 = i0.ɵɵgetCurrentView();
14
31
  i0.ɵɵelementStart(0, "po-popover", 1, 2);
15
- i0.ɵɵlistener("p-close", function PoTableColumnManagerComponent_po_popover_0_Template_po_popover_p_close_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r2 = i0.ɵɵnextContext(); return ctx_r2.checkChanges([], true); });
32
+ i0.ɵɵlistener("p-close", function PoTableColumnManagerComponent_po_popover_0_Template_po_popover_p_close_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return ctx_r7.checkChanges([], true); });
16
33
  i0.ɵɵelementStart(2, "div", 3)(3, "div", 4);
17
34
  i0.ɵɵtext(4);
18
35
  i0.ɵɵelementEnd();
19
36
  i0.ɵɵelementStart(5, "div", 5)(6, "button", 6);
20
- i0.ɵɵlistener("click", function PoTableColumnManagerComponent_po_popover_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const _r1 = i0.ɵɵreference(1); return _r1.close(); });
37
+ i0.ɵɵlistener("click", function PoTableColumnManagerComponent_po_popover_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r8); const _r1 = i0.ɵɵreference(1); return _r1.close(); });
21
38
  i0.ɵɵelementEnd()()();
22
39
  i0.ɵɵelementStart(7, "div", 7)(8, "po-checkbox-group", 8);
23
- i0.ɵɵlistener("ngModelChange", function PoTableColumnManagerComponent_po_popover_0_Template_po_checkbox_group_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r5 = i0.ɵɵnextContext(); return ctx_r5.visibleColumns = $event; })("p-change", function PoTableColumnManagerComponent_po_popover_0_Template_po_checkbox_group_p_change_8_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r6 = i0.ɵɵnextContext(); return ctx_r6.checkChanges($event, false); });
40
+ i0.ɵɵlistener("ngModelChange", function PoTableColumnManagerComponent_po_popover_0_Template_po_checkbox_group_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r10 = i0.ɵɵnextContext(); return ctx_r10.visibleColumns = $event; })("p-change", function PoTableColumnManagerComponent_po_popover_0_Template_po_checkbox_group_p_change_8_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r11 = i0.ɵɵnextContext(); return ctx_r11.checkChanges($event, false); });
41
+ i0.ɵɵelementEnd();
42
+ i0.ɵɵelementStart(9, "div", 9);
43
+ i0.ɵɵtemplate(10, PoTableColumnManagerComponent_po_popover_0_div_10_Template, 4, 4, "div", 10);
24
44
  i0.ɵɵelementEnd()();
25
- i0.ɵɵelementStart(9, "div", 9)(10, "po-button", 10);
26
- i0.ɵɵlistener("p-click", function PoTableColumnManagerComponent_po_popover_0_Template_po_button_p_click_10_listener() { i0.ɵɵrestoreView(_r3); const ctx_r7 = i0.ɵɵnextContext(); return ctx_r7.restore(); });
45
+ i0.ɵɵelementStart(11, "div", 11)(12, "po-button", 12);
46
+ i0.ɵɵlistener("p-click", function PoTableColumnManagerComponent_po_popover_0_Template_po_button_p_click_12_listener() { i0.ɵɵrestoreView(_r8); const ctx_r12 = i0.ɵɵnextContext(); return ctx_r12.restore(); });
27
47
  i0.ɵɵelementEnd()()();
28
48
  } if (rf & 2) {
29
49
  const ctx_r0 = i0.ɵɵnextContext();
@@ -33,25 +53,35 @@ function PoTableColumnManagerComponent_po_popover_0_Template(rf, ctx) { if (rf &
33
53
  i0.ɵɵadvance(4);
34
54
  i0.ɵɵproperty("ngModel", ctx_r0.visibleColumns)("p-options", ctx_r0.columnsOptions);
35
55
  i0.ɵɵadvance(2);
56
+ i0.ɵɵproperty("ngForOf", ctx_r0.columnsOptions);
57
+ i0.ɵɵadvance(2);
36
58
  i0.ɵɵproperty("p-label", ctx_r0.literals.restoreDefault);
37
59
  } }
38
60
  const PoTableColumnManagerMaxColumnsDefault = 99999;
39
61
  export const poTableColumnManagerLiteralsDefault = {
40
62
  en: {
41
63
  columnsManager: 'Columns manager',
42
- restoreDefault: 'Restore default'
64
+ restoreDefault: 'Restore default',
65
+ up: 'up',
66
+ down: 'down'
43
67
  },
44
68
  es: {
45
69
  columnsManager: 'Gerente de columna',
46
- restoreDefault: 'Restaurar por defecto'
70
+ restoreDefault: 'Restaurar por defecto',
71
+ up: 'arriba',
72
+ down: 'abajo'
47
73
  },
48
74
  pt: {
49
75
  columnsManager: 'Gerenciador de colunas',
50
- restoreDefault: 'Restaurar padrão'
76
+ restoreDefault: 'Restaurar padrão',
77
+ up: 'acima',
78
+ down: 'abaixo'
51
79
  },
52
80
  ru: {
53
81
  columnsManager: 'менеджер колонок',
54
- restoreDefault: 'сброс настроек'
82
+ restoreDefault: 'сброс настроек',
83
+ up: 'вверх',
84
+ down: 'вниз'
55
85
  }
56
86
  };
57
87
  export class PoTableColumnManagerComponent {
@@ -110,6 +140,38 @@ export class PoTableColumnManagerComponent {
110
140
  this.initialColumns.emit(this.getVisibleColumns(this.colunsDefault));
111
141
  this.checkChanges(defaultColumns, this.restoreDefaultEvent);
112
142
  }
143
+ changePosition(option, direction) {
144
+ const indexColumn = this.columns.findIndex(el => el.property === option.value);
145
+ const newColumn = [...this.columns];
146
+ const hasDisabled = this.verifyArrowDisabled(option, direction);
147
+ this.changePositionColumn(newColumn, indexColumn, direction, hasDisabled);
148
+ this.columns = newColumn;
149
+ this.visibleColumnsChange.emit(this.columns);
150
+ }
151
+ verifyArrowDisabled(option, direction) {
152
+ const index = this.columns.findIndex(el => el.property === option.value);
153
+ const existsDetail = this.columns.some(function (el) {
154
+ return el.property === 'detail';
155
+ });
156
+ const valueSubtraction = existsDetail ? 2 : 1;
157
+ if (index === 0 && direction === 'up') {
158
+ return true;
159
+ }
160
+ if (index === this.columns.length - valueSubtraction && direction === 'down') {
161
+ return true;
162
+ }
163
+ return false;
164
+ }
165
+ changePositionColumn(array, index, direction, hasDisabled) {
166
+ if (!hasDisabled) {
167
+ if (direction === 'up') {
168
+ array.splice(index, 0, array.splice(index - 1, 1)[0]);
169
+ }
170
+ if (direction === 'down') {
171
+ array.splice(index, 0, array.splice(index + 1, 1)[0]);
172
+ }
173
+ }
174
+ }
113
175
  verifyToEmitChange(event) {
114
176
  const newColumns = [...event];
115
177
  if (newColumns.length >= 1 && this.allowsChangeVisibleColumns()) {
@@ -145,15 +207,10 @@ export class PoTableColumnManagerComponent {
145
207
  const defaultColumns = [...this.defaultColumns];
146
208
  const defaultVisibleColumns = this.getVisibleColumns(defaultColumns);
147
209
  if (this.allowsChangeSelectedColumns(defaultVisibleColumns)) {
148
- this.emitChangeOnRestore(defaultVisibleColumns);
210
+ this.visibleColumnsChange.emit(this.defaultColumns);
149
211
  }
150
212
  this.restoreDefaultEvent = false;
151
213
  }
152
- emitChangeOnRestore(defaultVisibleColumns) {
153
- this.visibleColumns = [...defaultVisibleColumns];
154
- const visibleTableColumns = this.getVisibleTableColumns(this.visibleColumns);
155
- this.visibleColumnsChange.emit(visibleTableColumns);
156
- }
157
214
  allowsChangeSelectedColumns(defaultVisibleColumns) {
158
215
  const visibleColumns = this.getVisibleColumns(this.columns);
159
216
  return !this.isEqualArrays(defaultVisibleColumns, visibleColumns);
@@ -184,8 +241,8 @@ export class PoTableColumnManagerComponent {
184
241
  isEqualArrays(first, second) {
185
242
  const one = first ? [...first] : [];
186
243
  const two = second ? [...second] : [];
187
- const firstSort = one.slice().sort();
188
- const secondSort = two.slice().sort();
244
+ const firstSort = one.slice();
245
+ const secondSort = two.slice();
189
246
  const firstString = JSON.stringify(firstSort);
190
247
  const secondString = JSON.stringify(secondSort);
191
248
  return firstString === secondString;
@@ -291,14 +348,14 @@ PoTableColumnManagerComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ typ
291
348
  } if (rf & 2) {
292
349
  let _t;
293
350
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.popover = _t.first);
294
- } }, inputs: { columns: ["p-columns", "columns"], target: ["p-target", "target"], colunsDefault: ["p-columns-default", "colunsDefault"], lastVisibleColumnsSelected: ["p-last-visible-columns-selected", "lastVisibleColumnsSelected"], maxColumns: ["p-max-columns", "maxColumns"] }, outputs: { visibleColumnsChange: "p-visible-columns-change", changeVisibleColumns: "p-change-visible-columns", initialColumns: "p-initial-columns" }, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["p-position", "bottom-left", 3, "p-target", "p-close", 4, "ngIf"], ["p-position", "bottom-left", 3, "p-target", "p-close"], ["popover", ""], [1, "po-table-column-manager-header"], [1, "po-table-column-manager-header-title"], [1, "po-table-column-manager-header-close"], [1, "po-table-column-manager-header-close-button", "po-clickable", "po-icon", "po-icon-close", 3, "click"], [1, "po-table-column-manager-body"], ["name", "visibleColumns", "p-columns", "1", 3, "ngModel", "p-options", "ngModelChange", "p-change"], [1, "po-table-column-manager-footer"], ["p-small", "", "p-kind", "tertiary", 1, "po-table-column-manager-footer-restore", 3, "p-label", "p-click"]], template: function PoTableColumnManagerComponent_Template(rf, ctx) { if (rf & 1) {
295
- i0.ɵɵtemplate(0, PoTableColumnManagerComponent_po_popover_0_Template, 11, 5, "po-popover", 0);
351
+ } }, inputs: { columns: ["p-columns", "columns"], target: ["p-target", "target"], colunsDefault: ["p-columns-default", "colunsDefault"], lastVisibleColumnsSelected: ["p-last-visible-columns-selected", "lastVisibleColumnsSelected"], maxColumns: ["p-max-columns", "maxColumns"] }, outputs: { visibleColumnsChange: "p-visible-columns-change", changeVisibleColumns: "p-change-visible-columns", initialColumns: "p-initial-columns" }, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["p-position", "bottom-left", 3, "p-target", "p-close", 4, "ngIf"], ["p-position", "bottom-left", 3, "p-target", "p-close"], ["popover", ""], [1, "po-table-column-manager-header"], [1, "po-table-column-manager-header-title"], [1, "po-table-column-manager-header-close"], [1, "po-table-column-manager-header-close-button", "po-clickable", "po-icon", "po-icon-close", 3, "click"], [1, "po-table-column-manager-body"], ["name", "visibleColumns", "p-columns", "1", 3, "ngModel", "p-options", "ngModelChange", "p-change"], [1, "po-container-arrows-columns-manager"], [4, "ngFor", "ngForOf"], [1, "po-table-column-manager-footer"], ["p-small", "", "p-kind", "tertiary", 1, "po-table-column-manager-footer-restore", 3, "p-label", "p-click"], [1, "po-container-icons-arrows-columns-manager"], ["p-tooltip-position", "left", "p-kind", "tertiary", "p-icon", "po-icon po-icon-arrow-up", "p-small", "", 3, "p-tooltip", "p-disabled", "click"], ["p-tooltip-position", "top", "p-kind", "tertiary", "p-icon", "po-icon po-icon-arrow-down", "p-small", "", 3, "p-tooltip", "p-disabled", "click"]], template: function PoTableColumnManagerComponent_Template(rf, ctx) { if (rf & 1) {
352
+ i0.ɵɵtemplate(0, PoTableColumnManagerComponent_po_popover_0_Template, 13, 6, "po-popover", 0);
296
353
  } if (rf & 2) {
297
354
  i0.ɵɵproperty("ngIf", ctx.target);
298
- } }, directives: [i2.NgIf, i3.PoPopoverComponent, i4.PoCheckboxGroupComponent, i5.NgControlStatus, i5.NgModel, i6.PoButtonComponent], encapsulation: 2 });
355
+ } }, directives: [i2.NgIf, i3.PoPopoverComponent, i4.PoCheckboxGroupComponent, i5.NgControlStatus, i5.NgModel, i2.NgForOf, i6.PoButtonComponent, i7.PoTooltipDirective], encapsulation: 2 });
299
356
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoTableColumnManagerComponent, [{
300
357
  type: Component,
301
- args: [{ selector: 'po-table-column-manager', template: "<po-popover #popover *ngIf=\"target\" [p-target]=\"target\" p-position=\"bottom-left\" (p-close)=\"checkChanges([], true)\">\n <div class=\"po-table-column-manager-header\">\n <div class=\"po-table-column-manager-header-title\">{{ literals.columnsManager }}</div>\n\n <div class=\"po-table-column-manager-header-close\">\n <button\n class=\"po-table-column-manager-header-close-button po-clickable po-icon po-icon-close\"\n (click)=\"popover.close()\"\n ></button>\n </div>\n </div>\n\n <div class=\"po-table-column-manager-body\">\n <po-checkbox-group\n name=\"visibleColumns\"\n [(ngModel)]=\"visibleColumns\"\n p-columns=\"1\"\n [p-options]=\"columnsOptions\"\n (p-change)=\"checkChanges($event, false)\"\n >\n </po-checkbox-group>\n </div>\n\n <div class=\"po-table-column-manager-footer\">\n <po-button\n class=\"po-table-column-manager-footer-restore\"\n p-small\n p-kind=\"tertiary\"\n [p-label]=\"literals.restoreDefault\"\n (p-click)=\"restore()\"\n >\n </po-button>\n </div>\n</po-popover>\n" }]
358
+ args: [{ selector: 'po-table-column-manager', template: "<po-popover #popover *ngIf=\"target\" [p-target]=\"target\" p-position=\"bottom-left\" (p-close)=\"checkChanges([], true)\">\n <div class=\"po-table-column-manager-header\">\n <div class=\"po-table-column-manager-header-title\">{{ literals.columnsManager }}</div>\n\n <div class=\"po-table-column-manager-header-close\">\n <button\n class=\"po-table-column-manager-header-close-button po-clickable po-icon po-icon-close\"\n (click)=\"popover.close()\"\n ></button>\n </div>\n </div>\n\n <div class=\"po-table-column-manager-body\">\n <po-checkbox-group\n name=\"visibleColumns\"\n [(ngModel)]=\"visibleColumns\"\n p-columns=\"1\"\n [p-options]=\"columnsOptions\"\n (p-change)=\"checkChanges($event, false)\"\n >\n </po-checkbox-group>\n\n <div class=\"po-container-arrows-columns-manager\">\n <div *ngFor=\"let option of columnsOptions\">\n <div class=\"po-container-icons-arrows-columns-manager\">\n <po-button\n [p-tooltip]=\"literals.up\"\n p-tooltip-position=\"left\"\n [p-disabled]=\"verifyArrowDisabled(option, 'up')\"\n (click)=\"changePosition(option, 'up'); $event.stopPropagation()\"\n p-kind=\"tertiary\"\n p-icon=\"po-icon po-icon-arrow-up\"\n p-small\n >\n </po-button>\n <po-button\n [p-tooltip]=\"literals.down\"\n p-tooltip-position=\"top\"\n [p-disabled]=\"verifyArrowDisabled(option, 'down')\"\n (click)=\"changePosition(option, 'down'); $event.stopPropagation()\"\n p-kind=\"tertiary\"\n p-icon=\"po-icon po-icon-arrow-down\"\n p-small\n >\n </po-button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"po-table-column-manager-footer\">\n <po-button\n class=\"po-table-column-manager-footer-restore\"\n p-small\n p-kind=\"tertiary\"\n [p-label]=\"literals.restoreDefault\"\n (p-click)=\"restore()\"\n >\n </po-button>\n </div>\n</po-popover>\n" }]
302
359
  }], function () { return [{ type: i0.Renderer2 }, { type: i1.PoLanguageService }]; }, { popover: [{
303
360
  type: ViewChild,
304
361
  args: [PoPopoverComponent]
@@ -327,4 +384,4 @@ PoTableColumnManagerComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ typ
327
384
  type: Input,
328
385
  args: ['p-max-columns']
329
386
  }] }); })();
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tdGFibGUtY29sdW1uLW1hbmFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jb21wb25lbnRzL3BvLXRhYmxlL3BvLXRhYmxlLWNvbHVtbi1tYW5hZ2VyL3BvLXRhYmxlLWNvbHVtbi1tYW5hZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvY29tcG9uZW50cy9wby10YWJsZS9wby10YWJsZS1jb2x1bW4tbWFuYWdlci9wby10YWJsZS1jb2x1bW4tbWFuYWdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7Ozs7O0lDbEJyRix3Q0FBb0g7SUFBbkMseUxBQVcsd0JBQWlCLElBQUksQ0FBQyxJQUFDO0lBQ2pILDhCQUE0QyxhQUFBO0lBQ1EsWUFBNkI7SUFBQSxpQkFBTTtJQUVyRiw4QkFBa0QsZ0JBQUE7SUFHOUMsNktBQVMsV0FBZSxJQUFDO0lBQzFCLGlCQUFTLEVBQUEsRUFBQTtJQUlkLDhCQUEwQywyQkFBQTtJQUd0QyxvUEFBNEIsMkxBR2hCLDRCQUFxQixLQUFLLENBQUMsSUFIWDtJQUs5QixpQkFBb0IsRUFBQTtJQUd0Qiw4QkFBNEMscUJBQUE7SUFNeEMseUxBQVcsZ0JBQVMsSUFBQztJQUV2QixpQkFBWSxFQUFBLEVBQUE7OztJQS9Cb0Isd0NBQW1CO0lBRUQsZUFBNkI7SUFBN0Isb0RBQTZCO0lBYTdFLGVBQTRCO0lBQTVCLCtDQUE0QixvQ0FBQTtJQWE1QixlQUFtQztJQUFuQyx3REFBbUM7O0FEUHpDLE1BQU0scUNBQXFDLEdBQUcsS0FBSyxDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHO0lBQ2pELEVBQUUsRUFBRTtRQUNGLGNBQWMsRUFBRSxpQkFBaUI7UUFDakMsY0FBYyxFQUFFLGlCQUFpQjtLQUNsQztJQUNELEVBQUUsRUFBRTtRQUNGLGNBQWMsRUFBRSxvQkFBb0I7UUFDcEMsY0FBYyxFQUFFLHVCQUF1QjtLQUN4QztJQUNELEVBQUUsRUFBRTtRQUNGLGNBQWMsRUFBRSx3QkFBd0I7UUFDeEMsY0FBYyxFQUFFLGtCQUFrQjtLQUNuQztJQUNELEVBQUUsRUFBRTtRQUNGLGNBQWMsRUFBRSxrQkFBa0I7UUFDbEMsY0FBYyxFQUFFLGdCQUFnQjtLQUNqQztDQUNGLENBQUM7QUFNRixNQUFNLE9BQU8sNkJBQTZCO0lBdUN4QyxZQUFvQixRQUFtQixFQUFFLGVBQWtDO1FBQXZELGFBQVEsR0FBUixRQUFRLENBQVc7UUFwQ25CLFlBQU8sR0FBeUIsRUFBRSxDQUFDO1FBTWIsK0JBQTBCLEdBQXlCLEVBQUUsQ0FBQztRQUU1RCx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUVwRyxtR0FBbUc7UUFDbkcsZ0pBQWdKO1FBQzVHLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRWhFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFHaEYsbUJBQWMsR0FBaUMsRUFBRSxDQUFDO1FBQ2xELG1CQUFjLEdBQWtCLEVBQUUsQ0FBQztRQUczQixnQkFBVyxHQUFXLHFDQUFxQyxDQUFDO1FBQzVELG1CQUFjLEdBQXlCLEVBQUUsQ0FBQztRQUkxQyxlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBVzdCLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxHQUFHLG1DQUFtQyxDQUFDLGVBQWUsQ0FBQztZQUN2RCxHQUFHLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQztTQUNqRCxDQUFDO0lBQ0osQ0FBQztJQWZELElBQTRCLFVBQVUsQ0FBQyxLQUFhO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQVdELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFaEQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUNoQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtRQUVELElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLFlBQVksQ0FBQyxRQUF1QixFQUFFLEVBQUUsT0FBZ0IsS0FBSztRQUMzRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0IsSUFBSSxJQUFJLEVBQUU7WUFDUiwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQW9CO1FBQzdDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFO1lBQy9ELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvQztRQUNELG1DQUFtQztRQUNuQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDO0lBRU8sNEJBQTRCLENBQUMsVUFBeUI7UUFDNUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTdFLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFN0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QiwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7YUFBTTtZQUNMLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNqRDtRQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVPLG1CQUFtQixDQUFDLHFCQUFvQztRQUM5RCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLDJCQUEyQixDQUFDLHFCQUFvQztRQUN0RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVELE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sY0FBYztRQUNwQixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakYsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9HLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFFOUUsT0FBTyxDQUNMLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVPLFdBQVcsQ0FBQyxxQkFBb0MsRUFBRSxrQkFBaUM7UUFDekYsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sUUFBUSxDQUFDLHFCQUFvQyxFQUFFLGdCQUErQjtRQUNwRixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQW9CLEVBQUUsTUFBcUI7UUFDL0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWhELE9BQU8sV0FBVyxLQUFLLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRUQsbUdBQW1HO0lBQzNGLHFCQUFxQixDQUFDLFVBQXdDLEVBQUU7UUFDdEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QixHQUFHLE1BQU07WUFDVCxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQXFCO1FBQy9DLE9BQU8sTUFBTSxDQUFDLEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELHdFQUF3RTtJQUNoRSxpQkFBaUIsQ0FBQyxPQUE2QjtRQUNyRCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFFeEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNoRCxjQUFjLEdBQUcsQ0FBQyxHQUFHLGNBQWMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDdkQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBcUIsRUFBRSxjQUE2QjtRQUMxRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztJQUN6RyxDQUFDO0lBRUQsOEZBQThGO0lBQ3RGLHNCQUFzQixDQUFDLGNBQTZCO1FBQzFELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV0RCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsTUFBTTtZQUNULE9BQU8sRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7U0FDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDbEUsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDdEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsUUFBZ0I7UUFDdEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDekcsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLFVBQWdDLEVBQUU7UUFDekUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUUxQixZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzVCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzVCLGNBQWMsQ0FBQyxJQUFJLENBQUM7b0JBQ2xCLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUTtvQkFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7b0JBQ3ZDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7b0JBQy9DLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztpQkFDeEIsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUFtQjtRQUM1QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsTUFBTTtZQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7U0FDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sZUFBZSxDQUFDLE9BQXFCO1FBQzNDLE1BQU0sRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDMUQsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBRXpDLGtIQUFrSDtRQUNsSCxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDNUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7U0FDekM7UUFFRCxrSEFBa0g7UUFDbEgsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsWUFBa0M7UUFDckQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUE2QjtRQUM3QyxnSEFBZ0g7UUFDaEgsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM1QyxJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksR0FBRyxLQUFLLGVBQWUsRUFBRTtnQkFDN0MsT0FBTyxLQUFLLENBQUM7YUFDZDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7MEdBN1NVLDZCQUE2QjtnRkFBN0IsNkJBQTZCO3VCQUM3QixrQkFBa0I7Ozs7O1FDL0MvQiw2RkFpQ2E7O1FBakNTLGlDQUFZOzt1RkQ4Q3JCLDZCQUE2QjtjQUp6QyxTQUFTOzJCQUNFLHlCQUF5Qjs0RkFJSixPQUFPO2tCQUFyQyxTQUFTO21CQUFDLGtCQUFrQjtZQUVULE9BQU87a0JBQTFCLEtBQUs7bUJBQUMsV0FBVztZQUVDLE1BQU07a0JBQXhCLEtBQUs7bUJBQUMsVUFBVTtZQUVXLGFBQWE7a0JBQXhDLEtBQUs7bUJBQUMsbUJBQW1CO1lBRWdCLDBCQUEwQjtrQkFBbkUsS0FBSzttQkFBQyxpQ0FBaUM7WUFFSixvQkFBb0I7a0JBQXZELE1BQU07bUJBQUMsMEJBQTBCO1lBSUUsb0JBQW9CO2tCQUF2RCxNQUFNO21CQUFDLDBCQUEwQjtZQUVMLGNBQWM7a0JBQTFDLE1BQU07bUJBQUMsbUJBQW1CO1lBY0MsVUFBVTtrQkFBckMsS0FBSzttQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGNvbnZlcnRUb0ludCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3V0aWwnO1xuaW1wb3J0IHsgUG9DaGVja2JveEdyb3VwT3B0aW9uIH0gZnJvbSAnLi4vLi4vcG8tZmllbGQvcG8tY2hlY2tib3gtZ3JvdXAvaW50ZXJmYWNlcy9wby1jaGVja2JveC1ncm91cC1vcHRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BvLXBvcG92ZXIvcG8tcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9MYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wby1sYW5ndWFnZS9wby1sYW5ndWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IHBvTG9jYWxlRGVmYXVsdCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BvLWxhbmd1YWdlL3BvLWxhbmd1YWdlLmNvbnN0YW50JztcbmltcG9ydCB7IFBvVGFibGVDb2x1bW4gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BvLXRhYmxlLWNvbHVtbi5pbnRlcmZhY2UnO1xuXG5jb25zdCBQb1RhYmxlQ29sdW1uTWFuYWdlck1heENvbHVtbnNEZWZhdWx0ID0gOTk5OTk7XG5cbmV4cG9ydCBjb25zdCBwb1RhYmxlQ29sdW1uTWFuYWdlckxpdGVyYWxzRGVmYXVsdCA9IHtcbiAgZW46IHtcbiAgICBjb2x1bW5zTWFuYWdlcjogJ0NvbHVtbnMgbWFuYWdlcicsXG4gICAgcmVzdG9yZURlZmF1bHQ6ICdSZXN0b3JlIGRlZmF1bHQnXG4gIH0sXG4gIGVzOiB7XG4gICAgY29sdW1uc01hbmFnZXI6ICdHZXJlbnRlIGRlIGNvbHVtbmEnLFxuICAgIHJlc3RvcmVEZWZhdWx0OiAnUmVzdGF1cmFyIHBvciBkZWZlY3RvJ1xuICB9LFxuICBwdDoge1xuICAgIGNvbHVtbnNNYW5hZ2VyOiAnR2VyZW5jaWFkb3IgZGUgY29sdW5hcycsXG4gICAgcmVzdG9yZURlZmF1bHQ6ICdSZXN0YXVyYXIgcGFkcsOjbydcbiAgfSxcbiAgcnU6IHtcbiAgICBjb2x1bW5zTWFuYWdlcjogJ9C80LXQvdC10LTQttC10YAg0LrQvtC70L7QvdC+0LonLFxuICAgIHJlc3RvcmVEZWZhdWx0OiAn0YHQsdGA0L7RgSDQvdCw0YHRgtGA0L7QtdC6J1xuICB9XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwby10YWJsZS1jb2x1bW4tbWFuYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wby10YWJsZS1jb2x1bW4tbWFuYWdlci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUG9UYWJsZUNvbHVtbk1hbmFnZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoUG9Qb3BvdmVyQ29tcG9uZW50KSBwb3BvdmVyOiBQb1BvcG92ZXJDb21wb25lbnQ7XG5cbiAgQElucHV0KCdwLWNvbHVtbnMnKSBjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdO1xuXG4gIEBJbnB1dCgncC10YXJnZXQnKSB0YXJnZXQ6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCdwLWNvbHVtbnMtZGVmYXVsdCcpIGNvbHVuc0RlZmF1bHQ6IEFycmF5PFBvVGFibGVDb2x1bW4+O1xuXG4gIEBJbnB1dCgncC1sYXN0LXZpc2libGUtY29sdW1ucy1zZWxlY3RlZCcpIGxhc3RWaXNpYmxlQ29sdW1uc1NlbGVjdGVkOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdO1xuXG4gIEBPdXRwdXQoJ3AtdmlzaWJsZS1jb2x1bW5zLWNoYW5nZScpIHZpc2libGVDb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxQb1RhYmxlQ29sdW1uPj4oKTtcblxuICAvLyBFdmVudG8gZGlzcGFyYWRvIGFvIGZlY2hhciBvIHBvcG92ZXIgZG8gZ2VyZW5jaWFkb3IgZGUgY29sdW5hcyBhcMOzcyBhbHRlcmFyIGFzIGNvbHVuYXMgdmlzw612ZWlzLlxuICAvLyBPIHBvLXRhYmxlIGVudmlhIGNvbW8gcGFyw6JtZXRybyB1bSBhcnJheSBkZSBzdHJpbmcgY29tIGFzIGNvbHVuYXMgdmlzw612ZWlzIGF0dWFsaXphZGFzLiBQb3IgZXhlbXBsbzogW1wiaWRDYXJkXCIsIFwibmFtZVwiLCBcImhpcmVTdGF0dXNcIiwgXCJhZ2VcIl0uXG4gIEBPdXRwdXQoJ3AtY2hhbmdlLXZpc2libGUtY29sdW1ucycpIGNoYW5nZVZpc2libGVDb2x1bW5zID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxzdHJpbmc+PigpO1xuXG4gIEBPdXRwdXQoJ3AtaW5pdGlhbC1jb2x1bW5zJykgaW5pdGlhbENvbHVtbnMgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFN0cmluZz4+KCk7XG5cbiAgbGl0ZXJhbHM7XG4gIGNvbHVtbnNPcHRpb25zOiBBcnJheTxQb0NoZWNrYm94R3JvdXBPcHRpb24+ID0gW107XG4gIHZpc2libGVDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbHVtblVwZGF0ZTtcblxuICBwcml2YXRlIF9tYXhDb2x1bW5zOiBudW1iZXIgPSBQb1RhYmxlQ29sdW1uTWFuYWdlck1heENvbHVtbnNEZWZhdWx0O1xuICBwcml2YXRlIGRlZmF1bHRDb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdO1xuICBwcml2YXRlIHJlc2l6ZUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlc3RvcmVEZWZhdWx0RXZlbnQ6IGJvb2xlYW47XG4gIHByaXZhdGUgbGFzdEVtaXR0ZWRWYWx1ZTogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSBtaW5Db2x1bW5zOiBudW1iZXIgPSAxO1xuXG4gIEBJbnB1dCgncC1tYXgtY29sdW1ucycpIHNldCBtYXhDb2x1bW5zKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhDb2x1bW5zID0gY29udmVydFRvSW50KHZhbHVlLCBQb1RhYmxlQ29sdW1uTWFuYWdlck1heENvbHVtbnNEZWZhdWx0KTtcbiAgfVxuXG4gIGdldCBtYXhDb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhDb2x1bW5zO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBsYW5ndWFnZVNlcnZpY2U6IFBvTGFuZ3VhZ2VTZXJ2aWNlKSB7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xuXG4gICAgdGhpcy5saXRlcmFscyA9IHtcbiAgICAgIC4uLnBvVGFibGVDb2x1bW5NYW5hZ2VyTGl0ZXJhbHNEZWZhdWx0W3BvTG9jYWxlRGVmYXVsdF0sXG4gICAgICAuLi5wb1RhYmxlQ29sdW1uTWFuYWdlckxpdGVyYWxzRGVmYXVsdFtsYW5ndWFnZV1cbiAgICB9O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHsgY29sdW1ucywgbWF4Q29sdW1ucywgdGFyZ2V0IH0gPSBjaGFuZ2VzO1xuXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlQ29sdW1ucyhjb2x1bW5zKTtcbiAgICB9XG5cbiAgICBpZiAobWF4Q29sdW1ucykge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZXModGhpcy5jb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICB9XG5cbiAgLy8gYXF1aSBjaGVnYW0gb3MgZXZlbnRvcyBkbyBjaGVja2JveCBlIGRvIGNsb3NlIGRvIHBvcG92ZXIgcXVlIHRhbWLDqW0gw6kgZGlzcGFyYWRvIG5vIHJlc2l6ZVxuICBjaGVja0NoYW5nZXMoZXZlbnQ6IEFycmF5PHN0cmluZz4gPSBbXSwgZW1pdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy52ZXJpZnlUb0VtaXRDaGFuZ2UoZXZlbnQpO1xuXG4gICAgaWYgKGVtaXQpIHtcbiAgICAgIC8vIGNvbnRyb2xhIGVtaXNzw7VlcyBwYXJhIG8gZGV2XG4gICAgICB0aGlzLnZlcmlmeVRvRW1pdFZpc2libGVDb2x1bW5zKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzdG9yZSgpIHtcbiAgICB0aGlzLnJlc3RvcmVEZWZhdWx0RXZlbnQgPSB0cnVlO1xuICAgIGNvbnN0IGRlZmF1bHRDb2x1bW5zID0gdGhpcy5nZXRWaXNpYmxlQ29sdW1ucyh0aGlzLmRlZmF1bHRDb2x1bW5zKTtcbiAgICB0aGlzLmluaXRpYWxDb2x1bW5zLmVtaXQodGhpcy5nZXRWaXNpYmxlQ29sdW1ucyh0aGlzLmNvbHVuc0RlZmF1bHQpKTtcbiAgICB0aGlzLmNoZWNrQ2hhbmdlcyhkZWZhdWx0Q29sdW1ucywgdGhpcy5yZXN0b3JlRGVmYXVsdEV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5VG9FbWl0Q2hhbmdlKGV2ZW50OiBBcnJheTxzdHJpbmc+KSB7XG4gICAgY29uc3QgbmV3Q29sdW1ucyA9IFsuLi5ldmVudF07XG4gICAgaWYgKG5ld0NvbHVtbnMubGVuZ3RoID49IDEgJiYgdGhpcy5hbGxvd3NDaGFuZ2VWaXNpYmxlQ29sdW1ucygpKSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VzVG9TZWxlY3RlZENvbHVtbnMobmV3Q29sdW1ucyk7XG4gICAgfVxuICAgIC8vIERlc2FiaWxpdGEgdWx0aW1vIGNoZWNrYm94IGF0aXZvXG4gICAgaWYgKG5ld0NvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW5zT3B0aW9ucyA9IHRoaXMubWFwVGFibGVDb2x1bW5zVG9DaGVja2JveE9wdGlvbnModGhpcy5jb2x1bW5VcGRhdGUpO1xuICAgICAgdGhpcy5jb2x1bW5zT3B0aW9ucyA9IHRoaXMuZGlzYWJsZWRMYXN0Q29sdW1uKGNvbHVtbnNPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRDaGFuZ2VzVG9TZWxlY3RlZENvbHVtbnMobmV3Q29sdW1uczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBbLi4ubmV3Q29sdW1uc107XG4gICAgY29uc3QgdmlzaWJsZVRhYmxlQ29sdW1ucyA9IHRoaXMuZ2V0VmlzaWJsZVRhYmxlQ29sdW1ucyh0aGlzLnZpc2libGVDb2x1bW5zKTtcblxuICAgIC8vIGVtaXRlIGFsdGVyYcOnw6NvIG5hcyBjb2x1bmFzIHNlbGVjaW9uYWRhcywgcG9yw6ltIG7Do28gZW1pdGUgcGFyYSBvIGRldi5cbiAgICB0aGlzLnZpc2libGVDb2x1bW5zQ2hhbmdlLmVtaXQodmlzaWJsZVRhYmxlQ29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIGFsbG93c0NoYW5nZVZpc2libGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpc2libGVUYWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVUYWJsZUNvbHVtbnModGhpcy52aXNpYmxlQ29sdW1ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpbmdpZnkodmlzaWJsZVRhYmxlQ29sdW1ucykgIT09IHRoaXMuc3RyaW5naWZ5KHRoaXMuY29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeVRvRW1pdFZpc2libGVDb2x1bW5zKCkge1xuICAgIGlmICh0aGlzLnJlc3RvcmVEZWZhdWx0RXZlbnQpIHtcbiAgICAgIC8vIHZlaW8gZG8gcmVzdG9yZSBkZWZhdWx0XG4gICAgICB0aGlzLnZlcmlmeVJlc3RvcmVWYWx1ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9pIGRpc3BhcmFkbyBubyBjbG9zZSBwb3BvdmVyO1xuICAgICAgdGhpcy52ZXJpZnlPbkNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlSZXN0b3JlVmFsdWVzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRDb2x1bW5zID0gWy4uLnRoaXMuZGVmYXVsdENvbHVtbnNdO1xuICAgIGNvbnN0IGRlZmF1bHRWaXNpYmxlQ29sdW1ucyA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbnMoZGVmYXVsdENvbHVtbnMpO1xuXG4gICAgaWYgKHRoaXMuYWxsb3dzQ2hhbmdlU2VsZWN0ZWRDb2x1bW5zKGRlZmF1bHRWaXNpYmxlQ29sdW1ucykpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZU9uUmVzdG9yZShkZWZhdWx0VmlzaWJsZUNvbHVtbnMpO1xuICAgIH1cblxuICAgIHRoaXMucmVzdG9yZURlZmF1bHRFdmVudCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlT25SZXN0b3JlKGRlZmF1bHRWaXNpYmxlQ29sdW1uczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBbLi4uZGVmYXVsdFZpc2libGVDb2x1bW5zXTtcbiAgICBjb25zdCB2aXNpYmxlVGFibGVDb2x1bW5zID0gdGhpcy5nZXRWaXNpYmxlVGFibGVDb2x1bW5zKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuXG4gICAgdGhpcy52aXNpYmxlQ29sdW1uc0NoYW5nZS5lbWl0KHZpc2libGVUYWJsZUNvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvd3NDaGFuZ2VTZWxlY3RlZENvbHVtbnMoZGVmYXVsdFZpc2libGVDb2x1bW5zOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVDb2x1bW5zKHRoaXMuY29sdW1ucyk7XG5cbiAgICByZXR1cm4gIXRoaXMuaXNFcXVhbEFycmF5cyhkZWZhdWx0VmlzaWJsZUNvbHVtbnMsIHZpc2libGVDb2x1bW5zKTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5T25DbG9zZSgpIHtcbiAgICBpZiAodGhpcy5hbGxvd3NFbWlzc2lvbigpKSB7XG4gICAgICB0aGlzLmVtaXRWaXNpYmxlQ29sdW1ucygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFZpc2libGVDb2x1bW5zKCkge1xuICAgIHRoaXMubGFzdEVtaXR0ZWRWYWx1ZSA9IFsuLi50aGlzLnZpc2libGVDb2x1bW5zXTtcbiAgICB0aGlzLmNoYW5nZVZpc2libGVDb2x1bW5zLmVtaXQodGhpcy52aXNpYmxlQ29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIGFsbG93c0VtaXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVwZGF0ZWRWaXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMgPyBbLi4udGhpcy52aXNpYmxlQ29sdW1uc10gOiBbXTtcbiAgICBjb25zdCBsYXN0RW1pdHRlZFZhbHVlID0gdGhpcy5sYXN0RW1pdHRlZFZhbHVlID8gWy4uLnRoaXMubGFzdEVtaXR0ZWRWYWx1ZV0gOiBbXTtcbiAgICBjb25zdCBsYXN0VmlzaWJsZUNvbHVtbnNTZWxlY3RlZCA9IHRoaXMubGFzdFZpc2libGVDb2x1bW5zU2VsZWN0ZWQgPyBbLi4udGhpcy5sYXN0VmlzaWJsZUNvbHVtbnNTZWxlY3RlZF0gOiBbXTtcbiAgICBjb25zdCBsYXN0VmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVDb2x1bW5zKGxhc3RWaXNpYmxlQ29sdW1uc1NlbGVjdGVkKTtcblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzVXBkYXRlKHVwZGF0ZWRWaXNpYmxlQ29sdW1ucywgbGFzdEVtaXR0ZWRWYWx1ZSkgfHxcbiAgICAgIHRoaXMuaXNGaXJzdFRpbWUodXBkYXRlZFZpc2libGVDb2x1bW5zLCBsYXN0VmlzaWJsZUNvbHVtbnMpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaXJzdFRpbWUodXBkYXRlZFZpc2libGVDb2x1bW5zOiBBcnJheTxzdHJpbmc+LCBsYXN0VmlzaWJsZUNvbHVtbnM6IEFycmF5PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubGFzdEVtaXR0ZWRWYWx1ZSAmJiAhdGhpcy5pc0VxdWFsQXJyYXlzKHVwZGF0ZWRWaXNpYmxlQ29sdW1ucywgbGFzdFZpc2libGVDb2x1bW5zKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNVcGRhdGUodXBkYXRlZFZpc2libGVDb2x1bW5zOiBBcnJheTxzdHJpbmc+LCBsYXN0RW1pdHRlZFZhbHVlOiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdEVtaXR0ZWRWYWx1ZSAmJiAhdGhpcy5pc0VxdWFsQXJyYXlzKHVwZGF0ZWRWaXNpYmxlQ29sdW1ucywgbGFzdEVtaXR0ZWRWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGlzRXF1YWxBcnJheXMoZmlyc3Q6IEFycmF5PHN0cmluZz4sIHNlY29uZDogQXJyYXk8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9uZSA9IGZpcnN0ID8gWy4uLmZpcnN0XSA6IFtdO1xuICAgIGNvbnN0IHR3byA9IHNlY29uZCA/IFsuLi5zZWNvbmRdIDogW107XG4gICAgY29uc3QgZmlyc3RTb3J0ID0gb25lLnNsaWNlKCkuc29ydCgpO1xuICAgIGNvbnN0IHNlY29uZFNvcnQgPSB0d28uc2xpY2UoKS5zb3J0KCk7XG4gICAgY29uc3QgZmlyc3RTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShmaXJzdFNvcnQpO1xuICAgIGNvbnN0IHNlY29uZFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHNlY29uZFNvcnQpO1xuXG4gICAgcmV0dXJuIGZpcnN0U3RyaW5nID09PSBzZWNvbmRTdHJpbmc7XG4gIH1cblxuICAvLyBkZXNhYmlsaXRhcsOhIGFzIGNvbHVuYXMsIHF1ZSBuw6NvIGVzdGl2ZXJlbSBzZWxlY2lvbmFkYXMsIGFww7NzIGV4ZWRlciBvIG51bWVybyBtYXhpbW8gZGUgY29sdW5hcy5cbiAgcHJpdmF0ZSBkaXNhYmxlQ29sdW1uc09wdGlvbnMoY29sdW1uczogQXJyYXk8UG9DaGVja2JveEdyb3VwT3B0aW9uPiA9IFtdKSB7XG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgLi4uY29sdW1uLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlQ29sdW1uKGNvbHVtbi52YWx1ZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtblRpdGxlTGFiZWwoY29sdW1uOiBQb1RhYmxlQ29sdW1uKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5sYWJlbCB8fCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoY29sdW1uLnByb3BlcnR5KTtcbiAgfVxuXG4gIC8qKiBSZXRvcm5hIHVtIEFycmF5IGRlIGNvbHVtbi5wcm9wZXJ0eSBkYXMgY29sdW5hcyBxdWUgc8OjbyB2aXNpdmVpcy4gKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlQ29sdW1ucyhjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPik6IEFycmF5PHN0cmluZz4ge1xuICAgIGxldCB2aXNpYmxlQ29sdW1ucyA9IFtdO1xuXG4gICAgY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICBpZiAodGhpcy5pc1Zpc2libGVDb2x1bW4oY29sdW1uLCB2aXNpYmxlQ29sdW1ucykpIHtcbiAgICAgICAgdmlzaWJsZUNvbHVtbnMgPSBbLi4udmlzaWJsZUNvbHVtbnMsIGNvbHVtbi5wcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnM7XG4gIH1cblxuICBwcml2YXRlIGlzVmlzaWJsZUNvbHVtbihjb2x1bW46IFBvVGFibGVDb2x1bW4sIHZpc2libGVDb2x1bW5zOiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbHVtbi52aXNpYmxlICE9PSBmYWxzZSAmJiB2aXNpYmxlQ29sdW1ucy5sZW5ndGggPCB0aGlzLm1heENvbHVtbnMgJiYgY29sdW1uLnR5cGUgIT09ICdkZXRhaWwnO1xuICB9XG5cbiAgLyoqIFJldG9ybmEgdW0gQXJyYXkgUG9UYWJsZUNvbHVtbiBhIHBhcnRpciBkYXMgY29sdW5hcyB2aXNpdmVpcyBubyBnZXJlbmNpYWRvciBkZSBjb2x1bmFzLiAqL1xuICBwcml2YXRlIGdldFZpc2libGVUYWJsZUNvbHVtbnModmlzaWJsZUNvbHVtbnM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxQb1RhYmxlQ29sdW1uPiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucyA/IFsuLi50aGlzLmNvbHVtbnNdIDogW107XG5cbiAgICByZXR1cm4gY29sdW1ucy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICB2aXNpYmxlOiB2aXNpYmxlQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4ucHJvcGVydHkpIHx8IGNvbHVtbi50eXBlID09PSAnZGV0YWlsJ1xuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxpc3RlbmVycygpIHtcbiAgICB0aGlzLnJlc2l6ZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wb3BvdmVyICYmICF0aGlzLnBvcG92ZXIuaXNIaWRkZW4pIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzRGlzYWJsZUNvbHVtbihwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoID49IHRoaXMubWF4Q29sdW1ucyA/ICF0aGlzLnZpc2libGVDb2x1bW5zLmluY2x1ZGVzKHByb3BlcnR5KSA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBUYWJsZUNvbHVtbnNUb0NoZWNrYm94T3B0aW9ucyhjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdKSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5zID0gWy4uLmNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbHVtbnNPcHRpb25zID0gW107XG5cbiAgICB0YWJsZUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbi50eXBlICE9PSAnZGV0YWlsJykge1xuICAgICAgICBjb2x1bW5zT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLnByb3BlcnR5LFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmdldENvbHVtblRpdGxlTGFiZWwoY29sdW1uKSxcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0Rpc2FibGVDb2x1bW4oY29sdW1uLnByb3BlcnR5KSxcbiAgICAgICAgICB2aXNpYmxlOiBjb2x1bW4udmlzaWJsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb2x1bW5zT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZWRMYXN0Q29sdW1uKGNvbHVtbnM6IEFycmF5PGFueT4pIHtcbiAgICByZXR1cm4gY29sdW1ucy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkaXNhYmxlZDogY29sdW1uLnR5cGUgIT09ICdkZXRhaWwnICYmIGNvbHVtbi52aXNpYmxlID8gdHJ1ZSA6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZUNvbHVtbnMoY29sdW1uczogU2ltcGxlQ2hhbmdlKSB7XG4gICAgY29uc3QgeyBjdXJyZW50VmFsdWUgPSBbXSwgcHJldmlvdXNWYWx1ZSA9IFtdIH0gPSBjb2x1bW5zO1xuICAgIHRoaXMuY29sdW1uVXBkYXRlID0gY29sdW1ucy5jdXJyZW50VmFsdWU7XG5cbiAgICAvLyBhdHVhbGl6YXJhIG8gZGVmYXVsdENvbHVtbnMsIHF1YW5kbyBmb3IgYSBwcmltZWlyYSB2ZXogb3UgcXVhbmRvIG8gZGVmYXVsdENvbHVtbnMgZm9yIGRpZmVyZW50ZSBkbyBjdXJyZW50VmFsdWVcbiAgICBpZiAoIXRoaXMubGFzdFZpc2libGVDb2x1bW5zU2VsZWN0ZWQgJiYgdGhpcy5zdHJpbmdpZnkodGhpcy5kZWZhdWx0Q29sdW1ucykgIT09IHRoaXMuc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSBbLi4uY3VycmVudFZhbHVlXTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZmljYSBzZSBvIHZhbG9yIGFudGVyaW9yIMOpIGRpZmVyZW50ZSBkbyBhdHVhbCBwYXJhIGF0dWFsaXphciBhcyBjb2x1bW5zT3B0aW9ucyBhcGVuYXMgcXVhbmRvIGZvciBuZWNlc3NhcmlvXG4gICAgaWYgKHRoaXMuc3RyaW5naWZ5KHByZXZpb3VzVmFsdWUpICE9PSB0aGlzLnN0cmluZ2lmeShjdXJyZW50VmFsdWUpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlcyhjdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsdWVzKGN1cnJlbnRWYWx1ZTogQXJyYXk8UG9UYWJsZUNvbHVtbj4pIHtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbnMoY3VycmVudFZhbHVlKTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gWy4uLnZpc2libGVDb2x1bW5zXTtcblxuICAgIGNvbnN0IGNvbHVtbnNPcHRpb25zID0gdGhpcy5tYXBUYWJsZUNvbHVtbnNUb0NoZWNrYm94T3B0aW9ucyhjdXJyZW50VmFsdWUpO1xuICAgIHRoaXMuY29sdW1uc09wdGlvbnMgPSB0aGlzLmRpc2FibGVDb2x1bW5zT3B0aW9ucyhjb2x1bW5zT3B0aW9ucyk7XG5cbiAgICB0aGlzLmNoZWNrQ2hhbmdlcyh2aXNpYmxlQ29sdW1ucywgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMucmVzaXplTGlzdGVuZXIpIHtcbiAgICAgIHRoaXMucmVzaXplTGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ2lmeShjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPikge1xuICAgIC8vIG7Do28gZmF6IG8gc3RyaW5naWZ5IGRhIHByb3ByaWVkYWRlIGljb24gZSBzZWFyY2hTZXJ2aWNlLCBwb2lzIHBvZGUgY29udGVyIG9iamV0byBjb21wbGV4byBlIGRpc3BhcmFyIHVtIGVycm8uXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbHVtbnMsIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWNvbicgJiYga2V5ICE9PSAnc2VhcmNoU2VydmljZScpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8cG8tcG9wb3ZlciAjcG9wb3ZlciAqbmdJZj1cInRhcmdldFwiIFtwLXRhcmdldF09XCJ0YXJnZXRcIiBwLXBvc2l0aW9uPVwiYm90dG9tLWxlZnRcIiAocC1jbG9zZSk9XCJjaGVja0NoYW5nZXMoW10sIHRydWUpXCI+XG4gIDxkaXYgY2xhc3M9XCJwby10YWJsZS1jb2x1bW4tbWFuYWdlci1oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicG8tdGFibGUtY29sdW1uLW1hbmFnZXItaGVhZGVyLXRpdGxlXCI+e3sgbGl0ZXJhbHMuY29sdW1uc01hbmFnZXIgfX08L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJwby10YWJsZS1jb2x1bW4tbWFuYWdlci1oZWFkZXItY2xvc2VcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJwby10YWJsZS1jb2x1bW4tbWFuYWdlci1oZWFkZXItY2xvc2UtYnV0dG9uIHBvLWNsaWNrYWJsZSBwby1pY29uIHBvLWljb24tY2xvc2VcIlxuICAgICAgICAoY2xpY2spPVwicG9wb3Zlci5jbG9zZSgpXCJcbiAgICAgID48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInBvLXRhYmxlLWNvbHVtbi1tYW5hZ2VyLWJvZHlcIj5cbiAgICA8cG8tY2hlY2tib3gtZ3JvdXBcbiAgICAgIG5hbWU9XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICBbKG5nTW9kZWwpXT1cInZpc2libGVDb2x1bW5zXCJcbiAgICAgIHAtY29sdW1ucz1cIjFcIlxuICAgICAgW3Atb3B0aW9uc109XCJjb2x1bW5zT3B0aW9uc1wiXG4gICAgICAocC1jaGFuZ2UpPVwiY2hlY2tDaGFuZ2VzKCRldmVudCwgZmFsc2UpXCJcbiAgICA+XG4gICAgPC9wby1jaGVja2JveC1ncm91cD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInBvLXRhYmxlLWNvbHVtbi1tYW5hZ2VyLWZvb3RlclwiPlxuICAgIDxwby1idXR0b25cbiAgICAgIGNsYXNzPVwicG8tdGFibGUtY29sdW1uLW1hbmFnZXItZm9vdGVyLXJlc3RvcmVcIlxuICAgICAgcC1zbWFsbFxuICAgICAgcC1raW5kPVwidGVydGlhcnlcIlxuICAgICAgW3AtbGFiZWxdPVwibGl0ZXJhbHMucmVzdG9yZURlZmF1bHRcIlxuICAgICAgKHAtY2xpY2spPVwicmVzdG9yZSgpXCJcbiAgICA+XG4gICAgPC9wby1idXR0b24+XG4gIDwvZGl2PlxuPC9wby1wb3BvdmVyPlxuIl19
387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tdGFibGUtY29sdW1uLW1hbmFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jb21wb25lbnRzL3BvLXRhYmxlL3BvLXRhYmxlLWNvbHVtbi1tYW5hZ2VyL3BvLXRhYmxlLWNvbHVtbi1tYW5hZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvY29tcG9uZW50cy9wby10YWJsZS9wby10YWJsZS1jb2x1bW4tbWFuYWdlci9wby10YWJsZS1jb2x1bW4tbWFuYWdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7Ozs7OztJQ0svRSwyQkFBMkMsY0FBQSxvQkFBQTtJQU1yQyx3UEFBUyxpQ0FBdUIsSUFBSSxDQUFDLFNBQUUsd0JBQXdCLElBQUM7SUFLbEUsaUJBQVk7SUFDWixxQ0FRQztJQUpDLHdQQUFTLGlDQUF1QixNQUFNLENBQUMsU0FBRSx3QkFBd0IsSUFBQztJQUtwRSxpQkFBWSxFQUFBLEVBQUE7Ozs7SUFsQlYsZUFBeUI7SUFBekIsOENBQXlCLDJEQUFBO0lBVXpCLGVBQTJCO0lBQTNCLGdEQUEyQiw2REFBQTs7OztJQXBDdkMsd0NBQW9IO0lBQW5DLHlMQUFXLHdCQUFpQixJQUFJLENBQUMsSUFBQztJQUNqSCw4QkFBNEMsYUFBQTtJQUNRLFlBQTZCO0lB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LEtBQUssRUFBRSxFQUFFO1lBQzVDLElBQUksR0FBRyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssZUFBZSxFQUFFO2dCQUM3QyxPQUFPLEtBQUssQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzswR0EvVVUsNkJBQTZCO2dGQUE3Qiw2QkFBNkI7dUJBQzdCLGtCQUFrQjs7Ozs7UUN6RC9CLDZGQTREYTs7UUE1RFMsaUNBQVk7O3VGRHdEckIsNkJBQTZCO2NBSnpDLFNBQVM7MkJBQ0UseUJBQXlCOzRGQUlKLE9BQU87a0JBQXJDLFNBQVM7bUJBQUMsa0JBQWtCO1lBRVQsT0FBTztrQkFBMUIsS0FBSzttQkFBQyxXQUFXO1lBRUMsTUFBTTtrQkFBeEIsS0FBSzttQkFBQyxVQUFVO1lBRVcsYUFBYTtrQkFBeEMsS0FBSzttQkFBQyxtQkFBbUI7WUFFZ0IsMEJBQTBCO2tCQUFuRSxLQUFLO21CQUFDLGlDQUFpQztZQUVKLG9CQUFvQjtrQkFBdkQsTUFBTTttQkFBQywwQkFBMEI7WUFJRSxvQkFBb0I7a0JBQXZELE1BQU07bUJBQUMsMEJBQTBCO1lBRUwsY0FBYztrQkFBMUMsTUFBTTttQkFBQyxtQkFBbUI7WUFjQyxVQUFVO2tCQUFyQyxLQUFLO21CQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZSxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGNhcGl0YWxpemVGaXJzdExldHRlciwgY29udmVydFRvSW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdXRpbCc7XG5pbXBvcnQgeyBQb0NoZWNrYm94R3JvdXBPcHRpb24gfSBmcm9tICcuLi8uLi9wby1maWVsZC9wby1jaGVja2JveC1ncm91cC9pbnRlcmZhY2VzL3BvLWNoZWNrYm94LWdyb3VwLW9wdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9Qb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcG8tcG9wb3Zlci9wby1wb3BvdmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb0xhbmd1YWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BvLWxhbmd1YWdlL3BvLWxhbmd1YWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgcG9Mb2NhbGVEZWZhdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcG8tbGFuZ3VhZ2UvcG8tbGFuZ3VhZ2UuY29uc3RhbnQnO1xuaW1wb3J0IHsgUG9UYWJsZUNvbHVtbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvcG8tdGFibGUtY29sdW1uLmludGVyZmFjZSc7XG5cbmNvbnN0IFBvVGFibGVDb2x1bW5NYW5hZ2VyTWF4Q29sdW1uc0RlZmF1bHQgPSA5OTk5OTtcblxuZXhwb3J0IGNvbnN0IHBvVGFibGVDb2x1bW5NYW5hZ2VyTGl0ZXJhbHNEZWZhdWx0ID0ge1xuICBlbjoge1xuICAgIGNvbHVtbnNNYW5hZ2VyOiAnQ29sdW1ucyBtYW5hZ2VyJyxcbiAgICByZXN0b3JlRGVmYXVsdDogJ1Jlc3RvcmUgZGVmYXVsdCcsXG4gICAgdXA6ICd1cCcsXG4gICAgZG93bjogJ2Rvd24nXG4gIH0sXG4gIGVzOiB7XG4gICAgY29sdW1uc01hbmFnZXI6ICdHZXJlbnRlIGRlIGNvbHVtbmEnLFxuICAgIHJlc3RvcmVEZWZhdWx0OiAnUmVzdGF1cmFyIHBvciBkZWZlY3RvJyxcbiAgICB1cDogJ2FycmliYScsXG4gICAgZG93bjogJ2FiYWpvJ1xuICB9LFxuICBwdDoge1xuICAgIGNvbHVtbnNNYW5hZ2VyOiAnR2VyZW5jaWFkb3IgZGUgY29sdW5hcycsXG4gICAgcmVzdG9yZURlZmF1bHQ6ICdSZXN0YXVyYXIgcGFkcsOjbycsXG4gICAgdXA6ICdhY2ltYScsXG4gICAgZG93bjogJ2FiYWl4bydcbiAgfSxcbiAgcnU6IHtcbiAgICBjb2x1bW5zTWFuYWdlcjogJ9C80LXQvdC10LTQttC10YAg0LrQvtC70L7QvdC+0LonLFxuICAgIHJlc3RvcmVEZWZhdWx0OiAn0YHQsdGA0L7RgSDQvdCw0YHRgtGA0L7QtdC6JyxcbiAgICB1cDogJ9Cy0LLQtdGA0YUnLFxuICAgIGRvd246ICfQstC90LjQtydcbiAgfVxufTtcblxudHlwZSBEaXJlY3Rpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwby10YWJsZS1jb2x1bW4tbWFuYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wby10YWJsZS1jb2x1bW4tbWFuYWdlci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUG9UYWJsZUNvbHVtbk1hbmFnZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoUG9Qb3BvdmVyQ29tcG9uZW50KSBwb3BvdmVyOiBQb1BvcG92ZXJDb21wb25lbnQ7XG5cbiAgQElucHV0KCdwLWNvbHVtbnMnKSBjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdO1xuXG4gIEBJbnB1dCgncC10YXJnZXQnKSB0YXJnZXQ6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCdwLWNvbHVtbnMtZGVmYXVsdCcpIGNvbHVuc0RlZmF1bHQ6IEFycmF5PFBvVGFibGVDb2x1bW4+O1xuXG4gIEBJbnB1dCgncC1sYXN0LXZpc2libGUtY29sdW1ucy1zZWxlY3RlZCcpIGxhc3RWaXNpYmxlQ29sdW1uc1NlbGVjdGVkOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdO1xuXG4gIEBPdXRwdXQoJ3AtdmlzaWJsZS1jb2x1bW5zLWNoYW5nZScpIHZpc2libGVDb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxQb1RhYmxlQ29sdW1uPj4oKTtcblxuICAvLyBFdmVudG8gZGlzcGFyYWRvIGFvIGZlY2hhciBvIHBvcG92ZXIgZG8gZ2VyZW5jaWFkb3IgZGUgY29sdW5hcyBhcMOzcyBhbHRlcmFyIGFzIGNvbHVuYXMgdmlzw612ZWlzLlxuICAvLyBPIHBvLXRhYmxlIGVudmlhIGNvbW8gcGFyw6JtZXRybyB1bSBhcnJheSBkZSBzdHJpbmcgY29tIGFzIGNvbHVuYXMgdmlzw612ZWlzIGF0dWFsaXphZGFzLiBQb3IgZXhlbXBsbzogW1wiaWRDYXJkXCIsIFwibmFtZVwiLCBcImhpcmVTdGF0dXNcIiwgXCJhZ2VcIl0uXG4gIEBPdXRwdXQoJ3AtY2hhbmdlLXZpc2libGUtY29sdW1ucycpIGNoYW5nZVZpc2libGVDb2x1bW5zID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxzdHJpbmc+PigpO1xuXG4gIEBPdXRwdXQoJ3AtaW5pdGlhbC1jb2x1bW5zJykgaW5pdGlhbENvbHVtbnMgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFN0cmluZz4+KCk7XG5cbiAgbGl0ZXJhbHM7XG4gIGNvbHVtbnNPcHRpb25zOiBBcnJheTxQb0NoZWNrYm94R3JvdXBPcHRpb24+ID0gW107XG4gIHZpc2libGVDb2x1bW5zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbHVtblVwZGF0ZTtcblxuICBwcml2YXRlIF9tYXhDb2x1bW5zOiBudW1iZXIgPSBQb1RhYmxlQ29sdW1uTWFuYWdlck1heENvbHVtbnNEZWZhdWx0O1xuICBwcml2YXRlIGRlZmF1bHRDb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdO1xuICBwcml2YXRlIHJlc2l6ZUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlc3RvcmVEZWZhdWx0RXZlbnQ6IGJvb2xlYW47XG4gIHByaXZhdGUgbGFzdEVtaXR0ZWRWYWx1ZTogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSBtaW5Db2x1bW5zOiBudW1iZXIgPSAxO1xuXG4gIEBJbnB1dCgncC1tYXgtY29sdW1ucycpIHNldCBtYXhDb2x1bW5zKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhDb2x1bW5zID0gY29udmVydFRvSW50KHZhbHVlLCBQb1RhYmxlQ29sdW1uTWFuYWdlck1heENvbHVtbnNEZWZhdWx0KTtcbiAgfVxuXG4gIGdldCBtYXhDb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhDb2x1bW5zO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBsYW5ndWFnZVNlcnZpY2U6IFBvTGFuZ3VhZ2VTZXJ2aWNlKSB7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xuXG4gICAgdGhpcy5saXRlcmFscyA9IHtcbiAgICAgIC4uLnBvVGFibGVDb2x1bW5NYW5hZ2VyTGl0ZXJhbHNEZWZhdWx0W3BvTG9jYWxlRGVmYXVsdF0sXG4gICAgICAuLi5wb1RhYmxlQ29sdW1uTWFuYWdlckxpdGVyYWxzRGVmYXVsdFtsYW5ndWFnZV1cbiAgICB9O1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHsgY29sdW1ucywgbWF4Q29sdW1ucywgdGFyZ2V0IH0gPSBjaGFuZ2VzO1xuXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlQ29sdW1ucyhjb2x1bW5zKTtcbiAgICB9XG5cbiAgICBpZiAobWF4Q29sdW1ucykge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZXModGhpcy5jb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICB9XG5cbiAgLy8gYXF1aSBjaGVnYW0gb3MgZXZlbnRvcyBkbyBjaGVja2JveCBlIGRvIGNsb3NlIGRvIHBvcG92ZXIgcXVlIHRhbWLDqW0gw6kgZGlzcGFyYWRvIG5vIHJlc2l6ZVxuICBjaGVja0NoYW5nZXMoZXZlbnQ6IEFycmF5PHN0cmluZz4gPSBbXSwgZW1pdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy52ZXJpZnlUb0VtaXRDaGFuZ2UoZXZlbnQpO1xuXG4gICAgaWYgKGVtaXQpIHtcbiAgICAgIC8vIGNvbnRyb2xhIGVtaXNzw7VlcyBwYXJhIG8gZGV2XG4gICAgICB0aGlzLnZlcmlmeVRvRW1pdFZpc2libGVDb2x1bW5zKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzdG9yZSgpIHtcbiAgICB0aGlzLnJlc3RvcmVEZWZhdWx0RXZlbnQgPSB0cnVlO1xuICAgIGNvbnN0IGRlZmF1bHRDb2x1bW5zID0gdGhpcy5nZXRWaXNpYmxlQ29sdW1ucyh0aGlzLmRlZmF1bHRDb2x1bW5zKTtcbiAgICB0aGlzLmluaXRpYWxDb2x1bW5zLmVtaXQodGhpcy5nZXRWaXNpYmxlQ29sdW1ucyh0aGlzLmNvbHVuc0RlZmF1bHQpKTtcbiAgICB0aGlzLmNoZWNrQ2hhbmdlcyhkZWZhdWx0Q29sdW1ucywgdGhpcy5yZXN0b3JlRGVmYXVsdEV2ZW50KTtcbiAgfVxuXG4gIGNoYW5nZVBvc2l0aW9uKG9wdGlvbiwgZGlyZWN0aW9uOiBEaXJlY3Rpb24pIHtcbiAgICBjb25zdCBpbmRleENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwucHJvcGVydHkgPT09IG9wdGlvbi52YWx1ZSk7XG4gICAgY29uc3QgbmV3Q29sdW1uID0gWy4uLnRoaXMuY29sdW1uc107XG5cbiAgICBjb25zdCBoYXNEaXNhYmxlZDogYm9vbGVhbiA9IHRoaXMudmVyaWZ5QXJyb3dEaXNhYmxlZChvcHRpb24sIGRpcmVjdGlvbik7XG5cbiAgICB0aGlzLmNoYW5nZVBvc2l0aW9uQ29sdW1uKG5ld0NvbHVtbiwgaW5kZXhDb2x1bW4sIGRpcmVjdGlvbiwgaGFzRGlzYWJsZWQpO1xuICAgIHRoaXMuY29sdW1ucyA9IG5ld0NvbHVtbjtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zQ2hhbmdlLmVtaXQodGhpcy5jb2x1bW5zKTtcbiAgfVxuXG4gIHZlcmlmeUFycm93RGlzYWJsZWQob3B0aW9uLCBkaXJlY3Rpb246IERpcmVjdGlvbikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmZpbmRJbmRleChlbCA9PiBlbC5wcm9wZXJ0eSA9PT0gb3B0aW9uLnZhbHVlKTtcbiAgICBjb25zdCBleGlzdHNEZXRhaWwgPSB0aGlzLmNvbHVtbnMuc29tZShmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBlbC5wcm9wZXJ0eSA9PT0gJ2RldGFpbCc7XG4gICAgfSk7XG4gICAgY29uc3QgdmFsdWVTdWJ0cmFjdGlvbiA9IGV4aXN0c0RldGFpbCA/IDIgOiAxO1xuXG4gICAgaWYgKGluZGV4ID09PSAwICYmIGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLmNvbHVtbnMubGVuZ3RoIC0gdmFsdWVTdWJ0cmFjdGlvbiAmJiBkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VQb3NpdGlvbkNvbHVtbihhcnJheTogQXJyYXk8UG9UYWJsZUNvbHVtbj4sIGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogRGlyZWN0aW9uLCBoYXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGlmICghaGFzRGlzYWJsZWQpIHtcbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcpIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAwLCBhcnJheS5zcGxpY2UoaW5kZXggLSAxLCAxKVswXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDAsIGFycmF5LnNwbGljZShpbmRleCArIDEsIDEpWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeVRvRW1pdENoYW5nZShldmVudDogQXJyYXk8c3RyaW5nPikge1xuICAgIGNvbnN0IG5ld0NvbHVtbnMgPSBbLi4uZXZlbnRdO1xuICAgIGlmIChuZXdDb2x1bW5zLmxlbmd0aCA+PSAxICYmIHRoaXMuYWxsb3dzQ2hhbmdlVmlzaWJsZUNvbHVtbnMoKSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlc1RvU2VsZWN0ZWRDb2x1bW5zKG5ld0NvbHVtbnMpO1xuICAgIH1cbiAgICAvLyBEZXNhYmlsaXRhIHVsdGltbyBjaGVja2JveCBhdGl2b1xuICAgIGlmIChuZXdDb2x1bW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgY29sdW1uc09wdGlvbnMgPSB0aGlzLm1hcFRhYmxlQ29sdW1uc1RvQ2hlY2tib3hPcHRpb25zKHRoaXMuY29sdW1uVXBkYXRlKTtcbiAgICAgIHRoaXMuY29sdW1uc09wdGlvbnMgPSB0aGlzLmRpc2FibGVkTGFzdENvbHVtbihjb2x1bW5zT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlc1RvU2VsZWN0ZWRDb2x1bW5zKG5ld0NvbHVtbnM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gWy4uLm5ld0NvbHVtbnNdO1xuICAgIGNvbnN0IHZpc2libGVUYWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVUYWJsZUNvbHVtbnModGhpcy52aXNpYmxlQ29sdW1ucyk7XG5cbiAgICAvLyBlbWl0ZSBhbHRlcmHDp8OjbyBuYXMgY29sdW5hcyBzZWxlY2lvbmFkYXMsIHBvcsOpbSBuw6NvIGVtaXRlIHBhcmEgbyBkZXYuXG4gICAgdGhpcy52aXNpYmxlQ29sdW1uc0NoYW5nZS5lbWl0KHZpc2libGVUYWJsZUNvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbGxvd3NDaGFuZ2VWaXNpYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlVGFibGVDb2x1bW5zID0gdGhpcy5nZXRWaXNpYmxlVGFibGVDb2x1bW5zKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaW5naWZ5KHZpc2libGVUYWJsZUNvbHVtbnMpICE9PSB0aGlzLnN0cmluZ2lmeSh0aGlzLmNvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlUb0VtaXRWaXNpYmxlQ29sdW1ucygpIHtcbiAgICBpZiAodGhpcy5yZXN0b3JlRGVmYXVsdEV2ZW50KSB7XG4gICAgICAvLyB2ZWlvIGRvIHJlc3RvcmUgZGVmYXVsdFxuICAgICAgdGhpcy52ZXJpZnlSZXN0b3JlVmFsdWVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZvaSBkaXNwYXJhZG8gbm8gY2xvc2UgcG9wb3ZlcjtcbiAgICAgIHRoaXMudmVyaWZ5T25DbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5UmVzdG9yZVZhbHVlcygpIHtcbiAgICBjb25zdCBkZWZhdWx0Q29sdW1ucyA9IFsuLi50aGlzLmRlZmF1bHRDb2x1bW5zXTtcbiAgICBjb25zdCBkZWZhdWx0VmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVDb2x1bW5zKGRlZmF1bHRDb2x1bW5zKTtcblxuICAgIGlmICh0aGlzLmFsbG93c0NoYW5nZVNlbGVjdGVkQ29sdW1ucyhkZWZhdWx0VmlzaWJsZUNvbHVtbnMpKSB7XG4gICAgICB0aGlzLnZpc2libGVDb2x1bW5zQ2hhbmdlLmVtaXQodGhpcy5kZWZhdWx0Q29sdW1ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXN0b3JlRGVmYXVsdEV2ZW50ID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFsbG93c0NoYW5nZVNlbGVjdGVkQ29sdW1ucyhkZWZhdWx0VmlzaWJsZUNvbHVtbnM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbnModGhpcy5jb2x1bW5zKTtcblxuICAgIHJldHVybiAhdGhpcy5pc0VxdWFsQXJyYXlzKGRlZmF1bHRWaXNpYmxlQ29sdW1ucywgdmlzaWJsZUNvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlPbkNsb3NlKCkge1xuICAgIGlmICh0aGlzLmFsbG93c0VtaXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuZW1pdFZpc2libGVDb2x1bW5zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VmlzaWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5sYXN0RW1pdHRlZFZhbHVlID0gWy4uLnRoaXMudmlzaWJsZUNvbHVtbnNdO1xuICAgIHRoaXMuY2hhbmdlVmlzaWJsZUNvbHVtbnMuZW1pdCh0aGlzLnZpc2libGVDb2x1bW5zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWxsb3dzRW1pc3Npb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXBkYXRlZFZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucyA/IFsuLi50aGlzLnZpc2libGVDb2x1bW5zXSA6IFtdO1xuICAgIGNvbnN0IGxhc3RFbWl0dGVkVmFsdWUgPSB0aGlzLmxhc3RFbWl0dGVkVmFsdWUgPyBbLi4udGhpcy5sYXN0RW1pdHRlZFZhbHVlXSA6IFtdO1xuICAgIGNvbnN0IGxhc3RWaXNpYmxlQ29sdW1uc1NlbGVjdGVkID0gdGhpcy5sYXN0VmlzaWJsZUNvbHVtbnNTZWxlY3RlZCA/IFsuLi50aGlzLmxhc3RWaXNpYmxlQ29sdW1uc1NlbGVjdGVkXSA6IFtdO1xuICAgIGNvbnN0IGxhc3RWaXNpYmxlQ29sdW1ucyA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbnMobGFzdFZpc2libGVDb2x1bW5zU2VsZWN0ZWQpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNVcGRhdGUodXBkYXRlZFZpc2libGVDb2x1bW5zLCBsYXN0RW1pdHRlZFZhbHVlKSB8fFxuICAgICAgdGhpcy5pc0ZpcnN0VGltZSh1cGRhdGVkVmlzaWJsZUNvbHVtbnMsIGxhc3RWaXNpYmxlQ29sdW1ucylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ZpcnN0VGltZSh1cGRhdGVkVmlzaWJsZUNvbHVtbnM6IEFycmF5PHN0cmluZz4sIGxhc3RWaXNpYmxlQ29sdW1uczogQXJyYXk8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5sYXN0RW1pdHRlZFZhbHVlICYmICF0aGlzLmlzRXF1YWxBcnJheXModXBkYXRlZFZpc2libGVDb2x1bW5zLCBsYXN0VmlzaWJsZUNvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1VwZGF0ZSh1cGRhdGVkVmlzaWJsZUNvbHVtbnM6IEFycmF5PHN0cmluZz4sIGxhc3RFbWl0dGVkVmFsdWU6IEFycmF5PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0RW1pdHRlZFZhbHVlICYmICF0aGlzLmlzRXF1YWxBcnJheXModXBkYXRlZFZpc2libGVDb2x1bW5zLCBsYXN0RW1pdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNFcXVhbEFycmF5cyhmaXJzdDogQXJyYXk8c3RyaW5nPiwgc2Vjb25kOiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb25lID0gZmlyc3QgPyBbLi4uZmlyc3RdIDogW107XG4gICAgY29uc3QgdHdvID0gc2Vjb25kID8gWy4uLnNlY29uZF0gOiBbXTtcbiAgICBjb25zdCBmaXJzdFNvcnQgPSBvbmUuc2xpY2UoKTtcbiAgICBjb25zdCBzZWNvbmRTb3J0ID0gdHdvLnNsaWNlKCk7XG4gICAgY29uc3QgZmlyc3RTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShmaXJzdFNvcnQpO1xuICAgIGNvbnN0IHNlY29uZFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHNlY29uZFNvcnQpO1xuXG4gICAgcmV0dXJuIGZpcnN0U3RyaW5nID09PSBzZWNvbmRTdHJpbmc7XG4gIH1cblxuICAvLyBkZXNhYmlsaXRhcsOhIGFzIGNvbHVuYXMsIHF1ZSBuw6NvIGVzdGl2ZXJlbSBzZWxlY2lvbmFkYXMsIGFww7NzIGV4ZWRlciBvIG51bWVybyBtYXhpbW8gZGUgY29sdW5hcy5cbiAgcHJpdmF0ZSBkaXNhYmxlQ29sdW1uc09wdGlvbnMoY29sdW1uczogQXJyYXk8UG9DaGVja2JveEdyb3VwT3B0aW9uPiA9IFtdKSB7XG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgLi4uY29sdW1uLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEaXNhYmxlQ29sdW1uKGNvbHVtbi52YWx1ZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtblRpdGxlTGFiZWwoY29sdW1uOiBQb1RhYmxlQ29sdW1uKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5sYWJlbCB8fCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoY29sdW1uLnByb3BlcnR5KTtcbiAgfVxuXG4gIC8qKiBSZXRvcm5hIHVtIEFycmF5IGRlIGNvbHVtbi5wcm9wZXJ0eSBkYXMgY29sdW5hcyBxdWUgc8OjbyB2aXNpdmVpcy4gKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlQ29sdW1ucyhjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPik6IEFycmF5PHN0cmluZz4ge1xuICAgIGxldCB2aXNpYmxlQ29sdW1ucyA9IFtdO1xuXG4gICAgY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICBpZiAodGhpcy5pc1Zpc2libGVDb2x1bW4oY29sdW1uLCB2aXNpYmxlQ29sdW1ucykpIHtcbiAgICAgICAgdmlzaWJsZUNvbHVtbnMgPSBbLi4udmlzaWJsZUNvbHVtbnMsIGNvbHVtbi5wcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnM7XG4gIH1cblxuICBwcml2YXRlIGlzVmlzaWJsZUNvbHVtbihjb2x1bW46IFBvVGFibGVDb2x1bW4sIHZpc2libGVDb2x1bW5zOiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbHVtbi52aXNpYmxlICE9PSBmYWxzZSAmJiB2aXNpYmxlQ29sdW1ucy5sZW5ndGggPCB0aGlzLm1heENvbHVtbnMgJiYgY29sdW1uLnR5cGUgIT09ICdkZXRhaWwnO1xuICB9XG5cbiAgLyoqIFJldG9ybmEgdW0gQXJyYXkgUG9UYWJsZUNvbHVtbiBhIHBhcnRpciBkYXMgY29sdW5hcyB2aXNpdmVpcyBubyBnZXJlbmNpYWRvciBkZSBjb2x1bmFzLiAqL1xuICBwcml2YXRlIGdldFZpc2libGVUYWJsZUNvbHVtbnModmlzaWJsZUNvbHVtbnM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxQb1RhYmxlQ29sdW1uPiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucyA/IFsuLi50aGlzLmNvbHVtbnNdIDogW107XG5cbiAgICByZXR1cm4gY29sdW1ucy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICB2aXNpYmxlOiB2aXNpYmxlQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4ucHJvcGVydHkpIHx8IGNvbHVtbi50eXBlID09PSAnZGV0YWlsJ1xuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxpc3RlbmVycygpIHtcbiAgICB0aGlzLnJlc2l6ZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wb3BvdmVyICYmICF0aGlzLnBvcG92ZXIuaXNIaWRkZW4pIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzRGlzYWJsZUNvbHVtbihwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoID49IHRoaXMubWF4Q29sdW1ucyA/ICF0aGlzLnZpc2libGVDb2x1bW5zLmluY2x1ZGVzKHByb3BlcnR5KSA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBUYWJsZUNvbHVtbnNUb0NoZWNrYm94T3B0aW9ucyhjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPiA9IFtdKSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5zID0gWy4uLmNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbHVtbnNPcHRpb25zID0gW107XG5cbiAgICB0YWJsZUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbi50eXBlICE9PSAnZGV0YWlsJykge1xuICAgICAgICBjb2x1bW5zT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLnByb3BlcnR5LFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmdldENvbHVtblRpdGxlTGFiZWwoY29sdW1uKSxcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0Rpc2FibGVDb2x1bW4oY29sdW1uLnByb3BlcnR5KSxcbiAgICAgICAgICB2aXNpYmxlOiBjb2x1bW4udmlzaWJsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb2x1bW5zT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZWRMYXN0Q29sdW1uKGNvbHVtbnM6IEFycmF5PGFueT4pIHtcbiAgICByZXR1cm4gY29sdW1ucy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkaXNhYmxlZDogY29sdW1uLnR5cGUgIT09ICdkZXRhaWwnICYmIGNvbHVtbi52aXNpYmxlID8gdHJ1ZSA6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZUNvbHVtbnMoY29sdW1uczogU2ltcGxlQ2hhbmdlKSB7XG4gICAgY29uc3QgeyBjdXJyZW50VmFsdWUgPSBbXSwgcHJldmlvdXNWYWx1ZSA9IFtdIH0gPSBjb2x1bW5zO1xuICAgIHRoaXMuY29sdW1uVXBkYXRlID0gY29sdW1ucy5jdXJyZW50VmFsdWU7XG5cbiAgICAvLyBhdHVhbGl6YXJhIG8gZGVmYXVsdENvbHVtbnMsIHF1YW5kbyBmb3IgYSBwcmltZWlyYSB2ZXogb3UgcXVhbmRvIG8gZGVmYXVsdENvbHVtbnMgZm9yIGRpZmVyZW50ZSBkbyBjdXJyZW50VmFsdWVcbiAgICBpZiAoIXRoaXMubGFzdFZpc2libGVDb2x1bW5zU2VsZWN0ZWQgJiYgdGhpcy5zdHJpbmdpZnkodGhpcy5kZWZhdWx0Q29sdW1ucykgIT09IHRoaXMuc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSBbLi4uY3VycmVudFZhbHVlXTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZmljYSBzZSBvIHZhbG9yIGFudGVyaW9yIMOpIGRpZmVyZW50ZSBkbyBhdHVhbCBwYXJhIGF0dWFsaXphciBhcyBjb2x1bW5zT3B0aW9ucyBhcGVuYXMgcXVhbmRvIGZvciBuZWNlc3NhcmlvXG4gICAgaWYgKHRoaXMuc3RyaW5naWZ5KHByZXZpb3VzVmFsdWUpICE9PSB0aGlzLnN0cmluZ2lmeShjdXJyZW50VmFsdWUpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlcyhjdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsdWVzKGN1cnJlbnRWYWx1ZTogQXJyYXk8UG9UYWJsZUNvbHVtbj4pIHtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbnMoY3VycmVudFZhbHVlKTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gWy4uLnZpc2libGVDb2x1bW5zXTtcblxuICAgIGNvbnN0IGNvbHVtbnNPcHRpb25zID0gdGhpcy5tYXBUYWJsZUNvbHVtbnNUb0NoZWNrYm94T3B0aW9ucyhjdXJyZW50VmFsdWUpO1xuICAgIHRoaXMuY29sdW1uc09wdGlvbnMgPSB0aGlzLmRpc2FibGVDb2x1bW5zT3B0aW9ucyhjb2x1bW5zT3B0aW9ucyk7XG5cbiAgICB0aGlzLmNoZWNrQ2hhbmdlcyh2aXNpYmxlQ29sdW1ucywgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMucmVzaXplTGlzdGVuZXIpIHtcbiAgICAgIHRoaXMucmVzaXplTGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0cmluZ2lmeShjb2x1bW5zOiBBcnJheTxQb1RhYmxlQ29sdW1uPikge1xuICAgIC8vIG7Do28gZmF6IG8gc3RyaW5naWZ5IGRhIHByb3ByaWVkYWRlIGljb24gZSBzZWFyY2hTZXJ2aWNlLCBwb2lzIHBvZGUgY29udGVyIG9iamV0byBjb21wbGV4byBlIGRpc3BhcmFyIHVtIGVycm8uXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbHVtbnMsIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWNvbicgJiYga2V5ICE9PSAnc2VhcmNoU2VydmljZScpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8cG8tcG9wb3ZlciAjcG9wb3ZlciAqbmdJZj1cInRhcmdldFwiIFtwLXRhcmdldF09XCJ0YXJnZXRcIiBwLXBvc2l0aW9uPVwiYm90dG9tLWxlZnRcIiAocC1jbG9zZSk9XCJjaGVja0NoYW5nZXMoW10sIHRydWUpXCI+XG4gIDxkaXYgY2xhc3M9XCJwby10YWJsZS1jb2x1bW4tbWFuYWdlci1oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicG8tdGFibGUtY29sdW1uLW1hbmFnZXItaGVhZGVyLXRpdGxlXCI+e3sgbGl0ZXJhbHMuY29sdW1uc01hbmFnZXIgfX08L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJwby10YWJsZS1jb2x1bW4tbWFuYWdlci1oZWFkZXItY2xvc2VcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJwby10YWJsZS1jb2x1bW4tbWFuYWdlci1oZWFkZXItY2xvc2UtYnV0dG9uIHBvLWNsaWNrYWJsZSBwby1pY29uIHBvLWljb24tY2xvc2VcIlxuICAgICAgICAoY2xpY2spPVwicG9wb3Zlci5jbG9zZSgpXCJcbiAgICAgID48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInBvLXRhYmxlLWNvbHVtbi1tYW5hZ2VyLWJvZHlcIj5cbiAgICA8cG8tY2hlY2tib3gtZ3JvdXBcbiAgICAgIG5hbWU9XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICBbKG5nTW9kZWwpXT1cInZpc2libGVDb2x1bW5zXCJcbiAgICAgIHAtY29sdW1ucz1cIjFcIlxuICAgICAgW3Atb3B0aW9uc109XCJjb2x1bW5zT3B0aW9uc1wiXG4gICAgICAocC1jaGFuZ2UpPVwiY2hlY2tDaGFuZ2VzKCRldmVudCwgZmFsc2UpXCJcbiAgICA+XG4gICAgPC9wby1jaGVja2JveC1ncm91cD5cblxuICAgIDxkaXYgY2xhc3M9XCJwby1jb250YWluZXItYXJyb3dzLWNvbHVtbnMtbWFuYWdlclwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbHVtbnNPcHRpb25zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwby1jb250YWluZXItaWNvbnMtYXJyb3dzLWNvbHVtbnMtbWFuYWdlclwiPlxuICAgICAgICAgIDxwby1idXR0b25cbiAgICAgICAgICAgIFtwLXRvb2x0aXBdPVwibGl0ZXJhbHMudXBcIlxuICAgICAgICAgICAgcC10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICBbcC1kaXNhYmxlZF09XCJ2ZXJpZnlBcnJvd0Rpc2FibGVkKG9wdGlvbiwgJ3VwJylcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVBvc2l0aW9uKG9wdGlvbiwgJ3VwJyk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICBwLWtpbmQ9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICBwLWljb249XCJwby1pY29uIHBvLWljb24tYXJyb3ctdXBcIlxuICAgICAgICAgICAgcC1zbWFsbFxuICAgICAgICAgID5cbiAgICAgICAgICA8L3BvLWJ1dHRvbj5cbiAgICAgICAgICA8cG8tYnV0dG9uXG4gICAgICAgICAgICBbcC10b29sdGlwXT1cImxpdGVyYWxzLmRvd25cIlxuICAgICAgICAgICAgcC10b29sdGlwLXBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgIFtwLWRpc2FibGVkXT1cInZlcmlmeUFycm93RGlzYWJsZWQob3B0aW9uLCAnZG93bicpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VQb3NpdGlvbihvcHRpb24sICdkb3duJyk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICBwLWtpbmQ9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICBwLWljb249XCJwby1pY29uIHBvLWljb24tYXJyb3ctZG93blwiXG4gICAgICAgICAgICBwLXNtYWxsXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvcG8tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwicG8tdGFibGUtY29sdW1uLW1hbmFnZXItZm9vdGVyXCI+XG4gICAgPHBvLWJ1dHRvblxuICAgICAgY2xhc3M9XCJwby10YWJsZS1jb2x1bW4tbWFuYWdlci1mb290ZXItcmVzdG9yZVwiXG4gICAgICBwLXNtYWxsXG4gICAgICBwLWtpbmQ9XCJ0ZXJ0aWFyeVwiXG4gICAgICBbcC1sYWJlbF09XCJsaXRlcmFscy5yZXN0b3JlRGVmYXVsdFwiXG4gICAgICAocC1jbGljayk9XCJyZXN0b3JlKClcIlxuICAgID5cbiAgICA8L3BvLWJ1dHRvbj5cbiAgPC9kaXY+XG48L3BvLXBvcG92ZXI+XG4iXX0=