stimulsoft-viewer-angular
Version:
Stimulsoft Viewer Angular
181 lines • 28.5 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../services/controller.service";
import * as i2 from "../services/model.service";
import * as i3 from "../services/styles.service";
import * as i4 from "../services/interactions.service";
import * as i5 from "@angular/common";
import * as i6 from "./page.component";
export class ReportPanelComponent {
constructor(controller, model, stylesService, interactionService) {
this.controller = controller;
this.model = model;
this.stylesService = stylesService;
this.interactionService = interactionService;
this.touchZoomFirstDistance = 0;
this.touchZoomSecondDistance = 0;
this.touchZoomValue = 0;
this.maxHeights = {};
controller.getMessage().subscribe((message) => {
if (message.action !== 'viewer_loaded' && this.model.reportParams.pagesArray) {
if (this.model.reportParams.repaintOnlyDashboardContent) {
// jsObject.controls.reportPanel.repaintDashboardContent(parameters);
}
else {
this.loadPages();
}
}
if (message.action === 'GetReport' || message.action === 'OpenReport') {
setTimeout(() => {
if (!this.model.options.isParametersReceived && ((this.model.reportParams.type === 'Report' && this.model.options.toolbar.showParametersButton) || this.model.reportParams.type === 'Dashboard')) {
interactionService.postInteraction({ action: 'InitVars' });
}
if (this.model.reportParams.autoZoom) {
this.controller.action({ name: this.model.reportParams.autoZoom === -1 ? 'ZoomPageWidth' : 'ZoomOnePage' });
this.model.reportParams.autoZoom = null;
}
});
}
});
}
ngOnInit() { }
ngAfterViewInit() {
this.model.controls.reportPanel.el = this.element;
}
loadPages() {
this.maxHeights = {};
const pagesArray = this.model.reportParams.pagesArray;
this.stylesService.setupStyle(pagesArray[pagesArray.length - 2], 'page');
const chartScript = pagesArray[pagesArray.length - 1];
this.model.pages = pagesArray.slice(0, pagesArray.length - 2);
setTimeout(() => {
this.model.pages.forEach(page => this.interactionService.initializeInteractions(page.page));
this.interactionService.updateAllHyperLinks();
this.stylesService.addChartScript(chartScript);
});
}
get position() {
return this.model.options.heightType !== 'Percentage' || this.model.options.appearance.scrollbarsMode ? 'absolute' : 'relative';
}
scroll() {
if (this.model.pagesNavigationIsActive()) {
clearTimeout(this.scrollTimeout);
// update current page number
this.scrollTimeout = setTimeout(() => {
let commonPagesHeight = 0;
let index = 0;
for (index = 0; index < this.model.pages.length; index++) {
commonPagesHeight += this.model.pages[index].page.offsetHeight + 10;
if (commonPagesHeight > this.element.nativeElement.scrollTop) {
break;
}
}
if (index < this.model.reportParams.pagesCount && index >= 0 && index !== this.model.reportParams.pageNumber) {
this.model.reportParams.pageNumber = index;
}
}, 300);
}
}
eventTouchStart(e) {
this.touchesLength++;
this.touchStartX = parseInt(e.changedTouches[0].clientX, 10);
if (this.model.options.appearance.allowTouchZoom && this.touchesLength === 1) {
this.touchZoomFirstDistance = 0;
this.touchZoomSecondDistance = 0;
this.touchZoomValue = 0;
}
}
eventTouchMove(e) {
if (this.model.options.appearance.allowTouchZoom && e.touches.length > 1) {
if ('preventDefault' in e) {
e.preventDefault();
}
this.touchZoomSecondDistance = Math.sqrt(Math.pow(e.touches[0].pageX - e.touches[1].pageX, 2) + Math.pow(e.touches[0].pageY - e.touches[1].pageY, 2));
if (this.touchZoomFirstDistance === 0) {
this.touchZoomFirstDistance = Math.sqrt(Math.pow(e.touches[0].pageX - e.touches[1].pageX, 2) + Math.pow(e.touches[0].pageY - e.touches[1].pageY, 2));
}
const touchZoomOffset = Math.trunc((this.touchZoomSecondDistance - this.touchZoomFirstDistance) / 2.5);
if (Math.abs(touchZoomOffset) >= 5) {
this.touchZoomValue = Math.trunc((this.model.reportParams.zoom + touchZoomOffset) / 5) * 5;
this.touchZoomValue = Math.min(Math.max(this.touchZoomValue, 20), 200);
this.controller.actionSubject.next({ action: 'centerText', data: this.touchZoomValue.toString() });
}
}
}
eventTouchEnd(e) {
if (this.touchesLength > 0) {
this.touchesLength--;
}
if (this.model.options.isMobileDevice && this.model.options.toolbar.autoHide) {
if (Math.trunc(this.touchStartX - e.changedTouches[0].clientX) !== 0) {
this.controller.keepToolbar();
}
else {
if (!this.model.controls.toolbar.visible) {
this.controller.showToolbar();
}
else {
this.controller.hideToolbar();
}
}
}
if (this.model.options.appearance.allowTouchZoom && this.touchZoomValue !== 0 && this.touchesLength === 0) {
this.controller.actionSubject.next({ action: 'hideCenterText' });
this.model.reportParams.zoom = this.touchZoomValue;
this.controller.post('GetPages');
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportPanelComponent, deps: [{ token: i1.ControllerService }, { token: i2.ModelService }, { token: i3.StylesService }, { token: i4.InteractionsService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReportPanelComponent, selector: "sti-report-panel", viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true }], ngImport: i0, template: `
<div #element
[style.textAlign]="model.options.appearance.pageAlignment == 'default' ? 'center' : model.options.appearance.pageAlignment"
[style.top]="0"
[style.bottom]="0"
[style.position]="position"
[style.height]="model.options.heightType != 'Percentage' || model.options.appearance.scrollbarsMode ? 'auto' : 'calc(100% - 35px)'"
[style.overflow] = "model.reportParams.type == 'Report' && model.options.appearance.scrollbarsMode ? 'auto' : 'hidden'"
[style.marginTop.px]="model.controls.reportPanel.layout.top"
[style.marginLeft.px]="model.controls.reportPanel.layout.left"
[style.marginBottom.px]="position == 'absolute' ? model.controls.reportPanel.layout.bottom : 0"
[style.paddingBottom.px]="position == 'relative' ? model.controls.reportPanel.layout.bottom : 0"
[style.transition]="model.options.isMobileDevice ? 'margin 200ms ease' : null"
(scroll)="scroll()"
class="stiJsViewerReportPanel"
(touchstart)="eventTouchStart($event)"
(touchmove)="eventTouchMove($event)"
(touchend)="eventTouchEnd($event)">
<sti-page *ngFor="let page of model.pages" [pageAttributes]="page"></sti-page>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i6.PageComponent, selector: "sti-page", inputs: ["pageAttributes"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportPanelComponent, decorators: [{
type: Component,
args: [{
selector: 'sti-report-panel',
template: `
<div #element
[style.textAlign]="model.options.appearance.pageAlignment == 'default' ? 'center' : model.options.appearance.pageAlignment"
[style.top]="0"
[style.bottom]="0"
[style.position]="position"
[style.height]="model.options.heightType != 'Percentage' || model.options.appearance.scrollbarsMode ? 'auto' : 'calc(100% - 35px)'"
[style.overflow] = "model.reportParams.type == 'Report' && model.options.appearance.scrollbarsMode ? 'auto' : 'hidden'"
[style.marginTop.px]="model.controls.reportPanel.layout.top"
[style.marginLeft.px]="model.controls.reportPanel.layout.left"
[style.marginBottom.px]="position == 'absolute' ? model.controls.reportPanel.layout.bottom : 0"
[style.paddingBottom.px]="position == 'relative' ? model.controls.reportPanel.layout.bottom : 0"
[style.transition]="model.options.isMobileDevice ? 'margin 200ms ease' : null"
(scroll)="scroll()"
class="stiJsViewerReportPanel"
(touchstart)="eventTouchStart($event)"
(touchmove)="eventTouchMove($event)"
(touchend)="eventTouchEnd($event)">
<sti-page *ngFor="let page of model.pages" [pageAttributes]="page"></sti-page>
</div>
`
}]
}], ctorParameters: () => [{ type: i1.ControllerService }, { type: i2.ModelService }, { type: i3.StylesService }, { type: i4.InteractionsService }], propDecorators: { element: [{
type: ViewChild,
args: ['element']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtdmlld2VyLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3JlcG9ydC1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQTZCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQWdDeEYsTUFBTSxPQUFPLG9CQUFvQjtJQWEvQixZQUFvQixVQUE2QixFQUFTLEtBQW1CLEVBQVUsYUFBNEIsRUFBVSxrQkFBdUM7UUFBaEosZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXFCO1FBUDVKLDJCQUFzQixHQUFHLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUM7UUFDNUIsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFHcEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUlyQixVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1lBRXJELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxlQUFlLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzdFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztvQkFDeEQscUVBQXFFO2dCQUN2RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLE1BQU0s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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbGxlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb250cm9sbGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3R5bGVzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0eWxlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW50ZXJhY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ludGVyYWN0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4uL3NlcnZpY2VzL29iamVjdHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzdGktcmVwb3J0LXBhbmVsJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiAjZWxlbWVudFxyXG4gICAgICAgICBbc3R5bGUudGV4dEFsaWduXT1cIm1vZGVsLm9wdGlvbnMuYXBwZWFyYW5jZS5wYWdlQWxpZ25tZW50ID09ICdkZWZhdWx0JyA/ICdjZW50ZXInIDogbW9kZWwub3B0aW9ucy5hcHBlYXJhbmNlLnBhZ2VBbGlnbm1lbnRcIlxyXG4gICAgICAgICBbc3R5bGUudG9wXT1cIjBcIlxyXG4gICAgICAgICBbc3R5bGUuYm90dG9tXT1cIjBcIlxyXG4gICAgICAgICBbc3R5bGUucG9zaXRpb25dPVwicG9zaXRpb25cIlxyXG4gICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIm1vZGVsLm9wdGlvbnMuaGVpZ2h0VHlwZSAhPSAnUGVyY2VudGFnZScgfHwgbW9kZWwub3B0aW9ucy5hcHBlYXJhbmNlLnNjcm9sbGJhcnNNb2RlID8gJ2F1dG8nIDogJ2NhbGMoMTAwJSAtIDM1cHgpJ1wiXHJcbiAgICAgICAgIFtzdHlsZS5vdmVyZmxvd10gPSBcIm1vZGVsLnJlcG9ydFBhcmFtcy50eXBlID09ICdSZXBvcnQnICYmIG1vZGVsLm9wdGlvbnMuYXBwZWFyYW5jZS5zY3JvbGxiYXJzTW9kZSA/ICdhdXRvJyA6ICdoaWRkZW4nXCJcclxuICAgICAgICAgW3N0eWxlLm1hcmdpblRvcC5weF09XCJtb2RlbC5jb250cm9scy5yZXBvcnRQYW5lbC5sYXlvdXQudG9wXCJcclxuICAgICAgICAgW3N0eWxlLm1hcmdpbkxlZnQucHhdPVwibW9kZWwuY29udHJvbHMucmVwb3J0UGFuZWwubGF5b3V0LmxlZnRcIlxyXG4gICAgICAgICBbc3R5bGUubWFyZ2luQm90dG9tLnB4XT1cInBvc2l0aW9uID09ICdhYnNvbHV0ZScgPyBtb2RlbC5jb250cm9scy5yZXBvcnRQYW5lbC5sYXlvdXQuYm90dG9tIDogMFwiXHJcbiAgICAgICAgIFtzdHlsZS5wYWRkaW5nQm90dG9tLnB4XT1cInBvc2l0aW9uID09ICdyZWxhdGl2ZScgPyBtb2RlbC5jb250cm9scy5yZXBvcnRQYW5lbC5sYXlvdXQuYm90dG9tIDogMFwiXHJcbiAgICAgICAgIFtzdHlsZS50cmFuc2l0aW9uXT1cIm1vZGVsLm9wdGlvbnMuaXNNb2JpbGVEZXZpY2UgPyAnbWFyZ2luIDIwMG1zIGVhc2UnIDogbnVsbFwiXHJcbiAgICAgICAgIChzY3JvbGwpPVwic2Nyb2xsKClcIlxyXG4gICAgICAgICBjbGFzcz1cInN0aUpzVmlld2VyUmVwb3J0UGFuZWxcIlxyXG4gICAgICAgICAodG91Y2hzdGFydCk9XCJldmVudFRvdWNoU3RhcnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICh0b3VjaG1vdmUpPVwiZXZlbnRUb3VjaE1vdmUoJGV2ZW50KVwiXHJcbiAgICAgICAgICh0b3VjaGVuZCk9XCJldmVudFRvdWNoRW5kKCRldmVudClcIj5cclxuICAgICAgPHN0aS1wYWdlICpuZ0Zvcj1cImxldCBwYWdlIG9mIG1vZGVsLnBhZ2VzXCIgW3BhZ2VBdHRyaWJ1dGVzXT1cInBhZ2VcIj48L3N0aS1wYWdlPlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlcG9ydFBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZWxlbWVudCcpIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsVGltZW91dDogYW55O1xyXG4gIHByaXZhdGUgdG91Y2hlc0xlbmd0aDogbnVtYmVyO1xyXG4gIHByaXZhdGUgdG91Y2hab29tRmlyc3REaXN0YW5jZSA9IDA7XHJcbiAgcHJpdmF0ZSB0b3VjaFpvb21TZWNvbmREaXN0YW5jZSA9IDA7XHJcbiAgcHJpdmF0ZSB0b3VjaFpvb21WYWx1ZSA9IDA7XHJcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0WDogbnVtYmVyO1xyXG5cclxuICBwdWJsaWMgbWF4SGVpZ2h0cyA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXJTZXJ2aWNlLCBwdWJsaWMgbW9kZWw6IE1vZGVsU2VydmljZSwgcHJpdmF0ZSBzdHlsZXNTZXJ2aWNlOiBTdHlsZXNTZXJ2aWNlLCBwcml2YXRlIGludGVyYWN0aW9uU2VydmljZTogSW50ZXJhY3Rpb25zU2VydmljZSkge1xyXG5cclxuICAgIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgpLnN1YnNjcmliZSgobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKG1lc3NhZ2UuYWN0aW9uICE9PSAndmlld2VyX2xvYWRlZCcgJiYgdGhpcy5tb2RlbC5yZXBvcnRQYXJhbXMucGFnZXNBcnJheSkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLnJlcG9ydFBhcmFtcy5yZXBhaW50T25seURhc2hib2FyZENvbnRlbnQpIHtcclxuICAgICAgICAgIC8vIGpzT2JqZWN0LmNvbnRyb2xzLnJlcG9ydFBhbmVsLnJlcGFpbnREYXNoYm9hcmRDb250ZW50KHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRQYWdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG1lc3NhZ2UuYWN0aW9uID09PSAnR2V0UmVwb3J0JyB8fCBtZXNzYWdlLmFjdGlvbiA9PT0gJ09wZW5SZXBvcnQnKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMubW9kZWwub3B0aW9ucy5pc1BhcmFtZXRlcnNSZWNlaXZlZCAmJiAoKHRoaXMubW9kZWwucmVwb3J0UGFyYW1zLnR5cGUgPT09ICdSZXBvcnQnICYmIHRoaXMubW9kZWwub3B0aW9ucy50b29sYmFyLnNob3dQYXJhbWV0ZXJzQnV0dG9uKSB8fCB0aGlzLm1vZGVsLnJlcG9ydFBhcmFtcy50eXBlID09PSAnRGFzaGJvYXJkJykpIHtcclxuICAgICAgICAgICAgaW50ZXJhY3Rpb25TZXJ2aWNlLnBvc3RJbnRlcmFjdGlvbih7IGFjdGlvbjogJ0luaXRWYXJzJyB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5tb2RlbC5yZXBvcnRQYXJhbXMuYXV0b1pvb20pIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFjdGlvbih7IG5hbWU6IHRoaXMubW9kZWwucmVwb3J0UGFyYW1zLmF1dG9ab29tID09PSAtMSA/ICdab29tUGFnZVdpZHRoJyA6ICdab29tT25lUGFnZScgfSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVwb3J0UGFyYW1zLmF1dG9ab29tID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbC5jb250cm9scy5yZXBvcnRQYW5lbC5lbCA9IHRoaXMuZWxlbWVudDtcclxuICB9XHJcblxyXG4gIGxvYWRQYWdlcygpIHtcclxuICAgIHRoaXMubWF4SGVpZ2h0cyA9IHt9O1xyXG4gICAgY29uc3QgcGFnZXNBcnJheTogW10gPSB0aGlzLm1vZGVsLnJlcG9ydFBhcmFtcy5wYWdlc0FycmF5O1xyXG4gICAgdGhpcy5zdHlsZXNTZXJ2aWNlLnNldHVwU3R5bGUocGFnZXNBcnJheVtwYWdlc0FycmF5Lmxlbmd0aCAtIDJdLCAncGFnZScpO1xyXG4gICAgY29uc3QgY2hhcnRTY3JpcHQgPSBwYWdlc0FycmF5W3BhZ2VzQXJyYXkubGVuZ3RoIC0gMV07XHJcbiAgICB0aGlzLm1vZGVsLnBhZ2VzID0gcGFnZXNBcnJheS5zbGljZSgwLCBwYWdlc0FycmF5Lmxlbmd0aCAtIDIpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLm1vZGVsLnBhZ2VzLmZvckVhY2gocGFnZSA9PiB0aGlzLmludGVyYWN0aW9uU2VydmljZS5pbml0aWFsaXplSW50ZXJhY3Rpb25zKHBhZ2UucGFnZSkpO1xyXG4gICAgICB0aGlzLmludGVyYWN0aW9uU2VydmljZS51cGRhdGVBbGxIeXBlckxpbmtzKCk7XHJcbiAgICAgIHRoaXMuc3R5bGVzU2VydmljZS5hZGRDaGFydFNjcmlwdChjaGFydFNjcmlwdCk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsLm9wdGlvbnMuaGVpZ2h0VHlwZSAhPT0gJ1BlcmNlbnRhZ2UnIHx8IHRoaXMubW9kZWwub3B0aW9ucy5hcHBlYXJhbmNlLnNjcm9sbGJhcnNNb2RlID8gJ2Fic29sdXRlJyA6ICdyZWxhdGl2ZSc7XHJcbiAgfVxyXG5cclxuICBzY3JvbGwoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlbC5wYWdlc05hdmlnYXRpb25Jc0FjdGl2ZSgpKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRpbWVvdXQpO1xyXG5cclxuICAgICAgLy8gdXBkYXRlIGN1cnJlbnQgcGFnZSBudW1iZXJcclxuICAgICAgdGhpcy5zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbW1vblBhZ2VzSGVpZ2h0ID0gMDtcclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm1vZGVsLnBhZ2VzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgY29tbW9uUGFnZXNIZWlnaHQgKz0gdGhpcy5tb2RlbC5wYWdlc1tpbmRleF0ucGFnZS5vZmZzZXRIZWlnaHQgKyAxMDtcclxuICAgICAgICAgIGlmIChjb21tb25QYWdlc0hlaWdodCA+IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMubW9kZWwucmVwb3J0UGFyYW1zLnBhZ2VzQ291bnQgJiYgaW5kZXggPj0gMCAmJiBpbmRleCAhPT0gdGhpcy5tb2RlbC5yZXBvcnRQYXJhbXMucGFnZU51bWJlcikge1xyXG4gICAgICAgICAgdGhpcy5tb2RlbC5yZXBvcnRQYXJhbXMucGFnZU51bWJlciA9IGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMzAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBldmVudFRvdWNoU3RhcnQoZTogYW55KSB7XHJcbiAgICB0aGlzLnRvdWNoZXNMZW5ndGgrKztcclxuICAgIHRoaXMudG91Y2hTdGFydFggPSBwYXJzZUludChlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsIDEwKTtcclxuXHJcbiAgICBpZiAodGhpcy5tb2RlbC5vcHRpb25zLmFwcGVhcmFuY2UuYWxsb3dUb3VjaFpvb20gJiYgdGhpcy50b3VjaGVzTGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMudG91Y2hab29tRmlyc3REaXN0YW5jZSA9IDA7XHJcbiAgICAgIHRoaXMudG91Y2hab29tU2Vjb25kRGlzdGFuY2UgPSAwO1xyXG4gICAgICB0aGlzLnRvdWNoWm9vbVZhbHVlID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBldmVudFRvdWNoTW92ZShlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm1vZGVsLm9wdGlvbnMuYXBwZWFyYW5jZS5hbGxvd1RvdWNoWm9vbSAmJiBlLnRvdWNoZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICBpZiAoJ3ByZXZlbnREZWZhdWx0JyBpbiBlKSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxyXG5cclxuICAgICAgdGhpcy50b3VjaFpvb21TZWNvbmREaXN0YW5jZSA9IE1hdGguc3FydChNYXRoLnBvdyhlLnRvdWNoZXNbMF0ucGFnZVggLSBlLnRvdWNoZXNbMV0ucGFnZVgsIDIpICsgTWF0aC5wb3coZS50b3VjaGVzWzBdLnBhZ2VZIC0gZS50b3VjaGVzWzFdLnBhZ2VZLCAyKSk7XHJcbiAgICAgIGlmICh0aGlzLnRvdWNoWm9vbUZpcnN0RGlzdGFuY2UgPT09IDApIHtcclxuICAgICAgICB0aGlzLnRvdWNoWm9vbUZpcnN0RGlzdGFuY2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coZS50b3VjaGVzWzBdLnBhZ2VYIC0gZS50b3VjaGVzWzFdLnBhZ2VYLCAyKSArIE1hdGgucG93KGUudG91Y2hlc1swXS5wYWdlWSAtIGUudG91Y2hlc1sxXS5wYWdlWSwgMikpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0b3VjaFpvb21PZmZzZXQgPSBNYXRoLnRydW5jKCh0aGlzLnRvdWNoWm9vbVNlY29uZERpc3RhbmNlIC0gdGhpcy50b3VjaFpvb21GaXJzdERpc3RhbmNlKSAvIDIuNSk7XHJcbiAgICAgIGlmIChNYXRoLmFicyh0b3VjaFpvb21PZmZzZXQpID49IDUpIHtcclxuICAgICAgICB0aGlzLnRvdWNoWm9vbVZhbHVlID0gTWF0aC50cnVuYygodGhpcy5tb2RlbC5yZXBvcnRQYXJhbXMuem9vbSArIHRvdWNoWm9vbU9mZnNldCkgLyA1KSAqIDU7XHJcbiAgICAgICAgdGhpcy50b3VjaFpvb21WYWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMudG91Y2hab29tVmFsdWUsIDIwKSwgMjAwKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuYWN0aW9uU3ViamVjdC5uZXh0KHsgYWN0aW9uOiAnY2VudGVyVGV4dCcsIGRhdGE6IHRoaXMudG91Y2hab29tVmFsdWUudG9TdHJpbmcoKSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGV2ZW50VG91Y2hFbmQoZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy50b3VjaGVzTGVuZ3RoID4gMCkgeyB0aGlzLnRvdWNoZXNMZW5ndGgtLTsgfVxyXG5cclxuICAgIGlmICh0aGlzLm1vZGVsLm9wdGlvbnMuaXNNb2JpbGVEZXZpY2UgJiYgdGhpcy5tb2RlbC5vcHRpb25zLnRvb2xiYXIuYXV0b0hpZGUpIHtcclxuICAgICAgaWYgKE1hdGgudHJ1bmModGhpcy50b3VjaFN0YXJ0WCAtIGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCkgIT09IDApIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIua2VlcFRvb2xiYXIoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIXRoaXMubW9kZWwuY29udHJvbHMudG9vbGJhci52aXNpYmxlKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2hvd1Rvb2xiYXIoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sbGVyLmhpZGVUb29sYmFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZWwub3B0aW9ucy5hcHBlYXJhbmNlLmFsbG93VG91Y2hab29tICYmIHRoaXMudG91Y2hab29tVmFsdWUgIT09IDAgJiYgdGhpcy50b3VjaGVzTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbGxlci5hY3Rpb25TdWJqZWN0Lm5leHQoeyBhY3Rpb246ICdoaWRlQ2VudGVyVGV4dCcgfSk7XHJcbiAgICAgIHRoaXMubW9kZWwucmVwb3J0UGFyYW1zLnpvb20gPSB0aGlzLnRvdWNoWm9vbVZhbHVlO1xyXG4gICAgICB0aGlzLmNvbnRyb2xsZXIucG9zdCgnR2V0UGFnZXMnKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19