@progress/telerik-angular-native-report-viewer
Version:
Progress® Telerik® Native Report Viewer for Angular
189 lines • 29.6 kB
JavaScript
import { EventEmitter, Injectable } from '@angular/core';
import { DocumentInfo, ReportControllerOptions, ServiceType, ServiceClientOptions, ServiceClientLoginInfo, reportSourcesAreEqual } from '@progress/telerik-common-report-viewer';
import { messages } from './localization/messages';
import * as i0 from "@angular/core";
const zoomStep = 0.25;
const minScale = 0.25;
const maxScale = 4;
export class ReportingAngularViewerService {
constructor() {
this.options = {
contentTabIndex: 1000,
authenticationToken: '',
reportSource: {
parameters: {},
report: null,
},
scale: 1,
scaleMode: 2,
serviceType: 0,
serviceUrl: null,
viewMode: 0,
keepClientAlive: true,
messages: messages,
pageMode: 0,
printMode: 0,
reportServer: null,
};
this.documentInfo = {
documentReady: false,
documentMapAvailable: false,
containsFrozenContent: false,
pageCount: 1,
documentMapNodes: [],
bookmarkNodes: [],
renderingExtensions: [],
};
this.onZoomChange = new EventEmitter();
this.parameters = [];
this.isSearchWindowOpen = false;
this.isAiPromptWindowOpen = false;
this.currentHistoryIndex = -1;
this.history = [];
this.currentPageIndex = 0;
this.renderingInProgress = false;
this.isBackwardsNavigationInProgress = false;
this.isParametersSectionAvailable = false;
this.windowWidth = 310;
this.windowHeight = 390;
this.totalPages = 1;
this.skip = 0;
}
getServiceClientOptions() {
if (this.options.serviceType === ServiceType.ReportServer && this.options.reportServer !== null) {
let serverOptions = this.options.reportServer;
let serviceUrl = serverOptions.url + '/api/reports';
let tokenUrl = serverOptions.url + '/Token';
let loginInfo = new ServiceClientLoginInfo(tokenUrl, serverOptions.username, serverOptions.password);
return new ServiceClientOptions(serviceUrl, loginInfo);
}
return new ServiceClientOptions(this.options.serviceUrl);
}
getControllerOptions() {
return new ReportControllerOptions(this.options.keepClientAlive, this.options.authenticationToken, this.options.reportSource, this.options.printMode, this.options.pageMode, this.options.viewMode, this.options.scaleMode, this.options.scale, this.options.messages);
}
setOptions(options) {
this.options = options;
this.controller.setOptions(this.getControllerOptions());
this.controller.refreshReport(true, '');
}
applyHistory(reportSource, page, reportDocumentId, scale, scaleMode, viewMode) {
this.controller.setReportSource(reportSource);
this.controller.setReportDocumentId(reportDocumentId);
if (this.controller.getScale() !== scale) {
this.setScale(scale);
}
if (this.controller.getScaleMode() !== scaleMode) {
this.setScaleMode(scaleMode);
}
if (this.controller.getViewMode() !== viewMode) {
this.setViewMode(viewMode);
}
this.controller.refreshReport(false /* ignoreCache */, reportDocumentId, true /* alwaysRespectAutoRun */);
this.controller.navigateToPage(page, undefined);
}
applyParameter(id, value) {
this.isSearchWindowOpen = false;
this.isAiPromptWindowOpen = false;
this.controller.setParameter(id, value);
this.controller.previewReport();
}
setScale(scale) {
this.options.scale = scale;
this.controller.setScale(scale);
this.onZoomChange.emit(scale);
}
setScaleMode(scaleMode) {
this.options.scaleMode = scaleMode;
this.controller.setScaleMode(scaleMode);
}
setViewMode(mode) {
if (mode) {
this.options.viewMode = mode;
}
else {
this.options.viewMode ? this.options.viewMode = 0 : this.options.viewMode = 1;
}
this.controller.setViewMode(this.options.viewMode);
this.controller.refreshReportCore(false, this.controller.getReportDocumentId());
}
zoomIn() {
if (this.options.scale < maxScale) {
this.options.scale += zoomStep;
this.setScale(this.options.scale);
}
}
zoomOut() {
if (this.options.scale > minScale) {
this.options.scale -= zoomStep;
this.setScale(this.options.scale);
}
}
navigateBackwards() {
this.renderingInProgress = true;
this.isSearchWindowOpen = false;
this.isAiPromptWindowOpen = false;
this.isBackwardsNavigationInProgress = true;
this.currentHistoryIndex--;
if (this.history.length >= 0) {
const currentHistoryItem = this.history[this.currentHistoryIndex];
this.applyHistory(currentHistoryItem.reportSource, currentHistoryItem.page, currentHistoryItem.documentId, currentHistoryItem.scale, currentHistoryItem.scaleMode, currentHistoryItem.viewMode);
}
}
navigateForward() {
this.renderingInProgress = true;
this.isSearchWindowOpen = false;
this.isAiPromptWindowOpen = false;
this.currentHistoryIndex++;
if (this.currentHistoryIndex < this.history.length) {
const currentHistoryItem = this.history[this.currentHistoryIndex];
this.applyHistory(currentHistoryItem.reportSource, currentHistoryItem.page, currentHistoryItem.documentId, currentHistoryItem.scale, currentHistoryItem.scaleMode, currentHistoryItem.viewMode);
}
}
addHistoryItem(temp = false) {
this.removeTempHistoryItems();
const historyItem = {
reportSource: { report: this.controller.getReportSource()?.report, parameters: this.options.reportSource.parameters },
documentId: this.controller.getReportDocumentId(),
page: this.getPageNumber(),
scale: this.controller.getScale(),
scaleMode: this.controller.getScaleMode(),
viewMode: this.controller.getViewMode(),
temp: temp
};
const controllerReportSource = this.controller.getReportSource();
if (!this.history.some(item => reportSourcesAreEqual({ firstReportSource: item.reportSource, secondReportSource: controllerReportSource }))) {
this.currentHistoryIndex++;
let deleteCount = this.isBackwardsNavigationInProgress ? 0 : this.history.length - this.currentHistoryIndex;
this.history.splice(this.currentHistoryIndex, deleteCount, historyItem);
}
this.isBackwardsNavigationInProgress = false;
return historyItem;
}
removeTempHistoryItems() {
var lastIndex = this.history.length - 1;
while (lastIndex >= 0 && this.history[lastIndex].temp) {
this.history.splice(lastIndex, 1);
if (this.currentHistoryIndex >= lastIndex) {
this.currentHistoryIndex--;
}
lastIndex--;
}
}
clearReport() {
this.isSearchWindowOpen = this.isAiPromptWindowOpen = this.renderingInProgress = false;
this.isSearchWindowOpen = this.renderingInProgress = false;
this.currentPageIndex = 0;
this.totalPages = 0;
this.documentInfo = new DocumentInfo();
}
getPageNumber() {
return this.currentPageIndex + 1;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportingAngularViewerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportingAngularViewerService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportingAngularViewerService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWFuZ3VsYXItdmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlcG9ydGluZy1hbmd1bGFyLXZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFFSCxZQUFZLEVBRVosdUJBQXVCLEVBR3ZCLFdBQVcsRUFJWCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBRXRCLHFCQUFxQixFQUN4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFJbkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQztBQUN0QixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFHbkIsTUFBTSxPQUFPLDZCQUE2QjtJQUQxQztRQUVXLFlBQU8sR0FBUTtZQUNsQixlQUFlLEVBQUUsSUFBSTtZQUNyQixtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLFlBQVksRUFBRTtnQkFDVixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsSUFBSTthQUNmO1lBQ0QsS0FBSyxFQUFFLENBQUM7WUFDUixTQUFTLEVBQUUsQ0FBQztZQUNaLFdBQVcsRUFBRSxDQUFDO1lBQ2QsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLENBQUM7WUFDWCxlQUFlLEVBQUUsSUFBSTtZQUNyQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsQ0FBQztZQUNYLFNBQVMsRUFBRSxDQUFDO1lBQ1osWUFBWSxFQUFFLElBQUk7U0FDckIsQ0FBQztRQUVLLGlCQUFZLEdBQWlCO1lBQ2hDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLG9CQUFvQixFQUFFLEtBQUs7WUFDM0IscUJBQXFCLEVBQUUs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QUFHLEtBQUssQ0FBQTtRQUU1QyxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRU0sc0JBQXNCO1FBQ3pCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUV4QyxPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRWxDLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLFNBQVMsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDOUI7WUFDRCxTQUFTLEVBQUUsQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDdkYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDM0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVNLGFBQWE7UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBdE9RLDZCQUE2QjttSEFBN0IsNkJBQTZCOzs0RkFBN0IsNkJBQTZCO2tCQUR6QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbnRlbnRBcmVhLFxuICAgIERvY3VtZW50SW5mbyxcbiAgICBSZXBvcnRDb250cm9sbGVyLFxuICAgIFJlcG9ydENvbnRyb2xsZXJPcHRpb25zLFxuICAgIFJlcG9ydFNvdXJjZU9wdGlvbnMsXG4gICAgU2NhbGVNb2RlLFxuICAgIFNlcnZpY2VUeXBlLFxuICAgIFZpZXdNb2RlLFxuICAgIFNlcnZpY2VDbGllbnQsXG4gICAgU2VhcmNoTWFuYWdlcixcbiAgICBTZXJ2aWNlQ2xpZW50T3B0aW9ucyxcbiAgICBTZXJ2aWNlQ2xpZW50TG9naW5JbmZvLFxuICAgIFBhcmFtZXRlckluZm8sXG4gICAgcmVwb3J0U291cmNlc0FyZUVxdWFsXG59IGZyb20gJ0Bwcm9ncmVzcy90ZWxlcmlrLWNvbW1vbi1yZXBvcnQtdmlld2VyJztcbmltcG9ydCB7IG1lc3NhZ2VzIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbWVzc2FnZXMnO1xuaW1wb3J0IHsgSGlzdG9yeUl0ZW0gfSBmcm9tICcuL21vZGVscy9oaXN0b3J5LWl0ZW0uaW50ZXJmYWNlJztcblxuXG5jb25zdCB6b29tU3RlcCA9IDAuMjU7XG5jb25zdCBtaW5TY2FsZSA9IDAuMjU7XG5jb25zdCBtYXhTY2FsZSA9IDQ7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdBbmd1bGFyVmlld2VyU2VydmljZSB7XG4gICAgcHVibGljIG9wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgY29udGVudFRhYkluZGV4OiAxMDAwLFxuICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuOiAnJyxcbiAgICAgICAgcmVwb3J0U291cmNlOiB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7fSxcbiAgICAgICAgICAgIHJlcG9ydDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICAgIHNjYWxlTW9kZTogMixcbiAgICAgICAgc2VydmljZVR5cGU6IDAsXG4gICAgICAgIHNlcnZpY2VVcmw6IG51bGwsXG4gICAgICAgIHZpZXdNb2RlOiAwLFxuICAgICAgICBrZWVwQ2xpZW50QWxpdmU6IHRydWUsXG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICAgICAgcGFnZU1vZGU6IDAsXG4gICAgICAgIHByaW50TW9kZTogMCxcbiAgICAgICAgcmVwb3J0U2VydmVyOiBudWxsLFxuICAgIH07XG5cbiAgICBwdWJsaWMgZG9jdW1lbnRJbmZvOiBEb2N1bWVudEluZm8gPSB7XG4gICAgICAgIGRvY3VtZW50UmVhZHk6IGZhbHNlLFxuICAgICAgICBkb2N1bWVudE1hcEF2YWlsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbnRhaW5zRnJvemVuQ29udGVudDogZmFsc2UsXG4gICAgICAgIHBhZ2VDb3VudDogMSxcbiAgICAgICAgZG9jdW1lbnRNYXBOb2RlczogW10sXG4gICAgICAgIGJvb2ttYXJrTm9kZXM6IFtdLFxuICAgICAgICByZW5kZXJpbmdFeHRlbnNpb25zOiBbXSxcbiAgICB9O1xuXG4gICAgcHVibGljIG9uWm9vbUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIHB1YmxpYyBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJJbmZvW10gPSBbXTtcbiAgICBwdWJsaWMgaXNTZWFyY2hXaW5kb3dPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGlzQWlQcm9tcHRXaW5kb3dPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGN1cnJlbnRIaXN0b3J5SW5kZXggPSAtMTtcbiAgICBwdWJsaWMgaGlzdG9yeTogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgY3VycmVudFBhZ2VJbmRleDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgcmVuZGVyaW5nSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc0JhY2t3YXJkc05hdmlnYXRpb25JblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGlzUGFyYW1ldGVyc1NlY3Rpb25BdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyByZXBvcnRXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyB3aW5kb3dXaWR0aDogbnVtYmVyID0gMzEwO1xuICAgIHB1YmxpYyB3aW5kb3dIZWlnaHQ6IG51bWJlciA9IDM5MDtcbiAgICBwdWJsaWMgdG90YWxQYWdlczogbnVtYmVyID0gMTtcbiAgICBwdWJsaWMgc2tpcDogbnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyBjb250cm9sbGVyITogUmVwb3J0Q29udHJvbGxlcjtcbiAgICBwdWJsaWMgc2VydmljZUNsaWVudCE6IFNlcnZpY2VDbGllbnQ7XG4gICAgcHVibGljIHNlYXJjaE1hbmFnZXIhOiBTZWFyY2hNYW5hZ2VyO1xuICAgIHB1YmxpYyBjb250ZW50QXJlYSE6IENvbnRlbnRBcmVhO1xuXG4gICAgcHVibGljIGdldFNlcnZpY2VDbGllbnRPcHRpb25zKCk6IFNlcnZpY2VDbGllbnRPcHRpb25zIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2aWNlVHlwZSA9PT0gU2VydmljZVR5cGUuUmVwb3J0U2VydmVyICYmIHRoaXMub3B0aW9ucy5yZXBvcnRTZXJ2ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJPcHRpb25zID0gdGhpcy5vcHRpb25zLnJlcG9ydFNlcnZlcjtcbiAgICAgICAgICAgIGxldCBzZXJ2aWNlVXJsID0gc2VydmVyT3B0aW9ucy51cmwgKyAnL2FwaS9yZXBvcnRzJztcbiAgICAgICAgICAgIGxldCB0b2tlblVybCA9IHNlcnZlck9wdGlvbnMudXJsICsgJy9Ub2tlbic7XG4gICAgICAgICAgICBsZXQgbG9naW5JbmZvID0gbmV3IFNlcnZpY2VDbGllbnRMb2dpbkluZm8odG9rZW5VcmwsIHNlcnZlck9wdGlvbnMudXNlcm5hbWUsIHNlcnZlck9wdGlvbnMucGFzc3dvcmQpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VDbGllbnRPcHRpb25zKHNlcnZpY2VVcmwsIGxvZ2luSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VDbGllbnRPcHRpb25zKHRoaXMub3B0aW9ucy5zZXJ2aWNlVXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29udHJvbGxlck9wdGlvbnMoKTogUmVwb3J0Q29udHJvbGxlck9wdGlvbnMge1xuICAgICAgICByZXR1cm4gbmV3IFJlcG9ydENvbnRyb2xsZXJPcHRpb25zKFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmtlZXBDbGllbnRBbGl2ZSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlcG9ydFNvdXJjZSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wcmludE1vZGUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFnZU1vZGUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudmlld01vZGUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NhbGVNb2RlLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjYWxlLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1lc3NhZ2VzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldE9wdGlvbnMob3B0aW9uczogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRPcHRpb25zKHRoaXMuZ2V0Q29udHJvbGxlck9wdGlvbnMoKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5yZWZyZXNoUmVwb3J0KHRydWUsICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlIaXN0b3J5KHJlcG9ydFNvdXJjZTogUmVwb3J0U291cmNlT3B0aW9ucywgXG4gICAgICAgIHBhZ2U6IG51bWJlciwgXG4gICAgICAgIHJlcG9ydERvY3VtZW50SWQ6IHN0cmluZywgXG4gICAgICAgIHNjYWxlOiBudW1iZXIsIFxuICAgICAgICBzY2FsZU1vZGU6IG51bWJlciwgXG4gICAgICAgIHZpZXdNb2RlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFJlcG9ydFNvdXJjZShyZXBvcnRTb3VyY2UpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0UmVwb3J0RG9jdW1lbnRJZChyZXBvcnREb2N1bWVudElkKTtcblxuICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyLmdldFNjYWxlKCkgIT09IHNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNjYWxlKHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIuZ2V0U2NhbGVNb2RlKCkgIT09IHNjYWxlTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2FsZU1vZGUoc2NhbGVNb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIuZ2V0Vmlld01vZGUoKSAhPT0gdmlld01vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Vmlld01vZGUodmlld01vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnJlZnJlc2hSZXBvcnQoZmFsc2UgLyogaWdub3JlQ2FjaGUgKi8sIHJlcG9ydERvY3VtZW50SWQsIHRydWUgLyogYWx3YXlzUmVzcGVjdEF1dG9SdW4gKi8pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubmF2aWdhdGVUb1BhZ2UocGFnZSwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlQYXJhbWV0ZXIoaWQ6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLmlzU2VhcmNoV2luZG93T3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQWlQcm9tcHRXaW5kb3dPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRQYXJhbWV0ZXIoaWQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnByZXZpZXdSZXBvcnQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2NhbGUoc2NhbGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFNjYWxlKHNjYWxlKTtcbiAgICAgICAgdGhpcy5vblpvb21DaGFuZ2UuZW1pdChzY2FsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNjYWxlTW9kZShzY2FsZU1vZGU6IFNjYWxlTW9kZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc2NhbGVNb2RlID0gc2NhbGVNb2RlO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0U2NhbGVNb2RlKHNjYWxlTW9kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZpZXdNb2RlKG1vZGU/OiBWaWV3TW9kZSk6IHZvaWQge1xuICAgICAgICBpZiAobW9kZSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZpZXdNb2RlID0gbW9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy52aWV3TW9kZSA/IHRoaXMub3B0aW9ucy52aWV3TW9kZSA9IDAgOiB0aGlzLm9wdGlvbnMudmlld01vZGUgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZpZXdNb2RlKHRoaXMub3B0aW9ucy52aWV3TW9kZSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5yZWZyZXNoUmVwb3J0Q29yZShmYWxzZSwgdGhpcy5jb250cm9sbGVyLmdldFJlcG9ydERvY3VtZW50SWQoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHpvb21JbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZSA8IG1heFNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NhbGUgKz0gem9vbVN0ZXA7XG4gICAgICAgICAgICB0aGlzLnNldFNjYWxlKHRoaXMub3B0aW9ucy5zY2FsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgem9vbU91dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZSA+IG1pblNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NhbGUgLT0gem9vbVN0ZXA7XG4gICAgICAgICAgICB0aGlzLnNldFNjYWxlKHRoaXMub3B0aW9ucy5zY2FsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGVCYWNrd2FyZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyaW5nSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNTZWFyY2hXaW5kb3dPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNBaVByb21wdFdpbmRvd09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0JhY2t3YXJkc05hdmlnYXRpb25JblByb2dyZXNzID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXgtLTtcblxuICAgICAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SGlzdG9yeUl0ZW0gPSB0aGlzLmhpc3RvcnlbdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4XTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlIaXN0b3J5KGN1cnJlbnRIaXN0b3J5SXRlbS5yZXBvcnRTb3VyY2UsIGN1cnJlbnRIaXN0b3J5SXRlbS5wYWdlLCBjdXJyZW50SGlzdG9yeUl0ZW0uZG9jdW1lbnRJZCwgY3VycmVudEhpc3RvcnlJdGVtLnNjYWxlLCBjdXJyZW50SGlzdG9yeUl0ZW0uc2NhbGVNb2RlLCBjdXJyZW50SGlzdG9yeUl0ZW0udmlld01vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlRm9yd2FyZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJpbmdJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1NlYXJjaFdpbmRvd09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0FpUHJvbXB0V2luZG93T3BlbiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlJbmRleCsrO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXggPCB0aGlzLmhpc3RvcnkubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SGlzdG9yeUl0ZW0gPSB0aGlzLmhpc3RvcnlbdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4XTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlIaXN0b3J5KGN1cnJlbnRIaXN0b3J5SXRlbS5yZXBvcnRTb3VyY2UsIGN1cnJlbnRIaXN0b3J5SXRlbS5wYWdlLCBjdXJyZW50SGlzdG9yeUl0ZW0uZG9jdW1lbnRJZCwgY3VycmVudEhpc3RvcnlJdGVtLnNjYWxlLCBjdXJyZW50SGlzdG9yeUl0ZW0uc2NhbGVNb2RlLCBjdXJyZW50SGlzdG9yeUl0ZW0udmlld01vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEhpc3RvcnlJdGVtKHRlbXA6IGJvb2xlYW4gPSBmYWxzZSk6IEhpc3RvcnlJdGVtIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUZW1wSGlzdG9yeUl0ZW1zKCk7XG5cbiAgICAgICAgY29uc3QgaGlzdG9yeUl0ZW06IEhpc3RvcnlJdGVtID0ge1xuICAgICAgICAgICAgcmVwb3J0U291cmNlOiB7IHJlcG9ydDogdGhpcy5jb250cm9sbGVyLmdldFJlcG9ydFNvdXJjZSgpPy5yZXBvcnQsIHBhcmFtZXRlcnM6IHRoaXMub3B0aW9ucy5yZXBvcnRTb3VyY2UucGFyYW1ldGVycyB9LFxuICAgICAgICAgICAgZG9jdW1lbnRJZDogdGhpcy5jb250cm9sbGVyLmdldFJlcG9ydERvY3VtZW50SWQoKSxcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMuZ2V0UGFnZU51bWJlcigpLFxuICAgICAgICAgICAgc2NhbGU6IHRoaXMuY29udHJvbGxlci5nZXRTY2FsZSgpLFxuICAgICAgICAgICAgc2NhbGVNb2RlOiB0aGlzLmNvbnRyb2xsZXIuZ2V0U2NhbGVNb2RlKCksXG4gICAgICAgICAgICB2aWV3TW9kZTogdGhpcy5jb250cm9sbGVyLmdldFZpZXdNb2RlKCksXG4gICAgICAgICAgICB0ZW1wOiB0ZW1wXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29udHJvbGxlclJlcG9ydFNvdXJjZSA9IHRoaXMuY29udHJvbGxlci5nZXRSZXBvcnRTb3VyY2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLmhpc3Rvcnkuc29tZShpdGVtID0+IHJlcG9ydFNvdXJjZXNBcmVFcXVhbCh7IGZpcnN0UmVwb3J0U291cmNlOiBpdGVtLnJlcG9ydFNvdXJjZSwgc2Vjb25kUmVwb3J0U291cmNlOiBjb250cm9sbGVyUmVwb3J0U291cmNlIH0pKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4Kys7XG5cbiAgICAgICAgICAgIGxldCBkZWxldGVDb3VudDogbnVtYmVyID0gdGhpcy5pc0JhY2t3YXJkc05hdmlnYXRpb25JblByb2dyZXNzID8gMCA6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXg7XG4gICAgICAgICAgICB0aGlzLmhpc3Rvcnkuc3BsaWNlKHRoaXMuY3VycmVudEhpc3RvcnlJbmRleCwgZGVsZXRlQ291bnQsIGhpc3RvcnlJdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNCYWNrd2FyZHNOYXZpZ2F0aW9uSW5Qcm9ncmVzcyA9IGZhbHNlXG5cbiAgICAgICAgcmV0dXJuIGhpc3RvcnlJdGVtO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVUZW1wSGlzdG9yeUl0ZW1zKCk6IHZvaWQge1xuICAgICAgICB2YXIgbGFzdEluZGV4ID0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgd2hpbGUgKGxhc3RJbmRleCA+PSAwICYmIHRoaXMuaGlzdG9yeVtsYXN0SW5kZXhdLnRlbXApIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5zcGxpY2UobGFzdEluZGV4LCAxKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEhpc3RvcnlJbmRleCA+PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RJbmRleC0tO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyUmVwb3J0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2VhcmNoV2luZG93T3BlbiA9IHRoaXMuaXNBaVByb21wdFdpbmRvd09wZW4gPSB0aGlzLnJlbmRlcmluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1NlYXJjaFdpbmRvd09wZW4gPSB0aGlzLnJlbmRlcmluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gMDtcbiAgICAgICAgdGhpcy5kb2N1bWVudEluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhZ2VOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2VJbmRleCArIDE7XG4gICAgfVxufVxuIl19