UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

372 lines • 35.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Input, NgZone, Inject, NgModuleRef } from '@angular/core'; import { DataType } from '../data-operations/data-util'; import { SortingDirection } from '../data-operations/sorting-expression.interface'; import { GridBaseAPIService } from './api.service'; import { IgxColumnComponent } from './column.component'; import { IgxFilteringService } from './filtering/grid-filtering.service'; import { IgxColumnResizingService } from './grid-column-resizing.service'; import { IgxOverlayService } from '../services/overlay/overlay'; import { IgxGridExcelStyleFilteringComponent } from './filtering/excel-style/grid.excel-style-filtering.component'; import { VerticalAlignment } from '../services/overlay/utilities'; import { AutoPositionStrategy } from '../services/overlay/position/auto-position-strategy'; import { useAnimation } from '@angular/animations'; import { filter, takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { fadeIn, fadeOut } from '../animations/main'; import { AbsoluteScrollStrategy } from '../services/overlay/scroll/absolute-scroll-strategy'; /** * @hidden */ export class IgxGridHeaderComponent { /** * @param {?} gridAPI * @param {?} colResizingService * @param {?} cdr * @param {?} elementRef * @param {?} zone * @param {?} _filteringService * @param {?} _moduleRef * @param {?} _overlayService */ constructor(gridAPI, colResizingService, cdr, elementRef, zone, _filteringService, _moduleRef, _overlayService) { this.gridAPI = gridAPI; this.colResizingService = colResizingService; this.cdr = cdr; this.elementRef = elementRef; this.zone = zone; this._filteringService = _filteringService; this._moduleRef = _moduleRef; this._overlayService = _overlayService; this._destroy$ = new Subject(); this.hostRole = 'columnheader'; this.tabindex = -1; this.sortDirection = SortingDirection.None; } /** * @return {?} */ get styleClasses() { /** @type {?} */ const defaultClasses = [ 'igx-grid__th--fw', this.column.headerClasses ]; /** @type {?} */ const classList = { 'igx-grid__th': !this.column.columnGroup, 'asc': this.ascending, 'desc': this.descending, 'igx-grid__th--number': this.column.dataType === DataType.Number, 'igx-grid__th--sortable': this.column.sortable, 'igx-grid__th--filtrable': this.column.filterable && this.grid.filteringService.isFilterRowVisible, 'igx-grid__th--sorted': this.sorted }; Object.entries(classList).forEach(([klass, value]) => { if (value) { defaultClasses.push(klass); } }); return defaultClasses.join(' '); } /** * @return {?} */ get height() { if (this.grid.hasColumnGroups) { return (this.grid.maxLevelHeaderDepth + 1 - this.column.level) * this.grid.defaultRowHeight; } return null; } /** * @return {?} */ get ascending() { return this.sortDirection === SortingDirection.Asc; } /** * @return {?} */ get descending() { return this.sortDirection === SortingDirection.Desc; } /** * @return {?} */ get sortingIcon() { if (this.sortDirection !== SortingDirection.None) { // arrow_downward and arrow_upward // are material icons ligature strings return this.sortDirection === SortingDirection.Asc ? 'arrow_upward' : 'arrow_downward'; } return 'arrow_upward'; } /** * @return {?} */ get sorted() { return this.sortDirection !== SortingDirection.None; } /** * @return {?} */ get filterIconClassName() { return this.column.filteringExpressionsTree ? 'igx-excel-filter__icon--filtered' : 'igx-excel-filter__icon'; } /** * @return {?} */ get headerID() { return `${this.gridID}_${this.column.field}`; } /** * @return {?} */ ngOnInit() { this.initFilteringSettings(); } /** * @return {?} */ ngDoCheck() { this.getSortDirection(); this.cdr.markForCheck(); } /** * @return {?} */ ngOnDestroy() { this._destroy$.next(true); this._destroy$.complete(); if (this._componentOverlayId) { this._overlayService.hide(this._componentOverlayId); } } /** * @param {?} event * @return {?} */ onClick(event) { if (!this.colResizingService.isColumnResizing) { event.stopPropagation(); if (this.grid.filteringService.isFilterRowVisible) { if (this.column.filterable && !this.column.columnGroup && !this.grid.filteringService.isFilterComplex(this.column.field)) { this.grid.filteringService.filteredColumn = this.column; } } else if (this.column.sortable) { this.triggerSort(); } } } /** * @param {?} event * @return {?} */ onFilteringIconClick(event) { event.stopPropagation(); this.toggleFilterDropdown(); } /** * @return {?} */ get grid() { return this.gridAPI.grid; } /** * @protected * @return {?} */ getSortDirection() { /** @type {?} */ const expr = this.gridAPI.grid.sortingExpressions.find((x) => x.fieldName === this.column.field); this.sortDirection = expr ? expr.dir : SortingDirection.None; } /** * @param {?} event * @return {?} */ onSortingIconClick(event) { if (this.grid.filteringService.isFilterRowVisible) { event.stopPropagation(); this.triggerSort(); } } /** * @private * @return {?} */ triggerSort() { /** @type {?} */ const groupingExpr = this.grid.groupingExpressions ? this.grid.groupingExpressions.find((expr) => expr.fieldName === this.column.field) : null; /** @type {?} */ const sortDir = groupingExpr ? this.sortDirection + 1 > SortingDirection.Desc ? SortingDirection.Asc : SortingDirection.Desc : this.sortDirection + 1 > SortingDirection.Desc ? SortingDirection.None : this.sortDirection + 1; this.sortDirection = sortDir; this.grid.sort({ fieldName: this.column.field, dir: this.sortDirection, ignoreCase: this.column.sortingIgnoreCase, strategy: this.column.sortStrategy }); } /** * @private * @return {?} */ toggleFilterDropdown() { if (!this._componentOverlayId) { /** @type {?} */ const headerTarget = this.elementRef.nativeElement; /** @type {?} */ const filterIconTarget = headerTarget.querySelector('.' + this.filterIconClassName); this._filterMenuOverlaySettings.positionStrategy.settings.target = filterIconTarget; this._filterMenuOverlaySettings.outlet = this.grid.outlet; this._componentOverlayId = this._overlayService.attach(IgxGridExcelStyleFilteringComponent, this._filterMenuOverlaySettings, this._moduleRef); this._overlayService.show(this._componentOverlayId, this._filterMenuOverlaySettings); } } /** * @private * @return {?} */ initFilteringSettings() { this._filterMenuPositionSettings = { verticalStartPoint: VerticalAlignment.Bottom, openAnimation: useAnimation(fadeIn, { params: { duration: '250ms' } }), closeAnimation: useAnimation(fadeOut, { params: { duration: '200ms' } }) }; this._filterMenuOverlaySettings = { closeOnOutsideClick: true, modal: false, positionStrategy: new AutoPositionStrategy(this._filterMenuPositionSettings), scrollStrategy: new AbsoluteScrollStrategy() }; this._overlayService.onOpening.pipe(filter((overlay) => overlay.id === this._componentOverlayId), takeUntil(this._destroy$)).subscribe((eventArgs) => { this.onOverlayOpening(eventArgs); }); this._overlayService.onClosed.pipe(filter(overlay => overlay.id === this._componentOverlayId), takeUntil(this._destroy$)).subscribe(() => { this.onOverlayClosed(); }); } /** * @private * @param {?} eventArgs * @return {?} */ onOverlayOpening(eventArgs) { /** @type {?} */ const instance = (/** @type {?} */ (eventArgs.componentRef.instance)); if (instance) { instance.initialize(this.column, this._filteringService, this._overlayService, eventArgs.id); } } /** * @private * @return {?} */ onOverlayClosed() { this._componentOverlayId = null; } } IgxGridHeaderComponent.decorators = [ { type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-grid-header', template: "<ng-template #defaultColumn>\n {{ column.header || column.field }}\n</ng-template>\n\n<span class=\"igx-grid__th-title\">\n <ng-container *ngTemplateOutlet=\"column.headerTemplate ? column.headerTemplate : defaultColumn; context: { $implicit: column, column: column}\">\n </ng-container>\n</span>\n<div class=\"igx-grid__th-icons\" *ngIf=\"!column.columnGroup\">\n <igx-icon [attr.draggable]=\"false\"\n class=\"sort-icon\"\n *ngIf=\"column.sortable\"\n (click)=\"onSortingIconClick($event)\">\n {{sortingIcon}}\n </igx-icon>\n\n <igx-icon [ngClass]=\"filterIconClassName\" [attr.draggable]=\"false\" (click)=\"onFilteringIconClick($event)\"\n *ngIf=\"grid.allowFiltering == true && column.filterable && grid.filterMode == 'excelStyleFilter'\">\n filter_list\n </igx-icon>\n</div>\n" }] } ]; /** @nocollapse */ IgxGridHeaderComponent.ctorParameters = () => [ { type: GridBaseAPIService }, { type: IgxColumnResizingService }, { type: ChangeDetectorRef }, { type: ElementRef }, { type: NgZone }, { type: IgxFilteringService }, { type: NgModuleRef }, { type: IgxOverlayService, decorators: [{ type: Inject, args: [IgxOverlayService,] }] } ]; IgxGridHeaderComponent.propDecorators = { column: [{ type: Input }], gridID: [{ type: Input }], styleClasses: [{ type: HostBinding, args: ['class',] }], height: [{ type: HostBinding, args: ['style.height.px',] }], hostRole: [{ type: HostBinding, args: ['attr.role',] }], tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }], headerID: [{ type: HostBinding, args: ['attr.id',] }], onClick: [{ type: HostListener, args: ['click', ['$event'],] }] }; if (false) { /** * @type {?} * @private */ IgxGridHeaderComponent.prototype._componentOverlayId; /** * @type {?} * @private */ IgxGridHeaderComponent.prototype._filterMenuPositionSettings; /** * @type {?} * @private */ IgxGridHeaderComponent.prototype._filterMenuOverlaySettings; /** * @type {?} * @private */ IgxGridHeaderComponent.prototype._destroy$; /** @type {?} */ IgxGridHeaderComponent.prototype.column; /** @type {?} */ IgxGridHeaderComponent.prototype.gridID; /** @type {?} */ IgxGridHeaderComponent.prototype.hostRole; /** @type {?} */ IgxGridHeaderComponent.prototype.tabindex; /** * @type {?} * @protected */ IgxGridHeaderComponent.prototype.sortDirection; /** @type {?} */ IgxGridHeaderComponent.prototype.gridAPI; /** @type {?} */ IgxGridHeaderComponent.prototype.colResizingService; /** @type {?} */ IgxGridHeaderComponent.prototype.cdr; /** @type {?} */ IgxGridHeaderComponent.prototype.elementRef; /** @type {?} */ IgxGridHeaderComponent.prototype.zone; /** * @type {?} * @private */ IgxGridHeaderComponent.prototype._filteringService; /** * @type {?} * @private */ IgxGridHeaderComponent.prototype._moduleRef; /** * @type {?} * @private */ IgxGridHeaderComponent.prototype._overlayService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkLWhlYWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLE1BQU0sRUFFTixXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUNuSCxPQUFPLEVBQXFDLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsTUFB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LGlCQUFpQjtZQUdqQixVQUFVO1lBSVYsTUFBTTtZQVVELG1CQUFtQjtZQU54QixXQUFXO1lBU04saUJBQWlCLHVCQStHakIsTUFBTSxTQUFDLGlCQUFpQjs7O3FCQXJGNUIsS0FBSztxQkFHTCxLQUFLOzJCQUdMLFdBQVcsU0FBQyxPQUFPO3FCQXlCbkIsV0FBVyxTQUFDLGlCQUFpQjt1QkFpQzdCLFdBQVcsU0FBQyxXQUFXO3VCQUd2QixXQUFXLFNBQUMsZUFBZTt1QkFHM0IsV0FBVyxTQUFDLFNBQVM7c0JBb0NyQixZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDOzs7Ozs7O0lBL0dqQyxxREFBb0M7Ozs7O0lBQ3BDLDZEQUFzRDs7Ozs7SUFDdEQsNERBQW9EOzs7OztJQUNwRCwyQ0FBMkM7O0lBRTNDLHdDQUNrQzs7SUFFbEMsd0NBQ3NCOztJQTREdEIsMENBQ2lDOztJQUVqQywwQ0FDcUI7Ozs7O0lBT3JCLCtDQUFnRDs7SUFHNUMseUNBQTRFOztJQUM1RSxvREFBbUQ7O0lBQ25ELHFDQUE2Qjs7SUFDN0IsNENBQTZCOztJQUM3QixzQ0FBbUI7Ozs7O0lBQ25CLG1EQUE4Qzs7Ozs7SUFDOUMsNENBQW9DOzs7OztJQUNwQyxpREFBcUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkluaXQsXG4gICAgSW5qZWN0LFxuICAgIE9uRGVzdHJveSxcbiAgICBOZ01vZHVsZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi9hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4RmlsdGVyaW5nU2VydmljZSB9IGZyb20gJy4vZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VDb21wb25lbnQsIElHcmlkRGF0YUJpbmRhYmxlIH0gZnJvbSAnLi9ncmlkLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4vZ3JpZC1jb2x1bW4tcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvb3ZlcmxheSc7XG5pbXBvcnQgeyBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3MsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQXV0b1Bvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uL2F1dG8tcG9zaXRpb24tc3RyYXRlZ3knO1xuaW1wb3J0IHsgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZhZGVJbiwgZmFkZU91dCB9IGZyb20gJy4uL2FuaW1hdGlvbnMvbWFpbic7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS9zY3JvbGwvYWJzb2x1dGUtc2Nyb2xsLXN0cmF0ZWd5JztcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiAnaWd4LWdyaWQtaGVhZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneEdyaWRIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIF9jb21wb25lbnRPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncztcbiAgICBwcml2YXRlIF9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQ7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkSUQ6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICAgIGdldCBzdHlsZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdENsYXNzZXMgPSBbXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoLS1mdycsXG4gICAgICAgICAgICB0aGlzLmNvbHVtbi5oZWFkZXJDbGFzc2VzXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0ge1xuICAgICAgICAgICAgJ2lneC1ncmlkX190aCc6ICF0aGlzLmNvbHVtbi5jb2x1bW5Hcm91cCxcbiAgICAgICAgICAgICdhc2MnOiB0aGlzLmFzY2VuZGluZyxcbiAgICAgICAgICAgICdkZXNjJzogdGhpcy5kZXNjZW5kaW5nLFxuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tbnVtYmVyJzogdGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IERhdGFUeXBlLk51bWJlcixcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLXNvcnRhYmxlJzogdGhpcy5jb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoLS1maWx0cmFibGUnOiB0aGlzLmNvbHVtbi5maWx0ZXJhYmxlICYmIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSxcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLXNvcnRlZCc6IHRoaXMuc29ydGVkXG4gICAgICAgIH07XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2xhc3NMaXN0KS5mb3JFYWNoKChba2xhc3MsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdENsYXNzZXMucHVzaChrbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZGVmYXVsdENsYXNzZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0LnB4JylcbiAgICBnZXQgaGVpZ2h0KCkge1xuICAgICAgICBpZiAodGhpcy5ncmlkLmhhc0NvbHVtbkdyb3Vwcykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdyaWQubWF4TGV2ZWxIZWFkZXJEZXB0aCArIDEgLSB0aGlzLmNvbHVtbi5sZXZlbCkgKiB0aGlzLmdyaWQuZGVmYXVsdFJvd0hlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgYXNjZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLkFzYztcbiAgICB9XG5cbiAgICBnZXQgZGVzY2VuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5EZXNjO1xuICAgIH1cblxuICAgIGdldCBzb3J0aW5nSWNvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uICE9PSBTb3J0aW5nRGlyZWN0aW9uLk5vbmUpIHtcbiAgICAgICAgICAgIC8vIGFycm93X2Rvd253YXJkIGFuZCBhcnJvd191cHdhcmRcbiAgICAgICAgICAgIC8vIGFyZSBtYXRlcmlhbCBpY29ucyBsaWdhdHVyZSBzdHJpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLkFzYyA/ICdhcnJvd191cHdhcmQnIDogJ2Fycm93X2Rvd253YXJkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2Fycm93X3Vwd2FyZCc7XG4gICAgfVxuXG4gICAgZ2V0IHNvcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiAhPT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lO1xuICAgIH1cblxuICAgIGdldCBmaWx0ZXJJY29uQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID8gJ2lneC1leGNlbC1maWx0ZXJfX2ljb24tLWZpbHRlcmVkJyA6ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGhvc3RSb2xlID0gJ2NvbHVtbmhlYWRlcic7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IC0xO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBnZXQgaGVhZGVySUQoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdyaWRJRH1fJHt0aGlzLmNvbHVtbi5maWVsZH1gO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzb3J0RGlyZWN0aW9uID0gU29ydGluZ0RpcmVjdGlvbi5Ob25lO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VDb21wb25lbnQgJiBJR3JpZERhdGFCaW5kYWJsZT4sXG4gICAgICAgIHB1YmxpYyBjb2xSZXNpemluZ1NlcnZpY2U6IElneENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwdWJsaWMgem9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIF9maWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9tb2R1bGVSZWY6IE5nTW9kdWxlUmVmPGFueT4sXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByaXZhdGUgX292ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZVxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdEZpbHRlcmluZ1NldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5nZXRTb3J0RGlyZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmhpZGUodGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sUmVzaXppbmdTZXJ2aWNlLmlzQ29sdW1uUmVzaXppbmcpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbHVtbi5maWx0ZXJhYmxlICYmICF0aGlzLmNvbHVtbi5jb2x1bW5Hcm91cCAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJDb21wbGV4KHRoaXMuY29sdW1uLmZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9IHRoaXMuY29sdW1uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW4uc29ydGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJTb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWx0ZXJpbmdJY29uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy50b2dnbGVGaWx0ZXJEcm9wZG93bigpO1xuICAgIH1cblxuICAgIGdldCBncmlkKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ3JpZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0U29ydERpcmVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IHRoaXMuZ3JpZEFQSS5ncmlkLnNvcnRpbmdFeHByZXNzaW9ucy5maW5kKCh4KSA9PiB4LmZpZWxkTmFtZSA9PT0gdGhpcy5jb2x1bW4uZmllbGQpO1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBleHByID8gZXhwci5kaXIgOiBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU29ydGluZ0ljb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAodGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclNvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlclNvcnQoKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nRXhwciA9IHRoaXMuZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zID9cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zLmZpbmQoKGV4cHIpID0+IGV4cHIuZmllbGROYW1lID09PSB0aGlzLmNvbHVtbi5maWVsZCkgOiBudWxsO1xuICAgICAgICBjb25zdCBzb3J0RGlyID0gZ3JvdXBpbmdFeHByID9cbiAgICAgICAgICAgIHRoaXMuc29ydERpcmVjdGlvbiArIDEgPiBTb3J0aW5nRGlyZWN0aW9uLkRlc2MgPyBTb3J0aW5nRGlyZWN0aW9uLkFzYyA6IFNvcnRpbmdEaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgOiB0aGlzLnNvcnREaXJlY3Rpb24gKyAxID4gU29ydGluZ0RpcmVjdGlvbi5EZXNjID8gU29ydGluZ0RpcmVjdGlvbi5Ob25lIDogdGhpcy5zb3J0RGlyZWN0aW9uICsgMTtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gc29ydERpcjtcbiAgICAgICAgdGhpcy5ncmlkLnNvcnQoeyBmaWVsZE5hbWU6IHRoaXMuY29sdW1uLmZpZWxkLCBkaXI6IHRoaXMuc29ydERpcmVjdGlvbiwgaWdub3JlQ2FzZTogdGhpcy5jb2x1bW4uc29ydGluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICBzdHJhdGVneTogdGhpcy5jb2x1bW4uc29ydFN0cmF0ZWd5IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlRmlsdGVyRHJvcGRvd24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJUYXJnZXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckljb25UYXJnZXQgPSBoZWFkZXJUYXJnZXQucXVlcnlTZWxlY3RvcignLicgKyB0aGlzLmZpbHRlckljb25DbGFzc05hbWUpO1xuXG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MudGFyZ2V0ID0gZmlsdGVySWNvblRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5ncmlkLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkID1cbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5hdHRhY2goSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MsIHRoaXMuX21vZHVsZVJlZik7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCwgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRGaWx0ZXJpbmdTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHVzZUFuaW1hdGlvbihmYWRlSW4sIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246ICcyNTBtcydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiB1c2VBbmltYXRpb24oZmFkZU91dCwge1xuICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogJzIwMG1zJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3kodGhpcy5fZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vbk9wZW5pbmcucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigob3ZlcmxheSkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoZXZlbnRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk92ZXJsYXlPcGVuaW5nKGV2ZW50QXJncyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vbkNsb3NlZC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKG92ZXJsYXkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk92ZXJsYXlDbG9zZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25PdmVybGF5T3BlbmluZyhldmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBldmVudEFyZ3MuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50O1xuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmluaXRpYWxpemUodGhpcy5jb2x1bW4sIHRoaXMuX2ZpbHRlcmluZ1NlcnZpY2UsIHRoaXMuX292ZXJsYXlTZXJ2aWNlLCBldmVudEFyZ3MuaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk92ZXJsYXlDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCA9IG51bGw7XG4gICAgfVxufVxuIl19