@neocomplexx/ngx-neo-completer
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
243 lines • 29.9 kB
JavaScript
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';
export class CtrListContext {
constructor(results, searching, searchInitialized, isOpen) {
this.results = results;
this.searching = searching;
this.searchInitialized = searchInitialized;
this.isOpen = isOpen;
}
}
let CtrList =
// tslint:disable:no-non-null-assertion
// tslint:disable-next-line:directive-class-suffix
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(() => {
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.ctorParameters = () => [
{ 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);
export { CtrList };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWxpc3QuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1jb21wbGV0ZXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy9jdHItbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUUsTUFBTSxPQUFPLGNBQWM7SUFDdkIsWUFDVyxPQUErQixFQUMvQixTQUFrQixFQUNsQixpQkFBMEIsRUFDMUIsTUFBZTtRQUhmLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDbEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFTO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQVM7SUFDdEIsQ0FBQztDQUNSO0FBUUQsSUFBYSxPQUFPO0FBRnBCLHVDQUF1QztBQUN2QyxrREFBa0Q7QUFDbEQsTUFBYSxPQUFPO0lBaUJoQixZQUNvQixTQUF1QixFQUMvQixXQUF3QyxFQUN4QyxhQUErQixFQUMvQixFQUFxQjtRQUhiLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXBCakIsMkJBQXNCLEdBQUcsaUJBQWlC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SUFDdkMsa0RBQWtEOztJQW1CekMsV0FBQSxJQUFJLEVBQUUsQ0FBQTtxQ0FBb0IsWUFBWTtRQUNsQixXQUFXO1FBQ1QsZ0JBQWdCO1FBQzNCLGlCQUFpQjtHQXJCeEIsT0FBTyxDQTJNbkI7U0EzTVksT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEhvc3QsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBFbWJlZGRlZFZpZXdSZWYsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ3RyQ29tcGxldGVyIH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcbmltcG9ydCB0eXBlIHsgQ29tcGxldGVyTGlzdCB9IGZyb20gJy4vY3RyLWNvbXBsZXRlcic7XG5pbXBvcnQgeyBDb21wbGV0ZXJEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY29tcGxldGVyLWRhdGEnO1xuaW1wb3J0IHsgQ29tcGxldGVySXRlbSB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tcGxldGVyLWl0ZW0nO1xuaW1wb3J0IHsgTUlOX1NFQVJDSF9MRU5HVEgsIFBBVVNFLCBDTEVBUl9USU1FT1VULCBpc05pbCB9IGZyb20gJy4uL2dsb2JhbHMnO1xuXG5leHBvcnQgY2xhc3MgQ3RyTGlzdENvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVzdWx0czogQ29tcGxldGVySXRlbVtdIHwgbnVsbCxcbiAgICAgICAgcHVibGljIHNlYXJjaGluZzogYm9vbGVhbixcbiAgICAgICAgcHVibGljIHNlYXJjaEluaXRpYWxpemVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgaXNPcGVuOiBib29sZWFuXG4gICAgKSB7IH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2N0ckxpc3RdJyxcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1ub24tbnVsbC1hc3NlcnRpb25cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ3RyTGlzdCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29tcGxldGVyTGlzdCB7XG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RNaW5TZWFyY2hMZW5ndGggPSBNSU5fU0VBUkNIX0xFTkdUSDtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdFBhdXNlID0gUEFVU0U7XG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RBdXRvTWF0Y2ggPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdEF1dG9IaWdobGlnaHQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdERpc3BsYXlTZWFyY2hpbmcgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBfZGF0YVNlcnZpY2U6IENvbXBsZXRlckRhdGE7XG4gICAgLy8gcHJpdmF0ZSByZXN1bHRzOiBDb21wbGV0ZXJJdGVtW10gPSBbXTtcbiAgICBwcml2YXRlIHRlcm06IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIHByaXZhdGUgc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lcjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBjbGVhclRpbWVyOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGN0eCA9IG5ldyBDdHJMaXN0Q29udGV4dChbXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgcHJpdmF0ZSBfaW5pdGlhbFZhbHVlOiBhbnkgPSBudWxsO1xuICAgIHByaXZhdGUgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEN0ckxpc3RDb250ZXh0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBIb3N0KCkgcHJpdmF0ZSBjb21wbGV0ZXI6IEN0ckNvbXBsZXRlcixcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8Q3RyTGlzdENvbnRleHQ+LFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIucmVnaXN0ZXJMaXN0KHRoaXMpO1xuICAgICAgICB0aGlzLnZpZXdSZWYgPSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgIG5ldyBDdHJMaXN0Q29udGV4dChbXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBASW5wdXQoJ2N0ckxpc3QnKVxuICAgIHB1YmxpYyBzZXQgZGF0YVNlcnZpY2UobmV3U2VydmljZTogQ29tcGxldGVyRGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhU2VydmljZSA9IG5ld1NlcnZpY2U7XG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2VTdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBASW5wdXQoJ2N0ckxpc3RJbml0aWFsVmFsdWUnKVxuICAgIHB1YmxpYyBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlICYmIHR5cGVvZiB0aGlzLl9kYXRhU2VydmljZS5jb252ZXJ0VG9JdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IHRoaXMuX2RhdGFTZXJ2aWNlLmNvbnZlcnRUb0l0ZW0hKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZChpbml0aWFsSXRlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9kYXRhU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoKHRlcm06IHN0cmluZykge1xuICAgICAgICBpZiAoIWlzTmlsKHRlcm0pICYmIHRlcm0ubGVuZ3RoID49IHRoaXMuY3RyTGlzdE1pblNlYXJjaExlbmd0aCAmJiB0aGlzLnRlcm0gIT09IHRlcm0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmN0eC5zZWFyY2hpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdHJMaXN0RGlzcGxheVNlYXJjaGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclRpbWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gdGltZXIodGhpcy5jdHJMaXN0UGF1c2UpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyQ29tcGxldGUodGVybSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwodGVybSkgJiYgdGVybS5sZW5ndGggPCB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMudGVybSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lciA9IHRpbWVyKENMRUFSX1RJTUVPVVQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuKCkge1xuICAgICAgICBpZiAoIXRoaXMuY3R4LnNlYXJjaEluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jdHguaXNPcGVuID0gb3BlbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhcigpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLmNhbmNlbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudmlld1JlZiA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lckNvbXBsZXRlKHRlcm06IHN0cmluZykge1xuICAgICAgICAvLyBCZWdpbiB0aGUgc2VhcmNoXG4gICAgICAgIGlmIChpc05pbCh0ZXJtKSB8fCB0ZXJtLmxlbmd0aCA8IHRoaXMuY3RyTGlzdE1pblNlYXJjaExlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICAgICAgdGhpcy5fZGF0YVNlcnZpY2Uuc2VhcmNoKHRlcm0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaFRlbXBsYXRlKCkge1xuICAgICAgICAvLyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdSZWYpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICB0aGlzLmN0eFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy52aWV3UmVmLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgdGVtcGxhdGVcbiAgICAgICAgICAgIHRoaXMudmlld1JlZiEuY29udGV4dC5pc09wZW4gPSB0aGlzLmN0eC5pc09wZW47XG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQucmVzdWx0cyA9IHRoaXMuY3R4LnJlc3VsdHM7XG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQuc2VhcmNoaW5nID0gdGhpcy5jdHguc2VhcmNoaW5nO1xuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LnNlYXJjaEluaXRpYWxpemVkID0gdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQ7XG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCZXN0TWF0Y2hJbmRleCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN0eC5yZXN1bHRzIHx8ICF0aGlzLnRlcm0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIGV4YWN0IHRlcm1cbiAgICAgICAgbGV0IGJlc3RNYXRjaCA9IHRoaXMuY3R4LnJlc3VsdHMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50aXRsZS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyBJZiBub3QgdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBzdGFydHMgd2l0aCB0aGUgdGVybVxuICAgICAgICBpZiAoYmVzdE1hdGNoIDwgMCkge1xuICAgICAgICAgICAgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0aGlzLnRlcm0hLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBub3QgdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBpbmNsdWRlcyB0aGUgdGVybVxuICAgICAgICBpZiAoYmVzdE1hdGNoIDwgMCkge1xuICAgICAgICAgICAgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXJtIS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmVzdE1hdGNoIDwgMCA/IG51bGwgOiBiZXN0TWF0Y2g7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZVN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5waXBlKFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIGRhdGFTZXJ2aWNlOiBlcnJvcnMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGRhdGFTZXJ2aWNlIE9ic2VydmFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHgucmVzdWx0cyA9IHJlc3VsdHM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3RyTGlzdEF1dG9NYXRjaCAmJiByZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID09PSAxICYmIHJlc3VsdHNbMF0udGl0bGUgJiYgIWlzTmlsKHRoaXMudGVybSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbMF0udGl0bGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gdGhpcy50ZXJtIS50b0xvY2FsZUxvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBhdXRvbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uU2VsZWN0ZWQocmVzdWx0c1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuX2luaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN0ckxpc3RBdXRvSGlnaGxpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5hdXRvSGlnaGxpZ2h0SW5kZXggPSB0aGlzLmdldEJlc3RNYXRjaEluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlLmRhdGFTb3VyY2VDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5kYXRhU291cmNlQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVybSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaEluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=