UNPKG

igniteui-angular

Version:

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

325 lines • 35.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ChangeDetectionStrategy, Input, ChangeDetectorRef, ViewChild, TemplateRef, ViewChildren, QueryList, ElementRef } from '@angular/core'; import { IgxColumnComponent } from '../../column.component'; import { IgxFilteringService, ExpressionUI } from '../grid-filtering.service'; import { FilteringLogic } from '../../../data-operations/filtering-expression.interface'; import { DataType } from '../../../data-operations/data-util'; import { IgxStringFilteringOperand, IgxBooleanFilteringOperand, IgxNumberFilteringOperand, IgxDateFilteringOperand } from '../../../data-operations/filtering-condition'; import { IgxToggleDirective } from '../../../directives/toggle/toggle.directive'; import { ConnectedPositioningStrategy, VerticalAlignment, HorizontalAlignment, IgxOverlayService, AbsoluteScrollStrategy } from '../../../services/index'; import { IgxExcelStyleDefaultExpressionComponent } from './excel-style-default-expression.component'; import { IgxExcelStyleDateExpressionComponent } from './excel-style-date-expression.component'; /** * @hidden */ export class IgxExcelStyleCustomDialogComponent { /** * @param {?} cdr */ constructor(cdr) { this.cdr = cdr; this.expressionsList = new Array(); this._customDialogPositionSettings = { verticalDirection: VerticalAlignment.Middle, horizontalDirection: HorizontalAlignment.Center, horizontalStartPoint: HorizontalAlignment.Center, verticalStartPoint: VerticalAlignment.Middle }; this._customDialogOverlaySettings = { closeOnOutsideClick: true, modal: false, positionStrategy: new ConnectedPositioningStrategy(this._customDialogPositionSettings), scrollStrategy: new AbsoluteScrollStrategy() }; } /** * @return {?} */ ngAfterViewInit() { this._customDialogOverlaySettings.outlet = this.grid.outlet; } /** * @return {?} */ get template() { if (this.column.dataType === DataType.Date) { return this.dateExpressionTemplate; } return this.defaultExpressionTemplate; } /** * @return {?} */ get grid() { return this.filteringService.grid; } /** * @return {?} */ onCustomDialogOpening() { if (this.selectedOperator) { this.createInitialExpressionUIElement(); } } /** * @return {?} */ onCustomDialogOpened() { if (this.expressionComponents.first) { this.expressionComponents.first.focus(); } } /** * @return {?} */ open() { this._customDialogOverlaySettings.positionStrategy.settings.target = this.grid.rootGrid ? this.grid.rootGrid.nativeElement : this.grid.nativeElement; this.toggle.open(this._customDialogOverlaySettings); } /** * @return {?} */ onClearButtonClick() { this.filteringService.clearFilter(this.column.field); this.createInitialExpressionUIElement(); this.cdr.detectChanges(); } /** * @return {?} */ closeDialog() { if (this.overlayComponentId) { this.overlayService.hide(this.overlayComponentId); } } /** * @return {?} */ onApplyButtonClick() { this.expressionsList = this.expressionsList.filter(element => element.expression.condition && (element.expression.searchVal || element.expression.searchVal === 0 || element.expression.condition.isUnary)); if (this.expressionsList.length > 0) { this.expressionsList[0].beforeOperator = null; this.expressionsList[this.expressionsList.length - 1].afterOperator = null; } this.filteringService.filterInternal(this.column.field, this.expressionsList); this.closeDialog(); } /** * @return {?} */ onAddButtonClick() { /** @type {?} */ const exprUI = new ExpressionUI(); exprUI.expression = { condition: null, fieldName: this.column.field, ignoreCase: this.column.filteringIgnoreCase, searchVal: null }; this.expressionsList[this.expressionsList.length - 1].afterOperator = FilteringLogic.And; exprUI.beforeOperator = this.expressionsList[this.expressionsList.length - 1].afterOperator; this.expressionsList.push(exprUI); this.markChildrenForCheck(); this.scrollToBottom(); } /** * @param {?} event * @return {?} */ onExpressionRemoved(event) { /** @type {?} */ const indexToRemove = this.expressionsList.indexOf(event); if (indexToRemove === 0 && this.expressionsList.length > 1) { this.expressionsList[1].beforeOperator = null; } else if (indexToRemove === this.expressionsList.length - 1) { this.expressionsList[indexToRemove - 1].afterOperator = null; } else { this.expressionsList[indexToRemove - 1].afterOperator = this.expressionsList[indexToRemove + 1].beforeOperator; this.expressionsList[0].beforeOperator = null; this.expressionsList[this.expressionsList.length - 1].afterOperator = null; } this.expressionsList.splice(indexToRemove, 1); this.cdr.detectChanges(); this.markChildrenForCheck(); } /** * @param {?} event * @return {?} */ onLogicOperatorChanged(event) { /** @type {?} */ const index = this.expressionsList.indexOf(event.target); event.target.afterOperator = event.newValue; if (index + 1 < this.expressionsList.length) { this.expressionsList[index + 1].beforeOperator = event.newValue; } } /** * @param {?} eventArgs * @return {?} */ onKeyDown(eventArgs) { eventArgs.stopPropagation(); } /** * @param {?} eventArgs * @return {?} */ onApplyButtonKeyDown(eventArgs) { if (eventArgs.key === "Tab" /* TAB */ && !eventArgs.shiftKey) { eventArgs.stopPropagation(); eventArgs.preventDefault(); } } /** * @private * @param {?} conditionName * @return {?} */ createCondition(conditionName) { switch (this.column.dataType) { case DataType.Boolean: return IgxBooleanFilteringOperand.instance().condition(conditionName); case DataType.Number: return IgxNumberFilteringOperand.instance().condition(conditionName); case DataType.Date: return IgxDateFilteringOperand.instance().condition(conditionName); default: return IgxStringFilteringOperand.instance().condition(conditionName); } } /** * @private * @return {?} */ markChildrenForCheck() { this.expressionComponents.forEach(x => x.cdr.markForCheck()); this.expressionDateComponents.forEach(x => x.cdr.markForCheck()); } /** * @private * @return {?} */ createInitialExpressionUIElement() { this.expressionsList = []; /** @type {?} */ const firstExprUI = new ExpressionUI(); firstExprUI.expression = { condition: this.createCondition(this.selectedOperator), fieldName: this.column.field, ignoreCase: this.column.filteringIgnoreCase, searchVal: null }; firstExprUI.afterOperator = FilteringLogic.And; this.expressionsList.push(firstExprUI); /** @type {?} */ const secondExprUI = new ExpressionUI(); secondExprUI.expression = { condition: null, fieldName: this.column.field, ignoreCase: this.column.filteringIgnoreCase, searchVal: null }; secondExprUI.beforeOperator = FilteringLogic.And; this.expressionsList.push(secondExprUI); } /** * @private * @return {?} */ scrollToBottom() { requestAnimationFrame(() => { this.expressionsContainer.nativeElement.scrollTop = this.expressionsContainer.nativeElement.scrollHeight; }); } } IgxExcelStyleCustomDialogComponent.decorators = [ { type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-excel-style-custom-dialog', template: "<article #toggle igxToggle\n class=\"igx-excel-filter__secondary\"\n (keydown)=\"onKeyDown($event)\"\n (onOpening)=\"onCustomDialogOpening()\"\n (onOpened)=\"onCustomDialogOpened()\">\n <header class=\"igx-excel-filter__secondary-header\">\n <h4 class=\"igx-typography__h6\">\n {{ grid.resourceStrings.igx_grid_excel_custom_dialog_header }}{{ column.header || column.field }}\n </h4>\n </header>\n\n <article #expressionsContainer class=\"igx-excel-filter__secondary-main\">\n <ng-container *ngIf=\"column.dataType === 'date'\">\n <igx-excel-style-date-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (onExpressionRemoved)=\"onExpressionRemoved($event)\"\n (onLogicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-date-expression>\n </ng-container>\n\n <ng-container *ngIf=\"column.dataType !== 'date'\">\n <igx-excel-style-default-expression *ngFor=\"let expression of expressionsList;\"\n class=\"igx-excel-filter__condition\"\n [expressionUI]=\"expression\"\n [column]=\"column\"\n [grid]=\"grid\"\n [expressionsList]=\"expressionsList\"\n (onExpressionRemoved)=\"onExpressionRemoved($event)\"\n (onLogicOperatorChanged)=\"onLogicOperatorChanged($event)\">\n </igx-excel-style-default-expression>\n </ng-container>\n\n <button igxButton\n class=\"igx-excel-filter__add-filter\"\n (click)=\"onAddButtonClick()\">\n <igx-icon>add</igx-icon>\n <span>{{ grid.resourceStrings.igx_grid_excel_custom_dialog_add }}</span>\n </button>\n </article>\n\n <footer class=\"igx-excel-filter__secondary-footer\">\n <button igxButton (click)=\"onClearButtonClick()\">{{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}</button>\n\n <div>\n <button igxButton (click)=\"closeDialog()\">{{ grid.resourceStrings.igx_grid_excel_cancel }}</button>\n <button igxButton=\"raised\" (click)=\"onApplyButtonClick()\" (keydown)=\"onApplyButtonKeyDown($event)\">\n {{ grid.resourceStrings.igx_grid_excel_apply }}\n </button>\n </div>\n </footer>\n</article>\n" }] } ]; /** @nocollapse */ IgxExcelStyleCustomDialogComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; IgxExcelStyleCustomDialogComponent.propDecorators = { expressionsList: [{ type: Input }], column: [{ type: Input }], selectedOperator: [{ type: Input }], filteringService: [{ type: Input }], overlayComponentId: [{ type: Input }], overlayService: [{ type: Input }], expressionComponents: [{ type: ViewChildren, args: [IgxExcelStyleDefaultExpressionComponent,] }], expressionDateComponents: [{ type: ViewChildren, args: [IgxExcelStyleDateExpressionComponent,] }], toggle: [{ type: ViewChild, args: ['toggle', { read: IgxToggleDirective },] }], defaultExpressionTemplate: [{ type: ViewChild, args: ['defaultExpressionTemplate', { read: TemplateRef },] }], dateExpressionTemplate: [{ type: ViewChild, args: ['dateExpressionTemplate', { read: TemplateRef },] }], expressionsContainer: [{ type: ViewChild, args: ['expressionsContainer',] }] }; if (false) { /** @type {?} */ IgxExcelStyleCustomDialogComponent.prototype.expressionsList; /** * @type {?} * @private */ IgxExcelStyleCustomDialogComponent.prototype._customDialogPositionSettings; /** * @type {?} * @private */ IgxExcelStyleCustomDialogComponent.prototype._customDialogOverlaySettings; /** @type {?} */ IgxExcelStyleCustomDialogComponent.prototype.column; /** @type {?} */ IgxExcelStyleCustomDialogComponent.prototype.selectedOperator; /** @type {?} */ IgxExcelStyleCustomDialogComponent.prototype.filteringService; /** @type {?} */ IgxExcelStyleCustomDialogComponent.prototype.overlayComponentId; /** @type {?} */ IgxExcelStyleCustomDialogComponent.prototype.overlayService; /** * @type {?} * @private */ IgxExcelStyleCustomDialogComponent.prototype.expressionComponents; /** * @type {?} * @private */ IgxExcelStyleCustomDialogComponent.prototype.expressionDateComponents; /** @type {?} */ IgxExcelStyleCustomDialogComponent.prototype.toggle; /** * @type {?} * @protected */ IgxExcelStyleCustomDialogComponent.prototype.defaultExpressionTemplate; /** * @type {?} * @protected */ IgxExcelStyleCustomDialogComponent.prototype.dateExpressionTemplate; /** * @type {?} * @protected */ IgxExcelStyleCustomDialogComponent.prototype.expressionsContainer; /** * @type {?} * @private */ IgxExcelStyleCustomDialogComponent.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtc3R5bGUtY3VzdG9tLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9leGNlbC1zdHlsZS1jdXN0b20tZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seURBQXlELENBQUM7QUFDekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlELE9BQU8sRUFDSCx5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDMUIsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNqRixPQUFPLEVBQ0gsNEJBQTRCLEVBRTVCLGlCQUFpQixFQUVqQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN6QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBNkIsdUNBQXVDLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVoSSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7OztBQVcvRixNQUFNLE9BQU8sa0NBQWtDOzs7O0lBb0QzQyxZQUFvQixHQUFzQjtRQUF0QixRQUFH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LENBQUMsWUFBWSxDQUFDO1FBQzdHLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7O1lBbE9KLFNBQVMsU0FBQztnQkFDUCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsbUJBQW1CLEVBQUUsS0FBSztnQkFDMUIsUUFBUSxFQUFFLCtCQUErQjtnQkFDekMsNmlGQUF5RDthQUM1RDs7OztZQXhDRyxpQkFBaUI7Ozs4QkEyQ2hCLEtBQUs7cUJBaUJMLEtBQUs7K0JBR0wsS0FBSzsrQkFHTCxLQUFLO2lDQUdMLEtBQUs7NkJBR0wsS0FBSzttQ0FHTCxZQUFZLFNBQUMsdUNBQXVDO3VDQUdwRCxZQUFZLFNBQUMsb0NBQW9DO3FCQUdqRCxTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO3dDQUdoRCxTQUFTLFNBQUMsMkJBQTJCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO3FDQUc1RCxTQUFTLFNBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO21DQUd6RCxTQUFTLFNBQUMsc0JBQXNCOzs7O0lBL0NqQyw2REFDbUQ7Ozs7O0lBRW5ELDJFQUtFOzs7OztJQUVGLDBFQUtFOztJQUVGLG9EQUNrQzs7SUFFbEMsOERBQ2dDOztJQUVoQyw4REFDNkM7O0lBRTdDLGdFQUNrQzs7SUFFbEMsNERBQ3lDOzs7OztJQUV6QyxrRUFDaUY7Ozs7O0lBRWpGLHNFQUNrRjs7SUFFbEYsb0RBQ2tDOzs7OztJQUVsQyx1RUFDc0Q7Ozs7O0lBRXRELG9FQUNtRDs7Ozs7SUFFbkQsa0VBQzJDOzs7OztJQUUvQixpREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBJbnB1dCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0LFxuICAgIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UsIEV4cHJlc3Npb25VSSB9IGZyb20gJy4uL2dyaWQtZmlsdGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQge1xuICAgIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZCxcbiAgICBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZFxufSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBJZ3hUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSxcbiAgICBPdmVybGF5U2V0dGluZ3MsXG4gICAgVmVydGljYWxBbGlnbm1lbnQsXG4gICAgUG9zaXRpb25TZXR0aW5ncyxcbiAgICBIb3Jpem9udGFsQWxpZ25tZW50LFxuICAgIElneE92ZXJsYXlTZXJ2aWNlLFxuICAgIEFic29sdXRlU2Nyb2xsU3RyYXRlZ3lcbn0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaW5kZXgnO1xuaW1wb3J0IHsgSUxvZ2ljT3BlcmF0b3JDaGFuZ2VkQXJncywgSWd4RXhjZWxTdHlsZURlZmF1bHRFeHByZXNzaW9uQ29tcG9uZW50IH0gZnJvbSAnLi9leGNlbC1zdHlsZS1kZWZhdWx0LWV4cHJlc3Npb24uY29tcG9uZW50JztcbmltcG9ydCB7IEtFWVMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneEV4Y2VsU3R5bGVEYXRlRXhwcmVzc2lvbkNvbXBvbmVudCB9IGZyb20gJy4vZXhjZWwtc3R5bGUtZGF0ZS1leHByZXNzaW9uLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBzZWxlY3RvcjogJ2lneC1leGNlbC1zdHlsZS1jdXN0b20tZGlhbG9nJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZXhjZWwtc3R5bGUtY3VzdG9tLWRpYWxvZy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4RXhjZWxTdHlsZUN1c3RvbURpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZXhwcmVzc2lvbnNMaXN0ID0gbmV3IEFycmF5PEV4cHJlc3Npb25VST4oKTtcblxuICAgIHByaXZhdGUgX2N1c3RvbURpYWxvZ1Bvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuTWlkZGxlXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2N1c3RvbURpYWxvZ092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX2N1c3RvbURpYWxvZ1Bvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKVxuICAgIH07XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2x1bW46IElneENvbHVtbkNvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkT3BlcmF0b3I6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVybGF5Q29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oSWd4RXhjZWxTdHlsZURlZmF1bHRFeHByZXNzaW9uQ29tcG9uZW50KVxuICAgIHByaXZhdGUgZXhwcmVzc2lvbkNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hFeGNlbFN0eWxlRGVmYXVsdEV4cHJlc3Npb25Db21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hFeGNlbFN0eWxlRGF0ZUV4cHJlc3Npb25Db21wb25lbnQpXG4gICAgcHJpdmF0ZSBleHByZXNzaW9uRGF0ZUNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hFeGNlbFN0eWxlRGF0ZUV4cHJlc3Npb25Db21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndG9nZ2xlJywgeyByZWFkOiBJZ3hUb2dnbGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdG9nZ2xlOiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RXhwcmVzc2lvblRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhwcmVzc2lvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZGF0ZUV4cHJlc3Npb25UZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwcm90ZWN0ZWQgZGF0ZUV4cHJlc3Npb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2V4cHJlc3Npb25zQ29udGFpbmVyJylcbiAgICBwcm90ZWN0ZWQgZXhwcmVzc2lvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1c3RvbURpYWxvZ092ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmdyaWQub3V0bGV0O1xuICAgIH1cblxuICAgIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBEYXRhVHlwZS5EYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRXhwcmVzc2lvblRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEV4cHJlc3Npb25UZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBnZXQgZ3JpZCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ3VzdG9tRGlhbG9nT3BlbmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPcGVyYXRvcikge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbml0aWFsRXhwcmVzc2lvblVJRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ3VzdG9tRGlhbG9nT3BlbmVkKCkge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uQ29tcG9uZW50cy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uQ29tcG9uZW50cy5maXJzdC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW4oKSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbURpYWxvZ092ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLnRhcmdldCA9XG4gICAgICAgICAgICB0aGlzLmdyaWQucm9vdEdyaWQgPyB0aGlzLmdyaWQucm9vdEdyaWQubmF0aXZlRWxlbWVudCA6IHRoaXMuZ3JpZC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnRvZ2dsZS5vcGVuKHRoaXMuX2N1c3RvbURpYWxvZ092ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2xlYXJCdXR0b25DbGljaygpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICAgICAgdGhpcy5jcmVhdGVJbml0aWFsRXhwcmVzc2lvblVJRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlRGlhbG9nKCkge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5Q29tcG9uZW50SWQpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuaGlkZSh0aGlzLm92ZXJsYXlDb21wb25lbnRJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25BcHBseUJ1dHRvbkNsaWNrKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdCA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbHRlcihcbiAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5leHByZXNzaW9uLmNvbmRpdGlvbiAmJlxuICAgICAgICAgICAgKGVsZW1lbnQuZXhwcmVzc2lvbi5zZWFyY2hWYWwgfHwgZWxlbWVudC5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gMCB8fCBlbGVtZW50LmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpKTtcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbMF0uYmVmb3JlT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoIC0gMV0uYWZ0ZXJPcGVyYXRvciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVySW50ZXJuYWwodGhpcy5jb2x1bW4uZmllbGQsIHRoaXMuZXhwcmVzc2lvbnNMaXN0KTtcbiAgICAgICAgdGhpcy5jbG9zZURpYWxvZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkFkZEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCBleHByVUkgPSBuZXcgRXhwcmVzc2lvblVJKCk7XG4gICAgICAgIGV4cHJVSS5leHByZXNzaW9uID0ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBudWxsLFxuICAgICAgICAgICAgZmllbGROYW1lOiB0aGlzLmNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRoaXMuY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFt0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxXS5hZnRlck9wZXJhdG9yID0gRmlsdGVyaW5nTG9naWMuQW5kO1xuICAgICAgICBleHByVUkuYmVmb3JlT3BlcmF0b3IgPSB0aGlzLmV4cHJlc3Npb25zTGlzdFt0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxXS5hZnRlck9wZXJhdG9yO1xuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0LnB1c2goZXhwclVJKTtcblxuICAgICAgICB0aGlzLm1hcmtDaGlsZHJlbkZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uUmVtb3ZlZChldmVudDogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGNvbnN0IGluZGV4VG9SZW1vdmUgPSB0aGlzLmV4cHJlc3Npb25zTGlzdC5pbmRleE9mKGV2ZW50KTtcblxuICAgICAgICBpZiAoaW5kZXhUb1JlbW92ZSA9PT0gMCAmJiB0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFsxXS5iZWZvcmVPcGVyYXRvciA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXhUb1JlbW92ZSA9PT0gdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbaW5kZXhUb1JlbW92ZSAtIDFdLmFmdGVyT3BlcmF0b3IgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3RbaW5kZXhUb1JlbW92ZSAtIDFdLmFmdGVyT3BlcmF0b3IgPSB0aGlzLmV4cHJlc3Npb25zTGlzdFtpbmRleFRvUmVtb3ZlICsgMV0uYmVmb3JlT3BlcmF0b3I7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFswXS5iZWZvcmVPcGVyYXRvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFt0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxXS5hZnRlck9wZXJhdG9yID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0LnNwbGljZShpbmRleFRvUmVtb3ZlLCAxKTtcblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5tYXJrQ2hpbGRyZW5Gb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkxvZ2ljT3BlcmF0b3JDaGFuZ2VkKGV2ZW50OiBJTG9naWNPcGVyYXRvckNoYW5nZWRBcmdzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5leHByZXNzaW9uc0xpc3QuaW5kZXhPZihldmVudC50YXJnZXQpO1xuICAgICAgICBldmVudC50YXJnZXQuYWZ0ZXJPcGVyYXRvciA9IGV2ZW50Lm5ld1ZhbHVlO1xuICAgICAgICBpZiAoaW5kZXggKyAxIDwgdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFtpbmRleCArIDFdLmJlZm9yZU9wZXJhdG9yID0gZXZlbnQubmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50QXJncykge1xuICAgICAgICBldmVudEFyZ3Muc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQXBwbHlCdXR0b25LZXlEb3duKGV2ZW50QXJncykge1xuICAgICAgICBpZiAoZXZlbnRBcmdzLmtleSA9PT0gS0VZUy5UQUIgJiYgIWV2ZW50QXJncy5zaGlmdEtleSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNvbmRpdGlvbihjb25kaXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbHVtbi5kYXRhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKGNvbmRpdGlvbk5hbWUpO1xuICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihjb25kaXRpb25OYW1lKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oY29uZGl0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcmtDaGlsZHJlbkZvckNoZWNrKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25Db21wb25lbnRzLmZvckVhY2goeCA9PiB4LmNkci5tYXJrRm9yQ2hlY2soKSk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbkRhdGVDb21wb25lbnRzLmZvckVhY2goeCA9PiB4LmNkci5tYXJrRm9yQ2hlY2soKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVJbml0aWFsRXhwcmVzc2lvblVJRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3QgPSBbXTtcbiAgICAgICAgY29uc3QgZmlyc3RFeHByVUkgPSBuZXcgRXhwcmVzc2lvblVJKCk7XG5cbiAgICAgICAgZmlyc3RFeHByVUkuZXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5jcmVhdGVDb25kaXRpb24odGhpcy5zZWxlY3RlZE9wZXJhdG9yKSxcbiAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgc2VhcmNoVmFsOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIGZpcnN0RXhwclVJLmFmdGVyT3BlcmF0b3IgPSBGaWx0ZXJpbmdMb2dpYy5BbmQ7XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3QucHVzaChmaXJzdEV4cHJVSSk7XG5cbiAgICAgICAgY29uc3Qgc2Vjb25kRXhwclVJID0gbmV3IEV4cHJlc3Npb25VSSgpO1xuICAgICAgICBzZWNvbmRFeHByVUkuZXhwcmVzc2lvbiA9IHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2x1bW4uZmllbGQsXG4gICAgICAgICAgICBpZ25vcmVDYXNlOiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdJZ25vcmVDYXNlLFxuICAgICAgICAgICAgc2VhcmNoVmFsOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2Vjb25kRXhwclVJLmJlZm9yZU9wZXJhdG9yID0gRmlsdGVyaW5nTG9naWMuQW5kO1xuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0LnB1c2goc2Vjb25kRXhwclVJKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvQm90dG9tKCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==