UNPKG

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.

93 lines 25.6 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../pdf-toggle-sidebar/pdf-toggle-sidebar.component"; import * as i2 from "../pdf-find-button/pdf-find-button.component"; import * as i3 from "../pdf-paging-area/pdf-paging-area.component"; import * as i4 from "../pdf-zoom-toolbar/pdf-zoom-toolbar.component"; import * as i5 from "../pdf-hand-tool/pdf-hand-tool.component"; import * as i6 from "../pdf-select-tool/pdf-select-tool.component"; import * as i7 from "../pdf-rotate-page/pdf-rotate-page.component"; import * as i8 from "../pdf-presentation-mode/pdf-presentation-mode.component"; import * as i9 from "../pdf-open-file/pdf-open-file.component"; import * as i10 from "../pdf-print/pdf-print.component"; import * as i11 from "../pdf-download/pdf-download.component"; import * as i12 from "../pdf-bookmark/pdf-bookmark.component"; import * as i13 from "../pdf-toggle-secondary-toolbar/pdf-toggle-secondary-toolbar.component"; import * as i14 from "@angular/common"; export class PdfToolbarComponent { constructor(elementRef) { this.elementRef = elementRef; this.mobileFriendlyZoomScale = 1; this.primaryMenuVisible = true; this.showBookmarkButton = true; this.showDownloadButton = true; this.showEditor = false; this.showFindButton = undefined; this.showHandToolButton = true; this.showOpenFileButton = true; this.showPrintButton = true; this.showPagingButtons = true; this.showPresentationModeButton = false; this.showRotateButton = true; this.showSecondaryToolbarButton = true; this.showSidebarButton = true; this.showZoomButtons = true; this.textLayer = undefined; this.toolbarMarginTop = '0px'; this.toolbarWidth = '100%'; this.zoomLevels = ['auto', 'page-actual', 'page-fit', 'page-width', 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4]; this.onToolbarLoaded = new EventEmitter(); } ngAfterViewInit() { this.onToolbarLoaded.emit(this.elementRef.nativeElement.getElementsByClassName('toolbar')[0]); } } PdfToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PdfToolbarComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); PdfToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PdfToolbarComponent, selector: "pdf-toolbar", inputs: { customToolbar: "customToolbar", mobileFriendlyZoomScale: "mobileFriendlyZoomScale", primaryMenuVisible: "primaryMenuVisible", showBookmarkButton: "showBookmarkButton", showDownloadButton: "showDownloadButton", showEditor: "showEditor", showFindButton: "showFindButton", showHandToolButton: "showHandToolButton", showOpenFileButton: "showOpenFileButton", showPrintButton: "showPrintButton", showPagingButtons: "showPagingButtons", showPresentationModeButton: "showPresentationModeButton", showRotateButton: "showRotateButton", showSecondaryToolbarButton: "showSecondaryToolbarButton", showSidebarButton: "showSidebarButton", showZoomButtons: "showZoomButtons", textLayer: "textLayer", toolbarMarginTop: "toolbarMarginTop", toolbarWidth: "toolbarWidth", zoomLevels: "zoomLevels" }, outputs: { onToolbarLoaded: "onToolbarLoaded" }, ngImport: i0, template: "<div class=\"toolbar\" [class.invisible]=\"!primaryMenuVisible\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\" [style.transformOrigin]=\"'left center'\"\n [style.width]=\"toolbarWidth\" [style.marginTop]=\"toolbarMarginTop\">\n <div id=\"toolbarContainer\">\n <ng-content *ngTemplateOutlet=\"customToolbar ? customToolbar : defaultToolbar\"></ng-content>\n <div id=\"loadingBar\">\n <div class=\"progress\">\n <div class=\"glimmer\"></div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultToolbar>\n <div id=\"toolbarViewer\">\n <div id=\"toolbarViewerLeft\">\n <pdf-toggle-sidebar [showSidebarButton]=\"showSidebarButton\"></pdf-toggle-sidebar>\n <pdf-find-button [showFindButton]=\"showFindButton\" [textLayer]=\"textLayer\"></pdf-find-button>\n <pdf-paging-area [showPagingButtons]=\"showPagingButtons\"></pdf-paging-area>\n </div>\n <pdf-zoom-toolbar [showZoomButtons]=\"showZoomButtons\" [zoomLevels]=\"zoomLevels\"></pdf-zoom-toolbar>\n <div id=\"toolbarViewerRight\">\n\n\n <pdf-hand-tool [showHandToolButton]=\"showHandToolButton\"></pdf-hand-tool>\n <pdf-select-tool [showSelectToolButton]=\"showHandToolButton\"></pdf-select-tool>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"true\" [counterClockwise]=\"false\">\n </pdf-rotate-page>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"false\" [counterClockwise]=\"true\">\n </pdf-rotate-page>\n <pdf-presentation-mode [showPresentationModeButton]=\"showPresentationModeButton\"></pdf-presentation-mode>\n <pdf-open-file [showOpenFileButton]=\"showOpenFileButton\"></pdf-open-file>\n <pdf-print [showPrintButton]=\"showPrintButton\"></pdf-print>\n <pdf-download [showDownloadButton]=\"showDownloadButton\"></pdf-download>\n <pdf-bookmark [showBookmarkButton]=\"showBookmarkButton\"></pdf-bookmark>\n\n <div id=\"editorModeButtons\" class=\"splitToolbarButton toggled\" role=\"radiogroup\" *ngIf=\"showEditor\">\n <button id=\"editorFreeText\" class=\"toolbarButton\" disabled=\"disabled\" title=\"Text\" role=\"radio\" type=\"button\"\n aria-checked=\"false\" tabindex=\"34\" data-l10n-id=\"editor_free_text2\">\n <span data-l10n-id=\"editor_free_text2_label\">Text</span>\n <svg style=\"width:20px;height:20px\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M18.5,4L19.66,8.35L18.7,8.61C18.25,7.74 17.79,6.87 17.26,6.43C16.73,6 16.11,6 15.5,6H13V16.5C13,17 13,17.5 13.33,17.75C13.67,18 14.33,18 15,18V19H9V18C9.67,18 10.33,18 10.67,17.75C11,17.5 11,17 11,16.5V6H8.5C7.89,6 7.27,6 6.74,6.43C6.21,6.87 5.75,7.74 5.3,8.61L4.34,8.35L5.5,4H18.5Z\" />\n </svg>\n </button>\n <button id=\"editorInk\" class=\"toolbarButton\" disabled=\"disabled\" title=\"Draw\" role=\"radio\" aria-checked=\"false\"\n type=\"button\" tabindex=\"35\" data-l10n-id=\"editor_ink2\">\n <span data-l10n-id=\"editor_ink2_label\">Draw</span>\n <svg style=\"width:20px;height:20px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" enable-background=\"new 0 0 16 16\">\n <g>\n <g transform=\"scale(0.03125)\">\n <path\n d=\"m455.1,137.9l-32.4,32.4-81-81.1 32.4-32.4c6.6-6.6 18.1-6.6 24.7,0l56.3,56.4c6.8,6.8 6.8,17.9 0,24.7zm-270.7,271l-81-81.1 209.4-209.7 81,81.1-209.4,209.7zm-99.7-42l60.6,60.7-84.4,23.8 23.8-84.5zm399.3-282.6l-56.3-56.4c-11-11-50.7-31.8-82.4,0l-285.3,285.5c-2.5,2.5-4.3,5.5-5.2,8.9l-43,153.1c-2,7.1 0.1,14.7 5.2,20 5.2,5.3 15.6,6.2 20,5.2l153-43.1c3.4-0.9 6.4-2.7 8.9-5.2l285.1-285.5c22.7-22.7 22.7-59.7 0-82.5z\" />\n </g>\n </g>\n </svg>\n </button>\n </div>\n\n <div id=\"editorModeSeparator\" class=\"verticalToolbarSeparator\"></div>\n\n <pdf-toggle-secondary-toolbar [showSecondaryToolbarButton]=\"showSecondaryToolbarButton\">\n </pdf-toggle-secondary-toolbar>\n\n </div>\n </div>\n</ng-template>\n", styles: [""], components: [{ type: i1.PdfToggleSidebarComponent, selector: "pdf-toggle-sidebar", inputs: ["showSidebarButton"] }, { type: i2.PdfFindButtonComponent, selector: "pdf-find-button", inputs: ["showFindButton", "textLayer"] }, { type: i3.PdfPagingAreaComponent, selector: "pdf-paging-area", inputs: ["showPagingButtons"] }, { type: i4.PdfZoomToolbarComponent, selector: "pdf-zoom-toolbar", inputs: ["showZoomButtons", "zoomLevels"] }, { type: i5.PdfHandToolComponent, selector: "pdf-hand-tool", inputs: ["showHandToolButton"] }, { type: i6.PdfSelectToolComponent, selector: "pdf-select-tool", inputs: ["showSelectToolButton"] }, { type: i7.PdfRotatePageComponent, selector: "pdf-rotate-page", inputs: ["showRotateButton", "clockwise", "counterClockwise"] }, { type: i8.PdfPresentationModeComponent, selector: "pdf-presentation-mode", inputs: ["showPresentationModeButton"] }, { type: i9.PdfOpenFileComponent, selector: "pdf-open-file", inputs: ["showOpenFileButton"] }, { type: i10.PdfPrintComponent, selector: "pdf-print", inputs: ["showPrintButton"] }, { type: i11.PdfDownloadComponent, selector: "pdf-download", inputs: ["showDownloadButton"] }, { type: i12.PdfBookmarkComponent, selector: "pdf-bookmark", inputs: ["showBookmarkButton"] }, { type: i13.PdfToggleSecondaryToolbarComponent, selector: "pdf-toggle-secondary-toolbar", inputs: ["showSecondaryToolbarButton"] }], directives: [{ type: i14.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PdfToolbarComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-toolbar', template: "<div class=\"toolbar\" [class.invisible]=\"!primaryMenuVisible\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\" [style.transformOrigin]=\"'left center'\"\n [style.width]=\"toolbarWidth\" [style.marginTop]=\"toolbarMarginTop\">\n <div id=\"toolbarContainer\">\n <ng-content *ngTemplateOutlet=\"customToolbar ? customToolbar : defaultToolbar\"></ng-content>\n <div id=\"loadingBar\">\n <div class=\"progress\">\n <div class=\"glimmer\"></div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultToolbar>\n <div id=\"toolbarViewer\">\n <div id=\"toolbarViewerLeft\">\n <pdf-toggle-sidebar [showSidebarButton]=\"showSidebarButton\"></pdf-toggle-sidebar>\n <pdf-find-button [showFindButton]=\"showFindButton\" [textLayer]=\"textLayer\"></pdf-find-button>\n <pdf-paging-area [showPagingButtons]=\"showPagingButtons\"></pdf-paging-area>\n </div>\n <pdf-zoom-toolbar [showZoomButtons]=\"showZoomButtons\" [zoomLevels]=\"zoomLevels\"></pdf-zoom-toolbar>\n <div id=\"toolbarViewerRight\">\n\n\n <pdf-hand-tool [showHandToolButton]=\"showHandToolButton\"></pdf-hand-tool>\n <pdf-select-tool [showSelectToolButton]=\"showHandToolButton\"></pdf-select-tool>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"true\" [counterClockwise]=\"false\">\n </pdf-rotate-page>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"false\" [counterClockwise]=\"true\">\n </pdf-rotate-page>\n <pdf-presentation-mode [showPresentationModeButton]=\"showPresentationModeButton\"></pdf-presentation-mode>\n <pdf-open-file [showOpenFileButton]=\"showOpenFileButton\"></pdf-open-file>\n <pdf-print [showPrintButton]=\"showPrintButton\"></pdf-print>\n <pdf-download [showDownloadButton]=\"showDownloadButton\"></pdf-download>\n <pdf-bookmark [showBookmarkButton]=\"showBookmarkButton\"></pdf-bookmark>\n\n <div id=\"editorModeButtons\" class=\"splitToolbarButton toggled\" role=\"radiogroup\" *ngIf=\"showEditor\">\n <button id=\"editorFreeText\" class=\"toolbarButton\" disabled=\"disabled\" title=\"Text\" role=\"radio\" type=\"button\"\n aria-checked=\"false\" tabindex=\"34\" data-l10n-id=\"editor_free_text2\">\n <span data-l10n-id=\"editor_free_text2_label\">Text</span>\n <svg style=\"width:20px;height:20px\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M18.5,4L19.66,8.35L18.7,8.61C18.25,7.74 17.79,6.87 17.26,6.43C16.73,6 16.11,6 15.5,6H13V16.5C13,17 13,17.5 13.33,17.75C13.67,18 14.33,18 15,18V19H9V18C9.67,18 10.33,18 10.67,17.75C11,17.5 11,17 11,16.5V6H8.5C7.89,6 7.27,6 6.74,6.43C6.21,6.87 5.75,7.74 5.3,8.61L4.34,8.35L5.5,4H18.5Z\" />\n </svg>\n </button>\n <button id=\"editorInk\" class=\"toolbarButton\" disabled=\"disabled\" title=\"Draw\" role=\"radio\" aria-checked=\"false\"\n type=\"button\" tabindex=\"35\" data-l10n-id=\"editor_ink2\">\n <span data-l10n-id=\"editor_ink2_label\">Draw</span>\n <svg style=\"width:20px;height:20px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" enable-background=\"new 0 0 16 16\">\n <g>\n <g transform=\"scale(0.03125)\">\n <path\n d=\"m455.1,137.9l-32.4,32.4-81-81.1 32.4-32.4c6.6-6.6 18.1-6.6 24.7,0l56.3,56.4c6.8,6.8 6.8,17.9 0,24.7zm-270.7,271l-81-81.1 209.4-209.7 81,81.1-209.4,209.7zm-99.7-42l60.6,60.7-84.4,23.8 23.8-84.5zm399.3-282.6l-56.3-56.4c-11-11-50.7-31.8-82.4,0l-285.3,285.5c-2.5,2.5-4.3,5.5-5.2,8.9l-43,153.1c-2,7.1 0.1,14.7 5.2,20 5.2,5.3 15.6,6.2 20,5.2l153-43.1c3.4-0.9 6.4-2.7 8.9-5.2l285.1-285.5c22.7-22.7 22.7-59.7 0-82.5z\" />\n </g>\n </g>\n </svg>\n </button>\n </div>\n\n <div id=\"editorModeSeparator\" class=\"verticalToolbarSeparator\"></div>\n\n <pdf-toggle-secondary-toolbar [showSecondaryToolbarButton]=\"showSecondaryToolbarButton\">\n </pdf-toggle-secondary-toolbar>\n\n </div>\n </div>\n</ng-template>\n", styles: [""] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { customToolbar: [{ type: Input }], mobileFriendlyZoomScale: [{ type: Input }], primaryMenuVisible: [{ type: Input }], showBookmarkButton: [{ type: Input }], showDownloadButton: [{ type: Input }], showEditor: [{ type: Input }], showFindButton: [{ type: Input }], showHandToolButton: [{ type: Input }], showOpenFileButton: [{ type: Input }], showPrintButton: [{ type: Input }], showPagingButtons: [{ type: Input }], showPresentationModeButton: [{ type: Input }], showRotateButton: [{ type: Input }], showSecondaryToolbarButton: [{ type: Input }], showSidebarButton: [{ type: Input }], showZoomButtons: [{ type: Input }], textLayer: [{ type: Input }], toolbarMarginTop: [{ type: Input }], toolbarWidth: [{ type: Input }], zoomLevels: [{ type: Input }], onToolbarLoaded: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi10b29sYmFyL3BkZi10b29sYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtdG9vbGJhci9wZGYtdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQU8vRyxNQUFNLE9BQU8sbUJBQW1CO0lBZ0U5QixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBM0RuQyw0QkFBdUIsR0FBRyxDQUFDLENBQUM7UUFHNUIsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBRzFCLHVCQUFrQixHQUFHLElBQUksQ0FBQztRQUcxQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFHMUIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUduQixtQkFBYyxHQUF3QixTQUFTLENBQUM7UUFHaEQsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBRzFCLHVCQUFrQixHQUFHLElBQUksQ0FBQztRQUcxQixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUd2QixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFHekIsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBR25DLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUd4QiwrQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFHbEMsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBR3pCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBR3ZCLGNBQVMsR0FBd0IsU0FBUyxDQUFDO1FBRzNDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUd6QixpQkFBWSxHQUFHLE1BQU0sQ0FBQztRQUd0QixlQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBR2pHLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztJQUVaLENBQUM7SUFDOUMsZUFBZTtRQUNiLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQyxDQUFDO0lBQy9HLENBQUM7O2lIQW5FVSxtQkFBbUI7cUdBQW5CLG1CQUFtQiwwM0JDUGhDLG1sSUFvRUE7NEZEN0RhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxhQUFhO2lHQU1oQixhQUFhO3NCQURuQixLQUFLO2dCQUlDLHVCQUF1QjtzQkFEN0IsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxVQUFVO3NCQURoQixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxlQUFlO3NCQURyQixLQUFLO2dCQUlDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFJQywwQkFBMEI7c0JBRGhDLEtBQUs7Z0JBSUMsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLDBCQUEwQjtzQkFEaEMsS0FBSztnQkFJQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsVUFBVTtzQkFEaEIsS0FBSztnQkFJQyxlQUFlO3NCQURyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkZi10b29sYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BkZi10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGRmLXRvb2xiYXIuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQZGZUb29sYmFyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjdXN0b21Ub29sYmFyOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtb2JpbGVGcmllbmRseVpvb21TY2FsZSA9IDE7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHByaW1hcnlNZW51VmlzaWJsZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dCb29rbWFya0J1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dEb3dubG9hZEJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dFZGl0b3IgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0ZpbmRCdXR0b246IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dIYW5kVG9vbEJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dPcGVuRmlsZUJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dQcmludEJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dQYWdpbmdCdXR0b25zID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1ByZXNlbnRhdGlvbk1vZGVCdXR0b24gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1JvdGF0ZUJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dTZWNvbmRhcnlUb29sYmFyQnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1NpZGViYXJCdXR0b24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93Wm9vbUJ1dHRvbnMgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0ZXh0TGF5ZXI6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRvb2xiYXJNYXJnaW5Ub3AgPSAnMHB4JztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdG9vbGJhcldpZHRoID0gJzEwMCUnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB6b29tTGV2ZWxzID0gWydhdXRvJywgJ3BhZ2UtYWN0dWFsJywgJ3BhZ2UtZml0JywgJ3BhZ2Utd2lkdGgnLCAwLjUsIDAuNzUsIDEsIDEuMjUsIDEuNSwgMiwgMywgNF07XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvblRvb2xiYXJMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMub25Ub29sYmFyTG9hZGVkLmVtaXQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndG9vbGJhcicpWzBdIGFzIEhUTUxFbGVtZW50KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRvb2xiYXJcIiBbY2xhc3MuaW52aXNpYmxlXT1cIiFwcmltYXJ5TWVudVZpc2libGVcIlxuICBbc3R5bGUudHJhbnNmb3JtXT1cIidzY2FsZSgnICsgbW9iaWxlRnJpZW5kbHlab29tU2NhbGUgKyAnKSdcIiBbc3R5bGUudHJhbnNmb3JtT3JpZ2luXT1cIidsZWZ0IGNlbnRlcidcIlxuICBbc3R5bGUud2lkdGhdPVwidG9vbGJhcldpZHRoXCIgW3N0eWxlLm1hcmdpblRvcF09XCJ0b29sYmFyTWFyZ2luVG9wXCI+XG4gIDxkaXYgaWQ9XCJ0b29sYmFyQ29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Ub29sYmFyID8gY3VzdG9tVG9vbGJhciA6IGRlZmF1bHRUb29sYmFyXCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgaWQ9XCJsb2FkaW5nQmFyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdsaW1tZXJcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUb29sYmFyPlxuICA8ZGl2IGlkPVwidG9vbGJhclZpZXdlclwiPlxuICAgIDxkaXYgaWQ9XCJ0b29sYmFyVmlld2VyTGVmdFwiPlxuICAgICAgPHBkZi10b2dnbGUtc2lkZWJhciBbc2hvd1NpZGViYXJCdXR0b25dPVwic2hvd1NpZGViYXJCdXR0b25cIj48L3BkZi10b2dnbGUtc2lkZWJhcj5cbiAgICAgIDxwZGYtZmluZC1idXR0b24gW3Nob3dGaW5kQnV0dG9uXT1cInNob3dGaW5kQnV0dG9uXCIgW3RleHRMYXllcl09XCJ0ZXh0TGF5ZXJcIj48L3BkZi1maW5kLWJ1dHRvbj5cbiAgICAgIDxwZGYtcGFnaW5nLWFyZWEgW3Nob3dQYWdpbmdCdXR0b25zXT1cInNob3dQYWdpbmdCdXR0b25zXCI+PC9wZGYtcGFnaW5nLWFyZWE+XG4gICAgPC9kaXY+XG4gICAgPHBkZi16b29tLXRvb2xiYXIgW3Nob3dab29tQnV0dG9uc109XCJzaG93Wm9vbUJ1dHRvbnNcIiBbem9vbUxldmVsc109XCJ6b29tTGV2ZWxzXCI+PC9wZGYtem9vbS10b29sYmFyPlxuICAgIDxkaXYgaWQ9XCJ0b29sYmFyVmlld2VyUmlnaHRcIj5cblxuXG4gICAgICA8cGRmLWhhbmQtdG9vbCBbc2hvd0hhbmRUb29sQnV0dG9uXT1cInNob3dIYW5kVG9vbEJ1dHRvblwiPjwvcGRmLWhhbmQtdG9vbD5cbiAgICAgIDxwZGYtc2VsZWN0LXRvb2wgW3Nob3dTZWxlY3RUb29sQnV0dG9uXT1cInNob3dIYW5kVG9vbEJ1dHRvblwiPjwvcGRmLXNlbGVjdC10b29sPlxuICAgICAgPHBkZi1yb3RhdGUtcGFnZSBbc2hvd1JvdGF0ZUJ1dHRvbl09XCJzaG93Um90YXRlQnV0dG9uXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCIgW2NvdW50ZXJDbG9ja3dpc2VdPVwiZmFsc2VcIj5cbiAgICAgIDwvcGRmLXJvdGF0ZS1wYWdlPlxuICAgICAgPHBkZi1yb3RhdGUtcGFnZSBbc2hvd1JvdGF0ZUJ1dHRvbl09XCJzaG93Um90YXRlQnV0dG9uXCIgW2Nsb2Nrd2lzZV09XCJmYWxzZVwiIFtjb3VudGVyQ2xvY2t3aXNlXT1cInRydWVcIj5cbiAgICAgIDwvcGRmLXJvdGF0ZS1wYWdlPlxuICAgICAgPHBkZi1wcmVzZW50YXRpb24tbW9kZSBbc2hvd1ByZXNlbnRhdGlvbk1vZGVCdXR0b25dPVwic2hvd1ByZXNlbnRhdGlvbk1vZGVCdXR0b25cIj48L3BkZi1wcmVzZW50YXRpb24tbW9kZT5cbiAgICAgIDxwZGYtb3Blbi1maWxlIFtzaG93T3BlbkZpbGVCdXR0b25dPVwic2hvd09wZW5GaWxlQnV0dG9uXCI+PC9wZGYtb3Blbi1maWxlPlxuICAgICAgPHBkZi1wcmludCBbc2hvd1ByaW50QnV0dG9uXT1cInNob3dQcmludEJ1dHRvblwiPjwvcGRmLXByaW50PlxuICAgICAgPHBkZi1kb3dubG9hZCBbc2hvd0Rvd25sb2FkQnV0dG9uXT1cInNob3dEb3dubG9hZEJ1dHRvblwiPjwvcGRmLWRvd25sb2FkPlxuICAgICAgPHBkZi1ib29rbWFyayBbc2hvd0Jvb2ttYXJrQnV0dG9uXT1cInNob3dCb29rbWFya0J1dHRvblwiPjwvcGRmLWJvb2ttYXJrPlxuXG4gICAgICA8ZGl2IGlkPVwiZWRpdG9yTW9kZUJ1dHRvbnNcIiBjbGFzcz1cInNwbGl0VG9vbGJhckJ1dHRvbiB0b2dnbGVkXCIgcm9sZT1cInJhZGlvZ3JvdXBcIiAqbmdJZj1cInNob3dFZGl0b3JcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImVkaXRvckZyZWVUZXh0XCIgY2xhc3M9XCJ0b29sYmFyQnV0dG9uXCIgZGlzYWJsZWQ9XCJkaXNhYmxlZFwiIHRpdGxlPVwiVGV4dFwiIHJvbGU9XCJyYWRpb1wiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGFyaWEtY2hlY2tlZD1cImZhbHNlXCIgdGFiaW5kZXg9XCIzNFwiIGRhdGEtbDEwbi1pZD1cImVkaXRvcl9mcmVlX3RleHQyXCI+XG4gICAgICAgICAgPHNwYW4gZGF0YS1sMTBuLWlkPVwiZWRpdG9yX2ZyZWVfdGV4dDJfbGFiZWxcIj5UZXh0PC9zcGFuPlxuICAgICAgICAgIDxzdmcgc3R5bGU9XCJ3aWR0aDoyMHB4O2hlaWdodDoyMHB4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIGQ9XCJNMTguNSw0TDE5LjY2LDguMzVMMTguNyw4LjYxQzE4LjI1LDcuNzQgMTcuNzksNi44NyAxNy4yNiw2LjQzQzE2LjczLDYgMTYuMTEsNiAxNS41LDZIMTNWMTYuNUMxMywxNyAxMywxNy41IDEzLjMzLDE3Ljc1QzEzLjY3LDE4IDE0LjMzLDE4IDE1LDE4VjE5SDlWMThDOS42NywxOCAxMC4zMywxOCAxMC42NywxNy43NUMxMSwxNy41IDExLDE3IDExLDE2LjVWNkg4LjVDNy44OSw2IDcuMjcsNiA2Ljc0LDYuNDNDNi4yMSw2Ljg3IDUuNzUsNy43NCA1LjMsOC42MUw0LjM0LDguMzVMNS41LDRIMTguNVpcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImVkaXRvcklua1wiIGNsYXNzPVwidG9vbGJhckJ1dHRvblwiIGRpc2FibGVkPVwiZGlzYWJsZWRcIiB0aXRsZT1cIkRyYXdcIiByb2xlPVwicmFkaW9cIiBhcmlhLWNoZWNrZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMzVcIiBkYXRhLWwxMG4taWQ9XCJlZGl0b3JfaW5rMlwiPlxuICAgICAgICAgIDxzcGFuIGRhdGEtbDEwbi1pZD1cImVkaXRvcl9pbmsyX2xhYmVsXCI+RHJhdzwvc3Bhbj5cbiAgICAgICAgICA8c3ZnIHN0eWxlPVwid2lkdGg6MjBweDtoZWlnaHQ6MjBweFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiBlbmFibGUtYmFja2dyb3VuZD1cIm5ldyAwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgIDxnPlxuICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09XCJzY2FsZSgwLjAzMTI1KVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBkPVwibTQ1NS4xLDEzNy45bC0zMi40LDMyLjQtODEtODEuMSAzMi40LTMyLjRjNi42LTYuNiAxOC4xLTYuNiAyNC43LDBsNTYuMyw1Ni40YzYuOCw2LjggNi44LDE3LjkgMCwyNC43em0tMjcwLjcsMjcxbC04MS04MS4xIDIwOS40LTIwOS43IDgxLDgxLjEtMjA5LjQsMjA5Ljd6bS05OS43LTQybDYwLjYsNjAuNy04NC40LDIzLjggMjMuOC04NC41em0zOTkuMy0yODIuNmwtNTYuMy01Ni40Yy0xMS0xMS01MC43LTMxLjgtODIuNCwwbC0yODUuMywyODUuNWMtMi41LDIuNS00LjMsNS41LTUuMiw4LjlsLTQzLDE1My4xYy0yLDcuMSAwLjEsMTQuNyA1LjIsMjAgNS4yLDUuMyAxNS42LDYuMiAyMCw1LjJsMTUzLTQzLjFjMy40LTAuOSA2LjQtMi43IDguOS01LjJsMjg1LjEtMjg1LjVjMjIuNy0yMi43IDIyLjctNTkuNyAwLTgyLjV6XCIgLz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZWRpdG9yTW9kZVNlcGFyYXRvclwiIGNsYXNzPVwidmVydGljYWxUb29sYmFyU2VwYXJhdG9yXCI+PC9kaXY+XG5cbiAgICAgIDxwZGYtdG9nZ2xlLXNlY29uZGFyeS10b29sYmFyIFtzaG93U2Vjb25kYXJ5VG9vbGJhckJ1dHRvbl09XCJzaG93U2Vjb25kYXJ5VG9vbGJhckJ1dHRvblwiPlxuICAgICAgPC9wZGYtdG9nZ2xlLXNlY29uZGFyeS10b29sYmFyPlxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==