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.

813 lines (802 loc) 938 kB
import * as i0 from '@angular/core'; import { Component, Injectable, ViewEncapsulation, Inject, Input, EventEmitter, ViewChild, Output, HostListener, Pipe, PLATFORM_ID, ChangeDetectionStrategy, NgModule } from '@angular/core'; import * as i2 from '@angular/common'; import { DOCUMENT, isPlatformBrowser, CommonModule, Location } from '@angular/common'; import { Subject } from 'rxjs'; import * as i2$1 from '@angular/forms'; import { FormsModule } from '@angular/forms'; import { take } from 'rxjs/operators'; const _isIE11 = typeof window === 'undefined' ? false : !!window.MSInputMethodContext && !!document.documentMode; const isEdge = typeof navigator === 'undefined' || /Edge\/\d./i.test(navigator.userAgent); const needsES5 = typeof ReadableStream === 'undefined' || typeof Promise['allSettled'] === 'undefined'; const pdfjsVersion = '2.12.557'; const pdfjsBleedingEdgeVersion = '2.13.408'; function getVersionSuffix(folder) { if (folder && folder.includes('bleeding-edge')) { return pdfjsBleedingEdgeVersion; } return pdfjsVersion; } let pdfDefaultOptions = { needsES5: _isIE11 || isEdge || needsES5, cursorToolOnLoad: 0, defaultUrl: '', defaultZoomValue: undefined, disableHistory: false, disablePageLabels: false, enablePrintAutoRotate: false, enableWebGL: false, eventBusDispatchToDOM: false, externalLinkRel: 'noopener noreferrer nofollow', externalLinkTarget: 0, historyUpdateUrl: false, ignoreDestinationZoom: false, imageResourcesPath: './images/', maxCanvasPixels: 16777216, pdfBugEnabled: false, rangeChunkSize: 65536, removePageBorders: false, renderer: 'canvas', renderInteractiveForms: true, renderForms: true, enableXfa: true, sidebarViewOnLoad: -1, scrollModeOnLoad: -1, spreadModeOnLoad: -1, textLayerMode: 2, useOnlyCssZoom: false, viewOnLoad: 0, cMapPacked: true, cMapUrl: () => `./${pdfDefaultOptions.assetsFolder}/cmaps/`, disableAutoFetch: false, disableCreateObjectURL: false, disableFontFace: false, disableRange: false, disableStream: false, isEvalSupported: true, maxImageSize: -1, pdfBug: false, postMessageTransfers: true, verbosity: 1, workerPort: null, assetsFolder: 'assets', sandboxBundleSrc: () => pdfDefaultOptions.needsES5 ? `./${pdfDefaultOptions.assetsFolder}/pdf.sandbox-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}-es5.js` : `./${pdfDefaultOptions.assetsFolder}/pdf.sandbox-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}.js`, workerSrc: () => pdfDefaultOptions.needsES5 ? `./${pdfDefaultOptions.assetsFolder}/pdf.worker-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}-es5.js` : `./${pdfDefaultOptions.assetsFolder}/pdf.worker-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}.js`, // options specific to ngx-extended-pdf-viewer (as opposed to being used by pdf.js) doubleTapZoomFactor: 'page-width', enableScripting: true, defaultCacheSize: 50, passwordPrompt: undefined, }; if (typeof window !== 'undefined') { if (window.pdfDefaultOptions) { pdfDefaultOptions = window.pdfDefaultOptions; } else { window.pdfDefaultOptions = pdfDefaultOptions; } } var VerbosityLevel; (function (VerbosityLevel) { VerbosityLevel[VerbosityLevel["ERRORS"] = 0] = "ERRORS"; VerbosityLevel[VerbosityLevel["WARNINGS"] = 1] = "WARNINGS"; VerbosityLevel[VerbosityLevel["INFOS"] = 5] = "INFOS"; })(VerbosityLevel || (VerbosityLevel = {})); ; var FindState; (function (FindState) { FindState[FindState["FOUND"] = 0] = "FOUND"; FindState[FindState["NOT_FOUND"] = 1] = "NOT_FOUND"; FindState[FindState["WRAPPED"] = 2] = "WRAPPED"; FindState[FindState["PENDING"] = 3] = "PENDING"; })(FindState || (FindState = {})); /** List of all field that can be customized */ const requiredIds = [ 'toolbarViewer', 'numPages', 'pageNumber', 'scaleSelectContainer', 'customScaleOption', 'previous', 'next', 'zoomIn', 'zoomOut', 'viewFind', 'openFile', 'print', 'presentationMode', 'download', 'viewBookmark', 'secondaryToolbar', 'secondaryToolbarToggle', 'secondaryToolbarButtonContainer', 'secondaryPresentationMode', 'secondaryOpenFile', 'secondaryPrint', 'secondaryDownload', 'secondaryViewBookmark', 'firstPage', 'lastPage', 'pageRotateCw', 'pageRotateCcw', 'cursorSelectTool', 'cursorHandTool', 'scrollVertical', 'scrollHorizontal', 'scrollWrapped', 'spreadNone', 'spreadOdd', 'spreadEven', 'documentProperties', 'contextFirstPage', 'contextLastPage', 'contextPageRotateCw', 'contextPageRotateCcw', 'currentOutlineItem', 'outerContainer', 'viewerContainer', 'sidebarToggle', 'viewThumbnail', 'viewOutline', 'viewAttachments', 'thumbnailView', 'outlineView', 'attachmentsView', 'outerContainer', 'sidebarResizer', 'outlineOptionsContainer', 'findbar', 'viewFind', 'findInput', 'findInputMultiline', 'findHighlightAll', 'findCurrentPage', 'findRange', 'findMatchCase', 'findMatchDiacritics', 'findEntireWord', 'findMultipleSearchTexts', 'findIgnoreAccents', 'findMsg', 'findResultsCount', 'findPrevious', 'findNext', 'findFuzzy', 'passwordOverlay', 'passwordText', 'password', 'passwordSubmit', 'passwordCancel', 'documentPropertiesOverlay', 'documentPropertiesClose', 'fileNameField', 'fileSizeField', 'titleField', 'authorField', 'subjectField', 'keywordsField', 'creationDateField', 'modificationDateField', 'creatorField', 'producerField', 'versionField', 'pageCountField', 'pageSizeField', 'linearizedField', 'errorWrapper', 'errorMessage', 'errorClose', 'errorMoreInfo', 'errorShowMore', 'errorShowLess', 'scaleSelectContainer', 'viewAttachments', 'viewLayers', 'viewThumbnail', 'viewOutline', ]; class PdfDummyComponentsComponent { addMissingStandardWidgets() { this.dummyComponentsContainer = document.getElementsByClassName('dummy-pdf-viewer-components')[0]; const container = this.dummyComponentsContainer; if (container) { for (let i = 0; i < container.children.length; i++) { const child = container.firstChild; if (child) { container.removeChild(child); } } } requiredIds.forEach(id => { if (this.needsDummyWidget(id)) { const dummy = document.createElement('span'); dummy.id = id; dummy.className = 'invisible dummy-component'; this.dummyComponentsContainer.appendChild(dummy); } }); if (this.needsDummyWidget('scaleSelect')) { const dummy = document.createElement('select'); dummy.id = 'scaleSelect'; dummy.className = 'invisible dummy-component'; this.dummyComponentsContainer.appendChild(dummy); } } needsDummyWidget(id) { const widget = document.getElementById(id); if (!widget) { return true; } return false; } } PdfDummyComponentsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfDummyComponentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); PdfDummyComponentsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: PdfDummyComponentsComponent, selector: "pdf-dummy-components", ngImport: i0, template: "<span class=\"invisible dummy-pdf-viewer-components\">\n</span>\n" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfDummyComponentsComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-dummy-components', template: "<span class=\"invisible dummy-pdf-viewer-components\">\n</span>\n" }] }] }); var PdfCursorTools; (function (PdfCursorTools) { PdfCursorTools[PdfCursorTools["SELECT"] = 0] = "SELECT"; PdfCursorTools[PdfCursorTools["HAND"] = 1] = "HAND"; PdfCursorTools[PdfCursorTools["ZOOM"] = 2] = "ZOOM"; })(PdfCursorTools || (PdfCursorTools = {})); class PinchOnMobileSupport { constructor(_zone) { this._zone = _zone; this.startX = 0; this.startY = 0; this.initialPinchDistance = 0; this.pinchScale = 1; this.boundOnViewerTouchStart = this.onViewerTouchStart.bind(this); this.boundOnViewerTouchMove = this.onViewerTouchMove.bind(this); this.boundOnViewerTouchEnd = this.onViewerTouchEnd.bind(this); this.initializePinchZoom(); } isMobile() { return ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0); } onViewerTouchStart(event) { this.initialPinchDistance = 0; if (event.touches.length === 2) { const container = document.getElementById('viewerContainer'); const rect = container.getBoundingClientRect(); if (event.touches[0].pageX >= rect.left && event.touches[0].pageX <= rect.right) { if (event.touches[0].pageY >= (rect.top + window.scrollY) && event.touches[0].pageY <= (rect.bottom + window.scrollY)) { if (event.touches[1].pageX >= rect.left && event.touches[1].pageX <= rect.right) { if (event.touches[1].pageY >= (rect.top + window.scrollY) && event.touches[1].pageY <= (rect.bottom + window.scrollY)) { this.startX = (event.touches[0].pageX + event.touches[1].pageX) / 2; this.startY = (event.touches[0].pageY + event.touches[1].pageY) / 2; this.initialPinchDistance = Math.hypot(event.touches[1].pageX - event.touches[0].pageX, event.touches[1].pageY - event.touches[0].pageY); if (event.cancelable) { event.preventDefault(); } event.stopPropagation(); } } } } } } onViewerTouchMove(event) { const PDFViewerApplicationOptions = window.PDFViewerApplicationOptions; const PDFViewerApplication = window.PDFViewerApplication; if (this.initialPinchDistance <= 0 || event.touches.length !== 2) { return; } const pinchDistance = Math.hypot(event.touches[1].pageX - event.touches[0].pageX, event.touches[1].pageY - event.touches[0].pageY); const container = document.getElementById('viewerContainer'); const originX = this.startX + container.scrollLeft; const originY = this.startY + container.scrollTop; this.pinchScale = pinchDistance / this.initialPinchDistance; let minZoom = Number(PDFViewerApplicationOptions.get('minZoom')); if (!minZoom) { minZoom = 0.1; } const currentZoom = PDFViewerApplication.pdfViewer._currentScale; if (currentZoom * this.pinchScale < minZoom) { this.pinchScale = minZoom / currentZoom; } let maxZoom = Number(PDFViewerApplicationOptions.get('maxZoom')); if (!maxZoom) { maxZoom = 10; } if (currentZoom * this.pinchScale > maxZoom) { this.pinchScale = maxZoom / currentZoom; } this.viewer.style.transform = `scale(${this.pinchScale})`; this.viewer.style.transformOrigin = `${originX}px ${originY}px`; if (event.cancelable) { event.preventDefault(); } event.stopPropagation(); } onViewerTouchEnd(event) { const PDFViewerApplication = window.PDFViewerApplication; if (this.initialPinchDistance <= 0) { return; } this.viewer.style.transform = `none`; this.viewer.style.transformOrigin = `unset`; PDFViewerApplication.pdfViewer.currentScale *= this.pinchScale; const container = document.getElementById('viewerContainer'); const rect = container.getBoundingClientRect(); const dx = this.startX - rect.left; const dy = this.startY - rect.top; container.scrollLeft += dx * (this.pinchScale - 1); container.scrollTop += dy * (this.pinchScale - 1); this.resetPinchZoomParams(); if (event.cancelable) { event.preventDefault(); } event.stopPropagation(); } resetPinchZoomParams() { this.startX = this.startY = this.initialPinchDistance = 0; this.pinchScale = 1; } initializePinchZoom() { if (!this.isMobile()) { return; } this.viewer = document.getElementById('viewer'); this._zone.runOutsideAngular(() => { document.addEventListener('touchstart', this.boundOnViewerTouchStart); document.addEventListener('touchmove', this.boundOnViewerTouchMove, { passive: false }); document.addEventListener('touchend', this.boundOnViewerTouchEnd); }); } destroyPinchZoom() { if (!this.isMobile()) { return; } document.removeEventListener('touchstart', this.boundOnViewerTouchStart); document.removeEventListener('touchmove', this.boundOnViewerTouchMove); document.removeEventListener('touchend', this.boundOnViewerTouchEnd); } } var ScrollModeType; (function (ScrollModeType) { ScrollModeType[ScrollModeType["vertical"] = 0] = "vertical"; ScrollModeType[ScrollModeType["horizontal"] = 1] = "horizontal"; ScrollModeType[ScrollModeType["wrapped"] = 2] = "wrapped"; ScrollModeType[ScrollModeType["page"] = 3] = "page"; })(ScrollModeType || (ScrollModeType = {})); var SpreadModeType; (function (SpreadModeType) { SpreadModeType[SpreadModeType["UNKNOWN"] = -1] = "UNKNOWN"; SpreadModeType[SpreadModeType["NONE"] = 0] = "NONE"; SpreadModeType[SpreadModeType["ODD"] = 1] = "ODD"; SpreadModeType[SpreadModeType["EVEN"] = 2] = "EVEN"; })(SpreadModeType || (SpreadModeType = {})); class UnitToPx { static initElements() { if (!document) { return; } if (!this.con || !this.el) { this.con = document.createElement('div'); this.el = document.createElement('div'); } this.con.style.position = 'absolute'; this.con.style.width = '0'; this.con.style.height = '0'; this.con.style.visibility = 'hidden'; this.con.style.overflow = 'hidden'; this.con.appendChild(this.el); } static pxPerUnit(unit) { if (!this.pxPerUnitCache[unit]) { if (!this.con || !this.el) { this.initElements(); } if (!this.con || !this.el) { // dummy implementation for server-side rendering return 1; } this.el.style.width = this.sample + unit; document.body.appendChild(this.con); const dimension = this.el.getBoundingClientRect(); this.con.parentNode.removeChild(this.con); this.pxPerUnitCache[unit] = dimension.width / this.sample; } return this.pxPerUnitCache[unit]; } static toPx(length) { const unitRe = /^\s*([+-]?[\d\.]*)\s*(.*)\s*$/i; const match = unitRe.exec(length); if (match != null && match.length > 2) { const bare = match[1] === ''; const val = bare ? 1 : Number(match[1]); const unit = match[2]; const valid = !isNaN(val) && unit; if (valid) { return unit === 'px' ? val : this.pxPerUnit(unit) * val; } } throw new TypeError('Error parsing length'); } } // cache this.con, el for reused UnitToPx.con = undefined; UnitToPx.el = undefined; // high sample will more accurate? UnitToPx.sample = 100; UnitToPx.pxPerUnitCache = {}; class PDFNotificationService { constructor() { // this event is fired when the pdf.js library has been loaded and objects like PDFApplication are available this.onPDFJSInit = new Subject(); this.pdfjsVersion = getVersionSuffix(pdfDefaultOptions.assetsFolder); } } PDFNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PDFNotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); PDFNotificationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PDFNotificationService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PDFNotificationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); class NgxExtendedPdfViewerService$1 { constructor() { this.recalculateSize$ = new Subject(); } findMultiple(text, options = {}) { options = { ...options, findMultipleSearchTexts: true, }; const searchString = text.join('\n') + '\n'; return this.find(searchString, options); } find(text, options = {}) { if (!NgxExtendedPdfViewerComponent.ngxExtendedPdfViewerInitialized) { // tslint:disable-next-line:quotemark console.error("The PDF viewer hasn't finished initializing. Please call find() later."); return false; } else { const highlightAllCheckbox = document.getElementById('findHighlightAll'); if (highlightAllCheckbox) { highlightAllCheckbox.checked = options.highlightAll || false; } const findPageRange = document.getElementById('findRange'); if (findPageRange) { findPageRange.value = options.pageRange || ''; } const findCurrentPageCheckbox = document.getElementById('findCurrentPage'); if (findCurrentPageCheckbox) { findCurrentPageCheckbox.checked = options.currentPage || false; } const matchCaseCheckbox = document.getElementById('findMatchCase'); if (matchCaseCheckbox) { matchCaseCheckbox.checked = options.matchCase || false; } const entireWordCheckbox = document.getElementById('findEntireWord'); if (entireWordCheckbox) { entireWordCheckbox.checked = options.wholeWords || false; } const findIgnoreAccentsCheckbox = document.getElementById('findIgnoreAccents'); if (findIgnoreAccentsCheckbox) { findIgnoreAccentsCheckbox.checked = options.ignoreAccents || false; } const multipleSearchTerms = options.findMultipleSearchTexts || text.includes('\n') || false; const findMultipleSearchTextsCheckbox = document.getElementById('findMultipleSearchTexts'); if (findMultipleSearchTextsCheckbox) { findMultipleSearchTextsCheckbox.checked = multipleSearchTerms; } const individualWordsModeCheckbox = document.getElementById('individualWordsMode'); if (individualWordsModeCheckbox) { individualWordsModeCheckbox.checked = false; } const fuzzySearchCheckbox = document.getElementById('findFuzzy'); if (fuzzySearchCheckbox) { fuzzySearchCheckbox.checked = options.fuzzySearch || false; } const inputField = multipleSearchTerms ? document.getElementById('findInputMultiline') : document.getElementById('findInput'); if (inputField) { if (inputField instanceof HTMLTextAreaElement) { inputField.value = text; // todo dirty hack! inputField.classList.remove('hidden'); document.getElementById('findInput').classList.add('hidden'); document.getElementById('individualWordsModeLabel').classList.remove('hidden'); document.getElementById('individualWordsMode').classList.remove('hidden'); // end of the dirty hack } else if (inputField instanceof HTMLInputElement) { inputField.value = text; // todo dirty hack! inputField.classList.remove('hidden'); document.getElementById('findInputMultiline').classList.add('hidden'); document.getElementById('individualWordsModeLabel').classList.add('hidden'); document.getElementById('individualWordsMode').classList.add('hidden'); // end of the dirty hack } inputField.dispatchEvent(new Event('input')); return true; } else { // tslint:disable-next-line:quotemark console.error("Unexpected error: the input field used to search isn't part of the DOM."); return false; } } } findNext() { if (!NgxExtendedPdfViewerComponent.ngxExtendedPdfViewerInitialized) { // tslint:disable-next-line:quotemark console.error("The PDF viewer hasn't finished initializing. Please call findNext() later."); return false; } else { const button = document.getElementById('findNext'); if (button) { button.click(); return true; } return false; } } findPrevious() { if (!NgxExtendedPdfViewerComponent.ngxExtendedPdfViewerInitialized) { // tslint:disable-next-line:quotemark console.error("The PDF viewer hasn't finished initializing. Please call findPrevious() later."); return false; } else { const button = document.getElementById('findPrevious'); if (button) { button.click(); return true; } return false; } } print(printRange) { const PDFViewerApplication = window.PDFViewerApplication; const alreadyThere = !!window['isInPDFPrintRange'] && !printRange; if (!alreadyThere) { if (!printRange) { printRange = {}; } this.setPrintRange(printRange); } window.printPDF(); if (!alreadyThere) { PDFViewerApplication.eventBus.on('afterprint', () => { this.removePrintRange(); }); } } removePrintRange() { window['isInPDFPrintRange'] = undefined; window['filteredPageCount'] = undefined; } setPrintRange(printRange) { const PDFViewerApplication = window.PDFViewerApplication; window['isInPDFPrintRange'] = (page) => this.isInPDFPrintRange(page, printRange); window['filteredPageCount'] = this.filteredPageCount(PDFViewerApplication.pagesCount, printRange); } filteredPageCount(pageCount, range) { let result = 0; for (let page = 1; page <= pageCount; page++) { if (this.isInPDFPrintRange(page, range)) { result++; } } return result; } isInPDFPrintRange(pageIndex, printRange) { const page = pageIndex + 1; if (printRange.from) { if (page < printRange.from) { return false; } } if (printRange.to) { if (page > printRange.to) { return false; } } if (printRange.excluded) { let e = printRange.excluded; if (e.some((p) => p === page)) { return false; } } if (printRange.included) { if (!printRange.included.some((p) => p === page)) { return false; } } return true; } getPageAsText(pageNumber) { const PDFViewerApplication = window.PDFViewerApplication; const pdfDocument = PDFViewerApplication.pdfDocument; const pagePromise = pdfDocument.getPage(pageNumber); const extractTextSnippets = (pdfPage) => new Promise((resolve, reject) => { const textSnippets = pdfPage.getTextContent(); resolve(textSnippets); }); const combineTextSnippets = (textSnippets) => new Promise((resolve, reject) => { const text = this.convertTextInfoToText(textSnippets); resolve(text); }); return pagePromise.then(extractTextSnippets).then(combineTextSnippets); } convertTextInfoToText(textInfo) { if (!textInfo) { return ''; } return textInfo.items.map((info) => info.str).join(''); } getPageAsImage(pageNumber, scale) { const PDFViewerApplication = window.PDFViewerApplication; const pdfDocument = PDFViewerApplication.pdfDocument; const pagePromise = pdfDocument.getPage(pageNumber); const imagePromise = (pdfPage) => new Promise((resolve, reject) => { resolve(this.draw(pdfPage, scale)); }); return pagePromise.then(imagePromise); } draw(pdfPage, scale) { let zoomFactor = 1; if (scale.scale) { zoomFactor = scale.scale; } else if (scale.width) { zoomFactor = scale.width / pdfPage.getViewport({ scale: 1 }).width; } else if (scale.height) { zoomFactor = scale.height / pdfPage.getViewport({ scale: 1 }).height; } const viewport = pdfPage.getViewport({ scale: zoomFactor, }); const { ctx, canvas } = this.getPageDrawContext(viewport.width, viewport.height); const drawViewport = viewport.clone(); const renderContext = { canvasContext: ctx, viewport: drawViewport, // background: 'rgba(255, 0, 255, 0.3)', }; const renderTask = pdfPage.render(renderContext); const dataUrlPromise = () => new Promise((resolve, reject) => { resolve(canvas.toDataURL()); }); return renderTask.promise.then(dataUrlPromise); } getPageDrawContext(width, height) { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d', { alpha: false }); if (!ctx) { // tslint:disable-next-line: quotemark throw new Error("Couldn't create the 2d context"); } canvas.width = width; canvas.height = height; canvas.style.width = width + 'px'; canvas.style.height = height + 'px'; return { ctx, canvas }; } async getCurrentDocumentAsBlob() { const PDFViewerApplication = window.PDFViewerApplication; const data = await PDFViewerApplication.pdfDocument.saveDocument(PDFViewerApplication.pdfDocument.annotationStorage); return new Blob([data], { type: 'application/pdf' }); } async getFormData() { const PDFViewerApplication = window.PDFViewerApplication; const pdf /*: PDFDocumentProxy */ = PDFViewerApplication.pdfDocument; // screen DPI / PDF DPI const dpiRatio = 96 / 72; const result = []; for (let i = 1; i <= pdf.numPages; i++) { // track the current page const currentPage /* : PDFPageProxy */ = await pdf.getPage(i); const annotations = await currentPage.getAnnotations(); annotations .filter((a) => a.subtype === 'Widget') // get the form field annotations only .forEach((a) => { // get the rectangle that represent the single field // and resize it according to the current DPI const fieldRect = currentPage.getViewport({ scale: dpiRatio }).convertToViewportRectangle(a.rect); // add the corresponding input result.push({ fieldAnnotation: a, fieldRect, pageNumber: i }); }); } return result; } /** * Adds a page to the rendering queue * @param {number} pageIndex Index of the page to render * @returns {boolean} false, if the page has already been rendered * or if it's out of range */ addPageToRenderQueue(pageIndex) { const PDFViewerApplication = window.PDFViewerApplication; return PDFViewerApplication.pdfViewer.addPageToRenderQueue(pageIndex); } isRenderQueueEmpty() { const scrolledDown = true; const renderExtra = false; const PDFViewerApplication = window.PDFViewerApplication; const nextPage = PDFViewerApplication.pdfViewer.renderingQueue.getHighestPriority(PDFViewerApplication.pdfViewer._getVisiblePages(), PDFViewerApplication.pdfViewer._pages, scrolledDown, renderExtra); return !nextPage; } hasPageBeenRendered(pageIndex) { const PDFViewerApplication = window.PDFViewerApplication; const pages = PDFViewerApplication.pdfViewer._pages; if (pages.length > pageIndex && pageIndex >= 0) { const pageView = pages[pageIndex]; const isLoading = pageView.div.querySelector('.loadingIcon'); return !isLoading; } return false; } currentlyRenderedPages() { const PDFViewerApplication = window.PDFViewerApplication; const pages = PDFViewerApplication.pdfViewer._pages; return pages.filter((page) => !page.div.querySelector('.loadingIcon')).map((page) => page.id); } numberOfPages() { const PDFViewerApplication = window.PDFViewerApplication; const pages = PDFViewerApplication.pdfViewer._pages; return pages.length; } getCurrentlyVisiblePageNumbers() { const app = window.PDFViewerApplication; const pages = app.pdfViewer._getVisiblePages().views; const pageNumbers = pages?.map((page) => page.id); return pageNumbers; } recalculateSize() { this.recalculateSize$.next(); } async listLayers() { const PDFViewerApplication = window.PDFViewerApplication; const optionalContentConfig = await PDFViewerApplication.pdfViewer.optionalContentConfigPromise; if (optionalContentConfig) { const levelData = optionalContentConfig.getOrder(); console.log(levelData); const layerIds = levelData.filter((groupId) => typeof groupId !== 'object'); return layerIds.map((layerId) => { const config = optionalContentConfig.getGroup(layerId); return { layerId: layerId, name: config.name, visible: config.visible, }; }); } return undefined; } async toggleLayer(layerId) { const PDFViewerApplication = window.PDFViewerApplication; const optionalContentConfig = await PDFViewerApplication.pdfViewer.optionalContentConfigPromise; if (optionalContentConfig) { let isVisible = optionalContentConfig.isVisible(layerId); const checkbox = document.querySelector(`input[id='${layerId}']`); if (checkbox) { isVisible = checkbox.checked; checkbox.checked = !isVisible; } optionalContentConfig.setVisibility(layerId, !isVisible); PDFViewerApplication.eventBus.dispatch('optionalcontentconfig', { source: this, promise: Promise.resolve(optionalContentConfig), }); } } } class PdfDarkThemeComponent { } PdfDarkThemeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfDarkThemeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); PdfDarkThemeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: PdfDarkThemeComponent, selector: "pdf-dark-theme", ngImport: i0, template: "", styles: ["ngx-extended-pdf-viewer .fancyDropdownToolbarButton:after{content:url(\"data:image/svg+xml; utf8, <svg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path fill='rgb(217, 217, 217)' d='M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z' /></svg>\")}ngx-extended-pdf-viewer :root{--annotation-unfocused-field-background: url(\"data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>\")}ngx-extended-pdf-viewer .annotationLayer section{position:absolute;text-align:initial}ngx-extended-pdf-viewer .annotationLayer .linkAnnotation>a,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.pushButton>a{position:absolute;font-size:1em;top:0;left:0;width:100%;height:100%}ngx-extended-pdf-viewer .annotationLayer .linkAnnotation>a:hover,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.pushButton>a:hover{opacity:.2;background:yellow;box-shadow:0 2px 10px #ff0}ngx-extended-pdf-viewer .annotationLayer .textAnnotation img{position:absolute;cursor:pointer}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input{background-image:url(\"data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>\");border:1px solid transparent;box-sizing:border-box;font-size:9px;height:100%;margin:0;padding:0 3px;vertical-align:top;width:100%}ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select option{padding:0}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input{border-radius:50%}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea{font:message-box;font-size:9px;resize:none}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input[disabled],ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea[disabled],ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select[disabled],ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input[disabled]{background:none;border:1px solid transparent;cursor:not-allowed}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input:hover,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea:hover,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select:hover,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:hover,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input:hover{border:1px solid black}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input:focus,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea:focus,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select:focus{background:none;border:1px solid transparent}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input :focus,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea :focus,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select :focus,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox :focus,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton :focus{background-image:none;background-color:transparent;outline:auto}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before{background-color:#000;content:\"\";display:block;position:absolute}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after{height:80%;left:45%;width:1px}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before{transform:rotate(45deg)}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after{transform:rotate(-45deg)}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before{border-radius:50%;height:50%;left:30%;top:20%;width:50%}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input.comb{font-family:monospace;padding-left:2px;padding-right:0}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0}ngx-extended-pdf-viewer .annotationLayer .popupWrapper{position:absolute;width:20em}ngx-extended-pdf-viewer .annotationLayer .popup{position:absolute;z-index:200;max-width:20em;background-color:#ff9;box-shadow:0 2px 5px #888;border-radius:2px;padding:6px;margin-left:5px;cursor:pointer;font:message-box;font-size:9px;white-space:normal;word-wrap:break-word}ngx-extended-pdf-viewer .annotationLayer .popup>*{font-size:9px}ngx-extended-pdf-viewer .annotationLayer .popup h1{display:inline-block}ngx-extended-pdf-viewer .annotationLayer .popup span{display:inline-block;margin-left:5px}ngx-extended-pdf-viewer .annotationLayer .popup p{border-top:1px solid #333333;margin-top:2px;padding-top:2px}ngx-extended-pdf-viewer .annotationLayer .highlightAnnotation,ngx-extended-pdf-viewer .annotationLayer .underlineAnnotation,ngx-extended-pdf-viewer .annotationLayer .squigglyAnnotation,ngx-extended-pdf-viewer .annotationLayer .strikeoutAnnotation,ngx-extended-pdf-viewer .annotationLayer .freeTextAnnotation,ngx-extended-pdf-viewer .annotationLayer .lineAnnotation svg line,ngx-extended-pdf-viewer .annotationLayer .squareAnnotation svg rect,ngx-extended-pdf-viewer .annotationLayer .circleAnnotation svg ellipse,ngx-extended-pdf-viewer .annotationLayer .polylineAnnotation svg polyline,ngx-extended-pdf-viewer .annotationLayer .polygonAnnotation svg polygon,ngx-extended-pdf-viewer .annotationLayer .caretAnnotation,ngx-extended-pdf-viewer .annotationLayer .inkAnnotation svg polyline,ngx-extended-pdf-viewer .annotationLayer .stampAnnotation,ngx-extended-pdf-viewer .annotationLayer .fileAttachmentAnnotation{cursor:pointer}ngx-extended-pdf-viewer :root{--xfa-unfocused-field-background: url(\"data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>\")}ngx-extended-pdf-viewer .xfaLayer .highlight{margin:-1px;padding:1px;background-color:#efcbed;border-radius:4px}ngx-extended-pdf-viewer .xfaLayer .highlight.appended{position:initial}ngx-extended-pdf-viewer .xfaLayer .highlight.begin{border-radius:4px 0 0 4px}ngx-extended-pdf-viewer .xfaLayer .highlight.end{border-radius:0 4px 4px 0}ngx-extended-pdf-viewer .xfaLayer .highlight.middle{border-radius:0}ngx-extended-pdf-viewer .xfaLayer .highlight.selected{background-color:#cbdfcb}ngx-extended-pdf-viewer .xfaLayer ::selection{background:blue}ngx-extended-pdf-viewer .xfaPage{overflow:hidden;position:relative}ngx-extended-pdf-viewer .xfaContentarea{position:absolute}ngx-extended-pdf-viewer .xfaPrintOnly{display:none}ngx-extended-pdf-viewer .xfaLayer{position:absolute;text-align:initial;top:0;left:0;transform-origin:0 0;line-height:1.2}ngx-extended-pdf-viewer .xfaLayer *{color:inherit;font:inherit;font-style:inherit;font-weight:inherit;font-feature-settings:inherit;font-kerning:inherit;letter-spacing:-.01px;text-align:inherit;text-decoration:inherit;box-sizing:border-box;background-color:transparent;padding:0;margin:0;pointer-events:auto;line-height:inherit}ngx-extended-pdf-viewer .xfaLayer div{pointer-events:none}ngx-extended-pdf-viewer .xfaLayer svg{pointer-events:none}ngx-extended-pdf-viewer .xfaLayer svg *{pointer-events:none}ngx-extended-pdf-viewer .xfaLayer a{color:#00f}ngx-extended-pdf-viewer .xfaRich li{margin-left:3em}ngx-extended-pdf-viewer .xfaFont{color:#000;font-weight:400;font-feature-settings:\"kern\" off;font-kerning:none;font-size:10px;font-style:normal;letter-spacing:0;text-decoration:none;vertical-align:0}ngx-extended-pdf-viewer .xfaCaption{overflow:hidden;flex:0 0 auto}ngx-extended-pdf-viewer .xfaCaptionForCheckButton{overflow:hidden;flex:1 1 auto}ngx-extended-pdf-viewer .xfaLabel{height:100%;width:100%}ngx-extended-pdf-viewer .xfaLeft{display:flex;flex-direction:row;align-items:center}ngx-extended-pdf-viewer .xfaRight{display:flex;flex-direction:row-reverse;align-items:center}ngx-extended-pdf-viewer .xfaLeft>.xfaCaption,ngx-extended-pdf-viewer .xfaLeft>.xfaCaptionForCheckButton,ngx-extended-pdf-viewer .xfaRight>.xfaCaption,ngx-extended-pdf-viewer .xfaRight>.xfaCaptionForCheckButton{max-height:100%}ngx-extended-pdf-viewer .xfaTop{display:flex;flex-direction:column;align-items:flex-start}ngx-extended-pdf-viewer .xfaBottom{display:flex;flex-direction:column-reverse;align-items:flex-start}ngx-extended-pdf-viewer .xfaTop>.xfaCaption,ngx-extended-pdf-viewer .xfaTop>.xfaCaptionForCheckButton,ngx-extended-pdf-viewer .xfaBottom>.xfaCaption,ngx-extended-pdf-viewer .xfaBottom>.xfaCaptionForCheckButton{width:100%}ngx-extended-pdf-viewer .xfaBorder{background-color:transparent;position:absolute;pointer-events:none}ngx-extended-pdf-viewer .xfaWrapped{width:100%;height:100%}ngx-extended-pdf-viewer .xfaTextfield:focus,ngx-extended-pdf-viewer .xfaSelect:focus{background-image:none;background-color:transparent;outline:auto;outline-offset:-1px}ngx-extended-pdf-viewer .xfaCheckbox:focus,ngx-extended-pdf-viewer .xfaRadio:focus{outline:auto}ngx-extended-pdf-viewer .xfaTextfield,ngx-extended-pdf-viewer .xfaSelect{height:100%;width:100%;flex:1 1 auto;border:none;resize:none;background-image:var(--xfa-unfocused-field-background)}ngx-extended-pdf-viewer .xfaTop>.xfaTextfield,ngx-extended-pdf-viewer .xfaTop>.xfaSelect,ngx-extended-pdf-viewer .xfaBottom>.xfaTextfield,ngx-extended-pdf-viewer .xfaBottom>.xfaSelect{flex:0 1 auto}ngx-extended-pdf-viewer .xfaButton{cursor:pointer;width:100%;height:100%;border:none;text-align:center}ngx-extended-pdf-viewer .xfaLink{width:100%;height:100%}ngx-extended-pdf-viewer .xfaCheckbox,ngx-extended-pdf-viewer .xfaRadio{width:100%;height:100%;flex:0 0 auto;border:none}ngx-extended-pdf-viewer .xfaRich{white-space:pre-wrap;width:100%;height:100%}ngx-extended-pdf-viewer .xfaImage{object-position:left top;object-fit:contain;width:100%;height:100%}ngx-extended-pdf-viewer .xfaLrTb,ngx-extended-pdf-viewer .xfaRlTb,ngx-extended-pdf-viewer .xfaTb{display:flex;flex-direction:column;align-items:stretch}ngx-extended-pdf-viewer .xfaLr{display:flex;flex-direction:row;align-items:stretch}ngx-extended-pdf-viewer .xfaRl{display:flex;flex-direction:row-reverse;align-items:stretch}ngx-extended-pdf-viewer .xfaTb>div{justify-content:left}ngx-extended-pdf-viewer .xfaPosition{position:relative}ngx-extended-pdf-viewer .xfaArea{position:relative}ngx-extended-pdf-viewer .xfaValignMiddle{display:flex;align-items:center}ngx-extended-pdf-viewer .xfaTable{display:flex;flex-direction:column;align-items:stretch}ngx-extended-pdf-viewer .xfaTable .xfaRow{display:flex;flex-direction:row;align-items:stretch}ngx-extended-pdf-viewer .xfaTable .xfaRlRow{display:flex;flex-direction:row-reverse;align-items:stretch;flex:1}ngx-extended-pdf-viewer .xfaTable .xfaRlRow>div{flex:1}ngx-extended-pdf-viewer .xfaNonInteractive input,ngx-extended-pdf-viewer .xfaNonInteractive textarea,ngx-extended-pdf-viewer .xfaDisabled input,ngx-extended-pdf-viewer .xfaDisabled textarea,ngx-extended-pdf-viewer .xfaReadOnly input,ngx-extended-pdf-viewer .xfaReadOnly textarea{background:initial}@media print{ngx-extended-pdf-viewer .xfaTextfield,ngx-extended-pdf-viewer .xfaSelect{background:transparent}ngx-extended-pdf-viewer .xfaSelect{-webkit-appearance:none;-moz-appearance:none;appearance:none;text-indent:1px;text-overflow:\"\"}}ngx-extended-pdf-viewer .textLayer{position:absolute;text-align:initial;left:0;top:0;right:0;bottom:0;overflow:hidden;opacity:.2;line-height:1}ngx-extended-pdf-viewer .textLayer span,ngx-extended-pdf-viewer .textLayer br{color:transparent;position:absolute;white-space:pre;cursor:text;transform-origin:0% 0%}ngx-extended-pdf-viewer .textLayer .highlight{position:static;margin:-1px;padding:1px;background-color:var(#b400aa);border-radius:4px}ngx-extended-pdf-viewer .textLayer .highlight.appended{position:initial}ngx-extended-pdf-viewer .textLayer .highlight.begin{border-radius:4px 0 0 4px}ngx-extended-pdf-viewer .textLayer .highlight.end{border-radius:0 4px 4px 0}ngx-extended-pdf-viewer .textLayer .highlight.middle{border-radius:0}ngx-extended-pdf-viewer .textLayer .highlight.selected{background-color:#006400}ngx-extended-pdf-viewer .textLayer ::selection{background:blue}ngx-extended-pdf-viewer .textLayer br::selection{background:transparent}ngx-extended-pdf-viewer .textLayer .endOfContent{display:block;position:absolute;left:0;top:100%;right:0;bottom:0;z-index:-1;cursor:default;-webkit-user-select:none;user-select:none}ngx-extended-pdf-viewer .textLayer .endOfContent.active{top:0}ngx-extended-pdf-viewer *{box-sizing:content-box}ngx-extended-pdf-viewer :root{--pdfViewer-padding-bottom: none;--page-margin: 1px auto -8px;--page-border: 9px solid transparent;--spreadHorizontalWrapped-margin-LR: -3.5px;--zoom-factor: 1}@media screen and (forced-colors: active){ngx-extended-pdf-viewer :root{--pdfViewer-padding-bottom: 9px;--page-margin: 9px auto 0;--page-border: none;--spreadHorizontalWrapped-margin-LR: 4.5px}}ngx-extended-pdf-viewer .pdfViewer{padding-bottom:var(--pdfViewer-padding-bottom)}ngx-extended-pdf-viewer .pdfViewer .canvasWrapper{overflow:hidden}ngx-extended-pdf-viewer .pdfViewer .page{direction:ltr;width:816px;height:1056px;margin:1px auto -8px;position:relative;overflow:visible;border:9px solid transparent;background-clip:content-box;border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAA6UlEQVR4Xl2Pi2rEMAwE16fm1f7/r14v7w4rI0IzLAF7hLxNevBSEMEF5+OilNCsRd8ZMyn+a4NmsOT8WJw1lFbSYgGFzF2bLFoLjTClWjKKGRWpDYAGXUnZ4uhbBUzF3Oe/GG/ue2fn4GgsyXhNgysV2JnrhKEMg4fEZcALmiKbNhBBRFpSyDOj1G4QOVly6O1FV54ZZq8OVygrciDt6JazRgi1ljTPH0gbrPmHPXAbCiDd4GawIjip1TPh9tt2sz24qaCjr/jAb/GBFTbq9KZ7Ke/Cqt8nayUikZKsWZK7Fe6bg5dOUt8fZHWG2BHc+6EAAAAASUVORK5CYII=) 9 9 repeat;background-color:#fff}ngx-extended-pdf-viewer .pdfViewer.removePageBorders .page{margin:0 auto 10px;border:none}ngx-extended-pdf-viewer .pdfViewer.singlePageView .page{margin:0}ngx-extended-pdf-viewer .html .pdfViewer.scrollHorizontal,ngx-extended-pdf-viewer .html .pdfViewer.scrollWrapped,ngx-extended-pdf-viewer .html .spread{margin-left:3.5px;margin-right:3.5px;text-align:center}ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal,ngx-extended-pdf-viewer .spread{white-space:nowrap}ngx-extended-pdf-viewer .pdfViewer.removePageBorders,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .spread,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .spread{margin-left:0;margin-right:0}ngx-extended-pdf-viewer .spread .page,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .page,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .page,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .spread,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .spread{display:inline-block;vertical-align:middle}ngx-extended-pdf-viewer .spread .page,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .page,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .page{margin-left:-3.5px;margin-right:-3.5px}ngx-extended-pdf-viewer .pdfViewer.removePageBorders .spread .page,ngx-extended-pdf-viewer .pdfViewer.removePageBorders.scrollHorizontal .page,ngx-extended-pdf-viewer .pdfViewer.removePageBorders.scrollWrapped .page{margin-left:5px;margin-right:5px}ngx-extended-pdf-viewer .pdfViewer .page canvas{margin:0;display:block}ngx-extended-pdf-viewer .pdfViewer .page canvas[hidden]{display:none}ngx-extended-pdf-viewer .pdfViewer .page .loadingIcon{position:absolute;display:block;left:0;top:0;right:0;bottom:0;background:url(data:image/gif;base64,R0lGODlhGAAYAPQAAP///wAAAM7Ozvr6+uDg4LCwsOjo6I6OjsjIyJycnNjY2KioqMDAwPLy8nZ2doaGhri4uGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJBwAAACwAAAAAGAAYAAAFriAgjiQAQWVaDgr5POSgkoTDjFE0NoQ8iw8HQZQTDQjDn4jhSABhAAOhoTqSDg7qSUQwxEaEwwFhXHhHgzOA1xshxAnfTzotGRaHglJqkJcaVEqCgyoCBQkJBQKDDXQGDYaIioyOgYSXA36XIgYMBWRzXZoKBQUMmil0lgalLSIClgBpO0g+s26nUWddXyoEDIsACq5SsTMMDIECwUdJPw0Mzsu0qHYkw72bBmozIQAh+QQJBwAAACwAAAAAGAAYAAAFsCAgjiTAMGVaDgR5HKQwqKNxIKPjjFCk0KNXC6ATKSI7oAhxWIhezwhENTCQEoeGCdWIPEgzESGxEIgGBWstEW4QCGGAIJEoxGmGt5ZkgCRQQHkGd2CESoeIIwoMBQUMP4cNeQQGDYuNj4iSb5WJnmeGng0CDGaBlIQEJziHk3sABidDAHBgagButSKvAAoyuHuUYHgCkAZqebw0AgLBQyyzNKO3byNuoSS8x8OfwIchACH5BAkHAAAALAAAAAAYABgAAAW4ICCOJIAgZVoOBJkkpDKoo5EI43GMjNPSokXCINKJCI4HcCRIQEQvqIOhGhBHhUTDhGo4diOZyFAoKEQDxra2mAEgjghOpCgz3LTBIxJ5kgwMBShACREHZ1V4Kg1rS44pBAgMDAg/Sw0GBAQGDZGTlY+YmpyPpSQDi