UNPKG

@neocomplexx/ngx-neo-completer-mat

Version:
236 lines 31.8 kB
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'; import * as i0 from "@angular/core"; import * as i1 from "./ctr-completer"; 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 () { if (value) { 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.ɵfac = function CtrList_Factory(t) { return new (t || CtrList)(i0.ɵɵdirectiveInject(i1.CtrCompleter, 1), i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; CtrList.ɵdir = i0.ɵɵdefineDirective({ type: CtrList, selectors: [["", "ctrList", ""]], inputs: { ctrListMinSearchLength: "ctrListMinSearchLength", ctrListPause: "ctrListPause", ctrListAutoMatch: "ctrListAutoMatch", ctrListAutoHighlight: "ctrListAutoHighlight", ctrListDisplaySearching: "ctrListDisplaySearching", dataService: ["ctrList", "dataService"], initialValue: ["ctrListInitialValue", "initialValue"] } }); return CtrList; }()); export { CtrList }; /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(CtrList, [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ctrList]', }] }], function () { return [{ type: i1.CtrCompleter, decorators: [{ type: Host }] }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, { ctrListMinSearchLength: [{ type: Input }], ctrListPause: [{ type: Input }], ctrListAutoMatch: [{ type: Input }], ctrListAutoHighlight: [{ type: Input }], ctrListDisplaySearching: [{ type: Input }], dataService: [{ type: Input, args: ['ctrList'] }], initialValue: [{ type: Input, args: ['ctrListInitialValue'] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWxpc3QuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1jb21wbGV0ZXItbWF0LyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvY3RyLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUU1RTtJQUNJLHdCQUNXLE9BQStCLEVBQy9CLFNBQWtCLEVBQ2xCLGlCQUEwQixFQUMxQixNQUFlO1FBSGYsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUNsQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUN0QixDQUFDO0lBQ1QscUJBQUM7QUFBRCxDQUFDLEFBUEQsSUFPQzs7QUFFRDtJQXVCSSxpQkFDb0IsU0FBdUIsRUFDL0IsV0FBd0MsRUFDeEMsYUFBK0IsRUFDL0IsRUFBcUI7UUFIYixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQy9CLGdCQUFXLEdBQVgsV0FBVyxDQUE2QjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFwQmpCLDJCQUFzQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FB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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSG9zdCwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRWaWV3UmVmLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQ3RyQ29tcGxldGVyIH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcclxuaW1wb3J0IHR5cGUgeyBDb21wbGV0ZXJMaXN0IH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcclxuaW1wb3J0IHsgQ29tcGxldGVyRGF0YSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbXBsZXRlci1kYXRhJztcclxuaW1wb3J0IHsgQ29tcGxldGVySXRlbSB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tcGxldGVyLWl0ZW0nO1xyXG5pbXBvcnQgeyBNSU5fU0VBUkNIX0xFTkdUSCwgUEFVU0UsIENMRUFSX1RJTUVPVVQsIGlzTmlsIH0gZnJvbSAnLi4vZ2xvYmFscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3RyTGlzdENvbnRleHQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIHJlc3VsdHM6IENvbXBsZXRlckl0ZW1bXSB8IG51bGwsXHJcbiAgICAgICAgcHVibGljIHNlYXJjaGluZzogYm9vbGVhbixcclxuICAgICAgICBwdWJsaWMgc2VhcmNoSW5pdGlhbGl6ZWQ6IGJvb2xlYW4sXHJcbiAgICAgICAgcHVibGljIGlzT3BlbjogYm9vbGVhblxyXG4gICAgKSB7IH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ1tjdHJMaXN0XScsXHJcbn0pXHJcbi8vIHRzbGludDpkaXNhYmxlOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxyXG5leHBvcnQgY2xhc3MgQ3RyTGlzdCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29tcGxldGVyTGlzdCB7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdE1pblNlYXJjaExlbmd0aCA9IE1JTl9TRUFSQ0hfTEVOR1RIO1xyXG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RQYXVzZSA9IFBBVVNFO1xyXG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RBdXRvTWF0Y2ggPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdHJMaXN0QXV0b0hpZ2hsaWdodCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3REaXNwbGF5U2VhcmNoaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9kYXRhU2VydmljZTogQ29tcGxldGVyRGF0YTtcclxuICAgIC8vIHByaXZhdGUgcmVzdWx0czogQ29tcGxldGVySXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIHRlcm06IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgLy8gcHJpdmF0ZSBzZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgc2VhcmNoVGltZXI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjbGVhclRpbWVyOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgY3R4ID0gbmV3IEN0ckxpc3RDb250ZXh0KFtdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgIHByaXZhdGUgX2luaXRpYWxWYWx1ZTogYW55ID0gbnVsbDtcclxuICAgIHByaXZhdGUgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEN0ckxpc3RDb250ZXh0PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIEBIb3N0KCkgcHJpdmF0ZSBjb21wbGV0ZXI6IEN0ckNvbXBsZXRlcixcclxuICAgICAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxDdHJMaXN0Q29udGV4dD4sXHJcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIucmVnaXN0ZXJMaXN0KHRoaXMpO1xyXG4gICAgICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVSZWYsXHJcbiAgICAgICAgICAgIG5ldyBDdHJMaXN0Q29udGV4dChbXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnY3RyTGlzdCcpXHJcbiAgICBwdWJsaWMgc2V0IGRhdGFTZXJ2aWNlKG5ld1NlcnZpY2U6IENvbXBsZXRlckRhdGEpIHtcclxuICAgICAgICB0aGlzLl9kYXRhU2VydmljZSA9IG5ld1NlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5kYXRhU2VydmljZVN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgnY3RyTGlzdEluaXRpYWxWYWx1ZScpXHJcbiAgICBwdWJsaWMgc2V0IGluaXRpYWxWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlICYmIHR5cGVvZiB0aGlzLl9kYXRhU2VydmljZS5jb252ZXJ0VG9JdGVtID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbEl0ZW0gPSB0aGlzLl9kYXRhU2VydmljZS5jb252ZXJ0VG9JdGVtISh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uU2VsZWN0ZWQoaW5pdGlhbEl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2RhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VhcmNoKHRlcm06IHN0cmluZykge1xyXG4gICAgICAgIGlmICghaXNOaWwodGVybSkgJiYgdGVybS5sZW5ndGggPj0gdGhpcy5jdHJMaXN0TWluU2VhcmNoTGVuZ3RoICYmIHRoaXMudGVybSAhPT0gdGVybSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hUaW1lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmN0eC5zZWFyY2hpbmcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN0ckxpc3REaXNwbGF5U2VhcmNoaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgucmVzdWx0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2xlYXJUaW1lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lciA9IHRpbWVyKHRoaXMuY3RyTGlzdFBhdXNlKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyQ29tcGxldGUodGVybSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWlzTmlsKHRlcm0pICYmIHRlcm0ubGVuZ3RoIDwgdGhpcy5jdHJMaXN0TWluU2VhcmNoTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy50ZXJtID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUaW1lcikge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2xlYXJUaW1lciA9IHRpbWVyKENMRUFSX1RJTUVPVVQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2xlYXIoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlbigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3R4LnNlYXJjaEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNPcGVuKG9wZW46IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmN0eC5pc09wZW4gPSBvcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NsZWFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UuY2FuY2VsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLnZpZXdSZWYgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VhcmNoVGltZXJDb21wbGV0ZSh0ZXJtOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBCZWdpbiB0aGUgc2VhcmNoXHJcbiAgICAgICAgaWYgKGlzTmlsKHRlcm0pIHx8IHRlcm0ubGVuZ3RoIDwgdGhpcy5jdHJMaXN0TWluU2VhcmNoTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGVybSA9IHRlcm07XHJcbiAgICAgICAgdGhpcy5fZGF0YVNlcnZpY2Uuc2VhcmNoKHRlcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVmcmVzaFRlbXBsYXRlKCkge1xyXG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWYgaXQgZG9lc24ndCBleGlzdFxyXG4gICAgICAgIGlmICghdGhpcy52aWV3UmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUmVmLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnZpZXdSZWYuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIHRlbXBsYXRlXHJcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiEuY29udGV4dC5pc09wZW4gPSB0aGlzLmN0eC5pc09wZW47XHJcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiEuY29udGV4dC5yZXN1bHRzID0gdGhpcy5jdHgucmVzdWx0cztcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LnNlYXJjaGluZyA9IHRoaXMuY3R4LnNlYXJjaGluZztcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LnNlYXJjaEluaXRpYWxpemVkID0gdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMudmlld1JlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRCZXN0TWF0Y2hJbmRleCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3R4LnJlc3VsdHMgfHwgIXRoaXMudGVybSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZpcnN0IHRyeSB0byBmaW5kIHRoZSBleGFjdCB0ZXJtXHJcbiAgICAgICAgbGV0IGJlc3RNYXRjaCA9IHRoaXMuY3R4LnJlc3VsdHMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50aXRsZS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIC8vIElmIG5vdCB0cnkgdG8gZmluZCB0aGUgZmlyc3QgaXRlbSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSB0ZXJtXHJcbiAgICAgICAgaWYgKGJlc3RNYXRjaCA8IDApIHtcclxuICAgICAgICAgICAgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgbm90IHRyeSB0byBmaW5kIHRoZSBmaXJzdCBpdGVtIHRoYXQgaW5jbHVkZXMgdGhlIHRlcm1cclxuICAgICAgICBpZiAoYmVzdE1hdGNoIDwgMCkge1xyXG4gICAgICAgICAgICBiZXN0TWF0Y2ggPSB0aGlzLmN0eC5yZXN1bHRzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0udGl0bGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBiZXN0TWF0Y2ggPCAwID8gbnVsbCA6IGJlc3RNYXRjaDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlU3Vic2NyaWJlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIGRhdGFTZXJ2aWNlOiBlcnJvcnMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGRhdGFTZXJ2aWNlIE9ic2VydmFibGUnKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gcmVzdWx0cztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3RyTGlzdEF1dG9NYXRjaCAmJiByZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID09PSAxICYmIHJlc3VsdHNbMF0udGl0bGUgJiYgIWlzTmlsKHRoaXMudGVybSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1swXS50aXRsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSB0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gYXV0b21hdGNoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uU2VsZWN0ZWQocmVzdWx0c1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSB0aGlzLl9pbml0aWFsVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdHJMaXN0QXV0b0hpZ2hsaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5hdXRvSGlnaGxpZ2h0SW5kZXggPSB0aGlzLmdldEJlc3RNYXRjaEluZGV4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGF0YVNlcnZpY2UuZGF0YVNvdXJjZUNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YVNlcnZpY2UuZGF0YVNvdXJjZUNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVybSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vbkRhdGFTb3VyY2VDaGFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=