ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
2,418 lines • 397 kB
JavaScript
import { isPlatformBrowser } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Inject, Input, Output, PLATFORM_ID, ViewChild, } from '@angular/core';
import { PdfCursorTools } from './options/pdf-cursor-tools';
import { assetsUrl, getVersionSuffix, pdfDefaultOptions } from './options/pdf-default-options';
import { ScrollModeType } from './options/pdf-viewer';
import { VerbosityLevel } from './options/verbosity-level';
import { PdfDummyComponentsComponent } from './pdf-dummy-components/pdf-dummy-components.component';
import { NgxFormSupport } from './ngx-form-support';
import { PdfSidebarView } from './options/pdf-sidebar-views';
import * as i0 from "@angular/core";
import * as i1 from "./pdf-notification-service";
import * as i2 from "@angular/common";
import * as i3 from "./ngx-extended-pdf-viewer.service";
import * as i4 from "./pdf-script-loader.service";
import * as i5 from "./ngx-keyboard-manager.service";
import * as i6 from "./pdf-csp-policy.service";
import * as i7 from "./dynamic-css/dynamic-css.component";
import * as i8 from "./theme/acroform-default-theme/pdf-acroform-default-theme.component";
import * as i9 from "./pdf-dialog/pdf-add-signature-dialog/pdf-add-signature-dialog.component";
import * as i10 from "./toolbar/pdf-context-menu/pdf-context-menu.component";
import * as i11 from "./theme/pdf-dark-theme/pdf-dark-theme.component";
import * as i12 from "./pdf-dialog/pdf-alt-text-dialog/pdf-alt-text-dialog.component";
import * as i13 from "./pdf-dialog/pdf-alt-text-settings-dialog/pdf-alt-text-settings-dialog.component";
import * as i14 from "./pdf-dialog/pdf-document-properties-dialog/pdf-document-properties-dialog.component";
import * as i15 from "./pdf-dummy-components/pdf-dummy-components.component";
import * as i16 from "./pdf-dialog/pdf-edit-signature-dialog/pdf-edit-signature-dialog.component";
import * as i17 from "./pdf-dialog/pdf-error-message/pdf-error-message.component";
import * as i18 from "./toolbar/pdf-findbar/pdf-findbar.component";
import * as i19 from "./theme/pdf-light-theme/pdf-light-theme.component";
import * as i20 from "./pdf-dialog/pdf-password-dialog/pdf-password-dialog.component";
import * as i21 from "./pdf-dialog/pdf-prepare-printing-dialog/pdf-prepare-printing-dialog.component";
import * as i22 from "./secondary-toolbar/pdf-secondary-toolbar/pdf-secondary-toolbar.component";
import * as i23 from "./sidebar/pdf-sidebar/pdf-sidebar.component";
import * as i24 from "./toolbar/pdf-toolbar/pdf-toolbar.component";
import * as i25 from "./translate.pipe";
export function isIOS() {
if (typeof window === 'undefined') {
return false;
}
const userAgent = navigator?.userAgent;
if (!userAgent) {
return false;
}
return (/iPad|iPhone|iPod/.test(userAgent) ||
// iPad on iOS 13+ detection (reports as Mac)
(userAgent.includes('Mac') && 'ontouchend' in document));
}
export class NgxExtendedPdfViewerComponent {
platformId;
notificationService;
elementRef;
platformLocation;
cdr;
service;
renderer;
pdfScriptLoaderService;
keyboardManager;
cspPolicyService;
ngZone;
formSupport = new NgxFormSupport();
/**
* The dummy components are inserted automatically when the user customizes the toolbar
* without adding every original toolbar item. Without the dummy components, the
* initialization code of pdf.js crashes because it assume that every standard widget is there.
*/
dummyComponents;
root;
annotationEditorEvent = new EventEmitter();
/* UI templates */
customFindbarInputArea;
customToolbar;
customFindbar;
customFindbarButtons;
customPdfViewer;
customSecondaryToolbar;
customSidebar;
customThumbnail;
customFreeFloatingBar;
showFreeFloatingBar = true;
enableDragAndDrop = true;
forceUsingLegacyES5 = false;
localizationInitialized = false;
resizeObserver;
initialAngularFormData = undefined;
set formData(formData) {
this.initialAngularFormData ??= formData;
this.formSupport.formData = formData;
}
disableForms = false;
get formDataChange() {
return this.formSupport.formDataChange;
}
_pageViewMode = 'multiple';
baseHref;
/** This flag prevents trying to load a file twice if the user uploads it using the file upload dialog or via drag'n'drop */
srcChangeTriggeredByUser = false;
get pageViewMode() {
return this._pageViewMode;
}
set pageViewMode(viewMode) {
if (!isPlatformBrowser(this.platformId))
return;
const hasChanged = this._pageViewMode !== viewMode;
if (!hasChanged)
return;
const mustRedraw = !this.pdfScriptLoaderService.ngxExtendedPdfViewerIncompletelyInitialized && (this._pageViewMode === 'book' || viewMode === 'book');
this._pageViewMode = viewMode;
this.pageViewModeChange.emit(this._pageViewMode);
const PDFViewerApplicationOptions = this.pdfScriptLoaderService.PDFViewerApplicationOptions;
PDFViewerApplicationOptions?.set('pageViewMode', this.pageViewMode);
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
if (PDFViewerApplication) {
PDFViewerApplication.pdfViewer.pageViewMode = this._pageViewMode;
PDFViewerApplication.findController._pageViewMode = this._pageViewMode;
}
this.handleViewMode(viewMode);
if (mustRedraw) {
this.redrawViewer(viewMode);
}
}
handleViewMode(viewMode) {
switch (viewMode) {
case 'infinite-scroll':
this.handleInfiniteScrollMode();
break;
case 'single':
this.handleSinglePageMode();
break;
case 'book':
this.handleBookMode();
break;
case 'multiple':
this.handleMultiplePageMode();
break;
default:
this.scrollMode = ScrollModeType.vertical;
}
}
handleInfiniteScrollMode() {
if (this.scrollMode === ScrollModeType.page || this.scrollMode === ScrollModeType.horizontal) {
this.scrollMode = ScrollModeType.vertical;
this.pdfScriptLoaderService.PDFViewerApplication.eventBus.dispatch('switchscrollmode', { mode: Number(this.scrollMode) });
}
setTimeout(() => {
// this timeout is necessary because @Input() is called before the child components are initialized
// (and the DynamicCssComponent is a child component)
this.dynamicCSSComponent.removeScrollbarInInfiniteScrollMode(false, this.pageViewMode, this.primaryMenuVisible, this, this.logLevel);
});
}
// since pdf.js, our custom single-page-mode has been replaced by the standard scrollMode="page"
handleSinglePageMode() {
this.scrollMode = ScrollModeType.page;
this._pageViewMode = 'single';
}
handleBookMode() {
this.showBorders = false;
if (this.scrollMode !== ScrollModeType.vertical) {
this.scrollMode = ScrollModeType.vertical;
}
}
handleMultiplePageMode() {
if (this.scrollMode === ScrollModeType.page) {
this.scrollMode = ScrollModeType.vertical;
}
setTimeout(() => {
// this timeout is necessary because @Input() is called before the child components are initialized
// (and the DynamicCssComponent is a child component)
this.dynamicCSSComponent.removeScrollbarInInfiniteScrollMode(true, this.pageViewMode, this.primaryMenuVisible, this, this.logLevel);
});
}
redrawViewer(viewMode) {
if (viewMode !== 'book') {
const ngx = this.elementRef.nativeElement;
const viewerContainer = ngx.querySelector('#viewerContainer');
viewerContainer.style.width = '';
viewerContainer.style.overflow = '';
viewerContainer.style.marginRight = '';
viewerContainer.style.marginLeft = '';
const viewer = ngx.querySelector('#viewer');
viewer.style.maxWidth = '';
viewer.style.minWidth = '';
}
this.openPDF2();
}
markForCheck() {
this.cdr.markForCheck();
}
pageViewModeChange = new EventEmitter();
progress = new EventEmitter();
secondaryToolbarComponent;
dynamicCSSComponent;
sidebarComponent;
/* regular attributes */
_src;
srcChange = new EventEmitter();
_scrollMode = ScrollModeType.vertical;
get scrollMode() {
return this._scrollMode;
}
set scrollMode(value) {
if (this._scrollMode !== value) {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
if (PDFViewerApplication?.pdfViewer) {
if (PDFViewerApplication.pdfViewer.scrollMode !== Number(this.scrollMode)) {
PDFViewerApplication.eventBus.dispatch('switchscrollmode', { mode: Number(this.scrollMode) });
}
}
this._scrollMode = value;
if (this._scrollMode === ScrollModeType.page) {
if (this.pageViewMode !== 'single') {
this._pageViewMode = 'single';
this.pageViewModeChange.emit(this.pageViewMode);
}
}
else if (this.pageViewMode === 'single' || this._scrollMode === ScrollModeType.horizontal) {
this._pageViewMode = 'multiple';
this.pageViewModeChange.emit(this.pageViewMode);
}
}
}
scrollModeChange = new EventEmitter();
authorization = undefined;
httpHeaders = undefined;
contextMenuAllowed = true;
afterPrint = new EventEmitter();
beforePrint = new EventEmitter();
currentZoomFactor = new EventEmitter();
/** This field stores the previous zoom level if the page is enlarged with a double-tap or double-click */
previousZoom;
enablePrint = true;
get enablePrintAutoRotate() {
return pdfDefaultOptions.enablePrintAutoRotate;
}
set enablePrintAutoRotate(value) {
pdfDefaultOptions.enablePrintAutoRotate = value;
if (this.pdfScriptLoaderService.PDFViewerApplication?.pdfViewer) {
this.pdfScriptLoaderService.PDFViewerApplication.pdfViewer.enablePrintAutoRotate = value;
}
}
/** Force reloading of the JavaScript code. Useful for testing and micro-frontends */
forceFullReloadOfJavaScriptCode = false;
showTextEditor = 'xxl';
showStampEditor = 'xxl';
showDrawEditor = 'xxl';
showHighlightEditor = 'xxl';
showSignatureEditor = 'xxl';
/** How many log messages should be printed?
* Legal values: VerbosityLevel.INFOS (= 5), VerbosityLevel.WARNINGS (= 1), VerbosityLevel.ERRORS (= 0) */
logLevel = VerbosityLevel.WARNINGS;
/** Use the minified (minifiedJSLibraries="true", which is the default) or the user-readable pdf.js library (minifiedJSLibraries="false") */
get minifiedJSLibraries() {
return pdfDefaultOptions._internalFilenameSuffix === '.min';
}
set minifiedJSLibraries(value) {
pdfDefaultOptions._internalFilenameSuffix = value ? '.min' : '';
}
primaryMenuVisible = true;
/** option to increase (or reduce) print resolution. Default is 150 (dpi). Sensible values
* are 300, 600, and 1200. Note the increase memory consumption, which may even result in a browser crash. */
printResolution = null;
rotation;
rotationChange = new EventEmitter();
annotationLayerRendered = new EventEmitter();
annotationEditorLayerRendered = new EventEmitter();
xfaLayerRendered = new EventEmitter();
outlineLoaded = new EventEmitter();
attachmentsloaded = new EventEmitter();
layersloaded = new EventEmitter();
hasSignature;
set src(url) {
if (url instanceof Uint8Array) {
this._src = url.buffer;
}
else if (url instanceof URL) {
this._src = url.toString();
}
else if (typeof Blob !== 'undefined' && url instanceof Blob) {
(async () => {
this.src = await this.convertBlobToUint8Array(url);
if (this.service.ngxExtendedPdfViewerInitialized) {
if (this.pdfScriptLoaderService.ngxExtendedPdfViewerIncompletelyInitialized) {
this.openPDF();
}
else {
(async () => this.openPDF2())();
}
// else openPDF is called later, so we do nothing to prevent loading the PDF file twice
}
})();
}
else if (typeof url === 'string') {
this._src = url;
if (url.length > 980) {
// minimal length of a base64 encoded PDF
if (url.length % 4 === 0) {
if (/^[a-zA-Z\d/+]+={0,2}$/.test(url)) {
console.error('The URL looks like a base64 encoded string. If so, please use the attribute [base64Src] instead of [src]');
}
}
}
}
else {
this._src = url;
}
}
async convertBlobToUint8Array(blob) {
// first try the algorithm for modern browsers and node.js
if (blob.arrayBuffer) {
const arrayBuffer = await blob.arrayBuffer();
return new Uint8Array(arrayBuffer);
}
// then try the old-fashioned way
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
if (reader.result) {
resolve(new Uint8Array(reader.result));
}
else {
reject(new Error('Error converting Blob to Uint8Array'));
}
};
reader.onerror = () => {
reject(new Error('FileReader error'));
};
reader.readAsArrayBuffer(blob);
});
}
set base64Src(base64) {
if (base64) {
if (typeof window === 'undefined') {
// server-side rendering
return;
}
const binary_string = atob(base64);
const len = binary_string.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
this.src = bytes.buffer;
}
else {
this._src = undefined;
}
}
/**
* The combination of height, minHeight, and autoHeight ensures the PDF height of the PDF viewer is calculated correctly when the height is a percentage.
* By default, many CSS frameworks make a div with 100% have a height or zero pixels. checkHeight() fixes this.
*/
autoHeight = false;
minHeight = undefined;
_height = '100%';
set height(h) {
this.minHeight = undefined;
this.autoHeight = false;
if (h) {
if (h === 'auto') {
this.autoHeight = true;
this._height = undefined;
}
else {
this._height = h;
}
}
else {
this.height = '100%';
}
setTimeout(() => {
// this timeout is necessary because @Input() is called before the child components are initialized
// (and the DynamicCssComponent is a child component)
this.dynamicCSSComponent.checkHeight(this, this.logLevel);
});
}
get height() {
return this._height;
}
backgroundColor = undefined;
pdfBackgroundColor = undefined;
/** Allows the user to define the name of the file after clicking "download" */
filenameForDownload = undefined;
/** Allows the user to disable the keyboard bindings completely */
ignoreKeyboard = false;
/** Allows the user to disable a list of key bindings. */
ignoreKeys = [];
/** Allows the user to enable a list of key bindings explicitly. If this property is set, every other key binding is ignored. */
acceptKeys = [];
hasTextLayer = true;
/** Allows the user to put the viewer's svg images into an arbitrary folder */
imageResourcesPath = assetsUrl(pdfDefaultOptions.assetsFolder) + '/images/';
/** Allows the user to put their locale folder into an arbitrary folder */
localeFolderPath = assetsUrl(pdfDefaultOptions.assetsFolder) + '/locale';
/** Override the default locale. This must be the complete locale name, such as "es-ES". The string is allowed to be all lowercase.
*/
language = typeof window === 'undefined' ? 'en' : navigator.language;
/** By default, listening to the URL is deactivated because often the anchor tag is used for the Angular router */
listenToURL = false;
/** Navigate to a certain "named destination" */
nameddest = undefined;
/** allows you to pass a password to read password-protected files */
password = undefined;
replaceBrowserPrint = true;
originalPrint = typeof window !== 'undefined' ? window.print : undefined;
/** Store the original color-scheme value to restore it on destroy */
originalColorScheme = null;
_showSidebarButton = true;
useInlineScripts = true;
viewerPositionTop = '32px';
/** pdf.js can show signatures, but fails to verify them. So they are switched off by default.
* Set "[showUnverifiedSignatures]"="true" to display e-signatures nonetheless.
*/
showUnverifiedSignatures = false;
startTabindex;
get showSidebarButton() {
return this._showSidebarButton;
}
set showSidebarButton(show) {
if (typeof window === 'undefined') {
// server-side rendering
this._showSidebarButton = false;
return;
}
this._showSidebarButton = show;
if (this._showSidebarButton) {
const isIE = /msie\s|trident\//i.test(window.navigator.userAgent);
let factor = 1;
if (isIE) {
factor = Number((this._mobileFriendlyZoom || '100').replace('%', '')) / 100;
}
this.findbarLeft = (68 * factor).toString() + 'px';
return;
}
this.findbarLeft = '0px';
}
_sidebarVisible = undefined;
get sidebarVisible() {
return this._sidebarVisible;
}
set sidebarVisible(value) {
if (value !== this._sidebarVisible) {
this.sidebarVisibleChange.emit(value);
}
this._sidebarVisible = value;
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
if (PDFViewerApplication?.pdfSidebar) {
if (this.sidebarVisible) {
PDFViewerApplication.pdfSidebar.open();
const view = Number(this.activeSidebarView);
if (view === 1 || view === 2 || view === 3 || view === 4) {
PDFViewerApplication.pdfSidebar.switchView(view, true);
}
else {
console.error('[activeSidebarView] must be an integer value between 1 and 4');
}
}
else {
PDFViewerApplication.pdfSidebar.close();
}
}
}
sidebarVisibleChange = new EventEmitter();
activeSidebarView = PdfSidebarView.OUTLINE;
activeSidebarViewChange = new EventEmitter();
findbarVisible = false;
findbarVisibleChange = new EventEmitter();
propertiesDialogVisible = false;
propertiesDialogVisibleChange = new EventEmitter();
showFindButton = undefined;
showFindHighlightAll = true;
showFindMatchCase = true;
showFindMultiple = true;
showFindRegexp = false;
showFindEntireWord = true;
showFindMatchDiacritics = true;
showFindResultsCount = true;
showFindMessages = true;
showMovePageButton = false;
showPagingButtons = true;
showFirstAndLastPageButtons = true;
showPreviousAndNextPageButtons = true;
showPageNumber = true;
showPageLabel = true;
showZoomButtons = true;
showZoomDropdown = true;
showPresentationModeButton = false;
showOpenFileButton = true;
showPrintButton = true;
showDownloadButton = true;
theme = 'light';
showToolbar = true;
showSecondaryToolbarButton = true;
showSinglePageModeButton = true;
showVerticalScrollButton = true;
showHorizontalScrollButton = true;
showWrappedScrollButton = true;
showInfiniteScrollButton = true;
showBookModeButton = true;
set showRotateButton(visibility) {
this.showRotateCwButton = visibility;
this.showRotateCcwButton = visibility;
}
showRotateCwButton = true;
showRotateCcwButton = true;
_handTool = !isIOS();
set handTool(handTool) {
if (isIOS() && handTool) {
console.log("On iOS, the handtool doesn't work reliably. Plus, you don't need it because touch gestures allow you to distinguish easily between swiping and selecting text. Therefore, the library ignores your setting.");
return;
}
this._handTool = handTool;
}
get handTool() {
return this._handTool;
}
handToolChange = new EventEmitter();
showHandToolButton = false;
showSpreadButton = true;
showPropertiesButton = true;
showBorders = true;
spread;
set showScrollingButtons(show) {
this.showVerticalScrollButton = show;
this.showHorizontalScrollButton = show;
this.showWrappedScrollButton = show;
this.showInfiniteScrollButton = show;
this.showBookModeButton = show;
this.showSinglePageModeButton = show;
}
spreadChange = new EventEmitter();
thumbnailDrawn = new EventEmitter();
_page = undefined;
get page() {
return this._page;
}
set page(newPageNumber) {
if (newPageNumber) {
// silently cope with strings
this._page = Number(newPageNumber);
}
else {
this._page = undefined;
}
}
pageChange = new EventEmitter();
pageLabel = undefined;
pageLabelChange = new EventEmitter();
pagesLoaded = new EventEmitter();
pageRender = new EventEmitter();
pageRendered = new EventEmitter();
pdfDownloaded = new EventEmitter();
pdfLoaded = new EventEmitter();
pdfLoadingStarts = new EventEmitter();
pdfLoadingFailed = new EventEmitter();
textLayer = undefined;
textLayerRendered = new EventEmitter();
annotationEditorModeChanged = new EventEmitter();
updateFindMatchesCount = new EventEmitter();
updateFindState = new EventEmitter();
/** Legal values: undefined, 'auto', 'page-actual', 'page-fit', 'page-width', or '50' (or any other percentage) */
zoom = undefined;
zoomChange = new EventEmitter();
_zoomLevels = ['auto', 'page-actual', 'page-fit', 'page-width', 0.5, 1, 1.25, 1.5, 2, 3, 4];
get zoomLevels() {
if (this.maxZoom && this.maxZoom === this.minZoom) {
return [this.maxZoom];
}
return this._zoomLevels;
}
set zoomLevels(value) {
this._zoomLevels = value;
}
maxZoom = 10;
minZoom = 0.1;
/** This attribute allows you to increase the size of the UI elements so you can use them on small mobile devices.
* This attribute is a string with a percent character at the end (e.g. "150%").
*/
_mobileFriendlyZoom = '100%';
mobileFriendlyZoomScale = 1;
toolbarMarginTop = '0px';
toolbarWidth = '100%';
toolbar = undefined;
onToolbarLoaded(toolbarElement) {
this.toolbar = toolbarElement;
}
secondaryToolbarTop = undefined;
sidebarPositionTop = undefined;
// dirty IE11 hack - temporary solution
findbarTop = undefined;
// dirty IE11 hack - temporary solution
findbarLeft = undefined;
initializationPromise = null;
checkRootElementTimeout;
destroyInitialization = false;
get mobileFriendlyZoom() {
return this._mobileFriendlyZoom;
}
get pdfJsVersion() {
return getVersionSuffix(pdfDefaultOptions.assetsFolder);
}
get majorMinorPdfJsVersion() {
const fullVersion = this.pdfJsVersion;
const pos = fullVersion.lastIndexOf('.');
return fullVersion.substring(0, pos).replace('.', '-');
}
get enableSignatureEditor() {
return pdfDefaultOptions.enableSignatureEditor;
}
get enablePageReordering() {
return pdfDefaultOptions.enablePageReordering;
}
/**
* This attributes allows you to increase the size of the UI elements so you can use them on small mobile devices.
* This attribute is a string with a percent character at the end (e.g. "150%").
*/
set mobileFriendlyZoom(zoom) {
// tslint:disable-next-line:triple-equals - the type conversion is intended
if (zoom == 'true') {
zoom = '150%';
// tslint:disable-next-line:triple-equals - the type conversion is intended
}
else if (zoom == 'false' || zoom === undefined || zoom === null) {
zoom = '100%';
}
this._mobileFriendlyZoom = zoom;
let factor = 1;
if (!String(zoom).includes('%')) {
zoom = 100 * Number(zoom) + '%';
}
factor = Number((zoom || '100').replace('%', '')) / 100;
this.mobileFriendlyZoomScale = factor;
this.toolbarWidth = (100 / factor).toString() + '%';
this.toolbarMarginTop = (factor - 1) * 16 + 'px';
this.calcViewerPositionTop();
}
serverSideRendering = true;
/**
* Checks if the code is running in a browser environment.
*/
isBrowser() {
return typeof window !== 'undefined' && typeof document !== 'undefined';
}
calcViewerPositionTop() {
if (!this.isBrowser()) {
return;
}
if (this.toolbar === undefined) {
this.sidebarPositionTop = '0';
return;
}
const top = this.toolbar.getBoundingClientRect().height;
const previous = this.viewerPositionTop;
if (top < 33) {
this.viewerPositionTop = '33px';
}
else {
this.viewerPositionTop = top + 'px';
}
if (previous !== this.viewerPositionTop) {
this.cdr.markForCheck();
}
const factor = top / 33;
if (this.primaryMenuVisible) {
this.sidebarPositionTop = (33 + 33 * (factor - 1)).toString() + 'px';
}
else {
this.sidebarPositionTop = '0';
}
this.secondaryToolbarTop = (33 + 38 * (factor - 1)).toString() + 'px';
this.findbarTop = (33 + 38 * (factor - 1)).toString() + 'px';
const findButton = document.getElementById('primaryViewFind');
if (findButton) {
const containerPositionLeft = this.toolbar.getBoundingClientRect().left;
const findButtonPosition = findButton.getBoundingClientRect();
const left = Math.max(0, findButtonPosition.left - containerPositionLeft);
this.findbarLeft = left + 'px';
}
else if (this.showSidebarButton) {
this.findbarLeft = (34 + 32 * factor).toString() + 'px';
}
else {
this.findbarLeft = '0';
}
}
constructor(platformId, notificationService, elementRef, platformLocation, cdr, service, renderer, pdfScriptLoaderService, keyboardManager, cspPolicyService, ngZone) {
this.platformId = platformId;
this.notificationService = notificationService;
this.elementRef = elementRef;
this.platformLocation = platformLocation;
this.cdr = cdr;
this.service = service;
this.renderer = renderer;
this.pdfScriptLoaderService = pdfScriptLoaderService;
this.keyboardManager = keyboardManager;
this.cspPolicyService = cspPolicyService;
this.ngZone = ngZone;
this.baseHref = this.platformLocation.getBaseHrefFromDOM();
if (isPlatformBrowser(this.platformId)) {
this.serverSideRendering = false;
this.toolbarWidth = String(document.body.clientWidth);
}
}
reportSourceChanges(change) {
this._src = change.sourcefile;
this.srcChangeTriggeredByUser = true;
this.srcChange.emit(change.sourcefile);
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
if (this.filenameForDownload) {
PDFViewerApplication.appConfig.filenameForDownload = this.filenameForDownload;
}
else {
PDFViewerApplication.appConfig.filenameForDownload = this.guessFilenameFromUrl(this._src);
}
}
async ngOnInit() {
this.hideToolbarIfItIsEmpty();
if (isPlatformBrowser(this.platformId)) {
this.ngZone.runOutsideAngular(() => {
this.initializationPromise = this.initialize;
this.initializationPromise();
});
}
}
async initialize() {
try {
await this.waitForRootElement();
if (this.destroyInitialization)
return;
if (isPlatformBrowser(this.platformId)) {
this.addTranslationsUnlessProvidedByTheUser();
await this.waitUntilOldComponentIsGone();
if (this.destroyInitialization)
return;
await this.pdfScriptLoaderService.ensurePdfJsHasBeenLoaded(this.useInlineScripts, this.forceUsingLegacyES5, this.forceFullReloadOfJavaScriptCode);
if (this.destroyInitialization)
return;
if (this.formSupport) {
this.formSupport.registerFormSupportWithPdfjs(this.pdfScriptLoaderService.PDFViewerApplication);
this.keyboardManager.registerKeyboardListener(this.pdfScriptLoaderService.PDFViewerApplication);
this.formSupport.ngZone = this.ngZone;
this.formSupport.cdr = this.cdr;
}
this.pdfScriptLoaderService.PDFViewerApplication.cspPolicyService = this.cspPolicyService;
this.ngZone.runOutsideAngular(() => this.doInitPDFViewer());
}
}
catch (error) {
console.error('Initialization failed:', error);
}
}
async waitForRootElement() {
return new Promise((resolve, reject) => {
const checkRootElement = () => {
if (this.destroyInitialization) {
reject(new Error('Component destroyed'));
return;
}
if (this.root?.nativeElement?.offsetParent) {
resolve();
}
else {
this.checkRootElementTimeout = setTimeout(checkRootElement, 50);
}
};
checkRootElement();
});
}
async waitUntilOldComponentIsGone() {
return new Promise((resolve) => {
const interval = setInterval(() => {
if (!this.service.ngxExtendedPdfViewerInitialized) {
clearInterval(interval);
resolve();
}
}, 10);
});
}
assignTabindexes() {
if (this.startTabindex) {
const r = this.root.nativeElement.cloneNode(true);
r.classList.add('offscreen');
this.showElementsRecursively(r);
document.body.appendChild(r);
const elements = this.collectElementPositions(r, this.root.nativeElement, []);
document.body.removeChild(r);
const topRightGreaterThanBottomLeftComparator = (a, b) => {
if (a.y - b.y > 15) {
return 1;
}
if (b.y - a.y > 15) {
return -1;
}
return a.x - b.x;
};
const sorted = [...elements].sort(topRightGreaterThanBottomLeftComparator);
for (let i = 0; i < sorted.length; i++) {
sorted[i].element.tabIndex = this.startTabindex + i;
}
}
}
showElementsRecursively(root) {
const classesToRemove = [
'hidden',
'invisible',
'hiddenXXLView',
'hiddenXLView',
'hiddenLargeView',
'hiddenMediumView',
'hiddenSmallView',
'hiddenTinyView',
'visibleXXLView',
'visibleXLView',
'visibleLargeView',
'visibleMediumView',
'visibleSmallView',
'visibleTinyView',
];
root.classList.remove(...classesToRemove);
if (root instanceof HTMLButtonElement || root instanceof HTMLAnchorElement || root instanceof HTMLInputElement || root instanceof HTMLSelectElement) {
return;
}
else if (root.childElementCount > 0) {
for (let i = 0; i < root.childElementCount; i++) {
const c = root.children.item(i);
if (c) {
this.showElementsRecursively(c);
}
}
}
}
collectElementPositions(copy, original, elements) {
if (copy instanceof HTMLButtonElement || copy instanceof HTMLAnchorElement || copy instanceof HTMLInputElement || copy instanceof HTMLSelectElement) {
const rect = copy.getBoundingClientRect();
const elementAndPos = {
element: original,
x: Math.round(rect.left),
y: Math.round(rect.top),
};
elements.push(elementAndPos);
}
else if (copy.childElementCount > 0) {
for (let i = 0; i < copy.childElementCount; i++) {
const c = copy.children.item(i);
const o = original.children.item(i);
if (c && o) {
elements = this.collectElementPositions(c, o, elements);
}
}
}
return elements;
}
afterPrintListener = () => {
this.afterPrint.emit();
};
beforePrintListener = () => {
this.beforePrint.emit();
};
guessFilenameFromUrl(src) {
if (src && typeof src === 'string') {
const slash = src.lastIndexOf('/');
if (slash > 0) {
return src.substring(slash + 1);
}
else {
return src;
}
}
return undefined;
}
doInitPDFViewer() {
if (typeof window === 'undefined') {
// server-side rendering
return;
}
if (this.service.ngxExtendedPdfViewerInitialized) {
// tslint:disable-next-line:quotemark
console.error("You're trying to open two instances of the PDF viewer. Most likely, this will result in errors.");
}
this.overrideDefaultSettings();
const onLoaded = () => {
if (!this.pdfScriptLoaderService.PDFViewerApplication.eventBus) {
console.error("Eventbus is null? Let's try again.");
setTimeout(() => {
onLoaded();
}, 10);
}
else {
this.pdfScriptLoaderService.PDFViewerApplication.eventBus.on('sourcechanged', this.reportSourceChanges.bind(this));
this.pdfScriptLoaderService.PDFViewerApplication.eventBus.on('afterprint', this.afterPrintListener);
this.pdfScriptLoaderService.PDFViewerApplication.eventBus.on('beforeprint', this.beforePrintListener);
this.localizationInitialized = true;
if (!this.pdfScriptLoaderService.shuttingDown) {
// hurried users sometimes reload the PDF before it has finished initializing
this.calcViewerPositionTop();
this.afterLibraryInit();
this.openPDF();
this.assignTabindexes();
if (this.replaceBrowserPrint) {
this.doReplaceBrowserPrint(this.replaceBrowserPrint);
}
}
}
};
document.addEventListener('webviewerinitialized', onLoaded, { once: true });
this.activateTextlayerIfNecessary(null);
setTimeout(() => {
if (!this.pdfScriptLoaderService.shuttingDown) {
// hurried users sometimes reload the PDF before it has finished initializing
// This initializes the webviewer, the file may be passed in to it to initialize the viewer with a pdf directly
this.initResizeObserver();
this.onResize();
this.hideToolbarIfItIsEmpty();
this.dummyComponents.addMissingStandardWidgets();
if (this.pdfScriptLoaderService.PDFViewerApplicationOptions) {
const PDFViewerApplicationOptions = this.pdfScriptLoaderService.PDFViewerApplicationOptions;
globalThis.PDFViewerApplicationOptions = PDFViewerApplicationOptions;
}
this.pdfScriptLoaderService.webViewerLoad(this.cspPolicyService);
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
PDFViewerApplication.appConfig.defaultUrl = ''; // IE bugfix
const PDFViewerApplicationOptions = this.pdfScriptLoaderService.PDFViewerApplicationOptions;
PDFViewerApplicationOptions.set('enableDragAndDrop', this.enableDragAndDrop);
PDFViewerApplicationOptions.set('localeProperties', { lang: this.language });
PDFViewerApplicationOptions.set('imageResourcesPath', this.imageResourcesPath);
PDFViewerApplicationOptions.set('minZoom', this.minZoom);
PDFViewerApplicationOptions.set('maxZoom', this.maxZoom);
PDFViewerApplicationOptions.set('pageViewMode', this.pageViewMode);
PDFViewerApplicationOptions.set('verbosity', this.logLevel);
PDFViewerApplicationOptions.set('pdfBackgroundColor', this.pdfBackgroundColor);
if (this.theme === 'dark') {
PDFViewerApplicationOptions.set('viewerCssTheme', 2);
}
else if (this.theme === 'light') {
PDFViewerApplicationOptions.set('viewerCssTheme', 1);
}
PDFViewerApplication.isViewerEmbedded = true;
if (PDFViewerApplication.printKeyDownListener) {
window.addEventListener('keydown', PDFViewerApplication.printKeyDownListener, true);
}
const body = document.getElementsByTagName('body');
if (body[0]) {
const topLevelElements = body[0].children;
for (let i = topLevelElements.length - 1; i >= 0; i--) {
const e = topLevelElements.item(i);
if (e && e.id === 'printContainer') {
body[0].removeChild(e);
}
}
}
const pc = document.getElementById('printContainer');
if (pc) {
document.getElementsByTagName('body')[0].appendChild(pc);
}
}
}, 0);
}
addTranslationsUnlessProvidedByTheUser() {
const link = this.renderer.createElement('link');
link.rel = 'resource';
link.type = 'application/l10n';
link.href = this.localeFolderPath + '/locale.json';
link.setAttribute('origin', 'ngx-extended-pdf-viewer');
this.renderer.appendChild(this.elementRef.nativeElement, link);
}
hideToolbarIfItIsEmpty() {
this.primaryMenuVisible = this.showToolbar;
if (!this.showSecondaryToolbarButton || this.service.secondaryMenuIsEmpty) {
if (!this.isPrimaryMenuVisible()) {
this.primaryMenuVisible = false;
}
}
}
/** Notifies every widget that implements onLibraryInit() that the PDF viewer objects are available */
afterLibraryInit() {
// Store the original color-scheme value before PDF.js might change it
if (typeof window !== 'undefined' && typeof document !== 'undefined' && this.originalColorScheme === null) {
const docStyle = document.documentElement.style;
this.originalColorScheme = docStyle.getPropertyValue('color-scheme') || '';
}
queueMicrotask(() => this.notificationService.onPDFJSInitSignal.set(this.pdfScriptLoaderService.PDFViewerApplication));
}
onSpreadChange(newSpread) {
this.spreadChange.emit(newSpread);
}
toggleVisibility = (elementId, cssClass = 'invisible') => {
const element = document.getElementById(elementId);
element?.classList.remove(cssClass);
};
activateTextlayerIfNecessary(options) {
const setTextLayerMode = (mode) => {
options?.set('textLayerMode', mode);
this.pdfScriptLoaderService.PDFViewerApplication.pdfViewer?.setTextLayerMode(mode);
};
if (this.textLayer === undefined) {
if (!this.handTool) {
setTextLayerMode(pdfDefaultOptions.textLayerMode);
this.textLayer = true;
if (this.showFindButton === undefined) {
this.showFindButton = true;
setTimeout(() => {
this.toggleVisibility('viewFind');
this.toggleVisibility('findbar');
});
}
}
else {
setTextLayerMode(this.showHandToolButton ? pdfDefaultOptions.textLayerMode : 0);
if (!this.showHandToolButton) {
if (this.showFindButton || this.showFindButton === undefined) {
queueMicrotask(() => {
this.showFindButton = false;
});
if (this.logLevel >= VerbosityLevel.WARNINGS) {
console.warn(
// tslint:disable-next-line:max-line-length
'Hiding the "find" button because the text layer of the PDF file is not rendered. Use [textLayer]="true" to enable the find button.');
}
}
if (this.showHandToolButton) {
if (this.logLevel >= VerbosityLevel.WARNINGS) {
console.warn(
// tslint:disable-next-line:max-line-length
'Hiding the "hand tool / selection mode" menu because the text layer of the PDF file is not rendered. Use [textLayer]="true" to enable the the menu items.');
this.showHandToolButton = false;
}
}
}
}
}
else {
setTextLayerMode(pdfDefaultOptions.textLayerMode);
this.textLayer = true;
if (this.showFindButton === undefined) {
this.showFindButton = true;
setTimeout(() => {
this.toggleVisibility('viewFind');
this.toggleVisibility('findbar');
});
}
}
}
async overrideDefaultSettings() {
if (typeof window === 'undefined') {
return; // server side rendering
}
const options = this.pdfScriptLoaderService.PDFViewerApplicationOptions;
// tslint:disable-next-line:forin
const optionsToIgnore = [
'needsES5',
'rangeChunkSize',
'_internalFilenameSuffix',
'assetsFolder',
'doubleTapZoomFactor',
'doubleTapZoomsInHandMode',
'doubleTapZoomsInTextSelectionMode',
'doubleTapResetsZoomOnSecondDoubleTap',
];
for (const key in pdfDefaultOptions) {
if (!optionsToIgnore.includes(key)) {
const option = pdfDefaultOptions[key];
if (key !== 'findController' && typeof option === 'function') {
options.set(key, option());
}
else {
options.set(key, pdfDefaultOptions[key]);
}
}
}
options.set('disablePreferences', true);
await this.setZoom();
this.keyboardManager.ignoreKeyboard = this.ignoreKeyboard;
this.keyboardManager.ignoreKeys = this.ignoreKeys;
this.keyboardManager.acceptKeys = this.acceptKeys;
this.activateTextlayerIfNecessary(options);
if (this.scrollMode || this.scrollMode === ScrollModeType.vertical) {
options.set('scrollModeOnLoad', this.scrollMode);
}
const sidebarVisible = this.sidebarVisible;
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
if (sidebarVisible !== undefined) {
PDFViewerApplication.sidebarViewOnLoad = sidebarVisible ? 1 : 0;
if (PDFViewerApplication.appConfig) {
PDFViewerApplication.appConfig.sidebarViewOnLoad = sidebarVisible ? this.activeSidebarView : PdfSidebarView.NONE;
}
options.set('sidebarViewOnLoad', this.sidebarVisible ? this.activeSidebarView : 0);
}
if (this.spread === 'even') {
options.set('spreadModeOnLoad', 2);
if (PDFViewerApplication.pdfViewer) {
PDFViewerApplication.pdfViewer.spreadMode = 2;
}
this.onSpreadChange('even');
}
else if (this.spread === 'odd') {
options.set('spreadModeOnLoad', 1);
if (PDFViewerApplication.pdfViewer) {
PDFViewerApplication.pdfViewer.spreadMode = 1;
}
this.onSpreadChange('odd');
}
else {
options.set('spreadModeOnLoad', 0);
if (PDFViewerApplication.pdfViewer) {
PDFViewerApplication.pdfViewer.spreadMode = 0;
}
this.onSpreadChange('off');
}
if (this.printResolution) {
options.set('printResolution', this.printResolution);
}
if (this.showBorders === false) {
options.set('removePageBorders', !this.showBorders);
}
const PDFViewerApplicationOptions = this.pdfScriptLoaderService.PDFViewerApplicationOptions;
PDFViewerApplicationOptions.set('localeProperties', { lang: this.language });
}
async openPDF() {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
PDFViewerApplication.serviceWorkerOptions.showUnverifiedSignatures = this.showUnverifiedSignatures;
PDFViewerApplication.enablePrint = this.enablePrint;
if (this.filenameForDownload) {
PDFViewerApplication.appConfig.filenameForDownload = this.filenameForDownload;
}
else {
PDFViewerApplication.appConfig.filenameForDownload = this.guessFilenameFromUrl(this._src);
}
this.service.ngxExtendedPdfViewerInitialized = true;
this.registerEventListeners(PDFViewerApplication);
this.selectCursorTool();
if (!this.listenToURL) {
PDFViewerApplication.pdfLinkService.setHash = undefined;
}
if (this._src) {
this.pdfScriptLoaderService.ngxExtendedPdfViewerIncompletelyInitialized = false;
setTimeout(async () => this.dynamicCSSComponent.checkHeight(this, this.logLevel), 100);
// open a file in the viewer
if (!!this._src) {
let workerSrc = pdfDefaultOptions.workerSrc;
if (typeof workerSrc === 'function') {
workerSrc = workerSrc();
}
const options = {
password: this.password,
verbosity: this.logLevel,
workerSrc,
};
if (this._src['range']) {
options.range = this._src['range'];
}
if (this.httpHeaders) {
options.httpHeaders = this.httpHeaders;
}
if (this.authorization) {
options.withCredentials = true;
if (typeof this.authorization != 'boolean') {
if (!options.httpHeaders)
options.httpHeaders = {};
options.httpHeaders.Authorization = this.authorization;
}
}
options.baseHref = this.baseHref;
PDFViewerApplication.onError = (error) => this.pdfLoadingFailed.emit(error);
if (typeof this._src === 'string') {
options.url = this._src;
}
else if (this._src instanceof ArrayBuffer) {
options.data = this._src;
}
else if (this._src instanceof Uint8Array) {
options.data = this._src;
}
options.rangeChunkSize = pdfDefaultOptions.rangeChunkSize;
options.cspPolicyService = this.cspPolicyService;
PDFViewerApplication.findBar?.close();
PDFViewerApplication.secondaryToolbar?.close();
PDFViewerApplication.eventBus.dispatch('annotationeditormodechanged', { mode: 0 });
await PDFViewerApplication.open(options);
this.pdfLoadingStarts.emit({});
setTimeout(async () => this.setZoom());
}
setTimeout(() => {
if (!this.pdfScriptLoaderService.shuttingDown) {
// hurried users sometimes reload the PDF before it has finished initializing
if (this.page) {
PDFViewerApplication.page = Number(this.page);
}
}
}, 100);
}
}
registerEventListeners(PDFViewerApplication) {
PDFViewerApplication.eventBus.on('annotation-editor-event', (x) => {
queueMicrotask(() => {
this.annotationEditorEvent.emit(x);
});
});
PDFViewerApplication.eventBus.on('toggleSidebar', (x) => {
queueMicrotask(() => {
this.sidebarVisible = x.visible;
this.sidebarVisibleChange.emit(x.visible);
});
});
PDFViewerApplication.eventBus.on('textlayerrendered', (x) => {
queueMicrotask(() => this.textLayerRendered.emit(x));
});
PDFViewerApplication.eventBus.on('annotationeditormodechanged', (x) => {
// we're using a timeout here to make sure the editor is already visible
// when the event is caught. Pdf.js fires it a bit early.
setTimeout(() => this.annotationEditorModeChanged.emit(x));
});
PDFViewerApplication.eventBus.on('scrollmodechanged', (x) => {
queueMicrotask(() => {
this._scrollMode = x.mode;
this.scrollModeChange.emit(x.mode);
if (x.mode === ScrollModeType.page) {
if (this.pageViewMode !== 'single') {
this.pageViewModeChange.emit('single');
this._pageViewMode = 'single';
}
}
});
});
PDFViewerApplication.eventBus.on('progress', (x) => {
queueMicrotask(() => this.progress.emit(x));
});
PDFViewerApplication.eventBus.on('findbarclose', () => {
queueMicrotask(() => {
this.findbarVisible = false;
this.findbarVisibleChange.emit(false);
this.cdr.markForCheck();
});
});
PDFViewerApplication.eventBus.on('findbaropen', () => {
queueMicrotask(() => {
this.findbarVisible = true;
this.findbarVisibleChange.emit(true);
this.cdr.markForCheck();
});
});
PDFViewerApplication.eventBus.on('propertiesdialogclose', () => {
this.propertiesDialogVisible = false;
queueMicrotask(() => this.propertiesDialogVisibleChange.emit(false));
});
PDFViewerApplication.eventBus.on('propertiesdialogopen', () => {
this.propertiesDialogVisible = true;
queueMicrotask(() => this.propertiesDialogVisibleChange.emit(true));
});
PDFViewerApplication.eventBus.on('pagesloaded', (x) => {
queueMicrotask(() => this.pagesLoaded.emit(x));
this.dynamicCSSComponent.removeScrollbarInInfiniteScrollMode(false, this.pageViewMode, this.primaryMenuVisible, this, this.logLevel);
if (this.rotation !== undefined && this.rotation !== null) {
const r = Number(this.rotation);
if (r === 0 || r === 90 || r === 180 || r === 270) {
PDFViewerApplication.pdfViewer.pagesRotation = r;
}
}
setTimeout(() => {
if (!this.pdfScriptLoaderService.shuttingDown) {
// hurried users sometimes reload the PDF before it has finished initializing
if (this.nameddest) {
PDFViewerApplication.pdfLinkService.goToDestination(this.nameddest);
}
else if (this.page) {
PDFViewerApplication.page = Number(this.page);
}
else if (this.pageLabel) {
PDFViewerApplication.pdfViewer.currentPageLabel = this.pageLabel;
}
}
});
this.setZoom();
});
PDFViewerApplication.eventBus.on('pagerendered', (x) => {
queueMicrotask(() => {
this.pageRendered.emit(x);
this.dynamicCSSComponent.removeScrollbarInInfiniteScrollMode(false, this.pageViewMode, this.primaryMenuVisible, this, this.logLevel);
});
});
PDFViewerApplication.eventBus.on('pagerender', (x) => {
queueMicrotask(() => {
this.pageRender.emit(x);
});
});
PDFViewerApplication.eventBus.on('download', (x) => {
queueMicrotask(() => {
this.pdfDownloaded.emit(x);
});
});
PDFViewerApplication.eventBus.on('scalechanging', (x) => {
setTimeout(() => {
this.currentZoomFactor.emit(x.scale);
this.cdr.markForCheck();
});
if (x.presetValue !== 'auto' && x.presetValue !== 'page-fit' && x.presetValue !== 'page-actual' && x.presetValue !== 'page-width') {
// ignore rounding differences
if (Math.abs(x.previousScale - x.scale) > 0.000001) {
this.zoom = x.scale * 100;
this.zoomChange.emit(x.scale * 100);
}
}
else if (x.previousPresetValue !== x.presetValue) {
// called when the user selects one of the text values of the zoom select dropdown
this.zoomChange.emit(x.presetValue);
}
});
PDFViewerApplication.eventBus.on('rotationchanging', (x) => {
queueMicrotask(() => {
this.rotationChange.emit(x.pagesRotation);
});
});
PDFViewerApplication.eventBus.on('fileinputchange', (x) => {
queueMicrotask(() => {
if (x.fileInput.files && x.fileInput.files.length >= 1) {
// drag and drop
this.srcChangeTriggeredByUser = true;
this.srcChange.emit(x.fileInput.files[0].name);
}
else {
// regular file open dialog
const path = x.fileInput?.value?.replace('C:\\fakepath\\', '');
this.srcChange.emit(path);
}
});
});
PDFViewerApplication.eventBus.on('cursortoolchanged', (x) => {
queueMicrotask(() => {
this.handTool = x.tool === PdfCursorTools.HAND;
this.handToolChange.emit(x.tool === PdfCursorTools.HAND);
});
});
PDFViewerApplication.eventBus.on('sidebarviewchanged', (x) => {
queueMicrotask(() => {
this.sidebarVisibleChange.emit(x.view > 0);
if (x.view > 0) {
this.activeSidebarViewChange.emit(x.view);
}
if (this.sidebarComponent) {
this.sidebarComponent.showToolbarWhenNecessary();
}
});
});
PDFViewerApplication.eventBus.on('documentloaded', (pdfLoadedEvent) => {
queueMicrotask(async () => {
const pages = pdfLoadedEvent.source.pagesCount;
this.pageLabel = undefined;
if (this.page && this.page >= pages) {
this.page = pages;
}
this.scrollSignatureWarningIntoView(pdfLoadedEvent.source.pdfDocument);
this.pdfLoaded.emit({ pagesCount: pdfLoadedEvent.source.pdfDocument?.numPages });
if (this.findbarVisible) {
PDFViewerApplication.findBar.open();
}
if (this.propertiesDialogVisible) {
PDFViewerApplication.pdfDocumentProperties.open();
}
this.hasTextLayer = this.textLayer === true;
});
});
PDFViewerApplication.eventBus.on('spreadmodechanged', (event) => {
queueMicrotask(() => {
const modes = ['off', 'odd', 'even'];
this.spread = modes[event.mode];
this.spreadChange.emit(this.spread);
});
});
const hideSidebarToolbar = () => {
queueMicrotask(() => {
if (this.sidebarComponent) {
this.sidebarComponent.showToolbarWhenNecessary();
}
});
};
PDFViewerApplication.eventBus.on('outlineloaded', hideSidebarToolbar);
PDFViewerApplication.eventBus.on('attachmentsloaded', hideSidebarToolbar);
PDFViewerApplication.eventBus.on('layersloaded', hideSidebarToolbar);
PDFViewerApplication.eventBus.on('annotationlayerrendered', (event) => {
const div = event.source.div;
queueMicrotask(() => {
event.initialFormDataStoredInThePDF = this.formSupport.initialFormDataStoredInThePDF;
this.annotationLayerRendered.emit(event);
this.enableOrDisableForms(div, true);
});
});
PDFViewerApplication.eventBus.on('annotationeditorlayerrendered', (event) => queueMicrotask(() => this.annotationEditorLayerRendered.emit(event)));
PDFViewerApplication.eventBus.on('xfalayerrendered', (event) => queueMicrotask(() => this.xfaLayerRendered.emit(event)));
PDFViewerApplication.eventBus.on('outlineloaded', (event) => queueMicrotask(() => this.outlineLoaded.emit(event)));
PDFViewerApplication.eventBus.on('attachmentsloaded', (event) => queueMicrotask(() => this.attachmentsloaded.emit(event)));
PDFViewerApplication.eventBus.on('layersloaded', (event) => queueMicrotask(() => this.layersloaded.emit(event)));
PDFViewerApplication.eventBus.on('presentationmodechanged', (event) => {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
PDFViewerApplication?.pdfViewer?.destroyBookMode();
});
PDFViewerApplication.eventBus.on('updatefindcontrolstate', (x) => {
queueMicrotask(() => {
let type = PDFViewerApplication.findController.state?.type ?? 'find';
if (type === 'again') {
type = 'findagain';
}
const result = {
caseSensitive: PDFViewerApplication.findController.state?.caseSensitive,
entireWord: PDFViewerApplication.findController.state?.entireWord,
findPrevious: PDFViewerApplication.findController.state?.findPrevious,
highlightAll: PDFViewerApplication.findController.state?.highlightAll,
matchDiacritics: PDFViewerApplication.findController.state?.matchDiacritics,
query: PDFViewerApplication.findController.state?.query,
type,
};
this.updateFindMatchesCount.emit({
...result,
current: x.matchesCount.current,
total: x.matchesCount.total,
matches: PDFViewerApplication.findController._pageMatches ?? [],
matchesLength: PDFViewerApplication.findController._pageMatchesLength ?? [],
}); // TODO: remove the cast because it's just duct tape
if (this.updateFindState) {
this.updateFindState.emit(x.state);
}
});
});
PDFViewerApplication.eventBus.on('updatefindmatchescount', (x) => {
x.matchesCount.matches = PDFViewerApplication.findController._pageMatches ?? [];
x.matchesCount.matchesLength = PDFViewerApplication.findController._pageMatchesLength ?? [];
queueMicrotask(() => this.updateFindMatchesCount.emit({
caseSensitive: PDFViewerApplication.findController.state?.caseSensitive ?? false,
entireWord: PDFViewerApplication.findController.state?.entireWord ?? false,
findPrevious: PDFViewerApplication.findController.state?.findPrevious ?? false,
highlightAll: PDFViewerApplication.findController.state?.highlightAll ?? false,
matchDiacritics: PDFViewerApplication.findController.state?.matchDiacritics ?? false,
query: PDFViewerApplication.findController.state?.query ?? '',
type: PDFViewerApplication.findController.state?.type,
current: x.matchesCount.current,
total: x.matchesCount.total,
matches: x.matchesCount.matches,
matchesLength: x.matchesCount.matchesLength,
}));
});
PDFViewerApplication.eventBus.on('pagechanging', (x) => {
if (!this.pdfScriptLoaderService.shuttingDown) {
// hurried users sometimes reload the PDF before it has finished initializing
queueMicrotask(() => {
const currentPage = PDFViewerApplication.pdfViewer.currentPageNumber;
const currentPageLabel = PDFViewerApplication.pdfViewer.currentPageLabel;
if (currentPage !== this.page) {
this.pageChange.emit(currentPage);
}
if (currentPageLabel !== this.pageLabel) {
this.pageLabelChange.emit(currentPageLabel);
}
});
}
});
}
async openPDF2() {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
PDFViewerApplication.findBar?.close();
PDFViewerApplication.secondaryToolbar?.close();
try {
// sometimes the annotation editor UI is undefined, but it's a private variable,
// so we simply catch the error
PDFViewerApplication.eventBus.dispatch('switchannotationeditormode', { mode: 0 });
}
catch (e) {
// ignore this error
}
this.overrideDefaultSettings();
PDFViewerApplication.pdfViewer.destroyBookMode();
PDFViewerApplication.pdfViewer.stopRendering();
PDFViewerApplication.pdfThumbnailViewer.stopRendering();
// #802 clear the form data; otherwise the "download" dialogs opens
PDFViewerApplication.pdfDocument?.annotationStorage?.resetModified();
await PDFViewerApplication.close();
this.formSupport?.reset();
if (this.initialAngularFormData) {
this.formSupport.formData = this.initialAngularFormData;
}
if (this.filenameForDownload) {
PDFViewerApplication.appConfig.filenameForDownload = this.filenameForDownload;
}
else {
PDFViewerApplication.appConfig.filenameForDownload = this.guessFilenameFromUrl(this._src);
}
let workerSrc = pdfDefaultOptions.workerSrc;
if (typeof workerSrc === 'function') {
workerSrc = workerSrc();
}
const options = {
password: this.password,
verbosity: this.logLevel,
workerSrc,
};
if (this._src?.['range']) {
options.range = this._src['range'];
}
if (this.httpHeaders) {
options.httpHeaders = this.httpHeaders;
}
if (this.authorization) {
options.withCredentials = true;
if (typeof this.authorization != 'boolean') {
if (!options.httpHeaders)
options.httpHeaders = {};
options.httpHeaders.Authorization = this.authorization;
}
}
options.baseHref = this.baseHref;
try {
if (typeof this._src === 'string') {
options.url = this._src;
}
else if (this._src instanceof ArrayBuffer) {
options.data = this._src;
if (this._src.byteLength === 0) {
// sometimes ngOnInit() calls openPdf2 too early
// so let's ignore empty arrays
return;
}
}
else if (this._src instanceof Uint8Array) {
options.data = this._src;
if (this._src.length === 0) {
// sometimes ngOnInit() calls openPdf2 too early
// so let's ignore empty arrays
return;
}
}
options.rangeChunkSize = pdfDefaultOptions.rangeChunkSize;
await PDFViewerApplication.open(options);
}
catch (error) {
this.pdfLoadingFailed.emit(error);
}
}
selectCursorTool() {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
PDFViewerApplication.eventBus.dispatch('switchcursortool', { tool: this.handTool ? 1 : 0 });
}
doReplaceBrowserPrint(useCustomPrintOfPdfJS) {
if (useCustomPrintOfPdfJS) {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
if (PDFViewerApplication?.printPdf) {
window.print = PDFViewerApplication.printPdf.bind(PDFViewerApplication);
}
}
else if (this.originalPrint && !this.originalPrint.toString().includes('printPdf')) {
window.print = this.originalPrint;
}
}
async ngOnDestroy() {
this.destroyInitialization = true;
if (this.checkRootElementTimeout) {
clearTimeout(this.checkRootElementTimeout);
}
if (this.initializationPromise) {
try {
await this.initializationPromise;
}
catch (e) { }
}
this.notificationService.onPDFJSInitSignal.set(undefined);
if (this.resizeObserver) {
this.resizeObserver.disconnect();
}
// do not run this code on the server
if (typeof window !== 'undefined') {
const pc = document.getElementById('printContainer');
if (pc) {
pc.remove();
}
// Restore original color-scheme to avoid polluting the global document
if (this.originalColorScheme !== null) {
const docStyle = document.documentElement.style;
if (this.originalColorScheme === '') {
docStyle.removeProperty('color-scheme');
}
else {
docStyle.setProperty('color-scheme', this.originalColorScheme);
}
this.originalColorScheme = null;
}
}
// do not run this code on the server
if (typeof window !== 'undefined') {
const originalPrint = this.originalPrint;
if (window && originalPrint && !originalPrint.toString().includes('printPdf')) {
window.print = originalPrint;
}
}
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
if (PDFViewerApplication) {
if (PDFViewerApplication.ngxConsole) {
PDFViewerApplication.ngxConsole.reset();
}
PDFViewerApplication.pdfViewer?.destroyBookMode();
PDFViewerApplication.pdfViewer?.stopRendering();
PDFViewerApplication.pdfThumbnailViewer?.stopRendering();
delete PDFViewerApplication.ngxKeyboardManager;
delete PDFViewerApplication.cspPolicyService;
PDFViewerApplication.eventBus?.off('afterprint', this.afterPrintListener);
PDFViewerApplication.eventBus?.off('beforeprint', this.beforePrintListener);
PDFViewerApplication.eventBus?.off('sourcechanged', this.reportSourceChanges.bind(this));
// #802 clear the form data; otherwise the "download" dialogs opens
PDFViewerApplication.pdfDocument?.annotationStorage?.resetModified();
this.formSupport?.reset();
this.formSupport = undefined;
PDFViewerApplication.onError = undefined;
try {
await PDFViewerApplication.close();
}
catch (error) {
// just ignore it
// for example, the secondary toolbar may have not been initialized yet, so
// trying to destroy it result in errors
}
if (PDFViewerApplication.printKeyDownListener) {
removeEventListener('keydown', PDFViewerApplication.printKeyDownListener, true);
}
const w = globalThis;
delete w.getFormValueFromAngular;
delete w.registerAcroformAnnotations;
delete w.getFormValue;
delete w.setFormValue;
delete w.assignFormIdAndFieldName;
delete w.registerAcroformField;
delete w.registerXFAField;
delete w.assignFormIdAndFieldName;
delete w.updateAngularFormValue;
const bus = PDFViewerApplication.eventBus;
if (bus) {
PDFViewerApplication.unbindEvents();
bus.destroy();
}
PDFViewerApplication.unbindWindowEvents();
PDFViewerApplication?._cleanup();
PDFViewerApplication.eventBus = undefined;
delete w.PDFViewerApplication;
delete w.PDFViewerApplicationOptions;
delete w.PDFViewerApplicationConstants;
this.service.ngxExtendedPdfViewerInitialized = false;
// do not run this code on the server
if (typeof window !== 'undefined') {
document.querySelectorAll('.ngx-extended-pdf-viewer-file-input').forEach((e) => {
e.remove();
});
}
}
}
isPrimaryMenuVisible() {
if (this.showToolbar) {
const visible = this.showDownloadButton ||
this.showDrawEditor ||
this.showHighlightEditor ||
this.showTextEditor ||
this.showFindButton ||
this.showOpenFileButton ||
this.showPagingButtons ||
this.showPresentationModeButton ||
this.showPrintButton ||
this.showPropertiesButton ||
this.showRotateCwButton ||
this.showRotateCcwButton ||
this.showHandToolButton ||
this.showBookModeButton ||
this.showSinglePageModeButton ||
this.showVerticalScrollButton ||
this.showHorizontalScrollButton ||
this.showInfiniteScrollButton ||
this.showSpreadButton ||
this.showSidebarButton ||
this.showZoomButtons;
if (visible) {
return true;
}
}
return false;
}
async ngOnChanges(changes) {
if (typeof window === 'undefined') {
return; // server side rendering
}
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
const PDFViewerApplicationOptions = this.pdfScriptLoaderService.PDFViewerApplicationOptions;
if (this.service.ngxExtendedPdfViewerInitialized) {
if ('src' in changes || 'base64Src' in changes) {
if (this.srcChangeTriggeredByUser) {
this.srcChangeTriggeredByUser = false;
}
else {
if (this.pageViewMode === 'book') {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
PDFViewerApplication?.pdfViewer?.destroyBookMode();
PDFViewerApplication?.pdfViewer?.stopRendering();
PDFViewerApplication?.pdfThumbnailViewer?.stopRendering();
}
if (!!this._src) {
if (this.pdfScriptLoaderService.ngxExtendedPdfViewerIncompletelyInitialized) {
this.openPDF();
}
else {
const initialized = this.notificationService.onPDFJSInitSignal();
if (initialized) {
await this.openPDF2();
}
else {
// the library loads the PDF file later during the initialization
}
}
}
else {
// #802 clear the form data; otherwise the "download" dialogs opens
await this.closeDocument(PDFViewerApplication);
}
}
}
if ('enableDragAndDrop' in changes) {
PDFViewerApplicationOptions.set('enableDragAndDrop', this.enableDragAndDrop);
}
if ('findbarVisible' in changes) {
if (changes['findbarVisible'].currentValue) {
PDFViewerApplication.findBar.open();
}
else {
PDFViewerApplication.findBar.close();
}
}
if ('propertiesDialogVisible' in changes) {
if (this.propertiesDialogVisible) {
PDFViewerApplication.pdfDocumentProperties.open();
}
else {
PDFViewerApplication.pdfDocumentProperties.close();
}
}
if ('zoom' in changes) {
await this.setZoom();
}
if ('maxZoom' in changes) {
if (PDFViewerApplication.pdfViewer) {
PDFViewerApplication.pdfViewer.maxZoom = this.maxZoom;
}
if (PDFViewerApplication.toolbar) {
PDFViewerApplication.toolbar.maxZoom = this.maxZoom;
}
}
if ('minZoom' in changes) {
if (PDFViewerApplication.pdfViewer) {
PDFViewerApplication.pdfViewer.minZoom = this.minZoom;
}
if (PDFViewerApplication.toolbar) {
PDFViewerApplication.toolbar.minZoom = this.minZoom;
}
}
if ('handTool' in changes) {
this.selectCursorTool();
}
if ('page' in changes) {
if (this.page) {
// tslint:disable-next-line: triple-equals
if (this.page != PDFViewerApplication.page) {
PDFViewerApplication.page = this.page;
}
}
}
if ('pageLabel' in changes) {
if (this.pageLabel) {
if (this.pageLabel !== PDFViewerApplication.pdfViewer.currentPageLabel) {
PDFViewerApplication.pdfViewer.currentPageLabel = this.pageLabel;
}
}
}
if ('rotation' in changes) {
if (this.rotation) {
const r = Number(this.rotation);
if (r === 0 || r === 90 || r === 180 || r === 270) {
PDFViewerApplication.pdfViewer.pagesRotation = r;
}
}
else {
PDFViewerApplication.pdfViewer.pagesRotation = 0;
}
}
if ('scrollMode' in changes) {
if (this.scrollMode || this.scrollMode === ScrollModeType.vertical) {
if (PDFViewerApplication.pdfViewer.scrollMode !== Number(this.scrollMode)) {
PDFViewerApplication.eventBus.dispatch('switchscrollmode', { mode: Number(this.scrollMode) });
}
}
}
if ('activeSidebarView' in changes) {
if (this.sidebarVisible) {
PDFViewerApplication.pdfSidebar.open();
const view = Number(this.activeSidebarView);
if (view === 1 || view === 2 || view === 3 || view === 4) {
PDFViewerApplication.pdfSidebar.switchView(view, true);
}
else {
console.error('[activeSidebarView] must be an integer value between 1 and 4');
}
}
else {
PDFViewerApplication.pdfSidebar.close();
}
}
if ('filenameForDownload' in changes) {
PDFViewerApplication.appConfig.filenameForDownload = this.filenameForDownload;
}
if ('nameddest' in changes) {
if (this.nameddest) {
PDFViewerApplication.pdfLinkService.goToDestination(this.nameddest);
}
}
if ('spread' in changes) {
if (this.spread === 'even') {
PDFViewerApplication.spreadModeOnLoad = 2;
PDFViewerApplication.pdfViewer.spreadMode = 2;
this.onSpreadChange('even');
}
else if (this.spread === 'odd') {
PDFViewerApplication.spreadModeOnLoad = 1;
PDFViewerApplication.pdfViewer.spreadMode = 1;
this.onSpreadChange('odd');
}
else {
PDFViewerApplication.spreadModeOnLoad = 0;
PDFViewerApplication.pdfViewer.spreadMode = 0;
this.onSpreadChange('off');
}
}
this.hideToolbarIfItIsEmpty();
setTimeout(() => this.calcViewerPositionTop());
} // end of if (NgxExtendedPdfViewerComponent.ngxExtendedPdfViewerInitialized)
if ('printResolution' in changes) {
const options = PDFViewerApplicationOptions;
if (options) {
options.set('printResolution', this.printResolution);
}
}
if ('ignoreKeyboard' in changes) {
const options = PDFViewerApplicationOptions;
if (options) {
this.overrideDefaultSettings();
}
}
if ('ignoreKeys' in changes) {
const options = PDFViewerApplicationOptions;
if (options) {
this.overrideDefaultSettings();
}
}
if ('acceptKeys' in changes) {
const options = PDFViewerApplicationOptions;
if (options) {
this.overrideDefaultSettings();
}
}
if ('showBorders' in changes) {
if (!changes['showBorders'].isFirstChange()) {
const options = PDFViewerApplicationOptions;
if (options) {
this.overrideDefaultSettings();
const viewer = document.getElementById('viewer');
if (this.showBorders) {
viewer.classList.remove('removePageBorders');
}
else {
viewer.classList.add('removePageBorders');
}
if (PDFViewerApplication.pdfViewer) {
PDFViewerApplication.pdfViewer.removePageBorders = !this.showBorders;
}
const zoomEvent = {
source: viewer,
// tslint:disable-next-line:no-bitwise
scale: (Number(this.zoom) | 100) / 100,
presetValue: this.zoom,
};
PDFViewerApplication.eventBus.dispatch('scalechanging', zoomEvent);
}
}
}
if ('showUnverifiedSignatures' in changes) {
if (PDFViewerApplication?.pdfDocument) {
PDFViewerApplication.pdfDocument._transport.messageHandler.send('showUnverifiedSignatures', this.showUnverifiedSignatures);
}
}
if ('formData' in changes) {
if (!changes['formData'].isFirstChange()) {
this.formSupport.updateFormFieldsInPdfCalledByNgOnChanges(changes['formData'].previousValue);
}
}
if ('enablePrint' in changes) {
if (!changes['enablePrint'].isFirstChange()) {
PDFViewerApplication.enablePrint = this.enablePrint;
}
}
if (('customFindbar' in changes && !changes['customFindbar'].isFirstChange()) ||
('customFindbarButtons' in changes && !changes['customFindbarButtons'].isFirstChange()) ||
('customFindbarInputArea' in changes && !changes['customFindbarInputArea'].isFirstChange()) ||
('customToolbar' in changes && !changes['customToolbar'].isFirstChange())) {
if (this.dummyComponents) {
this.dummyComponents.addMissingStandardWidgets();
}
}
if ('pageViewMode' in changes && !changes['pageViewMode'].isFirstChange()) {
this.pageViewMode = changes['pageViewMode'].currentValue;
}
if ('replaceBrowserPrint' in changes && typeof window !== 'undefined') {
this.doReplaceBrowserPrint(this.replaceBrowserPrint);
}
if ('disableForms' in changes) {
this.enableOrDisableForms(this.elementRef.nativeElement, false);
}
setTimeout(() => this.calcViewerPositionTop());
}
async closeDocument(PDFViewerApplication) {
if (this.pageViewMode === 'book') {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
PDFViewerApplication?.pdfViewer?.destroyBookMode();
PDFViewerApplication?.pdfViewer?.stopRendering();
PDFViewerApplication?.pdfThumbnailViewer?.stopRendering();
}
PDFViewerApplication.pdfDocument?.annotationStorage?.resetModified();
this.formSupport?.reset();
let inputField = PDFViewerApplication.appConfig?.openFileInput;
if (!inputField) {
inputField = document.querySelector('#fileInput');
}
if (inputField) {
inputField.value = '';
}
await PDFViewerApplication.close();
}
async setZoom() {
if (typeof window === 'undefined') {
return; // server side rendering
}
// sometimes ngOnChanges calls this method before the page is initialized,
// so let's check if this.root is already defined
if (this.root) {
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
let zoomAsNumber = this.zoom;
if (String(zoomAsNumber).endsWith('%')) {
zoomAsNumber = Number(String(zoomAsNumber).replace('%', '')) / 100;
}
else if (!isNaN(Number(zoomAsNumber))) {
zoomAsNumber = Number(zoomAsNumber) / 100;
}
if (!zoomAsNumber) {
if (!PDFViewerApplication.store) {
// It's difficult to prevent calling this method to early, so we need this check.
// setZoom() is called later again, when the PDF document has been loaded and its
// fingerprint has been calculated.
}
else {
const userSetting = await PDFViewerApplication.store.get('zoom');
if (userSetting) {
if (!isNaN(Number(userSetting))) {
zoomAsNumber = Number(userSetting) / 100;
}
else {
zoomAsNumber = userSetting;
}
}
else {
zoomAsNumber = 'auto';
}
}
}
if (PDFViewerApplication) {
const PDFViewerApplicationOptions = this.pdfScriptLoaderService.PDFViewerApplicationOptions;
PDFViewerApplicationOptions.set('defaultZoomValue', zoomAsNumber);
}
const scaleDropdownField = this.root.nativeElement.querySelector('#scaleSelect');
if (scaleDropdownField) {
if (this.zoom === 'auto' || this.zoom === 'page-fit' || this.zoom === 'page-actual' || this.zoom === 'page-width') {
scaleDropdownField.value = this.zoom;
}
else {
scaleDropdownField.value = 'custom';
if (scaleDropdownField.options) {
for (const option of scaleDropdownField.options) {
if (option.value === 'custom') {
option.textContent = `${Math.round(Number(zoomAsNumber) * 100000) / 1000}%`;
}
}
}
}
}
if (PDFViewerApplication.pdfViewer) {
PDFViewerApplication.pdfViewer.currentScaleValue = zoomAsNumber ?? 'auto';
}
}
}
initResizeObserver() {
try {
const viewer = document.getElementById('viewer');
if (viewer) {
this.resizeObserver = new ResizeObserver(() => {
this.onResize();
});
this.resizeObserver.observe(viewer);
}
}
catch (exception) {
console.log('ResizeObserver is not supported by your browser');
}
}
onResize() {
const pdfViewer = document.getElementsByClassName('html');
if (pdfViewer && pdfViewer.length > 0) {
const container = document.getElementById('outerContainer');
if (container) {
if (this.secondaryToolbarComponent) {
this.secondaryToolbarComponent.checkVisibility();
}
if (this.dynamicCSSComponent) {
this.dynamicCSSComponent.updateToolbarWidth();
}
}
this.dynamicCSSComponent.checkHeight(this, this.logLevel);
}
this.dynamicCSSComponent.removeScrollbarInInfiniteScrollMode(false, this.pageViewMode, this.primaryMenuVisible, this, this.logLevel);
}
onContextMenu() {
return this.contextMenuAllowed;
}
async pageHasVisibleSignature(page) {
const annotations = await page.getAnnotations();
const signature = annotations.find((a) => a.fieldType === 'Sig');
if (signature) {
const rect = signature?.rect;
if (rect && rect.length === 4 && rect[2] - rect[0] > 0 && rect[3] - rect[1] > 0 && !signature.hidden) {
return true;
}
}
return false;
}
async scrollSignatureWarningIntoView(pdf) {
/** This method has been inspired by https://medium.com/factory-mind/angular-pdf-forms-fa72b15c3fbd. Thanks, Jonny Fox! */
this.hasSignature = false;
for (let i = 1; i <= pdf?.numPages; i++) {
// track the current page
const page = await pdf.getPage(i);
if (await this.pageHasVisibleSignature(page)) {
this.hasSignature = true;
break; // stop looping through the pages as soon as we find a signature
}
}
if (this.hasSignature) {
queueMicrotask(() => {
// Defer scrolling to ensure it happens after any other UI updates
setTimeout(() => {
const viewerContainer = document.querySelector('#viewerContainer');
viewerContainer?.scrollBy(0, -32); // Adjust the scroll position
});
});
}
}
async zoomToPageWidth(event) {
if (this.handTool) {
if (!pdfDefaultOptions.doubleTapZoomsInHandMode) {
return;
}
}
else if (!pdfDefaultOptions.doubleTapZoomsInTextSelectionMode) {
return;
}
if (this.pageViewMode === 'book') {
// scaling doesn't work in book mode
return;
}
const PDFViewerApplication = this.pdfScriptLoaderService.PDFViewerApplication;
const desiredCenterY = event.clientY;
const previousScale = PDFViewerApplication.pdfViewer.currentScale;
if (this.zoom !== pdfDefaultOptions.doubleTapZoomFactor && this.zoom + '%' !== pdfDefaultOptions.doubleTapZoomFactor) {
this.previousZoom = this.zoom;
this.zoom = pdfDefaultOptions.doubleTapZoomFactor; // by default: 'page-width';
await this.setZoom();
}
else if (pdfDefaultOptions.doubleTapResetsZoomOnSecondDoubleTap) {
if (this.previousZoom) {
this.zoom = this.previousZoom;
}
else {
this.zoom = 'page-width';
}
await this.setZoom();
}
else {
return;
}
const currentScale = PDFViewerApplication.pdfViewer.currentScale;
const scaleCorrectionFactor = currentScale / previousScale - 1;
const rect = PDFViewerApplication.pdfViewer.container.getBoundingClientRect();
const dy = desiredCenterY - rect.top;
PDFViewerApplication.pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;
}
enableOrDisableForms(div, doNotEnable) {
if (!this.disableForms && doNotEnable) {
return;
}
const xfaLayers = Array.from(div.querySelectorAll('.xfaLayer'));
const acroFormLayers = Array.from(div.querySelectorAll('.annotationLayer'));
const layers = xfaLayers.concat(...acroFormLayers);
layers.forEach((layer) => layer.querySelectorAll('input').forEach((x) => (x.disabled = this.disableForms)));
layers.forEach((layer) => layer.querySelectorAll('select').forEach((x) => (x.disabled = this.disableForms)));
layers.forEach((layer) => layer.querySelectorAll('textarea').forEach((x) => (x.disabled = this.disableForms)));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxExtendedPdfViewerComponent, deps: [{ token: PLATFORM_ID }, { token: i1.PDFNotificationService }, { token: i0.ElementRef }, { token: i2.PlatformLocation }, { token: i0.ChangeDetectorRef }, { token: i3.NgxExtendedPdfViewerService }, { token: i0.Renderer2 }, { token: i4.PDFScriptLoaderService }, { token: i5.NgxKeyboardManagerService }, { token: i6.PdfCspPolicyService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NgxExtendedPdfViewerComponent, selector: "ngx-extended-pdf-viewer", inputs: { customFindbarInputArea: "customFindbarInputArea", customToolbar: "customToolbar", customFindbar: "customFindbar", customFindbarButtons: "customFindbarButtons", customPdfViewer: "customPdfViewer", customSecondaryToolbar: "customSecondaryToolbar", customSidebar: "customSidebar", customThumbnail: "customThumbnail", customFreeFloatingBar: "customFreeFloatingBar", showFreeFloatingBar: "showFreeFloatingBar", enableDragAndDrop: "enableDragAndDrop", forceUsingLegacyES5: "forceUsingLegacyES5", formData: "formData", disableForms: "disableForms", pageViewMode: "pageViewMode", scrollMode: "scrollMode", authorization: "authorization", httpHeaders: "httpHeaders", contextMenuAllowed: "contextMenuAllowed", enablePrint: "enablePrint", enablePrintAutoRotate: "enablePrintAutoRotate", forceFullReloadOfJavaScriptCode: "forceFullReloadOfJavaScriptCode", showTextEditor: "showTextEditor", showStampEditor: "showStampEditor", showDrawEditor: "showDrawEditor", showHighlightEditor: "showHighlightEditor", showSignatureEditor: "showSignatureEditor", logLevel: "logLevel", minifiedJSLibraries: "minifiedJSLibraries", printResolution: "printResolution", rotation: "rotation", src: "src", base64Src: "base64Src", minHeight: "minHeight", height: "height", backgroundColor: "backgroundColor", pdfBackgroundColor: "pdfBackgroundColor", filenameForDownload: "filenameForDownload", ignoreKeyboard: "ignoreKeyboard", ignoreKeys: "ignoreKeys", acceptKeys: "acceptKeys", imageResourcesPath: "imageResourcesPath", localeFolderPath: "localeFolderPath", language: "language", listenToURL: "listenToURL", nameddest: "nameddest", password: "password", replaceBrowserPrint: "replaceBrowserPrint", useInlineScripts: "useInlineScripts", showUnverifiedSignatures: "showUnverifiedSignatures", startTabindex: "startTabindex", showSidebarButton: "showSidebarButton", sidebarVisible: "sidebarVisible", activeSidebarView: "activeSidebarView", findbarVisible: "findbarVisible", propertiesDialogVisible: "propertiesDialogVisible", showFindButton: "showFindButton", showFindHighlightAll: "showFindHighlightAll", showFindMatchCase: "showFindMatchCase", showFindMultiple: "showFindMultiple", showFindRegexp: "showFindRegexp", showFindEntireWord: "showFindEntireWord", showFindMatchDiacritics: "showFindMatchDiacritics", showFindResultsCount: "showFindResultsCount", showFindMessages: "showFindMessages", showMovePageButton: "showMovePageButton", showPagingButtons: "showPagingButtons", showFirstAndLastPageButtons: "showFirstAndLastPageButtons", showPreviousAndNextPageButtons: "showPreviousAndNextPageButtons", showPageNumber: "showPageNumber", showPageLabel: "showPageLabel", showZoomButtons: "showZoomButtons", showZoomDropdown: "showZoomDropdown", showPresentationModeButton: "showPresentationModeButton", showOpenFileButton: "showOpenFileButton", showPrintButton: "showPrintButton", showDownloadButton: "showDownloadButton", theme: "theme", showToolbar: "showToolbar", showSecondaryToolbarButton: "showSecondaryToolbarButton", showSinglePageModeButton: "showSinglePageModeButton", showVerticalScrollButton: "showVerticalScrollButton", showHorizontalScrollButton: "showHorizontalScrollButton", showWrappedScrollButton: "showWrappedScrollButton", showInfiniteScrollButton: "showInfiniteScrollButton", showBookModeButton: "showBookModeButton", showRotateButton: "showRotateButton", showRotateCwButton: "showRotateCwButton", showRotateCcwButton: "showRotateCcwButton", handTool: "handTool", showHandToolButton: "showHandToolButton", showSpreadButton: "showSpreadButton", showPropertiesButton: "showPropertiesButton", showBorders: "showBorders", spread: "spread", showScrollingButtons: "showScrollingButtons", page: "page", pageLabel: "pageLabel", textLayer: "textLayer", zoom: "zoom", zoomLevels: "zoomLevels", maxZoom: "maxZoom", minZoom: "minZoom", mobileFriendlyZoom: "mobileFriendlyZoom" }, outputs: { annotationEditorEvent: "annotationEditorEvent", formDataChange: "formDataChange", pageViewModeChange: "pageViewModeChange", progress: "progress", srcChange: "srcChange", scrollModeChange: "scrollModeChange", afterPrint: "afterPrint", beforePrint: "beforePrint", currentZoomFactor: "currentZoomFactor", rotationChange: "rotationChange", annotationLayerRendered: "annotationLayerRendered", annotationEditorLayerRendered: "annotationEditorLayerRendered", xfaLayerRendered: "xfaLayerRendered", outlineLoaded: "outlineLoaded", attachmentsloaded: "attachmentsloaded", layersloaded: "layersloaded", sidebarVisibleChange: "sidebarVisibleChange", activeSidebarViewChange: "activeSidebarViewChange", findbarVisibleChange: "findbarVisibleChange", propertiesDialogVisibleChange: "propertiesDialogVisibleChange", handToolChange: "handToolChange", spreadChange: "spreadChange", thumbnailDrawn: "thumbnailDrawn", pageChange: "pageChange", pageLabelChange: "pageLabelChange", pagesLoaded: "pagesLoaded", pageRender: "pageRender", pageRendered: "pageRendered", pdfDownloaded: "pdfDownloaded", pdfLoaded: "pdfLoaded", pdfLoadingStarts: "pdfLoadingStarts", pdfLoadingFailed: "pdfLoadingFailed", textLayerRendered: "textLayerRendered", annotationEditorModeChanged: "annotationEditorModeChanged", updateFindMatchesCount: "updateFindMatchesCount", updateFindState: "updateFindState", zoomChange: "zoomChange" }, host: { listeners: { "contextmenu": "onContextMenu()" } }, viewQueries: [{ propertyName: "dummyComponents", first: true, predicate: PdfDummyComponentsComponent, descendants: true }, { propertyName: "root", first: true, predicate: ["root"], descendants: true }, { propertyName: "secondaryToolbarComponent", first: true, predicate: ["pdfSecondaryToolbarComponent"], descendants: true }, { propertyName: "dynamicCSSComponent", first: true, predicate: ["DynamicCssComponent"], descendants: true }, { propertyName: "sidebarComponent", first: true, predicate: ["pdfsidebar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (theme === 'dark') {\n <pdf-dark-theme></pdf-dark-theme>\n}\n@if (theme === 'light') {\n <pdf-light-theme></pdf-light-theme>\n}\n<pdf-acroform-default-theme></pdf-acroform-default-theme>\n\n<pdf-dynamic-css\n #DynamicCssComponent\n [zoom]=\"mobileFriendlyZoomScale\"\n></pdf-dynamic-css>\n<ng-content *ngTemplateOutlet=\"customPdfViewer ? customPdfViewer : defaultPdfViewer\"></ng-content>\n\n<ng-template #defaultPdfViewer>\n <div\n class=\"zoom\"\n [style.height]=\"minHeight ? minHeight : height\"\n #root\n >\n <div class=\"html\">\n <div\n class=\"body pdf-js-version-{{ majorMinorPdfJsVersion }}\"\n [style.backgroundColor]=\"backgroundColor\"\n >\n <div id=\"outerContainer\">\n @if (showFreeFloatingBar) {\n <div class=\"free-floating-bar\">\n <ng-content *ngTemplateOutlet=\"customFreeFloatingBar ? customFreeFloatingBar : defaultFreeFloatingBar\"> </ng-content>\n </div>\n }\n <pdf-sidebar\n #pdfsidebar\n [sidebarVisible]=\"sidebarVisible || false\"\n [showSidebarButton]=\"showSidebarButton\"\n [customSidebar]=\"customSidebar\"\n [customThumbnail]=\"customThumbnail\"\n (thumbnailDrawn)=\"thumbnailDrawn.emit($event)\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n [sidebarPositionTop]=\"sidebarPositionTop\"\n >\n </pdf-sidebar>\n <div\n id=\"mainContainer\"\n [class.toolbar-hidden]=\"!primaryMenuVisible\"\n >\n <pdf-dummy-components></pdf-dummy-components>\n\n <pdf-toolbar\n (onToolbarLoaded)=\"onToolbarLoaded($event)\"\n [sidebarVisible]=\"sidebarVisible\"\n [class.server-side-rendering]=\"serverSideRendering\"\n [customToolbar]=\"customToolbar\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n [(pageViewMode)]=\"pageViewMode\"\n [primaryMenuVisible]=\"primaryMenuVisible\"\n [scrollMode]=\"scrollMode ?? 0\"\n [showPropertiesButton]=\"showPropertiesButton\"\n [showBookModeButton]=\"showBookModeButton\"\n [showDownloadButton]=\"showDownloadButton\"\n [showDrawEditor]=\"showDrawEditor\"\n [showHighlightEditor]=\"showHighlightEditor\"\n [showFindButton]=\"showFindButton\"\n [showHandToolButton]=\"showHandToolButton\"\n [handTool]=\"handTool\"\n [showHorizontalScrollButton]=\"showHorizontalScrollButton\"\n [showInfiniteScrollButton]=\"showInfiniteScrollButton\"\n [showOpenFileButton]=\"showOpenFileButton\"\n [showMovePageButton]=\"showMovePageButton\"\n [showPagingButtons]=\"showPagingButtons\"\n [showFirstAndLastPageButtons]=\"showFirstAndLastPageButtons\"\n [showPreviousAndNextPageButtons]=\"showPreviousAndNextPageButtons\"\n [showPageNumber]=\"showPageNumber\"\n [showPageLabel]=\"showPageLabel\"\n [showPresentationModeButton]=\"showPresentationModeButton && pageViewMode !== 'book'\"\n [showPrintButton]=\"enablePrint ? showPrintButton : false\"\n [showRotateCwButton]=\"showRotateCwButton\"\n [showRotateCcwButton]=\"showRotateCcwButton\"\n [showSecondaryToolbarButton]=\"showSecondaryToolbarButton && !service.secondaryMenuIsEmpty\"\n [showSidebarButton]=\"showSidebarButton\"\n [showSinglePageModeButton]=\"showSinglePageModeButton\"\n [showSignatureEditor]=\"enableSignatureEditor ? showSignatureEditor : false\"\n [showSpreadButton]=\"showSpreadButton\"\n [showStampEditor]=\"showStampEditor\"\n [showTextEditor]=\"showTextEditor\"\n [showVerticalScrollButton]=\"showVerticalScrollButton\"\n [showWrappedScrollButton]=\"showWrappedScrollButton\"\n [showZoomButtons]=\"showZoomButtons\"\n [showZoomDropdown]=\"showZoomDropdown\"\n [spread]=\"spread\"\n [textLayer]=\"textLayer\"\n [toolbarMarginTop]=\"toolbarMarginTop\"\n [toolbarWidth]=\"toolbarWidth\"\n [zoomLevels]=\"zoomLevels\"\n [findbarVisible]=\"findbarVisible\"\n [hasTextLayer]=\"hasTextLayer\"\n ></pdf-toolbar>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight menu\"\n id=\"editorSignatureParamsToolbar\"\n >\n <div\n id=\"addSignatureDoorHanger\"\n class=\"menuContainer\"\n role=\"region\"\n data-l10n-id=\"pdfjs-editor-add-signature-container\"\n >\n <button\n id=\"editorSignatureAddSignature\"\n class=\"toolbarButton labeled\"\n type=\"button\"\n tabindex=\"0\"\n data-l10n-id=\"pdfjs-editor-signature-add-signature-button\"\n >\n <span\n data-l10n-id=\"pdfjs-editor-signature-add-signature-button-label\"\n class=\"editorParamsLabel\"\n ></span>\n </button>\n </div>\n </div>\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorHighlightParamsToolbar\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n >\n <div\n id=\"highlightParamsToolbarContainer\"\n class=\"editorParamsToolbarContainer\"\n >\n <div\n id=\"editorHighlightColorPicker\"\n class=\"colorPicker\"\n >\n <span\n id=\"highlightColorPickerLabel\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-highlight-colorpicker-label\"\n >Highlight color</span\n >\n </div>\n <div id=\"editorHighlightThickness\">\n <label\n for=\"editorFreeHighlightThickness\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-free-highlight-thickness-input\"\n >Thickness</label\n >\n <div class=\"thicknessPicker\">\n <input\n type=\"range\"\n id=\"editorFreeHighlightThickness\"\n class=\"editorParamsSlider\"\n data-l10n-id=\"pdfjs-editor-free-highlight-thickness-title\"\n value=\"12\"\n min=\"8\"\n max=\"24\"\n step=\"1\"\n />\n </div>\n </div>\n <div id=\"editorHighlightVisibility\">\n <div class=\"divider\"></div>\n <div class=\"toggler\">\n <label\n for=\"editorHighlightShowAll\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-highlight-show-all-button-label\"\n >Show all</label\n >\n <button\n id=\"editorHighlightShowAll\"\n class=\"toggle-button\"\n data-l10n-id=\"pdfjs-editor-highlight-show-all-button\"\n aria-pressed=\"true\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorFreeTextParamsToolbar\"\n [class.server-side-rendering]=\"serverSideRendering\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n >\n <div class=\"editorParamsToolbarContainer\">\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorFreeTextColor\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-free-text-color-input\"\n >Font Color</label\n >\n <input\n type=\"color\"\n id=\"editorFreeTextColor\"\n class=\"editorParamsColor\"\n />\n </div>\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorFreeTextFontSize\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-free-text-size-input\"\n >Font Size</label\n >\n <input\n type=\"range\"\n id=\"editorFreeTextFontSize\"\n class=\"editorParamsSlider\"\n value=\"10\"\n min=\"5\"\n max=\"100\"\n step=\"1\"\n />\n </div>\n </div>\n </div>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorStampParamsToolbar\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n >\n <div class=\"editorParamsToolbarContainer\">\n <button\n id=\"editorStampAddImage\"\n class=\"secondaryToolbarButton\"\n title=\"Add image\"\n data-l10n-id=\"pdfjs-editor-stamp-add-image-button\"\n >\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"align-image-to-text\"\n >\n <path\n d=\"M7.00488 9.75V14C7.00488 14.1658 7.07073 14.3247 7.18794 14.4419C7.30515 14.5592 7.46412 14.625 7.62988 14.625C7.79564 14.625 7.95461 14.5592 8.07183 14.4419C8.18904 14.3247 8.25488 14.1658 8.25488 14V9.75L8.75488 9.25H13.0049C13.1706 9.25 13.3296 9.18415 13.4468 9.06694C13.564 8.94973 13.6299 8.79076 13.6299 8.625C13.6299 8.45924 13.564 8.30027 13.4468 8.18306C13.3296 8.06585 13.1706 8 13.0049 8H8.75488L8.25488 7.5V3.25C8.25488 3.08424 8.18904 2.92527 8.07183 2.80806C7.95461 2.69085 7.79564 2.625 7.62988 2.625C7.46412 2.625 7.30515 2.69085 7.18794 2.80806C7.07073 2.92527 7.00488 3.08424 7.00488 3.25V7.5L6.50488 8H2.25488C2.08912 8 1.93015 8.06585 1.81294 8.18306C1.69573 8.30027 1.62988 8.45924 1.62988 8.625C1.62988 8.79076 1.69573 8.94973 1.81294 9.06694C1.93015 9.18415 2.08912 9.25 2.25488 9.25H6.39188L7.00488 9.75Z\"\n fill=\"black\"\n />\n </svg>\n <span data-l10n-id=\"pdfjs-editor-stamp-add-image-button-label\">Add image</span>\n </button>\n </div>\n </div>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorInkParamsToolbar\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n [class.server-side-rendering]=\"serverSideRendering\"\n >\n <div class=\"editorParamsToolbarContainer\">\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorInkColor\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-ink-color-input\"\n >Color</label\n >\n <input\n type=\"color\"\n id=\"editorInkColor\"\n class=\"editorParamsColor\"\n />\n </div>\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorInkThickness\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-ink-thickness-input\"\n >Thickness</label\n >\n <input\n type=\"range\"\n id=\"editorInkThickness\"\n class=\"editorParamsSlider\"\n value=\"1\"\n min=\"1\"\n max=\"20\"\n step=\"1\"\n />\n </div>\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorInkOpacity\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-ink-opacity-input\"\n >Opacity</label\n >\n <input\n type=\"range\"\n id=\"editorInkOpacity\"\n class=\"editorParamsSlider\"\n value=\"1\"\n min=\"0.05\"\n max=\"1\"\n step=\"0.05\"\n />\n </div>\n </div>\n </div>\n\n <pdf-secondary-toolbar\n #pdfSecondaryToolbarComponent\n [class.server-side-rendering]=\"serverSideRendering\"\n [customSecondaryToolbar]=\"customSecondaryToolbar\"\n [secondaryToolbarTop]=\"secondaryToolbarTop\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n (spreadChange)=\"onSpreadChange($event)\"\n [localizationInitialized]=\"localizationInitialized\"\n >\n </pdf-secondary-toolbar>\n\n <pdf-findbar\n [class.server-side-rendering]=\"serverSideRendering\"\n [findbarLeft]=\"findbarLeft\"\n [findbarTop]=\"findbarTop\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n [showFindButton]=\"showFindButton || false\"\n [customFindbarInputArea]=\"customFindbarInputArea\"\n [customFindbarButtons]=\"customFindbarButtons\"\n [showFindEntireWord]=\"showFindEntireWord\"\n [showFindHighlightAll]=\"showFindHighlightAll\"\n [showFindMatchDiacritics]=\"showFindMatchDiacritics\"\n [showFindMatchCase]=\"showFindMatchCase\"\n [showFindMultiple]=\"showFindMultiple\"\n [showFindRegexp]=\"showFindRegexp\"\n [showFindMessages]=\"showFindMessages\"\n [showFindResultsCount]=\"showFindResultsCount\"\n >\n </pdf-findbar>\n\n <pdf-context-menu></pdf-context-menu>\n\n <div\n id=\"viewerContainer\"\n [style.top]=\"viewerPositionTop\"\n [style.backgroundColor]=\"backgroundColor\"\n >\n @if (hasSignature && showUnverifiedSignatures) {\n <div class=\"unverified-signature-warning\">\n {{\n 'unverified-signature-warning'\n | translate\n : \"This PDF file contains a digital signature. The PDF viewer can't verify if the signature is valid.\n Please download the file and open it in Acrobat Reader to verify the signature is valid.\"\n | async\n }}\n </div>\n }\n <div\n id=\"viewer\"\n class=\"pdfViewer\"\n [style.backgroundColor]=\"backgroundColor\"\n (dblclick)=\"zoomToPageWidth($event)\"\n ></div>\n </div>\n <pdf-error-message></pdf-error-message>\n </div>\n <!-- mainContainer -->\n\n <div id=\"dialogContainer\">\n <pdf-password-dialog></pdf-password-dialog>\n <pdf-document-properties-dialog></pdf-document-properties-dialog>\n <pdf-alt-text-dialog></pdf-alt-text-dialog>\n <pdf-alt-text-settings-dialog></pdf-alt-text-settings-dialog>\n <pdf-prepare-printing-dialog></pdf-prepare-printing-dialog>\n <pdf-add-signature-dialog></pdf-add-signature-dialog>\n <pdf-edit-signature-dialog></pdf-edit-signature-dialog>\n </div>\n <!-- dialogContainer -->\n </div>\n <div\n id=\"editorUndoBar\"\n class=\"messageBar\"\n role=\"status\"\n aria-labelledby=\"editorUndoBarMessage\"\n tabindex=\"-1\"\n hidden\n >\n <div>\n <div>\n <span\n id=\"editorUndoBarMessage\"\n class=\"description\"\n ></span>\n </div>\n <button\n id=\"editorUndoBarUndoButton\"\n class=\"undoButton\"\n type=\"button\"\n tabindex=\"0\"\n title=\"Undo\"\n data-l10n-id=\"pdfjs-editor-undo-bar-undo-button\"\n >\n <span data-l10n-id=\"pdfjs-editor-undo-bar-undo-button-label\">Undo</span>\n </button>\n <button\n id=\"editorUndoBarCloseButton\"\n class=\"closeButton\"\n type=\"button\"\n tabindex=\"0\"\n title=\"Close\"\n data-l10n-id=\"pdfjs-editor-undo-bar-close-button\"\n >\n <span data-l10n-id=\"pdfjs-editor-undo-bar-close-button-label\">Close</span>\n </button>\n </div>\n </div>\n <!-- editorUndoBar -->\n <!-- outerContainer -->\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultFreeFloatingBar> </ng-template>\n", styles: ["#mainContainer.toolbar-hidden{margin-top:-30px}.server-side-rendering,.hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.DynamicCssComponent, selector: "pdf-dynamic-css", inputs: ["zoom", "width"] }, { kind: "component", type: i8.PdfAcroformDefaultThemeComponent, selector: "pdf-acroform-default-theme" }, { kind: "component", type: i9.AddSignatureDialogComponent, selector: "pdf-add-signature-dialog" }, { kind: "component", type: i10.PdfContextMenuComponent, selector: "pdf-context-menu" }, { kind: "component", type: i11.PdfDarkThemeComponent, selector: "pdf-dark-theme" }, { kind: "component", type: i12.PdfAltTextDialogComponent, selector: "pdf-alt-text-dialog" }, { kind: "component", type: i13.PdfAltTextSettingsDialogComponent, selector: "pdf-alt-text-settings-dialog" }, { kind: "component", type: i14.PdfDocumentPropertiesDialogComponent, selector: "pdf-document-properties-dialog" }, { kind: "component", type: i15.PdfDummyComponentsComponent, selector: "pdf-dummy-components" }, { kind: "component", type: i16.EditSignatureDialogComponent, selector: "pdf-edit-signature-dialog" }, { kind: "component", type: i17.PdfErrorMessageComponent, selector: "pdf-error-message" }, { kind: "component", type: i18.PdfFindbarComponent, selector: "pdf-findbar", inputs: ["showFindButton", "mobileFriendlyZoomScale", "findbarLeft", "findbarTop", "customFindbarInputArea", "customFindbar", "customFindbarButtons", "showFindHighlightAll", "showFindMatchCase", "showFindEntireWord", "showFindMatchDiacritics", "showFindResultsCount", "showFindMessages", "showFindMultiple", "showFindRegexp"] }, { kind: "component", type: i19.PdfLightThemeComponent, selector: "pdf-light-theme" }, { kind: "component", type: i20.PdfPasswordDialogComponent, selector: "pdf-password-dialog" }, { kind: "component", type: i21.PdfPreparePrintingDialogComponent, selector: "pdf-prepare-printing-dialog" }, { kind: "component", type: i22.PdfSecondaryToolbarComponent, selector: "pdf-secondary-toolbar", inputs: ["customSecondaryToolbar", "secondaryToolbarTop", "mobileFriendlyZoomScale", "localizationInitialized"], outputs: ["spreadChange"] }, { kind: "component", type: i23.PdfSidebarComponent, selector: "pdf-sidebar", inputs: ["sidebarPositionTop", "sidebarVisible", "mobileFriendlyZoomScale", "showSidebarButton", "customSidebar", "customThumbnail"], outputs: ["thumbnailDrawn"] }, { kind: "component", type: i24.PdfToolbarComponent, selector: "pdf-toolbar", inputs: ["customToolbar", "hasTextLayer", "mobileFriendlyZoomScale", "primaryMenuVisible", "showDownloadButton", "showDrawEditor", "showHighlightEditor", "showTextEditor", "showStampEditor", "showFindButton", "showHandToolButton", "showZoomDropdown", "handTool", "showOpenFileButton", "showPrintButton", "showPagingButtons", "showFirstAndLastPageButtons", "showMovePageButton", "showPreviousAndNextPageButtons", "showPageNumber", "showPageLabel", "showPresentationModeButton", "showRotateCwButton", "showRotateCcwButton", "showSecondaryToolbarButton", "showSidebarButton", "showSignatureEditor", "sidebarVisible", "showZoomButtons", "textLayer", "toolbarMarginTop", "toolbarWidth", "zoomLevels", "pageViewMode", "spread", "scrollMode", "showPropertiesButton", "showSpreadButton", "showSinglePageModeButton", "showVerticalScrollButton", "showHorizontalScrollButton", "showWrappedScrollButton", "showInfiniteScrollButton", "showBookModeButton", "findbarVisible"], outputs: ["pageViewModeChange", "onToolbarLoaded"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i25.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxExtendedPdfViewerComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-extended-pdf-viewer', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (theme === 'dark') {\n <pdf-dark-theme></pdf-dark-theme>\n}\n@if (theme === 'light') {\n <pdf-light-theme></pdf-light-theme>\n}\n<pdf-acroform-default-theme></pdf-acroform-default-theme>\n\n<pdf-dynamic-css\n #DynamicCssComponent\n [zoom]=\"mobileFriendlyZoomScale\"\n></pdf-dynamic-css>\n<ng-content *ngTemplateOutlet=\"customPdfViewer ? customPdfViewer : defaultPdfViewer\"></ng-content>\n\n<ng-template #defaultPdfViewer>\n <div\n class=\"zoom\"\n [style.height]=\"minHeight ? minHeight : height\"\n #root\n >\n <div class=\"html\">\n <div\n class=\"body pdf-js-version-{{ majorMinorPdfJsVersion }}\"\n [style.backgroundColor]=\"backgroundColor\"\n >\n <div id=\"outerContainer\">\n @if (showFreeFloatingBar) {\n <div class=\"free-floating-bar\">\n <ng-content *ngTemplateOutlet=\"customFreeFloatingBar ? customFreeFloatingBar : defaultFreeFloatingBar\"> </ng-content>\n </div>\n }\n <pdf-sidebar\n #pdfsidebar\n [sidebarVisible]=\"sidebarVisible || false\"\n [showSidebarButton]=\"showSidebarButton\"\n [customSidebar]=\"customSidebar\"\n [customThumbnail]=\"customThumbnail\"\n (thumbnailDrawn)=\"thumbnailDrawn.emit($event)\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n [sidebarPositionTop]=\"sidebarPositionTop\"\n >\n </pdf-sidebar>\n <div\n id=\"mainContainer\"\n [class.toolbar-hidden]=\"!primaryMenuVisible\"\n >\n <pdf-dummy-components></pdf-dummy-components>\n\n <pdf-toolbar\n (onToolbarLoaded)=\"onToolbarLoaded($event)\"\n [sidebarVisible]=\"sidebarVisible\"\n [class.server-side-rendering]=\"serverSideRendering\"\n [customToolbar]=\"customToolbar\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n [(pageViewMode)]=\"pageViewMode\"\n [primaryMenuVisible]=\"primaryMenuVisible\"\n [scrollMode]=\"scrollMode ?? 0\"\n [showPropertiesButton]=\"showPropertiesButton\"\n [showBookModeButton]=\"showBookModeButton\"\n [showDownloadButton]=\"showDownloadButton\"\n [showDrawEditor]=\"showDrawEditor\"\n [showHighlightEditor]=\"showHighlightEditor\"\n [showFindButton]=\"showFindButton\"\n [showHandToolButton]=\"showHandToolButton\"\n [handTool]=\"handTool\"\n [showHorizontalScrollButton]=\"showHorizontalScrollButton\"\n [showInfiniteScrollButton]=\"showInfiniteScrollButton\"\n [showOpenFileButton]=\"showOpenFileButton\"\n [showMovePageButton]=\"showMovePageButton\"\n [showPagingButtons]=\"showPagingButtons\"\n [showFirstAndLastPageButtons]=\"showFirstAndLastPageButtons\"\n [showPreviousAndNextPageButtons]=\"showPreviousAndNextPageButtons\"\n [showPageNumber]=\"showPageNumber\"\n [showPageLabel]=\"showPageLabel\"\n [showPresentationModeButton]=\"showPresentationModeButton && pageViewMode !== 'book'\"\n [showPrintButton]=\"enablePrint ? showPrintButton : false\"\n [showRotateCwButton]=\"showRotateCwButton\"\n [showRotateCcwButton]=\"showRotateCcwButton\"\n [showSecondaryToolbarButton]=\"showSecondaryToolbarButton && !service.secondaryMenuIsEmpty\"\n [showSidebarButton]=\"showSidebarButton\"\n [showSinglePageModeButton]=\"showSinglePageModeButton\"\n [showSignatureEditor]=\"enableSignatureEditor ? showSignatureEditor : false\"\n [showSpreadButton]=\"showSpreadButton\"\n [showStampEditor]=\"showStampEditor\"\n [showTextEditor]=\"showTextEditor\"\n [showVerticalScrollButton]=\"showVerticalScrollButton\"\n [showWrappedScrollButton]=\"showWrappedScrollButton\"\n [showZoomButtons]=\"showZoomButtons\"\n [showZoomDropdown]=\"showZoomDropdown\"\n [spread]=\"spread\"\n [textLayer]=\"textLayer\"\n [toolbarMarginTop]=\"toolbarMarginTop\"\n [toolbarWidth]=\"toolbarWidth\"\n [zoomLevels]=\"zoomLevels\"\n [findbarVisible]=\"findbarVisible\"\n [hasTextLayer]=\"hasTextLayer\"\n ></pdf-toolbar>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight menu\"\n id=\"editorSignatureParamsToolbar\"\n >\n <div\n id=\"addSignatureDoorHanger\"\n class=\"menuContainer\"\n role=\"region\"\n data-l10n-id=\"pdfjs-editor-add-signature-container\"\n >\n <button\n id=\"editorSignatureAddSignature\"\n class=\"toolbarButton labeled\"\n type=\"button\"\n tabindex=\"0\"\n data-l10n-id=\"pdfjs-editor-signature-add-signature-button\"\n >\n <span\n data-l10n-id=\"pdfjs-editor-signature-add-signature-button-label\"\n class=\"editorParamsLabel\"\n ></span>\n </button>\n </div>\n </div>\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorHighlightParamsToolbar\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n >\n <div\n id=\"highlightParamsToolbarContainer\"\n class=\"editorParamsToolbarContainer\"\n >\n <div\n id=\"editorHighlightColorPicker\"\n class=\"colorPicker\"\n >\n <span\n id=\"highlightColorPickerLabel\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-highlight-colorpicker-label\"\n >Highlight color</span\n >\n </div>\n <div id=\"editorHighlightThickness\">\n <label\n for=\"editorFreeHighlightThickness\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-free-highlight-thickness-input\"\n >Thickness</label\n >\n <div class=\"thicknessPicker\">\n <input\n type=\"range\"\n id=\"editorFreeHighlightThickness\"\n class=\"editorParamsSlider\"\n data-l10n-id=\"pdfjs-editor-free-highlight-thickness-title\"\n value=\"12\"\n min=\"8\"\n max=\"24\"\n step=\"1\"\n />\n </div>\n </div>\n <div id=\"editorHighlightVisibility\">\n <div class=\"divider\"></div>\n <div class=\"toggler\">\n <label\n for=\"editorHighlightShowAll\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-highlight-show-all-button-label\"\n >Show all</label\n >\n <button\n id=\"editorHighlightShowAll\"\n class=\"toggle-button\"\n data-l10n-id=\"pdfjs-editor-highlight-show-all-button\"\n aria-pressed=\"true\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorFreeTextParamsToolbar\"\n [class.server-side-rendering]=\"serverSideRendering\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n >\n <div class=\"editorParamsToolbarContainer\">\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorFreeTextColor\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-free-text-color-input\"\n >Font Color</label\n >\n <input\n type=\"color\"\n id=\"editorFreeTextColor\"\n class=\"editorParamsColor\"\n />\n </div>\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorFreeTextFontSize\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-free-text-size-input\"\n >Font Size</label\n >\n <input\n type=\"range\"\n id=\"editorFreeTextFontSize\"\n class=\"editorParamsSlider\"\n value=\"10\"\n min=\"5\"\n max=\"100\"\n step=\"1\"\n />\n </div>\n </div>\n </div>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorStampParamsToolbar\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n >\n <div class=\"editorParamsToolbarContainer\">\n <button\n id=\"editorStampAddImage\"\n class=\"secondaryToolbarButton\"\n title=\"Add image\"\n data-l10n-id=\"pdfjs-editor-stamp-add-image-button\"\n >\n <svg\n aria-hidden=\"true\"\n focusable=\"false\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"align-image-to-text\"\n >\n <path\n d=\"M7.00488 9.75V14C7.00488 14.1658 7.07073 14.3247 7.18794 14.4419C7.30515 14.5592 7.46412 14.625 7.62988 14.625C7.79564 14.625 7.95461 14.5592 8.07183 14.4419C8.18904 14.3247 8.25488 14.1658 8.25488 14V9.75L8.75488 9.25H13.0049C13.1706 9.25 13.3296 9.18415 13.4468 9.06694C13.564 8.94973 13.6299 8.79076 13.6299 8.625C13.6299 8.45924 13.564 8.30027 13.4468 8.18306C13.3296 8.06585 13.1706 8 13.0049 8H8.75488L8.25488 7.5V3.25C8.25488 3.08424 8.18904 2.92527 8.07183 2.80806C7.95461 2.69085 7.79564 2.625 7.62988 2.625C7.46412 2.625 7.30515 2.69085 7.18794 2.80806C7.07073 2.92527 7.00488 3.08424 7.00488 3.25V7.5L6.50488 8H2.25488C2.08912 8 1.93015 8.06585 1.81294 8.18306C1.69573 8.30027 1.62988 8.45924 1.62988 8.625C1.62988 8.79076 1.69573 8.94973 1.81294 9.06694C1.93015 9.18415 2.08912 9.25 2.25488 9.25H6.39188L7.00488 9.75Z\"\n fill=\"black\"\n />\n </svg>\n <span data-l10n-id=\"pdfjs-editor-stamp-add-image-button-label\">Add image</span>\n </button>\n </div>\n </div>\n\n <div\n class=\"editorParamsToolbar hidden doorHangerRight\"\n id=\"editorInkParamsToolbar\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n [class.server-side-rendering]=\"serverSideRendering\"\n >\n <div class=\"editorParamsToolbarContainer\">\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorInkColor\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-ink-color-input\"\n >Color</label\n >\n <input\n type=\"color\"\n id=\"editorInkColor\"\n class=\"editorParamsColor\"\n />\n </div>\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorInkThickness\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-ink-thickness-input\"\n >Thickness</label\n >\n <input\n type=\"range\"\n id=\"editorInkThickness\"\n class=\"editorParamsSlider\"\n value=\"1\"\n min=\"1\"\n max=\"20\"\n step=\"1\"\n />\n </div>\n <div class=\"editorParamsSetter\">\n <label\n for=\"editorInkOpacity\"\n class=\"editorParamsLabel\"\n data-l10n-id=\"pdfjs-editor-ink-opacity-input\"\n >Opacity</label\n >\n <input\n type=\"range\"\n id=\"editorInkOpacity\"\n class=\"editorParamsSlider\"\n value=\"1\"\n min=\"0.05\"\n max=\"1\"\n step=\"0.05\"\n />\n </div>\n </div>\n </div>\n\n <pdf-secondary-toolbar\n #pdfSecondaryToolbarComponent\n [class.server-side-rendering]=\"serverSideRendering\"\n [customSecondaryToolbar]=\"customSecondaryToolbar\"\n [secondaryToolbarTop]=\"secondaryToolbarTop\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n (spreadChange)=\"onSpreadChange($event)\"\n [localizationInitialized]=\"localizationInitialized\"\n >\n </pdf-secondary-toolbar>\n\n <pdf-findbar\n [class.server-side-rendering]=\"serverSideRendering\"\n [findbarLeft]=\"findbarLeft\"\n [findbarTop]=\"findbarTop\"\n [mobileFriendlyZoomScale]=\"mobileFriendlyZoomScale\"\n [showFindButton]=\"showFindButton || false\"\n [customFindbarInputArea]=\"customFindbarInputArea\"\n [customFindbarButtons]=\"customFindbarButtons\"\n [showFindEntireWord]=\"showFindEntireWord\"\n [showFindHighlightAll]=\"showFindHighlightAll\"\n [showFindMatchDiacritics]=\"showFindMatchDiacritics\"\n [showFindMatchCase]=\"showFindMatchCase\"\n [showFindMultiple]=\"showFindMultiple\"\n [showFindRegexp]=\"showFindRegexp\"\n [showFindMessages]=\"showFindMessages\"\n [showFindResultsCount]=\"showFindResultsCount\"\n >\n </pdf-findbar>\n\n <pdf-context-menu></pdf-context-menu>\n\n <div\n id=\"viewerContainer\"\n [style.top]=\"viewerPositionTop\"\n [style.backgroundColor]=\"backgroundColor\"\n >\n @if (hasSignature && showUnverifiedSignatures) {\n <div class=\"unverified-signature-warning\">\n {{\n 'unverified-signature-warning'\n | translate\n : \"This PDF file contains a digital signature. The PDF viewer can't verify if the signature is valid.\n Please download the file and open it in Acrobat Reader to verify the signature is valid.\"\n | async\n }}\n </div>\n }\n <div\n id=\"viewer\"\n class=\"pdfViewer\"\n [style.backgroundColor]=\"backgroundColor\"\n (dblclick)=\"zoomToPageWidth($event)\"\n ></div>\n </div>\n <pdf-error-message></pdf-error-message>\n </div>\n <!-- mainContainer -->\n\n <div id=\"dialogContainer\">\n <pdf-password-dialog></pdf-password-dialog>\n <pdf-document-properties-dialog></pdf-document-properties-dialog>\n <pdf-alt-text-dialog></pdf-alt-text-dialog>\n <pdf-alt-text-settings-dialog></pdf-alt-text-settings-dialog>\n <pdf-prepare-printing-dialog></pdf-prepare-printing-dialog>\n <pdf-add-signature-dialog></pdf-add-signature-dialog>\n <pdf-edit-signature-dialog></pdf-edit-signature-dialog>\n </div>\n <!-- dialogContainer -->\n </div>\n <div\n id=\"editorUndoBar\"\n class=\"messageBar\"\n role=\"status\"\n aria-labelledby=\"editorUndoBarMessage\"\n tabindex=\"-1\"\n hidden\n >\n <div>\n <div>\n <span\n id=\"editorUndoBarMessage\"\n class=\"description\"\n ></span>\n </div>\n <button\n id=\"editorUndoBarUndoButton\"\n class=\"undoButton\"\n type=\"button\"\n tabindex=\"0\"\n title=\"Undo\"\n data-l10n-id=\"pdfjs-editor-undo-bar-undo-button\"\n >\n <span data-l10n-id=\"pdfjs-editor-undo-bar-undo-button-label\">Undo</span>\n </button>\n <button\n id=\"editorUndoBarCloseButton\"\n class=\"closeButton\"\n type=\"button\"\n tabindex=\"0\"\n title=\"Close\"\n data-l10n-id=\"pdfjs-editor-undo-bar-close-button\"\n >\n <span data-l10n-id=\"pdfjs-editor-undo-bar-close-button-label\">Close</span>\n </button>\n </div>\n </div>\n <!-- editorUndoBar -->\n <!-- outerContainer -->\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultFreeFloatingBar> </ng-template>\n", styles: ["#mainContainer.toolbar-hidden{margin-top:-30px}.server-side-rendering,.hidden{display:none}\n"] }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: i1.PDFNotificationService }, { type: i0.ElementRef }, { type: i2.PlatformLocation }, { type: i0.ChangeDetectorRef }, { type: i3.NgxExtendedPdfViewerService }, { type: i0.Renderer2 }, { type: i4.PDFScriptLoaderService }, { type: i5.NgxKeyboardManagerService }, { type: i6.PdfCspPolicyService }, { type: i0.NgZone }], propDecorators: { dummyComponents: [{
type: ViewChild,
args: [PdfDummyComponentsComponent]
}], root: [{
type: ViewChild,
args: ['root']
}], annotationEditorEvent: [{
type: Output
}], customFindbarInputArea: [{
type: Input
}], customToolbar: [{
type: Input
}], customFindbar: [{
type: Input
}], customFindbarButtons: [{
type: Input
}], customPdfViewer: [{
type: Input
}], customSecondaryToolbar: [{
type: Input
}], customSidebar: [{
type: Input
}], customThumbnail: [{
type: Input
}], customFreeFloatingBar: [{
type: Input
}], showFreeFloatingBar: [{
type: Input
}], enableDragAndDrop: [{
type: Input
}], forceUsingLegacyES5: [{
type: Input
}], formData: [{
type: Input
}], disableForms: [{
type: Input
}], formDataChange: [{
type: Output
}], pageViewMode: [{
type: Input
}], pageViewModeChange: [{
type: Output
}], progress: [{
type: Output
}], secondaryToolbarComponent: [{
type: ViewChild,
args: ['pdfSecondaryToolbarComponent']
}], dynamicCSSComponent: [{
type: ViewChild,
args: ['DynamicCssComponent']
}], sidebarComponent: [{
type: ViewChild,
args: ['pdfsidebar']
}], srcChange: [{
type: Output
}], scrollMode: [{
type: Input
}], scrollModeChange: [{
type: Output
}], authorization: [{
type: Input
}], httpHeaders: [{
type: Input
}], contextMenuAllowed: [{
type: Input
}], afterPrint: [{
type: Output
}], beforePrint: [{
type: Output
}], currentZoomFactor: [{
type: Output
}], enablePrint: [{
type: Input
}], enablePrintAutoRotate: [{
type: Input
}], forceFullReloadOfJavaScriptCode: [{
type: Input
}], showTextEditor: [{
type: Input
}], showStampEditor: [{
type: Input
}], showDrawEditor: [{
type: Input
}], showHighlightEditor: [{
type: Input
}], showSignatureEditor: [{
type: Input
}], logLevel: [{
type: Input
}], minifiedJSLibraries: [{
type: Input
}], printResolution: [{
type: Input
}], rotation: [{
type: Input
}], rotationChange: [{
type: Output
}], annotationLayerRendered: [{
type: Output
}], annotationEditorLayerRendered: [{
type: Output
}], xfaLayerRendered: [{
type: Output
}], outlineLoaded: [{
type: Output
}], attachmentsloaded: [{
type: Output
}], layersloaded: [{
type: Output
}], src: [{
type: Input
}], base64Src: [{
type: Input
}], minHeight: [{
type: Input
}], height: [{
type: Input
}], backgroundColor: [{
type: Input
}], pdfBackgroundColor: [{
type: Input
}], filenameForDownload: [{
type: Input
}], ignoreKeyboard: [{
type: Input
}], ignoreKeys: [{
type: Input
}], acceptKeys: [{
type: Input
}], imageResourcesPath: [{
type: Input
}], localeFolderPath: [{
type: Input
}], language: [{
type: Input
}], listenToURL: [{
type: Input
}], nameddest: [{
type: Input
}], password: [{
type: Input
}], replaceBrowserPrint: [{
type: Input
}], useInlineScripts: [{
type: Input
}], showUnverifiedSignatures: [{
type: Input
}], startTabindex: [{
type: Input
}], showSidebarButton: [{
type: Input
}], sidebarVisible: [{
type: Input
}], sidebarVisibleChange: [{
type: Output
}], activeSidebarView: [{
type: Input
}], activeSidebarViewChange: [{
type: Output
}], findbarVisible: [{
type: Input
}], findbarVisibleChange: [{
type: Output
}], propertiesDialogVisible: [{
type: Input
}], propertiesDialogVisibleChange: [{
type: Output
}], showFindButton: [{
type: Input
}], showFindHighlightAll: [{
type: Input
}], showFindMatchCase: [{
type: Input
}], showFindMultiple: [{
type: Input
}], showFindRegexp: [{
type: Input
}], showFindEntireWord: [{
type: Input
}], showFindMatchDiacritics: [{
type: Input
}], showFindResultsCount: [{
type: Input
}], showFindMessages: [{
type: Input
}], showMovePageButton: [{
type: Input
}], showPagingButtons: [{
type: Input
}], showFirstAndLastPageButtons: [{
type: Input
}], showPreviousAndNextPageButtons: [{
type: Input
}], showPageNumber: [{
type: Input
}], showPageLabel: [{
type: Input
}], showZoomButtons: [{
type: Input
}], showZoomDropdown: [{
type: Input
}], showPresentationModeButton: [{
type: Input
}], showOpenFileButton: [{
type: Input
}], showPrintButton: [{
type: Input
}], showDownloadButton: [{
type: Input
}], theme: [{
type: Input
}], showToolbar: [{
type: Input
}], showSecondaryToolbarButton: [{
type: Input
}], showSinglePageModeButton: [{
type: Input
}], showVerticalScrollButton: [{
type: Input
}], showHorizontalScrollButton: [{
type: Input
}], showWrappedScrollButton: [{
type: Input
}], showInfiniteScrollButton: [{
type: Input
}], showBookModeButton: [{
type: Input
}], showRotateButton: [{
type: Input
}], showRotateCwButton: [{
type: Input
}], showRotateCcwButton: [{
type: Input
}], handTool: [{
type: Input
}], handToolChange: [{
type: Output
}], showHandToolButton: [{
type: Input
}], showSpreadButton: [{
type: Input
}], showPropertiesButton: [{
type: Input
}], showBorders: [{
type: Input
}], spread: [{
type: Input
}], showScrollingButtons: [{
type: Input
}], spreadChange: [{
type: Output
}], thumbnailDrawn: [{
type: Output
}], page: [{
type: Input
}], pageChange: [{
type: Output
}], pageLabel: [{
type: Input
}], pageLabelChange: [{
type: Output
}], pagesLoaded: [{
type: Output
}], pageRender: [{
type: Output
}], pageRendered: [{
type: Output
}], pdfDownloaded: [{
type: Output
}], pdfLoaded: [{
type: Output
}], pdfLoadingStarts: [{
type: Output
}], pdfLoadingFailed: [{
type: Output
}], textLayer: [{
type: Input
}], textLayerRendered: [{
type: Output
}], annotationEditorModeChanged: [{
type: Output
}], updateFindMatchesCount: [{
type: Output
}], updateFindState: [{
type: Output
}], zoom: [{
type: Input
}], zoomChange: [{
type: Output
}], zoomLevels: [{
type: Input
}], maxZoom: [{
type: Input
}], minZoom: [{
type: Input
}], mobileFriendlyZoom: [{
type: Input
}], onContextMenu: [{
type: HostListener,
args: ['contextmenu']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL25neC1leHRlbmRlZC1wZGYtdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBS0wsTUFBTSxFQUNOLFdBQVcsRUFJWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFtQnZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0YsT0FBTyxFQUE0QyxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUdoRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFlcEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUI3RCxNQUFNLFVBQVUsS0FBSztJQUNuQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUNqQyxPQUFPLEtBQUssQ0FBQztL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QU07Z0JBSUEsc0JBQXNCO3NCQUQ1QixNQUFNO2dCQUlBLGVBQWU7c0JBRHJCLE1BQU07Z0JBS0EsSUFBSTtzQkFEVixLQUFLO2dCQUlDLFVBQVU7c0JBRGhCLE1BQU07Z0JBYUksVUFBVTtzQkFEcEIsS0FBSztnQkFNQyxPQUFPO3NCQURiLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQTZESyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBKzhDQyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciwgUGxhdGZvcm1Mb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBkZkRvY3VtZW50TG9hZGVkRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9kb2N1bWVudC1sb2FkZWQtZXZlbnQnO1xuaW1wb3J0IHsgRmlsZUlucHV0Q2hhbmdlZCB9IGZyb20gJy4vZXZlbnRzL2ZpbGUtaW5wdXQtY2hhbmdlZCc7XG5pbXBvcnQgeyBGaW5kUmVzdWx0LCBGaW5kUmVzdWx0TWF0Y2hlc0NvdW50LCBGaW5kU3RhdGUgfSBmcm9tICcuL2V2ZW50cy9maW5kLXJlc3VsdCc7XG5pbXBvcnQgeyBIYW5kdG9vbENoYW5nZWQgfSBmcm9tICcuL2V2ZW50cy9oYW5kdG9vbC1jaGFuZ2VkJztcbmltcG9ydCB7IFBhZ2VOdW1iZXJDaGFuZ2UgfSBmcm9tICcuL2V2ZW50cy9wYWdlLW51bWJlci1jaGFuZ2UnO1xuaW1wb3J0IHsgUGFnZVJlbmRlckV2ZW50IH0gZnJvbSAnLi9ldmVudHMvcGFnZS1yZW5kZXItZXZlbnQnO1xuaW1wb3J0IHsgUGFnZVJlbmRlcmVkRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9wYWdlLXJlbmRlcmVkLWV2ZW50JztcbmltcG9ydCB7IFBhZ2VzTG9hZGVkRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9wYWdlcy1sb2FkZWQtZXZlbnQnO1xuaW1wb3J0IHsgUGFnZXNSb3RhdGlvbkV2ZW50IH0gZnJvbSAnLi9ldmVudHMvcGFnZXMtcm90YXRpb24tZXZlbnQnO1xuaW1wb3J0IHsgUGRmRG93bmxvYWRlZEV2ZW50IH0gZnJvbSAnLi9ldmVudHMvcGRmLWRvd25sb2FkZWQtZXZlbnQnO1xuaW1wb3J0IHsgUGRmTG9hZGVkRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9wZGYtbG9hZGVkLWV2ZW50JztcbmltcG9ydCB7IFBkZkxvYWRpbmdTdGFydHNFdmVudCB9IGZyb20gJy4vZXZlbnRzL3BkZi1sb2FkaW5nLXN0YXJ0cy1ldmVudCc7XG5pbXBvcnQgeyBQZGZUaHVtYm5haWxEcmF3bkV2ZW50IH0gZnJvbSAnLi9ldmVudHMvcGRmLXRodW1ibmFpbC1kcmF3bi1ldmVudCc7XG5pbXBvcnQgeyBQcm9ncmVzc0JhckV2ZW50IH0gZnJvbSAnLi9ldmVudHMvcHJvZ3Jlc3MtYmFyLWV2ZW50JztcbmltcG9ydCB7IFNjYWxlQ2hhbmdpbmdFdmVudCB9IGZyb20gJy4vZXZlbnRzL3NjYWxlLWNoYW5naW5nLWV2ZW50JztcbmltcG9ydCB7IFNpZGViYXJ2aWV3Q2hhbmdlIH0gZnJvbSAnLi9ldmVudHMvc2lkZWJhcnZpZXctY2hhbmdlZCc7XG5pbXBvcnQgeyBUZXh0TGF5ZXJSZW5kZXJlZEV2ZW50IH0gZnJvbSAnLi9ldmVudHMvdGV4dGxheWVyLXJlbmRlcmVkJztcbmltcG9ydCB7IE5neEV4dGVuZGVkUGRmVmlld2VyU2VydmljZSB9IGZyb20gJy4vbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZDdXJzb3JUb29scyB9IGZyb20gJy4vb3B0aW9ucy9wZGYtY3Vyc29yLXRvb2xzJztcbmltcG9ydCB7IGFzc2V0c1VybCwgZ2V0VmVyc2lvblN1ZmZpeCwgcGRmRGVmYXVsdE9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvcGRmLWRlZmF1bHQtb3B0aW9ucyc7XG5pbXBvcnQgeyBQYWdlVmlld01vZGVUeXBlLCBTY3JvbGxNb2RlQ2hhbmdlZEV2ZW50LCBTY3JvbGxNb2RlVHlwZSB9IGZyb20gJy4vb3B0aW9ucy9wZGYtdmlld2VyJztcbmltcG9ydCB7IElQREZWaWV3ZXJBcHBsaWNhdGlvbiwgUERGRG9jdW1lbnRQcm94eSwgUERGUGFnZVByb3h5IH0gZnJvbSAnLi9vcHRpb25zL3BkZi12aWV3ZXItYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgSVBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy9wZGYtdmlld2VyLWFwcGxpY2F0aW9uLW9wdGlvbnMnO1xuaW1wb3J0IHsgVmVyYm9zaXR5TGV2ZWwgfSBmcm9tICcuL29wdGlvbnMvdmVyYm9zaXR5LWxldmVsJztcbmltcG9ydCB7IFBkZkR1bW15Q29tcG9uZW50c0NvbXBvbmVudCB9IGZyb20gJy4vcGRmLWR1bW15LWNvbXBvbmVudHMvcGRmLWR1bW15LWNvbXBvbmVudHMuY29tcG9uZW50JztcbmltcG9ydCB7IFBERk5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL3BkZi1ub3RpZmljYXRpb24tc2VydmljZSc7XG5pbXBvcnQgeyBQZGZTZWNvbmRhcnlUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9zZWNvbmRhcnktdG9vbGJhci9wZGYtc2Vjb25kYXJ5LXRvb2xiYXIvcGRmLXNlY29uZGFyeS10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQZGZTaWRlYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9zaWRlYmFyL3BkZi1zaWRlYmFyL3BkZi1zaWRlYmFyLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IER5bmFtaWNDc3NDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtY3NzL2R5bmFtaWMtY3NzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uRWRpdG9yRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9hbm5vdGF0aW9uLWVkaXRvci1sYXllci1ldmVudCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXJSZW5kZXJlZEV2ZW50IH0gZnJvbSAnLi9ldmVudHMvYW5ub3RhdGlvbi1lZGl0b3ItbGF5ZXItcmVuZGVyZWQtZXZlbnQnO1xuaW1wb3J0IHsgQW5ub3RhdGlvbkVkaXRvckVkaXRvck1vZGVDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9hbm5vdGF0aW9uLWVkaXRvci1tb2RlLWNoYW5nZWQtZXZlbnQnO1xuaW1wb3J0IHsgQW5ub3RhdGlvbkxheWVyUmVuZGVyZWRFdmVudCB9IGZyb20gJy4vZXZlbnRzL2Fubm90YXRpb24tbGF5ZXItcmVuZGVyZWQtZXZlbnQnO1xuaW1wb3J0IHsgQXR0YWNobWVudExvYWRlZEV2ZW50IH0gZnJvbSAnLi9ldmVudHMvYXR0YWNobWVudC1sb2FkZWQtZXZlbnQnO1xuaW1wb3J0IHsgTGF5ZXJzTG9hZGVkRXZlbnQgfSBmcm9tICcuL2V2ZW50cy9sYXllcnMtbG9hZGVkLWV2ZW50JztcbmltcG9ydCB7IE91dGxpbmVMb2FkZWRFdmVudCB9IGZyb20gJy4vZXZlbnRzL291dGxpbmUtbG9hZGVkLWV2ZW50JztcbmltcG9ydCB7IFRvZ2dsZVNpZGViYXJFdmVudCB9IGZyb20gJy4vZXZlbnRzL3RvZ2dsZS1zaWRlYmFyLWV2ZW50JztcbmltcG9ydCB7IFhmYUxheWVyUmVuZGVyZWRFdmVudCB9IGZyb20gJy4vZXZlbnRzL3hmYS1sYXllci1yZW5kZXJlZC1ldmVudCc7XG5pbXBvcnQgeyBOZ3hGb3JtU3VwcG9ydCB9IGZyb20gJy4vbmd4LWZvcm0tc3VwcG9ydCc7XG5pbXBvcnQgeyBOZ3hIYXNIZWlnaHQgfSBmcm9tICcuL25neC1oYXMtaGVpZ2h0JztcbmltcG9ydCB7IE5neEtleWJvYXJkTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuL25neC1rZXlib2FyZC1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGRmU2lkZWJhclZpZXcgfSBmcm9tICcuL29wdGlvbnMvcGRmLXNpZGViYXItdmlld3MnO1xuaW1wb3J0IHsgU3ByZWFkVHlwZSB9IGZyb20gJy4vb3B0aW9ucy9zcHJlYWQtdHlwZSc7XG5pbXBvcnQgeyBab29tVHlwZSB9IGZyb20gJy4vb3B0aW9ucy96b29tLXR5cGUnO1xuaW1wb3J0IHsgUGRmQ3NwUG9saWN5U2VydmljZSB9IGZyb20gJy4vcGRmLWNzcC1wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBQREZTY3JpcHRMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi9wZGYtc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc3BvbnNpdmVWaXNpYmlsaXR5IH0gZnJvbSAnLi9yZXNwb25zaXZlLXZpc2liaWxpdHknO1xuXG5kZWNsYXJlIGNsYXNzIFJlc2l6ZU9ic2VydmVyIHtcbiAgY29uc3RydWN0b3IocGFyYW06ICgpID0+IHZvaWQpO1xuICBwdWJsaWMgZGlzY29ubmVjdCgpO1xuICBwdWJsaWMgb2JzZXJ2ZShkaXY6IEhUTUxFbGVtZW50KTtcbn1cblxuaW50ZXJmYWNlIEVsZW1lbnRBbmRQb3NpdGlvbiB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRGF0YVR5cGUge1xuICBbZmllbGROYW1lOiBzdHJpbmddOiBudWxsIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJT1MoKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJBZ2VudCA9IG5hdmlnYXRvcj8udXNlckFnZW50O1xuICBpZiAoIXVzZXJBZ2VudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodXNlckFnZW50KSB8fFxuICAgIC8vIGlQYWQgb24gaU9TIDEzKyBkZXRlY3Rpb24gKHJlcG9ydHMgYXMgTWFjKVxuICAgICh1c2VyQWdlbnQuaW5jbHVkZXMoJ01hYycpICYmICdvbnRvdWNoZW5kJyBpbiBkb2N1bWVudClcbiAgKTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hFeHRlbmRlZFBkZlZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE5neEhhc0hlaWdodCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybVN1cHBvcnQgPSBuZXcgTmd4Rm9ybVN1cHBvcnQoKTtcblxuICAvKipcbiAgICogVGhlIGR1bW15IGNvbXBvbmVudHMgYXJlIGluc2VydGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdXNlciBjdXN0b21pemVzIHRoZSB0b29sYmFyXG4gICAqIHdpdGhvdXQgYWRkaW5nIGV2ZXJ5IG9yaWdpbmFsIHRvb2xiYXIgaXRlbS4gV2l0aG91dCB0aGUgZHVtbXkgY29tcG9uZW50cywgdGhlXG4gICAqIGluaXRpYWxpemF0aW9uIGNvZGUgb2YgcGRmLmpzIGNyYXNoZXMgYmVjYXVzZSBpdCBhc3N1bWUgdGhhdCBldmVyeSBzdGFuZGFyZCB3aWRnZXQgaXMgdGhlcmUuXG4gICAqL1xuICBAVmlld0NoaWxkKFBkZkR1bW15Q29tcG9uZW50c0NvbXBvbmVudClcbiAgcHVibGljIGR1bW15Q29tcG9uZW50czogUGRmRHVtbXlDb21wb25lbnRzQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ3Jvb3QnKVxuICBwdWJsaWMgcm9vdDogRWxlbWVudFJlZjtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGFubm90YXRpb25FZGl0b3JFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8QW5ub3RhdGlvbkVkaXRvckV2ZW50PigpO1xuICAvKiBVSSB0ZW1wbGF0ZXMgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbUZpbmRiYXJJbnB1dEFyZWE6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbVRvb2xiYXI6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbUZpbmRiYXI6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbUZpbmRiYXJCdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjdXN0b21QZGZWaWV3ZXI6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbVNlY29uZGFyeVRvb2xiYXI6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbVNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbVRodW1ibmFpbDogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY3VzdG9tRnJlZUZsb2F0aW5nQmFyOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93RnJlZUZsb2F0aW5nQmFyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlRHJhZ0FuZERyb3AgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmb3JjZVVzaW5nTGVnYWN5RVM1ID0gZmFsc2U7XG5cbiAgcHVibGljIGxvY2FsaXphdGlvbkluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBpbml0aWFsQW5ndWxhckZvcm1EYXRhPzogRm9ybURhdGFUeXBlID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZm9ybURhdGEoZm9ybURhdGE6IEZvcm1EYXRhVHlwZSkge1xuICAgIHRoaXMuaW5pdGlhbEFuZ3VsYXJGb3JtRGF0YSA/Pz0gZm9ybURhdGE7XG4gICAgdGhpcy5mb3JtU3VwcG9ydC5mb3JtRGF0YSA9IGZvcm1EYXRhO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpc2FibGVGb3JtcyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZ2V0IGZvcm1EYXRhQ2hhbmdlKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1TdXBwb3J0LmZvcm1EYXRhQ2hhbmdlO1xuICB9XG5cbiAgcHVibGljIF9wYWdlVmlld01vZGU6IFBhZ2VWaWV3TW9kZVR5cGUgPSAnbXVsdGlwbGUnO1xuXG4gIHB1YmxpYyBiYXNlSHJlZjogc3RyaW5nO1xuXG4gIC8qKiBUaGlzIGZsYWcgcHJldmVudHMgdHJ5aW5nIHRvIGxvYWQgYSBmaWxlIHR3aWNlIGlmIHRoZSB1c2VyIHVwbG9hZHMgaXQgdXNpbmcgdGhlIGZpbGUgdXBsb2FkIGRpYWxvZyBvciB2aWEgZHJhZyduJ2Ryb3AgKi9cbiAgcHJpdmF0ZSBzcmNDaGFuZ2VUcmlnZ2VyZWRCeVVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgZ2V0IHBhZ2VWaWV3TW9kZSgpOiBQYWdlVmlld01vZGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVZpZXdNb2RlO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwYWdlVmlld01vZGUodmlld01vZGU6IFBhZ2VWaWV3TW9kZVR5cGUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGhhc0NoYW5nZWQgPSB0aGlzLl9wYWdlVmlld01vZGUgIT09IHZpZXdNb2RlO1xuICAgIGlmICghaGFzQ2hhbmdlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbXVzdFJlZHJhdyA9ICF0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2Uubmd4RXh0ZW5kZWRQZGZWaWV3ZXJJbmNvbXBsZXRlbHlJbml0aWFsaXplZCAmJiAodGhpcy5fcGFnZVZpZXdNb2RlID09PSAnYm9vaycgfHwgdmlld01vZGUgPT09ICdib29rJyk7XG4gICAgdGhpcy5fcGFnZVZpZXdNb2RlID0gdmlld01vZGU7XG4gICAgdGhpcy5wYWdlVmlld01vZGVDaGFuZ2UuZW1pdCh0aGlzLl9wYWdlVmlld01vZGUpO1xuXG4gICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zOiBJUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucztcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM/LnNldCgncGFnZVZpZXdNb2RlJywgdGhpcy5wYWdlVmlld01vZGUpO1xuXG4gICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbiA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbjtcbiAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24pIHtcbiAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5wYWdlVmlld01vZGUgPSB0aGlzLl9wYWdlVmlld01vZGU7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQ29udHJvbGxlci5fcGFnZVZpZXdNb2RlID0gdGhpcy5fcGFnZVZpZXdNb2RlO1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlVmlld01vZGUodmlld01vZGUpO1xuXG4gICAgaWYgKG11c3RSZWRyYXcpIHtcbiAgICAgIHRoaXMucmVkcmF3Vmlld2VyKHZpZXdNb2RlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVZpZXdNb2RlKHZpZXdNb2RlOiBQYWdlVmlld01vZGVUeXBlKTogdm9pZCB7XG4gICAgc3dpdGNoICh2aWV3TW9kZSkge1xuICAgICAgY2FzZSAnaW5maW5pdGUtc2Nyb2xsJzpcbiAgICAgICAgdGhpcy5oYW5kbGVJbmZpbml0ZVNjcm9sbE1vZGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzaW5nbGUnOlxuICAgICAgICB0aGlzLmhhbmRsZVNpbmdsZVBhZ2VNb2RlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm9vayc6XG4gICAgICAgIHRoaXMuaGFuZGxlQm9va01vZGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtdWx0aXBsZSc6XG4gICAgICAgIHRoaXMuaGFuZGxlTXVsdGlwbGVQYWdlTW9kZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuc2Nyb2xsTW9kZSA9IFNjcm9sbE1vZGVUeXBlLnZlcnRpY2FsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSW5maW5pdGVTY3JvbGxNb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNjcm9sbE1vZGUgPT09IFNjcm9sbE1vZGVUeXBlLnBhZ2UgfHwgdGhpcy5zY3JvbGxNb2RlID09PSBTY3JvbGxNb2RlVHlwZS5ob3Jpem9udGFsKSB7XG4gICAgICB0aGlzLnNjcm9sbE1vZGUgPSBTY3JvbGxNb2RlVHlwZS52ZXJ0aWNhbDtcbiAgICAgIHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5kaXNwYXRjaCgnc3dpdGNoc2Nyb2xsbW9kZScsIHsgbW9kZTogTnVtYmVyKHRoaXMuc2Nyb2xsTW9kZSkgfSk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gdGhpcyB0aW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEBJbnB1dCgpIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNoaWxkIGNvbXBvbmVudHMgYXJlIGluaXRpYWxpemVkXG4gICAgICAvLyAoYW5kIHRoZSBEeW5hbWljQ3NzQ29tcG9uZW50IGlzIGEgY2hpbGQgY29tcG9uZW50KVxuICAgICAgdGhpcy5keW5hbWljQ1NTQ29tcG9uZW50LnJlbW92ZVNjcm9sbGJhckluSW5maW5pdGVTY3JvbGxNb2RlKGZhbHNlLCB0aGlzLnBhZ2VWaWV3TW9kZSwgdGhpcy5wcmltYXJ5TWVudVZpc2libGUsIHRoaXMsIHRoaXMubG9nTGV2ZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gc2luY2UgcGRmLmpzLCBvdXIgY3VzdG9tIHNpbmdsZS1wYWdlLW1vZGUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHN0YW5kYXJkIHNjcm9sbE1vZGU9XCJwYWdlXCJcbiAgcHJpdmF0ZSBoYW5kbGVTaW5nbGVQYWdlTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbE1vZGUgPSBTY3JvbGxNb2RlVHlwZS5wYWdlO1xuICAgIHRoaXMuX3BhZ2VWaWV3TW9kZSA9ICdzaW5nbGUnO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCb29rTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dCb3JkZXJzID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuc2Nyb2xsTW9kZSAhPT0gU2Nyb2xsTW9kZVR5cGUudmVydGljYWwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTW9kZSA9IFNjcm9sbE1vZGVUeXBlLnZlcnRpY2FsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTXVsdGlwbGVQYWdlTW9kZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY3JvbGxNb2RlID09PSBTY3JvbGxNb2RlVHlwZS5wYWdlKSB7XG4gICAgICB0aGlzLnNjcm9sbE1vZGUgPSBTY3JvbGxNb2RlVHlwZS52ZXJ0aWNhbDtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyB0aGlzIHRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgQElucHV0KCkgaXMgY2FsbGVkIGJlZm9yZSB0aGUgY2hpbGQgY29tcG9uZW50cyBhcmUgaW5pdGlhbGl6ZWRcbiAgICAgIC8vIChhbmQgdGhlIER5bmFtaWNDc3NDb21wb25lbnQgaXMgYSBjaGlsZCBjb21wb25lbnQpXG4gICAgICB0aGlzLmR5bmFtaWNDU1NDb21wb25lbnQucmVtb3ZlU2Nyb2xsYmFySW5JbmZpbml0ZVNjcm9sbE1vZGUodHJ1ZSwgdGhpcy5wYWdlVmlld01vZGUsIHRoaXMucHJpbWFyeU1lbnVWaXNpYmxlLCB0aGlzLCB0aGlzLmxvZ0xldmVsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVkcmF3Vmlld2VyKHZpZXdNb2RlOiBQYWdlVmlld01vZGVUeXBlKTogdm9pZCB7XG4gICAgaWYgKHZpZXdNb2RlICE9PSAnYm9vaycpIHtcbiAgICAgIGNvbnN0IG5neCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3Qgdmlld2VyQ29udGFpbmVyID0gbmd4LnF1ZXJ5U2VsZWN0b3IoJyN2aWV3ZXJDb250YWluZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgIHZpZXdlckNvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgdmlld2VyQ29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgICB2aWV3ZXJDb250YWluZXIuc3R5bGUubWFyZ2luUmlnaHQgPSAnJztcbiAgICAgIHZpZXdlckNvbnRhaW5lci5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XG4gICAgICBjb25zdCB2aWV3ZXIgPSBuZ3gucXVlcnlTZWxlY3RvcignI3ZpZXdlcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgdmlld2VyLnN0eWxlLm1heFdpZHRoID0gJyc7XG4gICAgICB2aWV3ZXIuc3R5bGUubWluV2lkdGggPSAnJztcbiAgICB9XG4gICAgdGhpcy5vcGVuUERGMigpO1xuICB9XG5cbiAgcHVibGljIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcGFnZVZpZXdNb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlVmlld01vZGVUeXBlPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcHJvZ3Jlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2dyZXNzQmFyRXZlbnQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgncGRmU2Vjb25kYXJ5VG9vbGJhckNvbXBvbmVudCcpXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vjb25kYXJ5VG9vbGJhckNvbXBvbmVudDogUGRmU2Vjb25kYXJ5VG9vbGJhckNvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCdEeW5hbWljQ3NzQ29tcG9uZW50JylcbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljQ1NTQ29tcG9uZW50OiBEeW5hbWljQ3NzQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ3BkZnNpZGViYXInKVxuICBwcml2YXRlIHJlYWRvbmx5IHNpZGViYXJDb21wb25lbnQ6IFBkZlNpZGViYXJDb21wb25lbnQ7XG5cbiAgLyogcmVndWxhciBhdHRyaWJ1dGVzICovXG5cbiAgcHJpdmF0ZSBfc3JjOiBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkgfCB7IHJhbmdlOiBhbnkgfSB8IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHNyY0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgX3Njcm9sbE1vZGU6IFNjcm9sbE1vZGVUeXBlID0gU2Nyb2xsTW9kZVR5cGUudmVydGljYWw7XG5cbiAgcHVibGljIGdldCBzY3JvbGxNb2RlKCk6IFNjcm9sbE1vZGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsTW9kZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2Nyb2xsTW9kZSh2YWx1ZTogU2Nyb2xsTW9kZVR5cGUpIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsTW9kZSAhPT0gdmFsdWUpIHtcbiAgICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24/LnBkZlZpZXdlcikge1xuICAgICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLnNjcm9sbE1vZGUgIT09IE51bWJlcih0aGlzLnNjcm9sbE1vZGUpKSB7XG4gICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMuZGlzcGF0Y2goJ3N3aXRjaHNjcm9sbG1vZGUnLCB7IG1vZGU6IE51bWJlcih0aGlzLnNjcm9sbE1vZGUpIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9zY3JvbGxNb2RlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy5fc2Nyb2xsTW9kZSA9PT0gU2Nyb2xsTW9kZVR5cGUucGFnZSkge1xuICAgICAgICBpZiAodGhpcy5wYWdlVmlld01vZGUgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgdGhpcy5fcGFnZVZpZXdNb2RlID0gJ3NpbmdsZSc7XG4gICAgICAgICAgdGhpcy5wYWdlVmlld01vZGVDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VWaWV3TW9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYWdlVmlld01vZGUgPT09ICdzaW5nbGUnIHx8IHRoaXMuX3Njcm9sbE1vZGUgPT09IFNjcm9sbE1vZGVUeXBlLmhvcml6b250YWwpIHtcbiAgICAgICAgdGhpcy5fcGFnZVZpZXdNb2RlID0gJ211bHRpcGxlJztcbiAgICAgICAgdGhpcy5wYWdlVmlld01vZGVDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VWaWV3TW9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzY3JvbGxNb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTY3JvbGxNb2RlVHlwZT4oKTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXV0aG9yaXphdGlvbjogT2JqZWN0IHwgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaHR0cEhlYWRlcnM6IE9iamVjdCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29udGV4dE1lbnVBbGxvd2VkID0gdHJ1ZTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGFmdGVyUHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBiZWZvcmVQcmludCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGN1cnJlbnRab29tRmFjdG9yID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqIFRoaXMgZmllbGQgc3RvcmVzIHRoZSBwcmV2aW91cyB6b29tIGxldmVsIGlmIHRoZSBwYWdlIGlzIGVubGFyZ2VkIHdpdGggYSBkb3VibGUtdGFwIG9yIGRvdWJsZS1jbGljayAqL1xuICBwcml2YXRlIHByZXZpb3VzWm9vbTogWm9vbVR5cGU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVuYWJsZVByaW50ID0gdHJ1ZTtcblxuICBwdWJsaWMgZ2V0IGVuYWJsZVByaW50QXV0b1JvdGF0ZSgpIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMuZW5hYmxlUHJpbnRBdXRvUm90YXRlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZW5hYmxlUHJpbnRBdXRvUm90YXRlKHZhbHVlKSB7XG4gICAgcGRmRGVmYXVsdE9wdGlvbnMuZW5hYmxlUHJpbnRBdXRvUm90YXRlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbj8ucGRmVmlld2VyKSB7XG4gICAgICB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLmVuYWJsZVByaW50QXV0b1JvdGF0ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBGb3JjZSByZWxvYWRpbmcgb2YgdGhlIEphdmFTY3JpcHQgY29kZS4gVXNlZnVsIGZvciB0ZXN0aW5nIGFuZCBtaWNyby1mcm9udGVuZHMgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZvcmNlRnVsbFJlbG9hZE9mSmF2YVNjcmlwdENvZGUgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1RleHRFZGl0b3I6IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gJ3h4bCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dTdGFtcEVkaXRvcjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSAneHhsJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0RyYXdFZGl0b3I6IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gJ3h4bCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dIaWdobGlnaHRFZGl0b3I6IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gJ3h4bCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dTaWduYXR1cmVFZGl0b3I6IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gJ3h4bCc7XG5cbiAgLyoqIEhvdyBtYW55IGxvZyBtZXNzYWdlcyBzaG91bGQgYmUgcHJpbnRlZD9cbiAgICogTGVnYWwgdmFsdWVzOiBWZXJib3NpdHlMZXZlbC5JTkZPUyAoPSA1KSwgVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MgKD0gMSksIFZlcmJvc2l0eUxldmVsLkVSUk9SUyAoPSAwKSAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbG9nTGV2ZWwgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcblxuICAvKiogVXNlIHRoZSBtaW5pZmllZCAobWluaWZpZWRKU0xpYnJhcmllcz1cInRydWVcIiwgd2hpY2ggaXMgdGhlIGRlZmF1bHQpIG9yIHRoZSB1c2VyLXJlYWRhYmxlIHBkZi5qcyBsaWJyYXJ5IChtaW5pZmllZEpTTGlicmFyaWVzPVwiZmFsc2VcIikgKi9cbiAgcHVibGljIGdldCBtaW5pZmllZEpTTGlicmFyaWVzKCkge1xuICAgIHJldHVybiBwZGZEZWZhdWx0T3B0aW9ucy5faW50ZXJuYWxGaWxlbmFtZVN1ZmZpeCA9PT0gJy5taW4nO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtaW5pZmllZEpTTGlicmFyaWVzKHZhbHVlKSB7XG4gICAgcGRmRGVmYXVsdE9wdGlvbnMuX2ludGVybmFsRmlsZW5hbWVTdWZmaXggPSB2YWx1ZSA/ICcubWluJyA6ICcnO1xuICB9XG5cbiAgcHVibGljIHByaW1hcnlNZW51VmlzaWJsZSA9IHRydWU7XG5cbiAgLyoqIG9wdGlvbiB0byBpbmNyZWFzZSAob3IgcmVkdWNlKSBwcmludCByZXNvbHV0aW9uLiBEZWZhdWx0IGlzIDE1MCAoZHBpKS4gU2Vuc2libGUgdmFsdWVzXG4gICAqIGFyZSAzMDAsIDYwMCwgYW5kIDEyMDAuIE5vdGUgdGhlIGluY3JlYXNlIG1lbW9yeSBjb25zdW1wdGlvbiwgd2hpY2ggbWF5IGV2ZW4gcmVzdWx0IGluIGEgYnJvd3NlciBjcmFzaC4gKi9cbiAgQElucHV0KClcbiAgcHVibGljIHByaW50UmVzb2x1dGlvbiA9IG51bGw7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHJvdGF0aW9uOiAwIHwgOTAgfCAxODAgfCAyNzA7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByb3RhdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8MCB8IDkwIHwgMTgwIHwgMjcwPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgYW5ub3RhdGlvbkxheWVyUmVuZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFubm90YXRpb25MYXllclJlbmRlcmVkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhbm5vdGF0aW9uRWRpdG9yTGF5ZXJSZW5kZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QW5ub3RhdGlvbkVkaXRvckxheWVyUmVuZGVyZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHhmYUxheWVyUmVuZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFhmYUxheWVyUmVuZGVyZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIG91dGxpbmVMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE91dGxpbmVMb2FkZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGF0dGFjaG1lbnRzbG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxBdHRhY2htZW50TG9hZGVkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBsYXllcnNsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPExheWVyc0xvYWRlZEV2ZW50PigpO1xuXG4gIHB1YmxpYyBoYXNTaWduYXR1cmU6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzcmModXJsOiBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IEJsb2IgfCBVaW50OEFycmF5IHwgVVJMIHwgeyByYW5nZTogYW55IH0gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodXJsIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgdGhpcy5fc3JjID0gdXJsLmJ1ZmZlcjtcbiAgICB9IGVsc2UgaWYgKHVybCBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgdGhpcy5fc3JjID0gdXJsLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgdXJsIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5zcmMgPSBhd2FpdCB0aGlzLmNvbnZlcnRCbG9iVG9VaW50OEFycmF5KHVybCk7XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2Uubmd4RXh0ZW5kZWRQZGZWaWV3ZXJJbml0aWFsaXplZCkge1xuICAgICAgICAgIGlmICh0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2Uubmd4RXh0ZW5kZWRQZGZWaWV3ZXJJbmNvbXBsZXRlbHlJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuUERGKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB0aGlzLm9wZW5QREYyKCkpKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVsc2Ugb3BlblBERiBpcyBjYWxsZWQgbGF0ZXIsIHNvIHdlIGRvIG5vdGhpbmcgdG8gcHJldmVudCBsb2FkaW5nIHRoZSBQREYgZmlsZSB0d2ljZVxuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3NyYyA9IHVybDtcbiAgICAgIGlmICh1cmwubGVuZ3RoID4gOTgwKSB7XG4gICAgICAgIC8vIG1pbmltYWwgbGVuZ3RoIG9mIGEgYmFzZTY0IGVuY29kZWQgUERGXG4gICAgICAgIGlmICh1cmwubGVuZ3RoICUgNCA9PT0gMCkge1xuICAgICAgICAgIGlmICgvXlthLXpBLVpcXGQvK10rPXswLDJ9JC8udGVzdCh1cmwpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgVVJMIGxvb2tzIGxpa2UgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuIElmIHNvLCBwbGVhc2UgdXNlIHRoZSBhdHRyaWJ1dGUgW2Jhc2U2NFNyY10gaW5zdGVhZCBvZiBbc3JjXScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fc3JjIGFzIGFueSkgPSB1cmw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb252ZXJ0QmxvYlRvVWludDhBcnJheShibG9iKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgLy8gZmlyc3QgdHJ5IHRoZSBhbGdvcml0aG0gZm9yIG1vZGVybiBicm93c2VycyBhbmQgbm9kZS5qc1xuICAgIGlmIChibG9iLmFycmF5QnVmZmVyKSB7XG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgLy8gdGhlbiB0cnkgdGhlIG9sZC1mYXNoaW9uZWQgd2F5XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFVpbnQ4QXJyYXk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICBpZiAocmVhZGVyLnJlc3VsdCkge1xuICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVhZGVyLnJlc3VsdCBhcyBBcnJheUJ1ZmZlcikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIGNvbnZlcnRpbmcgQmxvYiB0byBVaW50OEFycmF5JykpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZpbGVSZWFkZXIgZXJyb3InKSk7XG4gICAgICB9O1xuICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIH0pO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBiYXNlNjRTcmMoYmFzZTY0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGJhc2U2NCkge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBiaW5hcnlfc3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAgICAgY29uc3QgbGVuID0gYmluYXJ5X3N0cmluZy5sZW5ndGg7XG4gICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5X3N0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgdGhpcy5zcmMgPSBieXRlcy5idWZmZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NyYyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbWJpbmF0aW9uIG9mIGhlaWdodCwgbWluSGVpZ2h0LCBhbmQgYXV0b0hlaWdodCBlbnN1cmVzIHRoZSBQREYgaGVpZ2h0IG9mIHRoZSBQREYgdmlld2VyIGlzIGNhbGN1bGF0ZWQgY29ycmVjdGx5IHdoZW4gdGhlIGhlaWdodCBpcyBhIHBlcmNlbnRhZ2UuXG4gICAqIEJ5IGRlZmF1bHQsIG1hbnkgQ1NTIGZyYW1ld29ya3MgbWFrZSBhIGRpdiB3aXRoIDEwMCUgaGF2ZSBhIGhlaWdodCBvciB6ZXJvIHBpeGVscy4gY2hlY2tIZWlnaHQoKSBmaXhlcyB0aGlzLlxuICAgKi9cbiAgcHVibGljIGF1dG9IZWlnaHQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbWluSGVpZ2h0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBfaGVpZ2h0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnMTAwJSc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoZWlnaHQoaDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5taW5IZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hdXRvSGVpZ2h0ID0gZmFsc2U7XG4gICAgaWYgKGgpIHtcbiAgICAgIGlmIChoID09PSAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5hdXRvSGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWlnaHQgPSAnMTAwJSc7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gdGhpcyB0aW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEBJbnB1dCgpIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNoaWxkIGNvbXBvbmVudHMgYXJlIGluaXRpYWxpemVkXG4gICAgICAvLyAoYW5kIHRoZSBEeW5hbWljQ3NzQ29tcG9uZW50IGlzIGEgY2hpbGQgY29tcG9uZW50KVxuICAgICAgdGhpcy5keW5hbWljQ1NTQ29tcG9uZW50LmNoZWNrSGVpZ2h0KHRoaXMsIHRoaXMubG9nTGV2ZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBiYWNrZ3JvdW5kQ29sb3IgPSB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHBkZkJhY2tncm91bmRDb2xvciA9IHVuZGVmaW5lZDtcblxuICAvKiogQWxsb3dzIHRoZSB1c2VyIHRvIGRlZmluZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhZnRlciBjbGlja2luZyBcImRvd25sb2FkXCIgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpbGVuYW1lRm9yRG93bmxvYWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogQWxsb3dzIHRoZSB1c2VyIHRvIGRpc2FibGUgdGhlIGtleWJvYXJkIGJpbmRpbmdzIGNvbXBsZXRlbHkgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGlnbm9yZUtleWJvYXJkID0gZmFsc2U7XG5cbiAgLyoqIEFsbG93cyB0aGUgdXNlciB0byBkaXNhYmxlIGEgbGlzdCBvZiBrZXkgYmluZGluZ3MuICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpZ25vcmVLZXlzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqIEFsbG93cyB0aGUgdXNlciB0byBlbmFibGUgYSBsaXN0IG9mIGtleSBiaW5kaW5ncyBleHBsaWNpdGx5LiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCwgZXZlcnkgb3RoZXIga2V5IGJpbmRpbmcgaXMgaWdub3JlZC4gKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFjY2VwdEtleXM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICBwdWJsaWMgaGFzVGV4dExheWVyID0gdHJ1ZTtcblxuICAvKiogQWxsb3dzIHRoZSB1c2VyIHRvIHB1dCB0aGUgdmlld2VyJ3Mgc3ZnIGltYWdlcyBpbnRvIGFuIGFyYml0cmFyeSBmb2xkZXIgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGltYWdlUmVzb3VyY2VzUGF0aCA9IGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpICsgJy9pbWFnZXMvJztcblxuICAvKiogQWxsb3dzIHRoZSB1c2VyIHRvIHB1dCB0aGVpciBsb2NhbGUgZm9sZGVyIGludG8gYW4gYXJiaXRyYXJ5IGZvbGRlciAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbG9jYWxlRm9sZGVyUGF0aCA9IGFzc2V0c1VybChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpICsgJy9sb2NhbGUnO1xuXG4gIC8qKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBsb2NhbGUuIFRoaXMgbXVzdCBiZSB0aGUgY29tcGxldGUgbG9jYWxlIG5hbWUsIHN1Y2ggYXMgXCJlcy1FU1wiLiBUaGUgc3RyaW5nIGlzIGFsbG93ZWQgdG8gYmUgYWxsIGxvd2VyY2FzZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyAnZW4nIDogbmF2aWdhdG9yLmxhbmd1YWdlO1xuXG4gIC8qKiBCeSBkZWZhdWx0LCBsaXN0ZW5pbmcgdG8gdGhlIFVSTCBpcyBkZWFjdGl2YXRlZCBiZWNhdXNlIG9mdGVuIHRoZSBhbmNob3IgdGFnIGlzIHVzZWQgZm9yIHRoZSBBbmd1bGFyIHJvdXRlciAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbGlzdGVuVG9VUkwgPSBmYWxzZTtcblxuICAvKiogTmF2aWdhdGUgdG8gYSBjZXJ0YWluIFwibmFtZWQgZGVzdGluYXRpb25cIiAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbmFtZWRkZXN0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqIGFsbG93cyB5b3UgdG8gcGFzcyBhIHBhc3N3b3JkIHRvIHJlYWQgcGFzc3dvcmQtcHJvdGVjdGVkIGZpbGVzICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZXBsYWNlQnJvd3NlclByaW50ID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9yaWdpbmFsUHJpbnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5wcmludCA6IHVuZGVmaW5lZDtcblxuICAvKiogU3RvcmUgdGhlIG9yaWdpbmFsIGNvbG9yLXNjaGVtZSB2YWx1ZSB0byByZXN0b3JlIGl0IG9uIGRlc3Ryb3kgKi9cbiAgcHJpdmF0ZSBvcmlnaW5hbENvbG9yU2NoZW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgX3Nob3dTaWRlYmFyQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHVzZUlubGluZVNjcmlwdHMgPSB0cnVlO1xuXG4gIHB1YmxpYyB2aWV3ZXJQb3NpdGlvblRvcCA9ICczMnB4JztcblxuICAvKiogcGRmLmpzIGNhbiBzaG93IHNpZ25hdHVyZXMsIGJ1dCBmYWlscyB0byB2ZXJpZnkgdGhlbS4gU28gdGhleSBhcmUgc3dpdGNoZWQgb2ZmIGJ5IGRlZmF1bHQuXG4gICAqIFNldCBcIltzaG93VW52ZXJpZmllZFNpZ25hdHVyZXNdXCI9XCJ0cnVlXCIgdG8gZGlzcGxheSBlLXNpZ25hdHVyZXMgbm9uZXRoZWxlc3MuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1VudmVyaWZpZWRTaWduYXR1cmVzID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN0YXJ0VGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgZ2V0IHNob3dTaWRlYmFyQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93U2lkZWJhckJ1dHRvbjtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNob3dTaWRlYmFyQnV0dG9uKHNob3c6IFJlc3BvbnNpdmVWaXNpYmlsaXR5KSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICAgIHRoaXMuX3Nob3dTaWRlYmFyQnV0dG9uID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3Nob3dTaWRlYmFyQnV0dG9uID0gc2hvdztcbiAgICBpZiAodGhpcy5fc2hvd1NpZGViYXJCdXR0b24pIHtcbiAgICAgIGNvbnN0IGlzSUUgPSAvbXNpZVxcc3x0cmlkZW50XFwvL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICBsZXQgZmFjdG9yID0gMTtcbiAgICAgIGlmIChpc0lFKSB7XG4gICAgICAgIGZhY3RvciA9IE51bWJlcigodGhpcy5fbW9iaWxlRnJpZW5kbHlab29tIHx8ICcxMDAnKS5yZXBsYWNlKCclJywgJycpKSAvIDEwMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maW5kYmFyTGVmdCA9ICg2OCAqIGZhY3RvcikudG9TdHJpbmcoKSArICdweCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmluZGJhckxlZnQgPSAnMHB4JztcbiAgfVxuXG4gIHByaXZhdGUgX3NpZGViYXJWaXNpYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgZ2V0IHNpZGViYXJWaXNpYmxlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaWRlYmFyVmlzaWJsZTtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNpZGViYXJWaXNpYmxlKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9zaWRlYmFyVmlzaWJsZSkge1xuICAgICAgdGhpcy5zaWRlYmFyVmlzaWJsZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fc2lkZWJhclZpc2libGUgPSB2YWx1ZTtcbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbj8ucGRmU2lkZWJhcikge1xuICAgICAgaWYgKHRoaXMuc2lkZWJhclZpc2libGUpIHtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmU2lkZWJhci5vcGVuKCk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBOdW1iZXIodGhpcy5hY3RpdmVTaWRlYmFyVmlldyk7XG4gICAgICAgIGlmICh2aWV3ID09PSAxIHx8IHZpZXcgPT09IDIgfHwgdmlldyA9PT0gMyB8fCB2aWV3ID09PSA0KSB7XG4gICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmU2lkZWJhci5zd2l0Y2hWaWV3KHZpZXcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1thY3RpdmVTaWRlYmFyVmlld10gbXVzdCBiZSBhbiBpbnRlZ2VyIHZhbHVlIGJldHdlZW4gMSBhbmQgNCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZTaWRlYmFyLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzaWRlYmFyVmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYWN0aXZlU2lkZWJhclZpZXc6IFBkZlNpZGViYXJWaWV3ID0gUGRmU2lkZWJhclZpZXcuT1VUTElORTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGFjdGl2ZVNpZGViYXJWaWV3Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQZGZTaWRlYmFyVmlldz4oKTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZmluZGJhclZpc2libGUgPSBmYWxzZTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGZpbmRiYXJWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwcm9wZXJ0aWVzRGlhbG9nVmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcHJvcGVydGllc0RpYWxvZ1Zpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dGaW5kQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0ZpbmRIaWdobGlnaHRBbGwgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93RmluZE1hdGNoQ2FzZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dGaW5kTXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93RmluZFJlZ2V4cDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93RmluZEVudGlyZVdvcmQgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93RmluZE1hdGNoRGlhY3JpdGljcyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dGaW5kUmVzdWx0c0NvdW50ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0ZpbmRNZXNzYWdlcyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dNb3ZlUGFnZUJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1BhZ2luZ0J1dHRvbnM6IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0ZpcnN0QW5kTGFzdFBhZ2VCdXR0b25zOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dQcmV2aW91c0FuZE5leHRQYWdlQnV0dG9uczogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93UGFnZU51bWJlcjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93UGFnZUxhYmVsOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dab29tQnV0dG9uczogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93Wm9vbURyb3Bkb3duOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dQcmVzZW50YXRpb25Nb2RlQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93T3BlbkZpbGVCdXR0b246IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1ByaW50QnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dEb3dubG9hZEJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0aGVtZTogJ2RhcmsnIHwgJ2xpZ2h0JyB8ICdjdXN0b20nIHwgc3RyaW5nID0gJ2xpZ2h0JztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1Rvb2xiYXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U2Vjb25kYXJ5VG9vbGJhckJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U2luZ2xlUGFnZU1vZGVCdXR0b246IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1ZlcnRpY2FsU2Nyb2xsQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dIb3Jpem9udGFsU2Nyb2xsQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dXcmFwcGVkU2Nyb2xsQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dJbmZpbml0ZVNjcm9sbEJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93Qm9va01vZGVCdXR0b246IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNob3dSb3RhdGVCdXR0b24odmlzaWJpbGl0eTogUmVzcG9uc2l2ZVZpc2liaWxpdHkpIHtcbiAgICB0aGlzLnNob3dSb3RhdGVDd0J1dHRvbiA9IHZpc2liaWxpdHk7XG4gICAgdGhpcy5zaG93Um90YXRlQ2N3QnV0dG9uID0gdmlzaWJpbGl0eTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93Um90YXRlQ3dCdXR0b246IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1JvdGF0ZUNjd0J1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIHByaXZhdGUgX2hhbmRUb29sID0gIWlzSU9TKCk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoYW5kVG9vbChoYW5kVG9vbDogYm9vbGVhbikge1xuICAgIGlmIChpc0lPUygpICYmIGhhbmRUb29sKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJPbiBpT1MsIHRoZSBoYW5kdG9vbCBkb2Vzbid0IHdvcmsgcmVsaWFibHkuIFBsdXMsIHlvdSBkb24ndCBuZWVkIGl0IGJlY2F1c2UgdG91Y2ggZ2VzdHVyZXMgYWxsb3cgeW91IHRvIGRpc3Rpbmd1aXNoIGVhc2lseSBiZXR3ZWVuIHN3aXBpbmcgYW5kIHNlbGVjdGluZyB0ZXh0LiBUaGVyZWZvcmUsIHRoZSBsaWJyYXJ5IGlnbm9yZXMgeW91ciBzZXR0aW5nLlwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faGFuZFRvb2wgPSBoYW5kVG9vbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFuZFRvb2woKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRUb29sO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBoYW5kVG9vbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0hhbmRUb29sQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U3ByZWFkQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dQcm9wZXJ0aWVzQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dCb3JkZXJzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc3ByZWFkOiBTcHJlYWRUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2hvd1Njcm9sbGluZ0J1dHRvbnMoc2hvdzogUmVzcG9uc2l2ZVZpc2liaWxpdHkpIHtcbiAgICB0aGlzLnNob3dWZXJ0aWNhbFNjcm9sbEJ1dHRvbiA9IHNob3c7XG4gICAgdGhpcy5zaG93SG9yaXpvbnRhbFNjcm9sbEJ1dHRvbiA9IHNob3c7XG4gICAgdGhpcy5zaG93V3JhcHBlZFNjcm9sbEJ1dHRvbiA9IHNob3c7XG4gICAgdGhpcy5zaG93SW5maW5pdGVTY3JvbGxCdXR0b24gPSBzaG93O1xuICAgIHRoaXMuc2hvd0Jvb2tNb2RlQnV0dG9uID0gc2hvdztcbiAgICB0aGlzLnNob3dTaW5nbGVQYWdlTW9kZUJ1dHRvbiA9IHNob3c7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgcHVibGljIHNwcmVhZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8J29mZicgfCAnZXZlbicgfCAnb2RkJz4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHRodW1ibmFpbERyYXduID0gbmV3IEV2ZW50RW1pdHRlcjxQZGZUaHVtYm5haWxEcmF3bkV2ZW50PigpO1xuXG4gIHByaXZhdGUgX3BhZ2U6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgZ2V0IHBhZ2UoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcGFnZShuZXdQYWdlTnVtYmVyOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobmV3UGFnZU51bWJlcikge1xuICAgICAgLy8gc2lsZW50bHkgY29wZSB3aXRoIHN0cmluZ3NcbiAgICAgIHRoaXMuX3BhZ2UgPSBOdW1iZXIobmV3UGFnZU51bWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BhZ2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHBhZ2VMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcGFnZUxhYmVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBwYWdlc0xvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZXNMb2FkZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHBhZ2VSZW5kZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VSZW5kZXJFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHBhZ2VSZW5kZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZVJlbmRlcmVkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBwZGZEb3dubG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxQZGZEb3dubG9hZGVkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBwZGZMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFBkZkxvYWRlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcGRmTG9hZGluZ1N0YXJ0cyA9IG5ldyBFdmVudEVtaXR0ZXI8UGRmTG9hZGluZ1N0YXJ0c0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcGRmTG9hZGluZ0ZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KCk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRleHRMYXllcjogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHRleHRMYXllclJlbmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxUZXh0TGF5ZXJSZW5kZXJlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgYW5ub3RhdGlvbkVkaXRvck1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxBbm5vdGF0aW9uRWRpdG9yRWRpdG9yTW9kZUNoYW5nZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHVwZGF0ZUZpbmRNYXRjaGVzQ291bnQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbmRSZXN1bHRNYXRjaGVzQ291bnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB1cGRhdGVGaW5kU3RhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbmRTdGF0ZT4oKTtcblxuICAvKiogTGVnYWwgdmFsdWVzOiB1bmRlZmluZWQsICdhdXRvJywgJ3BhZ2UtYWN0dWFsJywgJ3BhZ2UtZml0JywgJ3BhZ2Utd2lkdGgnLCBvciAnNTAnIChvciBhbnkgb3RoZXIgcGVyY2VudGFnZSkgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHpvb206IFpvb21UeXBlID0gdW5kZWZpbmVkO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgem9vbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Wm9vbVR5cGU+KCk7XG5cbiAgcHJpdmF0ZSBfem9vbUxldmVscyA9IFsnYXV0bycsICdwYWdlLWFjdHVhbCcsICdwYWdlLWZpdCcsICdwYWdlLXdpZHRoJywgMC41LCAxLCAxLjI1LCAxLjUsIDIsIDMsIDRdO1xuXG4gIHB1YmxpYyBnZXQgem9vbUxldmVscygpIHtcbiAgICBpZiAodGhpcy5tYXhab29tICYmIHRoaXMubWF4Wm9vbSA9PT0gdGhpcy5taW5ab29tKSB7XG4gICAgICByZXR1cm4gW3RoaXMubWF4Wm9vbV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl96b29tTGV2ZWxzO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6b29tTGV2ZWxzKHZhbHVlKSB7XG4gICAgdGhpcy5fem9vbUxldmVscyA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1heFpvb20gPSAxMDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbWluWm9vbSA9IDAuMTtcblxuICAvKiogVGhpcyBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgVUkgZWxlbWVudHMgc28geW91IGNhbiB1c2UgdGhlbSBvbiBzbWFsbCBtb2JpbGUgZGV2aWNlcy5cbiAgICogVGhpcyBhdHRyaWJ1dGUgaXMgYSBzdHJpbmcgd2l0aCBhIHBlcmNlbnQgY2hhcmFjdGVyIGF0IHRoZSBlbmQgKGUuZy4gXCIxNTAlXCIpLlxuICAgKi9cbiAgcHVibGljIF9tb2JpbGVGcmllbmRseVpvb206IHN0cmluZyA9ICcxMDAlJztcblxuICBwdWJsaWMgbW9iaWxlRnJpZW5kbHlab29tU2NhbGUgPSAxO1xuXG4gIHB1YmxpYyB0b29sYmFyTWFyZ2luVG9wID0gJzBweCc7XG5cbiAgcHVibGljIHRvb2xiYXJXaWR0aCA9ICcxMDAlJztcblxuICBwcml2YXRlIHRvb2xiYXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBvblRvb2xiYXJMb2FkZWQodG9vbGJhckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy50b29sYmFyID0gdG9vbGJhckVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgc2Vjb25kYXJ5VG9vbGJhclRvcDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzaWRlYmFyUG9zaXRpb25Ub3A6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvLyBkaXJ0eSBJRTExIGhhY2sgLSB0ZW1wb3Jhcnkgc29sdXRpb25cbiAgcHVibGljIGZpbmRiYXJUb3A6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvLyBkaXJ0eSBJRTExIGhhY2sgLSB0ZW1wb3Jhcnkgc29sdXRpb25cbiAgcHVibGljIGZpbmRiYXJMZWZ0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXphdGlvblByb21pc2U6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNoZWNrUm9vdEVsZW1lbnRUaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgZGVzdHJveUluaXRpYWxpemF0aW9uID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCBtb2JpbGVGcmllbmRseVpvb20oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vYmlsZUZyaWVuZGx5Wm9vbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGRmSnNWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldFZlcnNpb25TdWZmaXgocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFqb3JNaW5vclBkZkpzVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxWZXJzaW9uID0gdGhpcy5wZGZKc1ZlcnNpb247XG4gICAgY29uc3QgcG9zID0gZnVsbFZlcnNpb24ubGFzdEluZGV4T2YoJy4nKTtcbiAgICByZXR1cm4gZnVsbFZlcnNpb24uc3Vic3RyaW5nKDAsIHBvcykucmVwbGFjZSgnLicsICctJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVuYWJsZVNpZ25hdHVyZUVkaXRvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMuZW5hYmxlU2lnbmF0dXJlRWRpdG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBlbmFibGVQYWdlUmVvcmRlcmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGRmRGVmYXVsdE9wdGlvbnMuZW5hYmxlUGFnZVJlb3JkZXJpbmc7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBhdHRyaWJ1dGVzIGFsbG93cyB5b3UgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFVJIGVsZW1lbnRzIHNvIHlvdSBjYW4gdXNlIHRoZW0gb24gc21hbGwgbW9iaWxlIGRldmljZXMuXG4gICAqIFRoaXMgYXR0cmlidXRlIGlzIGEgc3RyaW5nIHdpdGggYSBwZXJjZW50IGNoYXJhY3RlciBhdCB0aGUgZW5kIChlLmcuIFwiMTUwJVwiKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbW9iaWxlRnJpZW5kbHlab29tKHpvb206IHN0cmluZykge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzIC0gdGhlIHR5cGUgY29udmVyc2lvbiBpcyBpbnRlbmRlZFxuICAgIGlmICh6b29tID09ICd0cnVlJykge1xuICAgICAgem9vbSA9ICcxNTAlJztcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzIC0gdGhlIHR5cGUgY29udmVyc2lvbiBpcyBpbnRlbmRlZFxuICAgIH0gZWxzZSBpZiAoem9vbSA9PSAnZmFsc2UnIHx8IHpvb20gPT09IHVuZGVmaW5lZCB8fCB6b29tID09PSBudWxsKSB7XG4gICAgICB6b29tID0gJzEwMCUnO1xuICAgIH1cbiAgICB0aGlzLl9tb2JpbGVGcmllbmRseVpvb20gPSB6b29tO1xuICAgIGxldCBmYWN0b3IgPSAxO1xuICAgIGlmICghU3RyaW5nKHpvb20pLmluY2x1ZGVzKCclJykpIHtcbiAgICAgIHpvb20gPSAxMDAgKiBOdW1iZXIoem9vbSkgKyAnJSc7XG4gICAgfVxuICAgIGZhY3RvciA9IE51bWJlcigoem9vbSB8fCAnMTAwJykucmVwbGFjZSgnJScsICcnKSkgLyAxMDA7XG4gICAgdGhpcy5tb2JpbGVGcmllbmRseVpvb21TY2FsZSA9IGZhY3RvcjtcbiAgICB0aGlzLnRvb2xiYXJXaWR0aCA9ICgxMDAgLyBmYWN0b3IpLnRvU3RyaW5nKCkgKyAnJSc7XG4gICAgdGhpcy50b29sYmFyTWFyZ2luVG9wID0gKGZhY3RvciAtIDEpICogMTYgKyAncHgnO1xuXG4gICAgdGhpcy5jYWxjVmlld2VyUG9zaXRpb25Ub3AoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXJ2ZXJTaWRlUmVuZGVyaW5nID0gdHJ1ZTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICBwdWJsaWMgY2FsY1ZpZXdlclBvc2l0aW9uVG9wKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50b29sYmFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2lkZWJhclBvc2l0aW9uVG9wID0gJzAnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b3AgPSB0aGlzLnRvb2xiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy52aWV3ZXJQb3NpdGlvblRvcDtcbiAgICBpZiAodG9wIDwgMzMpIHtcbiAgICAgIHRoaXMudmlld2VyUG9zaXRpb25Ub3AgPSAnMzNweCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlld2VyUG9zaXRpb25Ub3AgPSB0b3AgKyAncHgnO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgIT09IHRoaXMudmlld2VyUG9zaXRpb25Ub3ApIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvciA9IHRvcCAvIDMzO1xuXG4gICAgaWYgKHRoaXMucHJpbWFyeU1lbnVWaXNpYmxlKSB7XG4gICAgICB0aGlzLnNpZGViYXJQb3NpdGlvblRvcCA9ICgzMyArIDMzICogKGZhY3RvciAtIDEpKS50b1N0cmluZygpICsgJ3B4JztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaWRlYmFyUG9zaXRpb25Ub3AgPSAnMCc7XG4gICAgfVxuICAgIHRoaXMuc2Vjb25kYXJ5VG9vbGJhclRvcCA9ICgzMyArIDM4ICogKGZhY3RvciAtIDEpKS50b1N0cmluZygpICsgJ3B4JztcbiAgICB0aGlzLmZpbmRiYXJUb3AgPSAoMzMgKyAzOCAqIChmYWN0b3IgLSAxKSkudG9TdHJpbmcoKSArICdweCc7XG5cbiAgICBjb25zdCBmaW5kQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW1hcnlWaWV3RmluZCcpO1xuICAgIGlmIChmaW5kQnV0dG9uKSB7XG4gICAgICBjb25zdCBjb250YWluZXJQb3NpdGlvbkxlZnQgPSB0aGlzLnRvb2xiYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICAgIGNvbnN0IGZpbmRCdXR0b25Qb3NpdGlvbiA9IGZpbmRCdXR0b24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBsZWZ0ID0gTWF0aC5tYXgoMCwgZmluZEJ1dHRvblBvc2l0aW9uLmxlZnQgLSBjb250YWluZXJQb3NpdGlvbkxlZnQpO1xuICAgICAgdGhpcy5maW5kYmFyTGVmdCA9IGxlZnQgKyAncHgnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zaG93U2lkZWJhckJ1dHRvbikge1xuICAgICAgdGhpcy5maW5kYmFyTGVmdCA9ICgzNCArIDMyICogZmFjdG9yKS50b1N0cmluZygpICsgJ3B4JztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maW5kYmFyTGVmdCA9ICcwJztcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25TZXJ2aWNlOiBQREZOb3RpZmljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtTG9jYXRpb246IFBsYXRmb3JtTG9jYXRpb24sXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIHNlcnZpY2U6IE5neEV4dGVuZGVkUGRmVmlld2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZGZTY3JpcHRMb2FkZXJTZXJ2aWNlOiBQREZTY3JpcHRMb2FkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkga2V5Ym9hcmRNYW5hZ2VyOiBOZ3hLZXlib2FyZE1hbmFnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3NwUG9saWN5U2VydmljZTogUGRmQ3NwUG9saWN5U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICApIHtcbiAgICB0aGlzLmJhc2VIcmVmID0gdGhpcy5wbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpO1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLnNlcnZlclNpZGVSZW5kZXJpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudG9vbGJhcldpZHRoID0gU3RyaW5nKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVwb3J0U291cmNlQ2hhbmdlcyhjaGFuZ2U6IHsgc291cmNlZmlsZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLl9zcmMgPSBjaGFuZ2Uuc291cmNlZmlsZTtcbiAgICB0aGlzLnNyY0NoYW5nZVRyaWdnZXJlZEJ5VXNlciA9IHRydWU7XG4gICAgdGhpcy5zcmNDaGFuZ2UuZW1pdChjaGFuZ2Uuc291cmNlZmlsZSk7XG4gICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbiA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbjtcbiAgICBpZiAodGhpcy5maWxlbmFtZUZvckRvd25sb2FkKSB7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWcuZmlsZW5hbWVGb3JEb3dubG9hZCA9IHRoaXMuZmlsZW5hbWVGb3JEb3dubG9hZDtcbiAgICB9IGVsc2Uge1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnLmZpbGVuYW1lRm9yRG93bmxvYWQgPSB0aGlzLmd1ZXNzRmlsZW5hbWVGcm9tVXJsKHRoaXMuX3NyYyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaGlkZVRvb2xiYXJJZkl0SXNFbXB0eSgpO1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gdGhpcy5pbml0aWFsaXplO1xuICAgICAgICB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JSb290RWxlbWVudCgpO1xuXG4gICAgICBpZiAodGhpcy5kZXN0cm95SW5pdGlhbGl6YXRpb24pIHJldHVybjtcblxuICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgdGhpcy5hZGRUcmFuc2xhdGlvbnNVbmxlc3NQcm92aWRlZEJ5VGhlVXNlcigpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9sZENvbXBvbmVudElzR29uZSgpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95SW5pdGlhbGl6YXRpb24pIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuZW5zdXJlUGRmSnNIYXNCZWVuTG9hZGVkKHRoaXMudXNlSW5saW5lU2NyaXB0cywgdGhpcy5mb3JjZVVzaW5nTGVnYWN5RVM1LCB0aGlzLmZvcmNlRnVsbFJlbG9hZE9mSmF2YVNjcmlwdENvZGUpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95SW5pdGlhbGl6YXRpb24pIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5mb3JtU3VwcG9ydCkge1xuICAgICAgICAgIHRoaXMuZm9ybVN1cHBvcnQucmVnaXN0ZXJGb3JtU3VwcG9ydFdpdGhQZGZqcyh0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb24pO1xuICAgICAgICAgIHRoaXMua2V5Ym9hcmRNYW5hZ2VyLnJlZ2lzdGVyS2V5Ym9hcmRMaXN0ZW5lcih0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb24pO1xuICAgICAgICAgIHRoaXMuZm9ybVN1cHBvcnQubmdab25lID0gdGhpcy5uZ1pvbmU7XG4gICAgICAgICAgdGhpcy5mb3JtU3VwcG9ydC5jZHIgPSB0aGlzLmNkcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb24uY3NwUG9saWN5U2VydmljZSA9IHRoaXMuY3NwUG9saWN5U2VydmljZTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kb0luaXRQREZWaWV3ZXIoKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0luaXRpYWxpemF0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yUm9vdEVsZW1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGNoZWNrUm9vdEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3lJbml0aWFsaXphdGlvbikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvbXBvbmVudCBkZXN0cm95ZWQnKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucm9vdD8ubmF0aXZlRWxlbWVudD8ub2Zmc2V0UGFyZW50KSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hlY2tSb290RWxlbWVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrUm9vdEVsZW1lbnQsIDUwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNoZWNrUm9vdEVsZW1lbnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT2xkQ29tcG9uZW50SXNHb25lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zZXJ2aWNlLm5neEV4dGVuZGVkUGRmVmlld2VySW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzaWduVGFiaW5kZXhlcygpIHtcbiAgICBpZiAodGhpcy5zdGFydFRhYmluZGV4KSB7XG4gICAgICBjb25zdCByID0gdGhpcy5yb290Lm5hdGl2ZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgci5jbGFzc0xpc3QuYWRkKCdvZmZzY3JlZW4nKTtcbiAgICAgIHRoaXMuc2hvd0VsZW1lbnRzUmVjdXJzaXZlbHkocik7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHIpO1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmNvbGxlY3RFbGVtZW50UG9zaXRpb25zKHIsIHRoaXMucm9vdC5uYXRpdmVFbGVtZW50LCBbXSk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHIpO1xuICAgICAgY29uc3QgdG9wUmlnaHRHcmVhdGVyVGhhbkJvdHRvbUxlZnRDb21wYXJhdG9yID0gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEueSAtIGIueSA+IDE1KSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIueSAtIGEueSA+IDE1KSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhLnggLSBiLng7XG4gICAgICB9O1xuICAgICAgY29uc3Qgc29ydGVkID0gWy4uLmVsZW1lbnRzXS5zb3J0KHRvcFJpZ2h0R3JlYXRlclRoYW5Cb3R0b21MZWZ0Q29tcGFyYXRvcik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBzb3J0ZWRbaV0uZWxlbWVudC50YWJJbmRleCA9IHRoaXMuc3RhcnRUYWJpbmRleCArIGk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93RWxlbWVudHNSZWN1cnNpdmVseShyb290OiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2xhc3Nlc1RvUmVtb3ZlID0gW1xuICAgICAgJ2hpZGRlbicsXG4gICAgICAnaW52aXNpYmxlJyxcbiAgICAgICdoaWRkZW5YWExWaWV3JyxcbiAgICAgICdoaWRkZW5YTFZpZXcnLFxuICAgICAgJ2hpZGRlbkxhcmdlVmlldycsXG4gICAgICAnaGlkZGVuTWVkaXVtVmlldycsXG4gICAgICAnaGlkZGVuU21hbGxWaWV3JyxcbiAgICAgICdoaWRkZW5UaW55VmlldycsXG4gICAgICAndmlzaWJsZVhYTFZpZXcnLFxuICAgICAgJ3Zpc2libGVYTFZpZXcnLFxuICAgICAgJ3Zpc2libGVMYXJnZVZpZXcnLFxuICAgICAgJ3Zpc2libGVNZWRpdW1WaWV3JyxcbiAgICAgICd2aXNpYmxlU21hbGxWaWV3JyxcbiAgICAgICd2aXNpYmxlVGlueVZpZXcnLFxuICAgIF07XG5cbiAgICByb290LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlc1RvUmVtb3ZlKTtcblxuICAgIGlmIChyb290IGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQgfHwgcm9vdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50IHx8IHJvb3QgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IHJvb3QgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocm9vdC5jaGlsZEVsZW1lbnRDb3VudCA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5jaGlsZEVsZW1lbnRDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSByb290LmNoaWxkcmVuLml0ZW0oaSk7XG4gICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgdGhpcy5zaG93RWxlbWVudHNSZWN1cnNpdmVseShjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdEVsZW1lbnRQb3NpdGlvbnMoY29weTogRWxlbWVudCwgb3JpZ2luYWw6IEVsZW1lbnQsIGVsZW1lbnRzOiBBcnJheTxFbGVtZW50QW5kUG9zaXRpb24+KTogQXJyYXk8RWxlbWVudEFuZFBvc2l0aW9uPiB7XG4gICAgaWYgKGNvcHkgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCB8fCBjb3B5IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgfHwgY29weSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgY29weSBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG4gICAgICBjb25zdCByZWN0ID0gY29weS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRBbmRQb3MgPSB7XG4gICAgICAgIGVsZW1lbnQ6IG9yaWdpbmFsLFxuICAgICAgICB4OiBNYXRoLnJvdW5kKHJlY3QubGVmdCksXG4gICAgICAgIHk6IE1hdGgucm91bmQocmVjdC50b3ApLFxuICAgICAgfSBhcyBFbGVtZW50QW5kUG9zaXRpb247XG4gICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnRBbmRQb3MpO1xuICAgIH0gZWxzZSBpZiAoY29weS5jaGlsZEVsZW1lbnRDb3VudCA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29weS5jaGlsZEVsZW1lbnRDb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBjb3B5LmNoaWxkcmVuLml0ZW0oaSk7XG4gICAgICAgIGNvbnN0IG8gPSBvcmlnaW5hbC5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICBpZiAoYyAmJiBvKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSB0aGlzLmNvbGxlY3RFbGVtZW50UG9zaXRpb25zKGMsIG8sIGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFmdGVyUHJpbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICB0aGlzLmFmdGVyUHJpbnQuZW1pdCgpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYmVmb3JlUHJpbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICB0aGlzLmJlZm9yZVByaW50LmVtaXQoKTtcbiAgfTtcblxuICBwcml2YXRlIGd1ZXNzRmlsZW5hbWVGcm9tVXJsKHNyYzogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHNyYyAmJiB0eXBlb2Ygc3JjID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3Qgc2xhc2ggPSBzcmMubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgIGlmIChzbGFzaCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHNyYy5zdWJzdHJpbmcoc2xhc2ggKyAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzcmM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGRvSW5pdFBERlZpZXdlcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlcnZpY2Uubmd4RXh0ZW5kZWRQZGZWaWV3ZXJJbml0aWFsaXplZCkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnF1b3RlbWFya1xuICAgICAgY29uc29sZS5lcnJvcihcIllvdSdyZSB0cnlpbmcgdG8gb3BlbiB0d28gaW5zdGFuY2VzIG9mIHRoZSBQREYgdmlld2VyLiBNb3N0IGxpa2VseSwgdGhpcyB3aWxsIHJlc3VsdCBpbiBlcnJvcnMuXCIpO1xuICAgIH1cbiAgICB0aGlzLm92ZXJyaWRlRGVmYXVsdFNldHRpbmdzKCk7XG4gICAgY29uc3Qgb25Mb2FkZWQgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXZlbnRidXMgaXMgbnVsbD8gTGV0J3MgdHJ5IGFnYWluLlwiKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgb25Mb2FkZWQoKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdzb3VyY2VjaGFuZ2VkJywgdGhpcy5yZXBvcnRTb3VyY2VDaGFuZ2VzLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ2FmdGVycHJpbnQnLCB0aGlzLmFmdGVyUHJpbnRMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbignYmVmb3JlcHJpbnQnLCB0aGlzLmJlZm9yZVByaW50TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmxvY2FsaXphdGlvbkluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2Uuc2h1dHRpbmdEb3duKSB7XG4gICAgICAgICAgLy8gaHVycmllZCB1c2VycyBzb21ldGltZXMgcmVsb2FkIHRoZSBQREYgYmVmb3JlIGl0IGhhcyBmaW5pc2hlZCBpbml0aWFsaXppbmdcbiAgICAgICAgICB0aGlzLmNhbGNWaWV3ZXJQb3NpdGlvblRvcCgpO1xuICAgICAgICAgIHRoaXMuYWZ0ZXJMaWJyYXJ5SW5pdCgpO1xuICAgICAgICAgIHRoaXMub3BlblBERigpO1xuICAgICAgICAgIHRoaXMuYXNzaWduVGFiaW5kZXhlcygpO1xuICAgICAgICAgIGlmICh0aGlzLnJlcGxhY2VCcm93c2VyUHJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9SZXBsYWNlQnJvd3NlclByaW50KHRoaXMucmVwbGFjZUJyb3dzZXJQcmludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJ2aWV3ZXJpbml0aWFsaXplZCcsIG9uTG9hZGVkLCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICB0aGlzLmFjdGl2YXRlVGV4dGxheWVySWZOZWNlc3NhcnkobnVsbCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLnNodXR0aW5nRG93bikge1xuICAgICAgICAvLyBodXJyaWVkIHVzZXJzIHNvbWV0aW1lcyByZWxvYWQgdGhlIFBERiBiZWZvcmUgaXQgaGFzIGZpbmlzaGVkIGluaXRpYWxpemluZ1xuICAgICAgICAvLyBUaGlzIGluaXRpYWxpemVzIHRoZSB3ZWJ2aWV3ZXIsIHRoZSBmaWxlIG1heSBiZSBwYXNzZWQgaW4gdG8gaXQgdG8gaW5pdGlhbGl6ZSB0aGUgdmlld2VyIHdpdGggYSBwZGYgZGlyZWN0bHlcbiAgICAgICAgdGhpcy5pbml0UmVzaXplT2JzZXJ2ZXIoKTtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICB0aGlzLmhpZGVUb29sYmFySWZJdElzRW1wdHkoKTtcbiAgICAgICAgdGhpcy5kdW1teUNvbXBvbmVudHMuYWRkTWlzc2luZ1N0YW5kYXJkV2lkZ2V0cygpO1xuICAgICAgICBpZiAodGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9uczogSVBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucyA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS5QREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2Uud2ViVmlld2VyTG9hZCh0aGlzLmNzcFBvbGljeVNlcnZpY2UpO1xuXG4gICAgICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmFwcENvbmZpZy5kZWZhdWx0VXJsID0gJyc7IC8vIElFIGJ1Z2ZpeFxuICAgICAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM6IElQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMgPSB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zO1xuXG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucy5zZXQoJ2VuYWJsZURyYWdBbmREcm9wJywgdGhpcy5lbmFibGVEcmFnQW5kRHJvcCk7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucy5zZXQoJ2xvY2FsZVByb3BlcnRpZXMnLCB7IGxhbmc6IHRoaXMubGFuZ3VhZ2UgfSk7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucy5zZXQoJ2ltYWdlUmVzb3VyY2VzUGF0aCcsIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoKTtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zLnNldCgnbWluWm9vbScsIHRoaXMubWluWm9vbSk7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucy5zZXQoJ21heFpvb20nLCB0aGlzLm1heFpvb20pO1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMuc2V0KCdwYWdlVmlld01vZGUnLCB0aGlzLnBhZ2VWaWV3TW9kZSk7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucy5zZXQoJ3ZlcmJvc2l0eScsIHRoaXMubG9nTGV2ZWwpO1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMuc2V0KCdwZGZCYWNrZ3JvdW5kQ29sb3InLCB0aGlzLnBkZkJhY2tncm91bmRDb2xvcik7XG4gICAgICAgIGlmICh0aGlzLnRoZW1lID09PSAnZGFyaycpIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMuc2V0KCd2aWV3ZXJDc3NUaGVtZScsIDIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGhlbWUgPT09ICdsaWdodCcpIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMuc2V0KCd2aWV3ZXJDc3NUaGVtZScsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uaXNWaWV3ZXJFbWJlZGRlZCA9IHRydWU7XG4gICAgICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wcmludEtleURvd25MaXN0ZW5lcikge1xuICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgUERGVmlld2VyQXBwbGljYXRpb24ucHJpbnRLZXlEb3duTGlzdGVuZXIsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5Jyk7XG4gICAgICAgIGlmIChib2R5WzBdKSB7XG4gICAgICAgICAgY29uc3QgdG9wTGV2ZWxFbGVtZW50cyA9IGJvZHlbMF0uY2hpbGRyZW47XG4gICAgICAgICAgZm9yIChsZXQgaSA9IHRvcExldmVsRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0b3BMZXZlbEVsZW1lbnRzLml0ZW0oaSk7XG4gICAgICAgICAgICBpZiAoZSAmJiBlLmlkID09PSAncHJpbnRDb250YWluZXInKSB7XG4gICAgICAgICAgICAgIGJvZHlbMF0ucmVtb3ZlQ2hpbGQoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW50Q29udGFpbmVyJyk7XG4gICAgICAgIGlmIChwYykge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQocGMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRyYW5zbGF0aW9uc1VubGVzc1Byb3ZpZGVkQnlUaGVVc2VyKCkge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICBsaW5rLnJlbCA9ICdyZXNvdXJjZSc7XG4gICAgbGluay50eXBlID0gJ2FwcGxpY2F0aW9uL2wxMG4nO1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubG9jYWxlRm9sZGVyUGF0aCArICcvbG9jYWxlLmpzb24nO1xuXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ29yaWdpbicsICduZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlcicpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGxpbmspO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlVG9vbGJhcklmSXRJc0VtcHR5KCkge1xuICAgIHRoaXMucHJpbWFyeU1lbnVWaXNpYmxlID0gdGhpcy5zaG93VG9vbGJhcjtcbiAgICBpZiAoIXRoaXMuc2hvd1NlY29uZGFyeVRvb2xiYXJCdXR0b24gfHwgdGhpcy5zZXJ2aWNlLnNlY29uZGFyeU1lbnVJc0VtcHR5KSB7XG4gICAgICBpZiAoIXRoaXMuaXNQcmltYXJ5TWVudVZpc2libGUoKSkge1xuICAgICAgICB0aGlzLnByaW1hcnlNZW51VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBOb3RpZmllcyBldmVyeSB3aWRnZXQgdGhhdCBpbXBsZW1lbnRzIG9uTGlicmFyeUluaXQoKSB0aGF0IHRoZSBQREYgdmlld2VyIG9iamVjdHMgYXJlIGF2YWlsYWJsZSAqL1xuICBwcml2YXRlIGFmdGVyTGlicmFyeUluaXQoKSB7XG4gICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIGNvbG9yLXNjaGVtZSB2YWx1ZSBiZWZvcmUgUERGLmpzIG1pZ2h0IGNoYW5nZSBpdFxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3JpZ2luYWxDb2xvclNjaGVtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgZG9jU3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG4gICAgICB0aGlzLm9yaWdpbmFsQ29sb3JTY2hlbWUgPSBkb2NTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdjb2xvci1zY2hlbWUnKSB8fCAnJztcbiAgICB9XG4gICAgXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLm9uUERGSlNJbml0U2lnbmFsLnNldCh0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb24pKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNwcmVhZENoYW5nZShuZXdTcHJlYWQ6ICdvZmYnIHwgJ2V2ZW4nIHwgJ29kZCcpOiB2b2lkIHtcbiAgICB0aGlzLnNwcmVhZENoYW5nZS5lbWl0KG5ld1NwcmVhZCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHRvZ2dsZVZpc2liaWxpdHkgPSAoZWxlbWVudElkOiBzdHJpbmcsIGNzc0NsYXNzID0gJ2ludmlzaWJsZScpID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKSBhcyBIVE1MRWxlbWVudDtcbiAgICBlbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKGNzc0NsYXNzKTtcbiAgfTtcblxuICBwcml2YXRlIGFjdGl2YXRlVGV4dGxheWVySWZOZWNlc3Nhcnkob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc2V0VGV4dExheWVyTW9kZSA9IChtb2RlOiBudW1iZXIpID0+IHtcbiAgICAgIG9wdGlvbnM/LnNldCgndGV4dExheWVyTW9kZScsIG1vZGUpO1xuICAgICAgdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlcj8uc2V0VGV4dExheWVyTW9kZShtb2RlKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudGV4dExheWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghdGhpcy5oYW5kVG9vbCkge1xuICAgICAgICBzZXRUZXh0TGF5ZXJNb2RlKHBkZkRlZmF1bHRPcHRpb25zLnRleHRMYXllck1vZGUpO1xuICAgICAgICB0aGlzLnRleHRMYXllciA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnNob3dGaW5kQnV0dG9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnNob3dGaW5kQnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlVmlzaWJpbGl0eSgndmlld0ZpbmQnKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlVmlzaWJpbGl0eSgnZmluZGJhcicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUZXh0TGF5ZXJNb2RlKHRoaXMuc2hvd0hhbmRUb29sQnV0dG9uID8gcGRmRGVmYXVsdE9wdGlvbnMudGV4dExheWVyTW9kZSA6IDApO1xuXG4gICAgICAgIGlmICghdGhpcy5zaG93SGFuZFRvb2xCdXR0b24pIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93RmluZEJ1dHRvbiB8fCB0aGlzLnNob3dGaW5kQnV0dG9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93RmluZEJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dMZXZlbCA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgICdIaWRpbmcgdGhlIFwiZmluZFwiIGJ1dHRvbiBiZWNhdXNlIHRoZSB0ZXh0IGxheWVyIG9mIHRoZSBQREYgZmlsZSBpcyBub3QgcmVuZGVyZWQuIFVzZSBbdGV4dExheWVyXT1cInRydWVcIiB0byBlbmFibGUgdGhlIGZpbmQgYnV0dG9uLicsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLnNob3dIYW5kVG9vbEJ1dHRvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPj0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAnSGlkaW5nIHRoZSBcImhhbmQgdG9vbCAvIHNlbGVjdGlvbiBtb2RlXCIgbWVudSBiZWNhdXNlIHRoZSB0ZXh0IGxheWVyIG9mIHRoZSBQREYgZmlsZSBpcyBub3QgcmVuZGVyZWQuIFVzZSBbdGV4dExheWVyXT1cInRydWVcIiB0byBlbmFibGUgdGhlIHRoZSBtZW51IGl0ZW1zLicsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd0hhbmRUb29sQnV0dG9uID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRleHRMYXllck1vZGUocGRmRGVmYXVsdE9wdGlvbnMudGV4dExheWVyTW9kZSk7XG4gICAgICB0aGlzLnRleHRMYXllciA9IHRydWU7XG4gICAgICBpZiAodGhpcy5zaG93RmluZEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2hvd0ZpbmRCdXR0b24gPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZVZpc2liaWxpdHkoJ3ZpZXdGaW5kJyk7XG4gICAgICAgICAgdGhpcy50b2dnbGVWaXNpYmlsaXR5KCdmaW5kYmFyJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb3ZlcnJpZGVEZWZhdWx0U2V0dGluZ3MoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47IC8vIHNlcnZlciBzaWRlIHJlbmRlcmluZ1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucztcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cbiAgICBjb25zdCBvcHRpb25zVG9JZ25vcmUgPSBbXG4gICAgICAnbmVlZHNFUzUnLFxuICAgICAgJ3JhbmdlQ2h1bmtTaXplJyxcbiAgICAgICdfaW50ZXJuYWxGaWxlbmFtZVN1ZmZpeCcsXG4gICAgICAnYXNzZXRzRm9sZGVyJyxcbiAgICAgICdkb3VibGVUYXBab29tRmFjdG9yJyxcbiAgICAgICdkb3VibGVUYXBab29tc0luSGFuZE1vZGUnLFxuICAgICAgJ2RvdWJsZVRhcFpvb21zSW5UZXh0U2VsZWN0aW9uTW9kZScsXG4gICAgICAnZG91YmxlVGFwUmVzZXRzWm9vbU9uU2Vjb25kRG91YmxlVGFwJyxcbiAgICBdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHBkZkRlZmF1bHRPcHRpb25zKSB7XG4gICAgICBpZiAoIW9wdGlvbnNUb0lnbm9yZS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHBkZkRlZmF1bHRPcHRpb25zW2tleV07XG4gICAgICAgIGlmIChrZXkgIT09ICdmaW5kQ29udHJvbGxlcicgJiYgdHlwZW9mIG9wdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9wdGlvbnMuc2V0KGtleSwgb3B0aW9uKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMuc2V0KGtleSwgcGRmRGVmYXVsdE9wdGlvbnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgb3B0aW9ucy5zZXQoJ2Rpc2FibGVQcmVmZXJlbmNlcycsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuc2V0Wm9vbSgpO1xuXG4gICAgdGhpcy5rZXlib2FyZE1hbmFnZXIuaWdub3JlS2V5Ym9hcmQgPSB0aGlzLmlnbm9yZUtleWJvYXJkO1xuICAgIHRoaXMua2V5Ym9hcmRNYW5hZ2VyLmlnbm9yZUtleXMgPSB0aGlzLmlnbm9yZUtleXM7XG4gICAgdGhpcy5rZXlib2FyZE1hbmFnZXIuYWNjZXB0S2V5cyA9IHRoaXMuYWNjZXB0S2V5cztcbiAgICB0aGlzLmFjdGl2YXRlVGV4dGxheWVySWZOZWNlc3Nhcnkob3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5zY3JvbGxNb2RlIHx8IHRoaXMuc2Nyb2xsTW9kZSA9PT0gU2Nyb2xsTW9kZVR5cGUudmVydGljYWwpIHtcbiAgICAgIG9wdGlvbnMuc2V0KCdzY3JvbGxNb2RlT25Mb2FkJywgdGhpcy5zY3JvbGxNb2RlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWRlYmFyVmlzaWJsZSA9IHRoaXMuc2lkZWJhclZpc2libGU7XG4gICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbiA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbjtcblxuICAgIGlmIChzaWRlYmFyVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zaWRlYmFyVmlld09uTG9hZCA9IHNpZGViYXJWaXNpYmxlID8gMSA6IDA7XG4gICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnKSB7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmFwcENvbmZpZy5zaWRlYmFyVmlld09uTG9hZCA9IHNpZGViYXJWaXNpYmxlID8gdGhpcy5hY3RpdmVTaWRlYmFyVmlldyA6IFBkZlNpZGViYXJWaWV3Lk5PTkU7XG4gICAgICB9XG4gICAgICBvcHRpb25zLnNldCgnc2lkZWJhclZpZXdPbkxvYWQnLCB0aGlzLnNpZGViYXJWaXNpYmxlID8gdGhpcy5hY3RpdmVTaWRlYmFyVmlldyA6IDApO1xuICAgIH1cbiAgICBpZiAodGhpcy5zcHJlYWQgPT09ICdldmVuJykge1xuICAgICAgb3B0aW9ucy5zZXQoJ3NwcmVhZE1vZGVPbkxvYWQnLCAyKTtcbiAgICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIpIHtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLnNwcmVhZE1vZGUgPSAyO1xuICAgICAgfVxuICAgICAgdGhpcy5vblNwcmVhZENoYW5nZSgnZXZlbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zcHJlYWQgPT09ICdvZGQnKSB7XG4gICAgICBvcHRpb25zLnNldCgnc3ByZWFkTW9kZU9uTG9hZCcsIDEpO1xuICAgICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlcikge1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuc3ByZWFkTW9kZSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLm9uU3ByZWFkQ2hhbmdlKCdvZGQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5zZXQoJ3NwcmVhZE1vZGVPbkxvYWQnLCAwKTtcbiAgICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIpIHtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLnNwcmVhZE1vZGUgPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy5vblNwcmVhZENoYW5nZSgnb2ZmJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByaW50UmVzb2x1dGlvbikge1xuICAgICAgb3B0aW9ucy5zZXQoJ3ByaW50UmVzb2x1dGlvbicsIHRoaXMucHJpbnRSZXNvbHV0aW9uKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd0JvcmRlcnMgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnNldCgncmVtb3ZlUGFnZUJvcmRlcnMnLCAhdGhpcy5zaG93Qm9yZGVycyk7XG4gICAgfVxuICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9uczogSVBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucyA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zLnNldCgnbG9jYWxlUHJvcGVydGllcycsIHsgbGFuZzogdGhpcy5sYW5ndWFnZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb3BlblBERigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnNlcnZpY2VXb3JrZXJPcHRpb25zLnNob3dVbnZlcmlmaWVkU2lnbmF0dXJlcyA9IHRoaXMuc2hvd1VudmVyaWZpZWRTaWduYXR1cmVzO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmVuYWJsZVByaW50ID0gdGhpcy5lbmFibGVQcmludDtcbiAgICBpZiAodGhpcy5maWxlbmFtZUZvckRvd25sb2FkKSB7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWcuZmlsZW5hbWVGb3JEb3dubG9hZCA9IHRoaXMuZmlsZW5hbWVGb3JEb3dubG9hZDtcbiAgICB9IGVsc2Uge1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnLmZpbGVuYW1lRm9yRG93bmxvYWQgPSB0aGlzLmd1ZXNzRmlsZW5hbWVGcm9tVXJsKHRoaXMuX3NyYyk7XG4gICAgfVxuICAgIHRoaXMuc2VydmljZS5uZ3hFeHRlbmRlZFBkZlZpZXdlckluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoUERGVmlld2VyQXBwbGljYXRpb24pO1xuICAgIHRoaXMuc2VsZWN0Q3Vyc29yVG9vbCgpO1xuICAgIGlmICghdGhpcy5saXN0ZW5Ub1VSTCkge1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmTGlua1NlcnZpY2Uuc2V0SGFzaCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3JjKSB7XG4gICAgICB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2Uubmd4RXh0ZW5kZWRQZGZWaWV3ZXJJbmNvbXBsZXRlbHlJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHRoaXMuZHluYW1pY0NTU0NvbXBvbmVudC5jaGVja0hlaWdodCh0aGlzLCB0aGlzLmxvZ0xldmVsKSwgMTAwKTtcbiAgICAgIC8vIG9wZW4gYSBmaWxlIGluIHRoZSB2aWV3ZXJcbiAgICAgIGlmICghIXRoaXMuX3NyYykge1xuICAgICAgICBsZXQgd29ya2VyU3JjOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSA9IHBkZkRlZmF1bHRPcHRpb25zLndvcmtlclNyYztcbiAgICAgICAgaWYgKHR5cGVvZiB3b3JrZXJTcmMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3b3JrZXJTcmMgPSB3b3JrZXJTcmMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXG4gICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLmxvZ0xldmVsLFxuICAgICAgICAgIHdvcmtlclNyYyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX3NyY1sncmFuZ2UnXSkge1xuICAgICAgICAgIG9wdGlvbnMucmFuZ2UgPSB0aGlzLl9zcmNbJ3JhbmdlJ107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgICAgICBvcHRpb25zLmh0dHBIZWFkZXJzID0gdGhpcy5odHRwSGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgICAgb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF1dGhvcml6YXRpb24gIT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaHR0cEhlYWRlcnMpIG9wdGlvbnMuaHR0cEhlYWRlcnMgPSB7fTtcblxuICAgICAgICAgICAgb3B0aW9ucy5odHRwSGVhZGVycy5BdXRob3JpemF0aW9uID0gdGhpcy5hdXRob3JpemF0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmJhc2VIcmVmID0gdGhpcy5iYXNlSHJlZjtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ub25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHRoaXMucGRmTG9hZGluZ0ZhaWxlZC5lbWl0KGVycm9yKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zcmMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgb3B0aW9ucy51cmwgPSB0aGlzLl9zcmM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3JjIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICBvcHRpb25zLmRhdGEgPSB0aGlzLl9zcmM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3JjIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IHRoaXMuX3NyYztcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLnJhbmdlQ2h1bmtTaXplID0gcGRmRGVmYXVsdE9wdGlvbnMucmFuZ2VDaHVua1NpemU7XG4gICAgICAgIG9wdGlvbnMuY3NwUG9saWN5U2VydmljZSA9IHRoaXMuY3NwUG9saWN5U2VydmljZTtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZmluZEJhcj8uY2xvc2UoKTtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uc2Vjb25kYXJ5VG9vbGJhcj8uY2xvc2UoKTtcbiAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMuZGlzcGF0Y2goJ2Fubm90YXRpb25lZGl0b3Jtb2RlY2hhbmdlZCcsIHsgbW9kZTogMCB9KTtcblxuICAgICAgICBhd2FpdCBQREZWaWV3ZXJBcHBsaWNhdGlvbi5vcGVuKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnBkZkxvYWRpbmdTdGFydHMuZW1pdCh7fSk7XG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4gdGhpcy5zZXRab29tKCkpO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLnNodXR0aW5nRG93bikge1xuICAgICAgICAgIC8vIGh1cnJpZWQgdXNlcnMgc29tZXRpbWVzIHJlbG9hZCB0aGUgUERGIGJlZm9yZSBpdCBoYXMgZmluaXNoZWQgaW5pdGlhbGl6aW5nXG4gICAgICAgICAgaWYgKHRoaXMucGFnZSkge1xuICAgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGFnZSA9IE51bWJlcih0aGlzLnBhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbikge1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdhbm5vdGF0aW9uLWVkaXRvci1ldmVudCcsICh4OiBBbm5vdGF0aW9uRWRpdG9yRXZlbnQpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uRWRpdG9yRXZlbnQuZW1pdCh4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ3RvZ2dsZVNpZGViYXInLCAoeDogVG9nZ2xlU2lkZWJhckV2ZW50KSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMuc2lkZWJhclZpc2libGUgPSB4LnZpc2libGU7XG4gICAgICAgIHRoaXMuc2lkZWJhclZpc2libGVDaGFuZ2UuZW1pdCh4LnZpc2libGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigndGV4dGxheWVycmVuZGVyZWQnLCAoeDogVGV4dExheWVyUmVuZGVyZWRFdmVudCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy50ZXh0TGF5ZXJSZW5kZXJlZC5lbWl0KHgpKTtcbiAgICB9KTtcblxuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdhbm5vdGF0aW9uZWRpdG9ybW9kZWNoYW5nZWQnLCAoeDogQW5ub3RhdGlvbkVkaXRvckVkaXRvck1vZGVDaGFuZ2VkRXZlbnQpID0+IHtcbiAgICAgIC8vIHdlJ3JlIHVzaW5nIGEgdGltZW91dCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGUgZWRpdG9yIGlzIGFscmVhZHkgdmlzaWJsZVxuICAgICAgLy8gd2hlbiB0aGUgZXZlbnQgaXMgY2F1Z2h0LiBQZGYuanMgZmlyZXMgaXQgYSBiaXQgZWFybHkuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYW5ub3RhdGlvbkVkaXRvck1vZGVDaGFuZ2VkLmVtaXQoeCkpO1xuICAgIH0pO1xuXG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ3Njcm9sbG1vZGVjaGFuZ2VkJywgKHg6IFNjcm9sbE1vZGVDaGFuZ2VkRXZlbnQpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsTW9kZSA9IHgubW9kZTtcbiAgICAgICAgdGhpcy5zY3JvbGxNb2RlQ2hhbmdlLmVtaXQoeC5tb2RlKTtcbiAgICAgICAgaWYgKHgubW9kZSA9PT0gU2Nyb2xsTW9kZVR5cGUucGFnZSkge1xuICAgICAgICAgIGlmICh0aGlzLnBhZ2VWaWV3TW9kZSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZVZpZXdNb2RlQ2hhbmdlLmVtaXQoJ3NpbmdsZScpO1xuICAgICAgICAgICAgdGhpcy5fcGFnZVZpZXdNb2RlID0gJ3NpbmdsZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigncHJvZ3Jlc3MnLCAoeDogUHJvZ3Jlc3NCYXJFdmVudCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5wcm9ncmVzcy5lbWl0KHgpKTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbignZmluZGJhcmNsb3NlJywgKCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLmZpbmRiYXJWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmluZGJhclZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ2ZpbmRiYXJvcGVuJywgKCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLmZpbmRiYXJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5maW5kYmFyVmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdwcm9wZXJ0aWVzZGlhbG9nY2xvc2UnLCAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BlcnRpZXNEaWFsb2dWaXNpYmxlID0gZmFsc2U7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLnByb3BlcnRpZXNEaWFsb2dWaXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpKTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigncHJvcGVydGllc2RpYWxvZ29wZW4nLCAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BlcnRpZXNEaWFsb2dWaXNpYmxlID0gdHJ1ZTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMucHJvcGVydGllc0RpYWxvZ1Zpc2libGVDaGFuZ2UuZW1pdCh0cnVlKSk7XG4gICAgfSk7XG5cbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigncGFnZXNsb2FkZWQnLCAoeDogUGFnZXNMb2FkZWRFdmVudCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5wYWdlc0xvYWRlZC5lbWl0KHgpKTtcbiAgICAgIHRoaXMuZHluYW1pY0NTU0NvbXBvbmVudC5yZW1vdmVTY3JvbGxiYXJJbkluZmluaXRlU2Nyb2xsTW9kZShmYWxzZSwgdGhpcy5wYWdlVmlld01vZGUsIHRoaXMucHJpbWFyeU1lbnVWaXNpYmxlLCB0aGlzLCB0aGlzLmxvZ0xldmVsKTtcbiAgICAgIGlmICh0aGlzLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3RhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByID0gTnVtYmVyKHRoaXMucm90YXRpb24pO1xuICAgICAgICBpZiAociA9PT0gMCB8fCByID09PSA5MCB8fCByID09PSAxODAgfHwgciA9PT0gMjcwKSB7XG4gICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLnBhZ2VzUm90YXRpb24gPSByO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2Uuc2h1dHRpbmdEb3duKSB7XG4gICAgICAgICAgLy8gaHVycmllZCB1c2VycyBzb21ldGltZXMgcmVsb2FkIHRoZSBQREYgYmVmb3JlIGl0IGhhcyBmaW5pc2hlZCBpbml0aWFsaXppbmdcbiAgICAgICAgICBpZiAodGhpcy5uYW1lZGRlc3QpIHtcbiAgICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkxpbmtTZXJ2aWNlLmdvVG9EZXN0aW5hdGlvbih0aGlzLm5hbWVkZGVzdCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2UpIHtcbiAgICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UgPSBOdW1iZXIodGhpcy5wYWdlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGFnZUxhYmVsKSB7XG4gICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuY3VycmVudFBhZ2VMYWJlbCA9IHRoaXMucGFnZUxhYmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFpvb20oKTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigncGFnZXJlbmRlcmVkJywgKHg6IFBhZ2VSZW5kZXJlZEV2ZW50KSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucGFnZVJlbmRlcmVkLmVtaXQoeCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0NTU0NvbXBvbmVudC5yZW1vdmVTY3JvbGxiYXJJbkluZmluaXRlU2Nyb2xsTW9kZShmYWxzZSwgdGhpcy5wYWdlVmlld01vZGUsIHRoaXMucHJpbWFyeU1lbnVWaXNpYmxlLCB0aGlzLCB0aGlzLmxvZ0xldmVsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdwYWdlcmVuZGVyJywgKHg6IFBhZ2VSZW5kZXJFdmVudCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnBhZ2VSZW5kZXIuZW1pdCh4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ2Rvd25sb2FkJywgKHg6IFBkZkRvd25sb2FkZWRFdmVudCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnBkZkRvd25sb2FkZWQuZW1pdCh4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdzY2FsZWNoYW5naW5nJywgKHg6IFNjYWxlQ2hhbmdpbmdFdmVudCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFpvb21GYWN0b3IuZW1pdCh4LnNjYWxlKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHgucHJlc2V0VmFsdWUgIT09ICdhdXRvJyAmJiB4LnByZXNldFZhbHVlICE9PSAncGFnZS1maXQnICYmIHgucHJlc2V0VmFsdWUgIT09ICdwYWdlLWFjdHVhbCcgJiYgeC5wcmVzZXRWYWx1ZSAhPT0gJ3BhZ2Utd2lkdGgnKSB7XG4gICAgICAgIC8vIGlnbm9yZSByb3VuZGluZyBkaWZmZXJlbmNlc1xuICAgICAgICBpZiAoTWF0aC5hYnMoeC5wcmV2aW91c1NjYWxlIC0geC5zY2FsZSkgPiAwLjAwMDAwMSkge1xuICAgICAgICAgIHRoaXMuem9vbSA9IHguc2NhbGUgKiAxMDA7XG4gICAgICAgICAgdGhpcy56b29tQ2hhbmdlLmVtaXQoeC5zY2FsZSAqIDEwMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoeC5wcmV2aW91c1ByZXNldFZhbHVlICE9PSB4LnByZXNldFZhbHVlKSB7XG4gICAgICAgIC8vIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgb25lIG9mIHRoZSB0ZXh0IHZhbHVlcyBvZiB0aGUgem9vbSBzZWxlY3QgZHJvcGRvd25cbiAgICAgICAgdGhpcy56b29tQ2hhbmdlLmVtaXQoeC5wcmVzZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigncm90YXRpb25jaGFuZ2luZycsICh4OiBQYWdlc1JvdGF0aW9uRXZlbnQpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5yb3RhdGlvbkNoYW5nZS5lbWl0KHgucGFnZXNSb3RhdGlvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbignZmlsZWlucHV0Y2hhbmdlJywgKHg6IEZpbGVJbnB1dENoYW5nZWQpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaWYgKHguZmlsZUlucHV0LmZpbGVzICYmIHguZmlsZUlucHV0LmZpbGVzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgLy8gZHJhZyBhbmQgZHJvcFxuICAgICAgICAgIHRoaXMuc3JjQ2hhbmdlVHJpZ2dlcmVkQnlVc2VyID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNyY0NoYW5nZS5lbWl0KHguZmlsZUlucHV0LmZpbGVzWzBdLm5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHJlZ3VsYXIgZmlsZSBvcGVuIGRpYWxvZ1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB4LmZpbGVJbnB1dD8udmFsdWU/LnJlcGxhY2UoJ0M6XFxcXGZha2VwYXRoXFxcXCcsICcnKTtcbiAgICAgICAgICB0aGlzLnNyY0NoYW5nZS5lbWl0KHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbignY3Vyc29ydG9vbGNoYW5nZWQnLCAoeDogSGFuZHRvb2xDaGFuZ2VkKSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZFRvb2wgPSB4LnRvb2wgPT09IFBkZkN1cnNvclRvb2xzLkhBTkQ7XG4gICAgICAgIHRoaXMuaGFuZFRvb2xDaGFuZ2UuZW1pdCh4LnRvb2wgPT09IFBkZkN1cnNvclRvb2xzLkhBTkQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbignc2lkZWJhcnZpZXdjaGFuZ2VkJywgKHg6IFNpZGViYXJ2aWV3Q2hhbmdlKSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMuc2lkZWJhclZpc2libGVDaGFuZ2UuZW1pdCh4LnZpZXcgPiAwKTtcbiAgICAgICAgaWYgKHgudmlldyA+IDApIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNpZGViYXJWaWV3Q2hhbmdlLmVtaXQoeC52aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaWRlYmFyQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5zaWRlYmFyQ29tcG9uZW50LnNob3dUb29sYmFyV2hlbk5lY2Vzc2FyeSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdkb2N1bWVudGxvYWRlZCcsIChwZGZMb2FkZWRFdmVudDogUGRmRG9jdW1lbnRMb2FkZWRFdmVudCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlcyA9IHBkZkxvYWRlZEV2ZW50LnNvdXJjZS5wYWdlc0NvdW50O1xuICAgICAgICB0aGlzLnBhZ2VMYWJlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMucGFnZSAmJiB0aGlzLnBhZ2UgPj0gcGFnZXMpIHtcbiAgICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbFNpZ25hdHVyZVdhcm5pbmdJbnRvVmlldyhwZGZMb2FkZWRFdmVudC5zb3VyY2UucGRmRG9jdW1lbnQpO1xuICAgICAgICB0aGlzLnBkZkxvYWRlZC5lbWl0KHsgcGFnZXNDb3VudDogcGRmTG9hZGVkRXZlbnQuc291cmNlLnBkZkRvY3VtZW50Py5udW1QYWdlcyB9IGFzIFBkZkxvYWRlZEV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuZmluZGJhclZpc2libGUpIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQmFyLm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzRGlhbG9nVmlzaWJsZSkge1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkRvY3VtZW50UHJvcGVydGllcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNUZXh0TGF5ZXIgPSB0aGlzLnRleHRMYXllciA9PT0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ3NwcmVhZG1vZGVjaGFuZ2VkJywgKGV2ZW50KSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVzID0gWydvZmYnLCAnb2RkJywgJ2V2ZW4nXSBhcyBBcnJheTxTcHJlYWRUeXBlPjtcbiAgICAgICAgdGhpcy5zcHJlYWQgPSBtb2Rlc1tldmVudC5tb2RlXTtcbiAgICAgICAgdGhpcy5zcHJlYWRDaGFuZ2UuZW1pdCh0aGlzLnNwcmVhZCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhpZGVTaWRlYmFyVG9vbGJhciA9ICgpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2lkZWJhckNvbXBvbmVudCkge1xuICAgICAgICAgIHRoaXMuc2lkZWJhckNvbXBvbmVudC5zaG93VG9vbGJhcldoZW5OZWNlc3NhcnkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdvdXRsaW5lbG9hZGVkJywgaGlkZVNpZGViYXJUb29sYmFyKTtcblxuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdhdHRhY2htZW50c2xvYWRlZCcsIGhpZGVTaWRlYmFyVG9vbGJhcik7XG5cbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbignbGF5ZXJzbG9hZGVkJywgaGlkZVNpZGViYXJUb29sYmFyKTtcblxuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdhbm5vdGF0aW9ubGF5ZXJyZW5kZXJlZCcsIChldmVudDogQW5ub3RhdGlvbkxheWVyUmVuZGVyZWRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZGl2ID0gZXZlbnQuc291cmNlLmRpdjtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgZXZlbnQuaW5pdGlhbEZvcm1EYXRhU3RvcmVkSW5UaGVQREYgPSB0aGlzLmZvcm1TdXBwb3J0LmluaXRpYWxGb3JtRGF0YVN0b3JlZEluVGhlUERGO1xuICAgICAgICB0aGlzLmFubm90YXRpb25MYXllclJlbmRlcmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICB0aGlzLmVuYWJsZU9yRGlzYWJsZUZvcm1zKGRpdiwgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbignYW5ub3RhdGlvbmVkaXRvcmxheWVycmVuZGVyZWQnLCAoZXZlbnQpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuYW5ub3RhdGlvbkVkaXRvckxheWVyUmVuZGVyZWQuZW1pdChldmVudCkpKTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigneGZhbGF5ZXJyZW5kZXJlZCcsIChldmVudCkgPT4gcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy54ZmFMYXllclJlbmRlcmVkLmVtaXQoZXZlbnQpKSk7XG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ291dGxpbmVsb2FkZWQnLCAoZXZlbnQpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMub3V0bGluZUxvYWRlZC5lbWl0KGV2ZW50KSkpO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdhdHRhY2htZW50c2xvYWRlZCcsIChldmVudCkgPT4gcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5hdHRhY2htZW50c2xvYWRlZC5lbWl0KGV2ZW50KSkpO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdsYXllcnNsb2FkZWQnLCAoZXZlbnQpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMubGF5ZXJzbG9hZGVkLmVtaXQoZXZlbnQpKSk7XG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMub24oJ3ByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkJywgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24/LnBkZlZpZXdlcj8uZGVzdHJveUJvb2tNb2RlKCk7XG4gICAgfSk7XG5cbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigndXBkYXRlZmluZGNvbnRyb2xzdGF0ZScsICh4OiBGaW5kUmVzdWx0KSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGxldCB0eXBlID0gUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuc3RhdGU/LnR5cGUgPz8gJ2ZpbmQnO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2FnYWluJykge1xuICAgICAgICAgIHR5cGUgPSAnZmluZGFnYWluJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgY2FzZVNlbnNpdGl2ZTogUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuc3RhdGU/LmNhc2VTZW5zaXRpdmUsXG4gICAgICAgICAgZW50aXJlV29yZDogUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuc3RhdGU/LmVudGlyZVdvcmQsXG4gICAgICAgICAgZmluZFByZXZpb3VzOiBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQ29udHJvbGxlci5zdGF0ZT8uZmluZFByZXZpb3VzLFxuICAgICAgICAgIGhpZ2hsaWdodEFsbDogUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuc3RhdGU/LmhpZ2hsaWdodEFsbCxcbiAgICAgICAgICBtYXRjaERpYWNyaXRpY3M6IFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRDb250cm9sbGVyLnN0YXRlPy5tYXRjaERpYWNyaXRpY3MsXG4gICAgICAgICAgcXVlcnk6IFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRDb250cm9sbGVyLnN0YXRlPy5xdWVyeSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbmRNYXRjaGVzQ291bnQuZW1pdCh7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIGN1cnJlbnQ6IHgubWF0Y2hlc0NvdW50LmN1cnJlbnQsXG4gICAgICAgICAgdG90YWw6IHgubWF0Y2hlc0NvdW50LnRvdGFsLFxuICAgICAgICAgIG1hdGNoZXM6IFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRDb250cm9sbGVyLl9wYWdlTWF0Y2hlcyA/PyBbXSxcbiAgICAgICAgICBtYXRjaGVzTGVuZ3RoOiBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQ29udHJvbGxlci5fcGFnZU1hdGNoZXNMZW5ndGggPz8gW10sXG4gICAgICAgIH0gYXMgRmluZFJlc3VsdE1hdGNoZXNDb3VudCk7IC8vIFRPRE86IHJlbW92ZSB0aGUgY2FzdCBiZWNhdXNlIGl0J3MganVzdCBkdWN0IHRhcGVcblxuICAgICAgICBpZiAodGhpcy51cGRhdGVGaW5kU3RhdGUpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZpbmRTdGF0ZS5lbWl0KHguc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5vbigndXBkYXRlZmluZG1hdGNoZXNjb3VudCcsICh4OiBGaW5kUmVzdWx0KSA9PiB7XG4gICAgICB4Lm1hdGNoZXNDb3VudC5tYXRjaGVzID0gUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuX3BhZ2VNYXRjaGVzID8/IFtdO1xuICAgICAgeC5tYXRjaGVzQ291bnQubWF0Y2hlc0xlbmd0aCA9IFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRDb250cm9sbGVyLl9wYWdlTWF0Y2hlc0xlbmd0aCA/PyBbXTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+XG4gICAgICAgIHRoaXMudXBkYXRlRmluZE1hdGNoZXNDb3VudC5lbWl0KHtcbiAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQ29udHJvbGxlci5zdGF0ZT8uY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZSxcbiAgICAgICAgICBlbnRpcmVXb3JkOiBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQ29udHJvbGxlci5zdGF0ZT8uZW50aXJlV29yZCA/PyBmYWxzZSxcbiAgICAgICAgICBmaW5kUHJldmlvdXM6IFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRDb250cm9sbGVyLnN0YXRlPy5maW5kUHJldmlvdXMgPz8gZmFsc2UsXG4gICAgICAgICAgaGlnaGxpZ2h0QWxsOiBQREZWaWV3ZXJBcHBsaWNhdGlvbi5maW5kQ29udHJvbGxlci5zdGF0ZT8uaGlnaGxpZ2h0QWxsID8/IGZhbHNlLFxuICAgICAgICAgIG1hdGNoRGlhY3JpdGljczogUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuc3RhdGU/Lm1hdGNoRGlhY3JpdGljcyA/PyBmYWxzZSxcbiAgICAgICAgICBxdWVyeTogUERGVmlld2VyQXBwbGljYXRpb24uZmluZENvbnRyb2xsZXIuc3RhdGU/LnF1ZXJ5ID8/ICcnLFxuICAgICAgICAgIHR5cGU6IFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRDb250cm9sbGVyLnN0YXRlPy50eXBlIGFzIGFueSxcbiAgICAgICAgICBjdXJyZW50OiB4Lm1hdGNoZXNDb3VudC5jdXJyZW50LFxuICAgICAgICAgIHRvdGFsOiB4Lm1hdGNoZXNDb3VudC50b3RhbCxcbiAgICAgICAgICBtYXRjaGVzOiB4Lm1hdGNoZXNDb3VudC5tYXRjaGVzLFxuICAgICAgICAgIG1hdGNoZXNMZW5ndGg6IHgubWF0Y2hlc0NvdW50Lm1hdGNoZXNMZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLm9uKCdwYWdlY2hhbmdpbmcnLCAoeDogUGFnZU51bWJlckNoYW5nZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2Uuc2h1dHRpbmdEb3duKSB7XG4gICAgICAgIC8vIGh1cnJpZWQgdXNlcnMgc29tZXRpbWVzIHJlbG9hZCB0aGUgUERGIGJlZm9yZSBpdCBoYXMgZmluaXNoZWQgaW5pdGlhbGl6aW5nXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZSA9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlcjtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUxhYmVsID0gUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLmN1cnJlbnRQYWdlTGFiZWw7XG5cbiAgICAgICAgICBpZiAoY3VycmVudFBhZ2UgIT09IHRoaXMucGFnZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoY3VycmVudFBhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudFBhZ2VMYWJlbCAhPT0gdGhpcy5wYWdlTGFiZWwpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZUxhYmVsQ2hhbmdlLmVtaXQoY3VycmVudFBhZ2VMYWJlbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBvcGVuUERGMigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuXG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZmluZEJhcj8uY2xvc2UoKTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zZWNvbmRhcnlUb29sYmFyPy5jbG9zZSgpO1xuICAgIHRyeSB7XG4gICAgICAvLyBzb21ldGltZXMgdGhlIGFubm90YXRpb24gZWRpdG9yIFVJIGlzIHVuZGVmaW5lZCwgYnV0IGl0J3MgYSBwcml2YXRlIHZhcmlhYmxlLFxuICAgICAgLy8gc28gd2Ugc2ltcGx5IGNhdGNoIHRoZSBlcnJvclxuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMuZGlzcGF0Y2goJ3N3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlJywgeyBtb2RlOiAwIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yXG4gICAgfVxuXG4gICAgdGhpcy5vdmVycmlkZURlZmF1bHRTZXR0aW5ncygpO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5kZXN0cm95Qm9va01vZGUoKTtcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuc3RvcFJlbmRlcmluZygpO1xuICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlRodW1ibmFpbFZpZXdlci5zdG9wUmVuZGVyaW5nKCk7XG5cbiAgICAvLyAjODAyIGNsZWFyIHRoZSBmb3JtIGRhdGE7IG90aGVyd2lzZSB0aGUgXCJkb3dubG9hZFwiIGRpYWxvZ3Mgb3BlbnNcbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZEb2N1bWVudD8uYW5ub3RhdGlvblN0b3JhZ2U/LnJlc2V0TW9kaWZpZWQoKTtcblxuICAgIGF3YWl0IFBERlZpZXdlckFwcGxpY2F0aW9uLmNsb3NlKCk7XG4gICAgdGhpcy5mb3JtU3VwcG9ydD8ucmVzZXQoKTtcbiAgICBpZiAodGhpcy5pbml0aWFsQW5ndWxhckZvcm1EYXRhKSB7XG4gICAgICB0aGlzLmZvcm1TdXBwb3J0LmZvcm1EYXRhID0gdGhpcy5pbml0aWFsQW5ndWxhckZvcm1EYXRhO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlbmFtZUZvckRvd25sb2FkKSB7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWcuZmlsZW5hbWVGb3JEb3dubG9hZCA9IHRoaXMuZmlsZW5hbWVGb3JEb3dubG9hZDtcbiAgICB9IGVsc2Uge1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24uYXBwQ29uZmlnLmZpbGVuYW1lRm9yRG93bmxvYWQgPSB0aGlzLmd1ZXNzRmlsZW5hbWVGcm9tVXJsKHRoaXMuX3NyYyk7XG4gICAgfVxuXG4gICAgbGV0IHdvcmtlclNyYzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgPSBwZGZEZWZhdWx0T3B0aW9ucy53b3JrZXJTcmM7XG4gICAgaWYgKHR5cGVvZiB3b3JrZXJTcmMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtlclNyYyA9IHdvcmtlclNyYygpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcbiAgICAgIHZlcmJvc2l0eTogdGhpcy5sb2dMZXZlbCxcbiAgICAgIHdvcmtlclNyYyxcbiAgICB9O1xuICAgIGlmICh0aGlzLl9zcmM/LlsncmFuZ2UnXSkge1xuICAgICAgb3B0aW9ucy5yYW5nZSA9IHRoaXMuX3NyY1sncmFuZ2UnXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgIG9wdGlvbnMuaHR0cEhlYWRlcnMgPSB0aGlzLmh0dHBIZWFkZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRob3JpemF0aW9uKSB7XG4gICAgICBvcHRpb25zLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5hdXRob3JpemF0aW9uICE9ICdib29sZWFuJykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaHR0cEhlYWRlcnMpIG9wdGlvbnMuaHR0cEhlYWRlcnMgPSB7fTtcblxuICAgICAgICBvcHRpb25zLmh0dHBIZWFkZXJzLkF1dGhvcml6YXRpb24gPSB0aGlzLmF1dGhvcml6YXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIG9wdGlvbnMuYmFzZUhyZWYgPSB0aGlzLmJhc2VIcmVmO1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX3NyYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3B0aW9ucy51cmwgPSB0aGlzLl9zcmM7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3NyYyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIG9wdGlvbnMuZGF0YSA9IHRoaXMuX3NyYztcbiAgICAgICAgaWYgKHRoaXMuX3NyYy5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gc29tZXRpbWVzIG5nT25Jbml0KCkgY2FsbHMgb3BlblBkZjIgdG9vIGVhcmx5XG4gICAgICAgICAgLy8gc28gbGV0J3MgaWdub3JlIGVtcHR5IGFycmF5c1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9zcmMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIG9wdGlvbnMuZGF0YSA9IHRoaXMuX3NyYztcbiAgICAgICAgaWYgKHRoaXMuX3NyYy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBzb21ldGltZXMgbmdPbkluaXQoKSBjYWxscyBvcGVuUGRmMiB0b28gZWFybHlcbiAgICAgICAgICAvLyBzbyBsZXQncyBpZ25vcmUgZW1wdHkgYXJyYXlzXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvcHRpb25zLnJhbmdlQ2h1bmtTaXplID0gcGRmRGVmYXVsdE9wdGlvbnMucmFuZ2VDaHVua1NpemU7XG4gICAgICBhd2FpdCBQREZWaWV3ZXJBcHBsaWNhdGlvbi5vcGVuKG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnBkZkxvYWRpbmdGYWlsZWQuZW1pdChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RDdXJzb3JUb29sKCkge1xuICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXMuZGlzcGF0Y2goJ3N3aXRjaGN1cnNvcnRvb2wnLCB7IHRvb2w6IHRoaXMuaGFuZFRvb2wgPyAxIDogMCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkb1JlcGxhY2VCcm93c2VyUHJpbnQodXNlQ3VzdG9tUHJpbnRPZlBkZkpTOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHVzZUN1c3RvbVByaW50T2ZQZGZKUykge1xuICAgICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbiA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbjtcbiAgICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbj8ucHJpbnRQZGYpIHtcbiAgICAgICAgd2luZG93LnByaW50ID0gUERGVmlld2VyQXBwbGljYXRpb24ucHJpbnRQZGYuYmluZChQREZWaWV3ZXJBcHBsaWNhdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9yaWdpbmFsUHJpbnQgJiYgIXRoaXMub3JpZ2luYWxQcmludC50b1N0cmluZygpLmluY2x1ZGVzKCdwcmludFBkZicpKSB7XG4gICAgICB3aW5kb3cucHJpbnQgPSB0aGlzLm9yaWdpbmFsUHJpbnQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG5nT25EZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGVzdHJveUluaXRpYWxpemF0aW9uID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jaGVja1Jvb3RFbGVtZW50VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2hlY2tSb290RWxlbWVudFRpbWVvdXQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbml0aWFsaXphdGlvblByb21pc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uub25QREZKU0luaXRTaWduYWwuc2V0KHVuZGVmaW5lZCk7XG4gICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICAvLyBkbyBub3QgcnVuIHRoaXMgY29kZSBvbiB0aGUgc2VydmVyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBwYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmludENvbnRhaW5lcicpO1xuICAgICAgaWYgKHBjKSB7XG4gICAgICAgIHBjLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbG9yLXNjaGVtZSB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBkb2N1bWVudFxuICAgICAgaWYgKHRoaXMub3JpZ2luYWxDb2xvclNjaGVtZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkb2NTdHlsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxDb2xvclNjaGVtZSA9PT0gJycpIHtcbiAgICAgICAgICBkb2NTdHlsZS5yZW1vdmVQcm9wZXJ0eSgnY29sb3Itc2NoZW1lJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jU3R5bGUuc2V0UHJvcGVydHkoJ2NvbG9yLXNjaGVtZScsIHRoaXMub3JpZ2luYWxDb2xvclNjaGVtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmlnaW5hbENvbG9yU2NoZW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkbyBub3QgcnVuIHRoaXMgY29kZSBvbiB0aGUgc2VydmVyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFByaW50ID0gdGhpcy5vcmlnaW5hbFByaW50O1xuICAgICAgaWYgKHdpbmRvdyAmJiBvcmlnaW5hbFByaW50ICYmICFvcmlnaW5hbFByaW50LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ3ByaW50UGRmJykpIHtcbiAgICAgICAgd2luZG93LnByaW50ID0gb3JpZ2luYWxQcmludDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuXG4gICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uKSB7XG4gICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ubmd4Q29uc29sZSkge1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5uZ3hDb25zb2xlLnJlc2V0KCk7XG4gICAgICB9XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXI/LmRlc3Ryb3lCb29rTW9kZSgpO1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyPy5zdG9wUmVuZGVyaW5nKCk7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZUaHVtYm5haWxWaWV3ZXI/LnN0b3BSZW5kZXJpbmcoKTtcbiAgICAgIGRlbGV0ZSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5uZ3hLZXlib2FyZE1hbmFnZXI7XG4gICAgICBkZWxldGUgUERGVmlld2VyQXBwbGljYXRpb24uY3NwUG9saWN5U2VydmljZTtcbiAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzPy5vZmYoJ2FmdGVycHJpbnQnLCB0aGlzLmFmdGVyUHJpbnRMaXN0ZW5lcik7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cz8ub2ZmKCdiZWZvcmVwcmludCcsIHRoaXMuYmVmb3JlUHJpbnRMaXN0ZW5lcik7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cz8ub2ZmKCdzb3VyY2VjaGFuZ2VkJywgdGhpcy5yZXBvcnRTb3VyY2VDaGFuZ2VzLmJpbmQodGhpcykpO1xuXG4gICAgICAvLyAjODAyIGNsZWFyIHRoZSBmb3JtIGRhdGE7IG90aGVyd2lzZSB0aGUgXCJkb3dubG9hZFwiIGRpYWxvZ3Mgb3BlbnNcbiAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkRvY3VtZW50Py5hbm5vdGF0aW9uU3RvcmFnZT8ucmVzZXRNb2RpZmllZCgpO1xuICAgICAgdGhpcy5mb3JtU3VwcG9ydD8ucmVzZXQoKTtcbiAgICAgICh0aGlzLmZvcm1TdXBwb3J0IGFzIGFueSkgPSB1bmRlZmluZWQ7XG4gICAgICAoUERGVmlld2VyQXBwbGljYXRpb24ub25FcnJvciBhcyBhbnkpID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBQREZWaWV3ZXJBcHBsaWNhdGlvbi5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8ganVzdCBpZ25vcmUgaXRcbiAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHRoZSBzZWNvbmRhcnkgdG9vbGJhciBtYXkgaGF2ZSBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQsIHNvXG4gICAgICAgIC8vIHRyeWluZyB0byBkZXN0cm95IGl0IHJlc3VsdCBpbiBlcnJvcnNcbiAgICAgIH1cbiAgICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wcmludEtleURvd25MaXN0ZW5lcikge1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgUERGVmlld2VyQXBwbGljYXRpb24ucHJpbnRLZXlEb3duTGlzdGVuZXIsIHRydWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgdyA9IGdsb2JhbFRoaXMgYXMgYW55O1xuICAgICAgZGVsZXRlIHcuZ2V0Rm9ybVZhbHVlRnJvbUFuZ3VsYXI7XG4gICAgICBkZWxldGUgdy5yZWdpc3RlckFjcm9mb3JtQW5ub3RhdGlvbnM7XG4gICAgICBkZWxldGUgdy5nZXRGb3JtVmFsdWU7XG4gICAgICBkZWxldGUgdy5zZXRGb3JtVmFsdWU7XG4gICAgICBkZWxldGUgdy5hc3NpZ25Gb3JtSWRBbmRGaWVsZE5hbWU7XG4gICAgICBkZWxldGUgdy5yZWdpc3RlckFjcm9mb3JtRmllbGQ7XG4gICAgICBkZWxldGUgdy5yZWdpc3RlclhGQUZpZWxkO1xuICAgICAgZGVsZXRlIHcuYXNzaWduRm9ybUlkQW5kRmllbGROYW1lO1xuICAgICAgZGVsZXRlIHcudXBkYXRlQW5ndWxhckZvcm1WYWx1ZTtcblxuICAgICAgY29uc3QgYnVzID0gUERGVmlld2VyQXBwbGljYXRpb24uZXZlbnRCdXM7XG4gICAgICBpZiAoYnVzKSB7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnVuYmluZEV2ZW50cygpO1xuICAgICAgICBidXMuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24udW5iaW5kV2luZG93RXZlbnRzKCk7XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbj8uX2NsZWFudXAoKTtcbiAgICAgIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cyBhcyBhbnkpID0gdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHcuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgICBkZWxldGUgdy5QREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgICBkZWxldGUgdy5QREZWaWV3ZXJBcHBsaWNhdGlvbkNvbnN0YW50cztcbiAgICAgIHRoaXMuc2VydmljZS5uZ3hFeHRlbmRlZFBkZlZpZXdlckluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgIC8vIGRvIG5vdCBydW4gdGhpcyBjb2RlIG9uIHRoZSBzZXJ2ZXJcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmd4LWV4dGVuZGVkLXBkZi12aWV3ZXItZmlsZS1pbnB1dCcpLmZvckVhY2goKGU6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzUHJpbWFyeU1lbnVWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNob3dUb29sYmFyKSB7XG4gICAgICBjb25zdCB2aXNpYmxlID1cbiAgICAgICAgdGhpcy5zaG93RG93bmxvYWRCdXR0b24gfHxcbiAgICAgICAgdGhpcy5zaG93RHJhd0VkaXRvciB8fFxuICAgICAgICB0aGlzLnNob3dIaWdobGlnaHRFZGl0b3IgfHxcbiAgICAgICAgdGhpcy5zaG93VGV4dEVkaXRvciB8fFxuICAgICAgICB0aGlzLnNob3dGaW5kQnV0dG9uIHx8XG4gICAgICAgIHRoaXMuc2hvd09wZW5GaWxlQnV0dG9uIHx8XG4gICAgICAgIHRoaXMuc2hvd1BhZ2luZ0J1dHRvbnMgfHxcbiAgICAgICAgdGhpcy5zaG93UHJlc2VudGF0aW9uTW9kZUJ1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dQcmludEJ1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dQcm9wZXJ0aWVzQnV0dG9uIHx8XG4gICAgICAgIHRoaXMuc2hvd1JvdGF0ZUN3QnV0dG9uIHx8XG4gICAgICAgIHRoaXMuc2hvd1JvdGF0ZUNjd0J1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dIYW5kVG9vbEJ1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dCb29rTW9kZUJ1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dTaW5nbGVQYWdlTW9kZUJ1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dWZXJ0aWNhbFNjcm9sbEJ1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dIb3Jpem9udGFsU2Nyb2xsQnV0dG9uIHx8XG4gICAgICAgIHRoaXMuc2hvd0luZmluaXRlU2Nyb2xsQnV0dG9uIHx8XG4gICAgICAgIHRoaXMuc2hvd1NwcmVhZEJ1dHRvbiB8fFxuICAgICAgICB0aGlzLnNob3dTaWRlYmFyQnV0dG9uIHx8XG4gICAgICAgIHRoaXMuc2hvd1pvb21CdXR0b25zO1xuXG4gICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjsgLy8gc2VydmVyIHNpZGUgcmVuZGVyaW5nXG4gICAgfVxuICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zOiBJUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucztcblxuICAgIGlmICh0aGlzLnNlcnZpY2Uubmd4RXh0ZW5kZWRQZGZWaWV3ZXJJbml0aWFsaXplZCkge1xuICAgICAgaWYgKCdzcmMnIGluIGNoYW5nZXMgfHwgJ2Jhc2U2NFNyYycgaW4gY2hhbmdlcykge1xuICAgICAgICBpZiAodGhpcy5zcmNDaGFuZ2VUcmlnZ2VyZWRCeVVzZXIpIHtcbiAgICAgICAgICB0aGlzLnNyY0NoYW5nZVRyaWdnZXJlZEJ5VXNlciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnBhZ2VWaWV3TW9kZSA9PT0gJ2Jvb2snKSB7XG4gICAgICAgICAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24/LnBkZlZpZXdlcj8uZGVzdHJveUJvb2tNb2RlKCk7XG4gICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbj8ucGRmVmlld2VyPy5zdG9wUmVuZGVyaW5nKCk7XG4gICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbj8ucGRmVGh1bWJuYWlsVmlld2VyPy5zdG9wUmVuZGVyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIXRoaXMuX3NyYykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5uZ3hFeHRlbmRlZFBkZlZpZXdlckluY29tcGxldGVseUluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgIHRoaXMub3BlblBERigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbGl6ZWQgPSB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uub25QREZKU0luaXRTaWduYWwoKTtcbiAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcGVuUERGMigpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBsaWJyYXJ5IGxvYWRzIHRoZSBQREYgZmlsZSBsYXRlciBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gIzgwMiBjbGVhciB0aGUgZm9ybSBkYXRhOyBvdGhlcndpc2UgdGhlIFwiZG93bmxvYWRcIiBkaWFsb2dzIG9wZW5zXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlRG9jdW1lbnQoUERGVmlld2VyQXBwbGljYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCdlbmFibGVEcmFnQW5kRHJvcCcgaW4gY2hhbmdlcykge1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnMuc2V0KCdlbmFibGVEcmFnQW5kRHJvcCcsIHRoaXMuZW5hYmxlRHJhZ0FuZERyb3ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoJ2ZpbmRiYXJWaXNpYmxlJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydmaW5kYmFyVmlzaWJsZSddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRCYXIub3BlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmZpbmRCYXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoJ3Byb3BlcnRpZXNEaWFsb2dWaXNpYmxlJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNEaWFsb2dWaXNpYmxlKSB7XG4gICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnRQcm9wZXJ0aWVzLm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZEb2N1bWVudFByb3BlcnRpZXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoJ3pvb20nIGluIGNoYW5nZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRab29tKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgnbWF4Wm9vbScgaW4gY2hhbmdlcykge1xuICAgICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyKSB7XG4gICAgICAgICAgUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyLm1heFpvb20gPSB0aGlzLm1heFpvb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnRvb2xiYXIpIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi50b29sYmFyLm1heFpvb20gPSB0aGlzLm1heFpvb207XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCdtaW5ab29tJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIpIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIubWluWm9vbSA9IHRoaXMubWluWm9vbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24udG9vbGJhcikge1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnRvb2xiYXIubWluWm9vbSA9IHRoaXMubWluWm9vbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoJ2hhbmRUb29sJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q3Vyc29yVG9vbCgpO1xuICAgICAgfVxuICAgICAgaWYgKCdwYWdlJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2UpIHtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICAgICAgICBpZiAodGhpcy5wYWdlICE9IFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UpIHtcbiAgICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBhZ2UgPSB0aGlzLnBhZ2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoJ3BhZ2VMYWJlbCcgaW4gY2hhbmdlcykge1xuICAgICAgICBpZiAodGhpcy5wYWdlTGFiZWwpIHtcbiAgICAgICAgICBpZiAodGhpcy5wYWdlTGFiZWwgIT09IFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5jdXJyZW50UGFnZUxhYmVsKSB7XG4gICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuY3VycmVudFBhZ2VMYWJlbCA9IHRoaXMucGFnZUxhYmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoJ3JvdGF0aW9uJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgciA9IE51bWJlcih0aGlzLnJvdGF0aW9uKTtcbiAgICAgICAgICBpZiAociA9PT0gMCB8fCByID09PSA5MCB8fCByID09PSAxODAgfHwgciA9PT0gMjcwKSB7XG4gICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIucGFnZXNSb3RhdGlvbiA9IHI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5wYWdlc1JvdGF0aW9uID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCdzY3JvbGxNb2RlJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbE1vZGUgfHwgdGhpcy5zY3JvbGxNb2RlID09PSBTY3JvbGxNb2RlVHlwZS52ZXJ0aWNhbCkge1xuICAgICAgICAgIGlmIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuc2Nyb2xsTW9kZSAhPT0gTnVtYmVyKHRoaXMuc2Nyb2xsTW9kZSkpIHtcbiAgICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLmRpc3BhdGNoKCdzd2l0Y2hzY3JvbGxtb2RlJywgeyBtb2RlOiBOdW1iZXIodGhpcy5zY3JvbGxNb2RlKSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICgnYWN0aXZlU2lkZWJhclZpZXcnIGluIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2lkZWJhclZpc2libGUpIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZTaWRlYmFyLm9wZW4oKTtcbiAgICAgICAgICBjb25zdCB2aWV3ID0gTnVtYmVyKHRoaXMuYWN0aXZlU2lkZWJhclZpZXcpO1xuICAgICAgICAgIGlmICh2aWV3ID09PSAxIHx8IHZpZXcgPT09IDIgfHwgdmlldyA9PT0gMyB8fCB2aWV3ID09PSA0KSB7XG4gICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZTaWRlYmFyLnN3aXRjaFZpZXcodmlldywgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1thY3RpdmVTaWRlYmFyVmlld10gbXVzdCBiZSBhbiBpbnRlZ2VyIHZhbHVlIGJldHdlZW4gMSBhbmQgNCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZTaWRlYmFyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICgnZmlsZW5hbWVGb3JEb3dubG9hZCcgaW4gY2hhbmdlcykge1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWcuZmlsZW5hbWVGb3JEb3dubG9hZCA9IHRoaXMuZmlsZW5hbWVGb3JEb3dubG9hZDtcbiAgICAgIH1cbiAgICAgIGlmICgnbmFtZWRkZXN0JyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLm5hbWVkZGVzdCkge1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkxpbmtTZXJ2aWNlLmdvVG9EZXN0aW5hdGlvbih0aGlzLm5hbWVkZGVzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCdzcHJlYWQnIGluIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3ByZWFkID09PSAnZXZlbicpIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zcHJlYWRNb2RlT25Mb2FkID0gMjtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuc3ByZWFkTW9kZSA9IDI7XG4gICAgICAgICAgdGhpcy5vblNwcmVhZENoYW5nZSgnZXZlbicpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3ByZWFkID09PSAnb2RkJykge1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnNwcmVhZE1vZGVPbkxvYWQgPSAxO1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlci5zcHJlYWRNb2RlID0gMTtcbiAgICAgICAgICB0aGlzLm9uU3ByZWFkQ2hhbmdlKCdvZGQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5zcHJlYWRNb2RlT25Mb2FkID0gMDtcbiAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuc3ByZWFkTW9kZSA9IDA7XG4gICAgICAgICAgdGhpcy5vblNwcmVhZENoYW5nZSgnb2ZmJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oaWRlVG9vbGJhcklmSXRJc0VtcHR5KCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2FsY1ZpZXdlclBvc2l0aW9uVG9wKCkpO1xuICAgIH0gLy8gZW5kIG9mIGlmIChOZ3hFeHRlbmRlZFBkZlZpZXdlckNvbXBvbmVudC5uZ3hFeHRlbmRlZFBkZlZpZXdlckluaXRpYWxpemVkKVxuXG4gICAgaWYgKCdwcmludFJlc29sdXRpb24nIGluIGNoYW5nZXMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zLnNldCgncHJpbnRSZXNvbHV0aW9uJywgdGhpcy5wcmludFJlc29sdXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoJ2lnbm9yZUtleWJvYXJkJyBpbiBjaGFuZ2VzKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zO1xuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vdmVycmlkZURlZmF1bHRTZXR0aW5ncygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoJ2lnbm9yZUtleXMnIGluIGNoYW5nZXMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICB0aGlzLm92ZXJyaWRlRGVmYXVsdFNldHRpbmdzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnYWNjZXB0S2V5cycgaW4gY2hhbmdlcykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVEZWZhdWx0U2V0dGluZ3MoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCdzaG93Qm9yZGVycycgaW4gY2hhbmdlcykge1xuICAgICAgaWYgKCFjaGFuZ2VzWydzaG93Qm9yZGVycyddLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gUERGVmlld2VyQXBwbGljYXRpb25PcHRpb25zO1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgIHRoaXMub3ZlcnJpZGVEZWZhdWx0U2V0dGluZ3MoKTtcbiAgICAgICAgICBjb25zdCB2aWV3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlld2VyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0JvcmRlcnMpIHtcbiAgICAgICAgICAgIHZpZXdlci5jbGFzc0xpc3QucmVtb3ZlKCdyZW1vdmVQYWdlQm9yZGVycycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aWV3ZXIuY2xhc3NMaXN0LmFkZCgncmVtb3ZlUGFnZUJvcmRlcnMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24ucGRmVmlld2VyKSB7XG4gICAgICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIucmVtb3ZlUGFnZUJvcmRlcnMgPSAhdGhpcy5zaG93Qm9yZGVycztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgem9vbUV2ZW50ID0ge1xuICAgICAgICAgICAgc291cmNlOiB2aWV3ZXIsXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgc2NhbGU6IChOdW1iZXIodGhpcy56b29tKSB8IDEwMCkgLyAxMDAsXG4gICAgICAgICAgICBwcmVzZXRWYWx1ZTogdGhpcy56b29tLFxuICAgICAgICAgIH0gYXMgU2NhbGVDaGFuZ2luZ0V2ZW50O1xuICAgICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLmV2ZW50QnVzLmRpc3BhdGNoKCdzY2FsZWNoYW5naW5nJywgem9vbUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgnc2hvd1VudmVyaWZpZWRTaWduYXR1cmVzJyBpbiBjaGFuZ2VzKSB7XG4gICAgICBpZiAoUERGVmlld2VyQXBwbGljYXRpb24/LnBkZkRvY3VtZW50KSB7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZkRvY3VtZW50Ll90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZCgnc2hvd1VudmVyaWZpZWRTaWduYXR1cmVzJywgdGhpcy5zaG93VW52ZXJpZmllZFNpZ25hdHVyZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgnZm9ybURhdGEnIGluIGNoYW5nZXMpIHtcbiAgICAgIGlmICghY2hhbmdlc1snZm9ybURhdGEnXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgdGhpcy5mb3JtU3VwcG9ydC51cGRhdGVGb3JtRmllbGRzSW5QZGZDYWxsZWRCeU5nT25DaGFuZ2VzKGNoYW5nZXNbJ2Zvcm1EYXRhJ10ucHJldmlvdXNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdlbmFibGVQcmludCcgaW4gY2hhbmdlcykge1xuICAgICAgaWYgKCFjaGFuZ2VzWydlbmFibGVQcmludCddLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5lbmFibGVQcmludCA9IHRoaXMuZW5hYmxlUHJpbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgICgnY3VzdG9tRmluZGJhcicgaW4gY2hhbmdlcyAmJiAhY2hhbmdlc1snY3VzdG9tRmluZGJhciddLmlzRmlyc3RDaGFuZ2UoKSkgfHxcbiAgICAgICgnY3VzdG9tRmluZGJhckJ1dHRvbnMnIGluIGNoYW5nZXMgJiYgIWNoYW5nZXNbJ2N1c3RvbUZpbmRiYXJCdXR0b25zJ10uaXNGaXJzdENoYW5nZSgpKSB8fFxuICAgICAgKCdjdXN0b21GaW5kYmFySW5wdXRBcmVhJyBpbiBjaGFuZ2VzICYmICFjaGFuZ2VzWydjdXN0b21GaW5kYmFySW5wdXRBcmVhJ10uaXNGaXJzdENoYW5nZSgpKSB8fFxuICAgICAgKCdjdXN0b21Ub29sYmFyJyBpbiBjaGFuZ2VzICYmICFjaGFuZ2VzWydjdXN0b21Ub29sYmFyJ10uaXNGaXJzdENoYW5nZSgpKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZHVtbXlDb21wb25lbnRzKSB7XG4gICAgICAgIHRoaXMuZHVtbXlDb21wb25lbnRzLmFkZE1pc3NpbmdTdGFuZGFyZFdpZGdldHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3BhZ2VWaWV3TW9kZScgaW4gY2hhbmdlcyAmJiAhY2hhbmdlc1sncGFnZVZpZXdNb2RlJ10uaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICB0aGlzLnBhZ2VWaWV3TW9kZSA9IGNoYW5nZXNbJ3BhZ2VWaWV3TW9kZSddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKCdyZXBsYWNlQnJvd3NlclByaW50JyBpbiBjaGFuZ2VzICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmRvUmVwbGFjZUJyb3dzZXJQcmludCh0aGlzLnJlcGxhY2VCcm93c2VyUHJpbnQpO1xuICAgIH1cbiAgICBpZiAoJ2Rpc2FibGVGb3JtcycgaW4gY2hhbmdlcykge1xuICAgICAgdGhpcy5lbmFibGVPckRpc2FibGVGb3Jtcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZmFsc2UpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2FsY1ZpZXdlclBvc2l0aW9uVG9wKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9zZURvY3VtZW50KFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24pIHtcbiAgICBpZiAodGhpcy5wYWdlVmlld01vZGUgPT09ICdib29rJykge1xuICAgICAgY29uc3QgUERGVmlld2VyQXBwbGljYXRpb246IElQREZWaWV3ZXJBcHBsaWNhdGlvbiA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbjtcbiAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uPy5wZGZWaWV3ZXI/LmRlc3Ryb3lCb29rTW9kZSgpO1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24/LnBkZlZpZXdlcj8uc3RvcFJlbmRlcmluZygpO1xuICAgICAgUERGVmlld2VyQXBwbGljYXRpb24/LnBkZlRodW1ibmFpbFZpZXdlcj8uc3RvcFJlbmRlcmluZygpO1xuICAgIH1cbiAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZEb2N1bWVudD8uYW5ub3RhdGlvblN0b3JhZ2U/LnJlc2V0TW9kaWZpZWQoKTtcbiAgICB0aGlzLmZvcm1TdXBwb3J0Py5yZXNldCgpO1xuXG4gICAgbGV0IGlucHV0RmllbGQgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5hcHBDb25maWc/Lm9wZW5GaWxlSW5wdXQ7XG4gICAgaWYgKCFpbnB1dEZpZWxkKSB7XG4gICAgICBpbnB1dEZpZWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZpbGVJbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgfVxuICAgIGlmIChpbnB1dEZpZWxkKSB7XG4gICAgICBpbnB1dEZpZWxkLnZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgYXdhaXQgUERGVmlld2VyQXBwbGljYXRpb24uY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0Wm9vbSgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjsgLy8gc2VydmVyIHNpZGUgcmVuZGVyaW5nXG4gICAgfVxuICAgIC8vIHNvbWV0aW1lcyBuZ09uQ2hhbmdlcyBjYWxscyB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIHBhZ2UgaXMgaW5pdGlhbGl6ZWQsXG4gICAgLy8gc28gbGV0J3MgY2hlY2sgaWYgdGhpcy5yb290IGlzIGFscmVhZHkgZGVmaW5lZFxuICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSB0aGlzLnBkZlNjcmlwdExvYWRlclNlcnZpY2UuUERGVmlld2VyQXBwbGljYXRpb247XG5cbiAgICAgIGxldCB6b29tQXNOdW1iZXIgPSB0aGlzLnpvb207XG4gICAgICBpZiAoU3RyaW5nKHpvb21Bc051bWJlcikuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICB6b29tQXNOdW1iZXIgPSBOdW1iZXIoU3RyaW5nKHpvb21Bc051bWJlcikucmVwbGFjZSgnJScsICcnKSkgLyAxMDA7XG4gICAgICB9IGVsc2UgaWYgKCFpc05hTihOdW1iZXIoem9vbUFzTnVtYmVyKSkpIHtcbiAgICAgICAgem9vbUFzTnVtYmVyID0gTnVtYmVyKHpvb21Bc051bWJlcikgLyAxMDA7XG4gICAgICB9XG4gICAgICBpZiAoIXpvb21Bc051bWJlcikge1xuICAgICAgICBpZiAoIVBERlZpZXdlckFwcGxpY2F0aW9uLnN0b3JlKSB7XG4gICAgICAgICAgLy8gSXQncyBkaWZmaWN1bHQgdG8gcHJldmVudCBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvIGVhcmx5LCBzbyB3ZSBuZWVkIHRoaXMgY2hlY2suXG4gICAgICAgICAgLy8gc2V0Wm9vbSgpIGlzIGNhbGxlZCBsYXRlciBhZ2Fpbiwgd2hlbiB0aGUgUERGIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCBhbmQgaXRzXG4gICAgICAgICAgLy8gZmluZ2VycHJpbnQgaGFzIGJlZW4gY2FsY3VsYXRlZC5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB1c2VyU2V0dGluZyA9IGF3YWl0IFBERlZpZXdlckFwcGxpY2F0aW9uLnN0b3JlLmdldCgnem9vbScpO1xuICAgICAgICAgIGlmICh1c2VyU2V0dGluZykge1xuICAgICAgICAgICAgaWYgKCFpc05hTihOdW1iZXIodXNlclNldHRpbmcpKSkge1xuICAgICAgICAgICAgICB6b29tQXNOdW1iZXIgPSBOdW1iZXIodXNlclNldHRpbmcpIC8gMTAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgem9vbUFzTnVtYmVyID0gdXNlclNldHRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHpvb21Bc051bWJlciA9ICdhdXRvJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9uczogSVBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucyA9IHRoaXMucGRmU2NyaXB0TG9hZGVyU2VydmljZS5QREZWaWV3ZXJBcHBsaWNhdGlvbk9wdGlvbnM7XG4gICAgICAgIFBERlZpZXdlckFwcGxpY2F0aW9uT3B0aW9ucy5zZXQoJ2RlZmF1bHRab29tVmFsdWUnLCB6b29tQXNOdW1iZXIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY2FsZURyb3Bkb3duRmllbGQgPSAodGhpcy5yb290Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoJyNzY2FsZVNlbGVjdCcpIGFzIEhUTUxTZWxlY3RFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHNjYWxlRHJvcGRvd25GaWVsZCkge1xuICAgICAgICBpZiAodGhpcy56b29tID09PSAnYXV0bycgfHwgdGhpcy56b29tID09PSAncGFnZS1maXQnIHx8IHRoaXMuem9vbSA9PT0gJ3BhZ2UtYWN0dWFsJyB8fCB0aGlzLnpvb20gPT09ICdwYWdlLXdpZHRoJykge1xuICAgICAgICAgIHNjYWxlRHJvcGRvd25GaWVsZC52YWx1ZSA9IHRoaXMuem9vbTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2FsZURyb3Bkb3duRmllbGQudmFsdWUgPSAnY3VzdG9tJztcbiAgICAgICAgICBpZiAoc2NhbGVEcm9wZG93bkZpZWxkLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHNjYWxlRHJvcGRvd25GaWVsZC5vcHRpb25zIGFzIGFueSkge1xuICAgICAgICAgICAgICBpZiAob3B0aW9uLnZhbHVlID09PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IGAke01hdGgucm91bmQoTnVtYmVyKHpvb21Bc051bWJlcikgKiAxMDBfMDAwKSAvIDEwMDB9JWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlcikge1xuICAgICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIuY3VycmVudFNjYWxlVmFsdWUgPSB6b29tQXNOdW1iZXIgPz8gJ2F1dG8nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0UmVzaXplT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZpZXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3ZXInKTtcbiAgICAgIGlmICh2aWV3ZXIpIHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHZpZXdlcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICBjb25zb2xlLmxvZygnUmVzaXplT2JzZXJ2ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXInKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG9uUmVzaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IHBkZlZpZXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2h0bWwnKTtcbiAgICBpZiAocGRmVmlld2VyICYmIHBkZlZpZXdlci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3V0ZXJDb250YWluZXInKTtcbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Vjb25kYXJ5VG9vbGJhckNvbXBvbmVudCkge1xuICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5VG9vbGJhckNvbXBvbmVudC5jaGVja1Zpc2liaWxpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5keW5hbWljQ1NTQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5keW5hbWljQ1NTQ29tcG9uZW50LnVwZGF0ZVRvb2xiYXJXaWR0aCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmR5bmFtaWNDU1NDb21wb25lbnQuY2hlY2tIZWlnaHQodGhpcywgdGhpcy5sb2dMZXZlbCk7XG4gICAgfVxuICAgIHRoaXMuZHluYW1pY0NTU0NvbXBvbmVudC5yZW1vdmVTY3JvbGxiYXJJbkluZmluaXRlU2Nyb2xsTW9kZShmYWxzZSwgdGhpcy5wYWdlVmlld01vZGUsIHRoaXMucHJpbWFyeU1lbnVWaXNpYmxlLCB0aGlzLCB0aGlzLmxvZ0xldmVsKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NvbnRleHRtZW51JylcbiAgcHVibGljIG9uQ29udGV4dE1lbnUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnVBbGxvd2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwYWdlSGFzVmlzaWJsZVNpZ25hdHVyZShwYWdlOiBQREZQYWdlUHJveHkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IHBhZ2UuZ2V0QW5ub3RhdGlvbnMoKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhbm5vdGF0aW9ucy5maW5kKChhKSA9PiBhLmZpZWxkVHlwZSA9PT0gJ1NpZycpO1xuICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBzaWduYXR1cmU/LnJlY3Q7XG4gICAgICBpZiAocmVjdCAmJiByZWN0Lmxlbmd0aCA9PT0gNCAmJiByZWN0WzJdIC0gcmVjdFswXSA+IDAgJiYgcmVjdFszXSAtIHJlY3RbMV0gPiAwICYmICFzaWduYXR1cmUuaGlkZGVuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2Nyb2xsU2lnbmF0dXJlV2FybmluZ0ludG9WaWV3KHBkZjogUERGRG9jdW1lbnRQcm94eSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8qKiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBpbnNwaXJlZCBieSBodHRwczovL21lZGl1bS5jb20vZmFjdG9yeS1taW5kL2FuZ3VsYXItcGRmLWZvcm1zLWZhNzJiMTVjM2ZiZC4gVGhhbmtzLCBKb25ueSBGb3ghICovXG4gICAgdGhpcy5oYXNTaWduYXR1cmUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHBkZj8ubnVtUGFnZXM7IGkrKykge1xuICAgICAgLy8gdHJhY2sgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBkZi5nZXRQYWdlKGkpO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5wYWdlSGFzVmlzaWJsZVNpZ25hdHVyZShwYWdlKSkge1xuICAgICAgICB0aGlzLmhhc1NpZ25hdHVyZSA9IHRydWU7XG4gICAgICAgIGJyZWFrOyAvLyBzdG9wIGxvb3BpbmcgdGhyb3VnaCB0aGUgcGFnZXMgYXMgc29vbiBhcyB3ZSBmaW5kIGEgc2lnbmF0dXJlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1NpZ25hdHVyZSkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAvLyBEZWZlciBzY3JvbGxpbmcgdG8gZW5zdXJlIGl0IGhhcHBlbnMgYWZ0ZXIgYW55IG90aGVyIFVJIHVwZGF0ZXNcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgdmlld2VyQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlckNvbnRhaW5lcicpO1xuICAgICAgICAgIHZpZXdlckNvbnRhaW5lcj8uc2Nyb2xsQnkoMCwgLTMyKTsgLy8gQWRqdXN0IHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgem9vbVRvUGFnZVdpZHRoKGV2ZW50OiBNb3VzZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaGFuZFRvb2wpIHtcbiAgICAgIGlmICghcGRmRGVmYXVsdE9wdGlvbnMuZG91YmxlVGFwWm9vbXNJbkhhbmRNb2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFwZGZEZWZhdWx0T3B0aW9ucy5kb3VibGVUYXBab29tc0luVGV4dFNlbGVjdGlvbk1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFnZVZpZXdNb2RlID09PSAnYm9vaycpIHtcbiAgICAgIC8vIHNjYWxpbmcgZG9lc24ndCB3b3JrIGluIGJvb2sgbW9kZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gdGhpcy5wZGZTY3JpcHRMb2FkZXJTZXJ2aWNlLlBERlZpZXdlckFwcGxpY2F0aW9uO1xuICAgIGNvbnN0IGRlc2lyZWRDZW50ZXJZID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBwcmV2aW91c1NjYWxlID0gKFBERlZpZXdlckFwcGxpY2F0aW9uLnBkZlZpZXdlciBhcyBhbnkpLmN1cnJlbnRTY2FsZTtcblxuICAgIGlmICh0aGlzLnpvb20gIT09IHBkZkRlZmF1bHRPcHRpb25zLmRvdWJsZVRhcFpvb21GYWN0b3IgJiYgdGhpcy56b29tICsgJyUnICE9PSBwZGZEZWZhdWx0T3B0aW9ucy5kb3VibGVUYXBab29tRmFjdG9yKSB7XG4gICAgICB0aGlzLnByZXZpb3VzWm9vbSA9IHRoaXMuem9vbTtcbiAgICAgIHRoaXMuem9vbSA9IHBkZkRlZmF1bHRPcHRpb25zLmRvdWJsZVRhcFpvb21GYWN0b3I7IC8vIGJ5IGRlZmF1bHQ6ICdwYWdlLXdpZHRoJztcbiAgICAgIGF3YWl0IHRoaXMuc2V0Wm9vbSgpO1xuICAgIH0gZWxzZSBpZiAocGRmRGVmYXVsdE9wdGlvbnMuZG91YmxlVGFwUmVzZXRzWm9vbU9uU2Vjb25kRG91YmxlVGFwKSB7XG4gICAgICBpZiAodGhpcy5wcmV2aW91c1pvb20pIHtcbiAgICAgICAgdGhpcy56b29tID0gdGhpcy5wcmV2aW91c1pvb207XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnpvb20gPSAncGFnZS13aWR0aCc7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnNldFpvb20oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRTY2FsZSA9IChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIgYXMgYW55KS5jdXJyZW50U2NhbGU7XG4gICAgY29uc3Qgc2NhbGVDb3JyZWN0aW9uRmFjdG9yID0gY3VycmVudFNjYWxlIC8gcHJldmlvdXNTY2FsZSAtIDE7XG4gICAgY29uc3QgcmVjdCA9IChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIgYXMgYW55KS5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZHkgPSBkZXNpcmVkQ2VudGVyWSAtIHJlY3QudG9wO1xuICAgIChQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZWaWV3ZXIgYXMgYW55KS5jb250YWluZXIuc2Nyb2xsVG9wICs9IGR5ICogc2NhbGVDb3JyZWN0aW9uRmFjdG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVPckRpc2FibGVGb3JtcyhkaXY6IEhUTUxFbGVtZW50LCBkb05vdEVuYWJsZTogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5kaXNhYmxlRm9ybXMgJiYgZG9Ob3RFbmFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeGZhTGF5ZXJzID0gQXJyYXkuZnJvbShkaXYucXVlcnlTZWxlY3RvckFsbCgnLnhmYUxheWVyJykpO1xuICAgIGNvbnN0IGFjcm9Gb3JtTGF5ZXJzID0gQXJyYXkuZnJvbShkaXYucXVlcnlTZWxlY3RvckFsbCgnLmFubm90YXRpb25MYXllcicpKTtcbiAgICBjb25zdCBsYXllcnMgPSB4ZmFMYXllcnMuY29uY2F0KC4uLmFjcm9Gb3JtTGF5ZXJzKTtcbiAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IGxheWVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0JykuZm9yRWFjaCgoeCkgPT4gKHguZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVGb3JtcykpKTtcbiAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IGxheWVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpLmZvckVhY2goKHgpID0+ICh4LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRm9ybXMpKSk7XG4gICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiBsYXllci5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYScpLmZvckVhY2goKHgpID0+ICh4LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRm9ybXMpKSk7XG4gIH1cbn1cbiIsIkBpZiAodGhlbWUgPT09ICdkYXJrJykge1xuICA8cGRmLWRhcmstdGhlbWU+PC9wZGYtZGFyay10aGVtZT5cbn1cbkBpZiAodGhlbWUgPT09ICdsaWdodCcpIHtcbiAgPHBkZi1saWdodC10aGVtZT48L3BkZi1saWdodC10aGVtZT5cbn1cbjxwZGYtYWNyb2Zvcm0tZGVmYXVsdC10aGVtZT48L3BkZi1hY3JvZm9ybS1kZWZhdWx0LXRoZW1lPlxuXG48cGRmLWR5bmFtaWMtY3NzXG4gICNEeW5hbWljQ3NzQ29tcG9uZW50XG4gIFt6b29tXT1cIm1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlXCJcbj48L3BkZi1keW5hbWljLWNzcz5cbjxuZy1jb250ZW50ICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tUGRmVmlld2VyID8gY3VzdG9tUGRmVmlld2VyIDogZGVmYXVsdFBkZlZpZXdlclwiPjwvbmctY29udGVudD5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0UGRmVmlld2VyPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ6b29tXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cIm1pbkhlaWdodCA/IG1pbkhlaWdodCA6IGhlaWdodFwiXG4gICAgI3Jvb3RcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJodG1sXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYm9keSBwZGYtanMtdmVyc2lvbi17eyBtYWpvck1pbm9yUGRmSnNWZXJzaW9uIH19XCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJiYWNrZ3JvdW5kQ29sb3JcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGlkPVwib3V0ZXJDb250YWluZXJcIj5cbiAgICAgICAgICBAaWYgKHNob3dGcmVlRmxvYXRpbmdCYXIpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcmVlLWZsb2F0aW5nLWJhclwiPlxuICAgICAgICAgICAgICA8bmctY29udGVudCAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUZyZWVGbG9hdGluZ0JhciA/IGN1c3RvbUZyZWVGbG9hdGluZ0JhciA6IGRlZmF1bHRGcmVlRmxvYXRpbmdCYXJcIj4gPC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxwZGYtc2lkZWJhclxuICAgICAgICAgICAgI3BkZnNpZGViYXJcbiAgICAgICAgICAgIFtzaWRlYmFyVmlzaWJsZV09XCJzaWRlYmFyVmlzaWJsZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbc2hvd1NpZGViYXJCdXR0b25dPVwic2hvd1NpZGViYXJCdXR0b25cIlxuICAgICAgICAgICAgW2N1c3RvbVNpZGViYXJdPVwiY3VzdG9tU2lkZWJhclwiXG4gICAgICAgICAgICBbY3VzdG9tVGh1bWJuYWlsXT1cImN1c3RvbVRodW1ibmFpbFwiXG4gICAgICAgICAgICAodGh1bWJuYWlsRHJhd24pPVwidGh1bWJuYWlsRHJhd24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFttb2JpbGVGcmllbmRseVpvb21TY2FsZV09XCJtb2JpbGVGcmllbmRseVpvb21TY2FsZVwiXG4gICAgICAgICAgICBbc2lkZWJhclBvc2l0aW9uVG9wXT1cInNpZGViYXJQb3NpdGlvblRvcFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvcGRmLXNpZGViYXI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgaWQ9XCJtYWluQ29udGFpbmVyXCJcbiAgICAgICAgICAgIFtjbGFzcy50b29sYmFyLWhpZGRlbl09XCIhcHJpbWFyeU1lbnVWaXNpYmxlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGRmLWR1bW15LWNvbXBvbmVudHM+PC9wZGYtZHVtbXktY29tcG9uZW50cz5cblxuICAgICAgICAgICAgPHBkZi10b29sYmFyXG4gICAgICAgICAgICAgIChvblRvb2xiYXJMb2FkZWQpPVwib25Ub29sYmFyTG9hZGVkKCRldmVudClcIlxuICAgICAgICAgICAgICBbc2lkZWJhclZpc2libGVdPVwic2lkZWJhclZpc2libGVcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VydmVyLXNpZGUtcmVuZGVyaW5nXT1cInNlcnZlclNpZGVSZW5kZXJpbmdcIlxuICAgICAgICAgICAgICBbY3VzdG9tVG9vbGJhcl09XCJjdXN0b21Ub29sYmFyXCJcbiAgICAgICAgICAgICAgW21vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlXT1cIm1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlXCJcbiAgICAgICAgICAgICAgWyhwYWdlVmlld01vZGUpXT1cInBhZ2VWaWV3TW9kZVwiXG4gICAgICAgICAgICAgIFtwcmltYXJ5TWVudVZpc2libGVdPVwicHJpbWFyeU1lbnVWaXNpYmxlXCJcbiAgICAgICAgICAgICAgW3Njcm9sbE1vZGVdPVwic2Nyb2xsTW9kZSA/PyAwXCJcbiAgICAgICAgICAgICAgW3Nob3dQcm9wZXJ0aWVzQnV0dG9uXT1cInNob3dQcm9wZXJ0aWVzQnV0dG9uXCJcbiAgICAgICAgICAgICAgW3Nob3dCb29rTW9kZUJ1dHRvbl09XCJzaG93Qm9va01vZGVCdXR0b25cIlxuICAgICAgICAgICAgICBbc2hvd0Rvd25sb2FkQnV0dG9uXT1cInNob3dEb3dubG9hZEJ1dHRvblwiXG4gICAgICAgICAgICAgIFtzaG93RHJhd0VkaXRvcl09XCJzaG93RHJhd0VkaXRvclwiXG4gICAgICAgICAgICAgIFtzaG93SGlnaGxpZ2h0RWRpdG9yXT1cInNob3dIaWdobGlnaHRFZGl0b3JcIlxuICAgICAgICAgICAgICBbc2hvd0ZpbmRCdXR0b25dPVwic2hvd0ZpbmRCdXR0b25cIlxuICAgICAgICAgICAgICBbc2hvd0hhbmRUb29sQnV0dG9uXT1cInNob3dIYW5kVG9vbEJ1dHRvblwiXG4gICAgICAgICAgICAgIFtoYW5kVG9vbF09XCJoYW5kVG9vbFwiXG4gICAgICAgICAgICAgIFtzaG93SG9yaXpvbnRhbFNjcm9sbEJ1dHRvbl09XCJzaG93SG9yaXpvbnRhbFNjcm9sbEJ1dHRvblwiXG4gICAgICAgICAgICAgIFtzaG93SW5maW5pdGVTY3JvbGxCdXR0b25dPVwic2hvd0luZmluaXRlU2Nyb2xsQnV0dG9uXCJcbiAgICAgICAgICAgICAgW3Nob3dPcGVuRmlsZUJ1dHRvbl09XCJzaG93T3BlbkZpbGVCdXR0b25cIlxuICAgICAgICAgICAgICBbc2hvd01vdmVQYWdlQnV0dG9uXT1cInNob3dNb3ZlUGFnZUJ1dHRvblwiXG4gICAgICAgICAgICAgIFtzaG93UGFnaW5nQnV0dG9uc109XCJzaG93UGFnaW5nQnV0dG9uc1wiXG4gICAgICAgICAgICAgIFtzaG93Rmlyc3RBbmRMYXN0UGFnZUJ1dHRvbnNdPVwic2hvd0ZpcnN0QW5kTGFzdFBhZ2VCdXR0b25zXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmV2aW91c0FuZE5leHRQYWdlQnV0dG9uc109XCJzaG93UHJldmlvdXNBbmROZXh0UGFnZUJ1dHRvbnNcIlxuICAgICAgICAgICAgICBbc2hvd1BhZ2VOdW1iZXJdPVwic2hvd1BhZ2VOdW1iZXJcIlxuICAgICAgICAgICAgICBbc2hvd1BhZ2VMYWJlbF09XCJzaG93UGFnZUxhYmVsXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmVzZW50YXRpb25Nb2RlQnV0dG9uXT1cInNob3dQcmVzZW50YXRpb25Nb2RlQnV0dG9uICYmIHBhZ2VWaWV3TW9kZSAhPT0gJ2Jvb2snXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmludEJ1dHRvbl09XCJlbmFibGVQcmludCA/IHNob3dQcmludEJ1dHRvbiA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dSb3RhdGVDd0J1dHRvbl09XCJzaG93Um90YXRlQ3dCdXR0b25cIlxuICAgICAgICAgICAgICBbc2hvd1JvdGF0ZUNjd0J1dHRvbl09XCJzaG93Um90YXRlQ2N3QnV0dG9uXCJcbiAgICAgICAgICAgICAgW3Nob3dTZWNvbmRhcnlUb29sYmFyQnV0dG9uXT1cInNob3dTZWNvbmRhcnlUb29sYmFyQnV0dG9uICYmICFzZXJ2aWNlLnNlY29uZGFyeU1lbnVJc0VtcHR5XCJcbiAgICAgICAgICAgICAgW3Nob3dTaWRlYmFyQnV0dG9uXT1cInNob3dTaWRlYmFyQnV0dG9uXCJcbiAgICAgICAgICAgICAgW3Nob3dTaW5nbGVQYWdlTW9kZUJ1dHRvbl09XCJzaG93U2luZ2xlUGFnZU1vZGVCdXR0b25cIlxuICAgICAgICAgICAgICBbc2hvd1NpZ25hdHVyZUVkaXRvcl09XCJlbmFibGVTaWduYXR1cmVFZGl0b3IgPyBzaG93U2lnbmF0dXJlRWRpdG9yIDogZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd1NwcmVhZEJ1dHRvbl09XCJzaG93U3ByZWFkQnV0dG9uXCJcbiAgICAgICAgICAgICAgW3Nob3dTdGFtcEVkaXRvcl09XCJzaG93U3RhbXBFZGl0b3JcIlxuICAgICAgICAgICAgICBbc2hvd1RleHRFZGl0b3JdPVwic2hvd1RleHRFZGl0b3JcIlxuICAgICAgICAgICAgICBbc2hvd1ZlcnRpY2FsU2Nyb2xsQnV0dG9uXT1cInNob3dWZXJ0aWNhbFNjcm9sbEJ1dHRvblwiXG4gICAgICAgICAgICAgIFtzaG93V3JhcHBlZFNjcm9sbEJ1dHRvbl09XCJzaG93V3JhcHBlZFNjcm9sbEJ1dHRvblwiXG4gICAgICAgICAgICAgIFtzaG93Wm9vbUJ1dHRvbnNdPVwic2hvd1pvb21CdXR0b25zXCJcbiAgICAgICAgICAgICAgW3Nob3dab29tRHJvcGRvd25dPVwic2hvd1pvb21Ecm9wZG93blwiXG4gICAgICAgICAgICAgIFtzcHJlYWRdPVwic3ByZWFkXCJcbiAgICAgICAgICAgICAgW3RleHRMYXllcl09XCJ0ZXh0TGF5ZXJcIlxuICAgICAgICAgICAgICBbdG9vbGJhck1hcmdpblRvcF09XCJ0b29sYmFyTWFyZ2luVG9wXCJcbiAgICAgICAgICAgICAgW3Rvb2xiYXJXaWR0aF09XCJ0b29sYmFyV2lkdGhcIlxuICAgICAgICAgICAgICBbem9vbUxldmVsc109XCJ6b29tTGV2ZWxzXCJcbiAgICAgICAgICAgICAgW2ZpbmRiYXJWaXNpYmxlXT1cImZpbmRiYXJWaXNpYmxlXCJcbiAgICAgICAgICAgICAgW2hhc1RleHRMYXllcl09XCJoYXNUZXh0TGF5ZXJcIlxuICAgICAgICAgICAgPjwvcGRmLXRvb2xiYXI+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JQYXJhbXNUb29sYmFyIGhpZGRlbiBkb29ySGFuZ2VyUmlnaHQgbWVudVwiXG4gICAgICAgICAgICAgIGlkPVwiZWRpdG9yU2lnbmF0dXJlUGFyYW1zVG9vbGJhclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cImFkZFNpZ25hdHVyZURvb3JIYW5nZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWVudUNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJlZ2lvblwiXG4gICAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLWFkZC1zaWduYXR1cmUtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdG9yU2lnbmF0dXJlQWRkU2lnbmF0dXJlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9vbGJhckJ1dHRvbiBsYWJlbGVkXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtbDEwbi1pZD1cInBkZmpzLWVkaXRvci1zaWduYXR1cmUtYWRkLXNpZ25hdHVyZS1idXR0b25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbDEwbi1pZD1cInBkZmpzLWVkaXRvci1zaWduYXR1cmUtYWRkLXNpZ25hdHVyZS1idXR0b24tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRvclBhcmFtc0xhYmVsXCJcbiAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZWRpdG9yUGFyYW1zVG9vbGJhciBoaWRkZW4gZG9vckhhbmdlclJpZ2h0XCJcbiAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JIaWdobGlnaHRQYXJhbXNUb29sYmFyXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnRyYW5zZm9ybV09XCInc2NhbGUoJyArIG1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlICsgJyknXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGlkPVwiaGlnaGxpZ2h0UGFyYW1zVG9vbGJhckNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JQYXJhbXNUb29sYmFyQ29udGFpbmVyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdG9ySGlnaGxpZ2h0Q29sb3JQaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2xvclBpY2tlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJoaWdobGlnaHRDb2xvclBpY2tlckxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JQYXJhbXNMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbDEwbi1pZD1cInBkZmpzLWVkaXRvci1oaWdobGlnaHQtY29sb3JwaWNrZXItbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICA+SGlnaGxpZ2h0IGNvbG9yPC9zcGFuXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImVkaXRvckhpZ2hsaWdodFRoaWNrbmVzc1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cImVkaXRvckZyZWVIaWdobGlnaHRUaGlja25lc3NcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRvclBhcmFtc0xhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLWZyZWUtaGlnaGxpZ2h0LXRoaWNrbmVzcy1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgID5UaGlja25lc3M8L2xhYmVsXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhpY2tuZXNzUGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JGcmVlSGlnaGxpZ2h0VGhpY2tuZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRvclBhcmFtc1NsaWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLWZyZWUtaGlnaGxpZ2h0LXRoaWNrbmVzcy10aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIxMlwiXG4gICAgICAgICAgICAgICAgICAgICAgbWluPVwiOFwiXG4gICAgICAgICAgICAgICAgICAgICAgbWF4PVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJlZGl0b3JIaWdobGlnaHRWaXNpYmlsaXR5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgZm9yPVwiZWRpdG9ySGlnaGxpZ2h0U2hvd0FsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JQYXJhbXNMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLWhpZ2hsaWdodC1zaG93LWFsbC1idXR0b24tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgID5TaG93IGFsbDwvbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JIaWdobGlnaHRTaG93QWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbDEwbi1pZD1cInBkZmpzLWVkaXRvci1oaWdobGlnaHQtc2hvdy1hbGwtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLXByZXNzZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JQYXJhbXNUb29sYmFyIGhpZGRlbiBkb29ySGFuZ2VyUmlnaHRcIlxuICAgICAgICAgICAgICBpZD1cImVkaXRvckZyZWVUZXh0UGFyYW1zVG9vbGJhclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZXJ2ZXItc2lkZS1yZW5kZXJpbmddPVwic2VydmVyU2lkZVJlbmRlcmluZ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3NjYWxlKCcgKyBtb2JpbGVGcmllbmRseVpvb21TY2FsZSArICcpJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0b3JQYXJhbXNUb29sYmFyQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXRvclBhcmFtc1NldHRlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cImVkaXRvckZyZWVUZXh0Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRvclBhcmFtc0xhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLWZyZWUtdGV4dC1jb2xvci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgID5Gb250IENvbG9yPC9sYWJlbFxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdG9yRnJlZVRleHRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdG9yUGFyYW1zQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yUGFyYW1zU2V0dGVyXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgZm9yPVwiZWRpdG9yRnJlZVRleHRGb250U2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdG9yUGFyYW1zTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWwxMG4taWQ9XCJwZGZqcy1lZGl0b3ItZnJlZS10ZXh0LXNpemUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICA+Rm9udCBTaXplPC9sYWJlbFxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdG9yRnJlZVRleHRGb250U2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdG9yUGFyYW1zU2xpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgIG1pbj1cIjVcIlxuICAgICAgICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZWRpdG9yUGFyYW1zVG9vbGJhciBoaWRkZW4gZG9vckhhbmdlclJpZ2h0XCJcbiAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JTdGFtcFBhcmFtc1Rvb2xiYXJcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cIidzY2FsZSgnICsgbW9iaWxlRnJpZW5kbHlab29tU2NhbGUgKyAnKSdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yUGFyYW1zVG9vbGJhckNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdG9yU3RhbXBBZGRJbWFnZVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNlY29uZGFyeVRvb2xiYXJCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLXN0YW1wLWFkZC1pbWFnZS1idXR0b25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGlnbi1pbWFnZS10by10ZXh0XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMDA0ODggOS43NVYxNEM3LjAwNDg4IDE0LjE2NTggNy4wNzA3MyAxNC4zMjQ3IDcuMTg3OTQgMTQuNDQxOUM3LjMwNTE1IDE0LjU1OTIgNy40NjQxMiAxNC42MjUgNy42Mjk4OCAxNC42MjVDNy43OTU2NCAxNC42MjUgNy45NTQ2MSAxNC41NTkyIDguMDcxODMgMTQuNDQxOUM4LjE4OTA0IDE0LjMyNDcgOC4yNTQ4OCAxNC4xNjU4IDguMjU0ODggMTRWOS43NUw4Ljc1NDg4IDkuMjVIMTMuMDA0OUMxMy4xNzA2IDkuMjUgMTMuMzI5NiA5LjE4NDE1IDEzLjQ0NjggOS4wNjY5NEMxMy41NjQgOC45NDk3MyAxMy42Mjk5IDguNzkwNzYgMTMuNjI5OSA4LjYyNUMxMy42Mjk5IDguNDU5MjQgMTMuNTY0IDguMzAwMjcgMTMuNDQ2OCA4LjE4MzA2QzEzLjMyOTYgOC4wNjU4NSAxMy4xNzA2IDggMTMuMDA0OSA4SDguNzU0ODhMOC4yNTQ4OCA3LjVWMy4yNUM4LjI1NDg4IDMuMDg0MjQgOC4xODkwNCAyLjkyNTI3IDguMDcxODMgMi44MDgwNkM3Ljk1NDYxIDIuNjkwODUgNy43OTU2NCAyLjYyNSA3LjYyOTg4IDIuNjI1QzcuNDY0MTIgMi42MjUgNy4zMDUxNSAyLjY5MDg1IDcuMTg3OTQgMi44MDgwNkM3LjA3MDczIDIuOTI1MjcgNy4wMDQ4OCAzLjA4NDI0IDcuMDA0ODggMy4yNVY3LjVMNi41MDQ4OCA4SDIuMjU0ODhDMi4wODkxMiA4IDEuOTMwMTUgOC4wNjU4NSAxLjgxMjk0IDguMTgzMDZDMS42OTU3MyA4LjMwMDI3IDEuNjI5ODggOC40NTkyNCAxLjYyOTg4IDguNjI1QzEuNjI5ODggOC43OTA3NiAxLjY5NTczIDguOTQ5NzMgMS44MTI5NCA5LjA2Njk0QzEuOTMwMTUgOS4xODQxNSAyLjA4OTEyIDkuMjUgMi4yNTQ4OCA5LjI1SDYuMzkxODhMNy4wMDQ4OCA5Ljc1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImJsYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLXN0YW1wLWFkZC1pbWFnZS1idXR0b24tbGFiZWxcIj5BZGQgaW1hZ2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JQYXJhbXNUb29sYmFyIGhpZGRlbiBkb29ySGFuZ2VyUmlnaHRcIlxuICAgICAgICAgICAgICBpZD1cImVkaXRvcklua1BhcmFtc1Rvb2xiYXJcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cIidzY2FsZSgnICsgbW9iaWxlRnJpZW5kbHlab29tU2NhbGUgKyAnKSdcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VydmVyLXNpZGUtcmVuZGVyaW5nXT1cInNlcnZlclNpZGVSZW5kZXJpbmdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yUGFyYW1zVG9vbGJhckNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0b3JQYXJhbXNTZXR0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJlZGl0b3JJbmtDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdG9yUGFyYW1zTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWwxMG4taWQ9XCJwZGZqcy1lZGl0b3ItaW5rLWNvbG9yLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgPkNvbG9yPC9sYWJlbFxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZWRpdG9ySW5rQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRvclBhcmFtc0NvbG9yXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXRvclBhcmFtc1NldHRlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cImVkaXRvcklua1RoaWNrbmVzc1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdG9yUGFyYW1zTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWwxMG4taWQ9XCJwZGZqcy1lZGl0b3ItaW5rLXRoaWNrbmVzcy1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgID5UaGlja25lc3M8L2xhYmVsXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JJbmtUaGlja25lc3NcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRvclBhcmFtc1NsaWRlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgIG1pbj1cIjFcIlxuICAgICAgICAgICAgICAgICAgICBtYXg9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXRvclBhcmFtc1NldHRlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGZvcj1cImVkaXRvcklua09wYWNpdHlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVkaXRvclBhcmFtc0xhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLWluay1vcGFjaXR5LWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgPk9wYWNpdHk8L2xhYmVsXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JJbmtPcGFjaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0b3JQYXJhbXNTbGlkZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICBtaW49XCIwLjA1XCJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA9XCIwLjA1XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxwZGYtc2Vjb25kYXJ5LXRvb2xiYXJcbiAgICAgICAgICAgICAgI3BkZlNlY29uZGFyeVRvb2xiYXJDb21wb25lbnRcbiAgICAgICAgICAgICAgW2NsYXNzLnNlcnZlci1zaWRlLXJlbmRlcmluZ109XCJzZXJ2ZXJTaWRlUmVuZGVyaW5nXCJcbiAgICAgICAgICAgICAgW2N1c3RvbVNlY29uZGFyeVRvb2xiYXJdPVwiY3VzdG9tU2Vjb25kYXJ5VG9vbGJhclwiXG4gICAgICAgICAgICAgIFtzZWNvbmRhcnlUb29sYmFyVG9wXT1cInNlY29uZGFyeVRvb2xiYXJUb3BcIlxuICAgICAgICAgICAgICBbbW9iaWxlRnJpZW5kbHlab29tU2NhbGVdPVwibW9iaWxlRnJpZW5kbHlab29tU2NhbGVcIlxuICAgICAgICAgICAgICAoc3ByZWFkQ2hhbmdlKT1cIm9uU3ByZWFkQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBbbG9jYWxpemF0aW9uSW5pdGlhbGl6ZWRdPVwibG9jYWxpemF0aW9uSW5pdGlhbGl6ZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9wZGYtc2Vjb25kYXJ5LXRvb2xiYXI+XG5cbiAgICAgICAgICAgIDxwZGYtZmluZGJhclxuICAgICAgICAgICAgICBbY2xhc3Muc2VydmVyLXNpZGUtcmVuZGVyaW5nXT1cInNlcnZlclNpZGVSZW5kZXJpbmdcIlxuICAgICAgICAgICAgICBbZmluZGJhckxlZnRdPVwiZmluZGJhckxlZnRcIlxuICAgICAgICAgICAgICBbZmluZGJhclRvcF09XCJmaW5kYmFyVG9wXCJcbiAgICAgICAgICAgICAgW21vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlXT1cIm1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlXCJcbiAgICAgICAgICAgICAgW3Nob3dGaW5kQnV0dG9uXT1cInNob3dGaW5kQnV0dG9uIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUZpbmRiYXJJbnB1dEFyZWFdPVwiY3VzdG9tRmluZGJhcklucHV0QXJlYVwiXG4gICAgICAgICAgICAgIFtjdXN0b21GaW5kYmFyQnV0dG9uc109XCJjdXN0b21GaW5kYmFyQnV0dG9uc1wiXG4gICAgICAgICAgICAgIFtzaG93RmluZEVudGlyZVdvcmRdPVwic2hvd0ZpbmRFbnRpcmVXb3JkXCJcbiAgICAgICAgICAgICAgW3Nob3dGaW5kSGlnaGxpZ2h0QWxsXT1cInNob3dGaW5kSGlnaGxpZ2h0QWxsXCJcbiAgICAgICAgICAgICAgW3Nob3dGaW5kTWF0Y2hEaWFjcml0aWNzXT1cInNob3dGaW5kTWF0Y2hEaWFjcml0aWNzXCJcbiAgICAgICAgICAgICAgW3Nob3dGaW5kTWF0Y2hDYXNlXT1cInNob3dGaW5kTWF0Y2hDYXNlXCJcbiAgICAgICAgICAgICAgW3Nob3dGaW5kTXVsdGlwbGVdPVwic2hvd0ZpbmRNdWx0aXBsZVwiXG4gICAgICAgICAgICAgIFtzaG93RmluZFJlZ2V4cF09XCJzaG93RmluZFJlZ2V4cFwiXG4gICAgICAgICAgICAgIFtzaG93RmluZE1lc3NhZ2VzXT1cInNob3dGaW5kTWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbc2hvd0ZpbmRSZXN1bHRzQ291bnRdPVwic2hvd0ZpbmRSZXN1bHRzQ291bnRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9wZGYtZmluZGJhcj5cblxuICAgICAgICAgICAgPHBkZi1jb250ZXh0LW1lbnU+PC9wZGYtY29udGV4dC1tZW51PlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGlkPVwidmlld2VyQ29udGFpbmVyXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnRvcF09XCJ2aWV3ZXJQb3NpdGlvblRvcFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGlmIChoYXNTaWduYXR1cmUgJiYgc2hvd1VudmVyaWZpZWRTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVudmVyaWZpZWQtc2lnbmF0dXJlLXdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICd1bnZlcmlmaWVkLXNpZ25hdHVyZS13YXJuaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiVGhpcyBQREYgZmlsZSBjb250YWlucyBhIGRpZ2l0YWwgc2lnbmF0dXJlLiBUaGUgUERGIHZpZXdlciBjYW4ndCB2ZXJpZnkgaWYgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZC5cbiAgICAgICAgICAgICAgICBQbGVhc2UgZG93bmxvYWQgdGhlIGZpbGUgYW5kIG9wZW4gaXQgaW4gQWNyb2JhdCBSZWFkZXIgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgaXMgdmFsaWQuXCJcbiAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBpZD1cInZpZXdlclwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwZGZWaWV3ZXJcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcbiAgICAgICAgICAgICAgICAoZGJsY2xpY2spPVwiem9vbVRvUGFnZVdpZHRoKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwZGYtZXJyb3ItbWVzc2FnZT48L3BkZi1lcnJvci1tZXNzYWdlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gbWFpbkNvbnRhaW5lciAtLT5cblxuICAgICAgICAgIDxkaXYgaWQ9XCJkaWFsb2dDb250YWluZXJcIj5cbiAgICAgICAgICAgIDxwZGYtcGFzc3dvcmQtZGlhbG9nPjwvcGRmLXBhc3N3b3JkLWRpYWxvZz5cbiAgICAgICAgICAgIDxwZGYtZG9jdW1lbnQtcHJvcGVydGllcy1kaWFsb2c+PC9wZGYtZG9jdW1lbnQtcHJvcGVydGllcy1kaWFsb2c+XG4gICAgICAgICAgICA8cGRmLWFsdC10ZXh0LWRpYWxvZz48L3BkZi1hbHQtdGV4dC1kaWFsb2c+XG4gICAgICAgICAgICA8cGRmLWFsdC10ZXh0LXNldHRpbmdzLWRpYWxvZz48L3BkZi1hbHQtdGV4dC1zZXR0aW5ncy1kaWFsb2c+XG4gICAgICAgICAgICA8cGRmLXByZXBhcmUtcHJpbnRpbmctZGlhbG9nPjwvcGRmLXByZXBhcmUtcHJpbnRpbmctZGlhbG9nPlxuICAgICAgICAgICAgPHBkZi1hZGQtc2lnbmF0dXJlLWRpYWxvZz48L3BkZi1hZGQtc2lnbmF0dXJlLWRpYWxvZz5cbiAgICAgICAgICAgIDxwZGYtZWRpdC1zaWduYXR1cmUtZGlhbG9nPjwvcGRmLWVkaXQtc2lnbmF0dXJlLWRpYWxvZz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIGRpYWxvZ0NvbnRhaW5lciAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD1cImVkaXRvclVuZG9CYXJcIlxuICAgICAgICAgIGNsYXNzPVwibWVzc2FnZUJhclwiXG4gICAgICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiZWRpdG9yVW5kb0Jhck1lc3NhZ2VcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgIGhpZGRlblxuICAgICAgICA+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JVbmRvQmFyTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgaWQ9XCJlZGl0b3JVbmRvQmFyVW5kb0J1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidW5kb0J1dHRvblwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICB0aXRsZT1cIlVuZG9cIlxuICAgICAgICAgICAgICBkYXRhLWwxMG4taWQ9XCJwZGZqcy1lZGl0b3ItdW5kby1iYXItdW5kby1idXR0b25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBkYXRhLWwxMG4taWQ9XCJwZGZqcy1lZGl0b3ItdW5kby1iYXItdW5kby1idXR0b24tbGFiZWxcIj5VbmRvPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGlkPVwiZWRpdG9yVW5kb0JhckNsb3NlQnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbG9zZUJ1dHRvblwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNsb3NlXCJcbiAgICAgICAgICAgICAgZGF0YS1sMTBuLWlkPVwicGRmanMtZWRpdG9yLXVuZG8tYmFyLWNsb3NlLWJ1dHRvblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtbDEwbi1pZD1cInBkZmpzLWVkaXRvci11bmRvLWJhci1jbG9zZS1idXR0b24tbGFiZWxcIj5DbG9zZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBlZGl0b3JVbmRvQmFyIC0tPlxuICAgICAgICA8IS0tIG91dGVyQ29udGFpbmVyIC0tPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RnJlZUZsb2F0aW5nQmFyPiA8L25nLXRlbXBsYXRlPlxuIl19