@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
96 lines • 21.5 kB
JavaScript
import { Component, Input } from '@angular/core';
import { CollectionViewState } from '@nakedobjects/services';
import { safeUnsubscribe } from '../helpers-components';
import * as i0 from "@angular/core";
import * as i1 from "@nakedobjects/services";
import * as i2 from "@nakedobjects/view-models";
import * as i3 from "@angular/common";
import * as i4 from "@angular/cdk/drag-drop";
import * as i5 from "../action-bar/action-bar.component";
import * as i6 from "../dialog/dialog.component";
import * as i7 from "../row/row.component";
import * as i8 from "../header/header.component";
export class CollectionComponent {
urlManager;
dragAndDrop;
ddSub;
dropZones = [];
constructor(urlManager, dragAndDrop) {
this.urlManager = urlManager;
this.dragAndDrop = dragAndDrop;
}
collection;
paneRouteDataSub;
lastPaneRouteData;
currentOid;
selectedDialogId;
get currentState() {
return this.collection.currentState;
}
get state() {
return CollectionViewState[this.currentState].toString().toLowerCase();
}
get title() {
return this.collection.title;
}
get details() {
return this.collection.details;
}
get mayHaveItems() {
return this.collection.mayHaveItems;
}
get header() {
return this.collection.header;
}
get items() {
return this.collection.items ?? [];
}
get message() {
return this.collection.getMessage();
}
isSummary = () => this.collection.currentState === CollectionViewState.Summary;
isList = () => this.collection.currentState === CollectionViewState.List;
isTable = () => this.collection.currentState === CollectionViewState.Table;
showActions = () => !this.disableActions() && (this.isTable() || this.isList());
showSummary = () => (this.mayHaveItems || !this.disableActions()) && (this.isList() || this.isTable());
showList = () => (this.mayHaveItems || !this.disableActions()) && (this.isTable() || this.isSummary());
showTable = () => this.mayHaveItems && (this.isList() || this.isSummary());
doSummary = () => this.collection.doSummary();
doList = () => this.collection.doList();
doTable = () => this.collection.doTable();
disableActions = () => this.collection.noActions();
hasTableData = () => this.collection.hasTableData();
setDropZones(ids) {
setTimeout(() => this.dropZones = ids);
}
ngOnInit() {
this.paneRouteDataSub = this.urlManager.getPaneRouteDataObservable(this.collection.onPaneId)
.subscribe((paneRouteData) => {
if (!paneRouteData.isEqual(this.lastPaneRouteData)) {
this.lastPaneRouteData = paneRouteData;
this.currentOid = this.currentOid || paneRouteData.objectId;
// ignore if different object
if (this.currentOid === paneRouteData.objectId) {
this.collection.reset(paneRouteData, false);
this.collection.resetMessage();
}
this.selectedDialogId = paneRouteData.dialogId;
}
});
this.ddSub = this.dragAndDrop.dropZoneIds$.subscribe(ids => this.setDropZones(ids || []));
}
ngOnDestroy() {
safeUnsubscribe(this.paneRouteDataSub);
safeUnsubscribe(this.ddSub);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CollectionComponent, deps: [{ token: i1.UrlManagerService }, { token: i2.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: CollectionComponent, selector: "nof-collection", inputs: { collection: "collection" }, ngImport: i0, template: "<div class=\"summary\">\n <div class=\"name\">{{title}}:</div>\n <div class=\"details\">{{details}}</div>\n <div>\n <div *ngIf=\"showSummary()\" class=\"icon summary\" (click)=\"doSummary()\" title=\"Close Collection\" alt=\"Close Collection\"></div>\n <div *ngIf=\"showList()\" class=\"icon list\" (click)=\"doList()\" title=\"View as List\" alt=\"View as List\"></div>\n <div *ngIf=\"showTable()\" class=\"icon table\" (click)=\"doTable()\" title=\"View as Table\" alt=\"View as Table\"></div>\n </div>\n</div>\n<div class=\"messages\">{{message}}</div>\n<nof-action-bar *ngIf=\"showActions()\" class=\"actions\" [menuHolder]=\"collection\"></nof-action-bar>\n<nof-dialog *ngIf=\"showActions()\" [parentVM]=\"collection\" [selectedDialogId]=\"selectedDialogId\"></nof-dialog>\n\n<table *ngIf=\"showSummary()\">\n <thead>\n <tr nof-header [collection]=\"collection\" [state]=\"currentState\"></tr>\n </thead>\n <tbody *ngIf=\"state === 'list' || hasTableData()\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\" [cdkDropListOrientation]=\"'horizontal'\">\n <tr *ngFor=\"let item of items; let i = index\" cdkDrag [cdkDragData]=\"item\" nof-row [item]=\"item\" [row]=\"i\" [withCheckbox]=\"!disableActions()\" [isTable]=\"state === 'table'\"></tr>\n </tbody>\n</table>", styles: [":host{display:block}:host:not(:last-child){margin-bottom:var(--space-5)}.summary{display:block;width:var(--table-width);font-size:var(--font-size-2);margin-bottom:var(--space-4);overflow:hidden}.name,.details{display:block;float:left;padding-left:0;padding-right:var(--space-3)}.name{width:var(--field-name-width)}.details{width:var(--field-value-width)}.icon{display:block;cursor:pointer;float:right;width:20px;height:var(--field-value-height);padding-left:var(--space-3);padding-top:var(--space-3);margin-right:var(--space-3)}.icon.summary{background:var(--summary-icon);background-size:cover}.icon.list{background:var(--list-icon);background-size:cover}.icon.table{background:var(--table-icon);background-size:cover}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i5.ActionBarComponent, selector: "nof-action-bar", inputs: ["actions", "menuHolder"] }, { kind: "component", type: i6.DialogComponent, selector: "nof-dialog", inputs: ["parentVM"] }, { kind: "component", type: i7.RowComponent, selector: "[nof-row]", inputs: ["item", "row", "withCheckbox", "isTable"] }, { kind: "component", type: i8.HeaderComponent, selector: "[nof-header]", inputs: ["collection", "state"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CollectionComponent, decorators: [{
type: Component,
args: [{ selector: 'nof-collection', template: "<div class=\"summary\">\n <div class=\"name\">{{title}}:</div>\n <div class=\"details\">{{details}}</div>\n <div>\n <div *ngIf=\"showSummary()\" class=\"icon summary\" (click)=\"doSummary()\" title=\"Close Collection\" alt=\"Close Collection\"></div>\n <div *ngIf=\"showList()\" class=\"icon list\" (click)=\"doList()\" title=\"View as List\" alt=\"View as List\"></div>\n <div *ngIf=\"showTable()\" class=\"icon table\" (click)=\"doTable()\" title=\"View as Table\" alt=\"View as Table\"></div>\n </div>\n</div>\n<div class=\"messages\">{{message}}</div>\n<nof-action-bar *ngIf=\"showActions()\" class=\"actions\" [menuHolder]=\"collection\"></nof-action-bar>\n<nof-dialog *ngIf=\"showActions()\" [parentVM]=\"collection\" [selectedDialogId]=\"selectedDialogId\"></nof-dialog>\n\n<table *ngIf=\"showSummary()\">\n <thead>\n <tr nof-header [collection]=\"collection\" [state]=\"currentState\"></tr>\n </thead>\n <tbody *ngIf=\"state === 'list' || hasTableData()\" cdkDropList [cdkDropListConnectedTo]=\"dropZones\" [cdkDropListOrientation]=\"'horizontal'\">\n <tr *ngFor=\"let item of items; let i = index\" cdkDrag [cdkDragData]=\"item\" nof-row [item]=\"item\" [row]=\"i\" [withCheckbox]=\"!disableActions()\" [isTable]=\"state === 'table'\"></tr>\n </tbody>\n</table>", styles: [":host{display:block}:host:not(:last-child){margin-bottom:var(--space-5)}.summary{display:block;width:var(--table-width);font-size:var(--font-size-2);margin-bottom:var(--space-4);overflow:hidden}.name,.details{display:block;float:left;padding-left:0;padding-right:var(--space-3)}.name{width:var(--field-name-width)}.details{width:var(--field-value-width)}.icon{display:block;cursor:pointer;float:right;width:20px;height:var(--field-value-height);padding-left:var(--space-3);padding-top:var(--space-3);margin-right:var(--space-3)}.icon.summary{background:var(--summary-icon);background-size:cover}.icon.list{background:var(--list-icon);background-size:cover}.icon.table{background:var(--table-icon);background-size:cover}\n"] }]
}], ctorParameters: () => [{ type: i1.UrlManagerService }, { type: i2.DragAndDropService }], propDecorators: { collection: [{
type: Input,
args: [{ required: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2NvbGxlY3Rpb24vY29sbGVjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2NvbGxlY3Rpb24vY29sbGVjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFvQyxNQUFNLHdCQUF3QixDQUFDO0FBRy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQVV4RCxNQUFNLE9BQU8sbUJBQW1CO0lBTVA7SUFDQTtJQUxiLEtBQUssQ0FBaUI7SUFDOUIsU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUV6QixZQUNxQixVQUE2QixFQUM3QixXQUErQjtRQUQvQixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFDaEQsQ0FBQztJQUdMLFVBQVUsQ0FBdUI7SUFFekIsZ0JBQWdCLENBQWlCO0lBQ2pDLGlCQUFpQixDQUFpQjtJQUNsQyxVQUFVLENBQVU7SUFFNUIsZ0JBQWdCLENBQVU7SUFFMUIsSUFBSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFXLENBQUM7SUFDckYsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFVB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QVUsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUU1RCw2QkFBNkI7Z0JBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbkMsQ0FBQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNuRCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELFdBQVc7UUFDUCxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO3VHQS9GUSxtQkFBbUI7MkZBQW5CLG1CQUFtQiw0RkNkaEMsc3pDQW9CUTs7MkZETkssbUJBQW1CO2tCQUwvQixTQUFTOytCQUNJLGdCQUFnQjt1SEFlMUIsVUFBVTtzQkFEVCxLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFHLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlld1N0YXRlLCBQYW5lUm91dGVEYXRhLCBVcmxNYW5hZ2VyU2VydmljZSB9IGZyb20gJ0BuYWtlZG9iamVjdHMvc2VydmljZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblZpZXdNb2RlbCwgSXRlbVZpZXdNb2RlbCwgRHJhZ0FuZERyb3BTZXJ2aWNlIH0gZnJvbSAnQG5ha2Vkb2JqZWN0cy92aWV3LW1vZGVscyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25MaWtlIGFzIElTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNhZmVVbnN1YnNjcmliZSB9IGZyb20gJy4uL2hlbHBlcnMtY29tcG9uZW50cyc7XG4vLyBuZWVkZWQgZm9yIGRlY2xhcmF0aW9ucyBjb21waWxlXG5cbnR5cGUgU3RhdGUgPSAnc3VtbWFyeScgfCAnbGlzdCcgfCAndGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25vZi1jb2xsZWN0aW9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NvbGxlY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydjb2xsZWN0aW9uLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHJpdmF0ZSBkZFN1Yj86IElTdWJzY3JpcHRpb247XG4gICAgZHJvcFpvbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsTWFuYWdlcjogVXJsTWFuYWdlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZHJhZ0FuZERyb3A6IERyYWdBbmREcm9wU2VydmljZVxuICAgICkgeyB9XG5cbiAgICBASW5wdXQoe3JlcXVpcmVkIDogdHJ1ZX0pXG4gICAgY29sbGVjdGlvbiE6IENvbGxlY3Rpb25WaWV3TW9kZWw7XG5cbiAgICBwcml2YXRlIHBhbmVSb3V0ZURhdGFTdWI/OiBJU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgbGFzdFBhbmVSb3V0ZURhdGE/OiBQYW5lUm91dGVEYXRhO1xuICAgIHByaXZhdGUgY3VycmVudE9pZD86IHN0cmluZztcblxuICAgIHNlbGVjdGVkRGlhbG9nSWQ/OiBzdHJpbmc7XG5cbiAgICBnZXQgY3VycmVudFN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmN1cnJlbnRTdGF0ZTtcbiAgICB9XG5cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiBDb2xsZWN0aW9uVmlld1N0YXRlW3RoaXMuY3VycmVudFN0YXRlIV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIGFzIFN0YXRlO1xuICAgIH1cblxuICAgIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbi50aXRsZTtcbiAgICB9XG5cbiAgICBnZXQgZGV0YWlscygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5kZXRhaWxzO1xuICAgIH1cblxuICAgIGdldCBtYXlIYXZlSXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24ubWF5SGF2ZUl0ZW1zO1xuICAgIH1cblxuICAgIGdldCBoZWFkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24uaGVhZGVyO1xuICAgIH1cblxuICAgIGdldCBpdGVtcygpOiBJdGVtVmlld01vZGVsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLml0ZW1zID8/IFtdO1xuICAgIH1cblxuICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmdldE1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU3VtbWFyeSA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5jdXJyZW50U3RhdGUgPT09IENvbGxlY3Rpb25WaWV3U3RhdGUuU3VtbWFyeTtcblxuICAgIHByaXZhdGUgaXNMaXN0ID0gKCkgPT4gdGhpcy5jb2xsZWN0aW9uLmN1cnJlbnRTdGF0ZSA9PT0gQ29sbGVjdGlvblZpZXdTdGF0ZS5MaXN0O1xuXG4gICAgcHJpdmF0ZSBpc1RhYmxlID0gKCkgPT4gdGhpcy5jb2xsZWN0aW9uLmN1cnJlbnRTdGF0ZSA9PT0gQ29sbGVjdGlvblZpZXdTdGF0ZS5UYWJsZTtcblxuICAgIHNob3dBY3Rpb25zID0gKCkgPT4gIXRoaXMuZGlzYWJsZUFjdGlvbnMoKSAmJiAodGhpcy5pc1RhYmxlKCkgfHwgdGhpcy5pc0xpc3QoKSk7XG4gICAgc2hvd1N1bW1hcnkgPSAoKSA9PiAodGhpcy5tYXlIYXZlSXRlbXMgfHwgIXRoaXMuZGlzYWJsZUFjdGlvbnMoKSkgJiYgKHRoaXMuaXNMaXN0KCkgfHwgdGhpcy5pc1RhYmxlKCkpO1xuICAgIHNob3dMaXN0ID0gKCkgPT4gKHRoaXMubWF5SGF2ZUl0ZW1zIHx8ICF0aGlzLmRpc2FibGVBY3Rpb25zKCkpICYmICh0aGlzLmlzVGFibGUoKSB8fCB0aGlzLmlzU3VtbWFyeSgpKTtcbiAgICBzaG93VGFibGUgPSAoKSA9PiB0aGlzLm1heUhhdmVJdGVtcyAmJiAodGhpcy5pc0xpc3QoKSB8fCB0aGlzLmlzU3VtbWFyeSgpKTtcblxuICAgIGRvU3VtbWFyeSA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5kb1N1bW1hcnkoKTtcbiAgICBkb0xpc3QgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24uZG9MaXN0KCk7XG4gICAgZG9UYWJsZSA9ICgpID0+IHRoaXMuY29sbGVjdGlvbi5kb1RhYmxlKCk7XG4gICAgZGlzYWJsZUFjdGlvbnMgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ubm9BY3Rpb25zKCk7XG5cbiAgICBoYXNUYWJsZURhdGEgPSAoKSA9PiB0aGlzLmNvbGxlY3Rpb24uaGFzVGFibGVEYXRhKCk7XG5cbiAgICBzZXREcm9wWm9uZXMoaWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZHJvcFpvbmVzID0gaWRzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLnBhbmVSb3V0ZURhdGFTdWIgPSB0aGlzLnVybE1hbmFnZXIuZ2V0UGFuZVJvdXRlRGF0YU9ic2VydmFibGUodGhpcy5jb2xsZWN0aW9uLm9uUGFuZUlkKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocGFuZVJvdXRlRGF0YTogUGFuZVJvdXRlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcGFuZVJvdXRlRGF0YS5pc0VxdWFsKHRoaXMubGFzdFBhbmVSb3V0ZURhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFBhbmVSb3V0ZURhdGEgPSBwYW5lUm91dGVEYXRhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPaWQgPSB0aGlzLmN1cnJlbnRPaWQgfHwgcGFuZVJvdXRlRGF0YS5vYmplY3RJZDtcblxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgZGlmZmVyZW50IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50T2lkID09PSBwYW5lUm91dGVEYXRhLm9iamVjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb24ucmVzZXQocGFuZVJvdXRlRGF0YSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uLnJlc2V0TWVzc2FnZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREaWFsb2dJZCA9IHBhbmVSb3V0ZURhdGEuZGlhbG9nSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGRTdWIgPSB0aGlzLmRyYWdBbmREcm9wLmRyb3Bab25lSWRzJC5zdWJzY3JpYmUoaWRzID0+IHRoaXMuc2V0RHJvcFpvbmVzKGlkcyB8fCBbXSkpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzYWZlVW5zdWJzY3JpYmUodGhpcy5wYW5lUm91dGVEYXRhU3ViKTtcbiAgICAgICAgc2FmZVVuc3Vic2NyaWJlKHRoaXMuZGRTdWIpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XG4gICAgPGRpdiBjbGFzcz1cIm5hbWVcIj57e3RpdGxlfX06PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRldGFpbHNcIj57e2RldGFpbHN9fTwvZGl2PlxuICAgIDxkaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93U3VtbWFyeSgpXCIgY2xhc3M9XCJpY29uIHN1bW1hcnlcIiAoY2xpY2spPVwiZG9TdW1tYXJ5KClcIiAgdGl0bGU9XCJDbG9zZSBDb2xsZWN0aW9uXCIgYWx0PVwiQ2xvc2UgQ29sbGVjdGlvblwiPjwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xpc3QoKVwiIGNsYXNzPVwiaWNvbiBsaXN0XCIgKGNsaWNrKT1cImRvTGlzdCgpXCIgIHRpdGxlPVwiVmlldyBhcyBMaXN0XCIgYWx0PVwiVmlldyBhcyBMaXN0XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGFibGUoKVwiIGNsYXNzPVwiaWNvbiB0YWJsZVwiIChjbGljayk9XCJkb1RhYmxlKClcIiAgdGl0bGU9XCJWaWV3IGFzIFRhYmxlXCIgYWx0PVwiVmlldyBhcyBUYWJsZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibWVzc2FnZXNcIj57e21lc3NhZ2V9fTwvZGl2PlxuPG5vZi1hY3Rpb24tYmFyICpuZ0lmPVwic2hvd0FjdGlvbnMoKVwiIGNsYXNzPVwiYWN0aW9uc1wiIFttZW51SG9sZGVyXT1cImNvbGxlY3Rpb25cIj48L25vZi1hY3Rpb24tYmFyPlxuPG5vZi1kaWFsb2cgKm5nSWY9XCJzaG93QWN0aW9ucygpXCIgW3BhcmVudFZNXT1cImNvbGxlY3Rpb25cIiBbc2VsZWN0ZWREaWFsb2dJZF09XCJzZWxlY3RlZERpYWxvZ0lkXCI+PC9ub2YtZGlhbG9nPlxuXG48dGFibGUgKm5nSWY9XCJzaG93U3VtbWFyeSgpXCI+XG4gICAgPHRoZWFkPlxuICAgICAgICA8dHIgbm9mLWhlYWRlciBbY29sbGVjdGlvbl09XCJjb2xsZWN0aW9uXCIgW3N0YXRlXT1cImN1cnJlbnRTdGF0ZVwiPjwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHkgKm5nSWY9XCJzdGF0ZSA9PT0gJ2xpc3QnIHx8IGhhc1RhYmxlRGF0YSgpXCIgY2RrRHJvcExpc3QgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiZHJvcFpvbmVzXCIgW2Nka0Ryb3BMaXN0T3JpZW50YXRpb25dPVwiJ2hvcml6b250YWwnXCI+XG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGkgPSBpbmRleFwiIGNka0RyYWcgW2Nka0RyYWdEYXRhXT1cIml0ZW1cIiBub2Ytcm93IFtpdGVtXT1cIml0ZW1cIiBbcm93XT1cImlcIiBbd2l0aENoZWNrYm94XT1cIiFkaXNhYmxlQWN0aW9ucygpXCIgW2lzVGFibGVdPVwic3RhdGUgPT09ICd0YWJsZSdcIj48L3RyPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPiJdfQ==