UNPKG

@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
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" #viewerContainer> <ngx-extended-pdf-viewer [class.hidden]="isLoading|async" [src]="file.url" [rotation]="rotation" [zoom]="zoom" (currentZoomFactor)="onScaleChange($event)" [(page)]="currentPage" [backgroundColor]="'rgba(0,0,0,0)'" [showSidebarButton]="false" [textLayer]="true" [showToolbar]="false" [showTextEditor]="false" [showHandToolButton]="false" [showFindButton]="false" [showPagingButtons]="false" [showZoomButtons]="false" [showPresentationModeButton]="false" [showOpenFileButton]="false" [showPrintButton]="false" [showDownloadButton]="false" [showSecondaryToolbarButton]="false" [showRotateButton]="false" [showSpreadButton]="false" [showPropertiesButton]="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" #viewerContainer> <ngx-extended-pdf-viewer [class.hidden]="isLoading|async" [src]="file.url" [rotation]="rotation" [zoom]="zoom" (currentZoomFactor)="onScaleChange($event)" [(page)]="currentPage" [backgroundColor]="'rgba(0,0,0,0)'" [showSidebarButton]="false" [textLayer]="true" [showToolbar]="false" [showTextEditor]="false" [showHandToolButton]="false" [showFindButton]="false" [showPagingButtons]="false" [showZoomButtons]="false" [showPresentationModeButton]="false" [showOpenFileButton]="false" [showPrintButton]="false" [showDownloadButton]="false" [showSecondaryToolbarButton]="false" [showRotateButton]="false" [showSpreadButton]="false" [showPropertiesButton]="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==