UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

143 lines 24 kB
import { Component, Input, ViewChild } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { accept, dropOn, focus, paste, safeUnsubscribe } from '../helpers-components'; import * as i0 from "@angular/core"; import * as i1 from "@nakedobjects/view-models"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; import * as i4 from "@angular/cdk/drag-drop"; import * as i5 from "../clear.directive"; export class AutoCompleteComponent { dragAndDrop; constructor(dragAndDrop) { this.dragAndDrop = dragAndDrop; } fieldViewModel; bSubject; sub; currentIndex = -1; inputField; canDrop = false; dragOver = false; set model(m) { this.fieldViewModel = m; this.dragAndDrop.setDropZoneId(this.modelPaneId); } get model() { return this.fieldViewModel; } form; get modelPaneId() { return this.model.paneArgId; } get modelId() { return this.model.id; } get control() { return this.form.controls[this.model.id]; } get choices() { return this.model.choices; } get accept() { // eslint-disable-next-line @typescript-eslint/no-this-alias const _this = this; return (cdkDrag, _cdkDropList) => { return accept(_this.model, _this, cdkDrag.data); }; } drop(event) { const cdkDrag = event.item; if (event.isPointerOverContainer) { dropOn(cdkDrag.data, this.model, this); } this.canDrop = false; this.dragOver = false; } exit() { this.canDrop = false; this.dragOver = false; } enter() { this.dragOver = true; } classes() { return { [this.model.color]: true, 'candrop': this.canDrop, 'dnd-drag-over': this.dragOver, }; } get description() { return this.model.description; } paste(event) { paste(event, this.model, this, () => this.dragAndDrop.getCopyViewModel(), () => this.dragAndDrop.setCopyViewModel(null)); } clear() { this.model.clear(); this.control.reset(); } select(item) { this.model.choices = []; this.model.selectedChoice = item; this.control.reset(item); } choiceName = (choice) => choice.name; get subject() { if (!this.bSubject) { const initialValue = this.control.value; this.bSubject = new BehaviorSubject(initialValue); this.sub = this.control.valueChanges.subscribe((data) => { this.bSubject.next(data); this.currentIndex = -1; }); } return this.bSubject; } isSelected(i) { return { 'selected': i === this.currentIndex }; } onArrowUp() { this.currentIndex--; this.currentIndex = this.currentIndex < -1 ? -1 : this.currentIndex; return false; } onArrowDown() { this.currentIndex++; const maxIndex = this.choices.length - 1; this.currentIndex = this.currentIndex > maxIndex ? maxIndex : this.currentIndex; return false; } selectCurrent() { const maxIndex = this.choices.length - 1; if (this.currentIndex >= 0 && this.currentIndex <= maxIndex) { this.select(this.choices[this.currentIndex]); return false; } return true; } ngOnDestroy() { this.dragAndDrop.clearDropZoneId(this.modelPaneId); safeUnsubscribe(this.sub); } focus() { return focus(this.inputField); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AutoCompleteComponent, deps: [{ token: i1.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AutoCompleteComponent, selector: "nof-auto-complete", inputs: { model: "model", form: "form" }, viewQueries: [{ propertyName: "inputField", first: true, predicate: ["focus"], descendants: true }], ngImport: i0, template: "<div [formGroup]=\"form\">\n <input\n #focus\n [id]=\"modelPaneId\"\n class=\"value droppable\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n (cdkDropListExited)=\"exit()\"\n (cdkDropListEntered)=\"enter()\"\n [cdkDropListEnterPredicate]=\"accept\"\n [ngClass]=\"classes()\"\n placeholder=\"{{description}}\"\n type=\"text\"\n [formControlName]=\"modelId\"\n [nofClear]=\"subject\"\n (clear)=\"clear()\"\n (keydown.arrowup)=\"onArrowUp()\"\n (keydown.arrowdown)=\"onArrowDown()\"\n (keyup.enter)=\"selectCurrent()\"/>\n <div class=\"suggestions\" *ngIf=\"choices.length > 0\">\n <ul >\n <li [ngClass]=\"isSelected(i)\" *ngFor=\"let choice of choices; let i = index\">\n <a (click)=\"select(choice)\">{{choiceName(choice)}}</a>\n </li>\n </ul>\n </div>\n</div>", styles: [".suggestions ul{list-style-type:none;width:var(--field-value-width);border-style:solid;border-width:1px;border-color:#000;margin:0;font-family:var(--font-text-family);font-size:var(--font-size-1);padding-left:0;font-weight:var(--font-weight-3)}.validation{font-family:var(--font-text-family);font-size:var(--font-size-1)}input{width:var(--field-value-width);padding-left:var(--space-3);border-style:solid;border-width:1px;border-color:gray}li a{padding-left:var(--space-3)}li:hover,.selected{background-color:var(--header-background-color);background-color:gray}.ng-clearable{background-image:var(--clearable-image);background-repeat:no-repeat;background-position:right -10px;background-size:8px}.ng-clearable[class*=link-color]{background-image:var(--clearable-link-image)}.ng-clearable.ng-x{background-position:right 2px center}.ng-clearable.ng-onX{cursor:pointer}input::-ms-clear{display:none}.value.droppable{border:solid;border-width:1px;width:var(--field-value-width);height:var(--field-value-height)}.value.droppable{border-color:#000}.value.droppable.dnd-drag-over.candrop{border-color:var(--approval-color);cursor:pointer}.value.droppable.dnd-drag-over{border-color:var(--warning-color)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.ClearDirective, selector: "[nofClear]", inputs: ["nofClear"], outputs: ["clear"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AutoCompleteComponent, decorators: [{ type: Component, args: [{ selector: 'nof-auto-complete', template: "<div [formGroup]=\"form\">\n <input\n #focus\n [id]=\"modelPaneId\"\n class=\"value droppable\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n (cdkDropListExited)=\"exit()\"\n (cdkDropListEntered)=\"enter()\"\n [cdkDropListEnterPredicate]=\"accept\"\n [ngClass]=\"classes()\"\n placeholder=\"{{description}}\"\n type=\"text\"\n [formControlName]=\"modelId\"\n [nofClear]=\"subject\"\n (clear)=\"clear()\"\n (keydown.arrowup)=\"onArrowUp()\"\n (keydown.arrowdown)=\"onArrowDown()\"\n (keyup.enter)=\"selectCurrent()\"/>\n <div class=\"suggestions\" *ngIf=\"choices.length > 0\">\n <ul >\n <li [ngClass]=\"isSelected(i)\" *ngFor=\"let choice of choices; let i = index\">\n <a (click)=\"select(choice)\">{{choiceName(choice)}}</a>\n </li>\n </ul>\n </div>\n</div>", styles: [".suggestions ul{list-style-type:none;width:var(--field-value-width);border-style:solid;border-width:1px;border-color:#000;margin:0;font-family:var(--font-text-family);font-size:var(--font-size-1);padding-left:0;font-weight:var(--font-weight-3)}.validation{font-family:var(--font-text-family);font-size:var(--font-size-1)}input{width:var(--field-value-width);padding-left:var(--space-3);border-style:solid;border-width:1px;border-color:gray}li a{padding-left:var(--space-3)}li:hover,.selected{background-color:var(--header-background-color);background-color:gray}.ng-clearable{background-image:var(--clearable-image);background-repeat:no-repeat;background-position:right -10px;background-size:8px}.ng-clearable[class*=link-color]{background-image:var(--clearable-link-image)}.ng-clearable.ng-x{background-position:right 2px center}.ng-clearable.ng-onX{cursor:pointer}input::-ms-clear{display:none}.value.droppable{border:solid;border-width:1px;width:var(--field-value-width);height:var(--field-value-height)}.value.droppable{border-color:#000}.value.droppable.dnd-drag-over.candrop{border-color:var(--approval-color);cursor:pointer}.value.droppable.dnd-drag-over{border-color:var(--warning-color)}\n"] }] }], ctorParameters: () => [{ type: i1.DragAndDropService }], propDecorators: { inputField: [{ type: ViewChild, args: ['focus', { static: false }] }], model: [{ type: Input, args: [{ required: true }] }], form: [{ type: Input, args: [{ required: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJbkYsT0FBTyxFQUFFLGVBQWUsRUFBcUMsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7OztBQU90RixNQUFNLE9BQU8scUJBQXFCO0lBR1Q7SUFEckIsWUFDcUIsV0FBK0I7UUFBL0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBQ2hELENBQUM7SUFFRyxjQUFjLENBQWtCO0lBQ2hDLFFBQVEsQ0FBNEI7SUFDcEMsR0FBRyxDQUFpQjtJQUNwQixZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFHMUIsVUFBVSxDQUFjO0lBRXhCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVqQixJQUNJLEtBQUssQ0FBQyxDQUFpQjtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBR0QsSUFBSSxDQUFhO0lBR2pCLElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFD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WUFBWSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUM3QyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO3VHQXJKUSxxQkFBcUI7MkZBQXJCLHFCQUFxQix3TUNibEMsczdCQTBCTTs7MkZEYk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNJLG1CQUFtQjt1RkFnQjdCLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQU8vQixLQUFLO3NCQURSLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUcsSUFBSSxFQUFDO2dCQVd4QixJQUFJO3NCQURILEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUcsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZywgQ2RrRHJhZ0Ryb3AsIENka0Ryb3BMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDaG9pY2VWaWV3TW9kZWwsIERyYWdBbmREcm9wU2VydmljZSwgRmllbGRWaWV3TW9kZWwsIElEcmFnZ2FibGVWaWV3TW9kZWwgfSBmcm9tICdAbmFrZWRvYmplY3RzL3ZpZXctbW9kZWxzJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb25MaWtlIGFzIElTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGFjY2VwdCwgZHJvcE9uLCBmb2N1cywgcGFzdGUsIHNhZmVVbnN1YnNjcmliZSB9IGZyb20gJy4uL2hlbHBlcnMtY29tcG9uZW50cyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbm9mLWF1dG8tY29tcGxldGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ2F1dG8tY29tcGxldGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9Db21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkcmFnQW5kRHJvcDogRHJhZ0FuZERyb3BTZXJ2aWNlXG4gICAgKSB7IH1cblxuICAgIHByaXZhdGUgZmllbGRWaWV3TW9kZWwhOiBGaWVsZFZpZXdNb2RlbDtcbiAgICBwcml2YXRlIGJTdWJqZWN0PzogQmVoYXZpb3JTdWJqZWN0PHVua25vd24+O1xuICAgIHByaXZhdGUgc3ViPzogSVN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGN1cnJlbnRJbmRleCA9IC0xO1xuXG4gICAgQFZpZXdDaGlsZCgnZm9jdXMnLCB7c3RhdGljOiBmYWxzZX0pXG4gICAgaW5wdXRGaWVsZD86IEVsZW1lbnRSZWY7XG4gICAgXG4gICAgY2FuRHJvcCA9IGZhbHNlO1xuICAgIGRyYWdPdmVyID0gZmFsc2U7XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgc2V0IG1vZGVsKG06IEZpZWxkVmlld01vZGVsKSB7XG4gICAgICAgIHRoaXMuZmllbGRWaWV3TW9kZWwgPSBtO1xuICAgICAgICB0aGlzLmRyYWdBbmREcm9wLnNldERyb3Bab25lSWQodGhpcy5tb2RlbFBhbmVJZCk7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZFZpZXdNb2RlbDtcbiAgICB9XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgZm9ybSE6IEZvcm1Hcm91cDtcblxuXG4gICAgZ2V0IG1vZGVsUGFuZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5wYW5lQXJnSWQ7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmlkO1xuICAgIH1cblxuICAgIGdldCBjb250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5tb2RlbC5pZF07XG4gICAgfVxuXG4gICAgZ2V0IGNob2ljZXMoKTogQ2hvaWNlVmlld01vZGVsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5jaG9pY2VzO1xuICAgIH1cblxuICAgIGdldCBhY2NlcHQoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoY2RrRHJhZzogQ2RrRHJhZzxJRHJhZ2dhYmxlVmlld01vZGVsPiwgX2Nka0Ryb3BMaXN0OiBDZGtEcm9wTGlzdCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjY2VwdChfdGhpcy5tb2RlbCwgX3RoaXMsIGNka0RyYWcuZGF0YSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8Q2RrRHJhZzxJRHJhZ2dhYmxlVmlld01vZGVsPj4pIHtcbiAgICAgICAgY29uc3QgY2RrRHJhZzogQ2RrRHJhZzxJRHJhZ2dhYmxlVmlld01vZGVsPiA9IGV2ZW50Lml0ZW07XG4gICAgICAgIGlmIChldmVudC5pc1BvaW50ZXJPdmVyQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBkcm9wT24oY2RrRHJhZy5kYXRhLCB0aGlzLm1vZGVsLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbkRyb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnT3ZlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGV4aXQoKSB7XG4gICAgICAgIHRoaXMuY2FuRHJvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZW50ZXIoKSB7XG4gICAgICAgIHRoaXMuZHJhZ092ZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIGNsYXNzZXMoKTogRGljdGlvbmFyeTxib29sZWFuIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW3RoaXMubW9kZWwuY29sb3JdOiB0cnVlLFxuICAgICAgICAgICAgJ2NhbmRyb3AnOiB0aGlzLmNhbkRyb3AsXG4gICAgICAgICAgICAnZG5kLWRyYWctb3Zlcic6IHRoaXMuZHJhZ092ZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBwYXN0ZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBwYXN0ZShldmVudCwgdGhpcy5tb2RlbCwgdGhpcywgKCkgPT4gdGhpcy5kcmFnQW5kRHJvcC5nZXRDb3B5Vmlld01vZGVsKCksICgpID0+IHRoaXMuZHJhZ0FuZERyb3Auc2V0Q29weVZpZXdNb2RlbChudWxsKSk7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubW9kZWwuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgc2VsZWN0KGl0ZW06IENob2ljZVZpZXdNb2RlbCkge1xuICAgICAgICB0aGlzLm1vZGVsLmNob2ljZXMgPSBbXTtcbiAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZENob2ljZSA9IGl0ZW07XG4gICAgICAgIHRoaXMuY29udHJvbC5yZXNldChpdGVtKTtcbiAgICB9XG5cbiAgICBjaG9pY2VOYW1lID0gKGNob2ljZTogQ2hvaWNlVmlld01vZGVsKSA9PiBjaG9pY2UubmFtZTtcblxuICAgIGdldCBzdWJqZWN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuYlN1YmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMuY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuYlN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3ViID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJTdWJqZWN0IS5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmJTdWJqZWN0O1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQoaTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB7ICdzZWxlY3RlZCc6IGkgPT09IHRoaXMuY3VycmVudEluZGV4IH07XG4gICAgfVxuXG4gICAgb25BcnJvd1VwKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleC0tO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudEluZGV4IDwgLTEgPyAtMSA6IHRoaXMuY3VycmVudEluZGV4O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb25BcnJvd0Rvd24oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG4gICAgICAgIGNvbnN0IG1heEluZGV4ID0gdGhpcy5jaG9pY2VzLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXggPiBtYXhJbmRleCA/IG1heEluZGV4IDogdGhpcy5jdXJyZW50SW5kZXg7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZWxlY3RDdXJyZW50KCkge1xuICAgICAgICBjb25zdCBtYXhJbmRleCA9IHRoaXMuY2hvaWNlcy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5kZXggPj0gMCAmJiB0aGlzLmN1cnJlbnRJbmRleCA8PSBtYXhJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5jaG9pY2VzW3RoaXMuY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHJhZ0FuZERyb3AuY2xlYXJEcm9wWm9uZUlkKHRoaXMubW9kZWxQYW5lSWQpO1xuICAgICAgICBzYWZlVW5zdWJzY3JpYmUodGhpcy5zdWIpO1xuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICByZXR1cm4gZm9jdXModGhpcy5pbnB1dEZpZWxkKTtcbiAgICB9XG59XG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxpbnB1dFxuICAgICAgICAjZm9jdXNcbiAgICAgICAgW2lkXT1cIm1vZGVsUGFuZUlkXCJcbiAgICAgICAgY2xhc3M9XCJ2YWx1ZSBkcm9wcGFibGVcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXG4gICAgICAgIChjZGtEcm9wTGlzdEV4aXRlZCk9XCJleGl0KClcIlxuICAgICAgICAoY2RrRHJvcExpc3RFbnRlcmVkKT1cImVudGVyKClcIlxuICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJhY2NlcHRcIlxuICAgICAgICBbbmdDbGFzc109XCJjbGFzc2VzKClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7ZGVzY3JpcHRpb259fVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJtb2RlbElkXCJcbiAgICAgICAgW25vZkNsZWFyXT1cInN1YmplY3RcIlxuICAgICAgICAoY2xlYXIpPVwiY2xlYXIoKVwiXG4gICAgICAgIChrZXlkb3duLmFycm93dXApPVwib25BcnJvd1VwKClcIlxuICAgICAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwib25BcnJvd0Rvd24oKVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWxlY3RDdXJyZW50KClcIi8+XG4gICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb25zXCIgKm5nSWY9XCJjaG9pY2VzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPHVsID5cbiAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJpc1NlbGVjdGVkKGkpXCIgKm5nRm9yPVwibGV0IGNob2ljZSBvZiBjaG9pY2VzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdChjaG9pY2UpXCI+e3tjaG9pY2VOYW1lKGNob2ljZSl9fTwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=