igniteui-angular 16.1.4 → 16.1.6

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 (45) hide show
  1. package/esm2022/lib/buttonGroup/buttonGroup.component.mjs +5 -9
  2. package/esm2022/lib/calendar/calendar.mjs +2 -2
  3. package/esm2022/lib/core/i18n/grid-resources.mjs +2 -1
  4. package/esm2022/lib/directives/for-of/for_of.directive.mjs +4 -1
  5. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +10 -3
  6. package/esm2022/lib/grids/grid-base.directive.mjs +7 -4
  7. package/esm2022/lib/grids/headers/grid-header-row.component.mjs +9 -3
  8. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-content.component.mjs +2 -2
  9. package/esm2022/lib/services/overlay/overlay.mjs +2 -2
  10. package/fesm2022/igniteui-angular.mjs +34 -18
  11. package/fesm2022/igniteui-angular.mjs.map +1 -1
  12. package/lib/buttonGroup/buttonGroup.component.d.ts +2 -2
  13. package/lib/core/i18n/grid-resources.d.ts +1 -0
  14. package/lib/core/styles/components/grid/_excel-filtering-component.scss +4 -0
  15. package/lib/core/styles/components/grid/_excel-filtering-theme.scss +7 -0
  16. package/lib/grids/filtering/excel-style/excel-style-search.component.d.ts +4 -0
  17. package/lib/grids/headers/grid-header-row.component.d.ts +4 -0
  18. package/migrations/common/tsUtils.js +1 -1
  19. package/package.json +1 -1
  20. package/styles/igniteui-angular-dark.css +1 -1
  21. package/styles/igniteui-angular.css +1 -1
  22. package/styles/igniteui-bootstrap-dark.css +1 -1
  23. package/styles/igniteui-bootstrap-light.css +1 -1
  24. package/styles/igniteui-dark-green.css +1 -1
  25. package/styles/igniteui-fluent-dark-excel.css +1 -1
  26. package/styles/igniteui-fluent-dark-word.css +1 -1
  27. package/styles/igniteui-fluent-dark.css +1 -1
  28. package/styles/igniteui-fluent-light-excel.css +1 -1
  29. package/styles/igniteui-fluent-light-word.css +1 -1
  30. package/styles/igniteui-fluent-light.css +1 -1
  31. package/styles/igniteui-indigo-dark.css +1 -1
  32. package/styles/igniteui-indigo-light.css +1 -1
  33. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  34. package/styles/maps/igniteui-angular.css.map +1 -1
  35. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  36. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  37. package/styles/maps/igniteui-dark-green.css.map +1 -1
  38. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  39. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  40. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  41. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  42. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  43. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  44. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  45. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -101,6 +101,12 @@ export class IgxGridHeaderRowComponent {
101
101
  ngDoCheck() {
102
102
  this.cdr.markForCheck();
103
103
  }
104
+ /**
105
+ * @hidden @internal
106
+ */
107
+ scroll(event) {
108
+ this.grid.preventHeaderScroll(event);
109
+ }
104
110
  headerRowSelection(event) {
105
111
  if (!this.grid.isMultiRowSelectionEnabled) {
106
112
  return;
@@ -113,11 +119,11 @@ export class IgxGridHeaderRowComponent {
113
119
  }
114
120
  }
115
121
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxGridHeaderRowComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
116
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxGridHeaderRowComponent, isStandalone: true, selector: "igx-grid-header-row", inputs: { grid: "grid", pinnedColumnCollection: "pinnedColumnCollection", unpinnedColumnCollection: "unpinnedColumnCollection", activeDescendant: "activeDescendant", hasMRL: "hasMRL", width: "width", density: "density" }, host: { properties: { "class.igx-grid-thead--cosy": "this.cosyStyle", "class.igx-grid-thead--compact": "this.compactStyle" } }, viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["headerVirtualContainer"], descendants: true, read: IgxGridForOfDirective, static: true }, { propertyName: "headerDragContainer", first: true, predicate: ["headerDragContainer"], descendants: true }, { propertyName: "headerSelectorContainer", first: true, predicate: ["headerSelectorContainer"], descendants: true }, { propertyName: "headerGroupContainer", first: true, predicate: ["headerGroupContainer"], descendants: true }, { propertyName: "headSelectorBaseTemplate", first: true, predicate: ["headSelectorBaseTemplate"], descendants: true }, { propertyName: "filterRow", first: true, predicate: IgxGridFilteringRowComponent, descendants: true }, { propertyName: "headerHierarchyExpander", first: true, predicate: ["headerHierarchyExpander"], descendants: true }, { propertyName: "_groups", predicate: IgxGridHeaderGroupComponent, descendants: true }], ngImport: i0, template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxGridHeaderGroupComponent, selector: "igx-grid-header-group", inputs: ["column"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "component", type: IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: ["column", "value"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "pipe", type: IgxGridTopLevelColumns, name: "igxTopLevel" }, { kind: "pipe", type: IgxHeaderGroupWidthPipe, name: "igxHeaderGroupWidth" }, { kind: "pipe", type: IgxHeaderGroupStylePipe, name: "igxHeaderGroupStyle" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
122
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxGridHeaderRowComponent, isStandalone: true, selector: "igx-grid-header-row", inputs: { grid: "grid", pinnedColumnCollection: "pinnedColumnCollection", unpinnedColumnCollection: "unpinnedColumnCollection", activeDescendant: "activeDescendant", hasMRL: "hasMRL", width: "width", density: "density" }, host: { properties: { "class.igx-grid-thead--cosy": "this.cosyStyle", "class.igx-grid-thead--compact": "this.compactStyle" } }, viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["headerVirtualContainer"], descendants: true, read: IgxGridForOfDirective, static: true }, { propertyName: "headerDragContainer", first: true, predicate: ["headerDragContainer"], descendants: true }, { propertyName: "headerSelectorContainer", first: true, predicate: ["headerSelectorContainer"], descendants: true }, { propertyName: "headerGroupContainer", first: true, predicate: ["headerGroupContainer"], descendants: true }, { propertyName: "headSelectorBaseTemplate", first: true, predicate: ["headSelectorBaseTemplate"], descendants: true }, { propertyName: "filterRow", first: true, predicate: IgxGridFilteringRowComponent, descendants: true }, { propertyName: "headerHierarchyExpander", first: true, predicate: ["headerHierarchyExpander"], descendants: true }, { propertyName: "_groups", predicate: IgxGridHeaderGroupComponent, descendants: true }], ngImport: i0, template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" (scroll)=\"scroll($event)\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxGridHeaderGroupComponent, selector: "igx-grid-header-group", inputs: ["column"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache", "igxGridForOfVariableSizes"], outputs: ["dataChanging"] }, { kind: "component", type: IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: ["column", "value"] }, { kind: "component", type: IgxCheckboxComponent, selector: "igx-checkbox", inputs: ["id", "labelId", "value", "name", "tabindex", "labelPosition", "disableRipple", "required", "aria-labelledby", "aria-label", "indeterminate", "checked", "disabled", "invalid", "readonly", "disableTransitions"], outputs: ["change"] }, { kind: "pipe", type: IgxGridTopLevelColumns, name: "igxTopLevel" }, { kind: "pipe", type: IgxHeaderGroupWidthPipe, name: "igxHeaderGroupWidth" }, { kind: "pipe", type: IgxHeaderGroupStylePipe, name: "igxHeaderGroupStyle" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
117
123
  }
118
124
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxGridHeaderRowComponent, decorators: [{
119
125
  type: Component,
120
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-header-row', standalone: true, imports: [NgIf, IgxColumnMovingDropDirective, NgTemplateOutlet, NgClass, NgFor, IgxGridHeaderGroupComponent, NgStyle, IgxGridForOfDirective, IgxGridFilteringRowComponent, IgxCheckboxComponent, IgxGridTopLevelColumns, IgxHeaderGroupWidthPipe, IgxHeaderGroupStylePipe], template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n" }]
126
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-header-row', standalone: true, imports: [NgIf, IgxColumnMovingDropDirective, NgTemplateOutlet, NgClass, NgFor, IgxGridHeaderGroupComponent, NgStyle, IgxGridForOfDirective, IgxGridFilteringRowComponent, IgxCheckboxComponent, IgxGridTopLevelColumns, IgxHeaderGroupWidthPipe, IgxHeaderGroupStylePipe], template: "<div role=\"rowgroup\" class=\"igx-grid-thead__wrapper\" (scroll)=\"scroll($event)\" [style.width.px]=\"width\"\n [class.igx-grid__tr--mrl]=\"hasMRL\">\n\n <!-- Column headers area -->\n <div class=\"igx-grid__tr\" role=\"row\" [style.width.px]=\"width\">\n\n <!-- Left column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length <= 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-left\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag && pinnedColumnCollection.length > 0\">\n <span id=\"left\" class=\"igx-grid__scroll-on-drag-pinned\" droppable=\"true\" [style.left.px]=\"grid.pinnedWidth\"\n [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n\n <!-- Row dragging area -->\n <ng-container *ngIf=\"grid.rowDraggable\">\n <div #headerDragContainer class=\"igx-grid__drag-indicator igx-grid__tr-action\" (pointerdown)=\"$event.preventDefault()\" [class.igx-grid__drag-indicator--header]=\"!grid.isRowSelectable\">\n <div style=\"visibility: hidden;\">\n <ng-container *ngTemplateOutlet=\"grid.dragIndicatorIconTemplate || grid.dragIndicatorIconBase\"></ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- Row selectors area -->\n <ng-container *ngIf=\"grid.showRowSelectors\">\n <div #headerSelectorContainer class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n [class.igx-grid__cbx-selection--push]=\"grid.filteringService.isFilterRowVisible\"\n (click)=\"headerRowSelection($event)\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container #headSelector\n *ngTemplateOutlet=\"grid.headSelectorTemplate || headSelectorBaseTemplate; context: rowSelectorsContext\">\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Hierarchical grids expand all area -->\n <ng-container *ngIf=\"isHierarchicalGrid\">\n <div #headerHierarchyExpander\n (click)=\"grid.toggleAll()\"\n (pointerdown)=\"$event.preventDefault()\"\n [hidden]=\"!grid.hasExpandableChildren || !grid.hasVisibleColumns\"\n [ngClass]=\"{\n 'igx-grid__hierarchical-expander igx-grid__hierarchical-expander--header igx-grid__tr-action': grid.hasExpandableChildren,\n 'igx-grid__hierarchical-expander--push': grid.filteringService.isFilterRowVisible,\n 'igx-grid__hierarchical-expander--no-border': grid.isRowSelectable || grid.rowDraggable\n }\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n\n <!-- Grouping icon toggle area -->\n <ng-container *ngIf=\"grid?.groupingExpressions?.length\">\n <div #headerGroupContainer class=\"{{ indentationCSSClasses }}\"\n (click)=\"grid.toggleAllGroupRows()\"\n (pointerdown)=\"$event.preventDefault()\">\n <ng-container *ngTemplateOutlet=\"grid.iconTemplate; context: { $implicit: grid }\"></ng-container>\n </div>\n </ng-container>\n\n <!-- Pinned columns collection from the start -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles | igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n\n <!-- Unpinned columns collection -->\n <ng-template igxGridFor #headerVirtualContainer let-column\n [igxGridForOf]=\"unpinnedColumnCollection | igxTopLevel\"\n [igxForScrollContainer]=\"grid.parentVirtDir\"\n [igxForContainerSize]=\"grid.unpinnedWidth\"\n [igxForTrackBy]=\"grid.trackColumnChanges\"\n [igxForSizePropName]=\"'calcPixelWidth'\"\n [igxForScrollOrientation]=\"'horizontal'\"\n >\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\">\n </igx-grid-header-group>\n </ng-template>\n\n <!-- Pinned columns collection at the end -->\n <ng-container *ngIf=\"pinnedColumnCollection.length && !grid.isPinningToStart\">\n <ng-container *ngFor=\"let column of pinnedColumnCollection | igxTopLevel\">\n <igx-grid-header-group\n [ngClass]=\"column.headerGroupClasses\"\n [ngStyle]=\"column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger\"\n [column]=\"column\"\n [style.min-width]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.flex-basis]=\"column.resolvedWidth | igxHeaderGroupWidth:grid.defaultHeaderGroupMinWidth:hasMRL\"\n [style.left]=\"column.rightPinnedOffset\">\n </igx-grid-header-group>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Filter row area -->\n <ng-container *ngIf=\"grid.filteringService.isFilterRowVisible\">\n <igx-grid-filtering-row #filteringRow\n [column]=\"grid.filteringService.filteredColumn\"\n [style.width.px]=\"width\">\n </igx-grid-filtering-row>\n </ng-container>\n\n <!-- Right column moving area -->\n <ng-container *ngIf=\"grid.moving && grid.columnInDrag\">\n <span id=\"right\" class=\"igx-grid__scroll-on-drag-right\" droppable=\"true\" [igxColumnMovingDrop]=\"headerContainer\"></span>\n </ng-container>\n</div>\n\n<!-- Header thumb area -->\n<div class=\"igx-grid-thead__thumb\" [hidden]=\"!grid.hasVerticalScroll()\" [style.width.px]=\"grid.scrollSize\"></div>\n\n<!-- Default row selection header checkbox template -->\n<ng-template #headSelectorBaseTemplate igxHeadSelector let-context>\n <div class=\"igx-grid__cbx-padding\">\n <igx-checkbox\n [tabindex]=\"-1\"\n [readonly]=\"true\"\n [checked]=\"context.selectedCount > 0 && grid.selectionService.areAllRowSelected()\"\n [disableRipple]=\"true\"\n [ngStyle]=\"{'visibility': grid.isMultiRowSelectionEnabled? 'visible' : 'hidden' }\"\n [indeterminate]=\"context.selectedCount > 0 && grid.selectionService.hasSomeRowSelected()\"\n [aria-label]=\"grid.headSelectorBaseAriaLabel\"\n #headerCheckbox>\n </igx-checkbox>\n </div>\n</ng-template>\n" }]
121
127
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { grid: [{
122
128
  type: Input
123
129
  }], pinnedColumnCollection: [{
@@ -163,4 +169,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
163
169
  type: ViewChild,
164
170
  args: ['headerHierarchyExpander']
165
171
  }] } });
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvaGVhZGVycy9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBR1QsV0FBVyxFQUNYLEtBQUssRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUdqRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUVsRjs7Ozs7OztHQU9HO0FBUUgsTUFBTSxPQUFPLHlCQUF5QjtJQTBCbEM7OztPQUdHO0lBQ0gsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQ1csWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFlRDs7OztPQUlHO0lBQ0gsSUFBVyxNQUFNO1FBQ2IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFNRCxJQUFXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUEwQkQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQVcscUJBQXFCO1FBQzVCLE9BQU8saUVBQWlFLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbkgsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzFCLE1BQU0sR0FBRyxHQUFHO1lBQ1IsU0FBUyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLE1BQWdCO2dCQUNqRixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBbUM7YUFDNUQ7U0FDOEIsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QixHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFELEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDakU7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxZQUNjLEdBQTRCLEVBQzVCLEdBQXNCO1FBRHRCLFFBQUcsR0FBSCxHQUFHLENBQXlCO1FBQzVCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUlwQyxrQ0FBa0M7UUFFM0IsMkJBQXNCLEdBQWlCLEVBQUUsQ0FBQztRQUVqRCxvQ0FBb0M7UUFFN0IsNkJBQXdCLEdBQWlCLEVBQUUsQ0FBQztJQXlJL0MsQ0FBQztJQUVMOzs7Ozs7O09BT0c7SUFDSSxTQUFTO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBaUI7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUU7WUFDdkMsT0FBTztTQUNWO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkQ7SUFDTCxDQUFDOzhHQTdLUSx5QkFBeUI7a0dBQXpCLHlCQUF5QixtaEJBNkVXLHFCQUFxQiwrZ0JBbUJ2RCw0QkFBNEIsa0xBMUN6QiwyQkFBMkIsZ0RDaEc3QyxtbFBBNElBLDRDRHBHYyxJQUFJLDZGQUFFLDRCQUE0QixtR0FBRSxnQkFBZ0Isb0pBQUUsT0FBTyxvRkFBRSxLQUFLLG1IQUFFLDJCQUEyQixzRkFBRSxPQUFPLDJFQUFFLHFCQUFxQix3TEFBRSw0QkFBNEIsZ0dBQUUsb0JBQW9CLHFTQUFFLHNCQUFzQiwrQ0FBRSx1QkFBdUIsdURBQUUsdUJBQXVCOzsyRkFFaFEseUJBQXlCO2tCQVByQyxTQUFTO3NDQUNXLHVCQUF1QixDQUFDLE1BQU0sWUFDckMscUJBQXFCLGNBRW5CLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsQ0FBQztpSUFNblEsSUFBSTtzQkFEVixLQUFLO2dCQUtDLHNCQUFzQjtzQkFENUIsS0FBSztnQkFLQyx3QkFBd0I7c0JBRDlCLEtBQUs7Z0JBSUMsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQVFLLFNBQVM7c0JBRG5CLFdBQVc7dUJBQUMsNEJBQTRCO2dCQVU5QixZQUFZO3NCQUR0QixXQUFXO3VCQUFDLCtCQUErQjtnQkFnQnJDLE9BQU87c0JBRGIsWUFBWTt1QkFBQywyQkFBMkI7Z0JBd0JsQyxlQUFlO3NCQURyQixTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUTNFLG1CQUFtQjtzQkFEekIsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBSXpCLHVCQUF1QjtzQkFEN0IsU0FBUzt1QkFBQyx5QkFBeUI7Z0JBSTdCLG9CQUFvQjtzQkFEMUIsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBSTFCLHdCQUF3QjtzQkFEOUIsU0FBUzt1QkFBQywwQkFBMEI7Z0JBSTlCLFNBQVM7c0JBRGYsU0FBUzt1QkFBQyw0QkFBNEI7Z0JBVWhDLHVCQUF1QjtzQkFEN0IsU0FBUzt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eSB9IGZyb20gJy4uLy4uL2NvcmUvZGVuc2l0eSc7XG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IENvbHVtblR5cGUsIEdyaWRUeXBlLCBJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVyaW5nL2Jhc2UvZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2dyaWQtaGVhZGVyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4SGVhZGVyR3JvdXBXaWR0aFBpcGUsIElneEhlYWRlckdyb3VwU3R5bGVQaXBlIH0gZnJvbSAnLi9waXBlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkVG9wTGV2ZWxDb2x1bW5zIH0gZnJvbSAnLi4vY29tbW9uL3BpcGVzJztcbmltcG9ydCB7IElneENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtbk1vdmluZ0Ryb3BEaXJlY3RpdmUgfSBmcm9tICcuLi9tb3ZpbmcvbW92aW5nLmRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ2xhc3MsIE5nRm9yLCBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKlxuICogRm9yIGFsbCBpbnRlbnRzICYgcHVycG9zZXMgdHJlYXQgdGhpcyBjb21wb25lbnQgYXMgd2hhdCBhIDx0aGVhZD4gdXN1YWxseSBpcyBpbiB0aGUgZGVmYXVsdCA8dGFibGU+IGVsZW1lbnQuXG4gKlxuICogVGhpcyBjb250YWluZXIgaG9sZHMgdGhlIGdyaWQgaGVhZGVyIGVsZW1lbnRzIGFuZCB0aGVpciBiZWhhdmlvci9pbnRlcmFjdGlvbnMuXG4gKlxuICogQGhpZGRlbiBAaW50ZXJuYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1oZWFkZXItcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBJZ3hDb2x1bW5Nb3ZpbmdEcm9wRGlyZWN0aXZlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzLCBOZ0ZvciwgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50LCBOZ1N0eWxlLCBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQsIElneENoZWNrYm94Q29tcG9uZW50LCBJZ3hHcmlkVG9wTGV2ZWxDb2x1bW5zLCBJZ3hIZWFkZXJHcm91cFdpZHRoUGlwZSwgSWd4SGVhZGVyR3JvdXBTdHlsZVBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrIHtcblxuICAgIC8qKiBUaGUgZ3JpZCBjb21wb25lbnQgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ3JpZDogR3JpZFR5cGU7XG5cbiAgICAvKiogUGlubmVkIGNvbHVtbnMgb2YgdGhlIGdyaWQuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGlubmVkQ29sdW1uQ29sbGVjdGlvbjogQ29sdW1uVHlwZVtdID0gW107XG5cbiAgICAvKiogVW5waW5uZWQgY29sdW1ucyBvZiB0aGUgZ3JpZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB1bnBpbm5lZENvbHVtbkNvbGxlY3Rpb246IENvbHVtblR5cGVbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWN0aXZlRGVzY2VuZGFudDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGFzTVJMOiBib29sZWFuO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGg6IG51bWJlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRlbnNpdHk6IERpc3BsYXlEZW5zaXR5O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWQtdGhlYWQtLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgY29zeVN0eWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZW5zaXR5ID09PSAnY29zeSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWQtdGhlYWQtLWNvbXBhY3QnKVxuICAgIHB1YmxpYyBnZXQgY29tcGFjdFN0eWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZW5zaXR5ID09PSAnY29tcGFjdCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVhZGVyIGdyb3VwcyBpbnNpZGUgdGhlIGhlYWRlciByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrXG4gICAgICogTm90ZTogVGhlc2UgYXJlIG9ubHkgdGhlIHRvcCBsZXZlbCBoZWFkZXIgZ3JvdXBzIGluIGNhc2UgdGhlcmUgYXJlIG11bHRpLWNvbHVtbiBoZWFkZXJzXG4gICAgICogb3IgYSBzcGVjaWZpYyBjb2x1bW4gbGF5b3V0LiBJZiB5b3Ugd2FudCB0byBnZXQgdGhlIGZsYXR0ZW5lZCBjb2xsZWN0aW9uIHVzZSB0aGUgYGdyb3Vwc2BcbiAgICAgKiBwcm9wZXJ0eSBiZWxvdy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogKi9cbiAgICBAVmlld0NoaWxkcmVuKElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudClcbiAgICBwdWJsaWMgX2dyb3VwczogUXVlcnlMaXN0PElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhdHRlbmVkIGhlYWRlciBncm91cHMgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBncm91cHMoKTogSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLl9ncm91cHM/LnRvQXJyYXkoKSA/PyBbXSk7XG4gICAgfVxuXG4gICAgLyoqIEhlYWRlciBjb21wb25lbnRzIGluIHRoZSBoZWFkZXIgcm93LiAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVycygpOiBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHMubWFwKGdyb3VwID0+IGdyb3VwLmhlYWRlcik7XG4gICAgfVxuXG4gICAgLyoqIEZpbHRlcmluZyBjZWxsIGNvbXBvbmVudHMgaW4gdGhlIGhlYWRlciByb3cuICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCk6IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHMubWFwKGdyb3VwID0+IGdyb3VwLmZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqIFRoZSB2aXJ0dWFsaXplZCBwYXJ0IG9mIHRoZSBoZWFkZXIgcm93IGNvbnRhaW5pbmcgdGhlIHVucGlubmVkIGhlYWRlciBncm91cHMuICovXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyVmlydHVhbENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgaGVhZGVyQ29udGFpbmVyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8Q29sdW1uVHlwZSwgQ29sdW1uVHlwZVtdPjtcblxuICAgIHB1YmxpYyBnZXQgaGVhZGVyRm9yT2YoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRlckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJEcmFnQ29udGFpbmVyJylcbiAgICBwdWJsaWMgaGVhZGVyRHJhZ0NvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJTZWxlY3RvckNvbnRhaW5lcicpXG4gICAgcHVibGljIGhlYWRlclNlbGVjdG9yQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlckdyb3VwQ29udGFpbmVyJylcbiAgICBwdWJsaWMgaGVhZGVyR3JvdXBDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZFNlbGVjdG9yQmFzZVRlbXBsYXRlJylcbiAgICBwdWJsaWMgaGVhZFNlbGVjdG9yQmFzZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+O1xuXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50KVxuICAgIHB1YmxpYyBmaWx0ZXJSb3c6IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmQvY29sbGFwc2UgYWxsIGNoaWxkIGdyaWRzIGFyZWEgaW4gYSBoaWVyYXJjaGljYWwgZ3JpZC5cbiAgICAgKiBgdW5kZWZpbmVkYCBpbiB0aGUgYmFzZSBhbmQgdHJlZSBncmlkcy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbCBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVySGllcmFyY2h5RXhwYW5kZXInKVxuICAgIHB1YmxpYyBoZWFkZXJIaWVyYXJjaHlFeHBhbmRlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBwdWJsaWMgZ2V0IG5hdmlnYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQubmF2aWdhdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBncmlkIGluc3RhbmNlIGlzIGEgaGllcmFyY2hpY2FsIGdyaWQuXG4gICAgICogYXMgb25seSBoaWVyYXJjaGljYWwgZ3JpZHMgaGF2ZSB0aGUgYGlzSGllcmFyY2hpY2FsUmVjb3JkYCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNIaWVyYXJjaGljYWxHcmlkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmdyaWQuaXNIaWVyYXJjaGljYWxSZWNvcmQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpbmRlbnRhdGlvbkNTU0NsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiBgaWd4LWdyaWRfX2hlYWRlci1pbmRlbnRhdGlvbiBpZ3gtZ3JpZF9fcm93LWluZGVudGF0aW9uLS1sZXZlbC0ke3RoaXMuZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zLmxlbmd0aH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93U2VsZWN0b3JzQ29udGV4dCgpOiBJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENvdW50OiB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5maWx0ZXJlZFNlbGVjdGVkUm93SWRzLmxlbmd0aCBhcyBudW1iZXIsXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudDogdGhpcy5ncmlkLnRvdGFsUm93c0NvdW50QWZ0ZXJGaWx0ZXIgYXMgbnVtYmVyXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0O1xuXG4gICAgICAgIGlmICh0aGlzLmlzSGllcmFyY2hpY2FsR3JpZCkge1xuICAgICAgICAgICAgY3R4LiRpbXBsaWNpdC5zZWxlY3RBbGwgPSAoKSA9PiB0aGlzLmdyaWQuc2VsZWN0QWxsUm93cygpO1xuICAgICAgICAgICAgY3R4LiRpbXBsaWNpdC5kZXNlbGVjdEFsbCA9ICgpID0+IHRoaXMuZ3JpZC5kZXNlbGVjdEFsbFJvd3MoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdHg7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICkgeyB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGhvb2sgZXhpc3RzIGFzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIHVuZm9ydHVuYXRlIGZhY3RcbiAgICAgKiB0aGF0IHdoZW4gd2UgaGF2ZSBwaW5uZWQgY29sdW1ucyBpbiB0aGUgZ3JpZCwgdGhlIHVucGlubmVkIGNvbHVtbnMgaGVhZGVyc1xuICAgICAqIGFyZSBhZmZlY3RlZCBieSBhIGRlbGF5ZWQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBhZnRlciBhIGhvcml6b250YWwgc2Nyb2xsIDooXG4gICAgICogVGh1cywgd2UgdGVsbCB0aGUgcGFyZW50IGdyaWQgY2hhbmdlIGRldGVjdG9yIHRvIGNoZWNrIHVzIGF0IGVhY2ggY3ljbGUuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoZWFkZXJSb3dTZWxlY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyaWQuaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5jbGVhclJvd1NlbGVjdGlvbihldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGxSb3dzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgcm9sZT1cInJvd2dyb3VwXCIgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlclwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiXG4gICAgW2NsYXNzLmlneC1ncmlkX190ci0tbXJsXT1cImhhc01STFwiPlxuXG4gICAgPCEtLSBDb2x1bW4gaGVhZGVycyBhcmVhIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHJcIiByb2xlPVwicm93XCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG5cbiAgICAgICAgPCEtLSBMZWZ0IGNvbHVtbiBtb3ZpbmcgYXJlYSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQubW92aW5nICYmIGdyaWQuY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24ubGVuZ3RoIDw9IDBcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwibGVmdFwiIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLWxlZnRcIiBkcm9wcGFibGU9XCJ0cnVlXCIgW3N0eWxlLmxlZnQucHhdPVwiZ3JpZC5waW5uZWRXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCI+PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQubW92aW5nICYmIGdyaWQuY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsZWZ0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcGlubmVkXCIgZHJvcHBhYmxlPVwidHJ1ZVwiIFtzdHlsZS5sZWZ0LnB4XT1cImdyaWQucGlubmVkV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiPjwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBSb3cgZHJhZ2dpbmcgYXJlYSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQucm93RHJhZ2dhYmxlXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJEcmFnQ29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX2RyYWctaW5kaWNhdG9yIGlneC1ncmlkX190ci1hY3Rpb25cIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiBbY2xhc3MuaWd4LWdyaWRfX2RyYWctaW5kaWNhdG9yLS1oZWFkZXJdPVwiIWdyaWQuaXNSb3dTZWxlY3RhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSB8fCBncmlkLmRyYWdJbmRpY2F0b3JJY29uQmFzZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUm93IHNlbGVjdG9ycyBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5zaG93Um93U2VsZWN0b3JzXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJTZWxlY3RvckNvbnRhaW5lciBjbGFzcz1cImlneC1ncmlkX19jYngtc2VsZWN0aW9uIGlneC1ncmlkX190ci1hY3Rpb25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pZ3gtZ3JpZF9fY2J4LXNlbGVjdGlvbi0tcHVzaF09XCJncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyUm93U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgI2hlYWRTZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuaGVhZFNlbGVjdG9yVGVtcGxhdGUgfHwgaGVhZFNlbGVjdG9yQmFzZVRlbXBsYXRlOyBjb250ZXh0OiByb3dTZWxlY3RvcnNDb250ZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBIaWVyYXJjaGljYWwgZ3JpZHMgZXhwYW5kIGFsbCBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNIaWVyYXJjaGljYWxHcmlkXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJIaWVyYXJjaHlFeHBhbmRlclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJncmlkLnRvZ2dsZUFsbCgpXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIWdyaWQuaGFzRXhwYW5kYWJsZUNoaWxkcmVuIHx8ICFncmlkLmhhc1Zpc2libGVDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpZ3gtZ3JpZF9faGllcmFyY2hpY2FsLWV4cGFuZGVyIGlneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXItLWhlYWRlciBpZ3gtZ3JpZF9fdHItYWN0aW9uJzogZ3JpZC5oYXNFeHBhbmRhYmxlQ2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICdpZ3gtZ3JpZF9faGllcmFyY2hpY2FsLWV4cGFuZGVyLS1wdXNoJzogZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXItLW5vLWJvcmRlcic6IGdyaWQuaXNSb3dTZWxlY3RhYmxlIHx8IGdyaWQucm93RHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncmlkLmljb25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGdyaWQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgPCEtLSBHcm91cGluZyBpY29uIHRvZ2dsZSBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZD8uZ3JvdXBpbmdFeHByZXNzaW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJHcm91cENvbnRhaW5lciBjbGFzcz1cInt7IGluZGVudGF0aW9uQ1NTQ2xhc3NlcyB9fVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdyaWQudG9nZ2xlQWxsR3JvdXBSb3dzKClcIlxuICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncmlkLmljb25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGdyaWQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiBmcm9tIHRoZSBzdGFydCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBpbm5lZENvbHVtbkNvbGxlY3Rpb24ubGVuZ3RoICYmIGdyaWQuaXNQaW5uaW5nVG9TdGFydFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24gfCBpZ3hUb3BMZXZlbFwiPlxuICAgICAgICAgICAgICAgIDxpZ3gtZ3JpZC1oZWFkZXItZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8IGlneEhlYWRlckdyb3VwU3R5bGU6Y29sdW1uOmdyaWQucGlwZVRyaWdnZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZsZXgtYmFzaXNdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCI+XG4gICAgICAgICAgICAgICAgPC9pZ3gtZ3JpZC1oZWFkZXItZ3JvdXA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBVbnBpbm5lZCBjb2x1bW5zIGNvbGxlY3Rpb24gLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yICNoZWFkZXJWaXJ0dWFsQ29udGFpbmVyIGxldC1jb2x1bW5cbiAgICAgICAgICAgIFtpZ3hHcmlkRm9yT2ZdPVwidW5waW5uZWRDb2x1bW5Db2xsZWN0aW9uIHwgaWd4VG9wTGV2ZWxcIlxuICAgICAgICAgICAgW2lneEZvclNjcm9sbENvbnRhaW5lcl09XCJncmlkLnBhcmVudFZpcnREaXJcIlxuICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPVwiZ3JpZC51bnBpbm5lZFdpZHRoXCJcbiAgICAgICAgICAgIFtpZ3hGb3JUcmFja0J5XT1cImdyaWQudHJhY2tDb2x1bW5DaGFuZ2VzXCJcbiAgICAgICAgICAgIFtpZ3hGb3JTaXplUHJvcE5hbWVdPVwiJ2NhbGNQaXhlbFdpZHRoJ1wiXG4gICAgICAgICAgICBbaWd4Rm9yU2Nyb2xsT3JpZW50YXRpb25dPVwiJ2hvcml6b250YWwnXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1ncmlkLWhlYWRlci1ncm91cFxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJHcm91cENsYXNzZXNcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8aWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIj5cbiAgICAgICAgICAgIDwvaWd4LWdyaWQtaGVhZGVyLWdyb3VwPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDwhLS0gUGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiBhdCB0aGUgZW5kIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggJiYgIWdyaWQuaXNQaW5uaW5nVG9TdGFydFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24gfCBpZ3hUb3BMZXZlbFwiPlxuICAgICAgICAgICAgICAgIDxpZ3gtZ3JpZC1oZWFkZXItZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8aWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdF09XCJjb2x1bW4ucmlnaHRQaW5uZWRPZmZzZXRcIj5cbiAgICAgICAgICAgICAgICA8L2lneC1ncmlkLWhlYWRlci1ncm91cD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRmlsdGVyIHJvdyBhcmVhIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXCI+XG4gICAgICAgIDxpZ3gtZ3JpZC1maWx0ZXJpbmctcm93ICNmaWx0ZXJpbmdSb3dcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiPlxuICAgICAgICA8L2lneC1ncmlkLWZpbHRlcmluZy1yb3c+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFJpZ2h0IGNvbHVtbiBtb3ZpbmcgYXJlYSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5tb3ZpbmcgJiYgZ3JpZC5jb2x1bW5JbkRyYWdcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJyaWdodFwiIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLXJpZ2h0XCIgZHJvcHBhYmxlPVwidHJ1ZVwiIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiPjwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48IS0tIEhlYWRlciB0aHVtYiBhcmVhIC0tPlxuPGRpdiBjbGFzcz1cImlneC1ncmlkLXRoZWFkX190aHVtYlwiIFtoaWRkZW5dPVwiIWdyaWQuaGFzVmVydGljYWxTY3JvbGwoKVwiIFtzdHlsZS53aWR0aC5weF09XCJncmlkLnNjcm9sbFNpemVcIj48L2Rpdj5cblxuPCEtLSBEZWZhdWx0IHJvdyBzZWxlY3Rpb24gaGVhZGVyIGNoZWNrYm94IHRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGUgaWd4SGVhZFNlbGVjdG9yIGxldC1jb250ZXh0PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fY2J4LXBhZGRpbmdcIj5cbiAgICAgICAgPGlneC1jaGVja2JveFxuICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImNvbnRleHQuc2VsZWN0ZWRDb3VudCA+IDAgJiYgZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBncmlkLmlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkPyAndmlzaWJsZScgOiAnaGlkZGVuJyB9XCJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImNvbnRleHQuc2VsZWN0ZWRDb3VudCA+IDAgJiYgZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmhhc1NvbWVSb3dTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgIFthcmlhLWxhYmVsXT1cImdyaWQuaGVhZFNlbGVjdG9yQmFzZUFyaWFMYWJlbFwiXG4gICAgICAgICAgICAjaGVhZGVyQ2hlY2tib3g+XG4gICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvaGVhZGVycy9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBR1QsV0FBVyxFQUNYLEtBQUssRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUdqRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUVsRjs7Ozs7OztHQU9HO0FBUUgsTUFBTSxPQUFPLHlCQUF5QjtJQTBCbEM7OztPQUdHO0lB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QUFDLDJCQUEyQjtnQkF3QmxDLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFRM0UsbUJBQW1CO3NCQUR6QixTQUFTO3VCQUFDLHFCQUFxQjtnQkFJekIsdUJBQXVCO3NCQUQ3QixTQUFTO3VCQUFDLHlCQUF5QjtnQkFJN0Isb0JBQW9CO3NCQUQxQixTQUFTO3VCQUFDLHNCQUFzQjtnQkFJMUIsd0JBQXdCO3NCQUQ5QixTQUFTO3VCQUFDLDBCQUEwQjtnQkFJOUIsU0FBUztzQkFEZixTQUFTO3VCQUFDLDRCQUE0QjtnQkFVaEMsdUJBQXVCO3NCQUQ3QixTQUFTO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vLi4vY29yZS9kZW5zaXR5JztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneEdyaWRGb3JPZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgR3JpZFR5cGUsIElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dCB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2dyaWQtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hIZWFkZXJHcm91cFdpZHRoUGlwZSwgSWd4SGVhZGVyR3JvdXBTdHlsZVBpcGUgfSBmcm9tICcuL3BpcGVzJztcbmltcG9ydCB7IElneEdyaWRUb3BMZXZlbENvbHVtbnMgfSBmcm9tICcuLi9jb21tb24vcGlwZXMnO1xuaW1wb3J0IHsgSWd4Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29sdW1uTW92aW5nRHJvcERpcmVjdGl2ZSB9IGZyb20gJy4uL21vdmluZy9tb3ZpbmcuZHJvcC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgTmdDbGFzcywgTmdGb3IsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqXG4gKiBGb3IgYWxsIGludGVudHMgJiBwdXJwb3NlcyB0cmVhdCB0aGlzIGNvbXBvbmVudCBhcyB3aGF0IGEgPHRoZWFkPiB1c3VhbGx5IGlzIGluIHRoZSBkZWZhdWx0IDx0YWJsZT4gZWxlbWVudC5cbiAqXG4gKiBUaGlzIGNvbnRhaW5lciBob2xkcyB0aGUgZ3JpZCBoZWFkZXIgZWxlbWVudHMgYW5kIHRoZWlyIGJlaGF2aW9yL2ludGVyYWN0aW9ucy5cbiAqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1ncmlkLWhlYWRlci1yb3cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncmlkLWhlYWRlci1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nSWYsIElneENvbHVtbk1vdmluZ0Ryb3BEaXJlY3RpdmUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ2xhc3MsIE5nRm9yLCBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQsIE5nU3R5bGUsIElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudCwgSWd4Q2hlY2tib3hDb21wb25lbnQsIElneEdyaWRUb3BMZXZlbENvbHVtbnMsIElneEhlYWRlckdyb3VwV2lkdGhQaXBlLCBJZ3hIZWFkZXJHcm91cFN0eWxlUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2sge1xuXG4gICAgLyoqIFRoZSBncmlkIGNvbXBvbmVudCBjb250YWluaW5nIHRoaXMgZWxlbWVudC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkOiBHcmlkVHlwZTtcblxuICAgIC8qKiBQaW5uZWQgY29sdW1ucyBvZiB0aGUgZ3JpZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwaW5uZWRDb2x1bW5Db2xsZWN0aW9uOiBDb2x1bW5UeXBlW10gPSBbXTtcblxuICAgIC8qKiBVbnBpbm5lZCBjb2x1bW5zIG9mIHRoZSBncmlkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVucGlubmVkQ29sdW1uQ29sbGVjdGlvbjogQ29sdW1uVHlwZVtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVEZXNjZW5kYW50OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoYXNNUkw6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aWR0aDogbnVtYmVyO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGVuc2l0eTogRGlzcGxheURlbnNpdHk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aGVhZC0tY29zeScpXG4gICAgcHVibGljIGdldCBjb3N5U3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbnNpdHkgPT09ICdjb3N5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10aGVhZC0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBjb21wYWN0U3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbnNpdHkgPT09ICdjb21wYWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWFkZXIgZ3JvdXBzIGluc2lkZSB0aGUgaGVhZGVyIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBOb3RlOiBUaGVzZSBhcmUgb25seSB0aGUgdG9wIGxldmVsIGhlYWRlciBncm91cHMgaW4gY2FzZSB0aGVyZSBhcmUgbXVsdGktY29sdW1uIGhlYWRlcnNcbiAgICAgKiBvciBhIHNwZWNpZmljIGNvbHVtbiBsYXlvdXQuIElmIHlvdSB3YW50IHRvIGdldCB0aGUgZmxhdHRlbmVkIGNvbGxlY3Rpb24gdXNlIHRoZSBgZ3JvdXBzYFxuICAgICAqIHByb3BlcnR5IGJlbG93LlxuICAgICAqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBfZ3JvdXBzOiBRdWVyeUxpc3Q8SWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGF0dGVuZWQgaGVhZGVyIGdyb3VwcyBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdyb3VwcygpOiBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMuX2dyb3Vwcz8udG9BcnJheSgpID8/IFtdKTtcbiAgICB9XG5cbiAgICAvKiogSGVhZGVyIGNvbXBvbmVudHMgaW4gdGhlIGhlYWRlciByb3cuICovXG4gICAgcHVibGljIGdldCBoZWFkZXJzKCk6IElneEdyaWRIZWFkZXJDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy5tYXAoZ3JvdXAgPT4gZ3JvdXAuaGVhZGVyKTtcbiAgICB9XG5cbiAgICAvKiogRmlsdGVyaW5nIGNlbGwgY29tcG9uZW50cyBpbiB0aGUgaGVhZGVyIHJvdy4gKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKTogSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy5tYXAoZ3JvdXAgPT4gZ3JvdXAuZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIHZpcnR1YWxpemVkIHBhcnQgb2YgdGhlIGhlYWRlciByb3cgY29udGFpbmluZyB0aGUgdW5waW5uZWQgaGVhZGVyIGdyb3Vwcy4gKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJWaXJ0dWFsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBoZWFkZXJDb250YWluZXI6IElneEdyaWRGb3JPZkRpcmVjdGl2ZTxDb2x1bW5UeXBlLCBDb2x1bW5UeXBlW10+O1xuXG4gICAgcHVibGljIGdldCBoZWFkZXJGb3JPZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlckRyYWdDb250YWluZXInKVxuICAgIHB1YmxpYyBoZWFkZXJEcmFnQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclNlbGVjdG9yQ29udGFpbmVyJylcbiAgICBwdWJsaWMgaGVhZGVyU2VsZWN0b3JDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnaGVhZGVyR3JvdXBDb250YWluZXInKVxuICAgIHB1YmxpYyBoZWFkZXJHcm91cENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGUnKVxuICAgIHB1YmxpYyBoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dD47XG5cbiAgICBAVmlld0NoaWxkKElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQpXG4gICAgcHVibGljIGZpbHRlclJvdzogSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEV4cGFuZC9jb2xsYXBzZSBhbGwgY2hpbGQgZ3JpZHMgYXJlYSBpbiBhIGhpZXJhcmNoaWNhbCBncmlkLlxuICAgICAqIGB1bmRlZmluZWRgIGluIHRoZSBiYXNlIGFuZCB0cmVlIGdyaWRzLlxuICAgICAqXG4gICAgICogQGludGVybmFsIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJIaWVyYXJjaHlFeHBhbmRlcicpXG4gICAgcHVibGljIGhlYWRlckhpZXJhcmNoeUV4cGFuZGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIHB1YmxpYyBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGdyaWQgaW5zdGFuY2UgaXMgYSBoaWVyYXJjaGljYWwgZ3JpZC5cbiAgICAgKiBhcyBvbmx5IGhpZXJhcmNoaWNhbCBncmlkcyBoYXZlIHRoZSBgaXNIaWVyYXJjaGljYWxSZWNvcmRgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0hpZXJhcmNoaWNhbEdyaWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZ3JpZC5pc0hpZXJhcmNoaWNhbFJlY29yZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGluZGVudGF0aW9uQ1NTQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGBpZ3gtZ3JpZF9faGVhZGVyLWluZGVudGF0aW9uIGlneC1ncmlkX19yb3ctaW5kZW50YXRpb24tLWxldmVsLSR7dGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMubGVuZ3RofWA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dTZWxlY3RvcnNDb250ZXh0KCk6IElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dCB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDoge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ291bnQ6IHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmZpbHRlcmVkU2VsZWN0ZWRSb3dJZHMubGVuZ3RoIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgICB0b3RhbENvdW50OiB0aGlzLmdyaWQudG90YWxSb3dzQ291bnRBZnRlckZpbHRlciBhcyBudW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNIaWVyYXJjaGljYWxHcmlkKSB7XG4gICAgICAgICAgICBjdHguJGltcGxpY2l0LnNlbGVjdEFsbCA9ICgpID0+IHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKCk7XG4gICAgICAgICAgICBjdHguJGltcGxpY2l0LmRlc2VsZWN0QWxsID0gKCkgPT4gdGhpcy5ncmlkLmRlc2VsZWN0QWxsUm93cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7IH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaG9vayBleGlzdHMgYXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgdW5mb3J0dW5hdGUgZmFjdFxuICAgICAqIHRoYXQgd2hlbiB3ZSBoYXZlIHBpbm5lZCBjb2x1bW5zIGluIHRoZSBncmlkLCB0aGUgdW5waW5uZWQgY29sdW1ucyBoZWFkZXJzXG4gICAgICogYXJlIGFmZmVjdGVkIGJ5IGEgZGVsYXllZCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIGFmdGVyIGEgaG9yaXpvbnRhbCBzY3JvbGwgOihcbiAgICAgKiBUaHVzLCB3ZSB0ZWxsIHRoZSBwYXJlbnQgZ3JpZCBjaGFuZ2UgZGV0ZWN0b3IgdG8gY2hlY2sgdXMgYXQgZWFjaCBjeWNsZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2Nyb2xsKGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLmdyaWQucHJldmVudEhlYWRlclNjcm9sbChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGhlYWRlclJvd1NlbGVjdGlvbihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZC5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyUm93U2VsZWN0aW9uKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEFsbFJvd3MoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiByb2xlPVwicm93Z3JvdXBcIiBjbGFzcz1cImlneC1ncmlkLXRoZWFkX193cmFwcGVyXCIgKHNjcm9sbCk9XCJzY3JvbGwoJGV2ZW50KVwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiXG4gICAgW2NsYXNzLmlneC1ncmlkX190ci0tbXJsXT1cImhhc01STFwiPlxuXG4gICAgPCEtLSBDb2x1bW4gaGVhZGVycyBhcmVhIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHJcIiByb2xlPVwicm93XCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG5cbiAgICAgICAgPCEtLSBMZWZ0IGNvbHVtbiBtb3ZpbmcgYXJlYSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQubW92aW5nICYmIGdyaWQuY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24ubGVuZ3RoIDw9IDBcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwibGVmdFwiIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLWxlZnRcIiBkcm9wcGFibGU9XCJ0cnVlXCIgW3N0eWxlLmxlZnQucHhdPVwiZ3JpZC5waW5uZWRXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCI+PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQubW92aW5nICYmIGdyaWQuY29sdW1uSW5EcmFnICYmIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJsZWZ0XCIgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcGlubmVkXCIgZHJvcHBhYmxlPVwidHJ1ZVwiIFtzdHlsZS5sZWZ0LnB4XT1cImdyaWQucGlubmVkV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiPjwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBSb3cgZHJhZ2dpbmcgYXJlYSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWQucm93RHJhZ2dhYmxlXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJEcmFnQ29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX2RyYWctaW5kaWNhdG9yIGlneC1ncmlkX190ci1hY3Rpb25cIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiBbY2xhc3MuaWd4LWdyaWRfX2RyYWctaW5kaWNhdG9yLS1oZWFkZXJdPVwiIWdyaWQuaXNSb3dTZWxlY3RhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSB8fCBncmlkLmRyYWdJbmRpY2F0b3JJY29uQmFzZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUm93IHNlbGVjdG9ycyBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5zaG93Um93U2VsZWN0b3JzXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJTZWxlY3RvckNvbnRhaW5lciBjbGFzcz1cImlneC1ncmlkX19jYngtc2VsZWN0aW9uIGlneC1ncmlkX190ci1hY3Rpb25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pZ3gtZ3JpZF9fY2J4LXNlbGVjdGlvbi0tcHVzaF09XCJncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyUm93U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgI2hlYWRTZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdyaWQuaGVhZFNlbGVjdG9yVGVtcGxhdGUgfHwgaGVhZFNlbGVjdG9yQmFzZVRlbXBsYXRlOyBjb250ZXh0OiByb3dTZWxlY3RvcnNDb250ZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBIaWVyYXJjaGljYWwgZ3JpZHMgZXhwYW5kIGFsbCBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNIaWVyYXJjaGljYWxHcmlkXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJIaWVyYXJjaHlFeHBhbmRlclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJncmlkLnRvZ2dsZUFsbCgpXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIWdyaWQuaGFzRXhwYW5kYWJsZUNoaWxkcmVuIHx8ICFncmlkLmhhc1Zpc2libGVDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdpZ3gtZ3JpZF9faGllcmFyY2hpY2FsLWV4cGFuZGVyIGlneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXItLWhlYWRlciBpZ3gtZ3JpZF9fdHItYWN0aW9uJzogZ3JpZC5oYXNFeHBhbmRhYmxlQ2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICdpZ3gtZ3JpZF9faGllcmFyY2hpY2FsLWV4cGFuZGVyLS1wdXNoJzogZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1ncmlkX19oaWVyYXJjaGljYWwtZXhwYW5kZXItLW5vLWJvcmRlcic6IGdyaWQuaXNSb3dTZWxlY3RhYmxlIHx8IGdyaWQucm93RHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncmlkLmljb25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGdyaWQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgPCEtLSBHcm91cGluZyBpY29uIHRvZ2dsZSBhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZD8uZ3JvdXBpbmdFeHByZXNzaW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8ZGl2ICNoZWFkZXJHcm91cENvbnRhaW5lciBjbGFzcz1cInt7IGluZGVudGF0aW9uQ1NTQ2xhc3NlcyB9fVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdyaWQudG9nZ2xlQWxsR3JvdXBSb3dzKClcIlxuICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncmlkLmljb25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGdyaWQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiBmcm9tIHRoZSBzdGFydCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBpbm5lZENvbHVtbkNvbGxlY3Rpb24ubGVuZ3RoICYmIGdyaWQuaXNQaW5uaW5nVG9TdGFydFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24gfCBpZ3hUb3BMZXZlbFwiPlxuICAgICAgICAgICAgICAgIDxpZ3gtZ3JpZC1oZWFkZXItZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8IGlneEhlYWRlckdyb3VwU3R5bGU6Y29sdW1uOmdyaWQucGlwZVRyaWdnZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZsZXgtYmFzaXNdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCI+XG4gICAgICAgICAgICAgICAgPC9pZ3gtZ3JpZC1oZWFkZXItZ3JvdXA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBVbnBpbm5lZCBjb2x1bW5zIGNvbGxlY3Rpb24gLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yICNoZWFkZXJWaXJ0dWFsQ29udGFpbmVyIGxldC1jb2x1bW5cbiAgICAgICAgICAgIFtpZ3hHcmlkRm9yT2ZdPVwidW5waW5uZWRDb2x1bW5Db2xsZWN0aW9uIHwgaWd4VG9wTGV2ZWxcIlxuICAgICAgICAgICAgW2lneEZvclNjcm9sbENvbnRhaW5lcl09XCJncmlkLnBhcmVudFZpcnREaXJcIlxuICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPVwiZ3JpZC51bnBpbm5lZFdpZHRoXCJcbiAgICAgICAgICAgIFtpZ3hGb3JUcmFja0J5XT1cImdyaWQudHJhY2tDb2x1bW5DaGFuZ2VzXCJcbiAgICAgICAgICAgIFtpZ3hGb3JTaXplUHJvcE5hbWVdPVwiJ2NhbGNQaXhlbFdpZHRoJ1wiXG4gICAgICAgICAgICBbaWd4Rm9yU2Nyb2xsT3JpZW50YXRpb25dPVwiJ2hvcml6b250YWwnXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1ncmlkLWhlYWRlci1ncm91cFxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJHcm91cENsYXNzZXNcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8aWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLnJlc29sdmVkV2lkdGggfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIj5cbiAgICAgICAgICAgIDwvaWd4LWdyaWQtaGVhZGVyLWdyb3VwPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDwhLS0gUGlubmVkIGNvbHVtbnMgY29sbGVjdGlvbiBhdCB0aGUgZW5kIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGlubmVkQ29sdW1uQ29sbGVjdGlvbi5sZW5ndGggJiYgIWdyaWQuaXNQaW5uaW5nVG9TdGFydFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHBpbm5lZENvbHVtbkNvbGxlY3Rpb24gfCBpZ3hUb3BMZXZlbFwiPlxuICAgICAgICAgICAgICAgIDxpZ3gtZ3JpZC1oZWFkZXItZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckdyb3VwQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8aWd4SGVhZGVyR3JvdXBTdHlsZTpjb2x1bW46Z3JpZC5waXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJjb2x1bW4ucmVzb2x2ZWRXaWR0aCB8IGlneEhlYWRlckdyb3VwV2lkdGg6Z3JpZC5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aDpoYXNNUkxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdF09XCJjb2x1bW4ucmlnaHRQaW5uZWRPZmZzZXRcIj5cbiAgICAgICAgICAgICAgICA8L2lneC1ncmlkLWhlYWRlci1ncm91cD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRmlsdGVyIHJvdyBhcmVhIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXCI+XG4gICAgICAgIDxpZ3gtZ3JpZC1maWx0ZXJpbmctcm93ICNmaWx0ZXJpbmdSb3dcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiPlxuICAgICAgICA8L2lneC1ncmlkLWZpbHRlcmluZy1yb3c+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFJpZ2h0IGNvbHVtbiBtb3ZpbmcgYXJlYSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZC5tb3ZpbmcgJiYgZ3JpZC5jb2x1bW5JbkRyYWdcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJyaWdodFwiIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLXJpZ2h0XCIgZHJvcHBhYmxlPVwidHJ1ZVwiIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiPjwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48IS0tIEhlYWRlciB0aHVtYiBhcmVhIC0tPlxuPGRpdiBjbGFzcz1cImlneC1ncmlkLXRoZWFkX190aHVtYlwiIFtoaWRkZW5dPVwiIWdyaWQuaGFzVmVydGljYWxTY3JvbGwoKVwiIFtzdHlsZS53aWR0aC5weF09XCJncmlkLnNjcm9sbFNpemVcIj48L2Rpdj5cblxuPCEtLSBEZWZhdWx0IHJvdyBzZWxlY3Rpb24gaGVhZGVyIGNoZWNrYm94IHRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGUgaWd4SGVhZFNlbGVjdG9yIGxldC1jb250ZXh0PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fY2J4LXBhZGRpbmdcIj5cbiAgICAgICAgPGlneC1jaGVja2JveFxuICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImNvbnRleHQuc2VsZWN0ZWRDb3VudCA+IDAgJiYgZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVSaXBwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBncmlkLmlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkPyAndmlzaWJsZScgOiAnaGlkZGVuJyB9XCJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImNvbnRleHQuc2VsZWN0ZWRDb3VudCA+IDAgJiYgZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLmhhc1NvbWVSb3dTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgIFthcmlhLWxhYmVsXT1cImdyaWQuaGVhZFNlbGVjdG9yQmFzZUFyaWFMYWJlbFwiXG4gICAgICAgICAgICAjaGVhZGVyQ2hlY2tib3g+XG4gICAgICAgIDwvaWd4LWNoZWNrYm94PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -78,7 +78,7 @@ export class IgxPivotRowDimensionContentComponent extends IgxGridHeaderRowCompon
78
78
  }
79
79
  extractFromDimension(dim, rowData) {
80
80
  const field = dim.memberName;
81
- const header = rowData.dimensionValues.get(field);
81
+ const header = rowData?.dimensionValues.get(field);
82
82
  const col = this._createColComponent(field, header, dim);
83
83
  return col;
84
84
  }
@@ -124,4 +124,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
124
124
  type: ViewChildren,
125
125
  args: [IgxPivotRowDimensionHeaderGroupComponent]
126
126
  }] } });
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3Qtcm93LWRpbWVuc2lvbi1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9waXZvdC1ncmlkL3Bpdm90LXJvdy1kaW1lbnNpb24tY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvcGl2b3QtZ3JpZC9waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUdmLE1BQU0sRUFFTixLQUFLLEVBSUwsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVqRixPQUFPLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRW5EOzs7Ozs7O0dBT0c7QUFRSCxNQUFNLE9BQU8sb0NBQXFDLFNBQVEseUJBQXlCO0lBZ0MvRSxZQUMyQyxJQUFtQixF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OzJGQUUvSCxvQ0FBb0M7a0JBUGhELFNBQVM7c0NBQ1csdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxpQ0FBaUMsY0FFL0IsSUFBSSxXQUNQLENBQUMsd0NBQXdDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsQ0FBQzs7MEJBbUNwSSxNQUFNOzJCQUFDLGFBQWE7NkxBM0JsQixRQUFRO3NCQURkLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQU9DLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT3pELHFCQUFxQjtzQkFEM0IsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJaEUsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyx3Q0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBjcmVhdGVDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElHWF9HUklEX0JBU0UsIFBpdm90R3JpZFR5cGUgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudCB9IGZyb20gJy4uL2hlYWRlcnMvZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUGl2b3REaW1lbnNpb24sIElQaXZvdERpbWVuc2lvbkRhdGEsIElQaXZvdEdyaWRHcm91cFJlY29yZCB9IGZyb20gJy4vcGl2b3QtZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4UGl2b3RSb3dEaW1lbnNpb25IZWFkZXJHcm91cENvbXBvbmVudCB9IGZyb20gJy4vcGl2b3Qtcm93LWRpbWVuc2lvbi1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFBpdm90VXRpbCB9IGZyb20gJy4vcGl2b3QtdXRpbCc7XG5pbXBvcnQgeyBJZ3hIZWFkZXJHcm91cFdpZHRoUGlwZSwgSWd4SGVhZGVyR3JvdXBTdHlsZVBpcGUgfSBmcm9tICcuLi9oZWFkZXJzL3BpcGVzJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqXG4gKiBGb3IgYWxsIGludGVudHMgJiBwdXJwb3NlcyB0cmVhdCB0aGlzIGNvbXBvbmVudCBhcyB3aGF0IGEgPHRoZWFkPiB1c3VhbGx5IGlzIGluIHRoZSBkZWZhdWx0IDx0YWJsZT4gZWxlbWVudC5cbiAqXG4gKiBUaGlzIGNvbnRhaW5lciBob2xkcyB0aGUgcGl2b3QgZ3JpZCBoZWFkZXIgZWxlbWVudHMgYW5kIHRoZWlyIGJlaGF2aW9yL2ludGVyYWN0aW9ucy5cbiAqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0lneFBpdm90Um93RGltZW5zaW9uSGVhZGVyR3JvdXBDb21wb25lbnQsIE5nQ2xhc3MsIE5nU3R5bGUsIElneEljb25Db21wb25lbnQsIElneEhlYWRlckdyb3VwV2lkdGhQaXBlLCBJZ3hIZWFkZXJHcm91cFN0eWxlUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UGl2b3RSb3dEaW1lbnNpb25Db250ZW50Q29tcG9uZW50IGV4dGVuZHMgSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd0luZGV4OiBudW1iZXI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaW1lbnNpb246IElQaXZvdERpbWVuc2lvbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvb3REaW1lbnNpb246IElQaXZvdERpbWVuc2lvbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd0RhdGE6IElQaXZvdEdyaWRHcm91cFJlY29yZDtcblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJEZWZhdWx0VGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgaGVhZGVyVGVtcGxhdGVEZWZhdWx0OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hQaXZvdFJvd0RpbWVuc2lvbkhlYWRlckdyb3VwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBoZWFkZXJHcm91cHM6IFF1ZXJ5TGlzdDxJZ3hQaXZvdFJvd0RpbWVuc2lvbkhlYWRlckdyb3VwQ29tcG9uZW50PlxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIG92ZXJyaWRlIGdyaWQ6IFBpdm90R3JpZFR5cGUsXG4gICAgICAgIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByb3RlY3RlZCBlbnZJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWZcbiAgICApIHtcbiAgICAgICAgc3VwZXIocmVmLCBjZHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvd0RpbWVuc2lvbkRhdGE6IElQaXZvdERpbWVuc2lvbkRhdGE7XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0RpbWVuc2lvbkNvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RGltZW5zaW9uRGF0YT8uY29sdW1uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5yb3dEYXRhKSB7XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBuZXcgcm93RGltZW5zaW9uIG9uIHJvdyBkYXRhIGNoYW5nZVxuICAgICAgICAgICAgdGhpcy5yb3dEaW1lbnNpb25EYXRhID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZi5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5leHRyYWN0RnJvbURpbWVuc2lvbnMoKTtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLndpZHRoICYmIHRoaXMucm93RGltZW5zaW9uRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucm93RGltZW5zaW9uRGF0YTtcbiAgICAgICAgICAgIGRhdGEuY29sdW1uLndpZHRoID0gdGhpcy5ncmlkLnJvd0RpbWVuc2lvbldpZHRoVG9QaXhlbHModGhpcy5yb290RGltZW5zaW9uKSArICdweCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHRvZ2dsZVJvd0RpbWVuc2lvbihldmVudCkge1xuICAgICAgICB0aGlzLmdyaWQudG9nZ2xlUm93KHRoaXMuZ2V0Um93RGltZW5zaW9uS2V5KCkpXG4gICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93RGltZW5zaW9uS2V5KCkge1xuICAgICAgICBjb25zdCBkaW1EYXRhID0gdGhpcy5yb3dEaW1lbnNpb25EYXRhO1xuICAgICAgICBjb25zdCBrZXkgPSBQaXZvdFV0aWwuZ2V0UmVjb3JkS2V5KHRoaXMucm93RGF0YSwgZGltRGF0YS5kaW1lbnNpb24pO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFeHBhbmRTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHRoaXMuZ2V0Um93RGltZW5zaW9uS2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmxldmVsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RnJvbURpbWVuc2lvbnMoKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuZXh0cmFjdEZyb21EaW1lbnNpb24odGhpcy5kaW1lbnNpb24sIHRoaXMucm93RGF0YSk7XG4gICAgICAgIGNvbnN0IHByZXZEaW1zID0gW107XG4gICAgICAgIHRoaXMucm93RGltZW5zaW9uRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbHVtbjogY29sLFxuICAgICAgICAgICAgZGltZW5zaW9uOiB0aGlzLmRpbWVuc2lvbixcbiAgICAgICAgICAgIHByZXZEaW1lbnNpb25zOiBwcmV2RGltc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RnJvbURpbWVuc2lvbihkaW06IElQaXZvdERpbWVuc2lvbiwgcm93RGF0YTogSVBpdm90R3JpZEdyb3VwUmVjb3JkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZGltLm1lbWJlck5hbWU7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHJvd0RhdGEuZGltZW5zaW9uVmFsdWVzLmdldChmaWVsZCk7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuX2NyZWF0ZUNvbENvbXBvbmVudChmaWVsZCwgaGVhZGVyLCBkaW0pO1xuICAgICAgICByZXR1cm4gY29sO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY3JlYXRlQ29sQ29tcG9uZW50KGZpZWxkOiBzdHJpbmcsIGhlYWRlcjogc3RyaW5nLCBkaW06IElQaXZvdERpbWVuc2lvbikge1xuICAgICAgICBjb25zdCByZWYgPSBjcmVhdGVDb21wb25lbnQoSWd4Q29sdW1uQ29tcG9uZW50LCB7IGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3Rvcn0pO1xuICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgcmVmLmluc3RhbmNlLmhlYWRlciA9IGhlYWRlcjtcbiAgICAgICAgcmVmLmluc3RhbmNlLndpZHRoID0gdGhpcy5ncmlkLnJvd0RpbWVuc2lvbldpZHRoVG9QaXhlbHModGhpcy5yb290RGltZW5zaW9uKSArICdweCc7XG4gICAgICAgIHJlZi5pbnN0YW5jZS5yZXNpemFibGUgPSB0aGlzLmdyaWQucm93RGltZW5zaW9uUmVzaXppbmc7XG4gICAgICAgIChyZWYgYXMgYW55KS5pbnN0YW5jZS5fdkluZGV4ID0gdGhpcy5ncmlkLmNvbHVtbnMubGVuZ3RoICsgdGhpcy5yb3dJbmRleCArIHRoaXMucm93SW5kZXggKiB0aGlzLmdyaWQucGl2b3RDb25maWd1cmF0aW9uLnJvd3MubGVuZ3RoO1xuICAgICAgICBpZiAoZGltLmNoaWxkTGV2ZWwpIHtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyVGVtcGxhdGUgPSB0aGlzLmhlYWRlclRlbXBsYXRlRGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmLmluc3RhbmNlO1xuICAgIH1cbn1cbiIsIjxkaXYgcm9sZT1cInJvd2dyb3VwXCIgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlclwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiXG4gICAgW2NsYXNzLmlneC1ncmlkX190ci0tbXJsXT1cImhhc01STFwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHIgaWd4LWdyaWRfX3RyLWhlYWRlci1yb3dcIiByb2xlPVwicm93XCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCI+XG4gICAgICAgICAgICA8aWd4LXBpdm90LXJvdy1kaW1lbnNpb24taGVhZGVyLWdyb3VwIFtuZ0NsYXNzXT1cInJvd0RpbWVuc2lvbkNvbHVtbi5oZWFkZXJHcm91cENsYXNzZXNcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInJvd0RpbWVuc2lvbkNvbHVtbi5oZWFkZXJHcm91cFN0eWxlcyB8IGlneEhlYWRlckdyb3VwU3R5bGU6cm93RGltZW5zaW9uQ29sdW1uOmdyaWQucGlwZVRyaWdnZXJcIiBbY29sdW1uXT1cInJvd0RpbWVuc2lvbkNvbHVtblwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJncmlkLnJvd0RpbWVuc2lvbldpZHRoVG9QaXhlbHMocm9vdERpbWVuc2lvbikgfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZmxleC1iYXNpc109XCJncmlkLnJvd0RpbWVuc2lvbldpZHRoVG9QaXhlbHMocm9vdERpbWVuc2lvbikgfCBpZ3hIZWFkZXJHcm91cFdpZHRoOmdyaWQuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGg6aGFzTVJMXCJcbiAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgIFtwYXJlbnRdPSd0aGlzJz5cbiAgICAgICAgICAgIDwvaWd4LXBpdm90LXJvdy1kaW1lbnNpb24taGVhZGVyLWdyb3VwPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyVGVtcGxhdGUgbGV0LWNvbHVtbj5cbiAgICA8ZGl2IGNsYXNzPSdpZ3gtZ3JpZF9fdHItLWhlYWRlciBpZ3gtZ3JpZF9fcm93LWluZGVudGF0aW9uLS1sZXZlbC17e2dldExldmVsKCl9fSc+XG4gICAgICAgIDxpZ3gtaWNvbiBbYXR0ci5kcmFnZ2FibGVdPVwiZmFsc2VcIiAoY2xpY2spPVwidG9nZ2xlUm93RGltZW5zaW9uKCRldmVudClcIiBzdHlsZT1cIi0tY29tcG9uZW50LXNpemU6IDNcIj5cbiAgICAgICAgICAgIHt7IGdldEV4cGFuZFN0YXRlKCkgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnfX08L2lneC1pY29uPlxuICAgICAgICB7e2NvbHVtbi5oZWFkZXJ9fVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNoZWFkZXJEZWZhdWx0VGVtcGxhdGUgbGV0LWNvbHVtbj5cbiAgICA8ZGl2IGNsYXNzPSdpZ3gtZ3JpZF9fdHItLWhlYWRlciBpZ3gtZ3JpZF9fcm93LWluZGVudGF0aW9uLS1sZXZlbC17e2dldExldmVsKCl9fScgc3R5bGU9XCItLWNvbXBvbmVudC1zaXplOiAzXCI+XG4gICAgICAgIDxpZ3gtaWNvbiBzdHlsZT0nZmxleC1zaHJpbms6IDA7JyBbYXR0ci5kcmFnZ2FibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAge3tjb2x1bW4uaGVhZGVyfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3Qtcm93LWRpbWVuc2lvbi1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9waXZvdC1ncmlkL3Bpdm90LXJvdy1kaW1lbnNpb24tY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvcGl2b3QtZ3JpZC9waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUdmLE1BQU0sRUFFTixLQUFLLEVBSUwsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBaUIsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVqRixPQUFPLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRW5EOzs7Ozs7O0dBT0c7QUFRSCxNQUFNLE9BQU8sb0NBQXFDLFNBQVEseUJBQXlCO0lBZ0MvRSxZQUMyQyxJQUFtQixF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OzJGQUUvSCxvQ0FBb0M7a0JBUGhELFNBQVM7c0NBQ1csdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxpQ0FBaUMsY0FFL0IsSUFBSSxXQUNQLENBQUMsd0NBQXdDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsQ0FBQzs7MEJBbUNwSSxNQUFNOzJCQUFDLGFBQWE7NkxBM0JsQixRQUFRO3NCQURkLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQU9DLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT3pELHFCQUFxQjtzQkFEM0IsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJaEUsWUFBWTtzQkFEbEIsWUFBWTt1QkFBQyx3Q0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBjcmVhdGVDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElHWF9HUklEX0JBU0UsIFBpdm90R3JpZFR5cGUgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudCB9IGZyb20gJy4uL2hlYWRlcnMvZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUGl2b3REaW1lbnNpb24sIElQaXZvdERpbWVuc2lvbkRhdGEsIElQaXZvdEdyaWRHcm91cFJlY29yZCB9IGZyb20gJy4vcGl2b3QtZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4UGl2b3RSb3dEaW1lbnNpb25IZWFkZXJHcm91cENvbXBvbmVudCB9IGZyb20gJy4vcGl2b3Qtcm93LWRpbWVuc2lvbi1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFBpdm90VXRpbCB9IGZyb20gJy4vcGl2b3QtdXRpbCc7XG5pbXBvcnQgeyBJZ3hIZWFkZXJHcm91cFdpZHRoUGlwZSwgSWd4SGVhZGVyR3JvdXBTdHlsZVBpcGUgfSBmcm9tICcuLi9oZWFkZXJzL3BpcGVzJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqXG4gKiBGb3IgYWxsIGludGVudHMgJiBwdXJwb3NlcyB0cmVhdCB0aGlzIGNvbXBvbmVudCBhcyB3aGF0IGEgPHRoZWFkPiB1c3VhbGx5IGlzIGluIHRoZSBkZWZhdWx0IDx0YWJsZT4gZWxlbWVudC5cbiAqXG4gKiBUaGlzIGNvbnRhaW5lciBob2xkcyB0aGUgcGl2b3QgZ3JpZCBoZWFkZXIgZWxlbWVudHMgYW5kIHRoZWlyIGJlaGF2aW9yL2ludGVyYWN0aW9ucy5cbiAqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0lneFBpdm90Um93RGltZW5zaW9uSGVhZGVyR3JvdXBDb21wb25lbnQsIE5nQ2xhc3MsIE5nU3R5bGUsIElneEljb25Db21wb25lbnQsIElneEhlYWRlckdyb3VwV2lkdGhQaXBlLCBJZ3hIZWFkZXJHcm91cFN0eWxlUGlwZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UGl2b3RSb3dEaW1lbnNpb25Db250ZW50Q29tcG9uZW50IGV4dGVuZHMgSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd0luZGV4OiBudW1iZXI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaW1lbnNpb246IElQaXZvdERpbWVuc2lvbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvb3REaW1lbnNpb246IElQaXZvdERpbWVuc2lvbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd0RhdGE6IElQaXZvdEdyaWRHcm91cFJlY29yZDtcblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJEZWZhdWx0VGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgaGVhZGVyVGVtcGxhdGVEZWZhdWx0OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hQaXZvdFJvd0RpbWVuc2lvbkhlYWRlckdyb3VwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBoZWFkZXJHcm91cHM6IFF1ZXJ5TGlzdDxJZ3hQaXZvdFJvd0RpbWVuc2lvbkhlYWRlckdyb3VwQ29tcG9uZW50PlxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIG92ZXJyaWRlIGdyaWQ6IFBpdm90R3JpZFR5cGUsXG4gICAgICAgIHJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByb3RlY3RlZCBlbnZJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWZcbiAgICApIHtcbiAgICAgICAgc3VwZXIocmVmLCBjZHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvd0RpbWVuc2lvbkRhdGE6IElQaXZvdERpbWVuc2lvbkRhdGE7XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0RpbWVuc2lvbkNvbHVtbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RGltZW5zaW9uRGF0YT8uY29sdW1uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5yb3dEYXRhKSB7XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBuZXcgcm93RGltZW5zaW9uIG9uIHJvdyBkYXRhIGNoYW5nZVxuICAgICAgICAgICAgdGhpcy5yb3dEaW1lbnNpb25EYXRhID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZi5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5leHRyYWN0RnJvbURpbWVuc2lvbnMoKTtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLndpZHRoICYmIHRoaXMucm93RGltZW5zaW9uRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucm93RGltZW5zaW9uRGF0YTtcbiAgICAgICAgICAgIGRhdGEuY29sdW1uLndpZHRoID0gdGhpcy5ncmlkLnJvd0RpbWVuc2lvbldpZHRoVG9QaXhlbHModGhpcy5yb290RGltZW5zaW9uKSArICdweCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHRvZ2dsZVJvd0RpbWVuc2lvbihldmVudCkge1xuICAgICAgICB0aGlzLmdyaWQudG9nZ2xlUm93KHRoaXMuZ2V0Um93RGltZW5zaW9uS2V5KCkpXG4gICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93RGltZW5zaW9uS2V5KCkge1xuICAgICAgICBjb25zdCBkaW1EYXRhID0gdGhpcy5yb3dEaW1lbnNpb25EYXRhO1xuICAgICAgICBjb25zdCBrZXkgPSBQaXZvdFV0aWwuZ2V0UmVjb3JkS2V5KHRoaXMucm93RGF0YSwgZGltRGF0YS5kaW1lbnNpb24pO1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFeHBhbmRTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHRoaXMuZ2V0Um93RGltZW5zaW9uS2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uLmxldmVsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RnJvbURpbWVuc2lvbnMoKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuZXh0cmFjdEZyb21EaW1lbnNpb24odGhpcy5kaW1lbnNpb24sIHRoaXMucm93RGF0YSk7XG4gICAgICAgIGNvbnN0IHByZXZEaW1zID0gW107XG4gICAgICAgIHRoaXMucm93RGltZW5zaW9uRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbHVtbjogY29sLFxuICAgICAgICAgICAgZGltZW5zaW9uOiB0aGlzLmRpbWVuc2lvbixcbiAgICAgICAgICAgIHByZXZEaW1lbnNpb25zOiBwcmV2RGltc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RnJvbURpbWVuc2lvbihkaW06IElQaXZvdERpbWVuc2lvbiwgcm93RGF0YTogSVBpdm90R3JpZEdyb3VwUmVjb3JkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZGltLm1lbWJlck5hbWU7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHJvd0RhdGE/LmRpbWVuc2lvblZhbHVlcy5nZXQoZmllbGQpO1xuICAgICAgICBjb25zdCBjb2wgPSB0aGlzLl9jcmVhdGVDb2xDb21wb25lbnQoZmllbGQsIGhlYWRlciwgZGltKTtcbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZUNvbENvbXBvbmVudChmaWVsZDogc3RyaW5nLCBoZWFkZXI6IHN0cmluZywgZGltOiBJUGl2b3REaW1lbnNpb24pIHtcbiAgICAgICAgY29uc3QgcmVmID0gY3JlYXRlQ29tcG9uZW50KElneENvbHVtbkNvbXBvbmVudCwgeyBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmVudkluamVjdG9yLCBlbGVtZW50SW5qZWN0b3I6IHRoaXMuaW5qZWN0b3J9KTtcbiAgICAgICAgcmVmLmluc3RhbmNlLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHJlZi5pbnN0YW5jZS5oZWFkZXIgPSBoZWFkZXI7XG4gICAgICAgIHJlZi5pbnN0YW5jZS53aWR0aCA9IHRoaXMuZ3JpZC5yb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKHRoaXMucm9vdERpbWVuc2lvbikgKyAncHgnO1xuICAgICAgICByZWYuaW5zdGFuY2UucmVzaXphYmxlID0gdGhpcy5ncmlkLnJvd0RpbWVuc2lvblJlc2l6aW5nO1xuICAgICAgICAocmVmIGFzIGFueSkuaW5zdGFuY2UuX3ZJbmRleCA9IHRoaXMuZ3JpZC5jb2x1bW5zLmxlbmd0aCArIHRoaXMucm93SW5kZXggKyB0aGlzLnJvd0luZGV4ICogdGhpcy5ncmlkLnBpdm90Q29uZmlndXJhdGlvbi5yb3dzLmxlbmd0aDtcbiAgICAgICAgaWYgKGRpbS5jaGlsZExldmVsKSB7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyVGVtcGxhdGUgPSB0aGlzLmhlYWRlclRlbXBsYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmhlYWRlclRlbXBsYXRlID0gdGhpcy5oZWFkZXJUZW1wbGF0ZURlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZi5pbnN0YW5jZTtcbiAgICB9XG59XG4iLCI8ZGl2IHJvbGU9XCJyb3dncm91cFwiIGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRfX3dyYXBwZXJcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIlxuICAgIFtjbGFzcy5pZ3gtZ3JpZF9fdHItLW1ybF09XCJoYXNNUkxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3RyIGlneC1ncmlkX190ci1oZWFkZXItcm93XCIgcm9sZT1cInJvd1wiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiPlxuICAgICAgICAgICAgPGlneC1waXZvdC1yb3ctZGltZW5zaW9uLWhlYWRlci1ncm91cCBbbmdDbGFzc109XCJyb3dEaW1lbnNpb25Db2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJyb3dEaW1lbnNpb25Db2x1bW4uaGVhZGVyR3JvdXBTdHlsZXMgfCBpZ3hIZWFkZXJHcm91cFN0eWxlOnJvd0RpbWVuc2lvbkNvbHVtbjpncmlkLnBpcGVUcmlnZ2VyXCIgW2NvbHVtbl09XCJyb3dEaW1lbnNpb25Db2x1bW5cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ3JpZC5yb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKHJvb3REaW1lbnNpb24pIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmZsZXgtYmFzaXNdPVwiZ3JpZC5yb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKHJvb3REaW1lbnNpb24pIHwgaWd4SGVhZGVyR3JvdXBXaWR0aDpncmlkLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoOmhhc01STFwiXG4gICAgICAgICAgICAgICAgW3Jvd0luZGV4XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICBbcGFyZW50XT0ndGhpcyc+XG4gICAgICAgICAgICA8L2lneC1waXZvdC1yb3ctZGltZW5zaW9uLWhlYWRlci1ncm91cD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2hlYWRlclRlbXBsYXRlIGxldC1jb2x1bW4+XG4gICAgPGRpdiBjbGFzcz0naWd4LWdyaWRfX3RyLS1oZWFkZXIgaWd4LWdyaWRfX3Jvdy1pbmRlbnRhdGlvbi0tbGV2ZWwte3tnZXRMZXZlbCgpfX0nPlxuICAgICAgICA8aWd4LWljb24gW2F0dHIuZHJhZ2dhYmxlXT1cImZhbHNlXCIgKGNsaWNrKT1cInRvZ2dsZVJvd0RpbWVuc2lvbigkZXZlbnQpXCIgc3R5bGU9XCItLWNvbXBvbmVudC1zaXplOiAzXCI+XG4gICAgICAgICAgICB7eyBnZXRFeHBhbmRTdGF0ZSgpID8gJ2V4cGFuZF9tb3JlJyA6ICdjaGV2cm9uX3JpZ2h0J319PC9pZ3gtaWNvbj5cbiAgICAgICAge3tjb2x1bW4uaGVhZGVyfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyRGVmYXVsdFRlbXBsYXRlIGxldC1jb2x1bW4+XG4gICAgPGRpdiBjbGFzcz0naWd4LWdyaWRfX3RyLS1oZWFkZXIgaWd4LWdyaWRfX3Jvdy1pbmRlbnRhdGlvbi0tbGV2ZWwte3tnZXRMZXZlbCgpfX0nIHN0eWxlPVwiLS1jb21wb25lbnQtc2l6ZTogM1wiPlxuICAgICAgICA8aWd4LWljb24gc3R5bGU9J2ZsZXgtc2hyaW5rOiAwOycgW2F0dHIuZHJhZ2dhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgIHt7Y29sdW1uLmhlYWRlcn19XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19