UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

369 lines 29.9 kB
/** * @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=