fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
369 lines • 29.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, forwardRef, HostBinding, Input, Output, QueryList, ViewChild, ViewChildren } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { MenuItemDirective } from '../menu/menu-item.directive';
var SearchInputComponent = /** @class */ (function () {
function SearchInputComponent() {
this.dropdownValues = [];
this.filterFn = this.defaultFilter;
this.displayedValues = [];
this.inShellbar = false;
this.glyph = 'search';
this.compact = false;
this.highlight = true;
this.closeOnSelect = true;
this.fillOnSelect = true;
this.itemClicked = new EventEmitter();
this.isOpen = false;
this.searchInputClass = true;
this.shellBarClass = this.inShellbar;
this.onChange = (/**
* @return {?}
*/
function () { });
this.onTouched = (/**
* @return {?}
*/
function () { });
}
/**
* @param {?} event
* @return {?}
*/
SearchInputComponent.prototype.onInputKeydownHandler = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.code === 'Enter' && this.searchFunction) {
this.searchFunction();
}
else if (event.code === 'ArrowDown') {
event.preventDefault();
if (this.menuItems && this.menuItems.first) {
this.menuItems.first.itemEl.nativeElement.children[0].focus();
}
}
};
/**
* @return {?}
*/
SearchInputComponent.prototype.onInputKeyupHandler = /**
* @return {?}
*/
function () {
if (this.inputText.length) {
this.isOpen = true;
}
};
/**
* @param {?} event
* @param {?=} term
* @return {?}
*/
SearchInputComponent.prototype.onMenuKeydownHandler = /**
* @param {?} event
* @param {?=} term
* @return {?}
*/
function (event, term) {
var _this = this;
if (event.code === 'Enter' && term.callback) {
term.callback(event);
this.itemClicked.emit(term);
}
else if (event.code === 'ArrowDown') {
event.preventDefault();
/** @type {?} */
var foundItem_1 = false;
/** @type {?} */
var menuItemsArray_1 = this.menuItems.toArray();
menuItemsArray_1.forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
if (document.activeElement === item.itemEl.nativeElement.children[0] && !foundItem_1) {
if (menuItemsArray_1[index + 1]) {
menuItemsArray_1[index + 1].itemEl.nativeElement.children[0].focus();
}
foundItem_1 = true;
}
}));
}
else if (event.code === 'ArrowUp') {
event.preventDefault();
/** @type {?} */
var foundItem_2 = false;
/** @type {?} */
var menuItemsArray_2 = this.menuItems.toArray();
menuItemsArray_2.forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
if (!foundItem_2) {
if (document.activeElement === item.itemEl.nativeElement.children[0] && index === 0) {
_this.searchInputElement.nativeElement.focus();
foundItem_2 = true;
}
else if (document.activeElement === item.itemEl.nativeElement.children[0]) {
if (menuItemsArray_2[index - 1]) {
menuItemsArray_2[index - 1].itemEl.nativeElement.children[0].focus();
}
foundItem_2 = true;
}
}
}));
}
};
/**
* @param {?} event
* @param {?} term
* @return {?}
*/
SearchInputComponent.prototype.onMenuClickHandler = /**
* @param {?} event
* @param {?} term
* @return {?}
*/
function (event, term) {
if (term.callback) {
term.callback(event);
this.handleClickActions(term);
this.itemClicked.emit(term);
}
};
/**
* @param {?} event
* @return {?}
*/
SearchInputComponent.prototype.shellbarSearchInputClicked = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
};
Object.defineProperty(SearchInputComponent.prototype, "inputText", {
get: /**
* @return {?}
*/
function () {
return this.inputTextValue;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.inputTextValue = value;
this.onChange(value);
this.onTouched();
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
SearchInputComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.inputTextValue = value;
};
/**
* @param {?} fn
* @return {?}
*/
SearchInputComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
SearchInputComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @private
* @param {?} term
* @return {?}
*/
SearchInputComponent.prototype.handleClickActions = /**
* @private
* @param {?} term
* @return {?}
*/
function (term) {
if (this.closeOnSelect) {
this.isOpen = false;
}
if (this.fillOnSelect) {
this.inputText = term.text;
this.handleSearchTermChange();
}
};
/**
* @return {?}
*/
SearchInputComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.dropdownValues) {
this.displayedValues = this.dropdownValues;
}
};
/**
* @param {?} changes
* @return {?}
*/
SearchInputComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (this.dropdownValues && (changes.dropdownValues || changes.searchTerm)) {
if (this.inputText) {
this.displayedValues = this.filterFn(this.dropdownValues, this.inputText);
}
else {
this.displayedValues = this.dropdownValues;
}
}
};
/**
* @return {?}
*/
SearchInputComponent.prototype.handleSearchTermChange = /**
* @return {?}
*/
function () {
this.displayedValues = this.filterFn(this.dropdownValues, this.inputText);
};
/**
* @private
* @param {?} contentArray
* @param {?} searchTerm
* @return {?}
*/
SearchInputComponent.prototype.defaultFilter = /**
* @private
* @param {?} contentArray
* @param {?} searchTerm
* @return {?}
*/
function (contentArray, searchTerm) {
/** @type {?} */
var searchLower = searchTerm.toLocaleLowerCase();
return contentArray.filter((/**
* @param {?} item
* @return {?}
*/
function (item) {
if (item) {
return item.text.toLocaleLowerCase().includes(searchLower);
}
}));
};
SearchInputComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-search-input',
template: "<fd-popover [(isOpen)]=\"isOpen\"\n [fillControl]=\"true\"\n class=\"fd-search-input-popover-custom\"\n [ngClass]=\"{'fd-popover-body--display-none': displayedValues && !displayedValues.length}\">\n <fd-popover-control>\n <div *ngIf=\"!inShellbar\" class=\"fd-combobox-control\">\n <div class=\"fd-input-group fd-input-group--after\" [ngClass]=\"{'fd-input-group--compact': compact}\">\n <input #searchInputElement type=\"text\" class=\"fd-input\" [ngClass]=\"{'fd-input--compact': compact}\"\n (keydown)=\"onInputKeydownHandler($event)\"\n (keyup)=\"onInputKeyupHandler()\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"handleSearchTermChange()\"\n placeholder=\"{{placeholder}}\">\n <span class=\"fd-input-group__addon fd-input-group__addon--after fd-input-group__addon--button\">\n <button type=\"button\" class=\"fd-button--light\" [ngClass]=\"('sap-icon--' + this.glyph)\"></button>\n </span>\n </div>\n </div>\n <div *ngIf=\"inShellbar\" class=\"fd-search-input__control\">\n <button tabindex=\"0\" type=\"button\" class=\"fd-button--shell\" [attr.aria-expanded]=\"isOpen\"\n [ngClass]=\"('sap-icon--' + this.glyph)\"></button>\n <div class=\"fd-search-input__closedcontrol\" [attr.aria-hidden]=\"!isOpen\">\n <div class=\"fd-search-input__controlinput\" [attr.aria-expanded]=\"isOpen\" aria-haspopup=\"true\">\n <input type=\"text\" class=\"fd-input\"\n (keydown)=\"onInputKeydownHandler($event)\"\n (keyup)=\"onInputKeyupHandler()\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"handleSearchTermChange()\"\n placeholder=\"{{placeholder}}\"\n (click)=\"shellbarSearchInputClicked($event)\">\n </div>\n </div>\n </div>\n </fd-popover-control>\n <fd-popover-body *ngIf=\"displayedValues && displayedValues.length\">\n <fd-menu>\n <ul fd-menu-list>\n <li fd-menu-item *ngFor=\"let term of displayedValues\"\n (click)=\"onMenuClickHandler($event, term)\" (keydown)=\"onMenuKeydownHandler($event, term)\">\n <a tabindex=\"0\">\n <div *ngIf=\"highlight && inputTextValue && inputTextValue.toLocaleLowerCase\">\n {{ term.text.substr(0, term.text.toLocaleLowerCase().indexOf(inputText.toLocaleLowerCase())) }}<strong>{{term.text.substr(term.text.toLocaleLowerCase().indexOf(inputText.toLocaleLowerCase()), inputText.length)}}</strong>{{ term.text.substring(term.text.toLocaleLowerCase().indexOf(inputText.toLocaleLowerCase()) + inputText.length, term.text.length) }}\n </div>\n <div *ngIf=\"!highlight || !inputTextValue\">\n {{ term.text }}\n </div>\n </a>\n </li>\n </ul>\n </fd-menu>\n </fd-popover-body>\n</fd-popover>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return SearchInputComponent; })),
multi: true
}
],
styles: [".fd-popover-body--display-none ::ng-deep .fd-popover__body{display:none}.fd-search-input-popover-custom{display:block}"]
}] }
];
SearchInputComponent.propDecorators = {
dropdownValues: [{ type: Input }],
filterFn: [{ type: Input }],
disabled: [{ type: Input }],
placeholder: [{ type: Input }],
inShellbar: [{ type: Input }],
glyph: [{ type: Input }],
searchFunction: [{ type: Input }],
compact: [{ type: Input }],
highlight: [{ type: Input }],
closeOnSelect: [{ type: Input }],
fillOnSelect: [{ type: Input }],
itemClicked: [{ type: Output }],
menuItems: [{ type: ViewChildren, args: [MenuItemDirective,] }],
searchInputElement: [{ type: ViewChild, args: ['searchInputElement',] }],
searchInputClass: [{ type: HostBinding, args: ['class.fd-search-input',] }],
shellBarClass: [{ type: HostBinding, args: ['class.fd-search-input--closed',] }]
};
return SearchInputComponent;
}());
export { SearchInputComponent };
if (false) {
/** @type {?} */
SearchInputComponent.prototype.dropdownValues;
/** @type {?} */
SearchInputComponent.prototype.filterFn;
/** @type {?} */
SearchInputComponent.prototype.displayedValues;
/** @type {?} */
SearchInputComponent.prototype.disabled;
/** @type {?} */
SearchInputComponent.prototype.placeholder;
/** @type {?} */
SearchInputComponent.prototype.inShellbar;
/** @type {?} */
SearchInputComponent.prototype.glyph;
/** @type {?} */
SearchInputComponent.prototype.searchFunction;
/** @type {?} */
SearchInputComponent.prototype.compact;
/** @type {?} */
SearchInputComponent.prototype.highlight;
/** @type {?} */
SearchInputComponent.prototype.closeOnSelect;
/** @type {?} */
SearchInputComponent.prototype.fillOnSelect;
/** @type {?} */
SearchInputComponent.prototype.itemClicked;
/** @type {?} */
SearchInputComponent.prototype.menuItems;
/** @type {?} */
SearchInputComponent.prototype.searchInputElement;
/** @type {?} */
SearchInputComponent.prototype.isOpen;
/** @type {?} */
SearchInputComponent.prototype.inputTextValue;
/** @type {?} */
SearchInputComponent.prototype.searchInputClass;
/** @type {?} */
SearchInputComponent.prototype.shellBarClass;
/** @type {?} */
SearchInputComponent.prototype.onChange;
/** @type {?} */
SearchInputComponent.prototype.onTouched;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z1bmRhbWVudGFsLW5neC8iLCJzb3VyY2VzIjpbImxpYi9zZWFyY2gtaW5wdXQvc2VhcmNoLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVoRTtJQUFBO1FBY0ksbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFHM0IsYUFBUSxHQUFhLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFeEMsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFTNUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUc1QixVQUFLLEdBQVcsUUFBUSxDQUFDO1FBTXpCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFHekIsY0FBUyxHQUFZLElBQUksQ0FBQztRQUcxQixrQkFBYSxHQUFZLElBQUksQ0FBQztRQUc5QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUc3QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFNdEMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUt4QixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFHeEIsa0JBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBbUVoQyxhQUFROzs7UUFBUSxjQUFPLENBQUMsRUFBQztRQUN6QixjQUFTOzs7UUFBUSxjQUFPLENBQUMsRUFBQztJQThEOUIsQ0FBQzs7Ozs7SUFoSUcsb0RBQXFCOzs7O0lBQXJCLFVBQXNCLEtBQUs7UUFDdkIsSUFBSSxLQUFLLENB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWVudUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi9tZW51L21lbnUtaXRlbS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLXNlYXJjaC1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VhcmNoLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VhcmNoSW5wdXRDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpXG4gICAgZHJvcGRvd25WYWx1ZXM6IGFueVtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIGZpbHRlckZuOiBGdW5jdGlvbiA9IHRoaXMuZGVmYXVsdEZpbHRlcjtcblxuICAgIGRpc3BsYXllZFZhbHVlczogYW55W10gPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIGluU2hlbGxiYXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2x5cGg6IHN0cmluZyA9ICdzZWFyY2gnO1xuXG4gICAgQElucHV0KClcbiAgICBzZWFyY2hGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgICBASW5wdXQoKVxuICAgIGNvbXBhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgaGlnaGxpZ2h0OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPblNlbGVjdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGZpbGxPblNlbGVjdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBAT3V0cHV0KClcbiAgICBpdGVtQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgQFZpZXdDaGlsZHJlbihNZW51SXRlbURpcmVjdGl2ZSkgbWVudUl0ZW1zOiBRdWVyeUxpc3Q8TWVudUl0ZW1EaXJlY3RpdmU+O1xuXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXRFbGVtZW50Jykgc2VhcmNoSW5wdXRFbGVtZW50O1xuXG4gICAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBpbnB1dFRleHRWYWx1ZTogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mZC1zZWFyY2gtaW5wdXQnKVxuICAgIHNlYXJjaElucHV0Q2xhc3MgPSB0cnVlO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mZC1zZWFyY2gtaW5wdXQtLWNsb3NlZCcpXG4gICAgc2hlbGxCYXJDbGFzcyA9IHRoaXMuaW5TaGVsbGJhcjtcblxuICAgIG9uSW5wdXRLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJyAmJiB0aGlzLnNlYXJjaEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZ1bmN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY29kZSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tZW51SXRlbXMgJiYgdGhpcy5tZW51SXRlbXMuZmlyc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5maXJzdC5pdGVtRWwubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dEtleXVwSGFuZGxlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25NZW51S2V5ZG93bkhhbmRsZXIoZXZlbnQsIHRlcm0/KSB7XG4gICAgICAgIGlmIChldmVudC5jb2RlID09PSAnRW50ZXInICYmIHRlcm0uY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRlcm0uY2FsbGJhY2soZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5pdGVtQ2xpY2tlZC5lbWl0KHRlcm0pO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNvZGUgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgbGV0IGZvdW5kSXRlbSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbWVudUl0ZW1zQXJyYXkgPSB0aGlzLm1lbnVJdGVtcy50b0FycmF5KCk7XG4gICAgICAgICAgICBtZW51SXRlbXNBcnJheS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpdGVtLml0ZW1FbC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdICYmICFmb3VuZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lbnVJdGVtc0FycmF5W2luZGV4ICsgMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtc0FycmF5W2luZGV4ICsgMV0uaXRlbUVsLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3VuZEl0ZW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY29kZSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgbGV0IGZvdW5kSXRlbSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbWVudUl0ZW1zQXJyYXkgPSB0aGlzLm1lbnVJdGVtcy50b0FycmF5KCk7XG4gICAgICAgICAgICBtZW51SXRlbXNBcnJheS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpdGVtLml0ZW1FbC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdICYmIGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEl0ZW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGl0ZW0uaXRlbUVsLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW51SXRlbXNBcnJheVtpbmRleCAtIDFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW1zQXJyYXlbaW5kZXggLSAxXS5pdGVtRWwubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25NZW51Q2xpY2tIYW5kbGVyKGV2ZW50LCB0ZXJtKSB7XG4gICAgICAgIGlmICh0ZXJtLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0ZXJtLmNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xpY2tBY3Rpb25zKHRlcm0pO1xuICAgICAgICAgICAgdGhpcy5pdGVtQ2xpY2tlZC5lbWl0KHRlcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hlbGxiYXJTZWFyY2hJbnB1dENsaWNrZWQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xuICAgIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgICBnZXQgaW5wdXRUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dFRleHRWYWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgaW5wdXRUZXh0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0VmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbikge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xpY2tBY3Rpb25zKHRlcm0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWxsT25TZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gdGVybS50ZXh0O1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2hUZXJtQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25WYWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkVmFsdWVzID0gdGhpcy5kcm9wZG93blZhbHVlcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25WYWx1ZXMgJiYgKGNoYW5nZXMuZHJvcGRvd25WYWx1ZXMgfHwgY2hhbmdlcy5zZWFyY2hUZXJtKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRUZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSB0aGlzLmZpbHRlckZuKHRoaXMuZHJvcGRvd25WYWx1ZXMsIHRoaXMuaW5wdXRUZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSAgdGhpcy5kcm9wZG93blZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVNlYXJjaFRlcm1DaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkVmFsdWVzID0gdGhpcy5maWx0ZXJGbih0aGlzLmRyb3Bkb3duVmFsdWVzLCB0aGlzLmlucHV0VGV4dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWZhdWx0RmlsdGVyKGNvbnRlbnRBcnJheTogYW55W10sIHNlYXJjaFRlcm06IHN0cmluZyk6IGFueVtdIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hUZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBjb250ZW50QXJyYXkuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoTG93ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=