@eternalheart/ngx-file-preview
Version:
A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.
186 lines (184 loc) • 29.1 kB
JavaScript
import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core';
import { CommonModule } from '@angular/common';
import { NgxExtendedPdfViewerComponent, NgxExtendedPdfViewerModule } from 'ngx-extended-pdf-viewer';
import { PreviewIconComponent } from '../../components/preview-icon/preview-icon.component';
import { BasePreviewComponent } from "../base-preview/base-preview.component";
import { I18nPipe } from "../../i18n";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "ngx-extended-pdf-viewer";
export class PdfPreviewComponent extends BasePreviewComponent {
constructor() {
super(...arguments);
this.zoom = "page-fit"; // 'auto'|'page-actual'|'page-fit'|'page-width'|
this.rotation = 0;
this.currentPage = 0;
}
ngOnInit() {
this.startLoading();
}
async handleFileContent(content) {
}
pdfLoaded() {
this.stopLoading();
this.autoFit();
}
zoomIn() {
this.zoom = Math.floor(Math.min(this.zoom * 1.2, 300));
}
zoomOut() {
this.zoom = Math.floor(Math.max(this.zoom / 1.2, 10));
}
autoFit() {
this.zoom = 'page-fit';
}
resetZoom() {
this.zoom = 100;
}
reset() {
this.resetZoom();
this.rotation = 0;
}
rotate(degrees) {
this.rotation = (this.rotation + degrees + 360) % 360;
}
onScaleChange($event) {
const zoomNum = Math.floor(Number($event) * 100);
if (Number.isNaN(zoomNum) || this.zoom == zoomNum) {
return;
}
this.zoom = zoomNum;
this.cdr.markForCheck();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PdfPreviewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PdfPreviewComponent, isStandalone: true, selector: "ngx-pdf-preview", viewQueries: [{ propertyName: "pdfViewer", first: true, predicate: NgxExtendedPdfViewerComponent, descendants: true }, { propertyName: "viewerContainer", first: true, predicate: ["viewerContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
<div class="pdf-container">
<!-- 工具栏 -->
<div class="toolbar">
<div class="left-controls">
<div class="control" (click)="zoomOut()">
<preview-icon [themeMode]="themeMode" name="zoom-out" [title]="'preview.toolbar.zoomOut'|i18n"></preview-icon>
</div>
<span (click)="resetZoom()">{{ zoom == "page-fit" ? "100%" : zoom }}%</span>
<div class="control" (click)="zoomIn()">
<preview-icon [themeMode]="themeMode" name="zoom-in" [title]="'preview.toolbar.zoomIn'|i18n"></preview-icon>
</div>
<div class="control" (click)="autoFit()">
<preview-icon [themeMode]="themeMode" name="auto-fit" [title]="'preview.toolbar.autoFit'|i18n"></preview-icon>
</div>
</div>
<div class="right-controls">
<div class="control" (click)="rotate(-90)">
<preview-icon [themeMode]="themeMode" name="rotate-90" [title]="'preview.toolbar.rotate-90'|i18n"></preview-icon>
</div>
<div class="control" (click)="rotate(90)">
<preview-icon [themeMode]="themeMode" name="rotate90" [title]="'preview.toolbar.rotate90'|i18n"></preview-icon>
</div>
<div class="control" (click)="reset()">
<preview-icon [themeMode]="themeMode" name="reset" [title]="'preview.toolbar.reset'|i18n"></preview-icon>
</div>
</div>
</div>
<!-- PDF查看器 -->
<div class="viewer-container"
<ngx-extended-pdf-viewer
[ ]="isLoading|async"
[ ]="file.url"
[ ]="rotation"
[ ]="zoom"
(currentZoomFactor)="onScaleChange($event)"
[(page)]="currentPage"
[ ]="'rgba(0,0,0,0)'"
[ ]="false"
[ ]="true"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
(pagesLoaded)="pdfLoaded()"
style="width: 100%; height: 100%;"
></ngx-extended-pdf-viewer>
</div>
</div>
`, isInline: true, styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ":host{display:block;width:100%;height:100%}.pdf-container{width:100%;height:100%;display:flex;flex-direction:column;background:var(--nfp-bg-container)}.pdf-container .toolbar{height:48px;min-height:48px;background:var(--nfp-toolbar-bg);border-bottom:1px solid var(--nfp-toolbar-border);display:flex;justify-content:space-between;align-items:center;padding:0 16px;-webkit-user-select:none;user-select:none}.pdf-container .toolbar .left-controls,.pdf-container .toolbar .right-controls{display:flex;align-items:center;gap:8px}.pdf-container .toolbar .control{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:4px;color:var(--nfp-text-primary);transition:all .2s ease}.pdf-container .toolbar .control:hover:not(:disabled){background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.pdf-container .toolbar .control:disabled{color:var(--nfp-text-disabled);cursor:not-allowed}.pdf-container .toolbar span{color:var(--nfp-text-primary);font-size:13px;min-width:48px;text-align:center;padding:4px 8px;border-radius:4px;cursor:pointer}.pdf-container .toolbar span:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.pdf-container .viewer-container{flex:1;overflow:auto;position:relative;background:var(--nfp-bg-container);padding:16px;scrollbar-width:thin;scrollbar-color:var(--nfp-scrollbar-thumb) var(--nfp-scrollbar-bg)}.pdf-container .viewer-container .hidden{visibility:hidden}.pdf-container .viewer-container::-webkit-scrollbar{width:8px;height:8px}.pdf-container .viewer-container::-webkit-scrollbar-track{background:var(--nfp-scrollbar-bg);border-radius:4px}.pdf-container .viewer-container::-webkit-scrollbar-thumb{background:var(--nfp-scrollbar-thumb);border-radius:4px}.pdf-container .viewer-container::-webkit-scrollbar-thumb:hover{background:var(--nfp-primary-color)}.pdf-container .viewer-container ::ng-deep .loading{display:flex;align-items:center;justify-content:center;padding:24px;color:var(--nfp-text-secondary)}.pdf-container .viewer-container ::ng-deep .error{color:var(--nfp-error-color);text-align:center;padding:24px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: NgxExtendedPdfViewerModule }, { kind: "component", type: i2.NgxExtendedPdfViewerComponent, selector: "ngx-extended-pdf-viewer", inputs: ["customFindbarInputArea", "customToolbar", "customFindbar", "customFindbarButtons", "customPdfViewer", "customSecondaryToolbar", "customSidebar", "customThumbnail", "customFreeFloatingBar", "showFreeFloatingBar", "enableDragAndDrop", "forceUsingLegacyES5", "formData", "disableForms", "pageViewMode", "scrollMode", "authorization", "httpHeaders", "contextMenuAllowed", "enablePrint", "enablePrintAutoRotate", "forceFullReloadOfJavaScriptCode", "showTextEditor", "showStampEditor", "showDrawEditor", "showHighlightEditor", "logLevel", "relativeCoordsOptions", "minifiedJSLibraries", "printResolution", "rotation", "src", "base64Src", "minHeight", "height", "backgroundColor", "filenameForDownload", "ignoreKeyboard", "ignoreKeys", "acceptKeys", "imageResourcesPath", "localeFolderPath", "language", "listenToURL", "nameddest", "password", "replaceBrowserPrint", "useInlineScripts", "showUnverifiedSignatures", "startTabindex", "showSidebarButton", "sidebarVisible", "activeSidebarView", "findbarVisible", "propertiesDialogVisible", "showFindButton", "showFindHighlightAll", "showFindMatchCase", "showFindMultiple", "showFindRegexp", "showFindEntireWord", "showFindMatchDiacritics", "showFindResultsCount", "showFindMessages", "showPagingButtons", "showFirstAndLastPageButtons", "showPreviousAndNextPageButtons", "showPageNumber", "showPageLabel", "showZoomButtons", "showZoomDropdown", "showPresentationModeButton", "showOpenFileButton", "showPrintButton", "showDownloadButton", "theme", "showToolbar", "showSecondaryToolbarButton", "showSinglePageModeButton", "showVerticalScrollButton", "showHorizontalScrollButton", "showWrappedScrollButton", "showInfiniteScrollButton", "showBookModeButton", "showRotateButton", "showRotateCwButton", "showRotateCcwButton", "handTool", "showHandToolButton", "showSpreadButton", "showPropertiesButton", "showBorders", "spread", "showScrollingButtons", "page", "pageLabel", "textLayer", "zoom", "zoomLevels", "maxZoom", "minZoom", "mobileFriendlyZoom"], outputs: ["annotationEditorEvent", "formDataChange", "pageViewModeChange", "progress", "srcChange", "scrollModeChange", "afterPrint", "beforePrint", "currentZoomFactor", "rotationChange", "annotationLayerRendered", "annotationEditorLayerRendered", "xfaLayerRendered", "outlineLoaded", "attachmentsloaded", "layersloaded", "sidebarVisibleChange", "activeSidebarViewChange", "findbarVisibleChange", "propertiesDialogVisibleChange", "handToolChange", "spreadChange", "thumbnailDrawn", "pageChange", "pageLabelChange", "pagesLoaded", "pageRender", "pageRendered", "pdfDownloaded", "pdfLoaded", "pdfLoadingStarts", "pdfLoadingFailed", "textLayerRendered", "annotationEditorModeChanged", "updateFindMatchesCount", "updateFindState", "zoomChange"] }, { kind: "component", type: PreviewIconComponent, selector: "preview-icon", inputs: ["name", "svg", "size", "color", "themeMode", "title", "cursor"] }, { kind: "pipe", type: I18nPipe, name: "i18n" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PdfPreviewComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-pdf-preview', standalone: true, imports: [CommonModule, NgxExtendedPdfViewerModule, PreviewIconComponent, I18nPipe], template: `
<div class="pdf-container">
<!-- 工具栏 -->
<div class="toolbar">
<div class="left-controls">
<div class="control" (click)="zoomOut()">
<preview-icon [themeMode]="themeMode" name="zoom-out" [title]="'preview.toolbar.zoomOut'|i18n"></preview-icon>
</div>
<span (click)="resetZoom()">{{ zoom == "page-fit" ? "100%" : zoom }}%</span>
<div class="control" (click)="zoomIn()">
<preview-icon [themeMode]="themeMode" name="zoom-in" [title]="'preview.toolbar.zoomIn'|i18n"></preview-icon>
</div>
<div class="control" (click)="autoFit()">
<preview-icon [themeMode]="themeMode" name="auto-fit" [title]="'preview.toolbar.autoFit'|i18n"></preview-icon>
</div>
</div>
<div class="right-controls">
<div class="control" (click)="rotate(-90)">
<preview-icon [themeMode]="themeMode" name="rotate-90" [title]="'preview.toolbar.rotate-90'|i18n"></preview-icon>
</div>
<div class="control" (click)="rotate(90)">
<preview-icon [themeMode]="themeMode" name="rotate90" [title]="'preview.toolbar.rotate90'|i18n"></preview-icon>
</div>
<div class="control" (click)="reset()">
<preview-icon [themeMode]="themeMode" name="reset" [title]="'preview.toolbar.reset'|i18n"></preview-icon>
</div>
</div>
</div>
<!-- PDF查看器 -->
<div class="viewer-container"
<ngx-extended-pdf-viewer
[ ]="isLoading|async"
[ ]="file.url"
[ ]="rotation"
[ ]="zoom"
(currentZoomFactor)="onScaleChange($event)"
[(page)]="currentPage"
[ ]="'rgba(0,0,0,0)'"
[ ]="false"
[ ]="true"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
[ ]="false"
(pagesLoaded)="pdfLoaded()"
style="width: 100%; height: 100%;"
></ngx-extended-pdf-viewer>
</div>
</div>
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ":host{display:block;width:100%;height:100%}.pdf-container{width:100%;height:100%;display:flex;flex-direction:column;background:var(--nfp-bg-container)}.pdf-container .toolbar{height:48px;min-height:48px;background:var(--nfp-toolbar-bg);border-bottom:1px solid var(--nfp-toolbar-border);display:flex;justify-content:space-between;align-items:center;padding:0 16px;-webkit-user-select:none;user-select:none}.pdf-container .toolbar .left-controls,.pdf-container .toolbar .right-controls{display:flex;align-items:center;gap:8px}.pdf-container .toolbar .control{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:4px;color:var(--nfp-text-primary);transition:all .2s ease}.pdf-container .toolbar .control:hover:not(:disabled){background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.pdf-container .toolbar .control:disabled{color:var(--nfp-text-disabled);cursor:not-allowed}.pdf-container .toolbar span{color:var(--nfp-text-primary);font-size:13px;min-width:48px;text-align:center;padding:4px 8px;border-radius:4px;cursor:pointer}.pdf-container .toolbar span:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.pdf-container .viewer-container{flex:1;overflow:auto;position:relative;background:var(--nfp-bg-container);padding:16px;scrollbar-width:thin;scrollbar-color:var(--nfp-scrollbar-thumb) var(--nfp-scrollbar-bg)}.pdf-container .viewer-container .hidden{visibility:hidden}.pdf-container .viewer-container::-webkit-scrollbar{width:8px;height:8px}.pdf-container .viewer-container::-webkit-scrollbar-track{background:var(--nfp-scrollbar-bg);border-radius:4px}.pdf-container .viewer-container::-webkit-scrollbar-thumb{background:var(--nfp-scrollbar-thumb);border-radius:4px}.pdf-container .viewer-container::-webkit-scrollbar-thumb:hover{background:var(--nfp-primary-color)}.pdf-container .viewer-container ::ng-deep .loading{display:flex;align-items:center;justify-content:center;padding:24px;color:var(--nfp-text-secondary)}.pdf-container .viewer-container ::ng-deep .error{color:var(--nfp-error-color);text-align:center;padding:24px}\n"] }]
}], propDecorators: { pdfViewer: [{
type: ViewChild,
args: [NgxExtendedPdfViewerComponent]
}], viewerContainer: [{
type: ViewChild,
args: ['viewerContainer']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXByZXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtZmlsZS1wcmV2aWV3L3NyYy9saWIvcHJldmlldy10eXBlcy9wZGYtcHJldmlldy9wZGYtcHJldmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsNkJBQTZCLEVBQUUsMEJBQTBCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUMxRixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUU1RSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDOzs7O0FBc0VwQyxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsb0JBQW9CO0lBcEU3RDs7UUFxRUUsU0FBSSxHQUFRLFVBQVUsQ0FBQyxDQUFBLGdEQUFnRDtRQUN2RSxhQUFRLEdBQXVCLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztLQWdEakI7SUE3Q0MsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBQ2tCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUEyQjtJQUN0RSxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDaEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFlO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUF5QixDQUFDO0lBQzlFLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBYTtRQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNsRCxPQUFNO1FBQ1IsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDekIsQ0FBQzsrR0FqRFUsbUJBQW1CO21HQUFuQixtQkFBbUIsc0hBSW5CLDZCQUE2Qiw0S0FwRTlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RFQsbW9JQTdEUyxZQUFZLG1GQUFFLDBCQUEwQixzekZBQUUsb0JBQW9CLDhIQUFFLFFBQVE7OzRGQWlFdkUsbUJBQW1CO2tCQXBFL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLFlBQ3pFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RFQsbUJBRWdCLHVCQUF1QixDQUFDLE1BQU07OEJBTUwsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyw2QkFBNkI7Z0JBQ1YsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtOZ3hFeHRlbmRlZFBkZlZpZXdlckNvbXBvbmVudCwgTmd4RXh0ZW5kZWRQZGZWaWV3ZXJNb2R1bGV9IGZyb20gJ25neC1leHRlbmRlZC1wZGYtdmlld2VyJztcbmltcG9ydCB7UHJldmlld0ljb25Db21wb25lbnR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJldmlldy1pY29uL3ByZXZpZXctaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtCYXNlUHJldmlld0NvbXBvbmVudH0gZnJvbSBcIi4uL2Jhc2UtcHJldmlldy9iYXNlLXByZXZpZXcuY29tcG9uZW50XCI7XG5pbXBvcnQge0ZpbGVSZWFkZXJSZXNwb25zZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzXCI7XG5pbXBvcnQge0kxOG5QaXBlfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtcGRmLXByZXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBOZ3hFeHRlbmRlZFBkZlZpZXdlck1vZHVsZSwgUHJldmlld0ljb25Db21wb25lbnQsIEkxOG5QaXBlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicGRmLWNvbnRhaW5lclwiPlxuICAgICAgPCEtLSDlt6XlhbfmoI8gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdC1jb250cm9sc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKGNsaWNrKT1cInpvb21PdXQoKVwiPlxuICAgICAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJ6b29tLW91dFwiIFt0aXRsZV09XCIncHJldmlldy50b29sYmFyLnpvb21PdXQnfGkxOG5cIj48L3ByZXZpZXctaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAoY2xpY2spPVwicmVzZXRab29tKClcIj57eyB6b29tID09IFwicGFnZS1maXRcIiA/IFwiMTAwJVwiIDogem9vbSB9fSU8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAoY2xpY2spPVwiem9vbUluKClcIj5cbiAgICAgICAgICAgIDxwcmV2aWV3LWljb24gW3RoZW1lTW9kZV09XCJ0aGVtZU1vZGVcIiBuYW1lPVwiem9vbS1pblwiIFt0aXRsZV09XCIncHJldmlldy50b29sYmFyLnpvb21Jbid8aTE4blwiPjwvcHJldmlldy1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKGNsaWNrKT1cImF1dG9GaXQoKVwiPlxuICAgICAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJhdXRvLWZpdFwiIFt0aXRsZV09XCIncHJldmlldy50b29sYmFyLmF1dG9GaXQnfGkxOG5cIj48L3ByZXZpZXctaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRyb2xzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAoY2xpY2spPVwicm90YXRlKC05MClcIj5cbiAgICAgICAgICAgIDxwcmV2aWV3LWljb24gW3RoZW1lTW9kZV09XCJ0aGVtZU1vZGVcIiBuYW1lPVwicm90YXRlLTkwXCIgW3RpdGxlXT1cIidwcmV2aWV3LnRvb2xiYXIucm90YXRlLTkwJ3xpMThuXCI+PC9wcmV2aWV3LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAoY2xpY2spPVwicm90YXRlKDkwKVwiPlxuICAgICAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJyb3RhdGU5MFwiIFt0aXRsZV09XCIncHJldmlldy50b29sYmFyLnJvdGF0ZTkwJ3xpMThuXCI+PC9wcmV2aWV3LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAoY2xpY2spPVwicmVzZXQoKVwiPlxuICAgICAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJyZXNldFwiIFt0aXRsZV09XCIncHJldmlldy50b29sYmFyLnJlc2V0J3xpMThuXCI+PC9wcmV2aWV3LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFBERuafpeeci+WZqCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3ZXItY29udGFpbmVyXCIgI3ZpZXdlckNvbnRhaW5lcj5cbiAgICAgICAgPG5neC1leHRlbmRlZC1wZGYtdmlld2VyXG4gICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJpc0xvYWRpbmd8YXN5bmNcIlxuICAgICAgICAgIFtzcmNdPVwiZmlsZS51cmxcIlxuICAgICAgICAgIFtyb3RhdGlvbl09XCJyb3RhdGlvblwiXG4gICAgICAgICAgW3pvb21dPVwiem9vbVwiXG4gICAgICAgICAgKGN1cnJlbnRab29tRmFjdG9yKT1cIm9uU2NhbGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgWyhwYWdlKV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCIncmdiYSgwLDAsMCwwKSdcIlxuICAgICAgICAgIFtzaG93U2lkZWJhckJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgW3RleHRMYXllcl09XCJ0cnVlXCJcbiAgICAgICAgICBbc2hvd1Rvb2xiYXJdPVwiZmFsc2VcIlxuICAgICAgICAgIFtzaG93VGV4dEVkaXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dIYW5kVG9vbEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dGaW5kQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICBbc2hvd1BhZ2luZ0J1dHRvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFtzaG93Wm9vbUJ1dHRvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFtzaG93UHJlc2VudGF0aW9uTW9kZUJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dPcGVuRmlsZUJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dQcmludEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dEb3dubG9hZEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dTZWNvbmRhcnlUb29sYmFyQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICBbc2hvd1JvdGF0ZUJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgW3Nob3dTcHJlYWRCdXR0b25dPVwiZmFsc2VcIlxuICAgICAgICAgIFtzaG93UHJvcGVydGllc0J1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgICAgKHBhZ2VzTG9hZGVkKT1cInBkZkxvYWRlZCgpXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XCJcbiAgICAgICAgPjwvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbXCIuLi8uLi9zdHlsZXMvX3RoZW1lLnNjc3NcIiwgXCIuL3BkZi1wcmV2aWV3LmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZGZQcmV2aWV3Q29tcG9uZW50IGV4dGVuZHMgQmFzZVByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXR7XG4gIHpvb206IGFueSA9IFwicGFnZS1maXRcIjsvLyAnYXV0byd8J3BhZ2UtYWN0dWFsJ3wncGFnZS1maXQnfCdwYWdlLXdpZHRoJ3xcbiAgcm90YXRpb246IDAgfCA5MCB8IDE4MCB8IDI3MCA9IDA7XG4gIGN1cnJlbnRQYWdlID0gMDtcbiAgQFZpZXdDaGlsZChOZ3hFeHRlbmRlZFBkZlZpZXdlckNvbXBvbmVudCkgcGRmVmlld2VyITogTmd4RXh0ZW5kZWRQZGZWaWV3ZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdlckNvbnRhaW5lcicpIHZpZXdlckNvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+XG4gIG5nT25Jbml0KCl7XG4gICAgdGhpcy5zdGFydExvYWRpbmcoKVxuICB9XG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBoYW5kbGVGaWxlQ29udGVudChjb250ZW50OiBGaWxlUmVhZGVyUmVzcG9uc2UpIHtcbiAgfVxuXG4gIHBkZkxvYWRlZCgpIHtcbiAgICB0aGlzLnN0b3BMb2FkaW5nKClcbiAgICB0aGlzLmF1dG9GaXQoKVxuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMuem9vbSA9IE1hdGguZmxvb3IoTWF0aC5taW4odGhpcy56b29tICogMS4yLCAzMDApKTtcbiAgfVxuXG4gIHpvb21PdXQoKSB7XG4gICAgdGhpcy56b29tID0gTWF0aC5mbG9vcihNYXRoLm1heCh0aGlzLnpvb20gLyAxLjIsIDEwKSk7XG4gIH1cblxuICBhdXRvRml0KCkge1xuICAgIHRoaXMuem9vbSA9ICdwYWdlLWZpdCc7XG4gIH1cblxuICByZXNldFpvb20oKSB7XG4gICAgdGhpcy56b29tID0gMTAwO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5yZXNldFpvb20oKTtcbiAgICB0aGlzLnJvdGF0aW9uID0gMDtcbiAgfVxuXG4gIHJvdGF0ZShkZWdyZWVzOiBudW1iZXIpIHtcbiAgICB0aGlzLnJvdGF0aW9uID0gKHRoaXMucm90YXRpb24gKyBkZWdyZWVzICsgMzYwKSAlIDM2MCBhcyAwIHwgOTAgfCAxODAgfCAyNzA7XG4gIH1cblxuICBvblNjYWxlQ2hhbmdlKCRldmVudDpudW1iZXIpIHtcbiAgICBjb25zdCB6b29tTnVtID0gTWF0aC5mbG9vcihOdW1iZXIoJGV2ZW50KSAqIDEwMCk7XG4gICAgaWYgKE51bWJlci5pc05hTih6b29tTnVtKSB8fCB0aGlzLnpvb20gPT0gem9vbU51bSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuem9vbSA9IHpvb21OdW1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKVxuICB9XG5cbn1cbiJdfQ==