igniteui-angular 18.2.1 → 18.2.3

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 (59) hide show
  1. package/esm2022/lib/combo/combo.common.mjs +8 -17
  2. package/esm2022/lib/combo/combo.component.mjs +3 -3
  3. package/esm2022/lib/data-operations/filtering-expressions-tree.mjs +3 -1
  4. package/esm2022/lib/grids/common/crud.service.mjs +5 -3
  5. package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +14 -1
  6. package/esm2022/lib/grids/grid-base.directive.mjs +29 -31
  7. package/esm2022/lib/grids/grid-navigation.service.mjs +16 -1
  8. package/esm2022/lib/grids/headers/grid-header.component.mjs +2 -11
  9. package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +1 -7
  10. package/esm2022/lib/navigation-drawer/navigation-drawer.component.mjs +3 -3
  11. package/esm2022/lib/services/exporter-common/export-utilities.mjs +4 -2
  12. package/esm2022/lib/slider/slider.component.mjs +4 -4
  13. package/fesm2022/igniteui-angular.mjs +80 -72
  14. package/fesm2022/igniteui-angular.mjs.map +1 -1
  15. package/lib/combo/combo.common.d.ts +1 -3
  16. package/lib/core/styles/components/dialog/_dialog-theme.scss +5 -12
  17. package/lib/core/styles/components/drop-down/_drop-down-theme.scss +10 -4
  18. package/lib/core/styles/components/time-picker/_time-picker-component.scss +0 -4
  19. package/lib/core/styles/components/time-picker/_time-picker-theme.scss +7 -28
  20. package/lib/core/styles/typography/_bootstrap.scss +3 -4
  21. package/lib/core/styles/typography/_fluent.scss +9 -2
  22. package/lib/core/styles/typography/_indigo.scss +0 -1
  23. package/lib/data-operations/filtering-expressions-tree.d.ts +2 -2
  24. package/lib/grids/filtering/excel-style/excel-style-filtering.component.d.ts +1 -0
  25. package/lib/grids/grid-base.directive.d.ts +4 -5
  26. package/lib/grids/grid-navigation.service.d.ts +2 -0
  27. package/lib/grids/headers/grid-header.component.d.ts +0 -1
  28. package/lib/grids/pivot-grid/pivot-grid.component.d.ts +0 -5
  29. package/migrations/migration-collection.json +5 -0
  30. package/migrations/update-18_2_3/changes/theme-changes.json +11 -0
  31. package/migrations/update-18_2_3/index.d.ts +3 -0
  32. package/migrations/update-18_2_3/index.js +18 -0
  33. package/package.json +2 -2
  34. package/styles/igniteui-angular-dark.css +1 -1
  35. package/styles/igniteui-angular.css +1 -1
  36. package/styles/igniteui-bootstrap-dark.css +1 -1
  37. package/styles/igniteui-bootstrap-light.css +1 -1
  38. package/styles/igniteui-dark-green.css +1 -1
  39. package/styles/igniteui-fluent-dark-excel.css +1 -1
  40. package/styles/igniteui-fluent-dark-word.css +1 -1
  41. package/styles/igniteui-fluent-dark.css +1 -1
  42. package/styles/igniteui-fluent-light-excel.css +1 -1
  43. package/styles/igniteui-fluent-light-word.css +1 -1
  44. package/styles/igniteui-fluent-light.css +1 -1
  45. package/styles/igniteui-indigo-dark.css +1 -1
  46. package/styles/igniteui-indigo-light.css +1 -1
  47. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  48. package/styles/maps/igniteui-angular.css.map +1 -1
  49. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  50. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  51. package/styles/maps/igniteui-dark-green.css.map +1 -1
  52. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  53. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  54. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  55. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  56. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  57. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  58. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  59. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -47,12 +47,6 @@ export class IgxGridHeaderComponent {
47
47
  get selectedStyle() {
48
48
  return this.selected;
49
49
  }
50
- get height() {
51
- if (!this.grid.hasColumnGroups || this.grid.type === 'pivot') {
52
- return null;
53
- }
54
- return (this.grid.maxLevelHeaderDepth + 1 - this.column.level) * this.grid.defaultRowHeight / this.grid._baseFontSize;
55
- }
56
50
  /**
57
51
  * @hidden
58
52
  */
@@ -212,7 +206,7 @@ export class IgxGridHeaderComponent {
212
206
  });
213
207
  }
214
208
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxGridHeaderComponent, deps: [{ token: IGX_GRID_BASE }, { token: i1.IgxColumnResizingService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
215
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.4", type: IgxGridHeaderComponent, isStandalone: true, selector: "igx-grid-header", inputs: { column: "column" }, host: { listeners: { "click": "onClick($event)", "pointerenter": "onPinterEnter()", "pointerleave": "onPointerLeave()" }, properties: { "attr.aria-selected": "this.ariaSelected", "class.igx-grid-th": "this.columnGroupStyle", "class.asc": "this.sortAscendingStyle", "class.desc": "this.sortDescendingStyle", "class.igx-grid-th--number": "this.numberStyle", "class.igx-grid-th--sortable": "this.sortableStyle", "class.igx-grid-th--selectable": "this.selectableStyle", "class.igx-grid-th--filtrable": "this.filterableStyle", "class.igx-grid-th--sorted": "this.sortedStyle", "class.igx-grid-th--selected": "this.selectedStyle", "style.height.rem": "this.height" } }, viewQueries: [{ propertyName: "defaultESFHeaderIconTemplate", first: true, predicate: ["defaultESFHeaderIconTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultSortHeaderIconTemplate", first: true, predicate: ["defaultSortHeaderIconTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "sortIconContainer", first: true, predicate: ["sortIconContainer"], descendants: true, read: ElementRef }], ngImport: i0, template: "<ng-template #defaultColumn>\n <span [title]=\"title\">{{ column.header || column.field }}</span>\n</ng-template>\n\n<ng-template #defaultESFHeaderIconTemplate>\n <igx-icon family=\"default\" name=\"more_vert\"></igx-icon>\n</ng-template>\n\n<ng-template #defaultSortHeaderIconTemplate>\n <igx-icon\n family=\"default\"\n [name]=\"sortDirection < 2 ? 'sort_asc' : 'sort_desc'\">\n </igx-icon>\n</ng-template>\n\n<span class=\"igx-grid-th__title\">\n <ng-container\n *ngTemplateOutlet=\"column.headerTemplate ? column.headerTemplate : defaultColumn; context: { $implicit: column, column: column}\">\n </ng-container>\n</span>\n<ng-container *ngIf=\"!column.columnGroup\">\n <div class=\"igx-grid-th__icons\">\n <ng-container *ngIf=\"column.sortable && !disabled\">\n <div #sortIconContainer class=\"sort-icon\"\n [attr.data-sortIndex]=\"(grid.sortingOptions.mode === 'single' && grid.sortingExpressions.length <=1) ? null : column.field | sortingIndex:grid.sortingExpressions\"\n (pointerdown)=\"onPointerDownIndicator($event)\" (click)=\"onSortingIconClick($event)\">\n <ng-container *ngTemplateOutlet=\"sortIconTemplate; context: { $implicit: this }\"></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"grid.allowFiltering && column.filterable && grid.filterMode === 'excelStyleFilter'\">\n <div [ngClass]=\"filterIconClassName\" (pointerdown)=\"onPointerDownIndicator($event)\" (click)=\"onFilteringIconClick($event)\" >\n <ng-container *ngTemplateOutlet=\"esfIconTemplate; context: { $implicit: this }\"></ng-container>\n </div>\n </ng-container>\n </div>\n</ng-container>\n", dependencies: [{ kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: SortingIndexPipe, name: "sortingIndex" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
209
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.4", type: IgxGridHeaderComponent, isStandalone: true, selector: "igx-grid-header", inputs: { column: "column" }, host: { listeners: { "click": "onClick($event)", "pointerenter": "onPinterEnter()", "pointerleave": "onPointerLeave()" }, properties: { "attr.aria-selected": "this.ariaSelected", "class.igx-grid-th": "this.columnGroupStyle", "class.asc": "this.sortAscendingStyle", "class.desc": "this.sortDescendingStyle", "class.igx-grid-th--number": "this.numberStyle", "class.igx-grid-th--sortable": "this.sortableStyle", "class.igx-grid-th--selectable": "this.selectableStyle", "class.igx-grid-th--filtrable": "this.filterableStyle", "class.igx-grid-th--sorted": "this.sortedStyle", "class.igx-grid-th--selected": "this.selectedStyle" } }, viewQueries: [{ propertyName: "defaultESFHeaderIconTemplate", first: true, predicate: ["defaultESFHeaderIconTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultSortHeaderIconTemplate", first: true, predicate: ["defaultSortHeaderIconTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "sortIconContainer", first: true, predicate: ["sortIconContainer"], descendants: true, read: ElementRef }], ngImport: i0, template: "<ng-template #defaultColumn>\n <span [title]=\"title\">{{ column.header || column.field }}</span>\n</ng-template>\n\n<ng-template #defaultESFHeaderIconTemplate>\n <igx-icon family=\"default\" name=\"more_vert\"></igx-icon>\n</ng-template>\n\n<ng-template #defaultSortHeaderIconTemplate>\n <igx-icon\n family=\"default\"\n [name]=\"sortDirection < 2 ? 'sort_asc' : 'sort_desc'\">\n </igx-icon>\n</ng-template>\n\n<span class=\"igx-grid-th__title\">\n <ng-container\n *ngTemplateOutlet=\"column.headerTemplate ? column.headerTemplate : defaultColumn; context: { $implicit: column, column: column}\">\n </ng-container>\n</span>\n<ng-container *ngIf=\"!column.columnGroup\">\n <div class=\"igx-grid-th__icons\">\n <ng-container *ngIf=\"column.sortable && !disabled\">\n <div #sortIconContainer class=\"sort-icon\"\n [attr.data-sortIndex]=\"(grid.sortingOptions.mode === 'single' && grid.sortingExpressions.length <=1) ? null : column.field | sortingIndex:grid.sortingExpressions\"\n (pointerdown)=\"onPointerDownIndicator($event)\" (click)=\"onSortingIconClick($event)\">\n <ng-container *ngTemplateOutlet=\"sortIconTemplate; context: { $implicit: this }\"></ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"grid.allowFiltering && column.filterable && grid.filterMode === 'excelStyleFilter'\">\n <div [ngClass]=\"filterIconClassName\" (pointerdown)=\"onPointerDownIndicator($event)\" (click)=\"onFilteringIconClick($event)\" >\n <ng-container *ngTemplateOutlet=\"esfIconTemplate; context: { $implicit: this }\"></ng-container>\n </div>\n </ng-container>\n </div>\n</ng-container>\n", dependencies: [{ kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "name", "active"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: SortingIndexPipe, name: "sortingIndex" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
216
210
  }
217
211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImport: i0, type: IgxGridHeaderComponent, decorators: [{
218
212
  type: Component,
@@ -261,9 +255,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
261
255
  }], selectedStyle: [{
262
256
  type: HostBinding,
263
257
  args: ['class.igx-grid-th--selected']
264
- }], height: [{
265
- type: HostBinding,
266
- args: ['style.height.rem']
267
258
  }], onClick: [{
268
259
  type: HostListener,
269
260
  args: ['click', ['$event']]
@@ -274,4 +265,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
274
265
  type: HostListener,
275
266
  args: ['pointerleave']
276
267
  }] } });
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hlYWRlcnMvZ3JpZC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hlYWRlcnMvZ3JpZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxXQUFXLEVBQ1gsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUF3QixhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7O0FBRWxGOztHQUVHO0FBUUgsTUFBTSxPQUFPLHNCQUFzQjtJQXVCL0I7O09BRUc7SUFDSCxJQUNXLFlBQVk7UUFDbkIsT0FB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QkFENUIsV0FBVzt1QkFBQyxXQUFXO2dCQU1iLG1CQUFtQjtzQkFEN0IsV0FBVzt1QkFBQyxZQUFZO2dCQU1kLFdBQVc7c0JBRHJCLFdBQVc7dUJBQUMsMkJBQTJCO2dCQU03QixhQUFhO3NCQUR2QixXQUFXO3VCQUFDLDZCQUE2QjtnQkFNL0IsZUFBZTtzQkFEekIsV0FBVzt1QkFBQywrQkFBK0I7Z0JBTWpDLGVBQWU7c0JBRHpCLFdBQVc7dUJBQUMsOEJBQThCO2dCQU1oQyxXQUFXO3NCQURyQixXQUFXO3VCQUFDLDJCQUEyQjtnQkFNN0IsYUFBYTtzQkFEdkIsV0FBVzt1QkFBQyw2QkFBNkI7Z0JBTS9CLE1BQU07c0JBRGhCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQWdGeEIsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFnQzFCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsY0FBYztnQkFTckIsY0FBYztzQkFEcEIsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi4vcmVzaXppbmcvcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkU2VsZWN0aW9uTW9kZSB9IGZyb20gJy4uL2NvbW1vbi9lbnVtcyc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgU29ydGluZ0luZGV4UGlwZSB9IGZyb20gJy4vcGlwZXMnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFeHByZXNzaW9uc1RyZWVVdGlsIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2V4cHJlc3Npb25zLXRyZWUtdXRpbCc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1ncmlkLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICdncmlkLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbSWd4SWNvbkNvbXBvbmVudCwgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiwgTmdDbGFzcywgU29ydGluZ0luZGV4UGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2x1bW46IENvbHVtblR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVTRkhlYWRlckljb25UZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RVNGSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRTb3J0SGVhZGVySWNvblRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRTb3J0SGVhZGVySWNvblRlbXBsYXRlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NvcnRJY29uQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNvcnRJY29uQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYGFyaWEtc2VsZWN0ZWRgIG9mIHRoZSBoZWFkZXIuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtc2VsZWN0ZWQnKVxuICAgIHB1YmxpYyBnZXQgYXJpYVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aCcpXG4gICAgcHVibGljIGdldCBjb2x1bW5Hcm91cFN0eWxlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29sdW1uLmNvbHVtbkdyb3VwO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYXNjJylcbiAgICBwdWJsaWMgZ2V0IHNvcnRBc2NlbmRpbmdTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5Bc2M7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kZXNjJylcbiAgICBwdWJsaWMgZ2V0IHNvcnREZXNjZW5kaW5nU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb24gPT09IFNvcnRpbmdEaXJlY3Rpb24uRGVzYztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkLXRoLS1udW1iZXInKVxuICAgIHB1YmxpYyBnZXQgbnVtYmVyU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLk51bWJlcjtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkLXRoLS1zb3J0YWJsZScpXG4gICAgcHVibGljIGdldCBzb3J0YWJsZVN0eWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uc29ydGFibGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aC0tc2VsZWN0YWJsZScpXG4gICAgcHVibGljIGdldCBzZWxlY3RhYmxlU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aC0tZmlsdHJhYmxlJylcbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmFibGVTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpbHRlcmFibGUgJiYgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWQtdGgtLXNvcnRlZCcpXG4gICAgcHVibGljIGdldCBzb3J0ZWRTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWQtdGgtLXNlbGVjdGVkJylcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0LnJlbScpXG4gICAgcHVibGljIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLmhhc0NvbHVtbkdyb3VwcyB8fCB0aGlzLmdyaWQudHlwZSA9PT0gJ3Bpdm90Jykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHRoaXMuZ3JpZC5tYXhMZXZlbEhlYWRlckRlcHRoICsgMSAtIHRoaXMuY29sdW1uLmxldmVsKSAqIHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0IC8gdGhpcy5ncmlkLl9iYXNlRm9udFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXNmSWNvblRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0RVNGSGVhZGVySWNvblRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNvcnRJY29uVGVtcGxhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb24gPT09IFNvcnRpbmdEaXJlY3Rpb24uTm9uZSAmJiB0aGlzLmdyaWQuc29ydEhlYWRlckljb25UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5zb3J0SGVhZGVySWNvblRlbXBsYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5Bc2MgJiYgdGhpcy5ncmlkLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQuc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNvcnREaXJlY3Rpb24gPT09IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyAmJiB0aGlzLmdyaWQuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0U29ydEhlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBBcmVhID0gdGhpcy5ncmlkLmdyb3VwQXJlYSB8fCB0aGlzLmdyaWQudHJlZUdyb3VwQXJlYTtcbiAgICAgICAgaWYgKGdyb3VwQXJlYT8uZXhwcmVzc2lvbnMgJiYgZ3JvdXBBcmVhLmV4cHJlc3Npb25zLmxlbmd0aCAmJiBncm91cEFyZWEuZXhwcmVzc2lvbnMubWFwKGcgPT4gZy5maWVsZE5hbWUpLmluY2x1ZGVzKHRoaXMuY29sdW1uLmZpZWxkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc29ydGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uICE9PSBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJJY29uQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHx8IHRoaXMuaXNBZHZhbmNlZEZpbHRlckFwcGxpZWQoKSA/ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uLS1maWx0ZXJlZCcgOiAnaWd4LWV4Y2VsLWZpbHRlcl9faWNvbic7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmNvbHVtblNlbGVjdGlvbiAhPT0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZSAmJlxuICAgICAgICAgICAgdGhpcy5jb2x1bW4uYXBwbHlTZWxlY3RhYmxlQ2xhc3MgJiZcbiAgICAgICAgICAgICF0aGlzLmNvbHVtbi5zZWxlY3RlZCAmJlxuICAgICAgICAgICAgIXRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uc2VsZWN0ZWRcbiAgICAgICAgICAgICYmICghdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlIHx8IHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uICE9PSB0aGlzLmNvbHVtbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLnRpdGxlIHx8IHRoaXMuY29sdW1uLmhlYWRlciB8fCB0aGlzLmNvbHVtbi5maWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzb3J0RGlyZWN0aW9uID0gU29ydGluZ0RpcmVjdGlvbi5Ob25lO1xuICAgIHByb3RlY3RlZCBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIGdyaWQ6IEdyaWRUeXBlLFxuICAgICAgICBwdWJsaWMgY29sUmVzaXppbmdTZXJ2aWNlOiBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICApIHsgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb2xSZXNpemluZ1NlcnZpY2UuaXNDb2x1bW5SZXNpemluZykge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uLmZpbHRlckNlbGxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2x1bW4uZmlsdGVyYWJsZSAmJiAhdGhpcy5jb2x1bW4uY29sdW1uR3JvdXAgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyQ29tcGxleCh0aGlzLmNvbHVtbi5maWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW4gPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZC5jb2x1bW5TZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmUgJiYgdGhpcy5jb2x1bW4uc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFyU2VsZWN0aW9uID0gdGhpcy5ncmlkLmNvbHVtblNlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUuc2luZ2xlIHx8ICFldmVudC5jdHJsS2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlU2VsZWN0aW9uID0gdGhpcy5ncmlkLmNvbHVtblNlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUubXVsdGlwbGUgJiYgZXZlbnQuc2hpZnRLZXk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29sdW1uLnNlbGVjdGVkIHx8ICh0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RlZENvbHVtbnMoKS5sZW5ndGggPiAxICYmIGNsZWFyU2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RDb2x1bW4odGhpcy5jb2x1bW4uZmllbGQsIGNsZWFyU2VsZWN0aW9uLCByYW5nZVNlbGVjdGlvbiwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Q29sdW1uKHRoaXMuY29sdW1uLmZpZWxkLCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZC50aGVhZFJvdy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicpXG4gICAgcHVibGljIG9uUGludGVyRW50ZXIoKSB7XG4gICAgICAgIHRoaXMuY29sdW1uLmFwcGx5U2VsZWN0YWJsZUNsYXNzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigncG9pbnRlcmxlYXZlJylcbiAgICBwdWJsaWMgb25Qb2ludGVyTGVhdmUoKSB7XG4gICAgICAgIHRoaXMuY29sdW1uLmFwcGx5U2VsZWN0YWJsZUNsYXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmdldFNvcnREaXJlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Qb2ludGVyRG93bkluZGljYXRvcihldmVudCkge1xuICAgICAgICAvLyBTdG9wIHByb3BhZ2F0aW9uIG9mIHBvaW50ZXIgZXZlbnRzIHRvIG5vdyBhbGxvdyBjb2x1bW4gZHJhZ2dpbmcgdXNpbmcgdGhlIGhlYWRlciBpbmRpY2F0b3JzLlxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZpbHRlcmluZ0ljb25DbGljayhldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UudG9nZ2xlRmlsdGVyRHJvcGRvd24odGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Tb3J0aW5nSWNvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnRyaWdnZXJTb3J0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFNvcnREaXJlY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSB0aGlzLmdyaWQuc29ydGluZ0V4cHJlc3Npb25zLmZpbmQoKHgpID0+IHguZmllbGROYW1lID09PSB0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IGV4cHIgPyBleHByLmRpciA6IFNvcnRpbmdEaXJlY3Rpb24uTm9uZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNBZHZhbmNlZEZpbHRlckFwcGxpZWQoKSB7XG4gICAgICAgIGlmKCF0aGlzLmdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFFeHByZXNzaW9uc1RyZWVVdGlsLmZpbmQodGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCB0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyU29ydCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBpbmdFeHByID0gdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMgP1xuICAgICAgICAgICAgdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMuZmluZCgoZXhwcikgPT4gZXhwci5maWVsZE5hbWUgPT09IHRoaXMuY29sdW1uLmZpZWxkKSA6XG4gICAgICAgICAgICB0aGlzLmdyaWQuZ3JvdXBBcmVhPy5leHByZXNzaW9ucyA/IHRoaXMuZ3JpZC5ncm91cEFyZWE/LmV4cHJlc3Npb25zLmZpbmQoKGV4cHIpID0+IGV4cHIuZmllbGROYW1lID09PSB0aGlzLmNvbHVtbi5maWVsZCkgOiBudWxsO1xuICAgICAgICBjb25zdCBzb3J0RGlyID0gZ3JvdXBpbmdFeHByID9cbiAgICAgICAgICAgIHRoaXMuc29ydERpcmVjdGlvbiArIDEgPiBTb3J0aW5nRGlyZWN0aW9uLkRlc2MgPyBTb3J0aW5nRGlyZWN0aW9uLkFzYyA6IFNvcnRpbmdEaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgOiB0aGlzLnNvcnREaXJlY3Rpb24gKyAxID4gU29ydGluZ0RpcmVjdGlvbi5EZXNjID8gU29ydGluZ0RpcmVjdGlvbi5Ob25lIDogdGhpcy5zb3J0RGlyZWN0aW9uICsgMTtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gc29ydERpcjtcbiAgICAgICAgdGhpcy5ncmlkLnNvcnQoe1xuICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmNvbHVtbi5maWVsZCwgZGlyOiB0aGlzLnNvcnREaXJlY3Rpb24sIGlnbm9yZUNhc2U6IHRoaXMuY29sdW1uLnNvcnRpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgc3RyYXRlZ3k6IHRoaXMuY29sdW1uLnNvcnRTdHJhdGVneVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW4+XG4gICAgPHNwYW4gW3RpdGxlXT1cInRpdGxlXCI+e3sgY29sdW1uLmhlYWRlciB8fCBjb2x1bW4uZmllbGQgfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFU0ZIZWFkZXJJY29uVGVtcGxhdGU+XG4gICAgPGlneC1pY29uIGZhbWlseT1cImRlZmF1bHRcIiBuYW1lPVwibW9yZV92ZXJ0XCI+PC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNvcnRIZWFkZXJJY29uVGVtcGxhdGU+XG4gICAgPGlneC1pY29uXG4gICAgICAgIGZhbWlseT1cImRlZmF1bHRcIlxuICAgICAgICBbbmFtZV09XCJzb3J0RGlyZWN0aW9uIDwgMiA/ICdzb3J0X2FzYycgOiAnc29ydF9kZXNjJ1wiPlxuICAgIDwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48c3BhbiBjbGFzcz1cImlneC1ncmlkLXRoX190aXRsZVwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGUgPyBjb2x1bW4uaGVhZGVyVGVtcGxhdGUgOiBkZWZhdWx0Q29sdW1uOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29sdW1uLCBjb2x1bW46IGNvbHVtbn1cIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvc3Bhbj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLmNvbHVtbkdyb3VwXCI+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkLXRoX19pY29uc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlICYmICFkaXNhYmxlZFwiPlxuICAgICAgICAgICAgPGRpdiAjc29ydEljb25Db250YWluZXIgY2xhc3M9XCJzb3J0LWljb25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtc29ydEluZGV4XT1cIihncmlkLnNvcnRpbmdPcHRpb25zLm1vZGUgPT09ICdzaW5nbGUnICYmIGdyaWQuc29ydGluZ0V4cHJlc3Npb25zLmxlbmd0aCA8PTEpID8gbnVsbCA6IGNvbHVtbi5maWVsZCB8IHNvcnRpbmdJbmRleDpncmlkLnNvcnRpbmdFeHByZXNzaW9uc1wiXG4gICAgICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUG9pbnRlckRvd25JbmRpY2F0b3IoJGV2ZW50KVwiIChjbGljayk9XCJvblNvcnRpbmdJY29uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzb3J0SWNvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogIHRoaXMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5hbGxvd0ZpbHRlcmluZyAmJiBjb2x1bW4uZmlsdGVyYWJsZSAmJiBncmlkLmZpbHRlck1vZGUgPT09ICdleGNlbFN0eWxlRmlsdGVyJ1wiPlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJmaWx0ZXJJY29uQ2xhc3NOYW1lXCIgKHBvaW50ZXJkb3duKT1cIm9uUG9pbnRlckRvd25JbmRpY2F0b3IoJGV2ZW50KVwiIChjbGljayk9XCJvbkZpbHRlcmluZ0ljb25DbGljaygkZXZlbnQpXCIgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlc2ZJY29uVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAgdGhpcyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hlYWRlcnMvZ3JpZC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2hlYWRlcnMvZ3JpZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxXQUFXLEVBQ1gsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUF3QixhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7O0FBRWxGOztHQUVHO0FBUUgsTUFBTSxPQUFPLHNCQUFzQjtJQXVCL0I7O09BRUc7SUFDSCxJQUNXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFDVyxnQkFBZ0I7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUNXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssZ0JBQWdCLENBQUMsR0FBRyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUNXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUNXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQ1csYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUNXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUNXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDO0lBQ25GLENBQUM7SUFFRCxJQUNXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUNXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLElBQUksSUFBSSxDQUFDLDRCQUE0QixDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZ0JBQWdCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ25GLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUM1QyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7WUFDbEcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDO1FBQ3JELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztZQUNwRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztRQUM5QyxDQUFDO0lBQ0wsQ0FBQztJQUNEOztPQUVHO0lBQ0gsSUFBVyxRQUFRO1FBQ2YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDakUsSUFBSSxTQUFTLEVBQUUsV0FBVyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEksT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQztJQUNsSixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssaUJBQWlCLENBQUMsSUFBSTtZQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQjtZQUNoQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUNyQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO2VBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6SCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUtELFlBQ2tDLElBQWMsRUFDckMsa0JBQTRDLEVBQzVDLEdBQXNCLEVBQ3JCLEdBQTRCO1FBSE4sU0FBSSxHQUFKLElBQUksQ0FBVTtRQUNyQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTBCO1FBQzVDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3JCLFFBQUcsR0FBSCxHQUFHLENBQXlCO1FBUGpDLGtCQUFhLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1FBQ25DLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBT3pDLENBQUM7SUFHRSxPQUFPLENBQUMsS0FBaUI7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRTVDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQy9CLE9BQU87Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO29CQUNsRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDNUQsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDaEcsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssaUJBQWlCLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBRWxHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUM7b0JBQzFHLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3RHLENBQUM7cUJBQU0sQ0FBQztvQkFDSixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDeEUsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUVJLGFBQWE7UUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBRUksY0FBYztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxzQkFBc0IsQ0FBQyxLQUFLO1FBQy9CLCtGQUErRjtRQUMvRixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CLENBQUMsS0FBSztRQUM3QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxLQUFLO1FBQzNCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVTLGdCQUFnQjtRQUN0QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7SUFDakUsQ0FBQztJQUVTLHVCQUF1QjtRQUM3QixJQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1lBQzdDLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFTyxXQUFXO1FBQ2YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3BJLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJO1lBQzdGLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCO1lBQ2hHLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7U0FDckMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0E5UFEsc0JBQXNCLGtCQTRJbkIsYUFBYTtrR0E1SWhCLHNCQUFzQixzMUJBUW9CLFdBQVcsdUpBTVYsV0FBVywrSEFNdkIsVUFBVSw2QkN2RHRELDh1REFvQ0EsNENESGMsZ0JBQWdCLDJGQUFFLGdCQUFnQixvSkFBRSxJQUFJLDZGQUFFLE9BQU8sK0VBQUUsZ0JBQWdCOzsyRkFFcEUsc0JBQXNCO2tCQVBsQyxTQUFTO3NDQUNXLHVCQUF1QixDQUFDLE1BQU0sWUFDckMsaUJBQWlCLGNBRWYsSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQzs7MEJBOEl6RSxNQUFNOzJCQUFDLGFBQWE7eUlBeklsQixNQUFNO3NCQURaLEtBQUs7Z0JBT0ksNEJBQTRCO3NCQURyQyxTQUFTO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU9wRSw2QkFBNkI7c0JBRHRDLFNBQVM7dUJBQUMsK0JBQStCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT3JFLGlCQUFpQjtzQkFEMUIsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBT3pDLFlBQVk7c0JBRHRCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQU10QixnQkFBZ0I7c0JBRDFCLFdBQVc7dUJBQUMsbUJBQW1CO2dCQU1yQixrQkFBa0I7c0JBRDVCLFdBQVc7dUJBQUMsV0FBVztnQkFNYixtQkFBbUI7c0JBRDdCLFdBQVc7dUJBQUMsWUFBWTtnQkFNZCxXQUFXO3NCQURyQixXQUFXO3VCQUFDLDJCQUEyQjtnQkFNN0IsYUFBYTtzQkFEdkIsV0FBVzt1QkFBQyw2QkFBNkI7Z0JBTS9CLGVBQWU7c0JBRHpCLFdBQVc7dUJBQUMsK0JBQStCO2dCQU1qQyxlQUFlO3NCQUR6QixXQUFXO3VCQUFDLDhCQUE4QjtnQkFNaEMsV0FBVztzQkFEckIsV0FBVzt1QkFBQywyQkFBMkI7Z0JBTTdCLGFBQWE7c0JBRHZCLFdBQVc7dUJBQUMsNkJBQTZCO2dCQTRFbkMsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFnQzFCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsY0FBYztnQkFTckIsY0FBYztzQkFEcEIsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi4vcmVzaXppbmcvcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkU2VsZWN0aW9uTW9kZSB9IGZyb20gJy4uL2NvbW1vbi9lbnVtcyc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgU29ydGluZ0luZGV4UGlwZSB9IGZyb20gJy4vcGlwZXMnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFeHByZXNzaW9uc1RyZWVVdGlsIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2V4cHJlc3Npb25zLXRyZWUtdXRpbCc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1ncmlkLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICdncmlkLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbSWd4SWNvbkNvbXBvbmVudCwgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiwgTmdDbGFzcywgU29ydGluZ0luZGV4UGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2x1bW46IENvbHVtblR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVTRkhlYWRlckljb25UZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RVNGSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRTb3J0SGVhZGVySWNvblRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRTb3J0SGVhZGVySWNvblRlbXBsYXRlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NvcnRJY29uQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNvcnRJY29uQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYGFyaWEtc2VsZWN0ZWRgIG9mIHRoZSBoZWFkZXIuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtc2VsZWN0ZWQnKVxuICAgIHB1YmxpYyBnZXQgYXJpYVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aCcpXG4gICAgcHVibGljIGdldCBjb2x1bW5Hcm91cFN0eWxlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29sdW1uLmNvbHVtbkdyb3VwO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYXNjJylcbiAgICBwdWJsaWMgZ2V0IHNvcnRBc2NlbmRpbmdTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5Bc2M7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kZXNjJylcbiAgICBwdWJsaWMgZ2V0IHNvcnREZXNjZW5kaW5nU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb24gPT09IFNvcnRpbmdEaXJlY3Rpb24uRGVzYztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkLXRoLS1udW1iZXInKVxuICAgIHB1YmxpYyBnZXQgbnVtYmVyU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLk51bWJlcjtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkLXRoLS1zb3J0YWJsZScpXG4gICAgcHVibGljIGdldCBzb3J0YWJsZVN0eWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uc29ydGFibGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aC0tc2VsZWN0YWJsZScpXG4gICAgcHVibGljIGdldCBzZWxlY3RhYmxlU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aC0tZmlsdHJhYmxlJylcbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmFibGVTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpbHRlcmFibGUgJiYgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWQtdGgtLXNvcnRlZCcpXG4gICAgcHVibGljIGdldCBzb3J0ZWRTdHlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWQtdGgtLXNlbGVjdGVkJylcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzZkljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5leGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEVTRkhlYWRlckljb25UZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzb3J0SWNvblRlbXBsYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLk5vbmUgJiYgdGhpcy5ncmlkLnNvcnRIZWFkZXJJY29uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQuc29ydEhlYWRlckljb25UZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNvcnREaXJlY3Rpb24gPT09IFNvcnRpbmdEaXJlY3Rpb24uQXNjICYmIHRoaXMuZ3JpZC5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLkRlc2MgJiYgdGhpcy5ncmlkLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFNvcnRIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwQXJlYSA9IHRoaXMuZ3JpZC5ncm91cEFyZWEgfHwgdGhpcy5ncmlkLnRyZWVHcm91cEFyZWE7XG4gICAgICAgIGlmIChncm91cEFyZWE/LmV4cHJlc3Npb25zICYmIGdyb3VwQXJlYS5leHByZXNzaW9ucy5sZW5ndGggJiYgZ3JvdXBBcmVhLmV4cHJlc3Npb25zLm1hcChnID0+IGcuZmllbGROYW1lKS5pbmNsdWRlcyh0aGlzLmNvbHVtbi5maWVsZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiAhPT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVySWNvbkNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB8fCB0aGlzLmlzQWR2YW5jZWRGaWx0ZXJBcHBsaWVkKCkgPyAnaWd4LWV4Y2VsLWZpbHRlcl9faWNvbi0tZmlsdGVyZWQnIDogJ2lneC1leGNlbC1maWx0ZXJfX2ljb24nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5jb2x1bW5TZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmUgJiZcbiAgICAgICAgICAgIHRoaXMuY29sdW1uLmFwcGx5U2VsZWN0YWJsZUNsYXNzICYmXG4gICAgICAgICAgICAhdGhpcy5jb2x1bW4uc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICF0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLnNlbGVjdGVkXG4gICAgICAgICAgICAmJiAoIXRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSB8fCB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiAhPT0gdGhpcy5jb2x1bW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi50aXRsZSB8fCB0aGlzLmNvbHVtbi5oZWFkZXIgfHwgdGhpcy5jb2x1bW4uZmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc29ydERpcmVjdGlvbiA9IFNvcnRpbmdEaXJlY3Rpb24uTm9uZTtcbiAgICBwcm90ZWN0ZWQgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9HUklEX0JBU0UpIHB1YmxpYyBncmlkOiBHcmlkVHlwZSxcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICAgKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sUmVzaXppbmdTZXJ2aWNlLmlzQ29sdW1uUmVzaXppbmcpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbHVtbi5maWx0ZXJDZWxsVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uLmZpbHRlcmFibGUgJiYgIXRoaXMuY29sdW1uLmNvbHVtbkdyb3VwICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlckNvbXBsZXgodGhpcy5jb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdyaWQuY29sdW1uU2VsZWN0aW9uICE9PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lICYmIHRoaXMuY29sdW1uLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhclNlbGVjdGlvbiA9IHRoaXMuZ3JpZC5jb2x1bW5TZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLnNpbmdsZSB8fCAhZXZlbnQuY3RybEtleTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZVNlbGVjdGlvbiA9IHRoaXMuZ3JpZC5jb2x1bW5TZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlICYmIGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbHVtbi5zZWxlY3RlZCB8fCAodGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkubGVuZ3RoID4gMSAmJiBjbGVhclNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Q29sdW1uKHRoaXMuY29sdW1uLmZpZWxkLCBjbGVhclNlbGVjdGlvbiwgcmFuZ2VTZWxlY3Rpb24sIGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbih0aGlzLmNvbHVtbi5maWVsZCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWQudGhlYWRSb3cubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwb2ludGVyZW50ZXInKVxuICAgIHB1YmxpYyBvblBpbnRlckVudGVyKCkge1xuICAgICAgICB0aGlzLmNvbHVtbi5hcHBseVNlbGVjdGFibGVDbGFzcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScpXG4gICAgcHVibGljIG9uUG9pbnRlckxlYXZlKCkge1xuICAgICAgICB0aGlzLmNvbHVtbi5hcHBseVNlbGVjdGFibGVDbGFzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5nZXRTb3J0RGlyZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uUG9pbnRlckRvd25JbmRpY2F0b3IoZXZlbnQpIHtcbiAgICAgICAgLy8gU3RvcCBwcm9wYWdhdGlvbiBvZiBwb2ludGVyIGV2ZW50cyB0byBub3cgYWxsb3cgY29sdW1uIGRyYWdnaW5nIHVzaW5nIHRoZSBoZWFkZXIgaW5kaWNhdG9ycy5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25GaWx0ZXJpbmdJY29uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLnRvZ2dsZUZpbHRlckRyb3Bkb3duKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcy5jb2x1bW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uU29ydGluZ0ljb25DbGljayhldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyU29ydCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRTb3J0RGlyZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBleHByID0gdGhpcy5ncmlkLnNvcnRpbmdFeHByZXNzaW9ucy5maW5kKCh4KSA9PiB4LmZpZWxkTmFtZSA9PT0gdGhpcy5jb2x1bW4uZmllbGQpO1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBleHByID8gZXhwci5kaXIgOiBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQWR2YW5jZWRGaWx0ZXJBcHBsaWVkKCkge1xuICAgICAgICBpZighdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhRXhwcmVzc2lvbnNUcmVlVXRpbC5maW5kKHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgdGhpcy5jb2x1bW4uZmllbGQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlclNvcnQoKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nRXhwciA9IHRoaXMuZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zID9cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zLmZpbmQoKGV4cHIpID0+IGV4cHIuZmllbGROYW1lID09PSB0aGlzLmNvbHVtbi5maWVsZCkgOlxuICAgICAgICAgICAgdGhpcy5ncmlkLmdyb3VwQXJlYT8uZXhwcmVzc2lvbnMgPyB0aGlzLmdyaWQuZ3JvdXBBcmVhPy5leHByZXNzaW9ucy5maW5kKChleHByKSA9PiBleHByLmZpZWxkTmFtZSA9PT0gdGhpcy5jb2x1bW4uZmllbGQpIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc29ydERpciA9IGdyb3VwaW5nRXhwciA/XG4gICAgICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24gKyAxID4gU29ydGluZ0RpcmVjdGlvbi5EZXNjID8gU29ydGluZ0RpcmVjdGlvbi5Bc2MgOiBTb3J0aW5nRGlyZWN0aW9uLkRlc2NcbiAgICAgICAgICAgIDogdGhpcy5zb3J0RGlyZWN0aW9uICsgMSA+IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/IFNvcnRpbmdEaXJlY3Rpb24uTm9uZSA6IHRoaXMuc29ydERpcmVjdGlvbiArIDE7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IHNvcnREaXI7XG4gICAgICAgIHRoaXMuZ3JpZC5zb3J0KHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2x1bW4uZmllbGQsIGRpcjogdGhpcy5zb3J0RGlyZWN0aW9uLCBpZ25vcmVDYXNlOiB0aGlzLmNvbHVtbi5zb3J0aW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiB0aGlzLmNvbHVtbi5zb3J0U3RyYXRlZ3lcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNkZWZhdWx0Q29sdW1uPlxuICAgIDxzcGFuIFt0aXRsZV09XCJ0aXRsZVwiPnt7IGNvbHVtbi5oZWFkZXIgfHwgY29sdW1uLmZpZWxkIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RVNGSGVhZGVySWNvblRlbXBsYXRlPlxuICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cIm1vcmVfdmVydFwiPjwvaWd4LWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRTb3J0SGVhZGVySWNvblRlbXBsYXRlPlxuICAgIDxpZ3gtaWNvblxuICAgICAgICBmYW1pbHk9XCJkZWZhdWx0XCJcbiAgICAgICAgW25hbWVdPVwic29ydERpcmVjdGlvbiA8IDIgPyAnc29ydF9hc2MnIDogJ3NvcnRfZGVzYydcIj5cbiAgICA8L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZC10aF9fdGl0bGVcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uLmhlYWRlclRlbXBsYXRlID8gY29sdW1uLmhlYWRlclRlbXBsYXRlIDogZGVmYXVsdENvbHVtbjsgY29udGV4dDogeyAkaW1wbGljaXQ6IGNvbHVtbiwgY29sdW1uOiBjb2x1bW59XCI+XG4gICAgPC9uZy1jb250YWluZXI+XG48L3NwYW4+XG48bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5jb2x1bW5Hcm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZC10aF9faWNvbnNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSAmJiAhZGlzYWJsZWRcIj5cbiAgICAgICAgICAgIDxkaXYgI3NvcnRJY29uQ29udGFpbmVyIGNsYXNzPVwic29ydC1pY29uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXNvcnRJbmRleF09XCIoZ3JpZC5zb3J0aW5nT3B0aW9ucy5tb2RlID09PSAnc2luZ2xlJyAmJiBncmlkLnNvcnRpbmdFeHByZXNzaW9ucy5sZW5ndGggPD0xKSA/IG51bGwgOiBjb2x1bW4uZmllbGQgfCBzb3J0aW5nSW5kZXg6Z3JpZC5zb3J0aW5nRXhwcmVzc2lvbnNcIlxuICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJvblBvaW50ZXJEb3duSW5kaWNhdG9yKCRldmVudClcIiAoY2xpY2spPVwib25Tb3J0aW5nSWNvbkNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic29ydEljb25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6ICB0aGlzIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQuYWxsb3dGaWx0ZXJpbmcgJiYgY29sdW1uLmZpbHRlcmFibGUgJiYgZ3JpZC5maWx0ZXJNb2RlID09PSAnZXhjZWxTdHlsZUZpbHRlcidcIj5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZmlsdGVySWNvbkNsYXNzTmFtZVwiIChwb2ludGVyZG93bik9XCJvblBvaW50ZXJEb3duSW5kaWNhdG9yKCRldmVudClcIiAoY2xpY2spPVwib25GaWx0ZXJpbmdJY29uQ2xpY2soJGV2ZW50KVwiID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXNmSWNvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogIHRoaXMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=