igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
318 lines • 30.3 kB
JavaScript
/**
* @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=