UNPKG

@neocomplexx/ngx-neo-completer

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

256 lines 31.2 kB
import { __decorate, __metadata, __param } from "tslib"; import { ChangeDetectorRef, Directive, Host, Input, TemplateRef, ViewContainerRef } from '@angular/core'; import { timer } from 'rxjs'; import { catchError, take } from 'rxjs/operators'; import { CtrCompleter } from './ctr-completer'; import { MIN_SEARCH_LENGTH, PAUSE, CLEAR_TIMEOUT, isNil } from '../globals'; var CtrListContext = /** @class */ (function () { function CtrListContext(results, searching, searchInitialized, isOpen) { this.results = results; this.searching = searching; this.searchInitialized = searchInitialized; this.isOpen = isOpen; } return CtrListContext; }()); export { CtrListContext }; var CtrList = /** @class */ (function () { function CtrList(completer, templateRef, viewContainer, cd) { this.completer = completer; this.templateRef = templateRef; this.viewContainer = viewContainer; this.cd = cd; this.ctrListMinSearchLength = MIN_SEARCH_LENGTH; this.ctrListPause = PAUSE; this.ctrListAutoMatch = false; this.ctrListAutoHighlight = false; this.ctrListDisplaySearching = true; // private results: CompleterItem[] = []; this.term = null; // private searching = false; this.searchTimer = null; this.clearTimer = null; this.ctx = new CtrListContext([], false, false, false); this._initialValue = null; this.viewRef = null; } CtrList.prototype.ngOnInit = function () { this.completer.registerList(this); this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, new CtrListContext([], false, false, false)); }; Object.defineProperty(CtrList.prototype, "dataService", { set: function (newService) { this._dataService = newService; this.dataServiceSubscribe(); }, enumerable: true, configurable: true }); Object.defineProperty(CtrList.prototype, "initialValue", { set: function (value) { var _this = this; if (this._dataService && typeof this._dataService.convertToItem === 'function') { setTimeout(function () { var initialItem = _this._dataService.convertToItem(value); if (initialItem) { _this.completer.onSelected(initialItem, false); } }); } else if (!this._dataService) { this._initialValue = value; } }, enumerable: true, configurable: true }); CtrList.prototype.search = function (term) { var _this = this; if (!isNil(term) && term.length >= this.ctrListMinSearchLength && this.term !== term) { if (this.searchTimer) { this.searchTimer.unsubscribe(); this.searchTimer = null; } if (!this.ctx.searching) { if (this.ctrListDisplaySearching) { this.ctx.results = []; } this.ctx.searching = true; this.ctx.searchInitialized = true; this.refreshTemplate(); } if (this.clearTimer) { this.clearTimer.unsubscribe(); } this.searchTimer = timer(this.ctrListPause).pipe(take(1)).subscribe(function () { _this.searchTimerComplete(term); }); } else if (!isNil(term) && term.length < this.ctrListMinSearchLength) { this.clear(); this.term = ''; } }; CtrList.prototype.clear = function () { var _this = this; if (this.searchTimer) { this.searchTimer.unsubscribe(); } this.clearTimer = timer(CLEAR_TIMEOUT).pipe(take(1)).subscribe(function () { _this._clear(); }); }; CtrList.prototype.open = function () { if (!this.ctx.searchInitialized) { this.search(''); } this.refreshTemplate(); }; CtrList.prototype.isOpen = function (open) { this.ctx.isOpen = open; }; CtrList.prototype._clear = function () { if (this.searchTimer) { this.searchTimer.unsubscribe(); this.searchTimer = null; } if (this.dataService) { this.dataService.cancel(); } this.viewContainer.clear(); this.viewRef = null; }; CtrList.prototype.searchTimerComplete = function (term) { // Begin the search if (isNil(term) || term.length < this.ctrListMinSearchLength) { this.ctx.searching = false; return; } this.term = term; this._dataService.search(term); }; CtrList.prototype.refreshTemplate = function () { // create the template if it doesn't exist if (!this.viewRef) { this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, this.ctx); } else if (!this.viewRef.destroyed) { // refresh the template this.viewRef.context.isOpen = this.ctx.isOpen; this.viewRef.context.results = this.ctx.results; this.viewRef.context.searching = this.ctx.searching; this.viewRef.context.searchInitialized = this.ctx.searchInitialized; this.viewRef.detectChanges(); } this.cd.markForCheck(); }; CtrList.prototype.getBestMatchIndex = function () { var _this = this; if (!this.ctx.results || !this.term) { return null; } // First try to find the exact term var bestMatch = this.ctx.results.findIndex(function (item) { return item.title.toLowerCase() === _this.term.toLocaleLowerCase(); }); // If not try to find the first item that starts with the term if (bestMatch < 0) { bestMatch = this.ctx.results.findIndex(function (item) { return item.title.toLowerCase().startsWith(_this.term.toLocaleLowerCase()); }); } // If not try to find the first item that includes the term if (bestMatch < 0) { bestMatch = this.ctx.results.findIndex(function (item) { return item.title.toLowerCase().includes(_this.term.toLocaleLowerCase()); }); } return bestMatch < 0 ? null : bestMatch; }; CtrList.prototype.dataServiceSubscribe = function () { var _this = this; if (this._dataService) { this._dataService.pipe(catchError(function (err) { console.error(err); console.error('Unexpected error in dataService: errors should be handled by the dataService Observable'); return []; })) .subscribe(function (results) { _this.ctx.searchInitialized = true; _this.ctx.searching = false; _this.ctx.results = results; if (_this.ctrListAutoMatch && results && results.length === 1 && results[0].title && !isNil(_this.term) && results[0].title.toLocaleLowerCase() === _this.term.toLocaleLowerCase()) { // Do automatch _this.completer.onSelected(results[0]); return; } if (_this._initialValue) { _this.initialValue = _this._initialValue; _this._initialValue = null; } _this.refreshTemplate(); if (_this.ctrListAutoHighlight) { _this.completer.autoHighlightIndex = _this.getBestMatchIndex(); } }); if (this._dataService.dataSourceChange) { this._dataService.dataSourceChange.subscribe(function () { _this.term = null; _this.ctx.searchInitialized = false; _this.ctx.searching = false; _this.ctx.results = []; _this.refreshTemplate(); _this.completer.onDataSourceChange(); }); } } }; CtrList.ctorParameters = function () { return [ { type: CtrCompleter, decorators: [{ type: Host }] }, { type: TemplateRef }, { type: ViewContainerRef }, { type: ChangeDetectorRef } ]; }; __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListMinSearchLength", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListPause", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListAutoMatch", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListAutoHighlight", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CtrList.prototype, "ctrListDisplaySearching", void 0); __decorate([ Input('ctrList'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], CtrList.prototype, "dataService", null); __decorate([ Input('ctrListInitialValue'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], CtrList.prototype, "initialValue", null); CtrList = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[ctrList]', }) // tslint:disable:no-non-null-assertion // tslint:disable-next-line:directive-class-suffix , __param(0, Host()), __metadata("design:paramtypes", [CtrCompleter, TemplateRef, ViewContainerRef, ChangeDetectorRef]) ], CtrList); return CtrList; }()); export { CtrList }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWxpc3QuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1jb21wbGV0ZXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy9jdHItbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUU7SUFDSSx3QkFDVyxPQUErQixFQUMvQixTQUFrQixFQUNsQixpQkFBMEIsRUFDMUIsTUFBZTtRQUhmLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDbEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFTO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVM7SUFDdEIsQ0FBQztJQUNULHFCQUFDO0FBQUQsQ0FBQyxBQVBELElBT0M7O0FBUUQ7SUFpQkksaUJBQ29CLFNBQXVCLEVBQy9CLFdBQXdDLEVBQ3hDLGFBQStCLEVBQy9CLEVBQXFCO1FBSGIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBNkI7UUFDeEMsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBcEJqQiwyQkFBc0IsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixx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QUM7OzsrQ0FZNUI7SUFqRFEsT0FBTztRQU5uQixTQUFTLENBQUM7WUFDUCw4Q0FBOEM7WUFDOUMsUUFBUSxFQUFFLFdBQVc7U0FDeEIsQ0FBQztRQUNGLHVDQUF1QztRQUN2QyxrREFBa0Q7O1FBbUJ6QyxXQUFBLElBQUksRUFBRSxDQUFBO3lDQUFvQixZQUFZO1lBQ2xCLFdBQVc7WUFDVCxnQkFBZ0I7WUFDM0IsaUJBQWlCO09BckJ4QixPQUFPLENBMk1uQjtJQUFELGNBQUM7Q0FBQSxBQTNNRCxJQTJNQztTQTNNWSxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSG9zdCwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEVtYmVkZGVkVmlld1JlZiwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDdHJDb21wbGV0ZXIgfSBmcm9tICcuL2N0ci1jb21wbGV0ZXInO1xuaW1wb3J0IHR5cGUgeyBDb21wbGV0ZXJMaXN0IH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcbmltcG9ydCB7IENvbXBsZXRlckRhdGEgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb21wbGV0ZXItZGF0YSc7XG5pbXBvcnQgeyBDb21wbGV0ZXJJdGVtIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wbGV0ZXItaXRlbSc7XG5pbXBvcnQgeyBNSU5fU0VBUkNIX0xFTkdUSCwgUEFVU0UsIENMRUFSX1RJTUVPVVQsIGlzTmlsIH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5cbmV4cG9ydCBjbGFzcyBDdHJMaXN0Q29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZXN1bHRzOiBDb21wbGV0ZXJJdGVtW10gfCBudWxsLFxuICAgICAgICBwdWJsaWMgc2VhcmNoaW5nOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgc2VhcmNoSW5pdGlhbGl6ZWQ6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyBpc09wZW46IGJvb2xlYW5cbiAgICApIHsgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbY3RyTGlzdF0nLFxufSlcbi8vIHRzbGludDpkaXNhYmxlOm5vLW5vbi1udWxsLWFzc2VydGlvblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDdHJMaXN0IGltcGxlbWVudHMgT25Jbml0LCBDb21wbGV0ZXJMaXN0IHtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdE1pblNlYXJjaExlbmd0aCA9IE1JTl9TRUFSQ0hfTEVOR1RIO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjdHJMaXN0UGF1c2UgPSBQQVVTRTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdEF1dG9NYXRjaCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjdHJMaXN0QXV0b0hpZ2hsaWdodCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjdHJMaXN0RGlzcGxheVNlYXJjaGluZyA9IHRydWU7XG5cbiAgICBwcml2YXRlIF9kYXRhU2VydmljZTogQ29tcGxldGVyRGF0YTtcbiAgICAvLyBwcml2YXRlIHJlc3VsdHM6IENvbXBsZXRlckl0ZW1bXSA9IFtdO1xuICAgIHByaXZhdGUgdGVybTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLy8gcHJpdmF0ZSBzZWFyY2hpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIHNlYXJjaFRpbWVyOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNsZWFyVGltZXI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY3R4ID0gbmV3IEN0ckxpc3RDb250ZXh0KFtdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcbiAgICBwcml2YXRlIF9pbml0aWFsVmFsdWU6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSB2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8Q3RyTGlzdENvbnRleHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEhvc3QoKSBwcml2YXRlIGNvbXBsZXRlcjogQ3RyQ29tcGxldGVyLFxuICAgICAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxDdHJMaXN0Q29udGV4dD4sXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5yZWdpc3Rlckxpc3QodGhpcyk7XG4gICAgICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgbmV3IEN0ckxpc3RDb250ZXh0KFtdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIEBJbnB1dCgnY3RyTGlzdCcpXG4gICAgcHVibGljIHNldCBkYXRhU2VydmljZShuZXdTZXJ2aWNlOiBDb21wbGV0ZXJEYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGFTZXJ2aWNlID0gbmV3U2VydmljZTtcbiAgICAgICAgdGhpcy5kYXRhU2VydmljZVN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIEBJbnB1dCgnY3RyTGlzdEluaXRpYWxWYWx1ZScpXG4gICAgcHVibGljIHNldCBpbml0aWFsVmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YVNlcnZpY2UgJiYgdHlwZW9mIHRoaXMuX2RhdGFTZXJ2aWNlLmNvbnZlcnRUb0l0ZW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gdGhpcy5fZGF0YVNlcnZpY2UuY29udmVydFRvSXRlbSEodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vblNlbGVjdGVkKGluaXRpYWxJdGVtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2RhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWFyY2godGVybTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghaXNOaWwodGVybSkgJiYgdGVybS5sZW5ndGggPj0gdGhpcy5jdHJMaXN0TWluU2VhcmNoTGVuZ3RoICYmIHRoaXMudGVybSAhPT0gdGVybSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3R4LnNlYXJjaGluZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN0ckxpc3REaXNwbGF5U2VhcmNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyVGltZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIgPSB0aW1lcih0aGlzLmN0ckxpc3RQYXVzZSkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXJDb21wbGV0ZSh0ZXJtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc05pbCh0ZXJtKSAmJiB0ZXJtLmxlbmd0aCA8IHRoaXMuY3RyTGlzdE1pblNlYXJjaExlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy50ZXJtID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhclRpbWVyID0gdGltZXIoQ0xFQVJfVElNRU9VVCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW4oKSB7XG4gICAgICAgIGlmICghdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCcnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc09wZW4ob3BlbjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmN0eC5pc09wZW4gPSBvcGVuO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YVNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UuY2FuY2VsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy52aWV3UmVmID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlYXJjaFRpbWVyQ29tcGxldGUodGVybTogc3RyaW5nKSB7XG4gICAgICAgIC8vIEJlZ2luIHRoZSBzZWFyY2hcbiAgICAgICAgaWYgKGlzTmlsKHRlcm0pIHx8IHRlcm0ubGVuZ3RoIDwgdGhpcy5jdHJMaXN0TWluU2VhcmNoTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5zZWFyY2godGVybSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWZyZXNoVGVtcGxhdGUoKSB7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICBpZiAoIXRoaXMudmlld1JlZikge1xuICAgICAgICAgICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgICAgIHRoaXMuY3R4XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnZpZXdSZWYuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAvLyByZWZyZXNoIHRoZSB0ZW1wbGF0ZVxuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LmlzT3BlbiA9IHRoaXMuY3R4LmlzT3BlbjtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiEuY29udGV4dC5yZXN1bHRzID0gdGhpcy5jdHgucmVzdWx0cztcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiEuY29udGV4dC5zZWFyY2hpbmcgPSB0aGlzLmN0eC5zZWFyY2hpbmc7XG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQuc2VhcmNoSW5pdGlhbGl6ZWQgPSB0aGlzLmN0eC5zZWFyY2hJbml0aWFsaXplZDtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJlc3RNYXRjaEluZGV4KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3R4LnJlc3VsdHMgfHwgIXRoaXMudGVybSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCB0cnkgdG8gZmluZCB0aGUgZXhhY3QgdGVybVxuICAgICAgICBsZXQgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgIC8vIElmIG5vdCB0cnkgdG8gZmluZCB0aGUgZmlyc3QgaXRlbSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSB0ZXJtXG4gICAgICAgIGlmIChiZXN0TWF0Y2ggPCAwKSB7XG4gICAgICAgICAgICBiZXN0TWF0Y2ggPSB0aGlzLmN0eC5yZXN1bHRzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0udGl0bGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vdCB0cnkgdG8gZmluZCB0aGUgZmlyc3QgaXRlbSB0aGF0IGluY2x1ZGVzIHRoZSB0ZXJtXG4gICAgICAgIGlmIChiZXN0TWF0Y2ggPCAwKSB7XG4gICAgICAgICAgICBiZXN0TWF0Y2ggPSB0aGlzLmN0eC5yZXN1bHRzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0udGl0bGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZXN0TWF0Y2ggPCAwID8gbnVsbCA6IGJlc3RNYXRjaDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlU3Vic2NyaWJlKCkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YVNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFTZXJ2aWNlLnBpcGUoXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gZGF0YVNlcnZpY2U6IGVycm9ycyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgZGF0YVNlcnZpY2UgT2JzZXJ2YWJsZScpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gcmVzdWx0cztcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdHJMaXN0QXV0b01hdGNoICYmIHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDEgJiYgcmVzdWx0c1swXS50aXRsZSAmJiAhaXNOaWwodGhpcy50ZXJtKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1swXS50aXRsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSB0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIGF1dG9tYXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZChyZXN1bHRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlID0gdGhpcy5faW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3RyTGlzdEF1dG9IaWdobGlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLmF1dG9IaWdobGlnaHRJbmRleCA9IHRoaXMuZ2V0QmVzdE1hdGNoSW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZGF0YVNlcnZpY2UuZGF0YVNvdXJjZUNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFTZXJ2aWNlLmRhdGFTb3VyY2VDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXJtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==