UNPKG

igniteui-angular

Version:

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

318 lines • 30.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, ChangeDetectorRef, ViewChild } from '@angular/core'; import { IgxColumnComponent } from '../../column.component'; import { ExpressionUI } from '../grid-filtering.service'; import { IgxButtonGroupComponent } from '../../../buttonGroup/buttonGroup.component'; import { IgxDropDownComponent } from '../../../drop-down/index'; import { IgxInputGroupComponent, IgxInputDirective } from '../../../input-group/index'; import { DataType } from '../../../data-operations/data-util'; import { ConnectedPositioningStrategy, CloseScrollStrategy } from '../../../services/index'; /** * @hidden * @record */ export function ILogicOperatorChangedArgs() { } if (false) { /** @type {?} */ ILogicOperatorChangedArgs.prototype.target; /** @type {?} */ ILogicOperatorChangedArgs.prototype.newValue; } /** * @hidden */ export class IgxExcelStyleDefaultExpressionComponent { /** * @param {?} cdr */ constructor(cdr) { this.cdr = cdr; this._dropDownOverlaySettings = { closeOnOutsideClick: true, modal: false, positionStrategy: new ConnectedPositioningStrategy(), scrollStrategy: new CloseScrollStrategy() }; this.onExpressionRemoved = new EventEmitter(); this.onLogicOperatorChanged = new EventEmitter(); } /** * @protected * @return {?} */ get inputValuesElement() { return this.inputValuesDirective; } /** * @return {?} */ get isLast() { return this.expressionsList[this.expressionsList.length - 1] === this.expressionUI; } /** * @return {?} */ get isSingle() { return this.expressionsList.length === 1; } /** * @return {?} */ get inputConditionsPlaceholder() { return this.grid.resourceStrings['igx_grid_filter_condition_placeholder']; } /** * @return {?} */ get inputValuePlaceholder() { return this.grid.resourceStrings['igx_grid_filter_row_placeholder']; } /** * @return {?} */ get type() { switch (this.column.dataType) { case DataType.Number: return 'number'; default: return 'text'; } } /** * @return {?} */ ngAfterViewInit() { this._dropDownOverlaySettings.outlet = this.column.grid.outletDirective; this._dropDownOverlaySettings.positionStrategy.settings.target = this.inputGroupConditions.element.nativeElement; } /** * @return {?} */ focus() { // use requestAnimationFrame to focus the values input because when initializing the component // datepicker's input group is not yet fully initialized requestAnimationFrame(() => this.inputValuesElement.focus()); } /** * @param {?} conditionName * @return {?} */ isConditionSelected(conditionName) { return this.expressionUI.expression.condition && this.expressionUI.expression.condition.name === conditionName; } /** * @param {?} condition * @return {?} */ getConditionName(condition) { return condition ? this.translateCondition(condition.name) : null; } /** * @return {?} */ getInputWidth() { return this.inputGroupConditions.element.nativeElement.offsetWidth + 'px'; } /** * @return {?} */ get conditions() { return this.column.filters.conditionList(); } /** * @param {?} value * @return {?} */ translateCondition(value) { return this.grid.resourceStrings[`igx_grid_filter_${this.getCondition(value).name}`] || value; } /** * @return {?} */ getIconName() { if (this.column.dataType === DataType.Boolean && this.expressionUI.expression.condition === null) { return this.getCondition(this.conditions[0]).iconName; } else if (!this.expressionUI.expression.condition) { return 'filter_list'; } else { return this.expressionUI.expression.condition.iconName; } } /** * @return {?} */ toggleCustomDialogDropDown() { this.dropdownConditions.toggle(this._dropDownOverlaySettings); } /** * @param {?} value * @return {?} */ getCondition(value) { return this.column.filters.condition(value); } /** * @param {?} eventArgs * @return {?} */ onConditionsChanged(eventArgs) { /** @type {?} */ const value = ((/** @type {?} */ (eventArgs.newSelection))).value; this.expressionUI.expression.condition = this.getCondition(value); this.focus(); } /** * @param {?} value * @return {?} */ isValueSelected(value) { if (this.expressionUI.expression.searchVal) { return this.expressionUI.expression.searchVal === value; } else { return false; } } /** * @param {?} eventArgs * @return {?} */ onValuesInput(eventArgs) { this.expressionUI.expression.searchVal = this.transformValue(eventArgs.target.value); } /** * @param {?} eventArgs * @param {?} buttonIndex * @return {?} */ onLogicOperatorButtonClicked(eventArgs, buttonIndex) { if (this.logicOperatorButtonGroup.selectedButtons.length === 0) { eventArgs.stopPropagation(); this.logicOperatorButtonGroup.selectButton(buttonIndex); } else { this.onLogicOperatorChanged.emit({ target: this.expressionUI, newValue: (/** @type {?} */ (buttonIndex)) }); } } /** * @param {?} eventArgs * @param {?} buttonIndex * @return {?} */ onLogicOperatorKeyDown(eventArgs, buttonIndex) { if (eventArgs.key === "Enter" /* ENTER */) { this.logicOperatorButtonGroup.selectButton(buttonIndex); this.onLogicOperatorChanged.emit({ target: this.expressionUI, newValue: (/** @type {?} */ (buttonIndex)) }); } } /** * @return {?} */ onRemoveButtonClick() { this.onExpressionRemoved.emit(this.expressionUI); } /** * @param {?} eventArgs * @return {?} */ onInputConditionsKeyDown(eventArgs) { if (eventArgs.altKey && (eventArgs.key === "ArrowDown" /* DOWN_ARROW */ || eventArgs.key === "Down" /* DOWN_ARROW_IE */)) { this.toggleCustomDialogDropDown(); } if (eventArgs.key === "Tab" /* TAB */ && eventArgs.shiftKey && this.expressionsList[0] === this.expressionUI) { eventArgs.preventDefault(); } event.stopPropagation(); } /** * @private * @param {?} value * @return {?} */ transformValue(value) { if (this.column.dataType === DataType.Number) { value = parseFloat(value); } else if (this.column.dataType === DataType.Boolean) { value = Boolean(value); } return value; } } IgxExcelStyleDefaultExpressionComponent.decorators = [ { type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-excel-style-default-expression', template: "<igx-drop-down\n #dropdownConditions\n [maxHeight]=\"'200px'\"\n [width]=\"getInputWidth()\"\n (onSelection)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\" [value]=\"condition\" [selected]=\"isConditionSelected(condition)\">\n <igx-icon fontSet=\"filtering-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span>{{ translateCondition(condition) }}</span>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<igx-input-group\n #inputGroupConditions\n (click)=\"toggleCustomDialogDropDown()\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [supressInputAutofocus]=\"true\">\n\n <igx-prefix>\n <igx-icon *ngIf=\"expressionUI.expression.condition\" fontSet=\"filtering-icons\" [name]=\"getIconName()\"></igx-icon>\n <igx-icon *ngIf=\"!expressionUI.expression.condition\">filter_list</igx-icon>\n </igx-prefix>\n\n <input\n igxInput\n (keydown)=\"onInputConditionsKeyDown($event)\"\n [igxDropDownItemNavigation]=\"dropdownConditions\"\n tabindex=\"0\"\n [placeholder]=\"inputConditionsPlaceholder\"\n autocomplete=\"off\"\n [value]=\"getConditionName(expressionUI.expression.condition)\"\n [readonly]=\"true\"\n />\n</igx-input-group>\n\n<igx-input-group #inputGroupValues type=\"box\" [displayDensity]=\"'compact'\" [supressInputAutofocus]=\"true\">\n <input\n #inputValues\n igxInput\n [type]=\"type\"\n tabindex=\"0\"\n [placeholder]=\"inputValuePlaceholder\"\n [disabled]=\"expressionUI.expression.condition && expressionUI.expression.condition.isUnary\"\n autocomplete=\"off\"\n [value]=\"expressionUI.expression.searchVal\"\n (input)=\"onValuesInput($event)\"\n />\n</igx-input-group>\n\n<button (click)=\"onRemoveButtonClick()\" igxButton=\"icon\" *ngIf=\"!isSingle\">\n <igx-icon>cancel</igx-icon>\n</button>\n\n<igx-buttongroup #logicOperatorButtonGroup\n *ngIf=\"!isLast\"\n [multiSelection]=\"false\">\n <span igxButton\n tabindex=\"0\"\n #andButton\n (keydown)=\"onLogicOperatorKeyDown($event, 0)\"\n [selected]=\"expressionUI.afterOperator === 0\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 0)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_and }}\n </span>\n\n <span igxButton\n tabindex=\"0\"\n #orButton\n (keydown)=\"onLogicOperatorKeyDown($event, 1)\"\n [selected]=\"expressionUI.afterOperator === 1\"\n type=\"button\"\n (click)=\"onLogicOperatorButtonClicked($event, 1)\">\n {{ grid.resourceStrings.igx_grid_filter_operator_or }}\n </span>\n</igx-buttongroup>\n" }] } ]; /** @nocollapse */ IgxExcelStyleDefaultExpressionComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; IgxExcelStyleDefaultExpressionComponent.propDecorators = { column: [{ type: Input }], expressionUI: [{ type: Input }], expressionsList: [{ type: Input }], grid: [{ type: Input }], onExpressionRemoved: [{ type: Output }], onLogicOperatorChanged: [{ type: Output }], inputGroupConditions: [{ type: ViewChild, args: ['inputGroupConditions', { read: IgxInputGroupComponent },] }], inputValuesDirective: [{ type: ViewChild, args: ['inputValues', { read: IgxInputDirective },] }], dropdownConditions: [{ type: ViewChild, args: ['dropdownConditions', { read: IgxDropDownComponent },] }], logicOperatorButtonGroup: [{ type: ViewChild, args: ['logicOperatorButtonGroup', { read: IgxButtonGroupComponent },] }] }; if (false) { /** * @type {?} * @private */ IgxExcelStyleDefaultExpressionComponent.prototype._dropDownOverlaySettings; /** @type {?} */ IgxExcelStyleDefaultExpressionComponent.prototype.column; /** @type {?} */ IgxExcelStyleDefaultExpressionComponent.prototype.expressionUI; /** @type {?} */ IgxExcelStyleDefaultExpressionComponent.prototype.expressionsList; /** @type {?} */ IgxExcelStyleDefaultExpressionComponent.prototype.grid; /** @type {?} */ IgxExcelStyleDefaultExpressionComponent.prototype.onExpressionRemoved; /** @type {?} */ IgxExcelStyleDefaultExpressionComponent.prototype.onLogicOperatorChanged; /** * @type {?} * @protected */ IgxExcelStyleDefaultExpressionComponent.prototype.inputGroupConditions; /** * @type {?} * @protected */ IgxExcelStyleDefaultExpressionComponent.prototype.inputValuesDirective; /** * @type {?} * @protected */ IgxExcelStyleDefaultExpressionComponent.prototype.dropdownConditions; /** * @type {?} * @protected */ IgxExcelStyleDefaultExpressionComponent.prototype.logicOperatorButtonGroup; /** @type {?} */ IgxExcelStyleDefaultExpressionComponent.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtc3R5bGUtZGVmYXVsdC1leHByZXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLWRlZmF1bHQtZXhwcmVzc2lvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsdUJBQXVCLEVBRXZCLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixFQUNqQixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3JGLE9BQU8sRUFBNEIsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFOUQsT0FBTyxFQUFtQiw0QkFBNEIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7OztBQU83RywrQ0FHQzs7O0lBRkcsMkNBQXFCOztJQUNyQiw2Q0FBeUI7Ozs7O0FBWTdCLE1BQU0sT0FBTyx1Q0FBdUM7Ozs7SUFvRWhELFlBQW1CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEVqQyw2QkFBd0IsR0FBb0I7WUFDaEQsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixLQUFLLEVBQUUsS0FBSztZQUNaLGdCQUFnQixFQUFFLElBQUksNEJBQTRCLEVBQUU7WUFDcEQsY0FBYyxFQUFFLElB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O0lBRUYseURBQ2tDOztJQUVsQywrREFDa0M7O0lBRWxDLGtFQUM0Qzs7SUFFNUMsdURBQ2lCOztJQUVqQixzRUFDOEQ7O0lBRTlELHlFQUM4RTs7Ozs7SUFFOUUsdUVBQ3VEOzs7OztJQUV2RCx1RUFDa0Q7Ozs7O0lBRWxELHFFQUNtRDs7Ozs7SUFFbkQsMkVBQzREOztJQStCaEQsc0RBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRXhwcmVzc2lvblVJIH0gZnJvbSAnLi4vZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hCdXR0b25Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2J1dHRvbkdyb3VwL2J1dHRvbkdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hEcm9wRG93bkl0ZW1Db21wb25lbnQsIElneERyb3BEb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZHJvcC1kb3duL2luZGV4JztcbmltcG9ydCB7IElneElucHV0R3JvdXBDb21wb25lbnQsIElneElucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vaW5wdXQtZ3JvdXAvaW5kZXgnO1xuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IElGaWx0ZXJpbmdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3ksIENsb3NlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pbmRleCc7XG5pbXBvcnQgeyBLRVlTIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdMb2dpYyB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTG9naWNPcGVyYXRvckNoYW5nZWRBcmdzIHtcbiAgICB0YXJnZXQ6IEV4cHJlc3Npb25VSTtcbiAgICBuZXdWYWx1ZTogRmlsdGVyaW5nTG9naWM7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBzZWxlY3RvcjogJ2lneC1leGNlbC1zdHlsZS1kZWZhdWx0LWV4cHJlc3Npb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9leGNlbC1zdHlsZS1kZWZhdWx0LWV4cHJlc3Npb24uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneEV4Y2VsU3R5bGVEZWZhdWx0RXhwcmVzc2lvbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gICAgcHJpdmF0ZSBfZHJvcERvd25PdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSgpLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IENsb3NlU2Nyb2xsU3RyYXRlZ3koKVxuICAgIH07XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2x1bW46IElneENvbHVtbkNvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGV4cHJlc3Npb25VSTogRXhwcmVzc2lvblVJO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZXhwcmVzc2lvbnNMaXN0OiBBcnJheTxFeHByZXNzaW9uVUk+O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ3JpZDogYW55O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uRXhwcmVzc2lvblJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cHJlc3Npb25VST4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkxvZ2ljT3BlcmF0b3JDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJTG9naWNPcGVyYXRvckNoYW5nZWRBcmdzPigpO1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cENvbmRpdGlvbnMnLCB7IHJlYWQ6IElneElucHV0R3JvdXBDb21wb25lbnQgfSlcbiAgICBwcm90ZWN0ZWQgaW5wdXRHcm91cENvbmRpdGlvbnM6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dFZhbHVlcycsIHsgcmVhZDogSWd4SW5wdXREaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZXNEaXJlY3RpdmU6IElneElucHV0RGlyZWN0aXZlO1xuXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25Db25kaXRpb25zJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHByb3RlY3RlZCBkcm9wZG93bkNvbmRpdGlvbnM6IElneERyb3BEb3duQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnbG9naWNPcGVyYXRvckJ1dHRvbkdyb3VwJywgeyByZWFkOiBJZ3hCdXR0b25Hcm91cENvbXBvbmVudCB9KVxuICAgIHByb3RlY3RlZCBsb2dpY09wZXJhdG9yQnV0dG9uR3JvdXA6IElneEJ1dHRvbkdyb3VwQ29tcG9uZW50O1xuXG4gICAgcHJvdGVjdGVkIGdldCBpbnB1dFZhbHVlc0VsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0VmFsdWVzRGlyZWN0aXZlO1xuICAgIH1cblxuICAgIGdldCBpc0xhc3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25zTGlzdFt0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggLSAxXSA9PT0gdGhpcy5leHByZXNzaW9uVUk7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2luZ2xlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID09PSAxO1xuICAgIH1cblxuICAgIGdldCBpbnB1dENvbmRpdGlvbnNQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJlc291cmNlU3RyaW5nc1snaWd4X2dyaWRfZmlsdGVyX2NvbmRpdGlvbl9wbGFjZWhvbGRlciddO1xuICAgIH1cblxuICAgIGdldCBpbnB1dFZhbHVlUGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yZXNvdXJjZVN0cmluZ3NbJ2lneF9ncmlkX2ZpbHRlcl9yb3dfcGxhY2Vob2xkZXInXTtcbiAgICB9XG5cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbHVtbi5kYXRhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMuY29sdW1uLmdyaWQub3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLl9kcm9wRG93bk92ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLnRhcmdldCA9IHRoaXMuaW5wdXRHcm91cENvbmRpdGlvbnMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBmb2N1cygpIHtcbiAgICAgICAgLy8gdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBmb2N1cyB0aGUgdmFsdWVzIGlucHV0IGJlY2F1c2Ugd2hlbiBpbml0aWFsaXppbmcgdGhlIGNvbXBvbmVudFxuICAgICAgICAvLyBkYXRlcGlja2VyJ3MgaW5wdXQgZ3JvdXAgaXMgbm90IHlldCBmdWxseSBpbml0aWFsaXplZFxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5pbnB1dFZhbHVlc0VsZW1lbnQuZm9jdXMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29uZGl0aW9uU2VsZWN0ZWQoY29uZGl0aW9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25VSS5leHByZXNzaW9uLmNvbmRpdGlvbiAmJiB0aGlzLmV4cHJlc3Npb25VSS5leHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lID09PSBjb25kaXRpb25OYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb25kaXRpb25OYW1lKGNvbmRpdGlvbjogSUZpbHRlcmluZ09wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uID8gdGhpcy50cmFuc2xhdGVDb25kaXRpb24oY29uZGl0aW9uLm5hbWUpIDogbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW5wdXRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRHcm91cENvbmRpdGlvbnMuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4JztcbiAgICB9XG5cbiAgICBnZXQgY29uZGl0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpbHRlcnMuY29uZGl0aW9uTGlzdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFuc2xhdGVDb25kaXRpb24odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQucmVzb3VyY2VTdHJpbmdzW2BpZ3hfZ3JpZF9maWx0ZXJfJHt0aGlzLmdldENvbmRpdGlvbih2YWx1ZSkubmFtZX1gXSB8fCB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SWNvbk5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBEYXRhVHlwZS5Cb29sZWFuICYmIHRoaXMuZXhwcmVzc2lvblVJLmV4cHJlc3Npb24uY29uZGl0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb25kaXRpb24odGhpcy5jb25kaXRpb25zWzBdKS5pY29uTmFtZTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5leHByZXNzaW9uVUkuZXhwcmVzc2lvbi5jb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAnZmlsdGVyX2xpc3QnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvblVJLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUN1c3RvbURpYWxvZ0Ryb3BEb3duKCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duQ29uZGl0aW9ucy50b2dnbGUodGhpcy5fZHJvcERvd25PdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb25kaXRpb24odmFsdWU6IHN0cmluZyk6IElGaWx0ZXJpbmdPcGVyYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVycy5jb25kaXRpb24odmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbmRpdGlvbnNDaGFuZ2VkKGV2ZW50QXJnczogYW55KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50QXJncy5uZXdTZWxlY3Rpb24gYXMgSWd4RHJvcERvd25JdGVtQ29tcG9uZW50KS52YWx1ZTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uVUkuZXhwcmVzc2lvbi5jb25kaXRpb24gPSB0aGlzLmdldENvbmRpdGlvbih2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1ZhbHVlU2VsZWN0ZWQodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uVUkuZXhwcmVzc2lvbi5zZWFyY2hWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25VSS5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25WYWx1ZXNJbnB1dChldmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uVUkuZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSB0aGlzLnRyYW5zZm9ybVZhbHVlKGV2ZW50QXJncy50YXJnZXQudmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkxvZ2ljT3BlcmF0b3JCdXR0b25DbGlja2VkKGV2ZW50QXJncywgYnV0dG9uSW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5sb2dpY09wZXJhdG9yQnV0dG9uR3JvdXAuc2VsZWN0ZWRCdXR0b25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5sb2dpY09wZXJhdG9yQnV0dG9uR3JvdXAuc2VsZWN0QnV0dG9uKGJ1dHRvbkluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25Mb2dpY09wZXJhdG9yQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRoaXMuZXhwcmVzc2lvblVJLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBidXR0b25JbmRleCBhcyBGaWx0ZXJpbmdMb2dpY1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25Mb2dpY09wZXJhdG9yS2V5RG93bihldmVudEFyZ3MsIGJ1dHRvbkluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50QXJncy5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgICAgICAgIHRoaXMubG9naWNPcGVyYXRvckJ1dHRvbkdyb3VwLnNlbGVjdEJ1dHRvbihidXR0b25JbmRleCk7XG4gICAgICAgICAgICB0aGlzLm9uTG9naWNPcGVyYXRvckNoYW5nZWQuZW1pdCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmV4cHJlc3Npb25VSSxcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogYnV0dG9uSW5kZXggYXMgRmlsdGVyaW5nTG9naWNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVtb3ZlQnV0dG9uQ2xpY2soKSB7XG4gICAgICAgIHRoaXMub25FeHByZXNzaW9uUmVtb3ZlZC5lbWl0KHRoaXMuZXhwcmVzc2lvblVJKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENvbmRpdGlvbnNLZXlEb3duKGV2ZW50QXJncykge1xuICAgICAgICBpZiAoZXZlbnRBcmdzLmFsdEtleSAmJiAoZXZlbnRBcmdzLmtleSA9PT0gS0VZUy5ET1dOX0FSUk9XIHx8IGV2ZW50QXJncy5rZXkgPT09IEtFWVMuRE9XTl9BUlJPV19JRSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ3VzdG9tRGlhbG9nRHJvcERvd24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudEFyZ3Mua2V5ID09PSBLRVlTLlRBQiAmJiBldmVudEFyZ3Muc2hpZnRLZXkgJiYgdGhpcy5leHByZXNzaW9uc0xpc3RbMF0gPT09IHRoaXMuZXhwcmVzc2lvblVJKSB7XG4gICAgICAgICAgICBldmVudEFyZ3MucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJhbnNmb3JtVmFsdWUodmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IERhdGFUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgdmFsdWUgPSBCb29sZWFuKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG4iXX0=