@progress/telerik-angular-native-report-viewer
Version:
Progress® Telerik® Native Report Viewer for Angular
214 lines (212 loc) • 24.8 kB
JavaScript
import { Component, ViewChild, forwardRef, ViewEncapsulation, } from '@angular/core';
import { ToolBarToolComponent } from '@progress/kendo-angular-toolbar';
import { ComboBoxComponent } from '@progress/kendo-angular-dropdowns';
import { zoomOptionsData } from '../models/zoom-level.interface';
import { windowRestoreIcon } from '@progress/kendo-svg-icons';
import { isDocumentAvailable } from '@progress/kendo-angular-common';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "../reporting-angular-viewer.service";
import * as i2 from "@angular/common";
import * as i3 from "@progress/kendo-angular-dropdowns";
import * as i4 from "@progress/kendo-angular-dialog";
import * as i5 from "@progress/kendo-angular-icons";
import * as i6 from "@progress/kendo-angular-buttons";
export class CustomZoomComponent extends ToolBarToolComponent {
constructor(service) {
super();
this.service = service;
this.openDialog = false;
this.tabindex = -1;
this.zoomOptionsData = zoomOptionsData;
this.currentZoom = zoomOptionsData[5];
this.windowRestoreIcon = windowRestoreIcon;
this.subs = new Subscription();
}
canFocus() {
return true; // marks the tools as focusable
}
focus() {
if (!isDocumentAvailable())
return;
this.tabindex = 0;
if (this.overflows) {
this.zoomButton?.nativeElement.focus();
}
else {
this.combobox?.focus();
this.combobox?.wrapper.nativeElement.focus();
}
}
handleKey() {
this.tabindex = -1;
return false;
}
ngAfterViewInit() {
this.subs.add(this.service.onZoomChange.subscribe(zoomLevel => {
this.currentZoom = zoomOptionsData?.find(zoomData => zoomData.value === zoomLevel);
}));
}
ngOnDestroy() {
this.subs.unsubscribe();
}
zoomLevelChange(zoomLevel) {
if (!isDocumentAvailable())
return;
const defaultZoom = zoomOptionsData.filter(zoom => zoom.value === 1)[0];
if (!zoomLevel && this.currentZoom === defaultZoom) {
this.currentZoom = defaultZoom;
return;
}
if (!zoomLevel && this.currentZoom !== defaultZoom) {
this.currentZoom = defaultZoom;
}
if (zoomLevel)
this.currentZoom = zoomLevel;
this.service.setScaleMode(this.getScaleModeAsNumber(this.currentZoom.type));
if (this.currentZoom.type === 'specific') {
this.service.setScale(this.currentZoom.value);
}
}
get localeMessage() {
return this.service.options.messages[`ReportViewer_ToolbarZoomComboBoxPlaceholderText`];
}
getScaleModeAsNumber(scaleMode) {
return scaleMode === 'fitPage' ? 0 : scaleMode === 'fitPageWidth' ? 1 : 2;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomZoomComponent, deps: [{ token: i1.ReportingAngularViewerService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CustomZoomComponent, selector: "custom-zoom-tool", providers: [
{ provide: ToolBarToolComponent, useExisting: forwardRef(() => CustomZoomComponent) }
], viewQueries: [{ propertyName: "toolbarTemplate", first: true, predicate: ["toolbarTemplate"], descendants: true, static: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "toolbarElement", first: true, predicate: ["toolbarElement"], descendants: true }, { propertyName: "popupElement", first: true, predicate: ["popupElement"], descendants: true }, { propertyName: "zoomButton", first: true, predicate: ["zoomButton"], descendants: true }, { propertyName: "combobox", first: true, predicate: ["combobox"], descendants: true, read: ComboBoxComponent }], usesInheritance: true, ngImport: i0, template: `
<ng-template #toolbarTemplate>
<span #toolbarElement>
<kendo-combobox
#combobox
textField="text"
valueField="value"
[tabindex]="tabindex"
[placeholder]="localeMessage"
[data]="zoomOptionsData"
[valuePrimitive]="false"
[value]="currentZoom"
(valueChange)="zoomLevelChange($event)">
[title]="localeMessage"
</kendo-combobox>
</span>
</ng-template>
<ng-template #popupTemplate>
<span #popupElement>
<button
#zoomButton
kendoButton
class="zoom-level-btn"
fillMode="flat"
[tabindex]="tabindex"
(click)="openDialog = true"
>
<div class="zoom-level-btn-content">
<span> {{ localeMessage }} </span>
<kendo-svgicon name="window-restore" [icon]="windowRestoreIcon"></kendo-svgicon>
</div>
</button>
</span>
<kendo-dialog
[width]="300"
[height]="120"
[title]="localeMessage"
*ngIf="openDialog"
(close)="openDialog = false"
>
<kendo-dropdownlist
textField="text"
valueField="value"
[tabindex]="tabindex"
[valuePrimitive]="false"
[data]="zoomOptionsData"
[value]="currentZoom"
[title]="localeMessage"
(valueChange)="zoomLevelChange($event)"
>
</kendo-dropdownlist>
</kendo-dialog>
</ng-template>
`, isInline: true, styles: [".zoom-level-btn{width:100%}.zoom-level-btn .k-button-text{width:inherit}.zoom-level-btn .zoom-level-btn-content{display:flex;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "component", type: i4.DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation", "themeColor"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: i5.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }, { kind: "component", type: i3.ComboBoxComponent, selector: "kendo-combobox", inputs: ["icon", "svgIcon", "inputAttributes", "showStickyHeader", "focusableId", "allowCustom", "data", "value", "textField", "valueField", "valuePrimitive", "valueNormalizer", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "suggest", "clearButton", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "selectionChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur", "inputFocus", "inputBlur", "escape"], exportAs: ["kendoComboBox"] }, { kind: "component", type: i6.ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomZoomComponent, decorators: [{
type: Component,
args: [{ providers: [
{ provide: ToolBarToolComponent, useExisting: forwardRef(() => CustomZoomComponent) }
], selector: 'custom-zoom-tool', template: `
<ng-template #toolbarTemplate>
<span #toolbarElement>
<kendo-combobox
#combobox
textField="text"
valueField="value"
[tabindex]="tabindex"
[placeholder]="localeMessage"
[data]="zoomOptionsData"
[valuePrimitive]="false"
[value]="currentZoom"
(valueChange)="zoomLevelChange($event)">
[title]="localeMessage"
</kendo-combobox>
</span>
</ng-template>
<ng-template #popupTemplate>
<span #popupElement>
<button
#zoomButton
kendoButton
class="zoom-level-btn"
fillMode="flat"
[tabindex]="tabindex"
(click)="openDialog = true"
>
<div class="zoom-level-btn-content">
<span> {{ localeMessage }} </span>
<kendo-svgicon name="window-restore" [icon]="windowRestoreIcon"></kendo-svgicon>
</div>
</button>
</span>
<kendo-dialog
[width]="300"
[height]="120"
[title]="localeMessage"
*ngIf="openDialog"
(close)="openDialog = false"
>
<kendo-dropdownlist
textField="text"
valueField="value"
[tabindex]="tabindex"
[valuePrimitive]="false"
[data]="zoomOptionsData"
[value]="currentZoom"
[title]="localeMessage"
(valueChange)="zoomLevelChange($event)"
>
</kendo-dropdownlist>
</kendo-dialog>
</ng-template>
`, encapsulation: ViewEncapsulation.None, styles: [".zoom-level-btn{width:100%}.zoom-level-btn .k-button-text{width:inherit}.zoom-level-btn .zoom-level-btn-content{display:flex;align-items:center;justify-content:space-between}\n"] }]
}], ctorParameters: function () { return [{ type: i1.ReportingAngularViewerService }]; }, propDecorators: { toolbarTemplate: [{
type: ViewChild,
args: ['toolbarTemplate', { static: true }]
}], popupTemplate: [{
type: ViewChild,
args: ['popupTemplate', { static: true }]
}], toolbarElement: [{
type: ViewChild,
args: ['toolbarElement']
}], popupElement: [{
type: ViewChild,
args: ['popupElement']
}], zoomButton: [{
type: ViewChild,
args: ['zoomButton']
}], combobox: [{
type: ViewChild,
args: ['combobox', { read: ComboBoxComponent, static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9vbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xiYXItdG9vbHMvem9vbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxTQUFTLEVBRVQsVUFBVSxFQUVWLGlCQUFpQixHQUVwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUd2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFXLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7QUErRXBDLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxvQkFBb0I7SUFrQnpELFlBQW1CLE9BQXNDO1FBQ3JELEtBQUssRUFBRSxDQUFDO1FBRE8sWUFBTyxHQUFQLE9BQU8sQ0FBK0I7UUFSbEQsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixhQUFRLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsb0JBQWUsR0FBZ0IsZUFBZSxDQUFDO1FBQy9DLGdCQUFXLEdBQWMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLHNCQUFpQixHQUFZLGlCQUFpQixDQUFDO1FBRTlDLFNBQUksR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUloRCxDQUFDO0lBRWUsUUFBUTtRQUNwQixPQUFPLElBQUksQ0FBQyxDQUFDLCtCQUErQjtJQUNoRCxDQUFDO0lBRWUsS0FBSztRQUNqQixJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFBRSxPQUFPO1FB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LG9CQUFvQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDLEVBQUU7cUJBQ3hGLFlBQ1Msa0JBQWtCLFlBQ2xCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzRFQsaUJBZ0JjLGlCQUFpQixDQUFDLElBQUk7b0hBSzJCLGVBQWU7c0JBQTlFLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNnQixhQUFhO3NCQUExRSxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1IsY0FBYztzQkFBakQsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ08sWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxjQUFjO2dCQUNPLFVBQVU7c0JBQXpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDbUQsUUFBUTtzQkFBakYsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGZvcndhcmRSZWYsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9vbEJhclRvb2xDb21wb25lbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci10b29sYmFyJztcbmltcG9ydCB7IFJlcG9ydGluZ0FuZ3VsYXJWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vcmVwb3J0aW5nLWFuZ3VsYXItdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NhbGVNb2RlIH0gZnJvbSAnLi4vbW9kZWxzL3R5cGVzJztcbmltcG9ydCB7IENvbWJvQm94Q29tcG9uZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zJztcbmltcG9ydCB7IFpvb21MZXZlbCwgem9vbU9wdGlvbnNEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL3pvb20tbGV2ZWwuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNWR0ljb24sIHdpbmRvd1Jlc3RvcmVJY29uIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBpc0RvY3VtZW50QXZhaWxhYmxlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBUb29sQmFyVG9vbENvbXBvbmVudCwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VzdG9tWm9vbUNvbXBvbmVudCkgfVxuICAgIF0sXG4gICAgc2VsZWN0b3I6ICdjdXN0b20tem9vbS10b29sJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxzcGFuICN0b29sYmFyRWxlbWVudD5cbiAgICAgICAgICAgICAgICA8a2VuZG8tY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgI2NvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUZpZWxkPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInpvb21PcHRpb25zRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZVByaW1pdGl2ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50Wm9vbVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ6b29tTGV2ZWxDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgPC9rZW5kby1jb21ib2JveD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNwb3B1cFRlbXBsYXRlPlxuICAgICAgICAgICAgPHNwYW4gI3BvcHVwRWxlbWVudD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICN6b29tQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGtlbmRvQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiem9vbS1sZXZlbC1idG5cIlxuICAgICAgICAgICAgICAgICAgICBmaWxsTW9kZT1cImZsYXRcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkRpYWxvZyA9IHRydWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInpvb20tbGV2ZWwtYnRuLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBsb2NhbGVNZXNzYWdlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxrZW5kby1zdmdpY29uIG5hbWU9XCJ3aW5kb3ctcmVzdG9yZVwiIFtpY29uXT1cIndpbmRvd1Jlc3RvcmVJY29uXCI+PC9rZW5kby1zdmdpY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPGtlbmRvLWRpYWxvZ1xuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIzMDBcIlxuICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTIwXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcGVuRGlhbG9nXCJcbiAgICAgICAgICAgICAgICAoY2xvc2UpPVwib3BlbkRpYWxvZyA9IGZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8a2VuZG8tZHJvcGRvd25saXN0XG4gICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZD1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUZpZWxkPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVQcmltaXRpdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ6b29tT3B0aW9uc0RhdGFcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFpvb21cIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxlTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ6b29tTGV2ZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwva2VuZG8tZHJvcGRvd25saXN0PlxuICAgICAgICAgICAgPC9rZW5kby1kaWFsb2c+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgYCxcbiAgICBzdHlsZXM6IFtgXG4gICAgICAgIC56b29tLWxldmVsLWJ0biB7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC56b29tLWxldmVsLWJ0biAuay1idXR0b24tdGV4dCB7XG4gICAgICAgICAgICB3aWR0aDogaW5oZXJpdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC56b29tLWxldmVsLWJ0biAuem9vbS1sZXZlbC1idG4tY29udGVudCB7XG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgfVxuICAgIGBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tWm9vbUNvbXBvbmVudCBleHRlbmRzIFRvb2xCYXJUb29sQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuXG4gICAgQFZpZXdDaGlsZCgndG9vbGJhclRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG92ZXJyaWRlIHRvb2xiYXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIEBWaWV3Q2hpbGQoJ3BvcHVwVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgb3ZlcnJpZGUgcG9wdXBUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJFbGVtZW50JykgcHVibGljIHRvb2xiYXJFbGVtZW50PzogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdwb3B1cEVsZW1lbnQnKSBwdWJsaWMgcG9wdXBFbGVtZW50PzogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd6b29tQnV0dG9uJykgcHVibGljIHpvb21CdXR0b24/OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbWJvYm94JywgeyByZWFkOiBDb21ib0JveENvbXBvbmVudCwgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgY29tYm9ib3g/OiBDb21ib0JveENvbXBvbmVudDtcblxuICAgIHB1YmxpYyBvcGVuRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSAtMTtcbiAgICBwdWJsaWMgem9vbU9wdGlvbnNEYXRhOiBab29tTGV2ZWxbXSA9IHpvb21PcHRpb25zRGF0YTtcbiAgICBwdWJsaWMgY3VycmVudFpvb206IFpvb21MZXZlbCA9IHpvb21PcHRpb25zRGF0YVs1XTtcbiAgICBwdWJsaWMgd2luZG93UmVzdG9yZUljb246IFNWR0ljb24gPSB3aW5kb3dSZXN0b3JlSWNvbjtcblxuICAgIHByaXZhdGUgc3ViczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHNlcnZpY2U6IFJlcG9ydGluZ0FuZ3VsYXJWaWV3ZXJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNhbkZvY3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gbWFya3MgdGhlIHRvb2xzIGFzIGZvY3VzYWJsZVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLnRhYmluZGV4ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5vdmVyZmxvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuem9vbUJ1dHRvbj8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb21ib2JveD8uZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuY29tYm9ib3g/LndyYXBwZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGhhbmRsZUtleSgpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy50YWJpbmRleCA9IC0xO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLnNlcnZpY2Uub25ab29tQ2hhbmdlLnN1YnNjcmliZSh6b29tTGV2ZWwgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IHpvb21PcHRpb25zRGF0YT8uZmluZCh6b29tRGF0YSA9PiB6b29tRGF0YS52YWx1ZSA9PT0gem9vbUxldmVsKSBhcyBab29tTGV2ZWw7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB6b29tTGV2ZWxDaGFuZ2Uoem9vbUxldmVsOiBab29tTGV2ZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50QXZhaWxhYmxlKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBkZWZhdWx0Wm9vbSA9IHpvb21PcHRpb25zRGF0YS5maWx0ZXIoem9vbSA9PiB6b29tLnZhbHVlID09PSAxKVswXTtcblxuICAgICAgICBpZiAoIXpvb21MZXZlbCAmJiB0aGlzLmN1cnJlbnRab29tID09PSBkZWZhdWx0Wm9vbSkgeyBcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFpvb20gPSBkZWZhdWx0Wm9vbTsgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXpvb21MZXZlbCAmJiB0aGlzLmN1cnJlbnRab29tICE9PSBkZWZhdWx0Wm9vbSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IGRlZmF1bHRab29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHpvb21MZXZlbCkgdGhpcy5jdXJyZW50Wm9vbSA9IHpvb21MZXZlbDtcblxuICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0U2NhbGVNb2RlKHRoaXMuZ2V0U2NhbGVNb2RlQXNOdW1iZXIodGhpcy5jdXJyZW50Wm9vbS50eXBlIGFzIFNjYWxlTW9kZSkpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRab29tLnR5cGUgPT09ICdzcGVjaWZpYycpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRTY2FsZSg8bnVtYmVyPnRoaXMuY3VycmVudFpvb20udmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGVNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2Uub3B0aW9ucy5tZXNzYWdlc1tgUmVwb3J0Vmlld2VyX1Rvb2xiYXJab29tQ29tYm9Cb3hQbGFjZWhvbGRlclRleHRgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNjYWxlTW9kZUFzTnVtYmVyKHNjYWxlTW9kZTogU2NhbGVNb2RlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlTW9kZSA9PT0gJ2ZpdFBhZ2UnID8gMCA6IHNjYWxlTW9kZSA9PT0gJ2ZpdFBhZ2VXaWR0aCcgPyAxIDogMjtcbiAgICB9XG59Il19