@neocomplexx/ngx-neo-completer-mat
Version:
221 lines • 30.6 kB
JavaScript
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";
export class CtrListContext {
constructor(results, searching, searchInitialized, isOpen) {
this.results = results;
this.searching = searching;
this.searchInitialized = searchInitialized;
this.isOpen = isOpen;
}
}
// tslint:disable:no-non-null-assertion
// tslint:disable-next-line:directive-class-suffix
export class CtrList {
constructor(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;
}
ngOnInit() {
this.completer.registerList(this);
this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, new CtrListContext([], false, false, false));
}
set dataService(newService) {
this._dataService = newService;
this.dataServiceSubscribe();
}
set initialValue(value) {
if (this._dataService && typeof this._dataService.convertToItem === 'function') {
setTimeout(() => {
if (value) {
const initialItem = this._dataService.convertToItem(value);
if (initialItem) {
this.completer.onSelected(initialItem, false);
}
}
});
}
else if (!this._dataService) {
this._initialValue = value;
}
}
search(term) {
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(() => {
this.searchTimerComplete(term);
});
}
else if (!isNil(term) && term.length < this.ctrListMinSearchLength) {
this.clear();
this.term = '';
}
}
clear() {
if (this.searchTimer) {
this.searchTimer.unsubscribe();
}
this.clearTimer = timer(CLEAR_TIMEOUT).pipe(take(1)).subscribe(() => {
this._clear();
});
}
open() {
if (!this.ctx.searchInitialized) {
this.search('');
}
this.refreshTemplate();
}
isOpen(open) {
this.ctx.isOpen = open;
}
_clear() {
if (this.searchTimer) {
this.searchTimer.unsubscribe();
this.searchTimer = null;
}
if (this.dataService) {
this.dataService.cancel();
}
this.viewContainer.clear();
this.viewRef = null;
}
searchTimerComplete(term) {
// Begin the search
if (isNil(term) || term.length < this.ctrListMinSearchLength) {
this.ctx.searching = false;
return;
}
this.term = term;
this._dataService.search(term);
}
refreshTemplate() {
// 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();
}
getBestMatchIndex() {
if (!this.ctx.results || !this.term) {
return null;
}
// First try to find the exact term
let bestMatch = this.ctx.results.findIndex(item => 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(item => 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(item => item.title.toLowerCase().includes(this.term.toLocaleLowerCase()));
}
return bestMatch < 0 ? null : bestMatch;
}
dataServiceSubscribe() {
if (this._dataService) {
this._dataService.pipe(catchError(err => {
console.error(err);
console.error('Unexpected error in dataService: errors should be handled by the dataService Observable');
return [];
}))
.subscribe(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(() => {
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"] } });
/*@__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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWxpc3QuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1jb21wbGV0ZXItbWF0LyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvY3RyLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUU1RSxNQUFNLE9BQU8sY0FBYztJQUN2QixZQUNXLE9BQStCLEVBQy9CLFNBQWtCLEVBQ2xCLGlCQUEwQixFQUMxQixNQUFlO1FBSGYsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUNsQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUN0QixDQUFDO0NBQ1I7QUFNRCx1Q0FBdUM7QUFDdkMsa0RBQWtEO0FBQ2xELE1BQU0sT0FBTyxPQUFPO0lBaUJoQixZQUNvQixTQUF1QixFQUMvQixXQUF3QyxFQUN4QyxhQUErQixFQUMvQixFQUFxQjtRQUhiLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXBCakIsMkJBQXNCLEdBQUcsaUJBQWlCLENBQUM7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ZSxFQUFFLENBQUM7Z0JBRXZCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUNoRTtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRVAsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2dCQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO29CQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztvQkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7SUFDTCxDQUFDOzs4REEzTVEsT0FBTzs0Q0FBUCxPQUFPO2tEQUFQLE9BQU87Y0FObkIsU0FBUztlQUFDO2dCQUNQLDhDQUE4QztnQkFDOUMsUUFBUSxFQUFFLFdBQVc7YUFDeEI7O3NCQXFCUSxJQUFJOztrQkFqQlIsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBMEJMLEtBQUs7bUJBQUMsU0FBUzs7a0JBTWYsS0FBSzttQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBIb3N0LCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHR5cGUgeyBFbWJlZGRlZFZpZXdSZWYsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDdHJDb21wbGV0ZXIgfSBmcm9tICcuL2N0ci1jb21wbGV0ZXInO1xyXG5pbXBvcnQgdHlwZSB7IENvbXBsZXRlckxpc3QgfSBmcm9tICcuL2N0ci1jb21wbGV0ZXInO1xyXG5pbXBvcnQgeyBDb21wbGV0ZXJEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY29tcGxldGVyLWRhdGEnO1xyXG5pbXBvcnQgeyBDb21wbGV0ZXJJdGVtIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wbGV0ZXItaXRlbSc7XHJcbmltcG9ydCB7IE1JTl9TRUFSQ0hfTEVOR1RILCBQQVVTRSwgQ0xFQVJfVElNRU9VVCwgaXNOaWwgfSBmcm9tICcuLi9nbG9iYWxzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDdHJMaXN0Q29udGV4dCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgcmVzdWx0czogQ29tcGxldGVySXRlbVtdIHwgbnVsbCxcclxuICAgICAgICBwdWJsaWMgc2VhcmNoaW5nOiBib29sZWFuLFxyXG4gICAgICAgIHB1YmxpYyBzZWFyY2hJbml0aWFsaXplZDogYm9vbGVhbixcclxuICAgICAgICBwdWJsaWMgaXNPcGVuOiBib29sZWFuXHJcbiAgICApIHsgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICAgIHNlbGVjdG9yOiAnW2N0ckxpc3RdJyxcclxufSlcclxuLy8gdHNsaW50OmRpc2FibGU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XHJcbmV4cG9ydCBjbGFzcyBDdHJMaXN0IGltcGxlbWVudHMgT25Jbml0LCBDb21wbGV0ZXJMaXN0IHtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdHJMaXN0TWluU2VhcmNoTGVuZ3RoID0gTUlOX1NFQVJDSF9MRU5HVEg7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdFBhdXNlID0gUEFVU0U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdEF1dG9NYXRjaCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RBdXRvSGlnaGxpZ2h0ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdERpc3BsYXlTZWFyY2hpbmcgPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX2RhdGFTZXJ2aWNlOiBDb21wbGV0ZXJEYXRhO1xyXG4gICAgLy8gcHJpdmF0ZSByZXN1bHRzOiBDb21wbGV0ZXJJdGVtW10gPSBbXTtcclxuICAgIHByaXZhdGUgdGVybTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvLyBwcml2YXRlIHNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lcjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIGNsZWFyVGltZXI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjdHggPSBuZXcgQ3RyTGlzdENvbnRleHQoW10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8Q3RyTGlzdENvbnRleHQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEhvc3QoKSBwcml2YXRlIGNvbXBsZXRlcjogQ3RyQ29tcGxldGVyLFxyXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPEN0ckxpc3RDb250ZXh0PixcclxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmNvbXBsZXRlci5yZWdpc3Rlckxpc3QodGhpcyk7XHJcbiAgICAgICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhcclxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZixcclxuICAgICAgICAgICAgbmV3IEN0ckxpc3RDb250ZXh0KFtdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCdjdHJMaXN0JylcclxuICAgIHB1YmxpYyBzZXQgZGF0YVNlcnZpY2UobmV3U2VydmljZTogQ29tcGxldGVyRGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2RhdGFTZXJ2aWNlID0gbmV3U2VydmljZTtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlU3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCdjdHJMaXN0SW5pdGlhbFZhbHVlJylcclxuICAgIHB1YmxpYyBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGF0YVNlcnZpY2UgJiYgdHlwZW9mIHRoaXMuX2RhdGFTZXJ2aWNlLmNvbnZlcnRUb0l0ZW0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IHRoaXMuX2RhdGFTZXJ2aWNlLmNvbnZlcnRUb0l0ZW0hKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZChpbml0aWFsSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZWFyY2godGVybTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFpc05pbCh0ZXJtKSAmJiB0ZXJtLmxlbmd0aCA+PSB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGggJiYgdGhpcy50ZXJtICE9PSB0ZXJtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY3R4LnNlYXJjaGluZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3RyTGlzdERpc3BsYXlTZWFyY2hpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclRpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gdGltZXIodGhpcy5jdHJMaXN0UGF1c2UpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXJDb21wbGV0ZSh0ZXJtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwodGVybSkgJiYgdGVybS5sZW5ndGggPCB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnRlcm0gPSAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGVhclRpbWVyID0gdGltZXIoQ0xFQVJfVElNRU9VVCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGVhcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVuKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2goJycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc09wZW4ob3BlbjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuY3R4LmlzT3BlbiA9IG9wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2xlYXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5jYW5jZWwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMudmlld1JlZiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lckNvbXBsZXRlKHRlcm06IHN0cmluZykge1xyXG4gICAgICAgIC8vIEJlZ2luIHRoZSBzZWFyY2hcclxuICAgICAgICBpZiAoaXNOaWwodGVybSkgfHwgdGVybS5sZW5ndGggPCB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcclxuICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5zZWFyY2godGVybSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWZyZXNoVGVtcGxhdGUoKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0XHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVSZWYsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmlld1JlZi5kZXN0cm95ZWQpIHtcclxuICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgdGVtcGxhdGVcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LmlzT3BlbiA9IHRoaXMuY3R4LmlzT3BlbjtcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LnJlc3VsdHMgPSB0aGlzLmN0eC5yZXN1bHRzO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQuc2VhcmNoaW5nID0gdGhpcy5jdHguc2VhcmNoaW5nO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQuc2VhcmNoSW5pdGlhbGl6ZWQgPSB0aGlzLmN0eC5zZWFyY2hJbml0aWFsaXplZDtcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJlc3RNYXRjaEluZGV4KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jdHgucmVzdWx0cyB8fCAhdGhpcy50ZXJtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIGV4YWN0IHRlcm1cclxuICAgICAgICBsZXQgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgLy8gSWYgbm90IHRyeSB0byBmaW5kIHRoZSBmaXJzdCBpdGVtIHRoYXQgc3RhcnRzIHdpdGggdGhlIHRlcm1cclxuICAgICAgICBpZiAoYmVzdE1hdGNoIDwgMCkge1xyXG4gICAgICAgICAgICBiZXN0TWF0Y2ggPSB0aGlzLmN0eC5yZXN1bHRzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0udGl0bGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBub3QgdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBpbmNsdWRlcyB0aGUgdGVybVxyXG4gICAgICAgIGlmIChiZXN0TWF0Y2ggPCAwKSB7XHJcbiAgICAgICAgICAgIGJlc3RNYXRjaCA9IHRoaXMuY3R4LnJlc3VsdHMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50aXRsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJlc3RNYXRjaCA8IDAgPyBudWxsIDogYmVzdE1hdGNoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2VTdWJzY3JpYmUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFTZXJ2aWNlLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gZGF0YVNlcnZpY2U6IGVycm9ycyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgZGF0YVNlcnZpY2UgT2JzZXJ2YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnJlc3VsdHMgPSByZXN1bHRzO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdHJMaXN0QXV0b01hdGNoICYmIHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDEgJiYgcmVzdWx0c1swXS50aXRsZSAmJiAhaXNOaWwodGhpcy50ZXJtKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWzBdLnRpdGxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBhdXRvbWF0Y2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZChyZXN1bHRzWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuX2luaXRpYWxWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN0ckxpc3RBdXRvSGlnaGxpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLmF1dG9IaWdobGlnaHRJbmRleCA9IHRoaXMuZ2V0QmVzdE1hdGNoSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhU2VydmljZS5kYXRhU291cmNlQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5kYXRhU291cmNlQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXJtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnJlc3VsdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==