@one-grid-core/angular 0.1.0-beta.6 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +49 -4
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +67 -16
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +282 -30
  4. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +10 -7
  5. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +60 -4
  6. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +14 -5
  7. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +50 -13
  8. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +39 -15
  9. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +54 -8
  10. package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +110 -0
  11. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +9 -2
  12. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +33 -51
  13. package/esm2022/lib/core/instants/one-grid-api.class.mjs +429 -166
  14. package/esm2022/lib/core/instants/one-row-node.class.mjs +103 -37
  15. package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
  16. package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
  17. package/esm2022/lib/core/models/one-grid-types.model.mjs +1 -1
  18. package/esm2022/lib/core/models/one-row-drag.model.mjs +2 -0
  19. package/esm2022/lib/core/models/one-row.model.mjs +1 -1
  20. package/esm2022/lib/core/models/one-tree-data.model.mjs +1 -1
  21. package/esm2022/lib/core/models/one-validation.model.mjs +1 -1
  22. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +8 -3
  23. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -1
  24. package/esm2022/lib/core/services/og-column.service.mjs +120 -13
  25. package/esm2022/lib/core/services/one-grid-cell.service.mjs +147 -22
  26. package/esm2022/lib/core/services/one-grid-row-drag.service.mjs +351 -0
  27. package/esm2022/lib/core/services/one-grid-selection.service.mjs +19 -6
  28. package/esm2022/lib/helpers/one-column-def.helper.mjs +27 -2
  29. package/esm2022/lib/helpers/one-filter.helper.mjs +71 -12
  30. package/esm2022/lib/helpers/one-validation.helper.mjs +7 -2
  31. package/esm2022/lib/index.mjs +6 -1
  32. package/esm2022/lib/one-grid.module.mjs +7 -16
  33. package/fesm2022/one-grid-core-angular.mjs +1988 -423
  34. package/fesm2022/one-grid-core-angular.mjs.map +1 -1
  35. package/lib/components/one-grid/one-grid.component.d.ts +16 -1
  36. package/lib/components/one-grid-body/one-grid-body.component.d.ts +132 -5
  37. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +6 -1
  38. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +19 -2
  39. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +5 -2
  40. package/lib/components/one-grid-header/one-grid-header.component.d.ts +15 -7
  41. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +24 -5
  42. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +44 -0
  43. package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +39 -0
  44. package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -9
  45. package/lib/core/instants/one-grid-api.class.d.ts +212 -26
  46. package/lib/core/instants/one-row-node.class.d.ts +67 -14
  47. package/lib/core/models/one-column-def-types.model.d.ts +89 -15
  48. package/lib/core/models/one-event-types.model.d.ts +24 -1
  49. package/lib/core/models/one-grid-types.model.d.ts +36 -1
  50. package/lib/core/models/one-row-drag.model.d.ts +44 -0
  51. package/lib/core/models/one-row.model.d.ts +0 -5
  52. package/lib/core/models/one-tree-data.model.d.ts +13 -0
  53. package/lib/core/models/one-validation.model.d.ts +12 -2
  54. package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
  55. package/lib/core/services/og-column.service.d.ts +44 -3
  56. package/lib/core/services/one-grid-cell.service.d.ts +68 -4
  57. package/lib/core/services/one-grid-row-drag.service.d.ts +113 -0
  58. package/lib/core/services/one-grid-selection.service.d.ts +9 -0
  59. package/lib/helpers/one-column-def.helper.d.ts +19 -1
  60. package/lib/helpers/one-filter.helper.d.ts +29 -4
  61. package/lib/index.d.ts +5 -0
  62. package/lib/one-grid.module.d.ts +17 -19
  63. package/package.json +1 -2
  64. package/scss/_one-grid.scss +389 -17
  65. package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +0 -26
  66. package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +0 -9
@@ -18,31 +18,56 @@ export class OneGridPaginationComponent {
18
18
  this.goToNext = new EventEmitter();
19
19
  this.goToLast = new EventEmitter();
20
20
  this.pageSizeChange = new EventEmitter();
21
- this.pageSize = OnePageSizeOption[0];
22
- this.pageSizeOptions = OnePageSizeOption;
23
21
  }
24
- ngAfterViewInit() {
25
- if (this.paginate?.pageSizeOptions) {
26
- this.pageSizeOptions = this.paginate.pageSizeOptions;
27
- }
22
+ /**
23
+ * The page size the bar shows.
24
+ *
25
+ * Derived from the input rather than held locally. The bar is a display of
26
+ * the host's paging state — it does not own it — and a local copy meant a
27
+ * host that supplied `perPage: 50` still saw "25 rows" selected.
28
+ */
29
+ get pageSize() {
30
+ return this.paginate?.perPage ?? OnePageSizeOption[0];
31
+ }
32
+ /**
33
+ * The size options offered.
34
+ *
35
+ * Also derived. These used to be copied out of the input in
36
+ * `ngAfterViewInit` — after the view had already been checked with the
37
+ * defaults — so any grid supplying its own options threw `NG0100` in dev
38
+ * mode, and later changes to the list were ignored entirely.
39
+ */
40
+ get pageSizeOptions() {
41
+ return this.paginate?.pageSizeOptions?.length ? this.paginate.pageSizeOptions : OnePageSizeOption;
42
+ }
43
+ /** Whether there is a page before the current one. */
44
+ get hasPrevious() {
45
+ return this.pageCount > 1 && (this.paginate?.currentPage ?? 1) > 1;
46
+ }
47
+ /** Whether there is a page after the current one. */
48
+ get hasNext() {
49
+ return this.pageCount > 1 && (this.paginate?.currentPage ?? 1) < (this.paginate?.lastPage ?? 1);
50
+ }
51
+ get pageCount() {
52
+ return this.paginate?.lastPage ?? 1;
28
53
  }
29
54
  goToFirstPage() {
30
- if (!(this.paginate?.perPage < this.paginate?.total && this.paginate?.currentPage > 1))
55
+ if (!this.hasPrevious)
31
56
  return;
32
57
  this.goToFirst.emit(this.paginate?.currentPage);
33
58
  }
34
59
  goToPreviousPage() {
35
- if (!(this.paginate?.perPage < this.paginate?.total && this.paginate?.currentPage > 1))
60
+ if (!this.hasPrevious)
36
61
  return;
37
62
  this.goToPrevious.emit(this.paginate?.currentPage);
38
63
  }
39
64
  goToNextPage() {
40
- if (!(this.paginate?.perPage < this.paginate?.total && this.paginate?.currentPage < this.paginate?.lastPage))
65
+ if (!this.hasNext)
41
66
  return;
42
67
  this.goToNext.emit(this.paginate?.currentPage);
43
68
  }
44
69
  goToLastPage() {
45
- if (!(this.paginate?.perPage < this.paginate?.total && this.paginate?.currentPage < this.paginate?.lastPage))
70
+ if (!this.hasNext)
46
71
  return;
47
72
  this.goToLast.emit(this.paginate?.currentPage);
48
73
  }
@@ -50,16 +75,15 @@ export class OneGridPaginationComponent {
50
75
  const select = event.target;
51
76
  const newSize = Number(select.value);
52
77
  if (newSize !== this.pageSize) {
53
- this.pageSize = newSize;
54
- this.pageSizeChange.emit(this.pageSize);
78
+ this.pageSizeChange.emit(newSize);
55
79
  }
56
80
  }
57
81
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
58
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridPaginationComponent, selector: "one-grid-pagination", inputs: { paginate: "paginate" }, outputs: { goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<div class=\"one-grid-pagination\">\n <div class=\"one-pagination-row\">\n @if (paginate?.firstRowIndex > 0 && paginate?.lastRowIndex > 0 && paginate?.total > 0) {\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <span>{{ paginate?.firstRowIndex }}</span>\n <span>-</span>\n <span>{{ paginate?.lastRowIndex }}</span>\n &nbsp;<span>/</span>&nbsp;\n <span>{{ paginate?.total }}</span>\n </div>\n </div>\n }\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <button \n class=\"one-pagination-btn\"\n (click)=\"goToFirstPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage > 1)\">\n <lucide-icon name=\"chevron-first\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n class=\"one-pagination-btn\"\n (click)=\"goToPreviousPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage > 1)\">\n <lucide-icon name=\"chevron-left\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <div class=\"one-pagination-column\">\n &nbsp;{{ paginate?.currentPage }}<span>/</span>{{ paginate?.lastPage }}&nbsp;\n </div>\n <div class=\"one-pagination-column\">\n <button\n class=\"one-pagination-btn\"\n (click)=\"goToNextPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage < paginate?.lastPage)\">\n <lucide-icon name=\"chevron-right\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n class=\"one-pagination-btn\"\n (click)=\"goToLastPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage < paginate?.lastPage)\">\n <lucide-icon name=\"chevron-last\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <select name=\"row-per-page\" [value]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n @for (size of pageSizeOptions; track $index) {\n <option [value]=\"size\">{{ size }} rows</option>\n }\n </select>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i2.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] }); }
82
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridPaginationComponent, selector: "one-grid-pagination", inputs: { paginate: "paginate" }, outputs: { goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<!-- A navigation landmark, so the bar is reachable as one thing rather than as\n four unlabelled icon buttons floating under the grid. -->\n<div class=\"one-grid-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n <div class=\"one-pagination-row\">\n @if (paginate?.firstRowIndex > 0 && paginate?.lastRowIndex > 0 && paginate?.total > 0) {\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <span>{{ paginate?.firstRowIndex }}</span>\n <span>-</span>\n <span>{{ paginate?.lastRowIndex }}</span>\n &nbsp;<span>/</span>&nbsp;\n <span>{{ paginate?.total }}</span>\n </div>\n </div>\n }\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <!-- `type=\"button\"` so the bar cannot submit a surrounding form,\n a real `disabled` rather than a class that only stops the\n mouse, and a name on every icon-only control. -->\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"First page\"\n title=\"First page\"\n [disabled]=\"!hasPrevious\"\n [class.disabled]=\"!hasPrevious\"\n (click)=\"goToFirstPage()\">\n <lucide-icon name=\"chevron-first\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"Previous page\"\n title=\"Previous page\"\n [disabled]=\"!hasPrevious\"\n [class.disabled]=\"!hasPrevious\"\n (click)=\"goToPreviousPage()\">\n <lucide-icon name=\"chevron-left\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <!-- Announced as a live region: the numbers are the only feedback a\n screen reader gets that the page actually changed. -->\n <div class=\"one-pagination-column\" role=\"status\" aria-live=\"polite\">\n &nbsp;<span class=\"one-grid-visually-hidden\">Page </span>{{ paginate?.currentPage }}<span>/</span>{{ paginate?.lastPage }}&nbsp;\n </div>\n <div class=\"one-pagination-column\">\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"Next page\"\n title=\"Next page\"\n [disabled]=\"!hasNext\"\n [class.disabled]=\"!hasNext\"\n (click)=\"goToNextPage()\">\n <lucide-icon name=\"chevron-right\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"Last page\"\n title=\"Last page\"\n [disabled]=\"!hasNext\"\n [class.disabled]=\"!hasNext\"\n (click)=\"goToLastPage()\">\n <lucide-icon name=\"chevron-last\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <!-- `[selected]` per option, not `[value]` on the select:\n with options rendered by `@for`, the select's value is\n set before they exist and does not stick. -->\n <select name=\"row-per-page\" aria-label=\"Rows per page\" (change)=\"onPageSizeChange($event)\">\n @for (size of pageSizeOptions; track size) {\n <option [value]=\"size\" [selected]=\"size === pageSize\">{{ size }} rows</option>\n }\n </select>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i2.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }] }); }
59
83
  }
60
84
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridPaginationComponent, decorators: [{
61
85
  type: Component,
62
- args: [{ standalone: false, selector: 'one-grid-pagination', template: "<div class=\"one-grid-pagination\">\n <div class=\"one-pagination-row\">\n @if (paginate?.firstRowIndex > 0 && paginate?.lastRowIndex > 0 && paginate?.total > 0) {\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <span>{{ paginate?.firstRowIndex }}</span>\n <span>-</span>\n <span>{{ paginate?.lastRowIndex }}</span>\n &nbsp;<span>/</span>&nbsp;\n <span>{{ paginate?.total }}</span>\n </div>\n </div>\n }\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <button \n class=\"one-pagination-btn\"\n (click)=\"goToFirstPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage > 1)\">\n <lucide-icon name=\"chevron-first\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n class=\"one-pagination-btn\"\n (click)=\"goToPreviousPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage > 1)\">\n <lucide-icon name=\"chevron-left\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <div class=\"one-pagination-column\">\n &nbsp;{{ paginate?.currentPage }}<span>/</span>{{ paginate?.lastPage }}&nbsp;\n </div>\n <div class=\"one-pagination-column\">\n <button\n class=\"one-pagination-btn\"\n (click)=\"goToNextPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage < paginate?.lastPage)\">\n <lucide-icon name=\"chevron-right\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n class=\"one-pagination-btn\"\n (click)=\"goToLastPage()\"\n [class.disabled]=\"!(paginate?.perPage < paginate?.total && paginate?.currentPage < paginate?.lastPage)\">\n <lucide-icon name=\"chevron-last\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <select name=\"row-per-page\" [value]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n @for (size of pageSizeOptions; track $index) {\n <option [value]=\"size\">{{ size }} rows</option>\n }\n </select>\n </div>\n </div>\n </div>\n </div>\n</div>" }]
86
+ args: [{ standalone: false, selector: 'one-grid-pagination', template: "<!-- A navigation landmark, so the bar is reachable as one thing rather than as\n four unlabelled icon buttons floating under the grid. -->\n<div class=\"one-grid-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n <div class=\"one-pagination-row\">\n @if (paginate?.firstRowIndex > 0 && paginate?.lastRowIndex > 0 && paginate?.total > 0) {\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <span>{{ paginate?.firstRowIndex }}</span>\n <span>-</span>\n <span>{{ paginate?.lastRowIndex }}</span>\n &nbsp;<span>/</span>&nbsp;\n <span>{{ paginate?.total }}</span>\n </div>\n </div>\n }\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <!-- `type=\"button\"` so the bar cannot submit a surrounding form,\n a real `disabled` rather than a class that only stops the\n mouse, and a name on every icon-only control. -->\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"First page\"\n title=\"First page\"\n [disabled]=\"!hasPrevious\"\n [class.disabled]=\"!hasPrevious\"\n (click)=\"goToFirstPage()\">\n <lucide-icon name=\"chevron-first\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"Previous page\"\n title=\"Previous page\"\n [disabled]=\"!hasPrevious\"\n [class.disabled]=\"!hasPrevious\"\n (click)=\"goToPreviousPage()\">\n <lucide-icon name=\"chevron-left\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <!-- Announced as a live region: the numbers are the only feedback a\n screen reader gets that the page actually changed. -->\n <div class=\"one-pagination-column\" role=\"status\" aria-live=\"polite\">\n &nbsp;<span class=\"one-grid-visually-hidden\">Page </span>{{ paginate?.currentPage }}<span>/</span>{{ paginate?.lastPage }}&nbsp;\n </div>\n <div class=\"one-pagination-column\">\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"Next page\"\n title=\"Next page\"\n [disabled]=\"!hasNext\"\n [class.disabled]=\"!hasNext\"\n (click)=\"goToNextPage()\">\n <lucide-icon name=\"chevron-right\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"one-pagination-btn\"\n aria-label=\"Last page\"\n title=\"Last page\"\n [disabled]=\"!hasNext\"\n [class.disabled]=\"!hasNext\"\n (click)=\"goToLastPage()\">\n <lucide-icon name=\"chevron-last\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n </button>\n </div>\n <div class=\"one-pagination-columns-group\">\n <div class=\"one-pagination-column\">\n <!-- `[selected]` per option, not `[value]` on the select:\n with options rendered by `@for`, the select's value is\n set before they exist and does not stick. -->\n <select name=\"row-per-page\" aria-label=\"Rows per page\" (change)=\"onPageSizeChange($event)\">\n @for (size of pageSizeOptions; track size) {\n <option [value]=\"size\" [selected]=\"size === pageSize\">{{ size }} rows</option>\n }\n </select>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
63
87
  }], propDecorators: { paginate: [{
64
88
  type: Input
65
89
  }], goToFirst: [{
@@ -73,4 +97,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
73
97
  }], pageSizeChange: [{
74
98
  type: Output
75
99
  }] } });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtcGFnaW5hdGlvbi9vbmUtZ3JpZC1wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1wYWdpbmF0aW9uL29uZS1ncmlkLXBhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scURBQXFELENBQUM7Ozs7QUFReEYsTUFBTSxPQUFPLDBCQUEwQjtJQU52QztRQVFXLGFBQVEsR0FBd0I7WUFDdkMsS0FBSyxFQUFFLENBQUM7WUFDUixXQUFXLEVBQUUsQ0FBQztZQUNkLFFBQVEsRUFBRSxDQUFDO1lBQ1gsT0FBTyxFQUFFLEVBQUU7WUFDWCxhQUFhLEVBQUUsQ0FBQztZQUNoQixZQUFZLEVBQUUsQ0FBQztTQUNoQixDQUFDO1FBRVEsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV2QyxhQUFRLEdBQVcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBYSxpQkFBaUIsQ0FBQztLQW1EdEQ7SUFqREMsZUFBZTtRQUViLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUVuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUVYLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU87UUFFL0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsZ0JBQWdCO1FBRWQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUUvRixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxZQUFZO1FBRVYsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7WUFBRSxPQUFPO1FBRXJILElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELFlBQVk7UUFFVixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztZQUFFLE9BQU87UUFFckgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBWTtRQUUzQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBMkIsQ0FBQztRQUVqRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJDLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUU5QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUV4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7K0dBcEVVLDBCQUEwQjttR0FBMUIsMEJBQTBCLDhPQ1Z2QyxpN0ZBd0RNOzs0RkQ5Q08sMEJBQTBCO2tCQU50QyxTQUFTO2lDQUNJLEtBQUssWUFDUCxxQkFBcUI7OEJBTXRCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBU0ksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZVBhZ2luYXRpb25QYXJhbXMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcGFnaW5hdGlvbi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVQYWdlU2l6ZU9wdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL2NvbnN0YW50cy9vbmUtcGFnaW5hdGlvbi5jb25zdGFudCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1wYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29uZS1ncmlkLXBhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQtcGFnaW5hdGlvbi5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZFBhZ2luYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKSBwYWdpbmF0ZTogT25lUGFnaW5hdGlvblBhcmFtcyA9IHtcbiAgICB0b3RhbDogMCxcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBsYXN0UGFnZTogMSxcbiAgICBwZXJQYWdlOiAyNSxcbiAgICBmaXJzdFJvd0luZGV4OiAxLFxuICAgIGxhc3RSb3dJbmRleDogMSxcbiAgfTtcblxuICBAT3V0cHV0KCkgZ29Ub0ZpcnN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub1ByZXZpb3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub05leHQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBnb1RvTGFzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBcbiAgcHVibGljIHBhZ2VTaXplOiBudW1iZXIgPSBPbmVQYWdlU2l6ZU9wdGlvblswXTtcbiAgcHVibGljIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBPbmVQYWdlU2l6ZU9wdGlvbjtcblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5wYWdpbmF0ZT8ucGFnZVNpemVPcHRpb25zKSB7XG5cbiAgICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gdGhpcy5wYWdpbmF0ZS5wYWdlU2l6ZU9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgZ29Ub0ZpcnN0UGFnZSgpIHtcblxuICAgIGlmICghKHRoaXMucGFnaW5hdGU/LnBlclBhZ2UgPCB0aGlzLnBhZ2luYXRlPy50b3RhbCAmJiB0aGlzLnBhZ2luYXRlPy5jdXJyZW50UGFnZSA+IDEpKSByZXR1cm47XG5cbiAgICB0aGlzLmdvVG9GaXJzdC5lbWl0KHRoaXMucGFnaW5hdGU/LmN1cnJlbnRQYWdlKTtcbiAgfVxuXG4gIGdvVG9QcmV2aW91c1BhZ2UoKSB7XG5cbiAgICBpZiAoISh0aGlzLnBhZ2luYXRlPy5wZXJQYWdlIDwgdGhpcy5wYWdpbmF0ZT8udG90YWwgJiYgdGhpcy5wYWdpbmF0ZT8uY3VycmVudFBhZ2UgPiAxKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5nb1RvUHJldmlvdXMuZW1pdCh0aGlzLnBhZ2luYXRlPy5jdXJyZW50UGFnZSk7XG4gIH1cblxuICBnb1RvTmV4dFBhZ2UoKSB7XG5cbiAgICBpZiAoISh0aGlzLnBhZ2luYXRlPy5wZXJQYWdlIDwgdGhpcy5wYWdpbmF0ZT8udG90YWwgJiYgdGhpcy5wYWdpbmF0ZT8uY3VycmVudFBhZ2UgPCB0aGlzLnBhZ2luYXRlPy5sYXN0UGFnZSkpIHJldHVybjtcblxuICAgIHRoaXMuZ29Ub05leHQuZW1pdCh0aGlzLnBhZ2luYXRlPy5jdXJyZW50UGFnZSk7XG4gIH1cblxuICBnb1RvTGFzdFBhZ2UoKSB7XG5cbiAgICBpZiAoISh0aGlzLnBhZ2luYXRlPy5wZXJQYWdlIDwgdGhpcy5wYWdpbmF0ZT8udG90YWwgJiYgdGhpcy5wYWdpbmF0ZT8uY3VycmVudFBhZ2UgPCB0aGlzLnBhZ2luYXRlPy5sYXN0UGFnZSkpIHJldHVybjtcblxuICAgIHRoaXMuZ29Ub0xhc3QuZW1pdCh0aGlzLnBhZ2luYXRlPy5jdXJyZW50UGFnZSk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuXG4gICAgY29uc3QgbmV3U2l6ZSA9IE51bWJlcihzZWxlY3QudmFsdWUpO1xuXG4gICAgaWYgKG5ld1NpemUgIT09IHRoaXMucGFnZVNpemUpIHtcblxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IG5ld1NpemU7XG5cbiAgICAgIHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VTaXplKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJvbmUtZ3JpZC1wYWdpbmF0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cIm9uZS1wYWdpbmF0aW9uLXJvd1wiPlxuICAgICAgICBAaWYgKHBhZ2luYXRlPy5maXJzdFJvd0luZGV4ID4gMCAmJiBwYWdpbmF0ZT8ubGFzdFJvd0luZGV4ID4gMCAmJiBwYWdpbmF0ZT8udG90YWwgPiAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1ucy1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcGFnaW5hdGU/LmZpcnN0Um93SW5kZXggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPi08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhZ2luYXRlPy5sYXN0Um93SW5kZXggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICZuYnNwOzxzcGFuPi88L3NwYW4+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhZ2luYXRlPy50b3RhbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1jb2x1bW5zLWdyb3VwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0ZpcnN0UGFnZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiEocGFnaW5hdGU/LnBlclBhZ2UgPCBwYWdpbmF0ZT8udG90YWwgJiYgcGFnaW5hdGU/LmN1cnJlbnRQYWdlID4gMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJjaGV2cm9uLWZpcnN0XCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm9uZS1wYWdpbmF0aW9uLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNQYWdlKClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIShwYWdpbmF0ZT8ucGVyUGFnZSA8IHBhZ2luYXRlPy50b3RhbCAmJiBwYWdpbmF0ZT8uY3VycmVudFBhZ2UgPiAxKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZXZyb24tbGVmdFwiIFtzaXplXT1cIjE2XCIgW3N0cm9rZVdpZHRoXT1cIjJcIj48L2x1Y2lkZS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgJm5ic3A7e3sgcGFnaW5hdGU/LmN1cnJlbnRQYWdlIH19PHNwYW4+Lzwvc3Bhbj57eyBwYWdpbmF0ZT8ubGFzdFBhZ2UgfX0mbmJzcDtcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1wYWdpbmF0aW9uLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHRQYWdlKClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIShwYWdpbmF0ZT8ucGVyUGFnZSA8IHBhZ2luYXRlPy50b3RhbCAmJiBwYWdpbmF0ZT8uY3VycmVudFBhZ2UgPCBwYWdpbmF0ZT8ubGFzdFBhZ2UpXCI+XG4gICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZXZyb24tcmlnaHRcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib25lLXBhZ2luYXRpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9MYXN0UGFnZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiEocGFnaW5hdGU/LnBlclBhZ2UgPCBwYWdpbmF0ZT8udG90YWwgJiYgcGFnaW5hdGU/LmN1cnJlbnRQYWdlIDwgcGFnaW5hdGU/Lmxhc3RQYWdlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJjaGV2cm9uLWxhc3RcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1wYWdpbmF0aW9uLWNvbHVtbnMtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInJvdy1wZXItcGFnZVwiIFt2YWx1ZV09XCJwYWdlU2l6ZVwiIChjaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChzaXplIG9mIHBhZ2VTaXplT3B0aW9uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwic2l6ZVwiPnt7IHNpemUgfX0gcm93czwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtcGFnaW5hdGlvbi9vbmUtZ3JpZC1wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1wYWdpbmF0aW9uL29uZS1ncmlkLXBhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7OztBQVF4RixNQUFNLE9BQU8sMEJBQTBCO0lBTnZDO1FBUVcsYUFBUSxHQUF3QjtZQUN2QyxLQUFLLEVBQUUsQ0FBQztZQUNSLFdBQVcsRUFBRSxDQUFDO1lBQ2QsUUFBUSxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsRUFBRTtZQUNYLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLFlBQVksRUFBRSxDQUFDO1NBQ2hCLENBQUM7UUFFUSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBbUYvQztJQWpGQzs7Ozs7O09BTUc7SUFDSCxJQUFXLFFBQVE7UUFFakIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsZUFBZTtRQUV4QixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0lBQ3BHLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsSUFBVyxXQUFXO1FBRXBCLE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLE9BQU87UUFFaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQVksU0FBUztRQUVuQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsYUFBYTtRQUVYLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFFOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsZ0JBQWdCO1FBRWQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUU5QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxZQUFZO1FBRVYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUUxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxZQUFZO1FBRVYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUUxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFZO1FBRTNCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUEyQixDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRTlCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDOytHQWpHVSwwQkFBMEI7bUdBQTFCLDBCQUEwQiw4T0NWdkMsbXhJQW1GQTs7NEZEekVhLDBCQUEwQjtrQkFOdEMsU0FBUztpQ0FDSSxLQUFLLFlBQ1AscUJBQXFCOzhCQU10QixRQUFRO3NCQUFoQixLQUFLO2dCQVNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVQYWdpbmF0aW9uUGFyYW1zIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLXBhZ2luYXRpb24tdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lUGFnZVNpemVPcHRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9jb25zdGFudHMvb25lLXBhZ2luYXRpb24uY29uc3RhbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLXBhZ2luYXRpb24uY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRQYWdpbmF0aW9uQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBwYWdpbmF0ZTogT25lUGFnaW5hdGlvblBhcmFtcyA9IHtcbiAgICB0b3RhbDogMCxcbiAgICBjdXJyZW50UGFnZTogMSxcbiAgICBsYXN0UGFnZTogMSxcbiAgICBwZXJQYWdlOiAyNSxcbiAgICBmaXJzdFJvd0luZGV4OiAxLFxuICAgIGxhc3RSb3dJbmRleDogMSxcbiAgfTtcblxuICBAT3V0cHV0KCkgZ29Ub0ZpcnN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub1ByZXZpb3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub05leHQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBnb1RvTGFzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFnZSBzaXplIHRoZSBiYXIgc2hvd3MuXG4gICAqXG4gICAqIERlcml2ZWQgZnJvbSB0aGUgaW5wdXQgcmF0aGVyIHRoYW4gaGVsZCBsb2NhbGx5LiBUaGUgYmFyIGlzIGEgZGlzcGxheSBvZlxuICAgKiB0aGUgaG9zdCdzIHBhZ2luZyBzdGF0ZSDigJQgaXQgZG9lcyBub3Qgb3duIGl0IOKAlCBhbmQgYSBsb2NhbCBjb3B5IG1lYW50IGFcbiAgICogaG9zdCB0aGF0IHN1cHBsaWVkIGBwZXJQYWdlOiA1MGAgc3RpbGwgc2F3IFwiMjUgcm93c1wiIHNlbGVjdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGU/LnBlclBhZ2UgPz8gT25lUGFnZVNpemVPcHRpb25bMF07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb3B0aW9ucyBvZmZlcmVkLlxuICAgKlxuICAgKiBBbHNvIGRlcml2ZWQuIFRoZXNlIHVzZWQgdG8gYmUgY29waWVkIG91dCBvZiB0aGUgaW5wdXQgaW5cbiAgICogYG5nQWZ0ZXJWaWV3SW5pdGAg4oCUIGFmdGVyIHRoZSB2aWV3IGhhZCBhbHJlYWR5IGJlZW4gY2hlY2tlZCB3aXRoIHRoZVxuICAgKiBkZWZhdWx0cyDigJQgc28gYW55IGdyaWQgc3VwcGx5aW5nIGl0cyBvd24gb3B0aW9ucyB0aHJldyBgTkcwMTAwYCBpbiBkZXZcbiAgICogbW9kZSwgYW5kIGxhdGVyIGNoYW5nZXMgdG8gdGhlIGxpc3Qgd2VyZSBpZ25vcmVkIGVudGlyZWx5LlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlU2l6ZU9wdGlvbnMoKTogbnVtYmVyW10ge1xuXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGU/LnBhZ2VTaXplT3B0aW9ucz8ubGVuZ3RoID8gdGhpcy5wYWdpbmF0ZS5wYWdlU2l6ZU9wdGlvbnMgOiBPbmVQYWdlU2l6ZU9wdGlvbjtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZXJlIGlzIGEgcGFnZSBiZWZvcmUgdGhlIGN1cnJlbnQgb25lLiAqL1xuICBwdWJsaWMgZ2V0IGhhc1ByZXZpb3VzKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucGFnZUNvdW50ID4gMSAmJiAodGhpcy5wYWdpbmF0ZT8uY3VycmVudFBhZ2UgPz8gMSkgPiAxO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYSBwYWdlIGFmdGVyIHRoZSBjdXJyZW50IG9uZS4gKi9cbiAgcHVibGljIGdldCBoYXNOZXh0KCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucGFnZUNvdW50ID4gMSAmJiAodGhpcy5wYWdpbmF0ZT8uY3VycmVudFBhZ2UgPz8gMSkgPCAodGhpcy5wYWdpbmF0ZT8ubGFzdFBhZ2UgPz8gMSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcblxuICAgIHJldHVybiB0aGlzLnBhZ2luYXRlPy5sYXN0UGFnZSA/PyAxO1xuICB9XG5cbiAgZ29Ub0ZpcnN0UGFnZSgpIHtcblxuICAgIGlmICghdGhpcy5oYXNQcmV2aW91cykgcmV0dXJuO1xuXG4gICAgdGhpcy5nb1RvRmlyc3QuZW1pdCh0aGlzLnBhZ2luYXRlPy5jdXJyZW50UGFnZSk7XG4gIH1cblxuICBnb1RvUHJldmlvdXNQYWdlKCkge1xuXG4gICAgaWYgKCF0aGlzLmhhc1ByZXZpb3VzKSByZXR1cm47XG5cbiAgICB0aGlzLmdvVG9QcmV2aW91cy5lbWl0KHRoaXMucGFnaW5hdGU/LmN1cnJlbnRQYWdlKTtcbiAgfVxuXG4gIGdvVG9OZXh0UGFnZSgpIHtcblxuICAgIGlmICghdGhpcy5oYXNOZXh0KSByZXR1cm47XG5cbiAgICB0aGlzLmdvVG9OZXh0LmVtaXQodGhpcy5wYWdpbmF0ZT8uY3VycmVudFBhZ2UpO1xuICB9XG5cbiAgZ29Ub0xhc3RQYWdlKCkge1xuXG4gICAgaWYgKCF0aGlzLmhhc05leHQpIHJldHVybjtcblxuICAgIHRoaXMuZ29Ub0xhc3QuZW1pdCh0aGlzLnBhZ2luYXRlPy5jdXJyZW50UGFnZSk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuXG4gICAgY29uc3QgbmV3U2l6ZSA9IE51bWJlcihzZWxlY3QudmFsdWUpO1xuXG4gICAgaWYgKG5ld1NpemUgIT09IHRoaXMucGFnZVNpemUpIHtcblxuICAgICAgdGhpcy5wYWdlU2l6ZUNoYW5nZS5lbWl0KG5ld1NpemUpO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBBIG5hdmlnYXRpb24gbGFuZG1hcmssIHNvIHRoZSBiYXIgaXMgcmVhY2hhYmxlIGFzIG9uZSB0aGluZyByYXRoZXIgdGhhbiBhc1xuICAgICBmb3VyIHVubGFiZWxsZWQgaWNvbiBidXR0b25zIGZsb2F0aW5nIHVuZGVyIHRoZSBncmlkLiAtLT5cbjxkaXYgY2xhc3M9XCJvbmUtZ3JpZC1wYWdpbmF0aW9uXCIgcm9sZT1cIm5hdmlnYXRpb25cIiBhcmlhLWxhYmVsPVwiUGFnaW5hdGlvblwiPlxuICAgIDxkaXYgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1yb3dcIj5cbiAgICAgICAgQGlmIChwYWdpbmF0ZT8uZmlyc3RSb3dJbmRleCA+IDAgJiYgcGFnaW5hdGU/Lmxhc3RSb3dJbmRleCA+IDAgJiYgcGFnaW5hdGU/LnRvdGFsID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1wYWdpbmF0aW9uLWNvbHVtbnMtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhZ2luYXRlPy5maXJzdFJvd0luZGV4IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj4tPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwYWdpbmF0ZT8ubGFzdFJvd0luZGV4IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDs8c3Bhbj4vPC9zcGFuPiZuYnNwO1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwYWdpbmF0ZT8udG90YWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1ucy1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1wYWdpbmF0aW9uLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gYHR5cGU9XCJidXR0b25cImAgc28gdGhlIGJhciBjYW5ub3Qgc3VibWl0IGEgc3Vycm91bmRpbmcgZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgIGEgcmVhbCBgZGlzYWJsZWRgIHJhdGhlciB0aGFuIGEgY2xhc3MgdGhhdCBvbmx5IHN0b3BzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgbW91c2UsIGFuZCBhIG5hbWUgb24gZXZlcnkgaWNvbi1vbmx5IGNvbnRyb2wuIC0tPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib25lLXBhZ2luYXRpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IHBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkZpcnN0IHBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ByZXZpb3VzXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFoYXNQcmV2aW91c1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvRmlyc3RQYWdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJjaGV2cm9uLWZpcnN0XCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1idG5cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgcGFnZVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUHJldmlvdXMgcGFnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzUHJldmlvdXNcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWhhc1ByZXZpb3VzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9QcmV2aW91c1BhZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZXZyb24tbGVmdFwiIFtzaXplXT1cIjE2XCIgW3N0cm9rZVdpZHRoXT1cIjJcIj48L2x1Y2lkZS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIEFubm91bmNlZCBhcyBhIGxpdmUgcmVnaW9uOiB0aGUgbnVtYmVycyBhcmUgdGhlIG9ubHkgZmVlZGJhY2sgYVxuICAgICAgICAgICAgICAgICBzY3JlZW4gcmVhZGVyIGdldHMgdGhhdCB0aGUgcGFnZSBhY3R1YWxseSBjaGFuZ2VkLiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1jb2x1bW5cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICAgICAgJm5ic3A7PHNwYW4gY2xhc3M9XCJvbmUtZ3JpZC12aXN1YWxseS1oaWRkZW5cIj5QYWdlIDwvc3Bhbj57eyBwYWdpbmF0ZT8uY3VycmVudFBhZ2UgfX08c3Bhbj4vPC9zcGFuPnt7IHBhZ2luYXRlPy5sYXN0UGFnZSB9fSZuYnNwO1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1idG5cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCBwYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJOZXh0IHBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc05leHRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWhhc05leHRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHRQYWdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiY2hldnJvbi1yaWdodFwiIFtzaXplXT1cIjE2XCIgW3N0cm9rZVdpZHRoXT1cIjJcIj48L2x1Y2lkZS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib25lLXBhZ2luYXRpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkxhc3QgcGFnZVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiTGFzdCBwYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNOZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFoYXNOZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9MYXN0UGFnZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZXZyb24tbGFzdFwiIFtzaXplXT1cIjE2XCIgW3N0cm9rZVdpZHRoXT1cIjJcIj48L2x1Y2lkZS1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXBhZ2luYXRpb24tY29sdW1ucy1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcGFnaW5hdGlvbi1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBgW3NlbGVjdGVkXWAgcGVyIG9wdGlvbiwgbm90IGBbdmFsdWVdYCBvbiB0aGUgc2VsZWN0OlxuICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3B0aW9ucyByZW5kZXJlZCBieSBgQGZvcmAsIHRoZSBzZWxlY3QncyB2YWx1ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBiZWZvcmUgdGhleSBleGlzdCBhbmQgZG9lcyBub3Qgc3RpY2suIC0tPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJyb3ctcGVyLXBhZ2VcIiBhcmlhLWxhYmVsPVwiUm93cyBwZXIgcGFnZVwiIChjaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChzaXplIG9mIHBhZ2VTaXplT3B0aW9uczsgdHJhY2sgc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInNpemVcIiBbc2VsZWN0ZWRdPVwic2l6ZSA9PT0gcGFnZVNpemVcIj57eyBzaXplIH19IHJvd3M8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -1,9 +1,10 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "../../core/pipes/cell-disable-resolver.pipe";
3
+ import * as i1 from "../../core/services/one-grid-cell.service";
4
+ import * as i2 from "@angular/common";
5
5
  export class OneGridRowActionComponent {
6
- constructor() {
6
+ constructor(cellService) {
7
+ this.cellService = cellService;
7
8
  this.allowedEdit = false;
8
9
  this.masterDetail = false;
9
10
  this.masterNode = null;
@@ -26,6 +27,51 @@ export class OneGridRowActionComponent {
26
27
  this.onRowOption = new EventEmitter();
27
28
  this.onRowLanguage = new EventEmitter();
28
29
  this.onRowCellOption = new EventEmitter();
30
+ /**
31
+ * Accessible names for the action buttons.
32
+ *
33
+ * Every one of them is an icon with no text, and none carried a label — a
34
+ * screen reader announced "button" and nothing more, fourteen times per row.
35
+ * These are also the `title`, so the icons are identifiable by pointer too.
36
+ */
37
+ this.labels = {
38
+ gotoDetail: 'Open detail',
39
+ addNew: 'Add new row',
40
+ view: 'View row',
41
+ location: 'Show location',
42
+ document: 'Open document',
43
+ copy: 'Copy row',
44
+ delete: 'Delete row',
45
+ gotoList: 'Open list',
46
+ edit: 'Edit row',
47
+ print: 'Print row',
48
+ history: 'View history',
49
+ option: 'Row options',
50
+ language: 'Change language',
51
+ cellOption: 'Cell options',
52
+ };
53
+ }
54
+ /**
55
+ * Whether this column's action buttons are hidden for this row.
56
+ *
57
+ * The templates read `column?.hideActionButton` directly, which is truthy for
58
+ * any function — so a predicate asking to hide the buttons showed them, and
59
+ * one asking to show them showed them too. Resolved here instead, with the
60
+ * same params every other row-scoped predicate gets.
61
+ */
62
+ get hideActionButton() {
63
+ return this.cellService.hideActionButtonFn(this.column, this.node);
64
+ }
65
+ /**
66
+ * Whether this column's action buttons are disabled for this row.
67
+ *
68
+ * `disable` used to be resolved by `CellDisableResolverPipe`, which built its
69
+ * own params — a different set from every other row-scoped predicate. It goes
70
+ * through the shared builder now, so `disable` sees exactly what `editable`
71
+ * and `hideActionButton` see.
72
+ */
73
+ get actionDisabled() {
74
+ return this.cellService.disableFn(this.column, this.node) || !this.allowedEdit;
29
75
  }
30
76
  ngOnInit() {
31
77
  this.detailActiveExcludeLevels = new Set(this.column.cellRendererParams?.detailActiveExcludeLevels ?? []);
@@ -136,13 +182,13 @@ export class OneGridRowActionComponent {
136
182
  }
137
183
  this.onRowCellOption.emit(data);
138
184
  }
139
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridRowActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
140
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridRowActionComponent, selector: "one-grid-row-action", inputs: { column: "column", node: "node", allowedEdit: "allowedEdit", masterDetail: "masterDetail", masterNode: "masterNode", cellRendererParams: "cellRendererParams", gridType: "gridType", context: "context" }, outputs: { onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowCellOption: "onRowCellOption" }, ngImport: i0, template: "@if ((cellRendererParams && node?.leaf && !column?.autoGroupField && !(node.group && node.leafGroup)) || (column?.rowActionLevels?.includes(node.level) && column?.autoGroupField)) {\n <div class=\"btn-action-container\">\n\n <!-- Expansion Button Status -->\n @if ((cellRendererParams?.detailActiveButtonStatus == 1 && !(detailActiveExcludeLevels?.has(node.level)))) {\n <a\n class=\"me-2\"\n [attr.aria-label]=\"node.detailActive ? 'Collapse row' : 'Expand row'\"\n [title]=\"node.detailActive ? 'Collapse' : 'Expand'\"\n (click)=\"invokeRowToggleDetailActiveExpand(node)\">\n\n <i class=\"bi\" [ngClass]=\"{ 'bi-chevron-down': node.detailActive, 'bi-chevron-right': !node.detailActive }\"></i>\n </a>\n }\n\n <!-- Goto Detail Button Status -->\n @if ((cellRendererParams?.gotoDetailButtonStatus == 1 && !(gotoDetailExcludeLevels?.has(node.level))) && (!column?.hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionGotoDetail(node, column)\">\n\n <i class=\"bi bi-list-task\"></i>\n </button>\n }\n\n <!-- Add New Button Status -->\n @if ((cellRendererParams?.addNewButtonStatus == 1 && !(addNewExcludeLevels?.has(node.level))) && (!column?.hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"!allowedEdit\"\n (click)=\"invokeRowActionAddNew(node, column)\">\n\n <i class=\"bi bi-plus\"></i>\n </button>\n }\n\n <!-- View Button Status -->\n @if (cellRendererParams?.viewButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionView(node, column)\">\n\n <i class=\"bi bi-eye\"></i>\n </button>\n }\n @if (cellRendererParams?.locationButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionLocation(node, column)\">\n\n <i class=\"bi bi-geo-alt\"></i>\n </button>\n }\n\n <!-- Document Button Status -->\n @if (cellRendererParams?.documentButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionDocument(node, column)\">\n\n <i class=\"bi bi-file-earmark-text\"></i>\n </button>\n }\n\n <!-- Copy Button Status -->\n @if (cellRendererParams?.copyButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionCopy(node, column)\">\n\n <i class=\"bi bi-files\"></i>\n </button>\n }\n\n\n <!-- Delete Button Status -->\n @if (cellRendererParams?.deleteButtonStatus == 1 && (!column?.hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-danger\"\n [class.disabled]=\"!allowedEdit\"\n (click)=\"invokeRowActionDelete(node, column)\">\n\n <i class=\"bi bi-trash3\"></i>\n </button>\n }\n\n <!-- Goto List Button Status -->\n @if (cellRendererParams?.gotoListButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-success\"\n (click)=\"invokeRowActionGotoList(node, column)\">\n\n <i class=\"bi bi-list-ul\"></i>\n </button>\n }\n\n <!-- Edit Button Status -->\n @if (cellRendererParams?.editButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionEdit(node, column)\">\n\n <i class=\"bi bi-pencil\"></i>\n </button>\n }\n\n <!-- Print Button Status -->\n @if (cellRendererParams?.printButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionPrint(node, column)\">\n\n <i class=\"bi bi-printer\"></i>\n </button>\n }\n\n <!-- History Button Status -->\n @if (cellRendererParams?.historyButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionHistory(node, column)\">\n\n <i class=\"bi bi-clock-history\"></i>\n </button>\n }\n\n <!-- Option Button Status -->\n @if (cellRendererParams?.optionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n\n <!-- Language Button Status -->\n @if (cellRendererParams?.languageButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionLanguage(node, column)\">\n\n <i class=\"bi bi-translate\"></i>\n </button>\n }\n\n <!-- Cell Optoion Button Status (Context Menu) -->\n @if (cellRendererParams?.cellOptionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary border-0 text-body\"\n [style.background]=\"'transparent'\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionCellOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n </div>\n}", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i2.CellDisableResolverPipe, name: "cellDisableResolver" }] }); }
185
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridRowActionComponent, deps: [{ token: i1.OneGridCellService }], target: i0.ɵɵFactoryTarget.Component }); }
186
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridRowActionComponent, selector: "one-grid-row-action", inputs: { column: "column", node: "node", allowedEdit: "allowedEdit", masterDetail: "masterDetail", masterNode: "masterNode", cellRendererParams: "cellRendererParams", gridType: "gridType", context: "context" }, outputs: { onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowCellOption: "onRowCellOption" }, ngImport: i0, template: "@if ((cellRendererParams && node?.leaf && !column?.autoGroupField && !(node.group && node.leafGroup)) || (column?.rowActionLevels?.includes(node.level) && column?.autoGroupField)) {\n <div class=\"btn-action-container\">\n\n <!-- Expansion Button Status -->\n @if ((cellRendererParams?.detailActiveButtonStatus == 1 && !(detailActiveExcludeLevels?.has(node.level)))) {\n <!-- A button, not an <a> with a click handler: it has no href, so\n it was neither focusable nor operable from the keyboard. -->\n <button\n type=\"button\"\n class=\"btn-action btn-action-plain me-2\"\n [attr.aria-expanded]=\"node.detailActive\"\n [attr.aria-label]=\"node.detailActive ? 'Collapse row' : 'Expand row'\"\n [title]=\"node.detailActive ? 'Collapse' : 'Expand'\"\n (click)=\"invokeRowToggleDetailActiveExpand(node)\">\n\n <i class=\"bi\" [ngClass]=\"{ 'bi-chevron-down': node.detailActive, 'bi-chevron-right': !node.detailActive }\"></i>\n </button>\n }\n\n <!-- Goto Detail Button Status -->\n @if ((cellRendererParams?.gotoDetailButtonStatus == 1 && !(gotoDetailExcludeLevels?.has(node.level))) && (!hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.gotoDetail\"\n [title]=\"labels.gotoDetail\"\n (click)=\"invokeRowActionGotoDetail(node, column)\">\n\n <i class=\"bi bi-list-task\"></i>\n </button>\n }\n\n <!-- Add New Button Status -->\n @if ((cellRendererParams?.addNewButtonStatus == 1 && !(addNewExcludeLevels?.has(node.level))) && (!hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.addNew\"\n [title]=\"labels.addNew\"\n (click)=\"invokeRowActionAddNew(node, column)\">\n\n <i class=\"bi bi-plus\"></i>\n </button>\n }\n\n <!-- View Button Status -->\n @if (cellRendererParams?.viewButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.view\"\n [title]=\"labels.view\"\n (click)=\"invokeRowActionView(node, column)\">\n\n <i class=\"bi bi-eye\"></i>\n </button>\n }\n @if (cellRendererParams?.locationButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.location\"\n [title]=\"labels.location\"\n (click)=\"invokeRowActionLocation(node, column)\">\n\n <i class=\"bi bi-geo-alt\"></i>\n </button>\n }\n\n <!-- Document Button Status -->\n @if (cellRendererParams?.documentButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.document\"\n [title]=\"labels.document\"\n (click)=\"invokeRowActionDocument(node, column)\">\n\n <i class=\"bi bi-file-earmark-text\"></i>\n </button>\n }\n\n <!-- Copy Button Status -->\n @if (cellRendererParams?.copyButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.copy\"\n [title]=\"labels.copy\"\n (click)=\"invokeRowActionCopy(node, column)\">\n\n <i class=\"bi bi-files\"></i>\n </button>\n }\n\n\n <!-- Delete Button Status -->\n @if (cellRendererParams?.deleteButtonStatus == 1 && (!hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-danger\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.delete\"\n [title]=\"labels.delete\"\n (click)=\"invokeRowActionDelete(node, column)\">\n\n <i class=\"bi bi-trash3\"></i>\n </button>\n }\n\n <!-- Goto List Button Status -->\n @if (cellRendererParams?.gotoListButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-success\"\n [attr.aria-label]=\"labels.gotoList\"\n [title]=\"labels.gotoList\"\n (click)=\"invokeRowActionGotoList(node, column)\">\n\n <i class=\"bi bi-list-ul\"></i>\n </button>\n }\n\n <!-- Edit Button Status -->\n @if (cellRendererParams?.editButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.edit\"\n [title]=\"labels.edit\"\n (click)=\"invokeRowActionEdit(node, column)\">\n\n <i class=\"bi bi-pencil\"></i>\n </button>\n }\n\n <!-- Print Button Status -->\n @if (cellRendererParams?.printButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.print\"\n [title]=\"labels.print\"\n (click)=\"invokeRowActionPrint(node, column)\">\n\n <i class=\"bi bi-printer\"></i>\n </button>\n }\n\n <!-- History Button Status -->\n @if (cellRendererParams?.historyButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.history\"\n [title]=\"labels.history\"\n (click)=\"invokeRowActionHistory(node, column)\">\n\n <i class=\"bi bi-clock-history\"></i>\n </button>\n }\n\n <!-- Option Button Status -->\n @if (cellRendererParams?.optionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.option\"\n [title]=\"labels.option\"\n (click)=\"invokeRowActionOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n\n <!-- Language Button Status -->\n @if (cellRendererParams?.languageButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.language\"\n [title]=\"labels.language\"\n (click)=\"invokeRowActionLanguage(node, column)\">\n\n <i class=\"bi bi-translate\"></i>\n </button>\n }\n\n <!-- Cell Optoion Button Status (Context Menu) -->\n @if (cellRendererParams?.cellOptionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary border-0 text-body\"\n [style.background]=\"'transparent'\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.cellOption\"\n [title]=\"labels.cellOption\"\n (click)=\"invokeRowActionCellOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n </div>\n}", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
141
187
  }
142
188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridRowActionComponent, decorators: [{
143
189
  type: Component,
144
- args: [{ standalone: false, selector: 'one-grid-row-action', template: "@if ((cellRendererParams && node?.leaf && !column?.autoGroupField && !(node.group && node.leafGroup)) || (column?.rowActionLevels?.includes(node.level) && column?.autoGroupField)) {\n <div class=\"btn-action-container\">\n\n <!-- Expansion Button Status -->\n @if ((cellRendererParams?.detailActiveButtonStatus == 1 && !(detailActiveExcludeLevels?.has(node.level)))) {\n <a\n class=\"me-2\"\n [attr.aria-label]=\"node.detailActive ? 'Collapse row' : 'Expand row'\"\n [title]=\"node.detailActive ? 'Collapse' : 'Expand'\"\n (click)=\"invokeRowToggleDetailActiveExpand(node)\">\n\n <i class=\"bi\" [ngClass]=\"{ 'bi-chevron-down': node.detailActive, 'bi-chevron-right': !node.detailActive }\"></i>\n </a>\n }\n\n <!-- Goto Detail Button Status -->\n @if ((cellRendererParams?.gotoDetailButtonStatus == 1 && !(gotoDetailExcludeLevels?.has(node.level))) && (!column?.hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionGotoDetail(node, column)\">\n\n <i class=\"bi bi-list-task\"></i>\n </button>\n }\n\n <!-- Add New Button Status -->\n @if ((cellRendererParams?.addNewButtonStatus == 1 && !(addNewExcludeLevels?.has(node.level))) && (!column?.hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"!allowedEdit\"\n (click)=\"invokeRowActionAddNew(node, column)\">\n\n <i class=\"bi bi-plus\"></i>\n </button>\n }\n\n <!-- View Button Status -->\n @if (cellRendererParams?.viewButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionView(node, column)\">\n\n <i class=\"bi bi-eye\"></i>\n </button>\n }\n @if (cellRendererParams?.locationButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionLocation(node, column)\">\n\n <i class=\"bi bi-geo-alt\"></i>\n </button>\n }\n\n <!-- Document Button Status -->\n @if (cellRendererParams?.documentButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionDocument(node, column)\">\n\n <i class=\"bi bi-file-earmark-text\"></i>\n </button>\n }\n\n <!-- Copy Button Status -->\n @if (cellRendererParams?.copyButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n (click)=\"invokeRowActionCopy(node, column)\">\n\n <i class=\"bi bi-files\"></i>\n </button>\n }\n\n\n <!-- Delete Button Status -->\n @if (cellRendererParams?.deleteButtonStatus == 1 && (!column?.hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-danger\"\n [class.disabled]=\"!allowedEdit\"\n (click)=\"invokeRowActionDelete(node, column)\">\n\n <i class=\"bi bi-trash3\"></i>\n </button>\n }\n\n <!-- Goto List Button Status -->\n @if (cellRendererParams?.gotoListButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-success\"\n (click)=\"invokeRowActionGotoList(node, column)\">\n\n <i class=\"bi bi-list-ul\"></i>\n </button>\n }\n\n <!-- Edit Button Status -->\n @if (cellRendererParams?.editButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionEdit(node, column)\">\n\n <i class=\"bi bi-pencil\"></i>\n </button>\n }\n\n <!-- Print Button Status -->\n @if (cellRendererParams?.printButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionPrint(node, column)\">\n\n <i class=\"bi bi-printer\"></i>\n </button>\n }\n\n <!-- History Button Status -->\n @if (cellRendererParams?.historyButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionHistory(node, column)\">\n\n <i class=\"bi bi-clock-history\"></i>\n </button>\n }\n\n <!-- Option Button Status -->\n @if (cellRendererParams?.optionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n\n <!-- Language Button Status -->\n @if (cellRendererParams?.languageButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionLanguage(node, column)\">\n\n <i class=\"bi bi-translate\"></i>\n </button>\n }\n\n <!-- Cell Optoion Button Status (Context Menu) -->\n @if (cellRendererParams?.cellOptionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary border-0 text-body\"\n [style.background]=\"'transparent'\"\n [class.disabled]=\"node | cellDisableResolver:column:context:allowedEdit\"\n (click)=\"invokeRowActionCellOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n </div>\n}" }]
145
- }], propDecorators: { column: [{
190
+ args: [{ standalone: false, selector: 'one-grid-row-action', template: "@if ((cellRendererParams && node?.leaf && !column?.autoGroupField && !(node.group && node.leafGroup)) || (column?.rowActionLevels?.includes(node.level) && column?.autoGroupField)) {\n <div class=\"btn-action-container\">\n\n <!-- Expansion Button Status -->\n @if ((cellRendererParams?.detailActiveButtonStatus == 1 && !(detailActiveExcludeLevels?.has(node.level)))) {\n <!-- A button, not an <a> with a click handler: it has no href, so\n it was neither focusable nor operable from the keyboard. -->\n <button\n type=\"button\"\n class=\"btn-action btn-action-plain me-2\"\n [attr.aria-expanded]=\"node.detailActive\"\n [attr.aria-label]=\"node.detailActive ? 'Collapse row' : 'Expand row'\"\n [title]=\"node.detailActive ? 'Collapse' : 'Expand'\"\n (click)=\"invokeRowToggleDetailActiveExpand(node)\">\n\n <i class=\"bi\" [ngClass]=\"{ 'bi-chevron-down': node.detailActive, 'bi-chevron-right': !node.detailActive }\"></i>\n </button>\n }\n\n <!-- Goto Detail Button Status -->\n @if ((cellRendererParams?.gotoDetailButtonStatus == 1 && !(gotoDetailExcludeLevels?.has(node.level))) && (!hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.gotoDetail\"\n [title]=\"labels.gotoDetail\"\n (click)=\"invokeRowActionGotoDetail(node, column)\">\n\n <i class=\"bi bi-list-task\"></i>\n </button>\n }\n\n <!-- Add New Button Status -->\n @if ((cellRendererParams?.addNewButtonStatus == 1 && !(addNewExcludeLevels?.has(node.level))) && (!hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.addNew\"\n [title]=\"labels.addNew\"\n (click)=\"invokeRowActionAddNew(node, column)\">\n\n <i class=\"bi bi-plus\"></i>\n </button>\n }\n\n <!-- View Button Status -->\n @if (cellRendererParams?.viewButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.view\"\n [title]=\"labels.view\"\n (click)=\"invokeRowActionView(node, column)\">\n\n <i class=\"bi bi-eye\"></i>\n </button>\n }\n @if (cellRendererParams?.locationButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.location\"\n [title]=\"labels.location\"\n (click)=\"invokeRowActionLocation(node, column)\">\n\n <i class=\"bi bi-geo-alt\"></i>\n </button>\n }\n\n <!-- Document Button Status -->\n @if (cellRendererParams?.documentButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.document\"\n [title]=\"labels.document\"\n (click)=\"invokeRowActionDocument(node, column)\">\n\n <i class=\"bi bi-file-earmark-text\"></i>\n </button>\n }\n\n <!-- Copy Button Status -->\n @if (cellRendererParams?.copyButtonStatus == 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [attr.aria-label]=\"labels.copy\"\n [title]=\"labels.copy\"\n (click)=\"invokeRowActionCopy(node, column)\">\n\n <i class=\"bi bi-files\"></i>\n </button>\n }\n\n\n <!-- Delete Button Status -->\n @if (cellRendererParams?.deleteButtonStatus == 1 && (!hideActionButton || allowedEdit)) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-danger\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.delete\"\n [title]=\"labels.delete\"\n (click)=\"invokeRowActionDelete(node, column)\">\n\n <i class=\"bi bi-trash3\"></i>\n </button>\n }\n\n <!-- Goto List Button Status -->\n @if (cellRendererParams?.gotoListButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-success\"\n [attr.aria-label]=\"labels.gotoList\"\n [title]=\"labels.gotoList\"\n (click)=\"invokeRowActionGotoList(node, column)\">\n\n <i class=\"bi bi-list-ul\"></i>\n </button>\n }\n\n <!-- Edit Button Status -->\n @if (cellRendererParams?.editButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.edit\"\n [title]=\"labels.edit\"\n (click)=\"invokeRowActionEdit(node, column)\">\n\n <i class=\"bi bi-pencil\"></i>\n </button>\n }\n\n <!-- Print Button Status -->\n @if (cellRendererParams?.printButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.print\"\n [title]=\"labels.print\"\n (click)=\"invokeRowActionPrint(node, column)\">\n\n <i class=\"bi bi-printer\"></i>\n </button>\n }\n\n <!-- History Button Status -->\n @if (cellRendererParams?.historyButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.history\"\n [title]=\"labels.history\"\n (click)=\"invokeRowActionHistory(node, column)\">\n\n <i class=\"bi bi-clock-history\"></i>\n </button>\n }\n\n <!-- Option Button Status -->\n @if (cellRendererParams?.optionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.option\"\n [title]=\"labels.option\"\n (click)=\"invokeRowActionOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n\n <!-- Language Button Status -->\n @if (cellRendererParams?.languageButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.language\"\n [title]=\"labels.language\"\n (click)=\"invokeRowActionLanguage(node, column)\">\n\n <i class=\"bi bi-translate\"></i>\n </button>\n }\n\n <!-- Cell Optoion Button Status (Context Menu) -->\n @if (cellRendererParams?.cellOptionButtonStatus === 1) {\n <button\n type=\"button\"\n class=\"btn-action btn-action-primary border-0 text-body\"\n [style.background]=\"'transparent'\"\n [class.disabled]=\"actionDisabled\"\n [disabled]=\"actionDisabled\"\n [attr.aria-label]=\"labels.cellOption\"\n [title]=\"labels.cellOption\"\n (click)=\"invokeRowActionCellOption(node, column)\">\n\n <i class=\"bi bi-three-dots-vertical\"></i>\n </button>\n }\n </div>\n}" }]
191
+ }], ctorParameters: () => [{ type: i1.OneGridCellService }], propDecorators: { column: [{
146
192
  type: Input,
147
193
  args: [{ required: true }]
148
194
  }], node: [{
@@ -190,4 +236,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
190
236
  }], onRowCellOption: [{
191
237
  type: Output
192
238
  }] } });
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtcm93LWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtcm93LWFjdGlvbi9vbmUtZ3JpZC1yb3ctYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1yb3ctYWN0aW9uL29uZS1ncmlkLXJvdy1hY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQVcvRSxNQUFNLE9BQU8seUJBQXlCO0lBTnRDO1FBYTZCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQy9DLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRWpDLGFBQVEsR0FBZ0IsSUFBSSxDQUFDO1FBQzdCLFlBQU8sR0FBUSxJQUFJLENBQUM7UUFFN0I7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQy9ELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDM0QsY0FBUyxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQ3pELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDN0Qsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUM3RCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDekQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUMzRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQzdELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUN6RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDMUQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUM1RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQzNELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDN0Qsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztLQTRMMUU7SUF0TEMsUUFBUTtRQUVOLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLHlCQUF5QixJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3pHLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3JHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRDs7T0FFRztJQUNILGlDQUFpQyxDQUFDLElBQWdCO1FBRWhELElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3pDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRXBFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWhFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRTlELElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWxFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWxFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRTlELElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWhFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWxFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRTlELElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRS9ELElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWpFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWhFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRWxFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxJQUFtQixFQUFFLE1BQXVCO1FBRXBFLElBQUksSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTdHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXRCLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7K0dBek5VLHlCQUF5QjttR0FBekIseUJBQXlCLHdyQkNYdEMscXlOQWlMQzs7NEZEdEtZLHlCQUF5QjtrQkFOckMsU0FBUztpQ0FDSSxLQUFLLFlBQ1AscUJBQXFCOzhCQVNKLE1BQU07c0JBQWhDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNFLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNFLFdBQVc7c0JBQXJDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUtJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVHcmlkUm93QWN0aW9uRXZlbnQsIE9uZUdyaWRUeXBlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1yb3ctYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29uZS1ncmlkLXJvdy1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQtcm93LWFjdGlvbi5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZFJvd0FjdGlvbkNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqXG4gICAqIEdldCBOb2RlICYgQ2VsbCBSZW5kZXJlciBGcm9tIFBhcmVudCBDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+O1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBub2RlOiBPbmVSb3dOb2RlPFQ+O1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFzdGVyTm9kZTogT25lUm93Tm9kZTxUPiA9IG51bGw7XG4gIEBJbnB1dCgpIGNlbGxSZW5kZXJlclBhcmFtczogT25lQ2VsbFJlbmRlcmVyUGFyYW1zPFQ+O1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSBudWxsO1xuICBASW5wdXQoKSBjb250ZXh0OiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBCaW5kIEV2ZW50IHRvIFBhcmVudCBDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKSBvblJvd0dvdG9EZXRhaWwgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93QWRkTmV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1ZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TG9jYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q29weSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93R290b0xpc3QgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dQcmludCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dIaXN0b3J5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd09wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMYW5ndWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDZWxsT3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG5cbiAgcHJvdGVjdGVkIGRldGFpbEFjdGl2ZUV4Y2x1ZGVMZXZlbHM6IFNldDxudW1iZXI+O1xuICBwcm90ZWN0ZWQgZ290b0RldGFpbEV4Y2x1ZGVMZXZlbHM6IFNldDxudW1iZXI+O1xuICBwcm90ZWN0ZWQgYWRkTmV3RXhjbHVkZUxldmVsczogU2V0PG51bWJlcj47XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmRldGFpbEFjdGl2ZUV4Y2x1ZGVMZXZlbHMgPSBuZXcgU2V0KHRoaXMuY29sdW1uLmNlbGxSZW5kZXJlclBhcmFtcz8uZGV0YWlsQWN0aXZlRXhjbHVkZUxldmVscyA/PyBbXSlcbiAgICB0aGlzLmdvdG9EZXRhaWxFeGNsdWRlTGV2ZWxzID0gbmV3IFNldCh0aGlzLmNvbHVtbi5jZWxsUmVuZGVyZXJQYXJhbXM/LmdvdG9EZXRhaWxFeGNsdWRlTGV2ZWxzID8/IFtdKVxuICAgIHRoaXMuYWRkTmV3RXhjbHVkZUxldmVscyA9IG5ldyBTZXQodGhpcy5jb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zPy5hZGROZXdFeGNsdWRlTGV2ZWxzID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIEludm9rZSBDbGljayBFdmVudFxuICAgKi9cbiAgaW52b2tlUm93VG9nZ2xlRGV0YWlsQWN0aXZlRXhwYW5kKG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIG5vZGUuZGV0YWlsQWN0aXZlID0gIW5vZGUuZGV0YWlsQWN0aXZlO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0RldGFpbChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93R290b0RldGFpbC5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQWRkTmV3KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dBZGROZXcuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblZpZXcobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd1ZpZXcuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxvY2F0aW9uKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dMb2NhdGlvbi5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRG9jdW1lbnQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0RvY3VtZW50LmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Db3B5KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dDb3B5LmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25EZWxldGUobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0xpc3Qobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0dvdG9MaXN0LmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25FZGl0KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dFZGl0LmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25QcmludChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93UHJpbnQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkhpc3Rvcnkobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0hpc3RvcnkuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbk9wdGlvbihub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93T3B0aW9uLmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25MYW5ndWFnZShub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93TGFuZ3VhZ2UuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24obm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0NlbGxPcHRpb24uZW1pdChkYXRhKTtcbiAgfVxufVxuIiwiQGlmICgoY2VsbFJlbmRlcmVyUGFyYW1zICYmIG5vZGU/LmxlYWYgJiYgIWNvbHVtbj8uYXV0b0dyb3VwRmllbGQgJiYgIShub2RlLmdyb3VwICYmIG5vZGUubGVhZkdyb3VwKSkgfHwgKGNvbHVtbj8ucm93QWN0aW9uTGV2ZWxzPy5pbmNsdWRlcyhub2RlLmxldmVsKSAmJiBjb2x1bW4/LmF1dG9Hcm91cEZpZWxkKSkge1xuICAgIDxkaXYgY2xhc3M9XCJidG4tYWN0aW9uLWNvbnRhaW5lclwiPlxuXG4gICAgICAgIDwhLS0gRXhwYW5zaW9uIEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgICBAaWYgKChjZWxsUmVuZGVyZXJQYXJhbXM/LmRldGFpbEFjdGl2ZUJ1dHRvblN0YXR1cyA9PSAxICYmICEoZGV0YWlsQWN0aXZlRXhjbHVkZUxldmVscz8uaGFzKG5vZGUubGV2ZWwpKSkpIHtcbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5vZGUuZGV0YWlsQWN0aXZlID8gJ0NvbGxhcHNlIHJvdycgOiAnRXhwYW5kIHJvdydcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJub2RlLmRldGFpbEFjdGl2ZSA/ICdDb2xsYXBzZScgOiAnRXhwYW5kJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd1RvZ2dsZURldGFpbEFjdGl2ZUV4cGFuZChub2RlKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaVwiIFtuZ0NsYXNzXT1cInsgJ2JpLWNoZXZyb24tZG93bic6IG5vZGUuZGV0YWlsQWN0aXZlLCAnYmktY2hldnJvbi1yaWdodCc6ICFub2RlLmRldGFpbEFjdGl2ZSB9XCI+PC9pPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBHb3RvIERldGFpbCBCdXR0b24gU3RhdHVzIC0tPlxuICAgICAgICBAaWYgKChjZWxsUmVuZGVyZXJQYXJhbXM/LmdvdG9EZXRhaWxCdXR0b25TdGF0dXMgPT0gMSAmJiAhKGdvdG9EZXRhaWxFeGNsdWRlTGV2ZWxzPy5oYXMobm9kZS5sZXZlbCkpKSAmJiAoIWNvbHVtbj8uaGlkZUFjdGlvbkJ1dHRvbiB8fCBhbGxvd2VkRWRpdCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uR290b0RldGFpbChub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWxpc3QtdGFza1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBBZGQgTmV3IEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoKGNlbGxSZW5kZXJlclBhcmFtcz8uYWRkTmV3QnV0dG9uU3RhdHVzID09IDEgJiYgIShhZGROZXdFeGNsdWRlTGV2ZWxzPy5oYXMobm9kZS5sZXZlbCkpKSAmJiAoIWNvbHVtbj8uaGlkZUFjdGlvbkJ1dHRvbiB8fCBhbGxvd2VkRWRpdCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uQWRkTmV3KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcGx1c1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBWaWV3IEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy52aWV3QnV0dG9uU3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uVmlldyhub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWV5ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5sb2NhdGlvbkJ1dHRvblN0YXR1cyA9PSAxKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZ2VvLWFsdFwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBEb2N1bWVudCBCdXR0b24gU3RhdHVzIC0tPlxuICAgICAgICBAaWYgKGNlbGxSZW5kZXJlclBhcmFtcz8uZG9jdW1lbnRCdXR0b25TdGF0dXMgPT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25Eb2N1bWVudChub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWZpbGUtZWFybWFyay10ZXh0XCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIENvcHkgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgQGlmIChjZWxsUmVuZGVyZXJQYXJhbXM/LmNvcHlCdXR0b25TdGF0dXMgPT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZmlsZXNcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG5cbiAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5kZWxldGVCdXR0b25TdGF0dXMgPT0gMSAmJiAoIWNvbHVtbj8uaGlkZUFjdGlvbkJ1dHRvbiB8fCBhbGxvd2VkRWRpdCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1kYW5nZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhYWxsb3dlZEVkaXRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25EZWxldGUobm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10cmFzaDNcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gR290byBMaXN0IEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5nb3RvTGlzdEJ1dHRvblN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXN1Y2Nlc3NcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdChub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWxpc3QtdWxcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gRWRpdCBCdXR0b24gU3RhdHVzIC0tPlxuICAgICAgICBAaWYgKGNlbGxSZW5kZXJlclBhcmFtcz8uZWRpdEJ1dHRvblN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJub2RlIHwgY2VsbERpc2FibGVSZXNvbHZlcjpjb2x1bW46Y29udGV4dDphbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkVkaXQobm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gUHJpbnQgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgQGlmIChjZWxsUmVuZGVyZXJQYXJhbXM/LnByaW50QnV0dG9uU3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIm5vZGUgfCBjZWxsRGlzYWJsZVJlc29sdmVyOmNvbHVtbjpjb250ZXh0OmFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uUHJpbnQobm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1wcmludGVyXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIEhpc3RvcnkgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgQGlmIChjZWxsUmVuZGVyZXJQYXJhbXM/Lmhpc3RvcnlCdXR0b25TdGF0dXMgPT09IDEpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwibm9kZSB8IGNlbGxEaXNhYmxlUmVzb2x2ZXI6Y29sdW1uOmNvbnRleHQ6YWxsb3dlZEVkaXRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25IaXN0b3J5KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktY2xvY2staGlzdG9yeVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBPcHRpb24gQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgQGlmIChjZWxsUmVuZGVyZXJQYXJhbXM/Lm9wdGlvbkJ1dHRvblN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJub2RlIHwgY2VsbERpc2FibGVSZXNvbHZlcjpjb2x1bW46Y29udGV4dDphbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbk9wdGlvbihub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXRocmVlLWRvdHMtdmVydGljYWxcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gTGFuZ3VhZ2UgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgQGlmIChjZWxsUmVuZGVyZXJQYXJhbXM/Lmxhbmd1YWdlQnV0dG9uU3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIm5vZGUgfCBjZWxsRGlzYWJsZVJlc29sdmVyOmNvbHVtbjpjb250ZXh0OmFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2Uobm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10cmFuc2xhdGVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gQ2VsbCBPcHRvaW9uIEJ1dHRvbiBTdGF0dXMgKENvbnRleHQgTWVudSkgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5jZWxsT3B0aW9uQnV0dG9uU3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tcHJpbWFyeSBib3JkZXItMCB0ZXh0LWJvZHlcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJub2RlIHwgY2VsbERpc2FibGVSZXNvbHZlcjpjb2x1bW46Y29udGV4dDphbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24obm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10aHJlZS1kb3RzLXZlcnRpY2FsXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbn0iXX0=
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtcm93LWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtcm93LWFjdGlvbi9vbmUtZ3JpZC1yb3ctYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1yb3ctYWN0aW9uL29uZS1ncmlkLXJvdy1hY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQVkvRSxNQUFNLE9BQU8seUJBQXlCO0lBNERwQyxZQUE2QixXQUErQjtRQUEvQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFyRGpDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQy9DLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRWpDLGFBQVEsR0FBZ0IsSUFBSSxDQUFDO1FBQzdCLFlBQU8sR0FBUSxJQUFJLENBQUM7UUFFN0I7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQy9ELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDM0QsY0FBUyxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQ3pELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDN0Qsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUM3RCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDekQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUMzRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQzdELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUN6RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDMUQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUM1RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQzNELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDN0Qsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQU16RTs7Ozs7O1dBTUc7UUFDZ0IsV0FBTSxHQUFHO1lBQzFCLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLElBQUksRUFBRSxVQUFVO1lBQ2hCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLElBQUksRUFBRSxVQUFVO1lBQ2hCLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLElBQUksRUFBRSxVQUFVO1lBQ2hCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsVUFBVSxFQUFFLGNBQWM7U0FDbEIsQ0FBQztJQUVvRCxDQUFDO0lBRWhFOzs7Ozs7O09BT0c7SUFDSCxJQUFjLGdCQUFnQjtRQUU1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQXNCLEVBQUUsSUFBSSxDQUFDLElBQWtCLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQWMsY0FBYztRQUUxQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFzQixFQUFFLElBQUksQ0FBQyxJQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQy9HLENBQUM7SUFFRCxRQUFRO1FBRU4sSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUseUJBQXlCLElBQUksRUFBRSxDQUFDLENBQUE7UUFDekcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsdUJBQXVCLElBQUksRUFBRSxDQUFDLENBQUE7UUFDckcsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUNBQWlDLENBQUMsSUFBZ0I7UUFFaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUVELHlCQUF5QixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFcEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFaEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFOUQsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELHVCQUF1QixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFbEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELHVCQUF1QixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFbEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFOUQsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFaEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELHVCQUF1QixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFbEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFOUQsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFL0QsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELHNCQUFzQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFakUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFaEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELHVCQUF1QixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFbEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELHlCQUF5QixDQUFDLElBQW1CLEVBQUUsTUFBdUI7UUFFcEUsSUFBSSxJQUFJLEdBQTBCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFN0csSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQzsrR0E3UVUseUJBQXlCO21HQUF6Qix5QkFBeUIsd3JCQ1p0QyxxaFJBeU5DOzs0RkQ3TVkseUJBQXlCO2tCQU5yQyxTQUFTO2lDQUNJLEtBQUssWUFDUCxxQkFBcUI7dUZBU0osTUFBTTtzQkFBaEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ0UsSUFBSTtzQkFBOUIsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ0UsV0FBVztzQkFBckMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ2hCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBS0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLXJvdy1ub2RlLmNsYXNzJztcbmltcG9ydCB7IE9uZUdyaWRSb3dBY3Rpb25FdmVudCwgT25lR3JpZFR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZ3JpZC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJQYXJhbXMsIE9uZUNvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRDZWxsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICBzZWxlY3RvcjogJ29uZS1ncmlkLXJvdy1hY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtcm93LWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9vbmUtZ3JpZC1yb3ctYWN0aW9uLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkUm93QWN0aW9uQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAvKipcbiAgICogR2V0IE5vZGUgJiBDZWxsIFJlbmRlcmVyIEZyb20gUGFyZW50IENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD47XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIG5vZGU6IE9uZVJvd05vZGU8VD47XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGFsbG93ZWRFZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3RlckRldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXN0ZXJOb2RlOiBPbmVSb3dOb2RlPFQ+ID0gbnVsbDtcbiAgQElucHV0KCkgY2VsbFJlbmRlcmVyUGFyYW1zOiBPbmVDZWxsUmVuZGVyZXJQYXJhbXM8VD47XG4gIEBJbnB1dCgpIGdyaWRUeXBlOiBPbmVHcmlkVHlwZSA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbnRleHQ6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEJpbmQgRXZlbnQgdG8gUGFyZW50IENvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpIG9uUm93R290b0RldGFpbCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dBZGROZXcgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93VmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMb2NhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEb2N1bWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1ByaW50ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0hpc3RvcnkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93T3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0xhbmd1YWdlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NlbGxPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcblxuICBwcm90ZWN0ZWQgZGV0YWlsQWN0aXZlRXhjbHVkZUxldmVsczogU2V0PG51bWJlcj47XG4gIHByb3RlY3RlZCBnb3RvRGV0YWlsRXhjbHVkZUxldmVsczogU2V0PG51bWJlcj47XG4gIHByb3RlY3RlZCBhZGROZXdFeGNsdWRlTGV2ZWxzOiBTZXQ8bnVtYmVyPjtcblxuICAvKipcbiAgICogQWNjZXNzaWJsZSBuYW1lcyBmb3IgdGhlIGFjdGlvbiBidXR0b25zLlxuICAgKlxuICAgKiBFdmVyeSBvbmUgb2YgdGhlbSBpcyBhbiBpY29uIHdpdGggbm8gdGV4dCwgYW5kIG5vbmUgY2FycmllZCBhIGxhYmVsIOKAlCBhXG4gICAqIHNjcmVlbiByZWFkZXIgYW5ub3VuY2VkIFwiYnV0dG9uXCIgYW5kIG5vdGhpbmcgbW9yZSwgZm91cnRlZW4gdGltZXMgcGVyIHJvdy5cbiAgICogVGhlc2UgYXJlIGFsc28gdGhlIGB0aXRsZWAsIHNvIHRoZSBpY29ucyBhcmUgaWRlbnRpZmlhYmxlIGJ5IHBvaW50ZXIgdG9vLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVscyA9IHtcbiAgICBnb3RvRGV0YWlsOiAnT3BlbiBkZXRhaWwnLFxuICAgIGFkZE5ldzogJ0FkZCBuZXcgcm93JyxcbiAgICB2aWV3OiAnVmlldyByb3cnLFxuICAgIGxvY2F0aW9uOiAnU2hvdyBsb2NhdGlvbicsXG4gICAgZG9jdW1lbnQ6ICdPcGVuIGRvY3VtZW50JyxcbiAgICBjb3B5OiAnQ29weSByb3cnLFxuICAgIGRlbGV0ZTogJ0RlbGV0ZSByb3cnLFxuICAgIGdvdG9MaXN0OiAnT3BlbiBsaXN0JyxcbiAgICBlZGl0OiAnRWRpdCByb3cnLFxuICAgIHByaW50OiAnUHJpbnQgcm93JyxcbiAgICBoaXN0b3J5OiAnVmlldyBoaXN0b3J5JyxcbiAgICBvcHRpb246ICdSb3cgb3B0aW9ucycsXG4gICAgbGFuZ3VhZ2U6ICdDaGFuZ2UgbGFuZ3VhZ2UnLFxuICAgIGNlbGxPcHRpb246ICdDZWxsIG9wdGlvbnMnLFxuICB9IGFzIGNvbnN0O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlcnZpY2U6IE9uZUdyaWRDZWxsU2VydmljZSkge31cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGNvbHVtbidzIGFjdGlvbiBidXR0b25zIGFyZSBoaWRkZW4gZm9yIHRoaXMgcm93LlxuICAgKlxuICAgKiBUaGUgdGVtcGxhdGVzIHJlYWQgYGNvbHVtbj8uaGlkZUFjdGlvbkJ1dHRvbmAgZGlyZWN0bHksIHdoaWNoIGlzIHRydXRoeSBmb3JcbiAgICogYW55IGZ1bmN0aW9uIOKAlCBzbyBhIHByZWRpY2F0ZSBhc2tpbmcgdG8gaGlkZSB0aGUgYnV0dG9ucyBzaG93ZWQgdGhlbSwgYW5kXG4gICAqIG9uZSBhc2tpbmcgdG8gc2hvdyB0aGVtIHNob3dlZCB0aGVtIHRvby4gUmVzb2x2ZWQgaGVyZSBpbnN0ZWFkLCB3aXRoIHRoZVxuICAgKiBzYW1lIHBhcmFtcyBldmVyeSBvdGhlciByb3ctc2NvcGVkIHByZWRpY2F0ZSBnZXRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBoaWRlQWN0aW9uQnV0dG9uKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuY2VsbFNlcnZpY2UuaGlkZUFjdGlvbkJ1dHRvbkZuKHRoaXMuY29sdW1uIGFzIE9uZUNvbHVtbkRlZiwgdGhpcy5ub2RlIGFzIE9uZVJvd05vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb2x1bW4ncyBhY3Rpb24gYnV0dG9ucyBhcmUgZGlzYWJsZWQgZm9yIHRoaXMgcm93LlxuICAgKlxuICAgKiBgZGlzYWJsZWAgdXNlZCB0byBiZSByZXNvbHZlZCBieSBgQ2VsbERpc2FibGVSZXNvbHZlclBpcGVgLCB3aGljaCBidWlsdCBpdHNcbiAgICogb3duIHBhcmFtcyDigJQgYSBkaWZmZXJlbnQgc2V0IGZyb20gZXZlcnkgb3RoZXIgcm93LXNjb3BlZCBwcmVkaWNhdGUuIEl0IGdvZXNcbiAgICogdGhyb3VnaCB0aGUgc2hhcmVkIGJ1aWxkZXIgbm93LCBzbyBgZGlzYWJsZWAgc2VlcyBleGFjdGx5IHdoYXQgYGVkaXRhYmxlYFxuICAgKiBhbmQgYGhpZGVBY3Rpb25CdXR0b25gIHNlZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWN0aW9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5jZWxsU2VydmljZS5kaXNhYmxlRm4odGhpcy5jb2x1bW4gYXMgT25lQ29sdW1uRGVmLCB0aGlzLm5vZGUgYXMgT25lUm93Tm9kZSkgfHwgIXRoaXMuYWxsb3dlZEVkaXQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuZGV0YWlsQWN0aXZlRXhjbHVkZUxldmVscyA9IG5ldyBTZXQodGhpcy5jb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zPy5kZXRhaWxBY3RpdmVFeGNsdWRlTGV2ZWxzID8/IFtdKVxuICAgIHRoaXMuZ290b0RldGFpbEV4Y2x1ZGVMZXZlbHMgPSBuZXcgU2V0KHRoaXMuY29sdW1uLmNlbGxSZW5kZXJlclBhcmFtcz8uZ290b0RldGFpbEV4Y2x1ZGVMZXZlbHMgPz8gW10pXG4gICAgdGhpcy5hZGROZXdFeGNsdWRlTGV2ZWxzID0gbmV3IFNldCh0aGlzLmNvbHVtbi5jZWxsUmVuZGVyZXJQYXJhbXM/LmFkZE5ld0V4Y2x1ZGVMZXZlbHMgPz8gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgSW52b2tlIENsaWNrIEV2ZW50XG4gICAqL1xuICBpbnZva2VSb3dUb2dnbGVEZXRhaWxBY3RpdmVFeHBhbmQobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgbm9kZS5kZXRhaWxBY3RpdmUgPSAhbm9kZS5kZXRhaWxBY3RpdmU7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25BZGROZXcobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0FkZE5ldy5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uVmlldyhub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93Vmlldy5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTG9jYXRpb24obm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0xvY2F0aW9uLmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Eb2N1bWVudChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93RG9jdW1lbnQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNvcHkobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0NvcHkuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRlbGV0ZShub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93RGVsZXRlLmVtaXQoZGF0YSk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93R290b0xpc3QuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGxldCBkYXRhOiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBkYXRhID0geyAuLi5kYXRhLCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0VkaXQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblByaW50KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dQcmludC5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uSGlzdG9yeShub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93SGlzdG9yeS5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uT3B0aW9uKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dPcHRpb24uZW1pdChkYXRhKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxhbmd1YWdlKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgZGF0YTogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZGF0YSA9IHsgLi4uZGF0YSwgZ3JpZFR5cGU6IHRoaXMuZ3JpZFR5cGUsIG1hc3Rlck5vZGU6IHRoaXMubWFzdGVyTm9kZSB9O1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dMYW5ndWFnZS5lbWl0KGRhdGEpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbihub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IGRhdGE6IE9uZUdyaWRSb3dBY3Rpb25FdmVudCA9IHsgbm9kZSwgY29sdW1uLCBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBncmlkVHlwZTogbnVsbCB9O1xuXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIGRhdGEgPSB7IC4uLmRhdGEsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uUm93Q2VsbE9wdGlvbi5lbWl0KGRhdGEpO1xuICB9XG59XG4iLCJAaWYgKChjZWxsUmVuZGVyZXJQYXJhbXMgJiYgbm9kZT8ubGVhZiAmJiAhY29sdW1uPy5hdXRvR3JvdXBGaWVsZCAmJiAhKG5vZGUuZ3JvdXAgJiYgbm9kZS5sZWFmR3JvdXApKSB8fCAoY29sdW1uPy5yb3dBY3Rpb25MZXZlbHM/LmluY2x1ZGVzKG5vZGUubGV2ZWwpICYmIGNvbHVtbj8uYXV0b0dyb3VwRmllbGQpKSB7XG4gICAgPGRpdiBjbGFzcz1cImJ0bi1hY3Rpb24tY29udGFpbmVyXCI+XG5cbiAgICAgICAgPCEtLSBFeHBhbnNpb24gQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgIEBpZiAoKGNlbGxSZW5kZXJlclBhcmFtcz8uZGV0YWlsQWN0aXZlQnV0dG9uU3RhdHVzID09IDEgJiYgIShkZXRhaWxBY3RpdmVFeGNsdWRlTGV2ZWxzPy5oYXMobm9kZS5sZXZlbCkpKSkge1xuICAgICAgICAgICAgPCEtLSBBIGJ1dHRvbiwgbm90IGFuIDxhPiB3aXRoIGEgY2xpY2sgaGFuZGxlcjogaXQgaGFzIG5vIGhyZWYsIHNvXG4gICAgICAgICAgICAgICAgIGl0IHdhcyBuZWl0aGVyIGZvY3VzYWJsZSBub3Igb3BlcmFibGUgZnJvbSB0aGUga2V5Ym9hcmQuIC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXBsYWluIG1lLTJcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwibm9kZS5kZXRhaWxBY3RpdmVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibm9kZS5kZXRhaWxBY3RpdmUgPyAnQ29sbGFwc2Ugcm93JyA6ICdFeHBhbmQgcm93J1wiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIm5vZGUuZGV0YWlsQWN0aXZlID8gJ0NvbGxhcHNlJyA6ICdFeHBhbmQnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93VG9nZ2xlRGV0YWlsQWN0aXZlRXhwYW5kKG5vZGUpXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpXCIgW25nQ2xhc3NdPVwieyAnYmktY2hldnJvbi1kb3duJzogbm9kZS5kZXRhaWxBY3RpdmUsICdiaS1jaGV2cm9uLXJpZ2h0JzogIW5vZGUuZGV0YWlsQWN0aXZlIH1cIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gR290byBEZXRhaWwgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgQGlmICgoY2VsbFJlbmRlcmVyUGFyYW1zPy5nb3RvRGV0YWlsQnV0dG9uU3RhdHVzID09IDEgJiYgIShnb3RvRGV0YWlsRXhjbHVkZUxldmVscz8uaGFzKG5vZGUubGV2ZWwpKSkgJiYgKCFoaWRlQWN0aW9uQnV0dG9uIHx8IGFsbG93ZWRFZGl0KSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxzLmdvdG9EZXRhaWxcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJsYWJlbHMuZ290b0RldGFpbFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkdvdG9EZXRhaWwobm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1saXN0LXRhc2tcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gQWRkIE5ldyBCdXR0b24gU3RhdHVzIC0tPlxuICAgICAgICBAaWYgKChjZWxsUmVuZGVyZXJQYXJhbXM/LmFkZE5ld0J1dHRvblN0YXR1cyA9PSAxICYmICEoYWRkTmV3RXhjbHVkZUxldmVscz8uaGFzKG5vZGUubGV2ZWwpKSkgJiYgKCFoaWRlQWN0aW9uQnV0dG9uIHx8IGFsbG93ZWRFZGl0KSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJhY3Rpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy5hZGROZXdcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJsYWJlbHMuYWRkTmV3XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uQWRkTmV3KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcGx1c1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBWaWV3IEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy52aWV3QnV0dG9uU3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy52aWV3XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibGFiZWxzLnZpZXdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25WaWV3KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZXllXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChjZWxsUmVuZGVyZXJQYXJhbXM/LmxvY2F0aW9uQnV0dG9uU3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy5sb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImxhYmVscy5sb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZ2VvLWFsdFwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBEb2N1bWVudCBCdXR0b24gU3RhdHVzIC0tPlxuICAgICAgICBAaWYgKGNlbGxSZW5kZXJlclBhcmFtcz8uZG9jdW1lbnRCdXR0b25TdGF0dXMgPT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxzLmRvY3VtZW50XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibGFiZWxzLmRvY3VtZW50XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uRG9jdW1lbnQobm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1maWxlLWVhcm1hcmstdGV4dFwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBDb3B5IEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5jb3B5QnV0dG9uU3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hY3Rpb24gYnRuLWFjdGlvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy5jb3B5XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibGFiZWxzLmNvcHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZmlsZXNcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG5cbiAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5kZWxldGVCdXR0b25TdGF0dXMgPT0gMSAmJiAoIWhpZGVBY3Rpb25CdXR0b24gfHwgYWxsb3dlZEVkaXQpKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiYWN0aW9uRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbHMuZGVsZXRlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibGFiZWxzLmRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZShub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXRyYXNoM1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBHb3RvIExpc3QgQnV0dG9uIFN0YXR1cyAtLT5cbiAgICAgICAgQGlmIChjZWxsUmVuZGVyZXJQYXJhbXM/LmdvdG9MaXN0QnV0dG9uU3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tc3VjY2Vzc1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbHMuZ290b0xpc3RcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJsYWJlbHMuZ290b0xpc3RcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdChub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWxpc3QtdWxcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gRWRpdCBCdXR0b24gU3RhdHVzIC0tPlxuICAgICAgICBAaWYgKGNlbGxSZW5kZXJlclBhcmFtcz8uZWRpdEJ1dHRvblN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJhY3Rpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy5lZGl0XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibGFiZWxzLmVkaXRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFByaW50IEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5wcmludEJ1dHRvblN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJhY3Rpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy5wcmludFwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImxhYmVscy5wcmludFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvblByaW50KG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcHJpbnRlclwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBIaXN0b3J5IEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5oaXN0b3J5QnV0dG9uU3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImFjdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxzLmhpc3RvcnlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJsYWJlbHMuaGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkhpc3Rvcnkobm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jbG9jay1oaXN0b3J5XCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE9wdGlvbiBCdXR0b24gU3RhdHVzIC0tPlxuICAgICAgICBAaWYgKGNlbGxSZW5kZXJlclBhcmFtcz8ub3B0aW9uQnV0dG9uU3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWN0aW9uIGJ0bi1hY3Rpb24tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImFjdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxzLm9wdGlvblwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImxhYmVscy5vcHRpb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24obm9kZSwgY29sdW1uKVwiPlxuXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10aHJlZS1kb3RzLXZlcnRpY2FsXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIExhbmd1YWdlIEJ1dHRvbiBTdGF0dXMgLS0+XG4gICAgICAgIEBpZiAoY2VsbFJlbmRlcmVyUGFyYW1zPy5sYW5ndWFnZUJ1dHRvblN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJhY3Rpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy5sYW5ndWFnZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImxhYmVscy5sYW5ndWFnZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZVJvd0FjdGlvbkxhbmd1YWdlKG5vZGUsIGNvbHVtbilcIj5cblxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdHJhbnNsYXRlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIENlbGwgT3B0b2lvbiBCdXR0b24gU3RhdHVzIChDb250ZXh0IE1lbnUpIC0tPlxuICAgICAgICBAaWYgKGNlbGxSZW5kZXJlclBhcmFtcz8uY2VsbE9wdGlvbkJ1dHRvblN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFjdGlvbiBidG4tYWN0aW9uLXByaW1hcnkgYm9yZGVyLTAgdGV4dC1ib2R5XCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiYWN0aW9uRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbHMuY2VsbE9wdGlvblwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImxhYmVscy5jZWxsT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbihub2RlLCBjb2x1bW4pXCI+XG5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXRocmVlLWRvdHMtdmVydGljYWxcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxufSJdfQ==