You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
km_community/ant-design-vue-jeecg/public/pdfjs/web/viewer.js.map

1 line
814 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{"version":3,"sources":["webpack://pdf.js/web/app_options.js","webpack://pdf.js/web/viewer_compatibility.js","webpack://pdf.js/web/app.js","webpack://pdf.js/web/ui_utils.js","webpack://pdf.js/web/pdfjs.js","webpack://pdf.js/web/pdf_cursor_tools.js","webpack://pdf.js/web/grab_to_pan.js","webpack://pdf.js/web/pdf_rendering_queue.js","webpack://pdf.js/web/overlay_manager.js","webpack://pdf.js/web/password_prompt.js","webpack://pdf.js/web/pdf_attachment_viewer.js","webpack://pdf.js/web/base_tree_viewer.js","webpack://pdf.js/web/pdf_document_properties.js","webpack://pdf.js/web/pdf_find_bar.js","webpack://pdf.js/web/pdf_find_controller.js","webpack://pdf.js/web/pdf_find_utils.js","webpack://pdf.js/web/pdf_history.js","webpack://pdf.js/web/pdf_layer_viewer.js","webpack://pdf.js/web/pdf_link_service.js","webpack://pdf.js/web/pdf_outline_viewer.js","webpack://pdf.js/web/pdf_presentation_mode.js","webpack://pdf.js/web/pdf_scripting_manager.js","webpack://pdf.js/web/pdf_sidebar.js","webpack://pdf.js/web/pdf_sidebar_resizer.js","webpack://pdf.js/web/pdf_thumbnail_viewer.js","webpack://pdf.js/web/pdf_thumbnail_view.js","webpack://pdf.js/web/pdf_viewer.js","webpack://pdf.js/web/base_viewer.js","webpack://pdf.js/web/annotation_layer_builder.js","webpack://pdf.js/web/l10n_utils.js","webpack://pdf.js/web/pdf_page_view.js","webpack://pdf.js/web/struct_tree_layer_builder.js","webpack://pdf.js/web/text_layer_builder.js","webpack://pdf.js/web/xfa_layer_builder.js","webpack://pdf.js/web/secondary_toolbar.js","webpack://pdf.js/web/pdf_single_page_viewer.js","webpack://pdf.js/web/toolbar.js","webpack://pdf.js/web/view_history.js","webpack://pdf.js/web/genericcom.js","webpack://pdf.js/web/preferences.js","webpack://pdf.js/web/download_manager.js","webpack://pdf.js/web/genericl10n.js","webpack://pdf.js/external/webL10n/l10n.js","webpack://pdf.js/web/generic_scripting.js","webpack://pdf.js/web/pdf_print_service.js","webpack://pdf.js/web/print_utils.js","webpack://pdf.js/webpack/bootstrap","webpack://pdf.js/web/viewer.js"],"names":["OptionKind","VIEWER","API","WORKER","PREFERENCE","defaultOptions","cursorToolOnLoad","value","kind","defaultUrl","defaultZoomValue","disableHistory","disablePageLabels","enablePermissions","enablePrintAutoRotate","enableScripting","externalLinkRel","externalLinkTarget","historyUpdateUrl","ignoreDestinationZoom","imageResourcesPath","maxCanvasPixels","compatibility","viewerCompatibilityParams","pdfBugEnabled","printResolution","renderer","renderInteractiveForms","sidebarViewOnLoad","scrollModeOnLoad","spreadModeOnLoad","textLayerMode","useOnlyCssZoom","viewerCssTheme","viewOnLoad","cMapPacked","cMapUrl","disableAutoFetch","disableFontFace","disableRange","disableStream","docBaseUrl","enableXfa","fontExtraProperties","isEvalSupported","maxImageSize","pdfBug","standardFontDataUrl","verbosity","workerPort","workerSrc","navigator","userOptions","Object","constructor","get","userOption","defaultOption","getAll","options","valueType","Number","set","setAll","remove","compatibilityParams","userAgent","platform","maxTouchPoints","isAndroid","isIOS","isIOSChrome","DEFAULT_SCALE_DELTA","DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT","FORCE_PAGES_LOADED_TIMEOUT","WHEEL_ZOOM_DISABLED_TIMEOUT","ENABLE_PERMISSIONS_CLASS","ViewOnLoad","UNKNOWN","PREVIOUS","INITIAL","ViewerCssTheme","AUTOMATIC","LIGHT","DARK","KNOWN_VERSIONS","KNOWN_GENERATORS","updateFindControlState","updateFindMatchesCount","initPassiveLoading","fallback","reportTelemetry","createDownloadManager","createPreferences","createL10n","createScripting","supportsIntegratedFind","shadow","supportsDocumentFonts","supportedMouseWheelZoomModifierKeys","ctrlKey","metaKey","isInAutomation","PDFViewerApplication","initialBookmark","document","_initializedCapability","_fellback","appConfig","pdfDocument","pdfLoadingTask","printService","pdfViewer","pdfThumbnailViewer","pdfRenderingQueue","pdfPresentationMode","pdfDocumentProperties","pdfLinkService","pdfHistory","pdfSidebar","pdfSidebarResizer","pdfOutlineViewer","pdfAttachmentViewer","pdfLayerViewer","pdfCursorTools","pdfScriptingManager","store","downloadManager","overlayManager","preferences","toolbar","secondaryToolbar","eventBus","l10n","isInitialViewSet","downloadComplete","isViewerEmbedded","window","url","baseUrl","externalServices","_boundEvents","documentInfo","metadata","_contentDispositionFilename","_contentLength","_saveInProgress","_wheelUnusedTicks","_idleCallbacks","AppOptions","LinkTarget","appContainer","source","console","reason","hash","hashParams","parseQueryString","waitOn","loadFakeWorker","TextLayerMode","viewer","enabled","loadAndEnablePDFBug","locale","dir","_forceCssTheme","cssTheme","styleSheet","cssRules","mediaMatcher","mediaRule","mediaRegex","i","ii","rule","darkRules","findController","linkService","sandboxBundleSrc","scriptingFactory","docPropertiesLookup","container","renderingQueue","scriptingManager","elements","run","zoomIn","newScale","Math","zoomOut","zoomReset","PDFPrintServiceFactory","doc","support","bar","setTitleUsingUrl","title","getPdfFilenameFromUrl","decodeURIComponent","getFilenameFromUrl","setTitle","_cancelIdleCallbacks","sourceEventType","promises","webViewerResetPermissions","PDFBug","Promise","workerParameters","GlobalWorkerOptions","parameters","file","apiParameters","key","args","loadingTask","getDocument","loaded","exception","msg","message","_ensureDownloadComplete","filename","data","blob","type","downloadOrSave","download","_documentError","moreInfo","_otherError","moreInfoText","version","build","stack","line","errorWrapperConfig","errorWrapper","errorMessage","closeButton","errorMoreInfo","moreInfoButton","lessInfoButton","parts","progress","percent","level","isNaN","clearTimeout","load","firstPagePromise","pageLayoutPromise","pageModePromise","openActionPromise","baseDocumentUrl","storedPromise","page","zoom","scrollLeft","scrollTop","rotation","sidebarView","SidebarView","scrollMode","ScrollMode","spreadMode","SpreadMode","pdfPage","fingerprint","initialDest","openAction","stored","parseInt","pageMode","apiPageModeToSidebarView","pageLayout","apiPageLayoutToSpreadMode","resolve","setTimeout","pagesPromise","onePageRendered","outline","attachments","optionalContentConfig","callback","timeout","once","baseURL","filesize","authors","numPages","URL","markInfo","tagged","triggerAutoPrint","javaScript","js","UNSUPPORTED_FEATURES","AutoPrintRegExp","info","pdfTitle","metadataTitle","contentDispositionFilename","versionId","generatorId","producer","generator","formType","labels","numLabels","_initializePdfHistory","resetHistory","updateUrl","JSON","explicitDest","pageNumber","permissions","PermissionFlag","_initializeAnnotationStorageCallbacks","annotationStorage","setInitialView","setRotation","angle","isValidRotation","setViewerModes","isValidScrollMode","isValidSpreadMode","_cleanup","RendererType","forceRendering","beforePrint","pagesOverview","printContainer","optionalContentConfigPromise","afterPrint","rotatePages","requestPresentationMode","triggerPrinting","bindEvents","bindWindowEvents","event","detail","passive","unbindEvents","unbindWindowEvents","accumulateWheelTicks","ticks","wholeTicks","_unblockDocumentLoadEvent","HOSTED_VIEWER_ORIGINS","validateFileURL","viewerOrigin","origin","protocol","ex","loadScript","PDFWorker","OPS","Stats","pageView","pageStats","queryString","params","fileInput","files","evt","webViewerOpenFileViaURL","thumbnailView","view","webViewerSave","location","href","currentPage","loading","RenderingStates","currentScaleValue","webViewerFileInputChange","originalUrl","fileReader","buffer","webViewerOpenFile","openFileInputName","query","phraseSearch","caseSensitive","entireWord","highlightAll","findPrevious","result","setZoomDisabledTimeout","zoomDisabledTimeout","previousScale","delta","normalizeWheelEventDirection","WheelEvent","PIXELS_PER_LINE_SCALE","currentScale","scaleCorrectionFactor","rect","dx","dy","handled","ensureViewerFocused","cmd","isViewerInPresentationMode","findState","curElement","curElementTagName","turnPage","turnOnlyIfPageFit","CursorTool","instance","supportsPrinting","createPrintService","CSS_UNITS","DEFAULT_SCALE_VALUE","DEFAULT_SCALE","MIN_SCALE","MAX_SCALE","UNKNOWN_SCALE","MAX_AUTO_SCALE","SCROLLBAR_PADDING","VERTICAL_PADDING","LOADINGBAR_END_OFFSET_VAR","PresentationModeState","NORMAL","CHANGING","FULLSCREEN","NONE","THUMBS","OUTLINE","ATTACHMENTS","LAYERS","CANVAS","SVG","DISABLE","ENABLE","ENABLE_ENHANCE","VERTICAL","HORIZONTAL","WRAPPED","ODD","EVEN","devicePixelRatio","backingStoreRatio","ctx","pixelRatio","sx","sy","scaled","scrollMatches","parent","element","offsetY","offsetX","getComputedStyle","spot","debounceScroll","rAF","currentX","viewAreaElement","lastX","state","currentY","lastY","right","down","_eventHandler","param","minIndex","maxIndex","items","condition","currentIndex","currentItem","xinv","limit","x_","x","a","b","c","d","p","q","r","changeOrientation","rotate","width","height","index","elt","views","pageTop","sortByVisibility","horizontal","rtl","top","scrollEl","bottom","left","elementBottom","elementLeft","elementRight","visible","numViews","firstVisibleElementInd","binarySearchFirstItem","backtrackBeforeAllVisibleElements","lastEdge","currentWidth","currentHeight","viewWidth","viewHeight","viewRight","viewBottom","hiddenHeight","hiddenWidth","fractionHeight","fractionWidth","id","y","widthPercent","first","last","pc","MOUSE_DOM_DELTA_PIXEL_MODE","MOUSE_DOM_DELTA_LINE_MODE","MOUSE_PIXELS_PER_LINE","MOUSE_LINES_PER_PAGE","mode","size","WaitOnType","EVENT","TIMEOUT","delay","target","eventHandler","handler","timeoutHandler","animationStarted","on","external","off","dispatch","eventListeners","Array","listener","externalListeners","_on","_off","units","_updateBar","progressSize","clamp","setWidth","scrollbarWidth","hide","show","moved","len","arr","write","read","curRoot","curActiveOrFocused","pdfjsLib","__non_webpack_require__","module","SELECT","HAND","ZOOM","activeTool","switchTool","tool","disableActiveTool","_dispatchEvent","_addEventListeners","previouslyActive","overlay","GrabToPan","CSS_CLASS_GRAB","activate","deactivate","toggle","ignoreTarget","node","_onmousedown","focusedElement","_onmousemove","isLeftMouseReleased","xDiff","yDiff","behavior","_endPan","chrome","isChrome15OrOpera15plus","isSafari6plus","CLEANUP_TIMEOUT","RUNNING","PAUSED","FINISHED","setViewer","setThumbnailViewer","isHighestPriority","renderHighestPriority","getHighestPriority","visibleViews","numVisible","nextPageIndex","previousPageIndex","isViewFinished","renderView","active","register","callerCloseMethod","canForceClose","unregister","open","close","_keyDown","_closeThroughCaller","e","passwordIncorrect","PasswordResponses","verify","password","setUpdateCallback","reset","keepRenderedCapability","attachmentsCount","_bindLink","render","names","fragment","item","content","div","_appendAttachment","renderedPromise","TREEITEM_OFFSET_TOP","TREEITEM_SELECTED_CLASS","_normalizeTextContent","removeNullCharacters","_addToggleButton","hidden","toggler","shouldShowAll","_toggleTreeItem","root","_toggleAllTreeItems","_finishRendering","hasAnyNesting","_updateCurrentTreeItem","treeItem","_scrollToCurrentTreeItem","currentNode","DEFAULT_FIELD_CONTENT","NON_METRIC_LOCALES","US_PAGE_NAMES","METRIC_PAGE_NAMES","isPortrait","pageNames","freezeFieldData","writable","enumerable","configurable","currentPageNumber","pagesRotation","getPageSizeInches","author","subject","keywords","creator","pageCount","linearized","_currentPageNumber","_pagesRotation","contentLength","setDocument","_reset","_updateUI","_parseFileSize","fileSize","kb","mb","size_mb","size_kb","size_b","_parsePageSize","pageSizeInches","isPortraitOrientation","sizeInches","sizeMillimeters","rawName","getPageName","exactMillimeters","intMillimeters","name","_parseDate","dateObject","PDFDateString","date","time","_parseLinearization","isLinearized","MATCHES_COUNT_LIMIT","dispatchEvent","updateUIState","findMsg","status","FindState","previous","updateResultsCount","current","total","matchCountMsg","_adjustWidth","findbarHeight","inputContainerHeight","FOUND","NOT_FOUND","PENDING","FIND_TIMEOUT","MATCH_SCROLL_OFFSET_TOP","MATCH_SCROLL_OFFSET_LEFT","CHARACTERS_TO_NORMALIZE","normalizationRegex","replace","diffs","normalizedText","normalizedCh","diff","ch","totalDiff","matchIndex","highlightMatches","pageMatches","pageMatchesLength","selected","executeCommand","findbarClosed","pendingTimeout","scrollMatchIntoView","selectedLeft","pageIndex","scrollIntoView","pageIdx","matchIdx","wrapped","_query","normalize","_shouldDirtyMatch","_prepareMatches","currentElem","matchesWithLength","nextElem","prevElem","isSubTerm","matches","matchesLength","_isEntireWord","startIdx","getCharacterType","endIdx","_calculatePhraseMatch","queryLen","pageContent","originalMatchIdx","getOriginalIndex","matchEnd","originalQueryLen","_calculateWordMatch","queryArray","subquery","subqueryLen","match","matchLength","skipped","_calculateMatch","pageDiffs","pageMatchesCount","_extractText","promise","extractTextCapability","normalizeWhitespace","textContent","textItems","strBuf","j","jj","_updatePage","_updateAllPages","_nextMatch","currentPageIndex","offset","numPageMatches","_matchesReady","numMatches","_nextPageMatch","_advanceOffsetPage","_updateMatch","found","previousPage","_onFindBarClose","_requestMatchesCount","_updateUIResultsCount","matchesCount","_updateUIState","rawQuery","CharacterType","SPACE","ALPHA_LETTER","PUNCT","HAN_LETTER","KATAKANA_LETTER","HIRAGANA_LETTER","HALFWIDTH_KATAKANA_LETTER","THAI_LETTER","charCode","isAlphabeticalScript","isAscii","isAsciiSpace","isAsciiAlpha","isAsciiDigit","isThai","isHan","isKatakana","isHiragana","isHalfwidthKatakana","HASH_CHANGE_TIMEOUT","POSITION_UPDATED_THRESHOLD","UPDATE_VIEWAREA_TIMEOUT","initialize","reInitialized","getCurrentHash","destination","push","namedDest","forceReplace","isDestArraysEqual","dest","pushPage","pushCurrentPosition","back","forward","popStateInProgress","initialRotation","_pushOrReplaceState","shouldReplace","newState","uid","newUrl","_tryPushCurrentPosition","temporary","position","_isValidPage","val","_isValidState","checkReload","performance","perfEntry","_updateInternalState","removeTemporary","_parseCurrentHash","checkNameddest","unescape","nameddest","_updateViewarea","_popState","newHash","hashChanged","waitOnEventOrTimeout","_pageHide","_bindEvents","updateViewarea","popState","pageHide","_unbindEvents","destHash","second","isEntryEqual","firstDest","secondDest","setVisibility","input","_setNestedName","groups","queue","layersCount","levelData","itemsDiv","groupId","group","label","_resetLayers","setHistory","pagesCount","_goToDestinationHelper","destRef","destArray","goToDestination","goToPage","getDestinationHash","escape","str","getAnchorUrl","setHash","zoomArgs","zoomArg","zoomArgNumber","parseFloat","allowNegativeOffset","isValidExplicitDestination","executeNamedAction","cachePageRef","refStr","pageRef","_cachedPageNumber","isPageVisible","isPageCached","destLength","allowNull","outlineCount","currentOutlineItemPromise","addLinkAttributes","newWindow","rel","_setStyles","count","totalCount","nestedCount","nestedItems","_currentOutlineItem","pageNumberToDestHash","linkElement","_getPageNumberToDestHash","pageNumberNesting","nesting","currentNesting","DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS","DELAY_BEFORE_HIDING_CONTROLS","ACTIVE_SELECTOR","CONTROLS_SELECTOR","MOUSE_SCROLL_COOLDOWN_TIME","PAGE_SWITCH_THRESHOLD","SWIPE_MIN_DISTANCE_THRESHOLD","SWIPE_ANGLE_THRESHOLD","request","Element","_mouseWheel","normalizeWheelEventDelta","currentTime","Date","storedTime","totalDelta","success","isFullscreen","_notifyStateChange","_setSwitchInProgress","_resetSwitchInProgress","_enter","_exit","_mouseDown","isInternalLink","_contextMenu","_showControls","_hideControls","_resetMouseScrollState","_touchSwipe","startX","startY","endX","endY","absAngle","_addWindowListeners","_removeWindowListeners","_fullscreenChange","_addFullscreenChangeListeners","_removeFullscreenChangeListeners","error","docProperties","appInfo","language","docInfo","actions","dispatchWillSave","dispatchDidSave","dispatchWillPrint","dispatchDidPrint","mouseState","destroyPromise","ready","_internalEvents","_domEvents","_pageOpenPending","_visitedPages","_updateFromSandbox","isInPresentationMode","ids","_dispatchPageOpen","visitedPages","actionsPromise","_dispatchPageClose","_getDocProperties","_createScripting","_destroyScripting","UI_NOTIFICATION_CLASS","visibleView","isThumbnailViewVisible","isOutlineViewVisible","isAttachmentsViewVisible","isLayersViewVisible","switchView","forceOpen","_switchView","isViewChanged","shouldForceRendering","_forceRendering","_updateThumbnailViewer","_showUINotification","_hideUINotification","onTreeLoaded","button","SIDEBAR_WIDTH_VAR","SIDEBAR_MIN_WIDTH","SIDEBAR_RESIZING_CLASS","outerContainerWidth","_updateWidth","maxWidth","_mouseMove","_mouseUp","updated","THUMBNAIL_SCROLL_MARGIN","THUMBNAIL_SELECTED_CLASS","watchScroll","_scrollUpdated","getThumbnail","_getVisibleThumbs","scrollThumbnailIntoView","prevThumbnailView","visibleThumbs","numVisibleThumbs","shouldScroll","cleanup","TempImageFactory","_resetView","firstPdfPage","viewport","scale","checkSetImageDisabled","pageNum","thumbnail","defaultViewport","firstThumbnailView","_cancelRendering","setPageLabels","_ensurePdfPageLoaded","thumbView","DRAW_UPSCALE_FACTOR","MAX_NUM_SCALING_STEPS","THUMBNAIL_CANVAS_BORDER_WIDTH","THUMBNAIL_WIDTH","tempCanvasCache","getCanvas","tempCanvas","alpha","destroyCanvas","pageWidth","pageHeight","pageRatio","anchor","ring","borderAdjustment","setPdfPage","totalRotation","update","cancelRendering","_getPageDrawContext","upscaleFactor","canvas","outputScale","getOutputScale","transform","_convertCanvasToImage","reducedCanvas","image","draw","finishRenderTask","renderTask","drawViewport","renderContinueCallback","cont","renderContext","canvasContext","resultPromise","pageCached","setImage","_reduceImage","img","reducedWidth","reducedHeight","reducedImageCtx","_thumbPageTitle","_thumbPageCanvas","setPageLabel","_viewerElement","_scrollIntoView","pageSpot","pageDiv","_getVisiblePages","_updateHelper","currentId","stillFullyVisible","visiblePages","DEFAULT_CACHE_SIZE","pageIdsToKeep","iMax","pagesToKeep","moveToEndOfArray","viewerVersion","getPageView","pageViewsReady","_setCurrentPageNumber","resetCurrentPageView","pageLabel","currentPageLabel","_onePageRenderedOrForceFetch","isPureXfa","textLayerFactory","xfaLayerFactory","annotationLayerFactory","structTreeLayerFactory","firstPageView","getPagesLeft","_scrollUpdate","_setScaleUpdatePages","noScroll","preset","newValue","isSameScale","presetValue","_pageWidthScaleFactor","_setScale","noPadding","hPadding","vPadding","pageWidthScale","pageHeightScale","horizontalScale","_resetCurrentPageView","pageLabelToPageNumber","scrollPageIntoView","widthScale","heightScale","boundingRect","_updateLocation","normalizedScaleValue","firstPage","pdfOpenParams","currentPageView","topLeft","intLeft","intTop","numVisiblePages","newCacheSize","containsElement","focus","_isScrollModeHorizontal","_isContainerRtl","isChangingPresentationMode","isHorizontalScrollbarEnabled","isVerticalScrollbarEnabled","_getCurrentVisiblePage","currentlyVisiblePages","scrollAhead","createTextLayerBuilder","enhanceTextSelection","createAnnotationLayerBuilder","hasJSActionsPromise","createXfaLayerBuilder","createStructTreeLayerBuilder","hasEqualPageSizes","getPagesOverview","_updateScrollMode","_updateSpreadMode","pages","parity","spread","_getPageAdvance","yArray","expectedId","firstId","lastId","nextPage","advance","intent","hasJSActions","annotations","dontFlip","AnnotationLayer","cancel","DEFAULT_L10N_STRINGS","of_pages","page_of_pages","document_properties_kb","document_properties_mb","document_properties_date_string","document_properties_page_size_unit_inches","document_properties_page_size_unit_millimeters","document_properties_page_size_orientation_portrait","document_properties_page_size_orientation_landscape","document_properties_page_size_name_a3","document_properties_page_size_name_a4","document_properties_page_size_name_letter","document_properties_page_size_name_legal","document_properties_page_size_dimension_string","document_properties_page_size_dimension_name_string","document_properties_linearized_yes","document_properties_linearized_no","print_progress_percent","additional_layers","page_landmark","thumb_page_title","thumb_page_canvas","find_reached_top","find_reached_bottom","find_not_found","error_version_info","error_message","error_stack","error_file","error_line","rendering_error","page_scale_width","page_scale_fit","page_scale_auto","page_scale_actual","page_scale_percent","loading_error","invalid_file_error","missing_file_error","unexpected_response_error","printing_not_supported","printing_not_ready","web_fonts_disabled","PARTIAL_LANG_CODES","en","es","fy","ga","gu","hi","hy","nb","ne","nn","pa","pt","sv","zh","langCode","NullL10n","getL10nFallback","formatL10nValue","MAX_CANVAS_PIXELS","destroy","_renderAnnotationLayer","_renderXfaLayer","_resetZoomLayer","removeFromDOM","zoomLayerCanvas","keepZoomLayer","keepAnnotationLayer","keepXfaLayer","childNodes","zoomLayerNode","annotationLayerNode","xfaLayerNode","redrawAnnotationLayer","redrawXfaLayer","cssTransform","timestamp","isScalingRestricted","relativeRotation","absRotation","scaleX","scaleY","textLayerViewport","textRelativeRotation","textAbsRotation","textLayerDiv","transX","transY","getPagePoint","canvasWrapper","textLayer","finishPaintTask","paintTask","readableStream","includeMarkedContent","tree","treeDom","paintOnCanvas","renderCapability","onRenderContinue","isCanvasHidden","showCanvas","actualSizeViewport","pixelsInViewport","maxScale","sfx","approximateFraction","sfy","roundToDivide","paintOnSvg","cancelled","ensureNotCancelled","opList","svgGfx","svg","wrapper","PDF_ROLE_TO_HTML_ROLE","Document","DocumentFragment","Part","Sect","Div","Aside","NonStruct","P","H","Title","FENote","Sub","Lbl","Span","Em","Strong","Link","Annot","Form","Ruby","RB","RT","RP","Warichu","WT","WP","L","LI","LBody","Table","TR","TH","TD","THead","TBody","TFoot","Caption","Figure","Formula","Artifact","HEADING_PATTERN","_setAttributes","structElement","htmlElement","_walk","role","EXPAND_DIVS_TIMEOUT","endOfContent","numTextDivs","textLayerFrag","textContentStream","textDivs","textContentItemsStr","setTextContentStream","setTextContent","_convertMatches","iIndex","end","m","mm","begin","divIdx","_renderMatches","isSelectedPage","selectedMatchIdx","prevEnd","infinity","appendTextToDiv","span","className","i0","i1","isSelected","highlightSuffix","beginText","n0","n1","_updateMatches","clearedUntilDivIdx","n","_bindMouse","expandDivsTimer","adjustTop","divBounds","xfa","XfaLayer","xfaHtml","eventName","eventDetails","lastPage","pageRotateCw","pageRotateCcw","isOpen","setPageNumber","setPagesCount","_bindClickListeners","details","_bindCursorToolsListener","buttons","_bindScrollModeListener","isScrollModeHorizontal","scrollModeChanged","_bindSpreadModeListener","spreadModeChanged","_setMaxHeight","_ensurePageViewVisible","previousPageView","viewerNodes","scrolledDown","PAGE_NUMBER_LOADING_INDICATOR","SCALE_SELECT_CONTAINER_WIDTH","SCALE_SELECT_WIDTH","scaleSelectContainer","scaleSelect","customScaleOption","next","setPageScale","_bindListeners","self","resetNumPages","pageScale","predefinedValueFound","option","updateLoadingIndicatorState","pageNumberInput","_adjustScaleWidth","predefinedValuesPromise","overflow","DEFAULT_VIEW_HISTORY_CACHE_SIZE","cacheSize","databaseStr","database","branch","_writeToStorage","localStorage","_readFromStorage","setMultiple","properties","getMultiple","values","GenericCom","prefs","prefValue","defaultValue","defaultType","obj","downloadUrl","createValidAbsoluteUrl","downloadData","blobUrl","createObjectURL","openOrDownloadData","isPdfData","isPdfFile","contentType","viewerUrl","encodeURIComponent","webL10n","fixupLangCode","getLanguage","getDirection","translate","gL10nData","gTextData","gTextProp","gLanguage","gMacros","gReadyState","gAsyncResourceLoading","script","l10nId","l10nArgs","onSuccess","onFailure","xhr","text","dictionary","reBlank","reComment","reSection","reImport","reSplit","entries","rawText","currentLang","genericLang","lang","skipLang","parsedRawLinesCallback","loadImport","tmp","evalString","nextEntry","xhrLoadText","parseRawLines","parsedPropertiesCallback","parseProperties","prop","successCallback","clear","langLinks","getL10nResourceLinks","langCount","dict","getL10nDictionary","defaultLocale","anyCaseLang","onResourceLoaded","gResourceCount","link","parseResource","resource","locales2rules","list","start","pluralRules","isBetween","getPluralRules","rv","substIndexes","substArguments","reIndex","reMatch","macroName","paramName","macro","reArgs","arg","getL10nAttributes","getL10nData","getChildElementCount","children","l","textNode","getTranslatableChildren","elementCount","translateElement","getData","getText","setLanguage","loadLocale","rtlList","shortCode","getReadyState","createSandbox","sandbox","dispatchEventInSandbox","destroySandbox","activeService","scratchCanvas","PRINT_UNITS","includeAnnotationStorage","PDFPrintService","layout","body","pageSize","ensureOverlay","renderPages","getXfaHtmlForPrinting","renderNextPage","renderProgress","renderPage","useRenderedPage","performPrint","print","throwIfInactive","activeServiceOnEntry","abort","progressContainer","progressBar","progressPerc","stopPropagationIfNeeded","overlayPromise","factory","builder","getXfaPageViewport","pdfjsVersion","pdfjsBuild","require","mainContainer","viewerContainer","viewFind","openFile","presentationModeButton","viewBookmark","toggleButton","toolbarButtonContainer","openFileButton","printButton","downloadButton","viewBookmarkButton","firstPageButton","lastPageButton","pageRotateCwButton","pageRotateCcwButton","cursorSelectToolButton","cursorHandToolButton","scrollVerticalButton","scrollHorizontalButton","scrollWrappedButton","spreadNoneButton","spreadOddButton","spreadEvenButton","documentPropertiesButton","sidebar","outerContainer","thumbnailButton","outlineButton","attachmentsButton","layersButton","outlineView","attachmentsView","layersView","outlineOptionsContainer","currentOutlineItemButton","sidebarResizer","resizer","findBar","findField","highlightAllCheckbox","caseSensitiveCheckbox","entireWordCheckbox","findResultsCount","findPreviousButton","findNextButton","passwordOverlay","overlayName","submitButton","cancelButton","documentProperties","fields","fileName","creationDate","modificationDate","debuggerScriptPath","config","getViewerConfiguration","webViewerLoad"],"mappings":"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","file":"viewer.js","sourcesContent":["/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { viewerCompatibilityParams } from \"./viewer_compatibility.js\";\n\nconst OptionKind = {\n VIEWER: 0x02,\n API: 0x04,\n WORKER: 0x08,\n PREFERENCE: 0x80,\n};\n\n/**\n * PLEASE NOTE: To avoid introducing unnecessary dependencies, we specify the\n * values below *explicitly* rather than relying on imported types.\n */\nconst defaultOptions = {\n cursorToolOnLoad: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n defaultUrl: {\n /** @type {string} */\n value: \"compressed.tracemonkey-pldi-09.pdf\",\n kind: OptionKind.VIEWER,\n },\n defaultZoomValue: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n disableHistory: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER,\n },\n disablePageLabels: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePermissions: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePrintAutoRotate: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableScripting: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n externalLinkRel: {\n /** @type {string} */\n value: \"noopener noreferrer nofollow\",\n kind: OptionKind.VIEWER,\n },\n externalLinkTarget: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n historyUpdateUrl: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n ignoreDestinationZoom: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n imageResourcesPath: {\n /** @type {string} */\n value: \"./images/\",\n kind: OptionKind.VIEWER,\n },\n maxCanvasPixels: {\n /** @type {number} */\n value: 16777216,\n compatibility: viewerCompatibilityParams.maxCanvasPixels,\n kind: OptionKind.VIEWER,\n },\n pdfBugEnabled: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n printResolution: {\n /** @type {number} */\n value: 150,\n kind: OptionKind.VIEWER,\n },\n renderer: {\n /** @type {string} */\n value: \"canvas\",\n kind: OptionKind.VIEWER,\n },\n renderInteractiveForms: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n sidebarViewOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n scrollModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n spreadModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n textLayerMode: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n useOnlyCssZoom: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n viewerCssTheme: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n viewOnLoad: {\n /** @type {boolean} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n\n cMapPacked: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n cMapUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")\n ? \"../external/bcmaps/\"\n : \"../web/cmaps/\",\n kind: OptionKind.API,\n },\n disableAutoFetch: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableFontFace: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableRange: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableStream: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n docBaseUrl: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.API,\n },\n enableXfa: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\"),\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n fontExtraProperties: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n isEvalSupported: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n maxImageSize: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.API,\n },\n pdfBug: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n standardFontDataUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")\n ? \"../external/standard_fonts/\"\n : \"../web/standard_fonts/\",\n kind: OptionKind.API,\n },\n verbosity: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.API,\n },\n\n workerPort: {\n /** @type {Object} */\n value: null,\n kind: OptionKind.WORKER,\n },\n workerSrc: {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")\n ? \"../src/worker_loader.js\"\n : \"../build/pdf.worker.js\",\n kind: OptionKind.WORKER,\n },\n};\nif (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || GENERIC\")\n) {\n defaultOptions.disablePreferences = {\n /** @type {boolean} */\n value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER,\n };\n defaultOptions.locale = {\n /** @type {string} */\n value: typeof navigator !== \"undefined\" ? navigator.language : \"en-US\",\n kind: OptionKind.VIEWER,\n };\n defaultOptions.sandboxBundleSrc = {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")\n ? \"../build/dev-sandbox/pdf.sandbox.js\"\n : \"../build/pdf.sandbox.js\",\n kind: OptionKind.VIEWER,\n };\n\n defaultOptions.renderer.kind += OptionKind.PREFERENCE;\n} else if (PDFJSDev.test(\"CHROME\")) {\n defaultOptions.disableTelemetry = {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n };\n defaultOptions.sandboxBundleSrc = {\n /** @type {string} */\n value: \"../build/pdf.sandbox.js\",\n kind: OptionKind.VIEWER,\n };\n}\n\nconst userOptions = Object.create(null);\n\nclass AppOptions {\n constructor() {\n throw new Error(\"Cannot initialize AppOptions.\");\n }\n\n static get(name) {\n const userOption = userOptions[name];\n if (userOption !== undefined) {\n return userOption;\n }\n const defaultOption = defaultOptions[name];\n if (defaultOption !== undefined) {\n return defaultOption.compatibility ?? defaultOption.value;\n }\n return undefined;\n }\n\n static getAll(kind = null) {\n const options = Object.create(null);\n for (const name in defaultOptions) {\n const defaultOption = defaultOptions[name];\n if (kind) {\n if ((kind & defaultOption.kind) === 0) {\n continue;\n }\n if (kind === OptionKind.PREFERENCE) {\n const value = defaultOption.value,\n valueType = typeof value;\n\n if (\n valueType === \"boolean\" ||\n valueType === \"string\" ||\n (valueType === \"number\" && Number.isInteger(value))\n ) {\n options[name] = value;\n continue;\n }\n throw new Error(`Invalid type for preference: ${name}`);\n }\n }\n const userOption = userOptions[name];\n options[name] =\n userOption !== undefined\n ? userOption\n : defaultOption.compatibility ?? defaultOption.value;\n }\n return options;\n }\n\n static set(name, value) {\n userOptions[name] = value;\n }\n\n static setAll(options) {\n for (const name in options) {\n userOptions[name] = options[name];\n }\n }\n\n static remove(name) {\n delete userOptions[name];\n }\n}\n\nexport { AppOptions, OptionKind };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst compatibilityParams = Object.create(null);\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n const userAgent =\n (typeof navigator !== \"undefined\" && navigator.userAgent) || \"\";\n const platform =\n (typeof navigator !== \"undefined\" && navigator.platform) || \"\";\n const maxTouchPoints =\n (typeof navigator !== \"undefined\" && navigator.maxTouchPoints) || 1;\n\n const isAndroid = /Android/.test(userAgent);\n const isIOS =\n /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) ||\n (platform === \"MacIntel\" && maxTouchPoints > 1);\n const isIOSChrome = /CriOS/.test(userAgent);\n\n // Checks if possible to use URL.createObjectURL()\n // Support: IE, Chrome on iOS\n (function checkOnBlobSupport() {\n // Sometimes Chrome on iOS loses data created with createObjectURL(),\n // see issue #8081.\n if (isIOSChrome) {\n compatibilityParams.disableCreateObjectURL = true;\n }\n })();\n\n // Limit canvas size to 5 mega-pixels on mobile.\n // Support: Android, iOS\n (function checkCanvasSizeLimitation() {\n if (isIOS || isAndroid) {\n compatibilityParams.maxCanvasPixels = 5242880;\n }\n })();\n}\nconst viewerCompatibilityParams = Object.freeze(compatibilityParams);\n\nexport { viewerCompatibilityParams };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals PDFBug, Stats */\n\nimport {\n animationStarted,\n apiPageLayoutToSpreadMode,\n apiPageModeToSidebarView,\n AutoPrintRegExp,\n DEFAULT_SCALE_VALUE,\n EventBus,\n getActiveOrFocusedElement,\n isValidRotation,\n isValidScrollMode,\n isValidSpreadMode,\n MAX_SCALE,\n MIN_SCALE,\n noContextMenuHandler,\n normalizeWheelEventDirection,\n parseQueryString,\n ProgressBar,\n RendererType,\n ScrollMode,\n SidebarView,\n SpreadMode,\n TextLayerMode,\n} from \"./ui_utils.js\";\nimport { AppOptions, OptionKind } from \"./app_options.js\";\nimport {\n build,\n createPromiseCapability,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n GlobalWorkerOptions,\n InvalidPDFException,\n isPdfFile,\n LinkTarget,\n loadScript,\n MissingPDFException,\n OPS,\n PDFWorker,\n PermissionFlag,\n shadow,\n UnexpectedResponseException,\n UNSUPPORTED_FEATURES,\n version,\n} from \"pdfjs-lib\";\nimport { CursorTool, PDFCursorTools } from \"./pdf_cursor_tools.js\";\nimport { PDFRenderingQueue, RenderingStates } from \"./pdf_rendering_queue.js\";\nimport { OverlayManager } from \"./overlay_manager.js\";\nimport { PasswordPrompt } from \"./password_prompt.js\";\nimport { PDFAttachmentViewer } from \"./pdf_attachment_viewer.js\";\nimport { PDFDocumentProperties } from \"./pdf_document_properties.js\";\nimport { PDFFindBar } from \"./pdf_find_bar.js\";\nimport { PDFFindController } from \"./pdf_find_controller.js\";\nimport { PDFHistory } from \"./pdf_history.js\";\nimport { PDFLayerViewer } from \"./pdf_layer_viewer.js\";\nimport { PDFLinkService } from \"./pdf_link_service.js\";\nimport { PDFOutlineViewer } from \"./pdf_outline_viewer.js\";\nimport { PDFPresentationMode } from \"./pdf_presentation_mode.js\";\nimport { PDFScriptingManager } from \"./pdf_scripting_manager.js\";\nimport { PDFSidebar } from \"./pdf_sidebar.js\";\nimport { PDFSidebarResizer } from \"./pdf_sidebar_resizer.js\";\nimport { PDFThumbnailViewer } from \"./pdf_thumbnail_viewer.js\";\nimport { PDFViewer } from \"./pdf_viewer.js\";\nimport { SecondaryToolbar } from \"./secondary_toolbar.js\";\nimport { Toolbar } from \"./toolbar.js\";\nimport { viewerCompatibilityParams } from \"./viewer_compatibility.js\";\nimport { ViewHistory } from \"./view_history.js\";\n\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; // ms\nconst FORCE_PAGES_LOADED_TIMEOUT = 10000; // ms\nconst WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; // ms\nconst ENABLE_PERMISSIONS_CLASS = \"enablePermissions\";\n\nconst ViewOnLoad = {\n UNKNOWN: -1,\n PREVIOUS: 0, // Default value.\n INITIAL: 1,\n};\n\nconst ViewerCssTheme = {\n AUTOMATIC: 0, // Default value.\n LIGHT: 1,\n DARK: 2,\n};\n\n// Keep these in sync with mozilla-central's Histograms.json.\nconst KNOWN_VERSIONS = [\n \"1.0\",\n \"1.1\",\n \"1.2\",\n \"1.3\",\n \"1.4\",\n \"1.5\",\n \"1.6\",\n \"1.7\",\n \"1.8\",\n \"1.9\",\n \"2.0\",\n \"2.1\",\n \"2.2\",\n \"2.3\",\n];\n// Keep these in sync with mozilla-central's Histograms.json.\nconst KNOWN_GENERATORS = [\n \"acrobat distiller\",\n \"acrobat pdfwriter\",\n \"adobe livecycle\",\n \"adobe pdf library\",\n \"adobe photoshop\",\n \"ghostscript\",\n \"tcpdf\",\n \"cairo\",\n \"dvipdfm\",\n \"dvips\",\n \"pdftex\",\n \"pdfkit\",\n \"itext\",\n \"prince\",\n \"quarkxpress\",\n \"mac os x\",\n \"microsoft\",\n \"openoffice\",\n \"oracle\",\n \"luradocument\",\n \"pdf-xchange\",\n \"antenna house\",\n \"aspose.cells\",\n \"fpdf\",\n];\n\nclass DefaultExternalServices {\n constructor() {\n throw new Error(\"Cannot initialize DefaultExternalServices.\");\n }\n\n static updateFindControlState(data) {}\n\n static updateFindMatchesCount(data) {}\n\n static initPassiveLoading(callbacks) {}\n\n static async fallback(data) {}\n\n static reportTelemetry(data) {}\n\n static createDownloadManager(options) {\n throw new Error(\"Not implemented: createDownloadManager\");\n }\n\n static createPreferences() {\n throw new Error(\"Not implemented: createPreferences\");\n }\n\n static createL10n(options) {\n throw new Error(\"Not implemented: createL10n\");\n }\n\n static createScripting(options) {\n throw new Error(\"Not implemented: createScripting\");\n }\n\n static get supportsIntegratedFind() {\n return shadow(this, \"supportsIntegratedFind\", false);\n }\n\n static get supportsDocumentFonts() {\n return shadow(this, \"supportsDocumentFonts\", true);\n }\n\n static get supportedMouseWheelZoomModifierKeys() {\n return shadow(this, \"supportedMouseWheelZoomModifierKeys\", {\n ctrlKey: true,\n metaKey: true,\n });\n }\n\n static get isInAutomation() {\n return shadow(this, \"isInAutomation\", false);\n }\n}\n\nconst PDFViewerApplication = {\n initialBookmark: document.location.hash.substring(1),\n _initializedCapability: createPromiseCapability(),\n _fellback: false,\n appConfig: null,\n pdfDocument: null,\n pdfLoadingTask: null,\n printService: null,\n /** @type {PDFViewer} */\n pdfViewer: null,\n /** @type {PDFThumbnailViewer} */\n pdfThumbnailViewer: null,\n /** @type {PDFRenderingQueue} */\n pdfRenderingQueue: null,\n /** @type {PDFPresentationMode} */\n pdfPresentationMode: null,\n /** @type {PDFDocumentProperties} */\n pdfDocumentProperties: null,\n /** @type {PDFLinkService} */\n pdfLinkService: null,\n /** @type {PDFHistory} */\n pdfHistory: null,\n /** @type {PDFSidebar} */\n pdfSidebar: null,\n /** @type {PDFSidebarResizer} */\n pdfSidebarResizer: null,\n /** @type {PDFOutlineViewer} */\n pdfOutlineViewer: null,\n /** @type {PDFAttachmentViewer} */\n pdfAttachmentViewer: null,\n /** @type {PDFLayerViewer} */\n pdfLayerViewer: null,\n /** @type {PDFCursorTools} */\n pdfCursorTools: null,\n /** @type {PDFScriptingManager} */\n pdfScriptingManager: null,\n /** @type {ViewHistory} */\n store: null,\n /** @type {DownloadManager} */\n downloadManager: null,\n /** @type {OverlayManager} */\n overlayManager: null,\n /** @type {Preferences} */\n preferences: null,\n /** @type {Toolbar} */\n toolbar: null,\n /** @type {SecondaryToolbar} */\n secondaryToolbar: null,\n /** @type {EventBus} */\n eventBus: null,\n /** @type {IL10n} */\n l10n: null,\n isInitialViewSet: false,\n downloadComplete: false,\n isViewerEmbedded: window.parent !== window,\n url: \"\",\n baseUrl: \"\",\n externalServices: DefaultExternalServices,\n _boundEvents: Object.create(null),\n documentInfo: null,\n metadata: null,\n _contentDispositionFilename: null,\n _contentLength: null,\n _saveInProgress: false,\n _wheelUnusedTicks: 0,\n _idleCallbacks: new Set(),\n\n // Called once when the document is loaded.\n async initialize(appConfig) {\n this.preferences = this.externalServices.createPreferences();\n this.appConfig = appConfig;\n\n await this._readPreferences();\n await this._parseHashParameters();\n this._forceCssTheme();\n await this._initializeL10n();\n\n if (\n this.isViewerEmbedded &&\n AppOptions.get(\"externalLinkTarget\") === LinkTarget.NONE\n ) {\n // Prevent external links from \"replacing\" the viewer,\n // when it's embedded in e.g. an <iframe> or an <object>.\n AppOptions.set(\"externalLinkTarget\", LinkTarget.TOP);\n }\n await this._initializeViewerComponents();\n\n // Bind the various event handlers *after* the viewer has been\n // initialized, to prevent errors if an event arrives too soon.\n this.bindEvents();\n this.bindWindowEvents();\n\n // We can start UI localization now.\n const appContainer = appConfig.appContainer || document.documentElement;\n this.l10n.translate(appContainer).then(() => {\n // Dispatch the 'localized' event on the `eventBus` once the viewer\n // has been fully initialized and translated.\n this.eventBus.dispatch(\"localized\", { source: this });\n });\n\n this._initializedCapability.resolve();\n },\n\n /**\n * @private\n */\n async _readPreferences() {\n if (\n (typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || GENERIC\")) &&\n AppOptions.get(\"disablePreferences\")\n ) {\n // Give custom implementations of the default viewer a simpler way to\n // opt-out of having the `Preferences` override existing `AppOptions`.\n return;\n }\n try {\n AppOptions.setAll(await this.preferences.getAll());\n } catch (reason) {\n console.error(`_readPreferences: \"${reason?.message}\".`);\n }\n },\n\n /**\n * Potentially parse special debugging flags in the hash section of the URL.\n * @private\n */\n async _parseHashParameters() {\n if (!AppOptions.get(\"pdfBugEnabled\")) {\n return undefined;\n }\n const hash = document.location.hash.substring(1);\n if (!hash) {\n return undefined;\n }\n const hashParams = parseQueryString(hash),\n waitOn = [];\n\n if (\"disableworker\" in hashParams && hashParams.disableworker === \"true\") {\n waitOn.push(loadFakeWorker());\n }\n if (\"disablerange\" in hashParams) {\n AppOptions.set(\"disableRange\", hashParams.disablerange === \"true\");\n }\n if (\"disablestream\" in hashParams) {\n AppOptions.set(\"disableStream\", hashParams.disablestream === \"true\");\n }\n if (\"disableautofetch\" in hashParams) {\n AppOptions.set(\n \"disableAutoFetch\",\n hashParams.disableautofetch === \"true\"\n );\n }\n if (\"disablefontface\" in hashParams) {\n AppOptions.set(\"disableFontFace\", hashParams.disablefontface === \"true\");\n }\n if (\"disablehistory\" in hashParams) {\n AppOptions.set(\"disableHistory\", hashParams.disablehistory === \"true\");\n }\n if (\"verbosity\" in hashParams) {\n AppOptions.set(\"verbosity\", hashParams.verbosity | 0);\n }\n if (\"textlayer\" in hashParams) {\n switch (hashParams.textlayer) {\n case \"off\":\n AppOptions.set(\"textLayerMode\", TextLayerMode.DISABLE);\n break;\n case \"visible\":\n case \"shadow\":\n case \"hover\":\n const viewer = this.appConfig.viewerContainer;\n viewer.classList.add(\"textLayer-\" + hashParams.textlayer);\n break;\n }\n }\n if (\"pdfbug\" in hashParams) {\n AppOptions.set(\"pdfBug\", true);\n AppOptions.set(\"fontExtraProperties\", true);\n\n const enabled = hashParams.pdfbug.split(\",\");\n waitOn.push(loadAndEnablePDFBug(enabled));\n }\n // It is not possible to change locale for the (various) extension builds.\n if (\n (typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || GENERIC\")) &&\n \"locale\" in hashParams\n ) {\n AppOptions.set(\"locale\", hashParams.locale);\n }\n\n if (waitOn.length === 0) {\n return undefined;\n }\n return Promise.all(waitOn).catch(reason => {\n console.error(`_parseHashParameters: \"${reason.message}\".`);\n });\n },\n\n /**\n * @private\n */\n async _initializeL10n() {\n this.l10n = this.externalServices.createL10n(\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"!PRODUCTION || GENERIC\")\n ? { locale: AppOptions.get(\"locale\") }\n : null\n );\n const dir = await this.l10n.getDirection();\n document.getElementsByTagName(\"html\")[0].dir = dir;\n },\n\n /**\n * @private\n */\n _forceCssTheme() {\n const cssTheme = AppOptions.get(\"viewerCssTheme\");\n if (\n cssTheme === ViewerCssTheme.AUTOMATIC ||\n !Object.values(ViewerCssTheme).includes(cssTheme)\n ) {\n return;\n }\n try {\n const styleSheet = document.styleSheets[0];\n const cssRules = styleSheet?.cssRules || [];\n const mediaMatcher =\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"-moz-toolbar-prefers-color-scheme\"\n : \"prefers-color-scheme\";\n const mediaRule = `(${mediaMatcher}: dark)`;\n const mediaRegex = new RegExp(\n `^@media \\\\(${mediaMatcher}: dark\\\\) {\\\\n\\\\s*([\\\\w\\\\s-.,:;/\\\\\\\\{}()]+)\\\\n}$`\n );\n for (let i = 0, ii = cssRules.length; i < ii; i++) {\n const rule = cssRules[i];\n if (rule instanceof CSSMediaRule && rule.media?.[0] === mediaRule) {\n if (cssTheme === ViewerCssTheme.LIGHT) {\n styleSheet.deleteRule(i);\n return;\n }\n // cssTheme === ViewerCssTheme.DARK\n const darkRules = mediaRegex.exec(rule.cssText);\n if (darkRules?.[1]) {\n styleSheet.deleteRule(i);\n styleSheet.insertRule(darkRules[1], i);\n }\n return;\n }\n }\n } catch (reason) {\n console.error(`_forceCssTheme: \"${reason?.message}\".`);\n }\n },\n\n /**\n * @private\n */\n async _initializeViewerComponents() {\n const appConfig = this.appConfig;\n\n const eventBus =\n appConfig.eventBus ||\n new EventBus({ isInAutomation: this.externalServices.isInAutomation });\n this.eventBus = eventBus;\n\n this.overlayManager = new OverlayManager();\n\n const pdfRenderingQueue = new PDFRenderingQueue();\n pdfRenderingQueue.onIdle = this._cleanup.bind(this);\n this.pdfRenderingQueue = pdfRenderingQueue;\n\n const pdfLinkService = new PDFLinkService({\n eventBus,\n externalLinkTarget: AppOptions.get(\"externalLinkTarget\"),\n externalLinkRel: AppOptions.get(\"externalLinkRel\"),\n ignoreDestinationZoom: AppOptions.get(\"ignoreDestinationZoom\"),\n });\n this.pdfLinkService = pdfLinkService;\n\n const downloadManager = this.externalServices.createDownloadManager();\n this.downloadManager = downloadManager;\n\n const findController = new PDFFindController({\n linkService: pdfLinkService,\n eventBus,\n });\n this.findController = findController;\n\n const pdfScriptingManager = new PDFScriptingManager({\n eventBus,\n sandboxBundleSrc:\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || GENERIC || CHROME\")\n ? AppOptions.get(\"sandboxBundleSrc\")\n : null,\n scriptingFactory: this.externalServices,\n docPropertiesLookup: this._scriptingDocProperties.bind(this),\n });\n this.pdfScriptingManager = pdfScriptingManager;\n\n const container = appConfig.mainContainer;\n const viewer = appConfig.viewerContainer;\n this.pdfViewer = new PDFViewer({\n container,\n viewer,\n eventBus,\n renderingQueue: pdfRenderingQueue,\n linkService: pdfLinkService,\n downloadManager,\n findController,\n scriptingManager: pdfScriptingManager,\n renderer: AppOptions.get(\"renderer\"),\n l10n: this.l10n,\n textLayerMode: AppOptions.get(\"textLayerMode\"),\n imageResourcesPath: AppOptions.get(\"imageResourcesPath\"),\n renderInteractiveForms: AppOptions.get(\"renderInteractiveForms\"),\n enablePrintAutoRotate: AppOptions.get(\"enablePrintAutoRotate\"),\n useOnlyCssZoom: AppOptions.get(\"useOnlyCssZoom\"),\n maxCanvasPixels: AppOptions.get(\"maxCanvasPixels\"),\n enableScripting: AppOptions.get(\"enableScripting\"),\n });\n pdfRenderingQueue.setViewer(this.pdfViewer);\n pdfLinkService.setViewer(this.pdfViewer);\n pdfScriptingManager.setViewer(this.pdfViewer);\n\n this.pdfThumbnailViewer = new PDFThumbnailViewer({\n container: appConfig.sidebar.thumbnailView,\n eventBus,\n renderingQueue: pdfRenderingQueue,\n linkService: pdfLinkService,\n l10n: this.l10n,\n });\n pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);\n\n this.pdfHistory = new PDFHistory({\n linkService: pdfLinkService,\n eventBus,\n });\n pdfLinkService.setHistory(this.pdfHistory);\n\n if (!this.supportsIntegratedFind) {\n this.findBar = new PDFFindBar(appConfig.findBar, eventBus, this.l10n);\n }\n\n this.pdfDocumentProperties = new PDFDocumentProperties(\n appConfig.documentProperties,\n this.overlayManager,\n eventBus,\n this.l10n\n );\n\n this.pdfCursorTools = new PDFCursorTools({\n container,\n eventBus,\n cursorToolOnLoad: AppOptions.get(\"cursorToolOnLoad\"),\n });\n\n this.toolbar = new Toolbar(appConfig.toolbar, eventBus, this.l10n);\n\n this.secondaryToolbar = new SecondaryToolbar(\n appConfig.secondaryToolbar,\n container,\n eventBus\n );\n\n if (this.supportsFullscreen) {\n this.pdfPresentationMode = new PDFPresentationMode({\n container,\n pdfViewer: this.pdfViewer,\n eventBus,\n });\n }\n\n this.passwordPrompt = new PasswordPrompt(\n appConfig.passwordOverlay,\n this.overlayManager,\n this.l10n,\n this.isViewerEmbedded\n );\n\n this.pdfOutlineViewer = new PDFOutlineViewer({\n container: appConfig.sidebar.outlineView,\n eventBus,\n linkService: pdfLinkService,\n });\n\n this.pdfAttachmentViewer = new PDFAttachmentViewer({\n container: appConfig.sidebar.attachmentsView,\n eventBus,\n downloadManager,\n });\n\n this.pdfLayerViewer = new PDFLayerViewer({\n container: appConfig.sidebar.layersView,\n eventBus,\n l10n: this.l10n,\n });\n\n this.pdfSidebar = new PDFSidebar({\n elements: appConfig.sidebar,\n pdfViewer: this.pdfViewer,\n pdfThumbnailViewer: this.pdfThumbnailViewer,\n eventBus,\n l10n: this.l10n,\n });\n this.pdfSidebar.onToggled = this.forceRendering.bind(this);\n\n this.pdfSidebarResizer = new PDFSidebarResizer(\n appConfig.sidebarResizer,\n eventBus,\n this.l10n\n );\n },\n\n run(config) {\n this.initialize(config).then(webViewerInitialized);\n },\n\n get initialized() {\n return this._initializedCapability.settled;\n },\n\n get initializedPromise() {\n return this._initializedCapability.promise;\n },\n\n zoomIn(ticks) {\n if (this.pdfViewer.isInPresentationMode) {\n return;\n }\n let newScale = this.pdfViewer.currentScale;\n do {\n newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\n newScale = Math.ceil(newScale * 10) / 10;\n newScale = Math.min(MAX_SCALE, newScale);\n } while (--ticks > 0 && newScale < MAX_SCALE);\n this.pdfViewer.currentScaleValue = newScale;\n },\n\n zoomOut(ticks) {\n if (this.pdfViewer.isInPresentationMode) {\n return;\n }\n let newScale = this.pdfViewer.currentScale;\n do {\n newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\n newScale = Math.floor(newScale * 10) / 10;\n newScale = Math.max(MIN_SCALE, newScale);\n } while (--ticks > 0 && newScale > MIN_SCALE);\n this.pdfViewer.currentScaleValue = newScale;\n },\n\n zoomReset() {\n if (this.pdfViewer.isInPresentationMode) {\n return;\n }\n this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;\n },\n\n get pagesCount() {\n return this.pdfDocument ? this.pdfDocument.numPages : 0;\n },\n\n get page() {\n return this.pdfViewer.currentPageNumber;\n },\n\n set page(val) {\n this.pdfViewer.currentPageNumber = val;\n },\n\n get supportsPrinting() {\n return PDFPrintServiceFactory.instance.supportsPrinting;\n },\n\n get supportsFullscreen() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return shadow(this, \"supportsFullscreen\", document.fullscreenEnabled);\n }\n const doc = document.documentElement;\n let support = !!(\n doc.requestFullscreen ||\n doc.mozRequestFullScreen ||\n doc.webkitRequestFullScreen\n );\n\n if (\n document.fullscreenEnabled === false ||\n document.mozFullScreenEnabled === false ||\n document.webkitFullscreenEnabled === false\n ) {\n support = false;\n }\n return shadow(this, \"supportsFullscreen\", support);\n },\n\n get supportsIntegratedFind() {\n return this.externalServices.supportsIntegratedFind;\n },\n\n get supportsDocumentFonts() {\n return this.externalServices.supportsDocumentFonts;\n },\n\n get loadingBar() {\n const bar = new ProgressBar(\"#loadingBar\");\n return shadow(this, \"loadingBar\", bar);\n },\n\n get supportedMouseWheelZoomModifierKeys() {\n return this.externalServices.supportedMouseWheelZoomModifierKeys;\n },\n\n initPassiveLoading() {\n if (\n typeof PDFJSDev === \"undefined\" ||\n !PDFJSDev.test(\"MOZCENTRAL || CHROME\")\n ) {\n throw new Error(\"Not implemented: initPassiveLoading\");\n }\n this.externalServices.initPassiveLoading({\n onOpenWithTransport: (url, length, transport) => {\n this.open(url, { length, range: transport });\n },\n onOpenWithData: (data, contentDispositionFilename) => {\n if (isPdfFile(contentDispositionFilename)) {\n this._contentDispositionFilename = contentDispositionFilename;\n }\n this.open(data);\n },\n onOpenWithURL: (url, length, originalUrl) => {\n const file = originalUrl !== undefined ? { url, originalUrl } : url;\n const args = length !== undefined ? { length } : null;\n\n this.open(file, args);\n },\n onError: err => {\n this.l10n.get(\"loading_error\").then(msg => {\n this._documentError(msg, err);\n });\n },\n onProgress: (loaded, total) => {\n this.progress(loaded / total);\n },\n });\n },\n\n setTitleUsingUrl(url = \"\") {\n this.url = url;\n this.baseUrl = url.split(\"#\")[0];\n let title = getPdfFilenameFromUrl(url, \"\");\n if (!title) {\n try {\n title = decodeURIComponent(getFilenameFromUrl(url)) || url;\n } catch (ex) {\n // decodeURIComponent may throw URIError,\n // fall back to using the unprocessed url in that case\n title = url;\n }\n }\n this.setTitle(title);\n },\n\n setTitle(title) {\n if (this.isViewerEmbedded) {\n // Embedded PDF viewers should not be changing their parent page's title.\n return;\n }\n document.title = title;\n },\n\n get _docFilename() {\n // Use `this.url` instead of `this.baseUrl` to perform filename detection\n // based on the reference fragment as ultimate fallback if needed.\n return this._contentDispositionFilename || getPdfFilenameFromUrl(this.url);\n },\n\n /**\n * @private\n */\n _cancelIdleCallbacks() {\n if (!this._idleCallbacks.size) {\n return;\n }\n for (const callback of this._idleCallbacks) {\n window.cancelIdleCallback(callback);\n }\n this._idleCallbacks.clear();\n },\n\n /**\n * Closes opened PDF document.\n * @returns {Promise} - Returns the promise, which is resolved when all\n * destruction is completed.\n */\n async close() {\n this._unblockDocumentLoadEvent();\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n const { container } = this.appConfig.errorWrapper;\n container.hidden = true;\n }\n\n if (!this.pdfLoadingTask) {\n return;\n }\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n this.pdfDocument?.annotationStorage.size > 0 &&\n this._annotationStorageModified\n ) {\n try {\n // Trigger saving, to prevent data loss in forms; see issue 12257.\n await this.save({ sourceEventType: \"save\" });\n } catch (reason) {\n // Ignoring errors, to ensure that document closing won't break.\n }\n }\n const promises = [];\n\n promises.push(this.pdfLoadingTask.destroy());\n this.pdfLoadingTask = null;\n\n if (this.pdfDocument) {\n this.pdfDocument = null;\n\n this.pdfThumbnailViewer.setDocument(null);\n this.pdfViewer.setDocument(null);\n this.pdfLinkService.setDocument(null);\n this.pdfDocumentProperties.setDocument(null);\n }\n webViewerResetPermissions();\n this.pdfLinkService.externalLinkEnabled = true;\n this._fellback = false;\n this.store = null;\n this.isInitialViewSet = false;\n this.downloadComplete = false;\n this.url = \"\";\n this.baseUrl = \"\";\n this.documentInfo = null;\n this.metadata = null;\n this._contentDispositionFilename = null;\n this._contentLength = null;\n this._saveInProgress = false;\n\n this._cancelIdleCallbacks();\n promises.push(this.pdfScriptingManager.destroyPromise);\n\n this.pdfSidebar.reset();\n this.pdfOutlineViewer.reset();\n this.pdfAttachmentViewer.reset();\n this.pdfLayerViewer.reset();\n\n if (this.pdfHistory) {\n this.pdfHistory.reset();\n }\n if (this.findBar) {\n this.findBar.reset();\n }\n this.toolbar.reset();\n this.secondaryToolbar.reset();\n\n if (typeof PDFBug !== \"undefined\") {\n PDFBug.cleanup();\n }\n await Promise.all(promises);\n },\n\n /**\n * Opens PDF document specified by URL or array with additional arguments.\n * @param {string|TypedArray|ArrayBuffer} file - PDF location or binary data.\n * @param {Object} [args] - Additional arguments for the getDocument call,\n * e.g. HTTP headers ('httpHeaders') or alternative\n * data transport ('range').\n * @returns {Promise} - Returns the promise, which is resolved when document\n * is opened.\n */\n async open(file, args) {\n if (this.pdfLoadingTask) {\n // We need to destroy already opened document.\n await this.close();\n }\n // Set the necessary global worker parameters, using the available options.\n const workerParameters = AppOptions.getAll(OptionKind.WORKER);\n for (const key in workerParameters) {\n GlobalWorkerOptions[key] = workerParameters[key];\n }\n\n const parameters = Object.create(null);\n if (typeof file === \"string\") {\n // URL\n this.setTitleUsingUrl(file);\n parameters.url = file;\n } else if (file && \"byteLength\" in file) {\n // ArrayBuffer\n parameters.data = file;\n } else if (file.url && file.originalUrl) {\n this.setTitleUsingUrl(file.originalUrl);\n parameters.url = file.url;\n }\n // Set the necessary API parameters, using the available options.\n const apiParameters = AppOptions.getAll(OptionKind.API);\n for (const key in apiParameters) {\n let value = apiParameters[key];\n\n if (key === \"docBaseUrl\" && !value) {\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")) {\n value = document.URL.split(\"#\")[0];\n } else if (PDFJSDev.test(\"MOZCENTRAL || CHROME\")) {\n value = this.baseUrl;\n }\n }\n parameters[key] = value;\n }\n // Finally, update the API parameters with the arguments (if they exist).\n if (args) {\n for (const key in args) {\n parameters[key] = args[key];\n }\n }\n\n const loadingTask = getDocument(parameters);\n this.pdfLoadingTask = loadingTask;\n\n loadingTask.onPassword = (updateCallback, reason) => {\n this.pdfLinkService.externalLinkEnabled = false;\n this.passwordPrompt.setUpdateCallback(updateCallback, reason);\n this.passwordPrompt.open();\n };\n\n loadingTask.onProgress = ({ loaded, total }) => {\n this.progress(loaded / total);\n };\n\n // Listen for unsupported features to trigger the fallback UI.\n loadingTask.onUnsupportedFeature = this.fallback.bind(this);\n\n return loadingTask.promise.then(\n pdfDocument => {\n this.load(pdfDocument);\n },\n exception => {\n if (loadingTask !== this.pdfLoadingTask) {\n return undefined; // Ignore errors for previously opened PDF files.\n }\n\n let key = \"loading_error\";\n if (exception instanceof InvalidPDFException) {\n key = \"invalid_file_error\";\n } else if (exception instanceof MissingPDFException) {\n key = \"missing_file_error\";\n } else if (exception instanceof UnexpectedResponseException) {\n key = \"unexpected_response_error\";\n }\n return this.l10n.get(key).then(msg => {\n this._documentError(msg, { message: exception?.message });\n throw exception;\n });\n }\n );\n },\n\n /**\n * @private\n */\n _ensureDownloadComplete() {\n if (this.pdfDocument && this.downloadComplete) {\n return;\n }\n throw new Error(\"PDF document not downloaded.\");\n },\n\n async download({ sourceEventType = \"download\" } = {}) {\n const url = this.baseUrl,\n filename = this._docFilename;\n try {\n this._ensureDownloadComplete();\n\n const data = await this.pdfDocument.getData();\n const blob = new Blob([data], { type: \"application/pdf\" });\n\n await this.downloadManager.download(blob, url, filename, sourceEventType);\n } catch (reason) {\n // When the PDF document isn't ready, or the PDF file is still\n // downloading, simply download using the URL.\n await this.downloadManager.downloadUrl(url, filename);\n }\n },\n\n async save({ sourceEventType = \"download\" } = {}) {\n if (this._saveInProgress) {\n return;\n }\n this._saveInProgress = true;\n await this.pdfScriptingManager.dispatchWillSave();\n\n const url = this.baseUrl,\n filename = this._docFilename;\n try {\n this._ensureDownloadComplete();\n\n const data = await this.pdfDocument.saveDocument();\n const blob = new Blob([data], { type: \"application/pdf\" });\n\n await this.downloadManager.download(blob, url, filename, sourceEventType);\n } catch (reason) {\n // When the PDF document isn't ready, or the PDF file is still\n // downloading, simply fallback to a \"regular\" download.\n await this.download({ sourceEventType });\n } finally {\n await this.pdfScriptingManager.dispatchDidSave();\n this._saveInProgress = false;\n }\n },\n\n downloadOrSave(options) {\n if (this.pdfDocument?.annotationStorage.size > 0) {\n this.save(options);\n } else {\n this.download(options);\n }\n },\n\n fallback(featureId) {\n this.externalServices.reportTelemetry({\n type: \"unsupportedFeature\",\n featureId,\n });\n\n // Only trigger the fallback once so we don't spam the user with messages\n // for one PDF.\n if (this._fellback) {\n return;\n }\n this._fellback = true;\n\n this.externalServices\n .fallback({\n featureId,\n url: this.baseUrl,\n })\n .then(download => {\n if (!download) {\n return;\n }\n this.download({ sourceEventType: \"download\" });\n });\n },\n\n /**\n * Show the error box; used for errors affecting loading and/or parsing of\n * the entire PDF document.\n */\n _documentError(message, moreInfo = null) {\n this._unblockDocumentLoadEvent();\n\n this._otherError(message, moreInfo);\n },\n\n /**\n * Show the error box; used for errors affecting e.g. only a single page.\n *\n * @param {string} message - A message that is human readable.\n * @param {Object} [moreInfo] - Further information about the error that is\n * more technical. Should have a 'message' and\n * optionally a 'stack' property.\n */\n _otherError(message, moreInfo = null) {\n const moreInfoText = [\n this.l10n.get(\"error_version_info\", {\n version: version || \"?\",\n build: build || \"?\",\n }),\n ];\n if (moreInfo) {\n moreInfoText.push(\n this.l10n.get(\"error_message\", { message: moreInfo.message })\n );\n if (moreInfo.stack) {\n moreInfoText.push(\n this.l10n.get(\"error_stack\", { stack: moreInfo.stack })\n );\n } else {\n if (moreInfo.filename) {\n moreInfoText.push(\n this.l10n.get(\"error_file\", { file: moreInfo.filename })\n );\n }\n if (moreInfo.lineNumber) {\n moreInfoText.push(\n this.l10n.get(\"error_line\", { line: moreInfo.lineNumber })\n );\n }\n }\n }\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n const errorWrapperConfig = this.appConfig.errorWrapper;\n const errorWrapper = errorWrapperConfig.container;\n errorWrapper.hidden = false;\n\n const errorMessage = errorWrapperConfig.errorMessage;\n errorMessage.textContent = message;\n\n const closeButton = errorWrapperConfig.closeButton;\n closeButton.onclick = function () {\n errorWrapper.hidden = true;\n };\n\n const errorMoreInfo = errorWrapperConfig.errorMoreInfo;\n const moreInfoButton = errorWrapperConfig.moreInfoButton;\n const lessInfoButton = errorWrapperConfig.lessInfoButton;\n moreInfoButton.onclick = function () {\n errorMoreInfo.hidden = false;\n moreInfoButton.hidden = true;\n lessInfoButton.hidden = false;\n errorMoreInfo.style.height = errorMoreInfo.scrollHeight + \"px\";\n };\n lessInfoButton.onclick = function () {\n errorMoreInfo.hidden = true;\n moreInfoButton.hidden = false;\n lessInfoButton.hidden = true;\n };\n moreInfoButton.oncontextmenu = noContextMenuHandler;\n lessInfoButton.oncontextmenu = noContextMenuHandler;\n closeButton.oncontextmenu = noContextMenuHandler;\n moreInfoButton.hidden = false;\n lessInfoButton.hidden = true;\n Promise.all(moreInfoText).then(parts => {\n errorMoreInfo.value = parts.join(\"\\n\");\n });\n } else {\n Promise.all(moreInfoText).then(parts => {\n console.error(message + \"\\n\" + parts.join(\"\\n\"));\n });\n this.fallback();\n }\n },\n\n progress(level) {\n if (this.downloadComplete) {\n // Don't accidentally show the loading bar again when the entire file has\n // already been fetched (only an issue when disableAutoFetch is enabled).\n return;\n }\n const percent = Math.round(level * 100);\n // When we transition from full request to range requests, it's possible\n // that we discard some of the loaded data. This can cause the loading\n // bar to move backwards. So prevent this by only updating the bar if it\n // increases.\n if (percent > this.loadingBar.percent || isNaN(percent)) {\n this.loadingBar.percent = percent;\n\n // When disableAutoFetch is enabled, it's not uncommon for the entire file\n // to never be fetched (depends on e.g. the file structure). In this case\n // the loading bar will not be completely filled, nor will it be hidden.\n // To prevent displaying a partially filled loading bar permanently, we\n // hide it when no data has been loaded during a certain amount of time.\n const disableAutoFetch = this.pdfDocument\n ? this.pdfDocument.loadingParams.disableAutoFetch\n : AppOptions.get(\"disableAutoFetch\");\n\n if (disableAutoFetch && percent) {\n if (this.disableAutoFetchLoadingBarTimeout) {\n clearTimeout(this.disableAutoFetchLoadingBarTimeout);\n this.disableAutoFetchLoadingBarTimeout = null;\n }\n this.loadingBar.show();\n\n this.disableAutoFetchLoadingBarTimeout = setTimeout(() => {\n this.loadingBar.hide();\n this.disableAutoFetchLoadingBarTimeout = null;\n }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);\n }\n }\n },\n\n load(pdfDocument) {\n this.pdfDocument = pdfDocument;\n\n pdfDocument.getDownloadInfo().then(({ length }) => {\n this._contentLength = length; // Ensure that the correct length is used.\n this.downloadComplete = true;\n this.loadingBar.hide();\n\n firstPagePromise.then(() => {\n this.eventBus.dispatch(\"documentloaded\", { source: this });\n });\n });\n\n // Since the `setInitialView` call below depends on this being resolved,\n // fetch it early to avoid delaying initial rendering of the PDF document.\n const pageLayoutPromise = pdfDocument.getPageLayout().catch(function () {\n /* Avoid breaking initial rendering; ignoring errors. */\n });\n const pageModePromise = pdfDocument.getPageMode().catch(function () {\n /* Avoid breaking initial rendering; ignoring errors. */\n });\n const openActionPromise = pdfDocument.getOpenAction().catch(function () {\n /* Avoid breaking initial rendering; ignoring errors. */\n });\n\n this.toolbar.setPagesCount(pdfDocument.numPages, false);\n this.secondaryToolbar.setPagesCount(pdfDocument.numPages);\n\n let baseDocumentUrl;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n baseDocumentUrl = null;\n } else if (PDFJSDev.test(\"MOZCENTRAL\")) {\n baseDocumentUrl = this.baseUrl;\n } else if (PDFJSDev.test(\"CHROME\")) {\n baseDocumentUrl = location.href.split(\"#\")[0];\n }\n this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);\n this.pdfDocumentProperties.setDocument(pdfDocument, this.url);\n\n const pdfViewer = this.pdfViewer;\n pdfViewer.setDocument(pdfDocument);\n const { firstPagePromise, onePageRendered, pagesPromise } = pdfViewer;\n\n const pdfThumbnailViewer = this.pdfThumbnailViewer;\n pdfThumbnailViewer.setDocument(pdfDocument);\n\n const storedPromise = (this.store = new ViewHistory(\n pdfDocument.fingerprints[0]\n ))\n .getMultiple({\n page: null,\n zoom: DEFAULT_SCALE_VALUE,\n scrollLeft: \"0\",\n scrollTop: \"0\",\n rotation: null,\n sidebarView: SidebarView.UNKNOWN,\n scrollMode: ScrollMode.UNKNOWN,\n spreadMode: SpreadMode.UNKNOWN,\n })\n .catch(() => {\n /* Unable to read from storage; ignoring errors. */\n return Object.create(null);\n });\n\n firstPagePromise.then(pdfPage => {\n this.loadingBar.setWidth(this.appConfig.viewerContainer);\n this._initializeAnnotationStorageCallbacks(pdfDocument);\n\n Promise.all([\n animationStarted,\n storedPromise,\n pageLayoutPromise,\n pageModePromise,\n openActionPromise,\n ])\n .then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => {\n const viewOnLoad = AppOptions.get(\"viewOnLoad\");\n\n this._initializePdfHistory({\n fingerprint: pdfDocument.fingerprints[0],\n viewOnLoad,\n initialDest: openAction?.dest,\n });\n const initialBookmark = this.initialBookmark;\n\n // Initialize the default values, from user preferences.\n const zoom = AppOptions.get(\"defaultZoomValue\");\n let hash = zoom ? `zoom=${zoom}` : null;\n\n let rotation = null;\n let sidebarView = AppOptions.get(\"sidebarViewOnLoad\");\n let scrollMode = AppOptions.get(\"scrollModeOnLoad\");\n let spreadMode = AppOptions.get(\"spreadModeOnLoad\");\n\n if (stored.page && viewOnLoad !== ViewOnLoad.INITIAL) {\n hash =\n `page=${stored.page}&zoom=${zoom || stored.zoom},` +\n `${stored.scrollLeft},${stored.scrollTop}`;\n\n rotation = parseInt(stored.rotation, 10);\n // Always let user preference take precedence over the view history.\n if (sidebarView === SidebarView.UNKNOWN) {\n sidebarView = stored.sidebarView | 0;\n }\n if (scrollMode === ScrollMode.UNKNOWN) {\n scrollMode = stored.scrollMode | 0;\n }\n if (spreadMode === SpreadMode.UNKNOWN) {\n spreadMode = stored.spreadMode | 0;\n }\n }\n // Always let the user preference/view history take precedence.\n if (pageMode && sidebarView === SidebarView.UNKNOWN) {\n sidebarView = apiPageModeToSidebarView(pageMode);\n }\n if (pageLayout && spreadMode === SpreadMode.UNKNOWN) {\n spreadMode = apiPageLayoutToSpreadMode(pageLayout);\n }\n\n this.setInitialView(hash, {\n rotation,\n sidebarView,\n scrollMode,\n spreadMode,\n });\n this.eventBus.dispatch(\"documentinit\", { source: this });\n // Make all navigation keys work on document load,\n // unless the viewer is embedded in a web page.\n if (!this.isViewerEmbedded) {\n pdfViewer.focus();\n }\n\n // Currently only the \"copy\"-permission is supported, hence we delay\n // the `getPermissions` API call until *after* rendering has started.\n this._initializePermissions(pdfDocument);\n\n // For documents with different page sizes, once all pages are\n // resolved, ensure that the correct location becomes visible on load.\n // (To reduce the risk, in very large and/or slow loading documents,\n // that the location changes *after* the user has started interacting\n // with the viewer, wait for either `pagesPromise` or a timeout.)\n await Promise.race([\n pagesPromise,\n new Promise(resolve => {\n setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);\n }),\n ]);\n if (!initialBookmark && !hash) {\n return;\n }\n if (pdfViewer.hasEqualPageSizes) {\n return;\n }\n this.initialBookmark = initialBookmark;\n\n // eslint-disable-next-line no-self-assign\n pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;\n // Re-apply the initial document location.\n this.setInitialView(hash);\n })\n .catch(() => {\n // Ensure that the document is always completely initialized,\n // even if there are any errors thrown above.\n this.setInitialView();\n })\n .then(function () {\n // At this point, rendering of the initial page(s) should always have\n // started (and may even have completed).\n // To prevent any future issues, e.g. the document being completely\n // blank on load, always trigger rendering here.\n pdfViewer.update();\n });\n });\n\n pagesPromise.then(() => {\n this._unblockDocumentLoadEvent();\n\n this._initializeAutoPrint(pdfDocument, openActionPromise);\n });\n\n onePageRendered.then(() => {\n pdfDocument.getOutline().then(outline => {\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the outline resolved.\n }\n this.pdfOutlineViewer.render({ outline, pdfDocument });\n });\n pdfDocument.getAttachments().then(attachments => {\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the attachments resolved.\n }\n this.pdfAttachmentViewer.render({ attachments });\n });\n // Ensure that the layers accurately reflects the current state in the\n // viewer itself, rather than the default state provided by the API.\n pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => {\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the layers resolved.\n }\n this.pdfLayerViewer.render({ optionalContentConfig, pdfDocument });\n });\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n \"requestIdleCallback\" in window\n ) {\n const callback = window.requestIdleCallback(\n () => {\n this._collectTelemetry(pdfDocument);\n this._idleCallbacks.delete(callback);\n },\n { timeout: 1000 }\n );\n this._idleCallbacks.add(callback);\n }\n });\n\n this._initializePageLabels(pdfDocument);\n this._initializeMetadata(pdfDocument);\n },\n\n /**\n * @private\n */\n async _scriptingDocProperties(pdfDocument) {\n if (!this.documentInfo) {\n // It should be *extremely* rare for metadata to not have been resolved\n // when this code runs, but ensure that we handle that case here.\n await new Promise(resolve => {\n this.eventBus._on(\"metadataloaded\", resolve, { once: true });\n });\n if (pdfDocument !== this.pdfDocument) {\n return null; // The document was closed while the metadata resolved.\n }\n }\n if (!this._contentLength) {\n // Always waiting for the entire PDF document to be loaded will, most\n // likely, delay sandbox-creation too much in the general case for all\n // PDF documents which are not provided as binary data to the API.\n // Hence we'll simply have to trust that the `contentLength` (as provided\n // by the server), when it exists, is accurate enough here.\n await new Promise(resolve => {\n this.eventBus._on(\"documentloaded\", resolve, { once: true });\n });\n if (pdfDocument !== this.pdfDocument) {\n return null; // The document was closed while the downloadInfo resolved.\n }\n }\n\n return {\n ...this.documentInfo,\n baseURL: this.baseUrl,\n filesize: this._contentLength,\n filename: this._docFilename,\n metadata: this.metadata?.getRaw(),\n authors: this.metadata?.get(\"dc:creator\"),\n numPages: this.pagesCount,\n URL: this.url,\n };\n },\n\n /**\n * A place to fetch data for telemetry after one page is rendered and the\n * viewer is idle.\n * @private\n */\n async _collectTelemetry(pdfDocument) {\n const markInfo = await this.pdfDocument.getMarkInfo();\n if (pdfDocument !== this.pdfDocument) {\n return; // Document was closed while waiting for mark info.\n }\n const tagged = markInfo?.Marked || false;\n this.externalServices.reportTelemetry({\n type: \"tagged\",\n tagged,\n });\n },\n\n /**\n * @private\n */\n async _initializeAutoPrint(pdfDocument, openActionPromise) {\n const [openAction, javaScript] = await Promise.all([\n openActionPromise,\n !this.pdfViewer.enableScripting ? pdfDocument.getJavaScript() : null,\n ]);\n\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the auto print data resolved.\n }\n let triggerAutoPrint = false;\n\n if (openAction?.action === \"Print\") {\n triggerAutoPrint = true;\n }\n if (javaScript) {\n javaScript.some(js => {\n if (!js) {\n // Don't warn/fallback for empty JavaScript actions.\n return false;\n }\n console.warn(\"Warning: JavaScript support is not enabled\");\n this.fallback(UNSUPPORTED_FEATURES.javaScript);\n return true;\n });\n\n if (!triggerAutoPrint) {\n // Hack to support auto printing.\n for (const js of javaScript) {\n if (js && AutoPrintRegExp.test(js)) {\n triggerAutoPrint = true;\n break;\n }\n }\n }\n }\n\n if (triggerAutoPrint) {\n this.triggerPrinting();\n }\n },\n\n /**\n * @private\n */\n async _initializeMetadata(pdfDocument) {\n const { info, metadata, contentDispositionFilename, contentLength } =\n await pdfDocument.getMetadata();\n\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the metadata resolved.\n }\n this.documentInfo = info;\n this.metadata = metadata;\n this._contentDispositionFilename ??= contentDispositionFilename;\n this._contentLength ??= contentLength; // See `getDownloadInfo`-call above.\n\n // Provides some basic debug information\n console.log(\n `PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` +\n `${(info.Producer || \"-\").trim()} / ${(info.Creator || \"-\").trim()}] ` +\n `(PDF.js: ${version || \"-\"})`\n );\n\n let pdfTitle = info?.Title;\n\n const metadataTitle = metadata?.get(\"dc:title\");\n if (metadataTitle) {\n // Ghostscript can produce invalid 'dc:title' Metadata entries:\n // - The title may be \"Untitled\" (fixes bug 1031612).\n // - The title may contain incorrectly encoded characters, which thus\n // looks broken, hence we ignore the Metadata entry when it\n // contains characters from the Specials Unicode block\n // (fixes bug 1605526).\n if (\n metadataTitle !== \"Untitled\" &&\n !/[\\uFFF0-\\uFFFF]/g.test(metadataTitle)\n ) {\n pdfTitle = metadataTitle;\n }\n }\n if (pdfTitle) {\n this.setTitle(\n `${pdfTitle} - ${contentDispositionFilename || document.title}`\n );\n } else if (contentDispositionFilename) {\n this.setTitle(contentDispositionFilename);\n }\n\n if (\n info.IsXFAPresent &&\n !info.IsAcroFormPresent &&\n // Note: `isPureXfa === true` implies that `enableXfa = true` was set.\n !pdfDocument.isPureXfa\n ) {\n console.warn(\"Warning: XFA support is not enabled\");\n this.fallback(UNSUPPORTED_FEATURES.forms);\n } else if (\n (info.IsAcroFormPresent || info.IsXFAPresent) &&\n !this.pdfViewer.renderInteractiveForms\n ) {\n console.warn(\"Warning: Interactive form support is not enabled\");\n this.fallback(UNSUPPORTED_FEATURES.forms);\n }\n\n if (info.IsSignaturesPresent) {\n console.warn(\"Warning: Digital signatures validation is not supported\");\n this.fallback(UNSUPPORTED_FEATURES.signatures);\n }\n\n // Telemetry labels must be C++ variable friendly.\n let versionId = \"other\";\n if (KNOWN_VERSIONS.includes(info.PDFFormatVersion)) {\n versionId = `v${info.PDFFormatVersion.replace(\".\", \"_\")}`;\n }\n let generatorId = \"other\";\n if (info.Producer) {\n const producer = info.Producer.toLowerCase();\n KNOWN_GENERATORS.some(function (generator) {\n if (!producer.includes(generator)) {\n return false;\n }\n generatorId = generator.replace(/[ .-]/g, \"_\");\n return true;\n });\n }\n let formType = null;\n if (info.IsXFAPresent) {\n formType = \"xfa\";\n } else if (info.IsAcroFormPresent) {\n formType = \"acroform\";\n }\n this.externalServices.reportTelemetry({\n type: \"documentInfo\",\n version: versionId,\n generator: generatorId,\n formType,\n });\n\n this.eventBus.dispatch(\"metadataloaded\", { source: this });\n },\n\n /**\n * @private\n */\n async _initializePageLabels(pdfDocument) {\n const labels = await pdfDocument.getPageLabels();\n\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the page labels resolved.\n }\n if (!labels || AppOptions.get(\"disablePageLabels\")) {\n return;\n }\n const numLabels = labels.length;\n if (numLabels !== this.pagesCount) {\n console.error(\n \"The number of Page Labels does not match the number of pages in the document.\"\n );\n return;\n }\n let i = 0;\n // Ignore page labels that correspond to standard page numbering.\n while (i < numLabels && labels[i] === (i + 1).toString()) {\n i++;\n }\n if (i === numLabels) {\n return;\n }\n const { pdfViewer, pdfThumbnailViewer, toolbar } = this;\n\n pdfViewer.setPageLabels(labels);\n pdfThumbnailViewer.setPageLabels(labels);\n\n // Changing toolbar page display to use labels and we need to set\n // the label of the current page.\n toolbar.setPagesCount(numLabels, true);\n toolbar.setPageNumber(\n pdfViewer.currentPageNumber,\n pdfViewer.currentPageLabel\n );\n },\n\n /**\n * @private\n */\n _initializePdfHistory({ fingerprint, viewOnLoad, initialDest = null }) {\n if (this.isViewerEmbedded || AppOptions.get(\"disableHistory\")) {\n // The browsing history is only enabled when the viewer is standalone,\n // i.e. not when it is embedded in a web page.\n return;\n }\n this.pdfHistory.initialize({\n fingerprint,\n resetHistory: viewOnLoad === ViewOnLoad.INITIAL,\n updateUrl: AppOptions.get(\"historyUpdateUrl\"),\n });\n\n if (this.pdfHistory.initialBookmark) {\n this.initialBookmark = this.pdfHistory.initialBookmark;\n\n this.initialRotation = this.pdfHistory.initialRotation;\n }\n\n // Always let the browser history/document hash take precedence.\n if (\n initialDest &&\n !this.initialBookmark &&\n viewOnLoad === ViewOnLoad.UNKNOWN\n ) {\n this.initialBookmark = JSON.stringify(initialDest);\n // TODO: Re-factor the `PDFHistory` initialization to remove this hack\n // that's currently necessary to prevent weird initial history state.\n this.pdfHistory.push({ explicitDest: initialDest, pageNumber: null });\n }\n },\n\n /**\n * @private\n */\n async _initializePermissions(pdfDocument) {\n const permissions = await pdfDocument.getPermissions();\n\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the permissions resolved.\n }\n if (!permissions || !AppOptions.get(\"enablePermissions\")) {\n return;\n }\n // Currently only the \"copy\"-permission is supported.\n if (!permissions.includes(PermissionFlag.COPY)) {\n this.appConfig.viewerContainer.classList.add(ENABLE_PERMISSIONS_CLASS);\n }\n },\n\n /**\n * @private\n */\n _initializeAnnotationStorageCallbacks(pdfDocument) {\n if (pdfDocument !== this.pdfDocument) {\n return;\n }\n const { annotationStorage } = pdfDocument;\n\n annotationStorage.onSetModified = () => {\n window.addEventListener(\"beforeunload\", beforeUnload);\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n this._annotationStorageModified = true;\n }\n };\n annotationStorage.onResetModified = () => {\n window.removeEventListener(\"beforeunload\", beforeUnload);\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n delete this._annotationStorageModified;\n }\n };\n },\n\n setInitialView(\n storedHash,\n { rotation, sidebarView, scrollMode, spreadMode } = {}\n ) {\n const setRotation = angle => {\n if (isValidRotation(angle)) {\n this.pdfViewer.pagesRotation = angle;\n }\n };\n const setViewerModes = (scroll, spread) => {\n if (isValidScrollMode(scroll)) {\n this.pdfViewer.scrollMode = scroll;\n }\n if (isValidSpreadMode(spread)) {\n this.pdfViewer.spreadMode = spread;\n }\n };\n this.isInitialViewSet = true;\n this.pdfSidebar.setInitialView(sidebarView);\n\n setViewerModes(scrollMode, spreadMode);\n\n if (this.initialBookmark) {\n setRotation(this.initialRotation);\n delete this.initialRotation;\n\n this.pdfLinkService.setHash(this.initialBookmark);\n this.initialBookmark = null;\n } else if (storedHash) {\n setRotation(rotation);\n\n this.pdfLinkService.setHash(storedHash);\n }\n\n // Ensure that the correct page number is displayed in the UI,\n // even if the active page didn't change during document load.\n this.toolbar.setPageNumber(\n this.pdfViewer.currentPageNumber,\n this.pdfViewer.currentPageLabel\n );\n this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);\n\n if (!this.pdfViewer.currentScaleValue) {\n // Scale was not initialized: invalid bookmark or scale was not specified.\n // Setting the default one.\n this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;\n }\n },\n\n /**\n * @private\n */\n _cleanup() {\n if (!this.pdfDocument) {\n return; // run cleanup when document is loaded\n }\n this.pdfViewer.cleanup();\n this.pdfThumbnailViewer.cleanup();\n\n // We don't want to remove fonts used by active page SVGs.\n this.pdfDocument.cleanup(\n /* keepLoadedFonts = */ this.pdfViewer.renderer === RendererType.SVG\n );\n },\n\n forceRendering() {\n this.pdfRenderingQueue.printing = !!this.printService;\n this.pdfRenderingQueue.isThumbnailViewEnabled =\n this.pdfSidebar.isThumbnailViewVisible;\n this.pdfRenderingQueue.renderHighestPriority();\n },\n\n beforePrint() {\n // Given that the \"beforeprint\" browser event is synchronous, we\n // unfortunately cannot await the scripting event dispatching here.\n this.pdfScriptingManager.dispatchWillPrint();\n\n if (this.printService) {\n // There is no way to suppress beforePrint/afterPrint events,\n // but PDFPrintService may generate double events -- this will ignore\n // the second event that will be coming from native window.print().\n return;\n }\n\n if (!this.supportsPrinting) {\n this.l10n.get(\"printing_not_supported\").then(msg => {\n this._otherError(msg);\n });\n return;\n }\n\n // The beforePrint is a sync method and we need to know layout before\n // returning from this method. Ensure that we can get sizes of the pages.\n if (!this.pdfViewer.pageViewsReady) {\n this.l10n.get(\"printing_not_ready\").then(msg => {\n // eslint-disable-next-line no-alert\n window.alert(msg);\n });\n return;\n }\n\n const pagesOverview = this.pdfViewer.getPagesOverview();\n const printContainer = this.appConfig.printContainer;\n const printResolution = AppOptions.get(\"printResolution\");\n const optionalContentConfigPromise =\n this.pdfViewer.optionalContentConfigPromise;\n\n const printService = PDFPrintServiceFactory.instance.createPrintService(\n this.pdfDocument,\n pagesOverview,\n printContainer,\n printResolution,\n optionalContentConfigPromise,\n this.l10n\n );\n this.printService = printService;\n this.forceRendering();\n\n printService.layout();\n\n this.externalServices.reportTelemetry({\n type: \"print\",\n });\n },\n\n afterPrint() {\n // Given that the \"afterprint\" browser event is synchronous, we\n // unfortunately cannot await the scripting event dispatching here.\n this.pdfScriptingManager.dispatchDidPrint();\n\n if (this.printService) {\n this.printService.destroy();\n this.printService = null;\n\n if (this.pdfDocument) {\n this.pdfDocument.annotationStorage.resetModified();\n }\n }\n this.forceRendering();\n },\n\n rotatePages(delta) {\n this.pdfViewer.pagesRotation += delta;\n // Note that the thumbnail viewer is updated, and rendering is triggered,\n // in the 'rotationchanging' event handler.\n },\n\n requestPresentationMode() {\n if (!this.pdfPresentationMode) {\n return;\n }\n this.pdfPresentationMode.request();\n },\n\n triggerPrinting() {\n if (!this.supportsPrinting) {\n return;\n }\n window.print();\n },\n\n bindEvents() {\n const { eventBus, _boundEvents } = this;\n\n _boundEvents.beforePrint = this.beforePrint.bind(this);\n _boundEvents.afterPrint = this.afterPrint.bind(this);\n\n eventBus._on(\"resize\", webViewerResize);\n eventBus._on(\"hashchange\", webViewerHashchange);\n eventBus._on(\"beforeprint\", _boundEvents.beforePrint);\n eventBus._on(\"afterprint\", _boundEvents.afterPrint);\n eventBus._on(\"pagerendered\", webViewerPageRendered);\n eventBus._on(\"updateviewarea\", webViewerUpdateViewarea);\n eventBus._on(\"pagechanging\", webViewerPageChanging);\n eventBus._on(\"scalechanging\", webViewerScaleChanging);\n eventBus._on(\"rotationchanging\", webViewerRotationChanging);\n eventBus._on(\"sidebarviewchanged\", webViewerSidebarViewChanged);\n eventBus._on(\"pagemode\", webViewerPageMode);\n eventBus._on(\"namedaction\", webViewerNamedAction);\n eventBus._on(\"presentationmodechanged\", webViewerPresentationModeChanged);\n eventBus._on(\"presentationmode\", webViewerPresentationMode);\n eventBus._on(\"print\", webViewerPrint);\n eventBus._on(\"download\", webViewerDownload);\n eventBus._on(\"save\", webViewerSave);\n eventBus._on(\"firstpage\", webViewerFirstPage);\n eventBus._on(\"lastpage\", webViewerLastPage);\n eventBus._on(\"nextpage\", webViewerNextPage);\n eventBus._on(\"previouspage\", webViewerPreviousPage);\n eventBus._on(\"zoomin\", webViewerZoomIn);\n eventBus._on(\"zoomout\", webViewerZoomOut);\n eventBus._on(\"zoomreset\", webViewerZoomReset);\n eventBus._on(\"pagenumberchanged\", webViewerPageNumberChanged);\n eventBus._on(\"scalechanged\", webViewerScaleChanged);\n eventBus._on(\"rotatecw\", webViewerRotateCw);\n eventBus._on(\"rotateccw\", webViewerRotateCcw);\n eventBus._on(\"optionalcontentconfig\", webViewerOptionalContentConfig);\n eventBus._on(\"switchscrollmode\", webViewerSwitchScrollMode);\n eventBus._on(\"scrollmodechanged\", webViewerScrollModeChanged);\n eventBus._on(\"switchspreadmode\", webViewerSwitchSpreadMode);\n eventBus._on(\"spreadmodechanged\", webViewerSpreadModeChanged);\n eventBus._on(\"documentproperties\", webViewerDocumentProperties);\n eventBus._on(\"find\", webViewerFind);\n eventBus._on(\"findfromurlhash\", webViewerFindFromUrlHash);\n eventBus._on(\"updatefindmatchescount\", webViewerUpdateFindMatchesCount);\n eventBus._on(\"updatefindcontrolstate\", webViewerUpdateFindControlState);\n\n if (AppOptions.get(\"pdfBug\")) {\n _boundEvents.reportPageStatsPDFBug = reportPageStatsPDFBug;\n\n eventBus._on(\"pagerendered\", _boundEvents.reportPageStatsPDFBug);\n eventBus._on(\"pagechanging\", _boundEvents.reportPageStatsPDFBug);\n }\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n eventBus._on(\"fileinputchange\", webViewerFileInputChange);\n eventBus._on(\"openfile\", webViewerOpenFile);\n }\n },\n\n bindWindowEvents() {\n const { eventBus, _boundEvents } = this;\n\n _boundEvents.windowResize = () => {\n eventBus.dispatch(\"resize\", { source: window });\n };\n _boundEvents.windowHashChange = () => {\n eventBus.dispatch(\"hashchange\", {\n source: window,\n hash: document.location.hash.substring(1),\n });\n };\n _boundEvents.windowBeforePrint = () => {\n eventBus.dispatch(\"beforeprint\", { source: window });\n };\n _boundEvents.windowAfterPrint = () => {\n eventBus.dispatch(\"afterprint\", { source: window });\n };\n _boundEvents.windowUpdateFromSandbox = event => {\n eventBus.dispatch(\"updatefromsandbox\", {\n source: window,\n detail: event.detail,\n });\n };\n\n window.addEventListener(\"visibilitychange\", webViewerVisibilityChange);\n window.addEventListener(\"wheel\", webViewerWheel, { passive: false });\n window.addEventListener(\"touchstart\", webViewerTouchStart, {\n passive: false,\n });\n window.addEventListener(\"click\", webViewerClick);\n window.addEventListener(\"keydown\", webViewerKeyDown);\n window.addEventListener(\"resize\", _boundEvents.windowResize);\n window.addEventListener(\"hashchange\", _boundEvents.windowHashChange);\n window.addEventListener(\"beforeprint\", _boundEvents.windowBeforePrint);\n window.addEventListener(\"afterprint\", _boundEvents.windowAfterPrint);\n window.addEventListener(\n \"updatefromsandbox\",\n _boundEvents.windowUpdateFromSandbox\n );\n },\n\n unbindEvents() {\n const { eventBus, _boundEvents } = this;\n\n eventBus._off(\"resize\", webViewerResize);\n eventBus._off(\"hashchange\", webViewerHashchange);\n eventBus._off(\"beforeprint\", _boundEvents.beforePrint);\n eventBus._off(\"afterprint\", _boundEvents.afterPrint);\n eventBus._off(\"pagerendered\", webViewerPageRendered);\n eventBus._off(\"updateviewarea\", webViewerUpdateViewarea);\n eventBus._off(\"pagechanging\", webViewerPageChanging);\n eventBus._off(\"scalechanging\", webViewerScaleChanging);\n eventBus._off(\"rotationchanging\", webViewerRotationChanging);\n eventBus._off(\"sidebarviewchanged\", webViewerSidebarViewChanged);\n eventBus._off(\"pagemode\", webViewerPageMode);\n eventBus._off(\"namedaction\", webViewerNamedAction);\n eventBus._off(\"presentationmodechanged\", webViewerPresentationModeChanged);\n eventBus._off(\"presentationmode\", webViewerPresentationMode);\n eventBus._off(\"print\", webViewerPrint);\n eventBus._off(\"download\", webViewerDownload);\n eventBus._off(\"save\", webViewerSave);\n eventBus._off(\"firstpage\", webViewerFirstPage);\n eventBus._off(\"lastpage\", webViewerLastPage);\n eventBus._off(\"nextpage\", webViewerNextPage);\n eventBus._off(\"previouspage\", webViewerPreviousPage);\n eventBus._off(\"zoomin\", webViewerZoomIn);\n eventBus._off(\"zoomout\", webViewerZoomOut);\n eventBus._off(\"zoomreset\", webViewerZoomReset);\n eventBus._off(\"pagenumberchanged\", webViewerPageNumberChanged);\n eventBus._off(\"scalechanged\", webViewerScaleChanged);\n eventBus._off(\"rotatecw\", webViewerRotateCw);\n eventBus._off(\"rotateccw\", webViewerRotateCcw);\n eventBus._off(\"optionalcontentconfig\", webViewerOptionalContentConfig);\n eventBus._off(\"switchscrollmode\", webViewerSwitchScrollMode);\n eventBus._off(\"scrollmodechanged\", webViewerScrollModeChanged);\n eventBus._off(\"switchspreadmode\", webViewerSwitchSpreadMode);\n eventBus._off(\"spreadmodechanged\", webViewerSpreadModeChanged);\n eventBus._off(\"documentproperties\", webViewerDocumentProperties);\n eventBus._off(\"find\", webViewerFind);\n eventBus._off(\"findfromurlhash\", webViewerFindFromUrlHash);\n eventBus._off(\"updatefindmatchescount\", webViewerUpdateFindMatchesCount);\n eventBus._off(\"updatefindcontrolstate\", webViewerUpdateFindControlState);\n\n if (_boundEvents.reportPageStatsPDFBug) {\n eventBus._off(\"pagerendered\", _boundEvents.reportPageStatsPDFBug);\n eventBus._off(\"pagechanging\", _boundEvents.reportPageStatsPDFBug);\n\n _boundEvents.reportPageStatsPDFBug = null;\n }\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n eventBus._off(\"fileinputchange\", webViewerFileInputChange);\n eventBus._off(\"openfile\", webViewerOpenFile);\n }\n\n _boundEvents.beforePrint = null;\n _boundEvents.afterPrint = null;\n },\n\n unbindWindowEvents() {\n const { _boundEvents } = this;\n\n window.removeEventListener(\"visibilitychange\", webViewerVisibilityChange);\n window.removeEventListener(\"wheel\", webViewerWheel, { passive: false });\n window.removeEventListener(\"touchstart\", webViewerTouchStart, {\n passive: false,\n });\n window.removeEventListener(\"click\", webViewerClick);\n window.removeEventListener(\"keydown\", webViewerKeyDown);\n window.removeEventListener(\"resize\", _boundEvents.windowResize);\n window.removeEventListener(\"hashchange\", _boundEvents.windowHashChange);\n window.removeEventListener(\"beforeprint\", _boundEvents.windowBeforePrint);\n window.removeEventListener(\"afterprint\", _boundEvents.windowAfterPrint);\n window.removeEventListener(\n \"updatefromsandbox\",\n _boundEvents.windowUpdateFromSandbox\n );\n\n _boundEvents.windowResize = null;\n _boundEvents.windowHashChange = null;\n _boundEvents.windowBeforePrint = null;\n _boundEvents.windowAfterPrint = null;\n _boundEvents.windowUpdateFromSandbox = null;\n },\n\n accumulateWheelTicks(ticks) {\n // If the scroll direction changed, reset the accumulated wheel ticks.\n if (\n (this._wheelUnusedTicks > 0 && ticks < 0) ||\n (this._wheelUnusedTicks < 0 && ticks > 0)\n ) {\n this._wheelUnusedTicks = 0;\n }\n this._wheelUnusedTicks += ticks;\n const wholeTicks =\n Math.sign(this._wheelUnusedTicks) *\n Math.floor(Math.abs(this._wheelUnusedTicks));\n this._wheelUnusedTicks -= wholeTicks;\n return wholeTicks;\n },\n\n /**\n * Should be called *after* all pages have loaded, or if an error occurred,\n * to unblock the \"load\" event; see https://bugzilla.mozilla.org/show_bug.cgi?id=1618553\n * @private\n */\n _unblockDocumentLoadEvent() {\n if (document.blockUnblockOnload) {\n document.blockUnblockOnload(false);\n }\n // Ensure that this method is only ever run once.\n this._unblockDocumentLoadEvent = () => {};\n },\n\n /**\n * Used together with the integration-tests, to enable awaiting full\n * initialization of the scripting/sandbox.\n */\n get scriptingReady() {\n return this.pdfScriptingManager.ready;\n },\n};\n\nlet validateFileURL;\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n const HOSTED_VIEWER_ORIGINS = [\n \"null\",\n \"http://mozilla.github.io\",\n \"https://mozilla.github.io\",\n ];\n validateFileURL = function (file) {\n if (file === undefined) {\n return;\n }\n try {\n const viewerOrigin = new URL(window.location.href).origin || \"null\";\n if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {\n // Hosted or local viewer, allow for any file locations\n return;\n }\n const { origin, protocol } = new URL(file, window.location.href);\n // Removing of the following line will not guarantee that the viewer will\n // start accepting URLs from foreign origin -- CORS headers on the remote\n // server must be properly configured.\n // IE10 / IE11 does not include an origin in `blob:`-URLs. So don't block\n // any blob:-URL. The browser's same-origin policy will block requests to\n // blob:-URLs from other origins, so this is safe.\n if (origin !== viewerOrigin && protocol !== \"blob:\") {\n throw new Error(\"file origin does not match viewer's\");\n }\n } catch (ex) {\n PDFViewerApplication.l10n.get(\"loading_error\").then(msg => {\n PDFViewerApplication._documentError(msg, { message: ex?.message });\n });\n throw ex;\n }\n };\n}\n\nasync function loadFakeWorker() {\n if (!GlobalWorkerOptions.workerSrc) {\n GlobalWorkerOptions.workerSrc = AppOptions.get(\"workerSrc\");\n }\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")) {\n window.pdfjsWorker = await import(\"pdfjs/core/worker.js\");\n return undefined;\n }\n return loadScript(PDFWorker.getWorkerSrc());\n}\n\nfunction loadAndEnablePDFBug(enabledTabs) {\n const appConfig = PDFViewerApplication.appConfig;\n return loadScript(appConfig.debuggerScriptPath).then(function () {\n PDFBug.enable(enabledTabs);\n PDFBug.init({ OPS }, appConfig.mainContainer);\n });\n}\n\nfunction reportPageStatsPDFBug({ pageNumber }) {\n if (typeof Stats === \"undefined\" || !Stats.enabled) {\n return;\n }\n const pageView = PDFViewerApplication.pdfViewer.getPageView(\n /* index = */ pageNumber - 1\n );\n const pageStats = pageView?.pdfPage?.stats;\n if (!pageStats) {\n return;\n }\n Stats.add(pageNumber, pageStats);\n}\n\nfunction webViewerInitialized() {\n const appConfig = PDFViewerApplication.appConfig;\n let file;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n const queryString = document.location.search.substring(1);\n const params = parseQueryString(queryString);\n file = \"file\" in params ? params.file : AppOptions.get(\"defaultUrl\");\n validateFileURL(file);\n } else if (PDFJSDev.test(\"MOZCENTRAL\")) {\n file = window.location.href;\n } else if (PDFJSDev.test(\"CHROME\")) {\n file = AppOptions.get(\"defaultUrl\");\n }\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n const fileInput = document.createElement(\"input\");\n fileInput.id = appConfig.openFileInputName;\n fileInput.className = \"fileInput\";\n fileInput.setAttribute(\"type\", \"file\");\n fileInput.oncontextmenu = noContextMenuHandler;\n document.body.appendChild(fileInput);\n\n if (\n !window.File ||\n !window.FileReader ||\n !window.FileList ||\n !window.Blob\n ) {\n appConfig.toolbar.openFile.hidden = true;\n appConfig.secondaryToolbar.openFileButton.hidden = true;\n } else {\n fileInput.value = null;\n }\n\n fileInput.addEventListener(\"change\", function (evt) {\n const files = evt.target.files;\n if (!files || files.length === 0) {\n return;\n }\n PDFViewerApplication.eventBus.dispatch(\"fileinputchange\", {\n source: this,\n fileInput: evt.target,\n });\n });\n\n // Enable dragging-and-dropping a new PDF file onto the viewerContainer.\n appConfig.mainContainer.addEventListener(\"dragover\", function (evt) {\n evt.preventDefault();\n\n evt.dataTransfer.dropEffect = \"move\";\n });\n appConfig.mainContainer.addEventListener(\"drop\", function (evt) {\n evt.preventDefault();\n\n const files = evt.dataTransfer.files;\n if (!files || files.length === 0) {\n return;\n }\n PDFViewerApplication.eventBus.dispatch(\"fileinputchange\", {\n source: this,\n fileInput: evt.dataTransfer,\n });\n });\n } else {\n appConfig.toolbar.openFile.hidden = true;\n appConfig.secondaryToolbar.openFileButton.hidden = true;\n }\n\n if (!PDFViewerApplication.supportsDocumentFonts) {\n AppOptions.set(\"disableFontFace\", true);\n PDFViewerApplication.l10n.get(\"web_fonts_disabled\").then(msg => {\n console.warn(msg);\n });\n }\n\n if (!PDFViewerApplication.supportsPrinting) {\n appConfig.toolbar.print.classList.add(\"hidden\");\n appConfig.secondaryToolbar.printButton.classList.add(\"hidden\");\n }\n\n if (!PDFViewerApplication.supportsFullscreen) {\n appConfig.toolbar.presentationModeButton.classList.add(\"hidden\");\n appConfig.secondaryToolbar.presentationModeButton.classList.add(\"hidden\");\n }\n\n if (PDFViewerApplication.supportsIntegratedFind) {\n appConfig.toolbar.viewFind.classList.add(\"hidden\");\n }\n\n appConfig.mainContainer.addEventListener(\n \"transitionend\",\n function (evt) {\n if (evt.target === /* mainContainer */ this) {\n PDFViewerApplication.eventBus.dispatch(\"resize\", { source: this });\n }\n },\n true\n );\n\n try {\n webViewerOpenFileViaURL(file);\n } catch (reason) {\n PDFViewerApplication.l10n.get(\"loading_error\").then(msg => {\n PDFViewerApplication._documentError(msg, reason);\n });\n }\n}\n\nfunction webViewerOpenFileViaURL(file) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n if (file) {\n PDFViewerApplication.open(file);\n }\n } else if (PDFJSDev.test(\"MOZCENTRAL || CHROME\")) {\n PDFViewerApplication.setTitleUsingUrl(file);\n PDFViewerApplication.initPassiveLoading();\n } else {\n if (file) {\n throw new Error(\"Not implemented: webViewerOpenFileViaURL\");\n }\n }\n}\n\nfunction webViewerResetPermissions() {\n const { appConfig } = PDFViewerApplication;\n if (!appConfig) {\n return;\n }\n // Currently only the \"copy\"-permission is supported.\n appConfig.viewerContainer.classList.remove(ENABLE_PERMISSIONS_CLASS);\n}\n\nfunction webViewerPageRendered({ pageNumber, timestamp, error }) {\n // If the page is still visible when it has finished rendering,\n // ensure that the page number input loading indicator is hidden.\n if (pageNumber === PDFViewerApplication.page) {\n PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);\n }\n\n // Use the rendered page to set the corresponding thumbnail image.\n if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n const pageView = PDFViewerApplication.pdfViewer.getPageView(\n /* index = */ pageNumber - 1\n );\n const thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(\n /* index = */ pageNumber - 1\n );\n if (pageView && thumbnailView) {\n thumbnailView.setImage(pageView);\n }\n }\n\n if (error) {\n PDFViewerApplication.l10n.get(\"rendering_error\").then(msg => {\n PDFViewerApplication._otherError(msg, error);\n });\n }\n\n PDFViewerApplication.externalServices.reportTelemetry({\n type: \"pageInfo\",\n timestamp,\n });\n // It is a good time to report stream and font types.\n PDFViewerApplication.pdfDocument.getStats().then(function (stats) {\n PDFViewerApplication.externalServices.reportTelemetry({\n type: \"documentStats\",\n stats,\n });\n });\n}\n\nfunction webViewerPageMode({ mode }) {\n // Handle the 'pagemode' hash parameter, see also `PDFLinkService_setHash`.\n let view;\n switch (mode) {\n case \"thumbs\":\n view = SidebarView.THUMBS;\n break;\n case \"bookmarks\":\n case \"outline\": // non-standard\n view = SidebarView.OUTLINE;\n break;\n case \"attachments\": // non-standard\n view = SidebarView.ATTACHMENTS;\n break;\n case \"layers\": // non-standard\n view = SidebarView.LAYERS;\n break;\n case \"none\":\n view = SidebarView.NONE;\n break;\n default:\n console.error('Invalid \"pagemode\" hash parameter: ' + mode);\n return;\n }\n PDFViewerApplication.pdfSidebar.switchView(view, /* forceOpen = */ true);\n}\n\nfunction webViewerNamedAction(evt) {\n // Processing a couple of named actions that might be useful, see also\n // `PDFLinkService.executeNamedAction`.\n switch (evt.action) {\n case \"GoToPage\":\n PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n break;\n\n case \"Find\":\n if (!PDFViewerApplication.supportsIntegratedFind) {\n PDFViewerApplication.findBar.toggle();\n }\n break;\n\n case \"Print\":\n PDFViewerApplication.triggerPrinting();\n break;\n\n case \"SaveAs\":\n webViewerSave();\n break;\n }\n}\n\nfunction webViewerPresentationModeChanged(evt) {\n PDFViewerApplication.pdfViewer.presentationModeState = evt.state;\n}\n\nfunction webViewerSidebarViewChanged(evt) {\n PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled =\n PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;\n\n const store = PDFViewerApplication.store;\n if (store && PDFViewerApplication.isInitialViewSet) {\n // Only update the storage when the document has been loaded *and* rendered.\n store.set(\"sidebarView\", evt.view).catch(function () {});\n }\n}\n\nfunction webViewerUpdateViewarea(evt) {\n const location = evt.location,\n store = PDFViewerApplication.store;\n\n if (store && PDFViewerApplication.isInitialViewSet) {\n store\n .setMultiple({\n page: location.pageNumber,\n zoom: location.scale,\n scrollLeft: location.left,\n scrollTop: location.top,\n rotation: location.rotation,\n })\n .catch(function () {\n /* unable to write to storage */\n });\n }\n const href = PDFViewerApplication.pdfLinkService.getAnchorUrl(\n location.pdfOpenParams\n );\n PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;\n PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href =\n href;\n\n // Show/hide the loading indicator in the page number input element.\n const currentPage = PDFViewerApplication.pdfViewer.getPageView(\n /* index = */ PDFViewerApplication.page - 1\n );\n const loading = currentPage?.renderingState !== RenderingStates.FINISHED;\n PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);\n}\n\nfunction webViewerScrollModeChanged(evt) {\n const store = PDFViewerApplication.store;\n if (store && PDFViewerApplication.isInitialViewSet) {\n // Only update the storage when the document has been loaded *and* rendered.\n store.set(\"scrollMode\", evt.mode).catch(function () {});\n }\n}\n\nfunction webViewerSpreadModeChanged(evt) {\n const store = PDFViewerApplication.store;\n if (store && PDFViewerApplication.isInitialViewSet) {\n // Only update the storage when the document has been loaded *and* rendered.\n store.set(\"spreadMode\", evt.mode).catch(function () {});\n }\n}\n\nfunction webViewerResize() {\n const { pdfDocument, pdfViewer } = PDFViewerApplication;\n if (!pdfDocument) {\n return;\n }\n const currentScaleValue = pdfViewer.currentScaleValue;\n if (\n currentScaleValue === \"auto\" ||\n currentScaleValue === \"page-fit\" ||\n currentScaleValue === \"page-width\"\n ) {\n // Note: the scale is constant for 'page-actual'.\n pdfViewer.currentScaleValue = currentScaleValue;\n }\n pdfViewer.update();\n}\n\nfunction webViewerHashchange(evt) {\n const hash = evt.hash;\n if (!hash) {\n return;\n }\n if (!PDFViewerApplication.isInitialViewSet) {\n PDFViewerApplication.initialBookmark = hash;\n } else if (!PDFViewerApplication.pdfHistory.popStateInProgress) {\n PDFViewerApplication.pdfLinkService.setHash(hash);\n }\n}\n\nlet webViewerFileInputChange, webViewerOpenFile;\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n webViewerFileInputChange = function (evt) {\n if (PDFViewerApplication.pdfViewer?.isInPresentationMode) {\n return; // Opening a new PDF file isn't supported in Presentation Mode.\n }\n const file = evt.fileInput.files[0];\n\n if (!viewerCompatibilityParams.disableCreateObjectURL) {\n let url = URL.createObjectURL(file);\n if (file.name) {\n url = { url, originalUrl: file.name };\n }\n PDFViewerApplication.open(url);\n } else {\n PDFViewerApplication.setTitleUsingUrl(file.name);\n // Read the local file into a Uint8Array.\n const fileReader = new FileReader();\n fileReader.onload = function webViewerChangeFileReaderOnload(event) {\n const buffer = event.target.result;\n PDFViewerApplication.open(new Uint8Array(buffer));\n };\n fileReader.readAsArrayBuffer(file);\n }\n\n // URL does not reflect proper document location - hiding some icons.\n const appConfig = PDFViewerApplication.appConfig;\n appConfig.toolbar.viewBookmark.hidden = true;\n appConfig.secondaryToolbar.viewBookmarkButton.hidden = true;\n appConfig.toolbar.download.hidden = true;\n appConfig.secondaryToolbar.downloadButton.hidden = true;\n };\n\n webViewerOpenFile = function (evt) {\n const openFileInputName = PDFViewerApplication.appConfig.openFileInputName;\n document.getElementById(openFileInputName).click();\n };\n}\n\nfunction webViewerPresentationMode() {\n PDFViewerApplication.requestPresentationMode();\n}\nfunction webViewerPrint() {\n PDFViewerApplication.triggerPrinting();\n}\nfunction webViewerDownload() {\n PDFViewerApplication.downloadOrSave({ sourceEventType: \"download\" });\n}\nfunction webViewerSave() {\n PDFViewerApplication.downloadOrSave({ sourceEventType: \"save\" });\n}\nfunction webViewerFirstPage() {\n if (PDFViewerApplication.pdfDocument) {\n PDFViewerApplication.page = 1;\n }\n}\nfunction webViewerLastPage() {\n if (PDFViewerApplication.pdfDocument) {\n PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n }\n}\nfunction webViewerNextPage() {\n PDFViewerApplication.pdfViewer.nextPage();\n}\nfunction webViewerPreviousPage() {\n PDFViewerApplication.pdfViewer.previousPage();\n}\nfunction webViewerZoomIn() {\n PDFViewerApplication.zoomIn();\n}\nfunction webViewerZoomOut() {\n PDFViewerApplication.zoomOut();\n}\nfunction webViewerZoomReset() {\n PDFViewerApplication.zoomReset();\n}\nfunction webViewerPageNumberChanged(evt) {\n const pdfViewer = PDFViewerApplication.pdfViewer;\n // Note that for `<input type=\"number\">` HTML elements, an empty string will\n // be returned for non-number inputs; hence we simply do nothing in that case.\n if (evt.value !== \"\") {\n PDFViewerApplication.pdfLinkService.goToPage(evt.value);\n }\n\n // Ensure that the page number input displays the correct value, even if the\n // value entered by the user was invalid (e.g. a floating point number).\n if (\n evt.value !== pdfViewer.currentPageNumber.toString() &&\n evt.value !== pdfViewer.currentPageLabel\n ) {\n PDFViewerApplication.toolbar.setPageNumber(\n pdfViewer.currentPageNumber,\n pdfViewer.currentPageLabel\n );\n }\n}\nfunction webViewerScaleChanged(evt) {\n PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;\n}\nfunction webViewerRotateCw() {\n PDFViewerApplication.rotatePages(90);\n}\nfunction webViewerRotateCcw() {\n PDFViewerApplication.rotatePages(-90);\n}\nfunction webViewerOptionalContentConfig(evt) {\n PDFViewerApplication.pdfViewer.optionalContentConfigPromise = evt.promise;\n}\nfunction webViewerSwitchScrollMode(evt) {\n PDFViewerApplication.pdfViewer.scrollMode = evt.mode;\n}\nfunction webViewerSwitchSpreadMode(evt) {\n PDFViewerApplication.pdfViewer.spreadMode = evt.mode;\n}\nfunction webViewerDocumentProperties() {\n PDFViewerApplication.pdfDocumentProperties.open();\n}\n\nfunction webViewerFind(evt) {\n PDFViewerApplication.findController.executeCommand(\"find\" + evt.type, {\n query: evt.query,\n phraseSearch: evt.phraseSearch,\n caseSensitive: evt.caseSensitive,\n entireWord: evt.entireWord,\n highlightAll: evt.highlightAll,\n findPrevious: evt.findPrevious,\n });\n}\n\nfunction webViewerFindFromUrlHash(evt) {\n PDFViewerApplication.findController.executeCommand(\"find\", {\n query: evt.query,\n phraseSearch: evt.phraseSearch,\n caseSensitive: false,\n entireWord: false,\n highlightAll: true,\n findPrevious: false,\n });\n}\n\nfunction webViewerUpdateFindMatchesCount({ matchesCount }) {\n if (PDFViewerApplication.supportsIntegratedFind) {\n PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount);\n } else {\n PDFViewerApplication.findBar.updateResultsCount(matchesCount);\n }\n}\n\nfunction webViewerUpdateFindControlState({\n state,\n previous,\n matchesCount,\n rawQuery,\n}) {\n if (PDFViewerApplication.supportsIntegratedFind) {\n PDFViewerApplication.externalServices.updateFindControlState({\n result: state,\n findPrevious: previous,\n matchesCount,\n rawQuery,\n });\n } else {\n PDFViewerApplication.findBar.updateUIState(state, previous, matchesCount);\n }\n}\n\nfunction webViewerScaleChanging(evt) {\n PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);\n\n PDFViewerApplication.pdfViewer.update();\n}\n\nfunction webViewerRotationChanging(evt) {\n PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;\n\n PDFViewerApplication.forceRendering();\n // Ensure that the active page doesn't change during rotation.\n PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber;\n}\n\nfunction webViewerPageChanging({ pageNumber, pageLabel }) {\n PDFViewerApplication.toolbar.setPageNumber(pageNumber, pageLabel);\n PDFViewerApplication.secondaryToolbar.setPageNumber(pageNumber);\n\n if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(pageNumber);\n }\n}\n\nfunction webViewerVisibilityChange(evt) {\n if (document.visibilityState === \"visible\") {\n // Ignore mouse wheel zooming during tab switches (bug 1503412).\n setZoomDisabledTimeout();\n }\n}\n\nlet zoomDisabledTimeout = null;\nfunction setZoomDisabledTimeout() {\n if (zoomDisabledTimeout) {\n clearTimeout(zoomDisabledTimeout);\n }\n zoomDisabledTimeout = setTimeout(function () {\n zoomDisabledTimeout = null;\n }, WHEEL_ZOOM_DISABLED_TIMEOUT);\n}\n\nfunction webViewerWheel(evt) {\n const { pdfViewer, supportedMouseWheelZoomModifierKeys } =\n PDFViewerApplication;\n\n if (pdfViewer.isInPresentationMode) {\n return;\n }\n\n if (\n (evt.ctrlKey && supportedMouseWheelZoomModifierKeys.ctrlKey) ||\n (evt.metaKey && supportedMouseWheelZoomModifierKeys.metaKey)\n ) {\n // Only zoom the pages, not the entire viewer.\n evt.preventDefault();\n // NOTE: this check must be placed *after* preventDefault.\n if (zoomDisabledTimeout || document.visibilityState === \"hidden\") {\n return;\n }\n\n const previousScale = pdfViewer.currentScale;\n\n const delta = normalizeWheelEventDirection(evt);\n let ticks = 0;\n if (\n evt.deltaMode === WheelEvent.DOM_DELTA_LINE ||\n evt.deltaMode === WheelEvent.DOM_DELTA_PAGE\n ) {\n // For line-based devices, use one tick per event, because different\n // OSs have different defaults for the number lines. But we generally\n // want one \"clicky\" roll of the wheel (which produces one event) to\n // adjust the zoom by one step.\n if (Math.abs(delta) >= 1) {\n ticks = Math.sign(delta);\n } else {\n // If we're getting fractional lines (I can't think of a scenario\n // this might actually happen), be safe and use the accumulator.\n ticks = PDFViewerApplication.accumulateWheelTicks(delta);\n }\n } else {\n // pixel-based devices\n const PIXELS_PER_LINE_SCALE = 30;\n ticks = PDFViewerApplication.accumulateWheelTicks(\n delta / PIXELS_PER_LINE_SCALE\n );\n }\n\n if (ticks < 0) {\n PDFViewerApplication.zoomOut(-ticks);\n } else if (ticks > 0) {\n PDFViewerApplication.zoomIn(ticks);\n }\n\n const currentScale = pdfViewer.currentScale;\n if (previousScale !== currentScale) {\n // After scaling the page via zoomIn/zoomOut, the position of the upper-\n // left corner is restored. When the mouse wheel is used, the position\n // under the cursor should be restored instead.\n const scaleCorrectionFactor = currentScale / previousScale - 1;\n const rect = pdfViewer.container.getBoundingClientRect();\n const dx = evt.clientX - rect.left;\n const dy = evt.clientY - rect.top;\n pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;\n pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;\n }\n } else {\n setZoomDisabledTimeout();\n }\n}\n\nfunction webViewerTouchStart(evt) {\n if (evt.touches.length > 1) {\n // Disable touch-based zooming, because the entire UI bits gets zoomed and\n // that doesn't look great. If we do want to have a good touch-based\n // zooming experience, we need to implement smooth zoom capability (probably\n // using a CSS transform for faster visual response, followed by async\n // re-rendering at the final zoom level) and do gesture detection on the\n // touchmove events to drive it. Or if we want to settle for a less good\n // experience we can make the touchmove events drive the existing step-zoom\n // behaviour that the ctrl+mousewheel path takes.\n evt.preventDefault();\n }\n}\n\nfunction webViewerClick(evt) {\n if (!PDFViewerApplication.secondaryToolbar.isOpen) {\n return;\n }\n const appConfig = PDFViewerApplication.appConfig;\n if (\n PDFViewerApplication.pdfViewer.containsElement(evt.target) ||\n (appConfig.toolbar.container.contains(evt.target) &&\n evt.target !== appConfig.secondaryToolbar.toggleButton)\n ) {\n PDFViewerApplication.secondaryToolbar.close();\n }\n}\n\nfunction webViewerKeyDown(evt) {\n if (PDFViewerApplication.overlayManager.active) {\n return;\n }\n\n let handled = false,\n ensureViewerFocused = false;\n const cmd =\n (evt.ctrlKey ? 1 : 0) |\n (evt.altKey ? 2 : 0) |\n (evt.shiftKey ? 4 : 0) |\n (evt.metaKey ? 8 : 0);\n\n const pdfViewer = PDFViewerApplication.pdfViewer;\n const isViewerInPresentationMode = pdfViewer?.isInPresentationMode;\n\n // First, handle the key bindings that are independent whether an input\n // control is selected or not.\n if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n // either CTRL or META key with optional SHIFT.\n switch (evt.keyCode) {\n case 70: // f\n if (!PDFViewerApplication.supportsIntegratedFind && !evt.shiftKey) {\n PDFViewerApplication.findBar.open();\n handled = true;\n }\n break;\n case 71: // g\n if (!PDFViewerApplication.supportsIntegratedFind) {\n const findState = PDFViewerApplication.findController.state;\n if (findState) {\n PDFViewerApplication.findController.executeCommand(\"findagain\", {\n query: findState.query,\n phraseSearch: findState.phraseSearch,\n caseSensitive: findState.caseSensitive,\n entireWord: findState.entireWord,\n highlightAll: findState.highlightAll,\n findPrevious: cmd === 5 || cmd === 12,\n });\n }\n handled = true;\n }\n break;\n case 61: // FF/Mac '='\n case 107: // FF '+' and '='\n case 187: // Chrome '+'\n case 171: // FF with German keyboard\n if (!isViewerInPresentationMode) {\n PDFViewerApplication.zoomIn();\n }\n handled = true;\n break;\n case 173: // FF/Mac '-'\n case 109: // FF '-'\n case 189: // Chrome '-'\n if (!isViewerInPresentationMode) {\n PDFViewerApplication.zoomOut();\n }\n handled = true;\n break;\n case 48: // '0'\n case 96: // '0' on Numpad of Swedish keyboard\n if (!isViewerInPresentationMode) {\n // keeping it unhandled (to restore page zoom to 100%)\n setTimeout(function () {\n // ... and resetting the scale after browser adjusts its scale\n PDFViewerApplication.zoomReset();\n });\n handled = false;\n }\n break;\n\n case 38: // up arrow\n if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n PDFViewerApplication.page = 1;\n handled = true;\n ensureViewerFocused = true;\n }\n break;\n case 40: // down arrow\n if (\n isViewerInPresentationMode ||\n PDFViewerApplication.page < PDFViewerApplication.pagesCount\n ) {\n PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n handled = true;\n ensureViewerFocused = true;\n }\n break;\n }\n }\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC || CHROME\")) {\n const { eventBus } = PDFViewerApplication;\n\n // CTRL or META without shift\n if (cmd === 1 || cmd === 8) {\n switch (evt.keyCode) {\n case 83: // s\n eventBus.dispatch(\"download\", { source: window });\n handled = true;\n break;\n\n case 79: // o\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n eventBus.dispatch(\"openfile\", { source: window });\n handled = true;\n }\n break;\n }\n }\n }\n\n // CTRL+ALT or Option+Command\n if (cmd === 3 || cmd === 10) {\n switch (evt.keyCode) {\n case 80: // p\n PDFViewerApplication.requestPresentationMode();\n handled = true;\n break;\n case 71: // g\n // focuses input#pageNumber field\n PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n handled = true;\n break;\n }\n }\n\n if (handled) {\n if (ensureViewerFocused && !isViewerInPresentationMode) {\n pdfViewer.focus();\n }\n evt.preventDefault();\n return;\n }\n\n // Some shortcuts should not get handled if a control/input element\n // is selected.\n const curElement = getActiveOrFocusedElement();\n const curElementTagName = curElement?.tagName.toUpperCase();\n if (\n curElementTagName === \"INPUT\" ||\n curElementTagName === \"TEXTAREA\" ||\n curElementTagName === \"SELECT\" ||\n curElement?.isContentEditable\n ) {\n // Make sure that the secondary toolbar is closed when Escape is pressed.\n if (evt.keyCode !== /* Esc = */ 27) {\n return;\n }\n }\n\n // No control key pressed at all.\n if (cmd === 0) {\n let turnPage = 0,\n turnOnlyIfPageFit = false;\n switch (evt.keyCode) {\n case 38: // up arrow\n case 33: // pg up\n // vertical scrolling using arrow/pg keys\n if (pdfViewer.isVerticalScrollbarEnabled) {\n turnOnlyIfPageFit = true;\n }\n turnPage = -1;\n break;\n case 8: // backspace\n if (!isViewerInPresentationMode) {\n turnOnlyIfPageFit = true;\n }\n turnPage = -1;\n break;\n case 37: // left arrow\n // horizontal scrolling using arrow keys\n if (pdfViewer.isHorizontalScrollbarEnabled) {\n turnOnlyIfPageFit = true;\n }\n /* falls through */\n case 75: // 'k'\n case 80: // 'p'\n turnPage = -1;\n break;\n case 27: // esc key\n if (PDFViewerApplication.secondaryToolbar.isOpen) {\n PDFViewerApplication.secondaryToolbar.close();\n handled = true;\n }\n if (\n !PDFViewerApplication.supportsIntegratedFind &&\n PDFViewerApplication.findBar.opened\n ) {\n PDFViewerApplication.findBar.close();\n handled = true;\n }\n break;\n case 40: // down arrow\n case 34: // pg down\n // vertical scrolling using arrow/pg keys\n if (pdfViewer.isVerticalScrollbarEnabled) {\n turnOnlyIfPageFit = true;\n }\n turnPage = 1;\n break;\n case 13: // enter key\n case 32: // spacebar\n if (!isViewerInPresentationMode) {\n turnOnlyIfPageFit = true;\n }\n turnPage = 1;\n break;\n case 39: // right arrow\n // horizontal scrolling using arrow keys\n if (pdfViewer.isHorizontalScrollbarEnabled) {\n turnOnlyIfPageFit = true;\n }\n /* falls through */\n case 74: // 'j'\n case 78: // 'n'\n turnPage = 1;\n break;\n\n case 36: // home\n if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n PDFViewerApplication.page = 1;\n handled = true;\n ensureViewerFocused = true;\n }\n break;\n case 35: // end\n if (\n isViewerInPresentationMode ||\n PDFViewerApplication.page < PDFViewerApplication.pagesCount\n ) {\n PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n handled = true;\n ensureViewerFocused = true;\n }\n break;\n\n case 83: // 's'\n PDFViewerApplication.pdfCursorTools.switchTool(CursorTool.SELECT);\n break;\n case 72: // 'h'\n PDFViewerApplication.pdfCursorTools.switchTool(CursorTool.HAND);\n break;\n\n case 82: // 'r'\n PDFViewerApplication.rotatePages(90);\n break;\n\n case 115: // F4\n PDFViewerApplication.pdfSidebar.toggle();\n break;\n }\n\n if (\n turnPage !== 0 &&\n (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === \"page-fit\")\n ) {\n if (turnPage > 0) {\n pdfViewer.nextPage();\n } else {\n pdfViewer.previousPage();\n }\n handled = true;\n }\n }\n\n // shift-key\n if (cmd === 4) {\n switch (evt.keyCode) {\n case 13: // enter key\n case 32: // spacebar\n if (\n !isViewerInPresentationMode &&\n pdfViewer.currentScaleValue !== \"page-fit\"\n ) {\n break;\n }\n if (PDFViewerApplication.page > 1) {\n PDFViewerApplication.page--;\n }\n handled = true;\n break;\n\n case 82: // 'r'\n PDFViewerApplication.rotatePages(-90);\n break;\n }\n }\n\n if (!handled && !isViewerInPresentationMode) {\n // 33=Page Up 34=Page Down 35=End 36=Home\n // 37=Left 38=Up 39=Right 40=Down\n // 32=Spacebar\n if (\n (evt.keyCode >= 33 && evt.keyCode <= 40) ||\n (evt.keyCode === 32 && curElementTagName !== \"BUTTON\")\n ) {\n ensureViewerFocused = true;\n }\n }\n\n if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {\n // The page container is not focused, but a page navigation key has been\n // pressed. Change the focus to the viewer container to make sure that\n // navigation by keyboard works as expected.\n pdfViewer.focus();\n }\n\n if (handled) {\n evt.preventDefault();\n }\n}\n\nfunction beforeUnload(evt) {\n evt.preventDefault();\n evt.returnValue = \"\";\n return false;\n}\n\n/* Abstract factory for the print service. */\nconst PDFPrintServiceFactory = {\n instance: {\n supportsPrinting: false,\n createPrintService() {\n throw new Error(\"Not implemented: createPrintService\");\n },\n },\n};\n\nexport {\n DefaultExternalServices,\n PDFPrintServiceFactory,\n PDFViewerApplication,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CSS_UNITS = 96.0 / 72.0;\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_SCALE = 1.0;\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst LOADINGBAR_END_OFFSET_VAR = \"--loadingBar-end-offset\";\n\nconst PresentationModeState = {\n UNKNOWN: 0,\n NORMAL: 1,\n CHANGING: 2,\n FULLSCREEN: 3,\n};\n\nconst SidebarView = {\n UNKNOWN: -1,\n NONE: 0,\n THUMBS: 1, // Default value.\n OUTLINE: 2,\n ATTACHMENTS: 3,\n LAYERS: 4,\n};\n\nconst RendererType = {\n CANVAS: \"canvas\",\n SVG: \"svg\",\n};\n\nconst TextLayerMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_ENHANCE: 2,\n};\n\nconst ScrollMode = {\n UNKNOWN: -1,\n VERTICAL: 0, // Default value.\n HORIZONTAL: 1,\n WRAPPED: 2,\n};\n\nconst SpreadMode = {\n UNKNOWN: -1,\n NONE: 0, // Default value.\n ODD: 1,\n EVEN: 2,\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n/**\n * Returns scale factor for the canvas. It makes sense for the HiDPI displays.\n * @returns {Object} The object with horizontal (sx) and vertical (sy)\n * scales. The scaled property is set to false if scaling is\n * not required, true otherwise.\n */\nfunction getOutputScale(ctx) {\n const devicePixelRatio = window.devicePixelRatio || 1;\n const backingStoreRatio =\n ctx.webkitBackingStorePixelRatio ||\n ctx.mozBackingStorePixelRatio ||\n ctx.backingStorePixelRatio ||\n 1;\n const pixelRatio = devicePixelRatio / backingStoreRatio;\n return {\n sx: pixelRatio,\n sy: pixelRatio,\n scaled: pixelRatio !== 1,\n };\n}\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {Object} element - The element to be visible.\n * @param {Object} spot - An object with optional top and left properties,\n * specifying the offset from the top left edge.\n * @param {boolean} [scrollMatches] - When scrolling search results into view,\n * ignore elements that either: Contains marked content identifiers,\n * or have the CSS-rule `overflow: hidden;` set. The default value is `false`.\n */\nfunction scrollIntoView(element, spot, scrollMatches = false) {\n // Assuming offsetParent is available (it's not available when viewer is in\n // hidden iframe or object). We have to scroll: if the offsetParent is not set\n // producing the error. See also animationStarted.\n let parent = element.offsetParent;\n if (!parent) {\n console.error(\"offsetParent is not set -- cannot scroll\");\n return;\n }\n let offsetY = element.offsetTop + element.clientTop;\n let offsetX = element.offsetLeft + element.clientLeft;\n while (\n (parent.clientHeight === parent.scrollHeight &&\n parent.clientWidth === parent.scrollWidth) ||\n (scrollMatches &&\n (parent.classList.contains(\"markedContent\") ||\n getComputedStyle(parent).overflow === \"hidden\"))\n ) {\n offsetY += parent.offsetTop;\n offsetX += parent.offsetLeft;\n\n parent = parent.offsetParent;\n if (!parent) {\n return; // no need to scroll\n }\n }\n if (spot) {\n if (spot.top !== undefined) {\n offsetY += spot.top;\n }\n if (spot.left !== undefined) {\n offsetX += spot.left;\n parent.scrollLeft = offsetX;\n }\n }\n parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback) {\n const debounceScroll = function (evt) {\n if (rAF) {\n return;\n }\n // schedule an invocation of scroll for next animation frame.\n rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n rAF = null;\n\n const currentX = viewAreaElement.scrollLeft;\n const lastX = state.lastX;\n if (currentX !== lastX) {\n state.right = currentX > lastX;\n }\n state.lastX = currentX;\n const currentY = viewAreaElement.scrollTop;\n const lastY = state.lastY;\n if (currentY !== lastY) {\n state.down = currentY > lastY;\n }\n state.lastY = currentY;\n callback(state);\n });\n };\n\n const state = {\n right: true,\n down: true,\n lastX: viewAreaElement.scrollLeft,\n lastY: viewAreaElement.scrollTop,\n _eventHandler: debounceScroll,\n };\n\n let rAF = null;\n viewAreaElement.addEventListener(\"scroll\", debounceScroll, true);\n return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value&parm2=...).\n */\nfunction parseQueryString(query) {\n const parts = query.split(\"&\");\n const params = Object.create(null);\n for (let i = 0, ii = parts.length; i < ii; ++i) {\n const param = parts[i].split(\"=\");\n const key = param[0].toLowerCase();\n const value = param.length > 1 ? param[1] : null;\n params[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n return params;\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n * or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition) {\n let minIndex = 0;\n let maxIndex = items.length - 1;\n\n if (maxIndex < 0 || !condition(items[maxIndex])) {\n return items.length;\n }\n if (condition(items[minIndex])) {\n return minIndex;\n }\n\n while (minIndex < maxIndex) {\n const currentIndex = (minIndex + maxIndex) >> 1;\n const currentItem = items[currentIndex];\n if (condition(currentItem)) {\n maxIndex = currentIndex;\n } else {\n minIndex = currentIndex + 1;\n }\n }\n return minIndex; /* === maxIndex */\n}\n\n/**\n * Approximates float number as a fraction using Farey sequence (max order\n * of 8).\n * @param {number} x - Positive float number.\n * @returns {Array} Estimated fraction: the first array item is a numerator,\n * the second one is a denominator.\n */\nfunction approximateFraction(x) {\n // Fast paths for int numbers or their inversions.\n if (Math.floor(x) === x) {\n return [x, 1];\n }\n const xinv = 1 / x;\n const limit = 8;\n if (xinv > limit) {\n return [1, limit];\n } else if (Math.floor(xinv) === xinv) {\n return [1, xinv];\n }\n\n const x_ = x > 1 ? xinv : x;\n // a/b and c/d are neighbours in Farey sequence.\n let a = 0,\n b = 1,\n c = 1,\n d = 1;\n // Limiting search to order 8.\n while (true) {\n // Generating next term in sequence (order of q).\n const p = a + c,\n q = b + d;\n if (q > limit) {\n break;\n }\n if (x_ <= p / q) {\n c = p;\n d = q;\n } else {\n a = p;\n b = q;\n }\n }\n let result;\n // Select closest of the neighbours to x.\n if (x_ - a / b < c / d - x_) {\n result = x_ === x ? [a, b] : [b, a];\n } else {\n result = x_ === x ? [c, d] : [d, c];\n }\n return result;\n}\n\nfunction roundToDivide(x, div) {\n const r = x % div;\n return r === 0 ? x : Math.round(x - r + div);\n}\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {Object} An Object containing the properties: {Array} `view`,\n * {number} `userUnit`, and {number} `rotate`.\n * @returns {Object} An Object containing the properties: {number} `width`\n * and {number} `height`, given in inches.\n */\nfunction getPageSizeInches({ view, userUnit, rotate }) {\n const [x1, y1, x2, y2] = view;\n // We need to take the page rotation into account as well.\n const changeOrientation = rotate % 180 !== 0;\n\n const width = ((x2 - x1) / 72) * userUnit;\n const height = ((y2 - y1) / 72) * userUnit;\n\n return {\n width: changeOrientation ? height : width,\n height: changeOrientation ? width : height,\n };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n * before the first visible element in `views`, but not by too much. (Usually,\n * this will be the first element in the first partially visible row in\n * `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n // binarySearchFirstItem's assumption is that the input is ordered, with only\n // one index where the conditions flips from false to true: [false ...,\n // true...]. With vertical scrolling and spreads, it is possible to have\n // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n // similar sequence, with many more mixed true and false in the middle.\n //\n // So there is no guarantee that the binary search yields the index of the\n // first visible element. It could have been any of the other visible elements\n // that were preceded by a hidden element.\n\n // Of course, if either this element or the previous (hidden) element is also\n // the first element, there's nothing to worry about.\n if (index < 2) {\n return index;\n }\n\n // That aside, the possible cases are represented below.\n //\n // **** = fully hidden\n // A*B* = mix of partially visible and/or hidden pages\n // CDEF = fully visible\n //\n // (1) Binary search could have returned A, in which case we can stop.\n // (2) Binary search could also have returned B, in which case we need to\n // check the whole row.\n // (3) Binary search could also have returned C, in which case we need to\n // check the whole previous row.\n //\n // There's one other possibility:\n //\n // **** = fully hidden\n // ABCD = mix of fully and/or partially visible pages\n //\n // (4) Binary search could only have returned A.\n\n // Initially assume that we need to find the beginning of the current row\n // (case 1, 2, or 4), which means finding a page that is above the current\n // page's top. If the found page is partially visible, we're definitely not in\n // case 3, and this assumption is correct.\n let elt = views[index].div;\n let pageTop = elt.offsetTop + elt.clientTop;\n\n if (pageTop >= top) {\n // The found page is fully visible, so we're actually either in case 3 or 4,\n // and unfortunately we can't tell the difference between them without\n // scanning the entire previous row, so we just conservatively assume that\n // we do need to backtrack to that row. In both cases, the previous page is\n // in the previous row, so use its top instead.\n elt = views[index - 1].div;\n pageTop = elt.offsetTop + elt.clientTop;\n }\n\n // Now we backtrack to the first page that still has its bottom below\n // `pageTop`, which is the top of a page in the first visible row (unless\n // we're in case 4, in which case it's the row before that).\n // `index` is found by binary search, so the page at `index - 1` is\n // invisible and we can start looking for potentially visible pages from\n // `index - 2`. (However, if this loop terminates on its first iteration,\n // which is the case when pages are stacked vertically, `index` should remain\n // unchanged, so we use a distinct loop variable.)\n for (let i = index - 2; i >= 0; --i) {\n elt = views[i].div;\n if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n // We have reached the previous row, so stop now.\n // This loop is expected to terminate relatively quickly because the\n // number of pages per row is expected to be small.\n break;\n }\n index = i;\n }\n return index;\n}\n\n/**\n * @typedef {Object} GetVisibleElementsParameters\n * @property {HTMLElement} scrollEl - A container that can possibly scroll.\n * @property {Array} views - Objects with a `div` property that contains an\n * HTMLElement, which should all be descendants of `scrollEl` satisfying the\n * relevant layout assumptions.\n * @property {boolean} sortByVisibility - If `true`, the returned elements are\n * sorted in descending order of the percent of their padding box that is\n * visible. The default value is `false`.\n * @property {boolean} horizontal - If `true`, the elements are assumed to be\n * laid out horizontally instead of vertically. The default value is `false`.\n * @property {boolean} rtl - If `true`, the `scrollEl` container is assumed to\n * be in right-to-left mode. The default value is `false`.\n */\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n * - If `horizontal`, no left of any earlier element is to the right of the\n * left of any later element.\n * - Otherwise, `views` can be split into contiguous rows where, within a row,\n * no top of any element is below the bottom of any other element, and\n * between rows, no bottom of any element in an earlier row is below the\n * top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param {GetVisibleElementsParameters}\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements({\n scrollEl,\n views,\n sortByVisibility = false,\n horizontal = false,\n rtl = false,\n}) {\n const top = scrollEl.scrollTop,\n bottom = top + scrollEl.clientHeight;\n const left = scrollEl.scrollLeft,\n right = left + scrollEl.clientWidth;\n\n // Throughout this \"generic\" function, comments will assume we're working with\n // PDF document pages, which is the most important and complex case. In this\n // case, the visible elements we're actually interested is the page canvas,\n // which is contained in a wrapper which adds no padding/border/margin, which\n // is itself contained in `view.div` which adds no padding (but does add a\n // border). So, as specified in this function's doc comment, this function\n // does all of its work on the padding edge of the provided views, starting at\n // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n // the border). Adding clientWidth/Height gets us the bottom-right corner of\n // the padding edge.\n function isElementBottomAfterViewTop(view) {\n const element = view.div;\n const elementBottom =\n element.offsetTop + element.clientTop + element.clientHeight;\n return elementBottom > top;\n }\n function isElementNextAfterViewHorizontally(view) {\n const element = view.div;\n const elementLeft = element.offsetLeft + element.clientLeft;\n const elementRight = elementLeft + element.clientWidth;\n return rtl ? elementLeft < right : elementRight > left;\n }\n\n const visible = [],\n numViews = views.length;\n let firstVisibleElementInd = binarySearchFirstItem(\n views,\n horizontal\n ? isElementNextAfterViewHorizontally\n : isElementBottomAfterViewTop\n );\n\n // Please note the return value of the `binarySearchFirstItem` function when\n // no valid element is found (hence the `firstVisibleElementInd` check below).\n if (\n firstVisibleElementInd > 0 &&\n firstVisibleElementInd < numViews &&\n !horizontal\n ) {\n // In wrapped scrolling (or vertical scrolling with spreads), with some page\n // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n // condition: there can be pages with bottoms above the view top between\n // pages with bottoms below. This function detects and corrects that error;\n // see it for more comments.\n firstVisibleElementInd = backtrackBeforeAllVisibleElements(\n firstVisibleElementInd,\n views,\n top\n );\n }\n\n // lastEdge acts as a cutoff for us to stop looping, because we know all\n // subsequent pages will be hidden.\n //\n // When using wrapped scrolling or vertical scrolling with spreads, we can't\n // simply stop the first time we reach a page below the bottom of the view;\n // the tops of subsequent pages on the same row could still be visible. In\n // horizontal scrolling, we don't have that issue, so we can stop as soon as\n // we pass `right`, without needing the code below that handles the -1 case.\n let lastEdge = horizontal ? right : -1;\n\n for (let i = firstVisibleElementInd; i < numViews; i++) {\n const view = views[i],\n element = view.div;\n const currentWidth = element.offsetLeft + element.clientLeft;\n const currentHeight = element.offsetTop + element.clientTop;\n const viewWidth = element.clientWidth,\n viewHeight = element.clientHeight;\n const viewRight = currentWidth + viewWidth;\n const viewBottom = currentHeight + viewHeight;\n\n if (lastEdge === -1) {\n // As commented above, this is only needed in non-horizontal cases.\n // Setting lastEdge to the bottom of the first page that is partially\n // visible ensures that the next page fully below lastEdge is on the\n // next row, which has to be fully hidden along with all subsequent rows.\n if (viewBottom >= bottom) {\n lastEdge = viewBottom;\n }\n } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n break;\n }\n\n if (\n viewBottom <= top ||\n currentHeight >= bottom ||\n viewRight <= left ||\n currentWidth >= right\n ) {\n continue;\n }\n\n const hiddenHeight =\n Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);\n const hiddenWidth =\n Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);\n\n const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,\n fractionWidth = (viewWidth - hiddenWidth) / viewWidth;\n const percent = (fractionHeight * fractionWidth * 100) | 0;\n\n visible.push({\n id: view.id,\n x: currentWidth,\n y: currentHeight,\n view,\n percent,\n widthPercent: (fractionWidth * 100) | 0,\n });\n }\n\n const first = visible[0],\n last = visible[visible.length - 1];\n\n if (sortByVisibility) {\n visible.sort(function (a, b) {\n const pc = a.percent - b.percent;\n if (Math.abs(pc) > 0.001) {\n return -pc;\n }\n return a.id - b.id; // ensure stability\n });\n }\n return { first, last, views: visible };\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenuHandler(evt) {\n evt.preventDefault();\n}\n\nfunction normalizeWheelEventDirection(evt) {\n let delta = Math.hypot(evt.deltaX, evt.deltaY);\n const angle = Math.atan2(evt.deltaY, evt.deltaX);\n if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n // All that is left-up oriented has to change the sign.\n delta = -delta;\n }\n return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n let delta = normalizeWheelEventDirection(evt);\n\n const MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n const MOUSE_DOM_DELTA_LINE_MODE = 1;\n const MOUSE_PIXELS_PER_LINE = 30;\n const MOUSE_LINES_PER_PAGE = 30;\n\n // Converts delta to per-page units\n if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n delta /= MOUSE_LINES_PER_PAGE;\n }\n return delta;\n}\n\nfunction isValidRotation(angle) {\n return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(ScrollMode).includes(mode) &&\n mode !== ScrollMode.UNKNOWN\n );\n}\n\nfunction isValidSpreadMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(SpreadMode).includes(mode) &&\n mode !== SpreadMode.UNKNOWN\n );\n}\n\nfunction isPortraitOrientation(size) {\n return size.width <= size.height;\n}\n\nconst WaitOnType = {\n EVENT: \"event\",\n TIMEOUT: \"timeout\",\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n * `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n * timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nfunction waitOnEventOrTimeout({ target, name, delay = 0 }) {\n return new Promise(function (resolve, reject) {\n if (\n typeof target !== \"object\" ||\n !(name && typeof name === \"string\") ||\n !(Number.isInteger(delay) && delay >= 0)\n ) {\n throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n }\n\n function handler(type) {\n if (target instanceof EventBus) {\n target._off(name, eventHandler);\n } else {\n target.removeEventListener(name, eventHandler);\n }\n\n if (timeout) {\n clearTimeout(timeout);\n }\n resolve(type);\n }\n\n const eventHandler = handler.bind(null, WaitOnType.EVENT);\n if (target instanceof EventBus) {\n target._on(name, eventHandler);\n } else {\n target.addEventListener(name, eventHandler);\n }\n\n const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);\n const timeout = setTimeout(timeoutHandler, delay);\n });\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nconst animationStarted = new Promise(function (resolve) {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof window === \"undefined\"\n ) {\n // Prevent \"ReferenceError: window is not defined\" errors when running the\n // unit-tests in Node.js environments.\n setTimeout(resolve, 20);\n return;\n }\n window.requestAnimationFrame(resolve);\n});\n\n/**\n * NOTE: Only used to support various PDF viewer tests in `mozilla-central`.\n */\nfunction dispatchDOMEvent(eventName, args = null) {\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: dispatchDOMEvent\");\n }\n const details = Object.create(null);\n if (args?.length > 0) {\n const obj = args[0];\n for (const key in obj) {\n const value = obj[key];\n if (key === \"source\") {\n if (value === window || value === document) {\n return; // No need to re-dispatch (already) global events.\n }\n continue; // Ignore the `source` property.\n }\n details[key] = value;\n }\n }\n const event = document.createEvent(\"CustomEvent\");\n event.initCustomEvent(eventName, true, true, details);\n document.dispatchEvent(event);\n}\n\n/**\n * Simple event bus for an application. Listeners are attached using the `on`\n * and `off` methods. To raise an event, the `dispatch` method shall be used.\n */\nclass EventBus {\n constructor(options) {\n this._listeners = Object.create(null);\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")) {\n this._isInAutomation = options?.isInAutomation === true;\n }\n }\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n on(eventName, listener, options = null) {\n this._on(eventName, listener, {\n external: true,\n once: options?.once,\n });\n }\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n off(eventName, listener, options = null) {\n this._off(eventName, listener, {\n external: true,\n once: options?.once,\n });\n }\n\n dispatch(eventName) {\n const eventListeners = this._listeners[eventName];\n if (!eventListeners || eventListeners.length === 0) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")) &&\n this._isInAutomation\n ) {\n const args = Array.prototype.slice.call(arguments, 1);\n dispatchDOMEvent(eventName, args);\n }\n return;\n }\n // Passing all arguments after the eventName to the listeners.\n const args = Array.prototype.slice.call(arguments, 1);\n let externalListeners;\n // Making copy of the listeners array in case if it will be modified\n // during dispatch.\n for (const { listener, external, once } of eventListeners.slice(0)) {\n if (once) {\n this._off(eventName, listener);\n }\n if (external) {\n (externalListeners ||= []).push(listener);\n continue;\n }\n listener.apply(null, args);\n }\n // Dispatch any \"external\" listeners *after* the internal ones, to give the\n // viewer components time to handle events and update their state first.\n if (externalListeners) {\n for (const listener of externalListeners) {\n listener.apply(null, args);\n }\n externalListeners = null;\n }\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")) &&\n this._isInAutomation\n ) {\n dispatchDOMEvent(eventName, args);\n }\n }\n\n /**\n * @ignore\n */\n _on(eventName, listener, options = null) {\n const eventListeners = (this._listeners[eventName] ||= []);\n eventListeners.push({\n listener,\n external: options?.external === true,\n once: options?.once === true,\n });\n }\n\n /**\n * @ignore\n */\n _off(eventName, listener, options = null) {\n const eventListeners = this._listeners[eventName];\n if (!eventListeners) {\n return;\n }\n for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n if (eventListeners[i].listener === listener) {\n eventListeners.splice(i, 1);\n return;\n }\n }\n }\n}\n\nfunction clamp(v, min, max) {\n return Math.min(Math.max(v, min), max);\n}\n\nclass ProgressBar {\n constructor(id, { height, width, units } = {}) {\n this.visible = true;\n\n // Fetch the sub-elements for later.\n this.div = document.querySelector(id + \" .progress\");\n // Get the loading bar element, so it can be resized to fit the viewer.\n this.bar = this.div.parentNode;\n\n // Get options, with sensible defaults.\n this.height = height || 100;\n this.width = width || 100;\n this.units = units || \"%\";\n\n // Initialize heights.\n this.div.style.height = this.height + this.units;\n this.percent = 0;\n }\n\n _updateBar() {\n if (this._indeterminate) {\n this.div.classList.add(\"indeterminate\");\n this.div.style.width = this.width + this.units;\n return;\n }\n\n this.div.classList.remove(\"indeterminate\");\n const progressSize = (this.width * this._percent) / 100;\n this.div.style.width = progressSize + this.units;\n }\n\n get percent() {\n return this._percent;\n }\n\n set percent(val) {\n this._indeterminate = isNaN(val);\n this._percent = clamp(val, 0, 100);\n this._updateBar();\n }\n\n setWidth(viewer) {\n if (!viewer) {\n return;\n }\n const container = viewer.parentNode;\n const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n if (scrollbarWidth > 0) {\n const doc = document.documentElement;\n doc.style.setProperty(LOADINGBAR_END_OFFSET_VAR, `${scrollbarWidth}px`);\n }\n }\n\n hide() {\n if (!this.visible) {\n return;\n }\n this.visible = false;\n this.bar.classList.add(\"hidden\");\n }\n\n show() {\n if (this.visible) {\n return;\n }\n this.visible = true;\n this.bar.classList.remove(\"hidden\");\n }\n}\n\n/**\n * Moves all elements of an array that satisfy condition to the end of the\n * array, preserving the order of the rest.\n */\nfunction moveToEndOfArray(arr, condition) {\n const moved = [],\n len = arr.length;\n let write = 0;\n for (let read = 0; read < len; ++read) {\n if (condition(arr[read])) {\n moved.push(arr[read]);\n } else {\n arr[write] = arr[read];\n ++write;\n }\n }\n for (let read = 0; write < len; ++read, ++write) {\n arr[write] = moved[read];\n }\n}\n\n/**\n * Get the active or focused element in current DOM.\n *\n * Recursively search for the truly active or focused element in case there are\n * shadow DOMs.\n *\n * @returns {Element} the truly active or focused element.\n */\nfunction getActiveOrFocusedElement() {\n let curRoot = document;\n let curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n\n while (curActiveOrFocused?.shadowRoot) {\n curRoot = curActiveOrFocused.shadowRoot;\n curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n }\n\n return curActiveOrFocused;\n}\n\n/**\n * Converts API PageLayout values to the format used by `BaseViewer`.\n * NOTE: This is supported to the extent that the viewer implements the\n * necessary Scroll/Spread modes (since SinglePage, TwoPageLeft,\n * and TwoPageRight all suggests using non-continuous scrolling).\n * @param {string} mode - The API PageLayout value.\n * @returns {number} A value from {SpreadMode}.\n */\nfunction apiPageLayoutToSpreadMode(layout) {\n switch (layout) {\n case \"SinglePage\":\n case \"OneColumn\":\n return SpreadMode.NONE;\n case \"TwoColumnLeft\":\n case \"TwoPageLeft\":\n return SpreadMode.ODD;\n case \"TwoColumnRight\":\n case \"TwoPageRight\":\n return SpreadMode.EVEN;\n }\n return SpreadMode.NONE; // Default value.\n}\n\n/**\n * Converts API PageMode values to the format used by `PDFSidebar`.\n * NOTE: There's also a \"FullScreen\" parameter which is not possible to support,\n * since the Fullscreen API used in browsers requires that entering\n * fullscreen mode only occurs as a result of a user-initiated event.\n * @param {string} mode - The API PageMode value.\n * @returns {number} A value from {SidebarView}.\n */\nfunction apiPageModeToSidebarView(mode) {\n switch (mode) {\n case \"UseNone\":\n return SidebarView.NONE;\n case \"UseThumbs\":\n return SidebarView.THUMBS;\n case \"UseOutlines\":\n return SidebarView.OUTLINE;\n case \"UseAttachments\":\n return SidebarView.ATTACHMENTS;\n case \"UseOC\":\n return SidebarView.LAYERS;\n }\n return SidebarView.NONE; // Default value.\n}\n\nexport {\n animationStarted,\n apiPageLayoutToSpreadMode,\n apiPageModeToSidebarView,\n approximateFraction,\n AutoPrintRegExp,\n backtrackBeforeAllVisibleElements, // only exported for testing\n binarySearchFirstItem,\n CSS_UNITS,\n DEFAULT_SCALE,\n DEFAULT_SCALE_VALUE,\n EventBus,\n getActiveOrFocusedElement,\n getOutputScale,\n getPageSizeInches,\n getVisibleElements,\n isPortraitOrientation,\n isValidRotation,\n isValidScrollMode,\n isValidSpreadMode,\n MAX_AUTO_SCALE,\n MAX_SCALE,\n MIN_SCALE,\n moveToEndOfArray,\n noContextMenuHandler,\n normalizeWheelEventDelta,\n normalizeWheelEventDirection,\n parseQueryString,\n PresentationModeState,\n ProgressBar,\n RendererType,\n roundToDivide,\n SCROLLBAR_PADDING,\n scrollIntoView,\n ScrollMode,\n SidebarView,\n SpreadMode,\n TextLayerMode,\n UNKNOWN_SCALE,\n VERTICAL_PADDING,\n waitOnEventOrTimeout,\n WaitOnType,\n watchScroll,\n};\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals module, __non_webpack_require__ */\n\n\"use strict\";\n\nlet pdfjsLib;\nif (typeof window !== \"undefined\" && window[\"pdfjs-dist/build/pdf\"]) {\n pdfjsLib = window[\"pdfjs-dist/build/pdf\"];\n} else {\n pdfjsLib = __non_webpack_require__(\"../build/pdf.js\");\n}\nmodule.exports = pdfjsLib;\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GrabToPan } from \"./grab_to_pan.js\";\nimport { PresentationModeState } from \"./ui_utils.js\";\n\nconst CursorTool = {\n SELECT: 0, // The default value.\n HAND: 1,\n ZOOM: 2,\n};\n\n/**\n * @typedef {Object} PDFCursorToolsOptions\n * @property {HTMLDivElement} container - The document container.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [cursorToolOnLoad] - The cursor tool that will be enabled\n * on load; the constants from {CursorTool} should be used. The default value\n * is `CursorTool.SELECT`.\n */\n\nclass PDFCursorTools {\n /**\n * @param {PDFCursorToolsOptions} options\n */\n constructor({ container, eventBus, cursorToolOnLoad = CursorTool.SELECT }) {\n this.container = container;\n this.eventBus = eventBus;\n\n this.active = CursorTool.SELECT;\n this.activeBeforePresentationMode = null;\n\n this.handTool = new GrabToPan({\n element: this.container,\n });\n\n this._addEventListeners();\n\n // Defer the initial `switchTool` call, to give other viewer components\n // time to initialize *and* register 'cursortoolchanged' event listeners.\n Promise.resolve().then(() => {\n this.switchTool(cursorToolOnLoad);\n });\n }\n\n /**\n * @type {number} One of the values in {CursorTool}.\n */\n get activeTool() {\n return this.active;\n }\n\n /**\n * NOTE: This method is ignored while Presentation Mode is active.\n * @param {number} tool - The cursor mode that should be switched to,\n * must be one of the values in {CursorTool}.\n */\n switchTool(tool) {\n if (this.activeBeforePresentationMode !== null) {\n return; // Cursor tools cannot be used in Presentation Mode.\n }\n if (tool === this.active) {\n return; // The requested tool is already active.\n }\n\n const disableActiveTool = () => {\n switch (this.active) {\n case CursorTool.SELECT:\n break;\n case CursorTool.HAND:\n this.handTool.deactivate();\n break;\n case CursorTool.ZOOM:\n /* falls through */\n }\n };\n\n // Enable the new cursor tool.\n switch (tool) {\n case CursorTool.SELECT:\n disableActiveTool();\n break;\n case CursorTool.HAND:\n disableActiveTool();\n this.handTool.activate();\n break;\n case CursorTool.ZOOM:\n /* falls through */\n default:\n console.error(`switchTool: \"${tool}\" is an unsupported value.`);\n return;\n }\n // Update the active tool *after* it has been validated above,\n // in order to prevent setting it to an invalid state.\n this.active = tool;\n\n this._dispatchEvent();\n }\n\n /**\n * @private\n */\n _dispatchEvent() {\n this.eventBus.dispatch(\"cursortoolchanged\", {\n source: this,\n tool: this.active,\n });\n }\n\n /**\n * @private\n */\n _addEventListeners() {\n this.eventBus._on(\"switchcursortool\", evt => {\n this.switchTool(evt.tool);\n });\n\n this.eventBus._on(\"presentationmodechanged\", evt => {\n switch (evt.state) {\n case PresentationModeState.FULLSCREEN: {\n const previouslyActive = this.active;\n\n this.switchTool(CursorTool.SELECT);\n this.activeBeforePresentationMode = previouslyActive;\n break;\n }\n case PresentationModeState.NORMAL: {\n const previouslyActive = this.activeBeforePresentationMode;\n\n this.activeBeforePresentationMode = null;\n this.switchTool(previouslyActive);\n break;\n }\n }\n });\n }\n}\n\nexport { CursorTool, PDFCursorTools };\n","/* Copyright 2013 Rob Wu <rob@robwu.nl>\n * https://github.com/Rob--W/grab-to-pan.js\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Construct a GrabToPan instance for a given HTML element.\n * @param options.element {Element}\n * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)`\n * @param options.onActiveChanged {function(boolean)} optional. Called\n * when grab-to-pan is (de)activated. The first argument is a boolean that\n * shows whether grab-to-pan is activated.\n */\nfunction GrabToPan(options) {\n this.element = options.element;\n this.document = options.element.ownerDocument;\n if (typeof options.ignoreTarget === \"function\") {\n this.ignoreTarget = options.ignoreTarget;\n }\n this.onActiveChanged = options.onActiveChanged;\n\n // Bind the contexts to ensure that `this` always points to\n // the GrabToPan instance.\n this.activate = this.activate.bind(this);\n this.deactivate = this.deactivate.bind(this);\n this.toggle = this.toggle.bind(this);\n this._onmousedown = this._onmousedown.bind(this);\n this._onmousemove = this._onmousemove.bind(this);\n this._endPan = this._endPan.bind(this);\n\n // This overlay will be inserted in the document when the mouse moves during\n // a grab operation, to ensure that the cursor has the desired appearance.\n const overlay = (this.overlay = document.createElement(\"div\"));\n overlay.className = \"grab-to-pan-grabbing\";\n}\nGrabToPan.prototype = {\n /**\n * Class name of element which can be grabbed\n */\n CSS_CLASS_GRAB: \"grab-to-pan-grab\",\n\n /**\n * Bind a mousedown event to the element to enable grab-detection.\n */\n activate: function GrabToPan_activate() {\n if (!this.active) {\n this.active = true;\n this.element.addEventListener(\"mousedown\", this._onmousedown, true);\n this.element.classList.add(this.CSS_CLASS_GRAB);\n if (this.onActiveChanged) {\n this.onActiveChanged(true);\n }\n }\n },\n\n /**\n * Removes all events. Any pending pan session is immediately stopped.\n */\n deactivate: function GrabToPan_deactivate() {\n if (this.active) {\n this.active = false;\n this.element.removeEventListener(\"mousedown\", this._onmousedown, true);\n this._endPan();\n this.element.classList.remove(this.CSS_CLASS_GRAB);\n if (this.onActiveChanged) {\n this.onActiveChanged(false);\n }\n }\n },\n\n toggle: function GrabToPan_toggle() {\n if (this.active) {\n this.deactivate();\n } else {\n this.activate();\n }\n },\n\n /**\n * Whether to not pan if the target element is clicked.\n * Override this method to change the default behaviour.\n *\n * @param node {Element} The target of the event\n * @returns {boolean} Whether to not react to the click event.\n */\n ignoreTarget: function GrabToPan_ignoreTarget(node) {\n // Check whether the clicked element is, a child of, an input element/link.\n return node.matches(\n \"a[href], a[href] *, input, textarea, button, button *, select, option\"\n );\n },\n\n /**\n * @private\n */\n _onmousedown: function GrabToPan__onmousedown(event) {\n if (event.button !== 0 || this.ignoreTarget(event.target)) {\n return;\n }\n if (event.originalTarget) {\n try {\n // eslint-disable-next-line no-unused-expressions\n event.originalTarget.tagName;\n } catch (e) {\n // Mozilla-specific: element is a scrollbar (XUL element)\n return;\n }\n }\n\n this.scrollLeftStart = this.element.scrollLeft;\n this.scrollTopStart = this.element.scrollTop;\n this.clientXStart = event.clientX;\n this.clientYStart = event.clientY;\n this.document.addEventListener(\"mousemove\", this._onmousemove, true);\n this.document.addEventListener(\"mouseup\", this._endPan, true);\n // When a scroll event occurs before a mousemove, assume that the user\n // dragged a scrollbar (necessary for Opera Presto, Safari and IE)\n // (not needed for Chrome/Firefox)\n this.element.addEventListener(\"scroll\", this._endPan, true);\n event.preventDefault();\n event.stopPropagation();\n\n const focusedElement = document.activeElement;\n if (focusedElement && !focusedElement.contains(event.target)) {\n focusedElement.blur();\n }\n },\n\n /**\n * @private\n */\n _onmousemove: function GrabToPan__onmousemove(event) {\n this.element.removeEventListener(\"scroll\", this._endPan, true);\n if (isLeftMouseReleased(event)) {\n this._endPan();\n return;\n }\n const xDiff = event.clientX - this.clientXStart;\n const yDiff = event.clientY - this.clientYStart;\n const scrollTop = this.scrollTopStart - yDiff;\n const scrollLeft = this.scrollLeftStart - xDiff;\n if (this.element.scrollTo) {\n this.element.scrollTo({\n top: scrollTop,\n left: scrollLeft,\n behavior: \"instant\",\n });\n } else {\n this.element.scrollTop = scrollTop;\n this.element.scrollLeft = scrollLeft;\n }\n if (!this.overlay.parentNode) {\n document.body.appendChild(this.overlay);\n }\n },\n\n /**\n * @private\n */\n _endPan: function GrabToPan__endPan() {\n this.element.removeEventListener(\"scroll\", this._endPan, true);\n this.document.removeEventListener(\"mousemove\", this._onmousemove, true);\n this.document.removeEventListener(\"mouseup\", this._endPan, true);\n // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n this.overlay.remove();\n },\n};\n\n/**\n * Whether the left mouse is not pressed.\n * @param event {MouseEvent}\n * @returns {boolean} True if the left mouse button is not pressed,\n * False if unsure or if the left mouse button is pressed.\n */\nfunction isLeftMouseReleased(event) {\n if (\"buttons\" in event) {\n // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons\n // Firefox 15+\n // Chrome 43+\n // Safari 11.1+\n return !(event.buttons & 1);\n }\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n // Browser sniffing because it's impossible to feature-detect\n // whether event.which for onmousemove is reliable.\n const chrome = window.chrome;\n const isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\n // ^ Chrome 15+ ^ Opera 15+\n const isSafari6plus =\n /Apple/.test(navigator.vendor) &&\n /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\n\n if (isChrome15OrOpera15plus || isSafari6plus) {\n // Chrome 14+\n // Opera 15+\n // Safari 6.0+\n return event.which === 0;\n }\n }\n return false;\n}\n\nexport { GrabToPan };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RenderingCancelledException } from \"pdfjs-lib\";\n\nconst CLEANUP_TIMEOUT = 30000;\n\nconst RenderingStates = {\n INITIAL: 0,\n RUNNING: 1,\n PAUSED: 2,\n FINISHED: 3,\n};\n\n/**\n * Controls rendering of the views for pages and thumbnails.\n */\nclass PDFRenderingQueue {\n constructor() {\n this.pdfViewer = null;\n this.pdfThumbnailViewer = null;\n this.onIdle = null;\n this.highestPriorityPage = null;\n this.idleTimeout = null;\n this.printing = false;\n this.isThumbnailViewEnabled = false;\n }\n\n /**\n * @param {PDFViewer} pdfViewer\n */\n setViewer(pdfViewer) {\n this.pdfViewer = pdfViewer;\n }\n\n /**\n * @param {PDFThumbnailViewer} pdfThumbnailViewer\n */\n setThumbnailViewer(pdfThumbnailViewer) {\n this.pdfThumbnailViewer = pdfThumbnailViewer;\n }\n\n /**\n * @param {IRenderableView} view\n * @returns {boolean}\n */\n isHighestPriority(view) {\n return this.highestPriorityPage === view.renderingId;\n }\n\n /**\n * @param {Object} currentlyVisiblePages\n */\n renderHighestPriority(currentlyVisiblePages) {\n if (this.idleTimeout) {\n clearTimeout(this.idleTimeout);\n this.idleTimeout = null;\n }\n\n // Pages have a higher priority than thumbnails, so check them first.\n if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n return;\n }\n // No pages needed rendering, so check thumbnails.\n if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n if (this.pdfThumbnailViewer.forceRendering()) {\n return;\n }\n }\n\n if (this.printing) {\n // If printing is currently ongoing do not reschedule cleanup.\n return;\n }\n\n if (this.onIdle) {\n this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n }\n }\n\n /**\n * @param {Object} visible\n * @param {Array} views\n * @param {boolean} scrolledDown\n */\n getHighestPriority(visible, views, scrolledDown) {\n /**\n * The state has changed. Figure out which page has the highest priority to\n * render next (if any).\n *\n * Priority:\n * 1. visible pages\n * 2. if last scrolled down, the page after the visible pages, or\n * if last scrolled up, the page before the visible pages\n */\n const visibleViews = visible.views;\n\n const numVisible = visibleViews.length;\n if (numVisible === 0) {\n return null;\n }\n for (let i = 0; i < numVisible; ++i) {\n const view = visibleViews[i].view;\n if (!this.isViewFinished(view)) {\n return view;\n }\n }\n\n // All the visible views have rendered; try to render next/previous pages.\n if (scrolledDown) {\n const nextPageIndex = visible.last.id;\n // IDs start at 1, so no need to add 1.\n if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n return views[nextPageIndex];\n }\n } else {\n const previousPageIndex = visible.first.id - 2;\n if (\n views[previousPageIndex] &&\n !this.isViewFinished(views[previousPageIndex])\n ) {\n return views[previousPageIndex];\n }\n }\n // Everything that needs to be rendered has been.\n return null;\n }\n\n /**\n * @param {IRenderableView} view\n * @returns {boolean}\n */\n isViewFinished(view) {\n return view.renderingState === RenderingStates.FINISHED;\n }\n\n /**\n * Render a page or thumbnail view. This calls the appropriate function\n * based on the views state. If the view is already rendered it will return\n * `false`.\n *\n * @param {IRenderableView} view\n */\n renderView(view) {\n switch (view.renderingState) {\n case RenderingStates.FINISHED:\n return false;\n case RenderingStates.PAUSED:\n this.highestPriorityPage = view.renderingId;\n view.resume();\n break;\n case RenderingStates.RUNNING:\n this.highestPriorityPage = view.renderingId;\n break;\n case RenderingStates.INITIAL:\n this.highestPriorityPage = view.renderingId;\n view\n .draw()\n .finally(() => {\n this.renderHighestPriority();\n })\n .catch(reason => {\n if (reason instanceof RenderingCancelledException) {\n return;\n }\n console.error(`renderView: \"${reason}\"`);\n });\n break;\n }\n return true;\n }\n}\n\nexport { PDFRenderingQueue, RenderingStates };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass OverlayManager {\n constructor() {\n this._overlays = {};\n this._active = null;\n this._keyDownBound = this._keyDown.bind(this);\n }\n\n get active() {\n return this._active;\n }\n\n /**\n * @param {string} name - The name of the overlay that is registered.\n * @param {HTMLDivElement} element - The overlay's DOM element.\n * @param {function} [callerCloseMethod] - The method that, if present, calls\n * `OverlayManager.close` from the object registering the\n * overlay. Access to this method is necessary in order to\n * run cleanup code when e.g. the overlay is force closed.\n * The default is `null`.\n * @param {boolean} [canForceClose] - Indicates if opening the overlay closes\n * an active overlay. The default is `false`.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * registered.\n */\n async register(\n name,\n element,\n callerCloseMethod = null,\n canForceClose = false\n ) {\n let container;\n if (!name || !element || !(container = element.parentNode)) {\n throw new Error(\"Not enough parameters.\");\n } else if (this._overlays[name]) {\n throw new Error(\"The overlay is already registered.\");\n }\n this._overlays[name] = {\n element,\n container,\n callerCloseMethod,\n canForceClose,\n };\n }\n\n /**\n * @param {string} name - The name of the overlay that is unregistered.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * unregistered.\n */\n async unregister(name) {\n if (!this._overlays[name]) {\n throw new Error(\"The overlay does not exist.\");\n } else if (this._active === name) {\n throw new Error(\"The overlay cannot be removed while it is active.\");\n }\n delete this._overlays[name];\n }\n\n /**\n * @param {string} name - The name of the overlay that should be opened.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * opened.\n */\n async open(name) {\n if (!this._overlays[name]) {\n throw new Error(\"The overlay does not exist.\");\n } else if (this._active) {\n if (this._overlays[name].canForceClose) {\n this._closeThroughCaller();\n } else if (this._active === name) {\n throw new Error(\"The overlay is already active.\");\n } else {\n throw new Error(\"Another overlay is currently active.\");\n }\n }\n this._active = name;\n this._overlays[this._active].element.classList.remove(\"hidden\");\n this._overlays[this._active].container.classList.remove(\"hidden\");\n\n window.addEventListener(\"keydown\", this._keyDownBound);\n }\n\n /**\n * @param {string} name - The name of the overlay that should be closed.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * closed.\n */\n async close(name) {\n if (!this._overlays[name]) {\n throw new Error(\"The overlay does not exist.\");\n } else if (!this._active) {\n throw new Error(\"The overlay is currently not active.\");\n } else if (this._active !== name) {\n throw new Error(\"Another overlay is currently active.\");\n }\n this._overlays[this._active].container.classList.add(\"hidden\");\n this._overlays[this._active].element.classList.add(\"hidden\");\n this._active = null;\n\n window.removeEventListener(\"keydown\", this._keyDownBound);\n }\n\n /**\n * @private\n */\n _keyDown(evt) {\n if (this._active && evt.keyCode === /* Esc = */ 27) {\n this._closeThroughCaller();\n evt.preventDefault();\n }\n }\n\n /**\n * @private\n */\n _closeThroughCaller() {\n if (this._overlays[this._active].callerCloseMethod) {\n this._overlays[this._active].callerCloseMethod();\n }\n if (this._active) {\n this.close(this._active);\n }\n }\n}\n\nexport { OverlayManager };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PasswordResponses } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} PasswordPromptOptions\n * @property {string} overlayName - Name of the overlay for the overlay manager.\n * @property {HTMLDivElement} container - Div container for the overlay.\n * @property {HTMLParagraphElement} label - Label containing instructions for\n * entering the password.\n * @property {HTMLInputElement} input - Input field for entering the password.\n * @property {HTMLButtonElement} submitButton - Button for submitting the\n * password.\n * @property {HTMLButtonElement} cancelButton - Button for cancelling password\n * entry.\n */\n\nclass PasswordPrompt {\n /**\n * @param {PasswordPromptOptions} options\n * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n * @param {IL10n} l10n - Localization service.\n * @param {boolean} [isViewerEmbedded] - If the viewer is embedded, in e.g.\n * an <iframe> or an <object>. The default value is `false`.\n */\n constructor(options, overlayManager, l10n, isViewerEmbedded = false) {\n this.overlayName = options.overlayName;\n this.container = options.container;\n this.label = options.label;\n this.input = options.input;\n this.submitButton = options.submitButton;\n this.cancelButton = options.cancelButton;\n this.overlayManager = overlayManager;\n this.l10n = l10n;\n this._isViewerEmbedded = isViewerEmbedded;\n\n this.updateCallback = null;\n this.reason = null;\n\n // Attach the event listeners.\n this.submitButton.addEventListener(\"click\", this.verify.bind(this));\n this.cancelButton.addEventListener(\"click\", this.close.bind(this));\n this.input.addEventListener(\"keydown\", e => {\n if (e.keyCode === /* Enter = */ 13) {\n this.verify();\n }\n });\n\n this.overlayManager.register(\n this.overlayName,\n this.container,\n this.close.bind(this),\n true\n );\n }\n\n async open() {\n await this.overlayManager.open(this.overlayName);\n\n const passwordIncorrect =\n this.reason === PasswordResponses.INCORRECT_PASSWORD;\n\n if (!this._isViewerEmbedded || passwordIncorrect) {\n this.input.focus();\n }\n this.label.textContent = await this.l10n.get(\n `password_${passwordIncorrect ? \"invalid\" : \"label\"}`\n );\n }\n\n close() {\n this.overlayManager.close(this.overlayName).then(() => {\n this.input.value = \"\";\n });\n }\n\n verify() {\n const password = this.input.value;\n if (password?.length > 0) {\n this.close();\n this.updateCallback(password);\n }\n }\n\n setUpdateCallback(updateCallback, reason) {\n this.updateCallback = updateCallback;\n this.reason = reason;\n }\n}\n\nexport { PasswordPrompt };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createPromiseCapability, getFilenameFromUrl } from \"pdfjs-lib\";\nimport { BaseTreeViewer } from \"./base_tree_viewer.js\";\n\n/**\n * @typedef {Object} PDFAttachmentViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {DownloadManager} downloadManager - The download manager.\n */\n\n/**\n * @typedef {Object} PDFAttachmentViewerRenderParameters\n * @property {Object|null} attachments - A lookup table of attachment objects.\n */\n\nclass PDFAttachmentViewer extends BaseTreeViewer {\n /**\n * @param {PDFAttachmentViewerOptions} options\n */\n constructor(options) {\n super(options);\n this.downloadManager = options.downloadManager;\n\n this.eventBus._on(\n \"fileattachmentannotation\",\n this._appendAttachment.bind(this)\n );\n }\n\n reset(keepRenderedCapability = false) {\n super.reset();\n this._attachments = null;\n\n if (!keepRenderedCapability) {\n // The only situation in which the `_renderedCapability` should *not* be\n // replaced is when appending FileAttachment annotations.\n this._renderedCapability = createPromiseCapability();\n }\n if (this._pendingDispatchEvent) {\n clearTimeout(this._pendingDispatchEvent);\n }\n this._pendingDispatchEvent = null;\n }\n\n /**\n * @private\n */\n _dispatchEvent(attachmentsCount) {\n this._renderedCapability.resolve();\n\n if (this._pendingDispatchEvent) {\n clearTimeout(this._pendingDispatchEvent);\n this._pendingDispatchEvent = null;\n }\n if (attachmentsCount === 0) {\n // Delay the event when no \"regular\" attachments exist, to allow time for\n // parsing of any FileAttachment annotations that may be present on the\n // *initially* rendered page; this reduces the likelihood of temporarily\n // disabling the attachmentsView when the `PDFSidebar` handles the event.\n this._pendingDispatchEvent = setTimeout(() => {\n this.eventBus.dispatch(\"attachmentsloaded\", {\n source: this,\n attachmentsCount: 0,\n });\n this._pendingDispatchEvent = null;\n });\n return;\n }\n\n this.eventBus.dispatch(\"attachmentsloaded\", {\n source: this,\n attachmentsCount,\n });\n }\n\n /**\n * @private\n */\n _bindLink(element, { content, filename }) {\n element.onclick = () => {\n this.downloadManager.openOrDownloadData(element, content, filename);\n return false;\n };\n }\n\n /**\n * @param {PDFAttachmentViewerRenderParameters} params\n */\n render({ attachments, keepRenderedCapability = false }) {\n if (this._attachments) {\n this.reset(keepRenderedCapability);\n }\n this._attachments = attachments || null;\n\n if (!attachments) {\n this._dispatchEvent(/* attachmentsCount = */ 0);\n return;\n }\n const names = Object.keys(attachments).sort(function (a, b) {\n return a.toLowerCase().localeCompare(b.toLowerCase());\n });\n\n const fragment = document.createDocumentFragment();\n let attachmentsCount = 0;\n for (const name of names) {\n const item = attachments[name];\n const content = item.content,\n filename = getFilenameFromUrl(item.filename);\n\n const div = document.createElement(\"div\");\n div.className = \"treeItem\";\n\n const element = document.createElement(\"a\");\n this._bindLink(element, { content, filename });\n element.textContent = this._normalizeTextContent(filename);\n\n div.appendChild(element);\n\n fragment.appendChild(div);\n attachmentsCount++;\n }\n\n this._finishRendering(fragment, attachmentsCount);\n }\n\n /**\n * Used to append FileAttachment annotations to the sidebar.\n * @private\n */\n _appendAttachment({ id, filename, content }) {\n const renderedPromise = this._renderedCapability.promise;\n\n renderedPromise.then(() => {\n if (renderedPromise !== this._renderedCapability.promise) {\n return; // The FileAttachment annotation belongs to a previous document.\n }\n let attachments = this._attachments;\n\n if (!attachments) {\n attachments = Object.create(null);\n } else {\n for (const name in attachments) {\n if (id === name) {\n return; // Ignore the new attachment if it already exists.\n }\n }\n }\n attachments[id] = {\n filename,\n content,\n };\n this.render({\n attachments,\n keepRenderedCapability: true,\n });\n });\n }\n}\n\nexport { PDFAttachmentViewer };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { removeNullCharacters } from \"pdfjs-lib\";\n\nconst TREEITEM_OFFSET_TOP = -100; // px\nconst TREEITEM_SELECTED_CLASS = \"selected\";\n\nclass BaseTreeViewer {\n constructor(options) {\n if (this.constructor === BaseTreeViewer) {\n throw new Error(\"Cannot initialize BaseTreeViewer.\");\n }\n this.container = options.container;\n this.eventBus = options.eventBus;\n\n this.reset();\n }\n\n reset() {\n this._pdfDocument = null;\n this._lastToggleIsShow = true;\n this._currentTreeItem = null;\n\n // Remove the tree from the DOM.\n this.container.textContent = \"\";\n // Ensure that the left (right in RTL locales) margin is always reset,\n // to prevent incorrect tree alignment if a new document is opened.\n this.container.classList.remove(\"treeWithDeepNesting\");\n }\n\n /**\n * @private\n */\n _dispatchEvent(count) {\n throw new Error(\"Not implemented: _dispatchEvent\");\n }\n\n /**\n * @private\n */\n _bindLink(element, params) {\n throw new Error(\"Not implemented: _bindLink\");\n }\n\n /**\n * @private\n */\n _normalizeTextContent(str) {\n return removeNullCharacters(str) || /* en dash = */ \"\\u2013\";\n }\n\n /**\n * Prepend a button before a tree item which allows the user to collapse or\n * expand all tree items at that level; see `_toggleTreeItem`.\n * @private\n */\n _addToggleButton(div, hidden = false) {\n const toggler = document.createElement(\"div\");\n toggler.className = \"treeItemToggler\";\n if (hidden) {\n toggler.classList.add(\"treeItemsHidden\");\n }\n toggler.onclick = evt => {\n evt.stopPropagation();\n toggler.classList.toggle(\"treeItemsHidden\");\n\n if (evt.shiftKey) {\n const shouldShowAll = !toggler.classList.contains(\"treeItemsHidden\");\n this._toggleTreeItem(div, shouldShowAll);\n }\n };\n div.insertBefore(toggler, div.firstChild);\n }\n\n /**\n * Collapse or expand the subtree of a tree item.\n *\n * @param {Element} root - the root of the item (sub)tree.\n * @param {boolean} show - whether to show the item (sub)tree. If false,\n * the item subtree rooted at `root` will be collapsed.\n * @private\n */\n _toggleTreeItem(root, show = false) {\n this._lastToggleIsShow = show;\n for (const toggler of root.querySelectorAll(\".treeItemToggler\")) {\n toggler.classList.toggle(\"treeItemsHidden\", !show);\n }\n }\n\n /**\n * Collapse or expand all subtrees of the `container`.\n * @private\n */\n _toggleAllTreeItems() {\n this._toggleTreeItem(this.container, !this._lastToggleIsShow);\n }\n\n /**\n * @private\n */\n _finishRendering(fragment, count, hasAnyNesting = false) {\n if (hasAnyNesting) {\n this.container.classList.add(\"treeWithDeepNesting\");\n\n this._lastToggleIsShow = !fragment.querySelector(\".treeItemsHidden\");\n }\n this.container.appendChild(fragment);\n\n this._dispatchEvent(count);\n }\n\n render(params) {\n throw new Error(\"Not implemented: render\");\n }\n\n /**\n * @private\n */\n _updateCurrentTreeItem(treeItem = null) {\n if (this._currentTreeItem) {\n // Ensure that the current treeItem-selection is always removed.\n this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);\n this._currentTreeItem = null;\n }\n if (treeItem) {\n treeItem.classList.add(TREEITEM_SELECTED_CLASS);\n this._currentTreeItem = treeItem;\n }\n }\n\n /**\n * @private\n */\n _scrollToCurrentTreeItem(treeItem) {\n if (!treeItem) {\n return;\n }\n // Ensure that the treeItem is *fully* expanded, such that it will first of\n // all be visible and secondly that scrolling it into view works correctly.\n let currentNode = treeItem.parentNode;\n while (currentNode && currentNode !== this.container) {\n if (currentNode.classList.contains(\"treeItem\")) {\n const toggler = currentNode.firstElementChild;\n toggler?.classList.remove(\"treeItemsHidden\");\n }\n currentNode = currentNode.parentNode;\n }\n this._updateCurrentTreeItem(treeItem);\n\n this.container.scrollTo(\n treeItem.offsetLeft,\n treeItem.offsetTop + TREEITEM_OFFSET_TOP\n );\n }\n}\n\nexport { BaseTreeViewer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createPromiseCapability,\n getPdfFilenameFromUrl,\n PDFDateString,\n} from \"pdfjs-lib\";\nimport { getPageSizeInches, isPortraitOrientation } from \"./ui_utils.js\";\n\nconst DEFAULT_FIELD_CONTENT = \"-\";\n\n// See https://en.wikibooks.org/wiki/Lentis/Conversion_to_the_Metric_Standard_in_the_United_States\nconst NON_METRIC_LOCALES = [\"en-us\", \"en-lr\", \"my\"];\n\n// Should use the format: `width x height`, in portrait orientation.\n// See https://en.wikipedia.org/wiki/Paper_size\nconst US_PAGE_NAMES = {\n \"8.5x11\": \"Letter\",\n \"8.5x14\": \"Legal\",\n};\nconst METRIC_PAGE_NAMES = {\n \"297x420\": \"A3\",\n \"210x297\": \"A4\",\n};\n\nfunction getPageName(size, isPortrait, pageNames) {\n const width = isPortrait ? size.width : size.height;\n const height = isPortrait ? size.height : size.width;\n\n return pageNames[`${width}x${height}`];\n}\n\n/**\n * @typedef {Object} PDFDocumentPropertiesOptions\n * @property {string} overlayName - Name/identifier for the overlay.\n * @property {Object} fields - Names and elements of the overlay's fields.\n * @property {HTMLDivElement} container - Div container for the overlay.\n * @property {HTMLButtonElement} closeButton - Button for closing the overlay.\n */\n\nclass PDFDocumentProperties {\n /**\n * @param {PDFDocumentPropertiesOptions} options\n * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n * @param {EventBus} eventBus - The application event bus.\n * @param {IL10n} l10n - Localization service.\n */\n constructor(\n { overlayName, fields, container, closeButton },\n overlayManager,\n eventBus,\n l10n\n ) {\n this.overlayName = overlayName;\n this.fields = fields;\n this.container = container;\n this.overlayManager = overlayManager;\n this.l10n = l10n;\n\n this._reset();\n // Bind the event listener for the Close button.\n closeButton.addEventListener(\"click\", this.close.bind(this));\n\n this.overlayManager.register(\n this.overlayName,\n this.container,\n this.close.bind(this)\n );\n\n eventBus._on(\"pagechanging\", evt => {\n this._currentPageNumber = evt.pageNumber;\n });\n eventBus._on(\"rotationchanging\", evt => {\n this._pagesRotation = evt.pagesRotation;\n });\n\n this._isNonMetricLocale = true; // The default viewer locale is 'en-us'.\n l10n.getLanguage().then(locale => {\n this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);\n });\n }\n\n /**\n * Open the document properties overlay.\n */\n async open() {\n const freezeFieldData = data => {\n Object.defineProperty(this, \"fieldData\", {\n value: Object.freeze(data),\n writable: false,\n enumerable: true,\n configurable: true,\n });\n };\n\n await Promise.all([\n this.overlayManager.open(this.overlayName),\n this._dataAvailableCapability.promise,\n ]);\n const currentPageNumber = this._currentPageNumber;\n const pagesRotation = this._pagesRotation;\n\n // If the document properties were previously fetched (for this PDF file),\n // just update the dialog immediately to avoid redundant lookups.\n if (\n this.fieldData &&\n currentPageNumber === this.fieldData._currentPageNumber &&\n pagesRotation === this.fieldData._pagesRotation\n ) {\n this._updateUI();\n return;\n }\n\n // Get the document properties.\n const {\n info,\n /* metadata, */\n contentDispositionFilename,\n contentLength,\n } = await this.pdfDocument.getMetadata();\n\n const [\n fileName,\n fileSize,\n creationDate,\n modificationDate,\n pageSize,\n isLinearized,\n ] = await Promise.all([\n contentDispositionFilename || getPdfFilenameFromUrl(this.url),\n this._parseFileSize(contentLength),\n this._parseDate(info.CreationDate),\n this._parseDate(info.ModDate),\n this.pdfDocument.getPage(currentPageNumber).then(pdfPage => {\n return this._parsePageSize(getPageSizeInches(pdfPage), pagesRotation);\n }),\n this._parseLinearization(info.IsLinearized),\n ]);\n\n freezeFieldData({\n fileName,\n fileSize,\n title: info.Title,\n author: info.Author,\n subject: info.Subject,\n keywords: info.Keywords,\n creationDate,\n modificationDate,\n creator: info.Creator,\n producer: info.Producer,\n version: info.PDFFormatVersion,\n pageCount: this.pdfDocument.numPages,\n pageSize,\n linearized: isLinearized,\n _currentPageNumber: currentPageNumber,\n _pagesRotation: pagesRotation,\n });\n this._updateUI();\n\n // Get the correct fileSize, since it may not have been available\n // or could potentially be wrong.\n const { length } = await this.pdfDocument.getDownloadInfo();\n if (contentLength === length) {\n return; // The fileSize has already been correctly set.\n }\n const data = Object.assign(Object.create(null), this.fieldData);\n data.fileSize = await this._parseFileSize(length);\n\n freezeFieldData(data);\n this._updateUI();\n }\n\n /**\n * Close the document properties overlay.\n */\n close() {\n this.overlayManager.close(this.overlayName);\n }\n\n /**\n * Set a reference to the PDF document and the URL in order\n * to populate the overlay fields with the document properties.\n * Note that the overlay will contain no information if this method\n * is not called.\n *\n * @param {PDFDocumentProxy} pdfDocument - A reference to the PDF document.\n * @param {string} url - The URL of the document.\n */\n setDocument(pdfDocument, url = null) {\n if (this.pdfDocument) {\n this._reset();\n this._updateUI(true);\n }\n if (!pdfDocument) {\n return;\n }\n this.pdfDocument = pdfDocument;\n this.url = url;\n\n this._dataAvailableCapability.resolve();\n }\n\n /**\n * @private\n */\n _reset() {\n this.pdfDocument = null;\n this.url = null;\n\n delete this.fieldData;\n this._dataAvailableCapability = createPromiseCapability();\n this._currentPageNumber = 1;\n this._pagesRotation = 0;\n }\n\n /**\n * Always updates all of the dialog fields, to prevent inconsistent UI state.\n * NOTE: If the contents of a particular field is neither a non-empty string,\n * nor a number, it will fall back to `DEFAULT_FIELD_CONTENT`.\n * @private\n */\n _updateUI(reset = false) {\n if (reset || !this.fieldData) {\n for (const id in this.fields) {\n this.fields[id].textContent = DEFAULT_FIELD_CONTENT;\n }\n return;\n }\n if (this.overlayManager.active !== this.overlayName) {\n // Don't bother updating the dialog if has already been closed,\n // since it will be updated the next time `this.open` is called.\n return;\n }\n for (const id in this.fields) {\n const content = this.fieldData[id];\n this.fields[id].textContent =\n content || content === 0 ? content : DEFAULT_FIELD_CONTENT;\n }\n }\n\n /**\n * @private\n */\n async _parseFileSize(fileSize = 0) {\n const kb = fileSize / 1024,\n mb = kb / 1024;\n if (!kb) {\n return undefined;\n }\n return this.l10n.get(`document_properties_${mb >= 1 ? \"mb\" : \"kb\"}`, {\n size_mb: mb >= 1 && (+mb.toPrecision(3)).toLocaleString(),\n size_kb: mb < 1 && (+kb.toPrecision(3)).toLocaleString(),\n size_b: fileSize.toLocaleString(),\n });\n }\n\n /**\n * @private\n */\n async _parsePageSize(pageSizeInches, pagesRotation) {\n if (!pageSizeInches) {\n return undefined;\n }\n // Take the viewer rotation into account as well; compare with Adobe Reader.\n if (pagesRotation % 180 !== 0) {\n pageSizeInches = {\n width: pageSizeInches.height,\n height: pageSizeInches.width,\n };\n }\n const isPortrait = isPortraitOrientation(pageSizeInches);\n\n let sizeInches = {\n width: Math.round(pageSizeInches.width * 100) / 100,\n height: Math.round(pageSizeInches.height * 100) / 100,\n };\n // 1in == 25.4mm; no need to round to 2 decimals for millimeters.\n let sizeMillimeters = {\n width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,\n height: Math.round(pageSizeInches.height * 25.4 * 10) / 10,\n };\n\n let rawName =\n getPageName(sizeInches, isPortrait, US_PAGE_NAMES) ||\n getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);\n\n if (\n !rawName &&\n !(\n Number.isInteger(sizeMillimeters.width) &&\n Number.isInteger(sizeMillimeters.height)\n )\n ) {\n // Attempt to improve the page name detection by falling back to fuzzy\n // matching of the metric dimensions, to account for e.g. rounding errors\n // and/or PDF files that define the page sizes in an imprecise manner.\n const exactMillimeters = {\n width: pageSizeInches.width * 25.4,\n height: pageSizeInches.height * 25.4,\n };\n const intMillimeters = {\n width: Math.round(sizeMillimeters.width),\n height: Math.round(sizeMillimeters.height),\n };\n\n // Try to avoid false positives, by only considering \"small\" differences.\n if (\n Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 &&\n Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1\n ) {\n rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);\n if (rawName) {\n // Update *both* sizes, computed above, to ensure that the displayed\n // dimensions always correspond to the detected page name.\n sizeInches = {\n width: Math.round((intMillimeters.width / 25.4) * 100) / 100,\n height: Math.round((intMillimeters.height / 25.4) * 100) / 100,\n };\n sizeMillimeters = intMillimeters;\n }\n }\n }\n\n const [{ width, height }, unit, name, orientation] = await Promise.all([\n this._isNonMetricLocale ? sizeInches : sizeMillimeters,\n this.l10n.get(\n `document_properties_page_size_unit_${\n this._isNonMetricLocale ? \"inches\" : \"millimeters\"\n }`\n ),\n rawName &&\n this.l10n.get(\n `document_properties_page_size_name_${rawName.toLowerCase()}`\n ),\n this.l10n.get(\n `document_properties_page_size_orientation_${\n isPortrait ? \"portrait\" : \"landscape\"\n }`\n ),\n ]);\n\n return this.l10n.get(\n `document_properties_page_size_dimension_${name ? \"name_\" : \"\"}string`,\n {\n width: width.toLocaleString(),\n height: height.toLocaleString(),\n unit,\n name,\n orientation,\n }\n );\n }\n\n /**\n * @private\n */\n async _parseDate(inputDate) {\n const dateObject = PDFDateString.toDateObject(inputDate);\n if (!dateObject) {\n return undefined;\n }\n return this.l10n.get(\"document_properties_date_string\", {\n date: dateObject.toLocaleDateString(),\n time: dateObject.toLocaleTimeString(),\n });\n }\n\n /**\n * @private\n */\n _parseLinearization(isLinearized) {\n return this.l10n.get(\n `document_properties_linearized_${isLinearized ? \"yes\" : \"no\"}`\n );\n }\n}\n\nexport { PDFDocumentProperties };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FindState } from \"./pdf_find_controller.js\";\n\nconst MATCHES_COUNT_LIMIT = 1000;\n\n/**\n * Creates a \"search bar\" given a set of DOM elements that act as controls\n * for searching or for setting search preferences in the UI. This object\n * also sets up the appropriate events for the controls. Actual searching\n * is done by PDFFindController.\n */\nclass PDFFindBar {\n constructor(options, eventBus, l10n) {\n this.opened = false;\n\n this.bar = options.bar;\n this.toggleButton = options.toggleButton;\n this.findField = options.findField;\n this.highlightAll = options.highlightAllCheckbox;\n this.caseSensitive = options.caseSensitiveCheckbox;\n this.entireWord = options.entireWordCheckbox;\n this.findMsg = options.findMsg;\n this.findResultsCount = options.findResultsCount;\n this.findPreviousButton = options.findPreviousButton;\n this.findNextButton = options.findNextButton;\n this.eventBus = eventBus;\n this.l10n = l10n;\n\n // Add event listeners to the DOM elements.\n this.toggleButton.addEventListener(\"click\", () => {\n this.toggle();\n });\n\n this.findField.addEventListener(\"input\", () => {\n this.dispatchEvent(\"\");\n });\n\n this.bar.addEventListener(\"keydown\", e => {\n switch (e.keyCode) {\n case 13: // Enter\n if (e.target === this.findField) {\n this.dispatchEvent(\"again\", e.shiftKey);\n }\n break;\n case 27: // Escape\n this.close();\n break;\n }\n });\n\n this.findPreviousButton.addEventListener(\"click\", () => {\n this.dispatchEvent(\"again\", true);\n });\n\n this.findNextButton.addEventListener(\"click\", () => {\n this.dispatchEvent(\"again\", false);\n });\n\n this.highlightAll.addEventListener(\"click\", () => {\n this.dispatchEvent(\"highlightallchange\");\n });\n\n this.caseSensitive.addEventListener(\"click\", () => {\n this.dispatchEvent(\"casesensitivitychange\");\n });\n\n this.entireWord.addEventListener(\"click\", () => {\n this.dispatchEvent(\"entirewordchange\");\n });\n\n this.eventBus._on(\"resize\", this._adjustWidth.bind(this));\n }\n\n reset() {\n this.updateUIState();\n }\n\n dispatchEvent(type, findPrev) {\n this.eventBus.dispatch(\"find\", {\n source: this,\n type,\n query: this.findField.value,\n phraseSearch: true,\n caseSensitive: this.caseSensitive.checked,\n entireWord: this.entireWord.checked,\n highlightAll: this.highlightAll.checked,\n findPrevious: findPrev,\n });\n }\n\n updateUIState(state, previous, matchesCount) {\n let findMsg = Promise.resolve(\"\");\n let status = \"\";\n\n switch (state) {\n case FindState.FOUND:\n break;\n case FindState.PENDING:\n status = \"pending\";\n break;\n case FindState.NOT_FOUND:\n findMsg = this.l10n.get(\"find_not_found\");\n status = \"notFound\";\n break;\n case FindState.WRAPPED:\n findMsg = this.l10n.get(`find_reached_${previous ? \"top\" : \"bottom\"}`);\n break;\n }\n this.findField.setAttribute(\"data-status\", status);\n\n findMsg.then(msg => {\n this.findMsg.textContent = msg;\n this._adjustWidth();\n });\n\n this.updateResultsCount(matchesCount);\n }\n\n updateResultsCount({ current = 0, total = 0 } = {}) {\n const limit = MATCHES_COUNT_LIMIT;\n let matchCountMsg = Promise.resolve(\"\");\n\n if (total > 0) {\n if (total > limit) {\n let key = \"find_match_count_limit\";\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n // TODO: Remove this hard-coded `[other]` form once plural support has\n // been implemented in the mozilla-central specific `l10n.js` file.\n key += \"[other]\";\n }\n matchCountMsg = this.l10n.get(key, { limit });\n } else {\n let key = \"find_match_count\";\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n // TODO: Remove this hard-coded `[other]` form once plural support has\n // been implemented in the mozilla-central specific `l10n.js` file.\n key += \"[other]\";\n }\n matchCountMsg = this.l10n.get(key, { current, total });\n }\n }\n matchCountMsg.then(msg => {\n this.findResultsCount.textContent = msg;\n this.findResultsCount.classList.toggle(\"hidden\", !total);\n // Since `updateResultsCount` may be called from `PDFFindController`,\n // ensure that the width of the findbar is always updated correctly.\n this._adjustWidth();\n });\n }\n\n open() {\n if (!this.opened) {\n this.opened = true;\n this.toggleButton.classList.add(\"toggled\");\n this.toggleButton.setAttribute(\"aria-expanded\", \"true\");\n this.bar.classList.remove(\"hidden\");\n }\n this.findField.select();\n this.findField.focus();\n\n this._adjustWidth();\n }\n\n close() {\n if (!this.opened) {\n return;\n }\n this.opened = false;\n this.toggleButton.classList.remove(\"toggled\");\n this.toggleButton.setAttribute(\"aria-expanded\", \"false\");\n this.bar.classList.add(\"hidden\");\n\n this.eventBus.dispatch(\"findbarclose\", { source: this });\n }\n\n toggle() {\n if (this.opened) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * @private\n */\n _adjustWidth() {\n if (!this.opened) {\n return;\n }\n\n // The find bar has an absolute position and thus the browser extends\n // its width to the maximum possible width once the find bar does not fit\n // entirely within the window anymore (and its elements are automatically\n // wrapped). Here we detect and fix that.\n this.bar.classList.remove(\"wrapContainers\");\n\n const findbarHeight = this.bar.clientHeight;\n const inputContainerHeight = this.bar.firstElementChild.clientHeight;\n\n if (findbarHeight > inputContainerHeight) {\n // The findbar is taller than the input container, which means that\n // the browser wrapped some of the elements. For a consistent look,\n // wrap all of them to adjust the width of the find bar.\n this.bar.classList.add(\"wrapContainers\");\n }\n }\n}\n\nexport { PDFFindBar };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createPromiseCapability } from \"pdfjs-lib\";\nimport { getCharacterType } from \"./pdf_find_utils.js\";\nimport { scrollIntoView } from \"./ui_utils.js\";\n\nconst FindState = {\n FOUND: 0,\n NOT_FOUND: 1,\n WRAPPED: 2,\n PENDING: 3,\n};\n\nconst FIND_TIMEOUT = 250; // ms\nconst MATCH_SCROLL_OFFSET_TOP = -50; // px\nconst MATCH_SCROLL_OFFSET_LEFT = -400; // px\n\nconst CHARACTERS_TO_NORMALIZE = {\n \"\\u2010\": \"-\", // Hyphen\n \"\\u2018\": \"'\", // Left single quotation mark\n \"\\u2019\": \"'\", // Right single quotation mark\n \"\\u201A\": \"'\", // Single low-9 quotation mark\n \"\\u201B\": \"'\", // Single high-reversed-9 quotation mark\n \"\\u201C\": '\"', // Left double quotation mark\n \"\\u201D\": '\"', // Right double quotation mark\n \"\\u201E\": '\"', // Double low-9 quotation mark\n \"\\u201F\": '\"', // Double high-reversed-9 quotation mark\n \"\\u00BC\": \"1/4\", // Vulgar fraction one quarter\n \"\\u00BD\": \"1/2\", // Vulgar fraction one half\n \"\\u00BE\": \"3/4\", // Vulgar fraction three quarters\n};\n\nlet normalizationRegex = null;\nfunction normalize(text) {\n if (!normalizationRegex) {\n // Compile the regular expression for text normalization once.\n const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(\"\");\n normalizationRegex = new RegExp(`[${replace}]`, \"g\");\n }\n let diffs = null;\n const normalizedText = text.replace(normalizationRegex, function (ch, index) {\n const normalizedCh = CHARACTERS_TO_NORMALIZE[ch],\n diff = normalizedCh.length - ch.length;\n if (diff !== 0) {\n (diffs ||= []).push([index, diff]);\n }\n return normalizedCh;\n });\n\n return [normalizedText, diffs];\n}\n\n// Determine the original, non-normalized, match index such that highlighting of\n// search results is correct in the `textLayer` for strings containing e.g. \"½\"\n// characters; essentially \"inverting\" the result of the `normalize` function.\nfunction getOriginalIndex(matchIndex, diffs = null) {\n if (!diffs) {\n return matchIndex;\n }\n let totalDiff = 0;\n for (const [index, diff] of diffs) {\n const currentIndex = index + totalDiff;\n\n if (currentIndex >= matchIndex) {\n break;\n }\n if (currentIndex + diff > matchIndex) {\n totalDiff += matchIndex - currentIndex;\n break;\n }\n totalDiff += diff;\n }\n return matchIndex - totalDiff;\n}\n\n/**\n * @typedef {Object} PDFFindControllerOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * Provides search functionality to find a given string in a PDF document.\n */\nclass PDFFindController {\n /**\n * @param {PDFFindControllerOptions} options\n */\n constructor({ linkService, eventBus }) {\n this._linkService = linkService;\n this._eventBus = eventBus;\n\n this._reset();\n eventBus._on(\"findbarclose\", this._onFindBarClose.bind(this));\n }\n\n get highlightMatches() {\n return this._highlightMatches;\n }\n\n get pageMatches() {\n return this._pageMatches;\n }\n\n get pageMatchesLength() {\n return this._pageMatchesLength;\n }\n\n get selected() {\n return this._selected;\n }\n\n get state() {\n return this._state;\n }\n\n /**\n * Set a reference to the PDF document in order to search it.\n * Note that searching is not possible if this method is not called.\n *\n * @param {PDFDocumentProxy} pdfDocument - The PDF document to search.\n */\n setDocument(pdfDocument) {\n if (this._pdfDocument) {\n this._reset();\n }\n if (!pdfDocument) {\n return;\n }\n this._pdfDocument = pdfDocument;\n this._firstPageCapability.resolve();\n }\n\n executeCommand(cmd, state) {\n if (!state) {\n return;\n }\n const pdfDocument = this._pdfDocument;\n\n if (this._state === null || this._shouldDirtyMatch(cmd, state)) {\n this._dirtyMatch = true;\n }\n this._state = state;\n if (cmd !== \"findhighlightallchange\") {\n this._updateUIState(FindState.PENDING);\n }\n\n this._firstPageCapability.promise.then(() => {\n // If the document was closed before searching began, or if the search\n // operation was relevant for a previously opened document, do nothing.\n if (\n !this._pdfDocument ||\n (pdfDocument && this._pdfDocument !== pdfDocument)\n ) {\n return;\n }\n this._extractText();\n\n const findbarClosed = !this._highlightMatches;\n const pendingTimeout = !!this._findTimeout;\n\n if (this._findTimeout) {\n clearTimeout(this._findTimeout);\n this._findTimeout = null;\n }\n if (cmd === \"find\") {\n // Trigger the find action with a small delay to avoid starting the\n // search when the user is still typing (saving resources).\n this._findTimeout = setTimeout(() => {\n this._nextMatch();\n this._findTimeout = null;\n }, FIND_TIMEOUT);\n } else if (this._dirtyMatch) {\n // Immediately trigger searching for non-'find' operations, when the\n // current state needs to be reset and matches re-calculated.\n this._nextMatch();\n } else if (cmd === \"findagain\") {\n this._nextMatch();\n\n // When the findbar was previously closed, and `highlightAll` is set,\n // ensure that the matches on all active pages are highlighted again.\n if (findbarClosed && this._state.highlightAll) {\n this._updateAllPages();\n }\n } else if (cmd === \"findhighlightallchange\") {\n // If there was a pending search operation, synchronously trigger a new\n // search *first* to ensure that the correct matches are highlighted.\n if (pendingTimeout) {\n this._nextMatch();\n } else {\n this._highlightMatches = true;\n }\n this._updateAllPages(); // Update the highlighting on all active pages.\n } else {\n this._nextMatch();\n }\n });\n }\n\n scrollMatchIntoView({\n element = null,\n selectedLeft = 0,\n pageIndex = -1,\n matchIndex = -1,\n }) {\n if (!this._scrollMatches || !element) {\n return;\n } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {\n return;\n } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {\n return;\n }\n this._scrollMatches = false; // Ensure that scrolling only happens once.\n\n const spot = {\n top: MATCH_SCROLL_OFFSET_TOP,\n left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT,\n };\n scrollIntoView(element, spot, /* scrollMatches = */ true);\n }\n\n _reset() {\n this._highlightMatches = false;\n this._scrollMatches = false;\n this._pdfDocument = null;\n this._pageMatches = [];\n this._pageMatchesLength = [];\n this._state = null;\n // Currently selected match.\n this._selected = {\n pageIdx: -1,\n matchIdx: -1,\n };\n // Where the find algorithm currently is in the document.\n this._offset = {\n pageIdx: null,\n matchIdx: null,\n wrapped: false,\n };\n this._extractTextPromises = [];\n this._pageContents = []; // Stores the normalized text for each page.\n this._pageDiffs = [];\n this._matchesCountTotal = 0;\n this._pagesToSearch = null;\n this._pendingFindMatches = new Set();\n this._resumePageIdx = null;\n this._dirtyMatch = false;\n clearTimeout(this._findTimeout);\n this._findTimeout = null;\n\n this._firstPageCapability = createPromiseCapability();\n }\n\n /**\n * @type {string} The (current) normalized search query.\n */\n get _query() {\n if (this._state.query !== this._rawQuery) {\n this._rawQuery = this._state.query;\n [this._normalizedQuery] = normalize(this._state.query);\n }\n return this._normalizedQuery;\n }\n\n _shouldDirtyMatch(cmd, state) {\n // When the search query changes, regardless of the actual search command\n // used, always re-calculate matches to avoid errors (fixes bug 1030622).\n if (state.query !== this._state.query) {\n return true;\n }\n switch (cmd) {\n case \"findagain\":\n const pageNumber = this._selected.pageIdx + 1;\n const linkService = this._linkService;\n // Only treat a 'findagain' event as a new search operation when it's\n // *absolutely* certain that the currently selected match is no longer\n // visible, e.g. as a result of the user scrolling in the document.\n //\n // NOTE: If only a simple `this._linkService.page` check was used here,\n // there's a risk that consecutive 'findagain' operations could \"skip\"\n // over matches at the top/bottom of pages thus making them completely\n // inaccessible when there's multiple pages visible in the viewer.\n if (\n pageNumber >= 1 &&\n pageNumber <= linkService.pagesCount &&\n pageNumber !== linkService.page &&\n !linkService.isPageVisible(pageNumber)\n ) {\n return true;\n }\n return false;\n case \"findhighlightallchange\":\n return false;\n }\n return true;\n }\n\n /**\n * Helper for multi-term search that fills the `matchesWithLength` array\n * and handles cases where one search term includes another search term (for\n * example, \"tamed tame\" or \"this is\"). It looks for intersecting terms in\n * the `matches` and keeps elements with a longer match length.\n */\n _prepareMatches(matchesWithLength, matches, matchesLength) {\n function isSubTerm(currentIndex) {\n const currentElem = matchesWithLength[currentIndex];\n const nextElem = matchesWithLength[currentIndex + 1];\n\n // Check for cases like \"TAMEd TAME\".\n if (\n currentIndex < matchesWithLength.length - 1 &&\n currentElem.match === nextElem.match\n ) {\n currentElem.skipped = true;\n return true;\n }\n\n // Check for cases like \"thIS IS\".\n for (let i = currentIndex - 1; i >= 0; i--) {\n const prevElem = matchesWithLength[i];\n if (prevElem.skipped) {\n continue;\n }\n if (prevElem.match + prevElem.matchLength < currentElem.match) {\n break;\n }\n if (\n prevElem.match + prevElem.matchLength >=\n currentElem.match + currentElem.matchLength\n ) {\n currentElem.skipped = true;\n return true;\n }\n }\n return false;\n }\n\n // Sort the array of `{ match: <match>, matchLength: <matchLength> }`\n // objects on increasing index first and on the length otherwise.\n matchesWithLength.sort(function (a, b) {\n return a.match === b.match\n ? a.matchLength - b.matchLength\n : a.match - b.match;\n });\n for (let i = 0, len = matchesWithLength.length; i < len; i++) {\n if (isSubTerm(i)) {\n continue;\n }\n matches.push(matchesWithLength[i].match);\n matchesLength.push(matchesWithLength[i].matchLength);\n }\n }\n\n /**\n * Determine if the search query constitutes a \"whole word\", by comparing the\n * first/last character type with the preceding/following character type.\n */\n _isEntireWord(content, startIdx, length) {\n if (startIdx > 0) {\n const first = content.charCodeAt(startIdx);\n const limit = content.charCodeAt(startIdx - 1);\n if (getCharacterType(first) === getCharacterType(limit)) {\n return false;\n }\n }\n const endIdx = startIdx + length - 1;\n if (endIdx < content.length - 1) {\n const last = content.charCodeAt(endIdx);\n const limit = content.charCodeAt(endIdx + 1);\n if (getCharacterType(last) === getCharacterType(limit)) {\n return false;\n }\n }\n return true;\n }\n\n _calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {\n const matches = [],\n matchesLength = [];\n const queryLen = query.length;\n\n let matchIdx = -queryLen;\n while (true) {\n matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n if (matchIdx === -1) {\n break;\n }\n if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {\n continue;\n }\n const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),\n matchEnd = matchIdx + queryLen - 1,\n originalQueryLen =\n getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;\n\n matches.push(originalMatchIdx);\n matchesLength.push(originalQueryLen);\n }\n this._pageMatches[pageIndex] = matches;\n this._pageMatchesLength[pageIndex] = matchesLength;\n }\n\n _calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {\n const matchesWithLength = [];\n\n // Divide the query into pieces and search for text in each piece.\n const queryArray = query.match(/\\S+/g);\n for (let i = 0, len = queryArray.length; i < len; i++) {\n const subquery = queryArray[i];\n const subqueryLen = subquery.length;\n\n let matchIdx = -subqueryLen;\n while (true) {\n matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\n if (matchIdx === -1) {\n break;\n }\n if (\n entireWord &&\n !this._isEntireWord(pageContent, matchIdx, subqueryLen)\n ) {\n continue;\n }\n const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),\n matchEnd = matchIdx + subqueryLen - 1,\n originalQueryLen =\n getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;\n\n // Other searches do not, so we store the length.\n matchesWithLength.push({\n match: originalMatchIdx,\n matchLength: originalQueryLen,\n skipped: false,\n });\n }\n }\n\n // Prepare arrays for storing the matches.\n this._pageMatchesLength[pageIndex] = [];\n this._pageMatches[pageIndex] = [];\n\n // Sort `matchesWithLength`, remove intersecting terms and put the result\n // into the two arrays.\n this._prepareMatches(\n matchesWithLength,\n this._pageMatches[pageIndex],\n this._pageMatchesLength[pageIndex]\n );\n }\n\n _calculateMatch(pageIndex) {\n let pageContent = this._pageContents[pageIndex];\n const pageDiffs = this._pageDiffs[pageIndex];\n let query = this._query;\n const { caseSensitive, entireWord, phraseSearch } = this._state;\n\n if (query.length === 0) {\n // Do nothing: the matches should be wiped out already.\n return;\n }\n\n if (!caseSensitive) {\n pageContent = pageContent.toLowerCase();\n query = query.toLowerCase();\n }\n\n if (phraseSearch) {\n this._calculatePhraseMatch(\n query,\n pageIndex,\n pageContent,\n pageDiffs,\n entireWord\n );\n } else {\n this._calculateWordMatch(\n query,\n pageIndex,\n pageContent,\n pageDiffs,\n entireWord\n );\n }\n\n // When `highlightAll` is set, ensure that the matches on previously\n // rendered (and still active) pages are correctly highlighted.\n if (this._state.highlightAll) {\n this._updatePage(pageIndex);\n }\n if (this._resumePageIdx === pageIndex) {\n this._resumePageIdx = null;\n this._nextPageMatch();\n }\n\n // Update the match count.\n const pageMatchesCount = this._pageMatches[pageIndex].length;\n if (pageMatchesCount > 0) {\n this._matchesCountTotal += pageMatchesCount;\n this._updateUIResultsCount();\n }\n }\n\n _extractText() {\n // Perform text extraction once if this method is called multiple times.\n if (this._extractTextPromises.length > 0) {\n return;\n }\n\n let promise = Promise.resolve();\n for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {\n const extractTextCapability = createPromiseCapability();\n this._extractTextPromises[i] = extractTextCapability.promise;\n\n promise = promise.then(() => {\n return this._pdfDocument\n .getPage(i + 1)\n .then(pdfPage => {\n return pdfPage.getTextContent({\n normalizeWhitespace: true,\n });\n })\n .then(\n textContent => {\n const textItems = textContent.items;\n const strBuf = [];\n\n for (let j = 0, jj = textItems.length; j < jj; j++) {\n strBuf.push(textItems[j].str);\n }\n\n // Store the normalized page content (text items) as one string.\n [this._pageContents[i], this._pageDiffs[i]] = normalize(\n strBuf.join(\"\")\n );\n extractTextCapability.resolve(i);\n },\n reason => {\n console.error(\n `Unable to get text content for page ${i + 1}`,\n reason\n );\n // Page error -- assuming no text content.\n this._pageContents[i] = \"\";\n this._pageDiffs[i] = null;\n extractTextCapability.resolve(i);\n }\n );\n });\n }\n }\n\n _updatePage(index) {\n if (this._scrollMatches && this._selected.pageIdx === index) {\n // If the page is selected, scroll the page into view, which triggers\n // rendering the page, which adds the text layer. Once the text layer\n // is built, it will attempt to scroll the selected match into view.\n this._linkService.page = index + 1;\n }\n\n this._eventBus.dispatch(\"updatetextlayermatches\", {\n source: this,\n pageIndex: index,\n });\n }\n\n _updateAllPages() {\n this._eventBus.dispatch(\"updatetextlayermatches\", {\n source: this,\n pageIndex: -1,\n });\n }\n\n _nextMatch() {\n const previous = this._state.findPrevious;\n const currentPageIndex = this._linkService.page - 1;\n const numPages = this._linkService.pagesCount;\n\n this._highlightMatches = true;\n\n if (this._dirtyMatch) {\n // Need to recalculate the matches, reset everything.\n this._dirtyMatch = false;\n this._selected.pageIdx = this._selected.matchIdx = -1;\n this._offset.pageIdx = currentPageIndex;\n this._offset.matchIdx = null;\n this._offset.wrapped = false;\n this._resumePageIdx = null;\n this._pageMatches.length = 0;\n this._pageMatchesLength.length = 0;\n this._matchesCountTotal = 0;\n\n this._updateAllPages(); // Wipe out any previously highlighted matches.\n\n for (let i = 0; i < numPages; i++) {\n // Start finding the matches as soon as the text is extracted.\n if (this._pendingFindMatches.has(i)) {\n continue;\n }\n this._pendingFindMatches.add(i);\n this._extractTextPromises[i].then(pageIdx => {\n this._pendingFindMatches.delete(pageIdx);\n this._calculateMatch(pageIdx);\n });\n }\n }\n\n // If there's no query there's no point in searching.\n if (this._query === \"\") {\n this._updateUIState(FindState.FOUND);\n return;\n }\n // If we're waiting on a page, we return since we can't do anything else.\n if (this._resumePageIdx) {\n return;\n }\n\n const offset = this._offset;\n // Keep track of how many pages we should maximally iterate through.\n this._pagesToSearch = numPages;\n // If there's already a `matchIdx` that means we are iterating through a\n // page's matches.\n if (offset.matchIdx !== null) {\n const numPageMatches = this._pageMatches[offset.pageIdx].length;\n if (\n (!previous && offset.matchIdx + 1 < numPageMatches) ||\n (previous && offset.matchIdx > 0)\n ) {\n // The simple case; we just have advance the matchIdx to select\n // the next match on the page.\n offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n this._updateMatch(/* found = */ true);\n return;\n }\n // We went beyond the current page's matches, so we advance to\n // the next page.\n this._advanceOffsetPage(previous);\n }\n // Start searching through the page.\n this._nextPageMatch();\n }\n\n _matchesReady(matches) {\n const offset = this._offset;\n const numMatches = matches.length;\n const previous = this._state.findPrevious;\n\n if (numMatches) {\n // There were matches for the page, so initialize `matchIdx`.\n offset.matchIdx = previous ? numMatches - 1 : 0;\n this._updateMatch(/* found = */ true);\n return true;\n }\n // No matches, so attempt to search the next page.\n this._advanceOffsetPage(previous);\n if (offset.wrapped) {\n offset.matchIdx = null;\n if (this._pagesToSearch < 0) {\n // No point in wrapping again, there were no matches.\n this._updateMatch(/* found = */ false);\n // While matches were not found, searching for a page\n // with matches should nevertheless halt.\n return true;\n }\n }\n // Matches were not found (and searching is not done).\n return false;\n }\n\n _nextPageMatch() {\n if (this._resumePageIdx !== null) {\n console.error(\"There can only be one pending page.\");\n }\n\n let matches = null;\n do {\n const pageIdx = this._offset.pageIdx;\n matches = this._pageMatches[pageIdx];\n if (!matches) {\n // The matches don't exist yet for processing by `_matchesReady`,\n // so set a resume point for when they do exist.\n this._resumePageIdx = pageIdx;\n break;\n }\n } while (!this._matchesReady(matches));\n }\n\n _advanceOffsetPage(previous) {\n const offset = this._offset;\n const numPages = this._linkService.pagesCount;\n offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n offset.matchIdx = null;\n\n this._pagesToSearch--;\n\n if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n offset.pageIdx = previous ? numPages - 1 : 0;\n offset.wrapped = true;\n }\n }\n\n _updateMatch(found = false) {\n let state = FindState.NOT_FOUND;\n const wrapped = this._offset.wrapped;\n this._offset.wrapped = false;\n\n if (found) {\n const previousPage = this._selected.pageIdx;\n this._selected.pageIdx = this._offset.pageIdx;\n this._selected.matchIdx = this._offset.matchIdx;\n state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n\n // Update the currently selected page to wipe out any selected matches.\n if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {\n this._updatePage(previousPage);\n }\n }\n\n this._updateUIState(state, this._state.findPrevious);\n if (this._selected.pageIdx !== -1) {\n // Ensure that the match will be scrolled into view.\n this._scrollMatches = true;\n\n this._updatePage(this._selected.pageIdx);\n }\n }\n\n _onFindBarClose(evt) {\n const pdfDocument = this._pdfDocument;\n // Since searching is asynchronous, ensure that the removal of highlighted\n // matches (from the UI) is async too such that the 'updatetextlayermatches'\n // events will always be dispatched in the expected order.\n this._firstPageCapability.promise.then(() => {\n // Only update the UI if the document is open, and is the current one.\n if (\n !this._pdfDocument ||\n (pdfDocument && this._pdfDocument !== pdfDocument)\n ) {\n return;\n }\n // Ensure that a pending, not yet started, search operation is aborted.\n if (this._findTimeout) {\n clearTimeout(this._findTimeout);\n this._findTimeout = null;\n }\n // Abort any long running searches, to avoid a match being scrolled into\n // view *after* the findbar has been closed. In this case `this._offset`\n // will most likely differ from `this._selected`, hence we also ensure\n // that any new search operation will always start with a clean slate.\n if (this._resumePageIdx) {\n this._resumePageIdx = null;\n this._dirtyMatch = true;\n }\n // Avoid the UI being in a pending state when the findbar is re-opened.\n this._updateUIState(FindState.FOUND);\n\n this._highlightMatches = false;\n this._updateAllPages(); // Wipe out any previously highlighted matches.\n });\n }\n\n _requestMatchesCount() {\n const { pageIdx, matchIdx } = this._selected;\n let current = 0,\n total = this._matchesCountTotal;\n if (matchIdx !== -1) {\n for (let i = 0; i < pageIdx; i++) {\n current += this._pageMatches[i]?.length || 0;\n }\n current += matchIdx + 1;\n }\n // When searching starts, this method may be called before the `pageMatches`\n // have been counted (in `_calculateMatch`). Ensure that the UI won't show\n // temporarily broken state when the active find result doesn't make sense.\n if (current < 1 || current > total) {\n current = total = 0;\n }\n return { current, total };\n }\n\n _updateUIResultsCount() {\n this._eventBus.dispatch(\"updatefindmatchescount\", {\n source: this,\n matchesCount: this._requestMatchesCount(),\n });\n }\n\n _updateUIState(state, previous) {\n this._eventBus.dispatch(\"updatefindcontrolstate\", {\n source: this,\n state,\n previous,\n matchesCount: this._requestMatchesCount(),\n rawQuery: this._state?.query ?? null,\n });\n }\n}\n\nexport { FindState, PDFFindController };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CharacterType = {\n SPACE: 0,\n ALPHA_LETTER: 1,\n PUNCT: 2,\n HAN_LETTER: 3,\n KATAKANA_LETTER: 4,\n HIRAGANA_LETTER: 5,\n HALFWIDTH_KATAKANA_LETTER: 6,\n THAI_LETTER: 7,\n};\n\nfunction isAlphabeticalScript(charCode) {\n return charCode < 0x2e80;\n}\n\nfunction isAscii(charCode) {\n return (charCode & 0xff80) === 0;\n}\n\nfunction isAsciiAlpha(charCode) {\n return (\n (charCode >= /* a = */ 0x61 && charCode <= /* z = */ 0x7a) ||\n (charCode >= /* A = */ 0x41 && charCode <= /* Z = */ 0x5a)\n );\n}\n\nfunction isAsciiDigit(charCode) {\n return charCode >= /* 0 = */ 0x30 && charCode <= /* 9 = */ 0x39;\n}\n\nfunction isAsciiSpace(charCode) {\n return (\n charCode === /* SPACE = */ 0x20 ||\n charCode === /* TAB = */ 0x09 ||\n charCode === /* CR = */ 0x0d ||\n charCode === /* LF = */ 0x0a\n );\n}\n\nfunction isHan(charCode) {\n return (\n (charCode >= 0x3400 && charCode <= 0x9fff) ||\n (charCode >= 0xf900 && charCode <= 0xfaff)\n );\n}\n\nfunction isKatakana(charCode) {\n return charCode >= 0x30a0 && charCode <= 0x30ff;\n}\n\nfunction isHiragana(charCode) {\n return charCode >= 0x3040 && charCode <= 0x309f;\n}\n\nfunction isHalfwidthKatakana(charCode) {\n return charCode >= 0xff60 && charCode <= 0xff9f;\n}\n\nfunction isThai(charCode) {\n return (charCode & 0xff80) === 0x0e00;\n}\n\n/**\n * This function is based on the word-break detection implemented in:\n * https://hg.mozilla.org/mozilla-central/file/tip/intl/lwbrk/WordBreaker.cpp\n */\nfunction getCharacterType(charCode) {\n if (isAlphabeticalScript(charCode)) {\n if (isAscii(charCode)) {\n if (isAsciiSpace(charCode)) {\n return CharacterType.SPACE;\n } else if (\n isAsciiAlpha(charCode) ||\n isAsciiDigit(charCode) ||\n charCode === /* UNDERSCORE = */ 0x5f\n ) {\n return CharacterType.ALPHA_LETTER;\n }\n return CharacterType.PUNCT;\n } else if (isThai(charCode)) {\n return CharacterType.THAI_LETTER;\n } else if (charCode === /* NBSP = */ 0xa0) {\n return CharacterType.SPACE;\n }\n return CharacterType.ALPHA_LETTER;\n }\n\n if (isHan(charCode)) {\n return CharacterType.HAN_LETTER;\n } else if (isKatakana(charCode)) {\n return CharacterType.KATAKANA_LETTER;\n } else if (isHiragana(charCode)) {\n return CharacterType.HIRAGANA_LETTER;\n } else if (isHalfwidthKatakana(charCode)) {\n return CharacterType.HALFWIDTH_KATAKANA_LETTER;\n }\n return CharacterType.ALPHA_LETTER;\n}\n\nexport { CharacterType, getCharacterType };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n isValidRotation,\n parseQueryString,\n PresentationModeState,\n waitOnEventOrTimeout,\n} from \"./ui_utils.js\";\n\n// Heuristic value used when force-resetting `this._blockHashChange`.\nconst HASH_CHANGE_TIMEOUT = 1000; // milliseconds\n// Heuristic value used when adding the current position to the browser history.\nconst POSITION_UPDATED_THRESHOLD = 50;\n// Heuristic value used when adding a temporary position to the browser history.\nconst UPDATE_VIEWAREA_TIMEOUT = 1000; // milliseconds\n\n/**\n * @typedef {Object} PDFHistoryOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} InitializeParameters\n * @property {string} fingerprint - The PDF document's unique fingerprint.\n * @property {boolean} [resetHistory] - Reset the browsing history.\n * @property {boolean} [updateUrl] - Attempt to update the document URL, with\n * the current hash, when pushing/replacing browser history entries.\n */\n\n/**\n * @typedef {Object} PushParameters\n * @property {string} [namedDest] - The named destination. If absent, a\n * stringified version of `explicitDest` is used.\n * @property {Array} explicitDest - The explicit destination array.\n * @property {number} pageNumber - The page to which the destination points.\n */\n\nfunction getCurrentHash() {\n return document.location.hash;\n}\n\nclass PDFHistory {\n /**\n * @param {PDFHistoryOptions} options\n */\n constructor({ linkService, eventBus }) {\n this.linkService = linkService;\n this.eventBus = eventBus;\n\n this._initialized = false;\n this._fingerprint = \"\";\n this.reset();\n\n this._boundEvents = null;\n this._isViewerInPresentationMode = false;\n // Ensure that we don't miss either a 'presentationmodechanged' or a\n // 'pagesinit' event, by registering the listeners immediately.\n this.eventBus._on(\"presentationmodechanged\", evt => {\n this._isViewerInPresentationMode =\n evt.state !== PresentationModeState.NORMAL;\n });\n this.eventBus._on(\"pagesinit\", () => {\n this._isPagesLoaded = false;\n\n this.eventBus._on(\n \"pagesloaded\",\n evt => {\n this._isPagesLoaded = !!evt.pagesCount;\n },\n { once: true }\n );\n });\n }\n\n /**\n * Initialize the history for the PDF document, using either the current\n * browser history entry or the document hash, whichever is present.\n * @param {InitializeParameters} params\n */\n initialize({ fingerprint, resetHistory = false, updateUrl = false }) {\n if (!fingerprint || typeof fingerprint !== \"string\") {\n console.error(\n 'PDFHistory.initialize: The \"fingerprint\" must be a non-empty string.'\n );\n return;\n }\n // Ensure that any old state is always reset upon initialization.\n if (this._initialized) {\n this.reset();\n }\n const reInitialized =\n this._fingerprint !== \"\" && this._fingerprint !== fingerprint;\n this._fingerprint = fingerprint;\n this._updateUrl = updateUrl === true;\n\n this._initialized = true;\n this._bindEvents();\n const state = window.history.state;\n\n this._popStateInProgress = false;\n this._blockHashChange = 0;\n this._currentHash = getCurrentHash();\n this._numPositionUpdates = 0;\n\n this._uid = this._maxUid = 0;\n this._destination = null;\n this._position = null;\n\n if (!this._isValidState(state, /* checkReload = */ true) || resetHistory) {\n const { hash, page, rotation } = this._parseCurrentHash(\n /* checkNameddest = */ true\n );\n\n if (!hash || reInitialized || resetHistory) {\n // Ensure that the browser history is reset on PDF document load.\n this._pushOrReplaceState(null, /* forceReplace = */ true);\n return;\n }\n // Ensure that the browser history is initialized correctly when\n // the document hash is present on PDF document load.\n this._pushOrReplaceState(\n { hash, page, rotation },\n /* forceReplace = */ true\n );\n return;\n }\n\n // The browser history contains a valid entry, ensure that the history is\n // initialized correctly on PDF document load.\n const destination = state.destination;\n this._updateInternalState(\n destination,\n state.uid,\n /* removeTemporary = */ true\n );\n\n if (destination.rotation !== undefined) {\n this._initialRotation = destination.rotation;\n }\n if (destination.dest) {\n this._initialBookmark = JSON.stringify(destination.dest);\n\n // If the history is updated, e.g. through the user changing the hash,\n // before the initial destination has become visible, then we do *not*\n // want to potentially add `this._position` to the browser history.\n this._destination.page = null;\n } else if (destination.hash) {\n this._initialBookmark = destination.hash;\n } else if (destination.page) {\n // Fallback case; shouldn't be necessary, but better safe than sorry.\n this._initialBookmark = `page=${destination.page}`;\n }\n }\n\n /**\n * Reset the current `PDFHistory` instance, and consequently prevent any\n * further updates and/or navigation of the browser history.\n */\n reset() {\n if (this._initialized) {\n this._pageHide(); // Simulate a 'pagehide' event when resetting.\n\n this._initialized = false;\n this._unbindEvents();\n }\n if (this._updateViewareaTimeout) {\n clearTimeout(this._updateViewareaTimeout);\n this._updateViewareaTimeout = null;\n }\n this._initialBookmark = null;\n this._initialRotation = null;\n }\n\n /**\n * Push an internal destination to the browser history.\n * @param {PushParameters}\n */\n push({ namedDest = null, explicitDest, pageNumber }) {\n if (!this._initialized) {\n return;\n }\n if (namedDest && typeof namedDest !== \"string\") {\n console.error(\n \"PDFHistory.push: \" +\n `\"${namedDest}\" is not a valid namedDest parameter.`\n );\n return;\n } else if (!Array.isArray(explicitDest)) {\n console.error(\n \"PDFHistory.push: \" +\n `\"${explicitDest}\" is not a valid explicitDest parameter.`\n );\n return;\n } else if (!this._isValidPage(pageNumber)) {\n // Allow an unset `pageNumber` if and only if the history is still empty;\n // please refer to the `this._destination.page = null;` comment above.\n if (pageNumber !== null || this._destination) {\n console.error(\n \"PDFHistory.push: \" +\n `\"${pageNumber}\" is not a valid pageNumber parameter.`\n );\n return;\n }\n }\n\n const hash = namedDest || JSON.stringify(explicitDest);\n if (!hash) {\n // The hash *should* never be undefined, but if that were to occur,\n // avoid any possible issues by not updating the browser history.\n return;\n }\n\n let forceReplace = false;\n if (\n this._destination &&\n (isDestHashesEqual(this._destination.hash, hash) ||\n isDestArraysEqual(this._destination.dest, explicitDest))\n ) {\n // When the new destination is identical to `this._destination`, and\n // its `page` is undefined, replace the current browser history entry.\n // NOTE: This can only occur if `this._destination` was set either:\n // - through the document hash being specified on load.\n // - through the user changing the hash of the document.\n if (this._destination.page) {\n return;\n }\n forceReplace = true;\n }\n if (this._popStateInProgress && !forceReplace) {\n return;\n }\n\n this._pushOrReplaceState(\n {\n dest: explicitDest,\n hash,\n page: pageNumber,\n rotation: this.linkService.rotation,\n },\n forceReplace\n );\n\n if (!this._popStateInProgress) {\n // Prevent the browser history from updating while the new destination is\n // being scrolled into view, to avoid potentially inconsistent state.\n this._popStateInProgress = true;\n // We defer the resetting of `this._popStateInProgress`, to account for\n // e.g. zooming occurring when the new destination is being navigated to.\n Promise.resolve().then(() => {\n this._popStateInProgress = false;\n });\n }\n }\n\n /**\n * Push a page to the browser history; generally the `push` method should be\n * used instead.\n * @param {number} pageNumber\n */\n pushPage(pageNumber) {\n if (!this._initialized) {\n return;\n }\n if (!this._isValidPage(pageNumber)) {\n console.error(\n `PDFHistory.pushPage: \"${pageNumber}\" is not a valid page number.`\n );\n return;\n }\n\n if (this._destination?.page === pageNumber) {\n // When the new page is identical to the one in `this._destination`, we\n // don't want to add a potential duplicate entry in the browser history.\n return;\n }\n if (this._popStateInProgress) {\n return;\n }\n\n this._pushOrReplaceState({\n // Simulate an internal destination, for `this._tryPushCurrentPosition`:\n dest: null,\n hash: `page=${pageNumber}`,\n page: pageNumber,\n rotation: this.linkService.rotation,\n });\n\n if (!this._popStateInProgress) {\n // Prevent the browser history from updating while the new page is\n // being scrolled into view, to avoid potentially inconsistent state.\n this._popStateInProgress = true;\n // We defer the resetting of `this._popStateInProgress`, to account for\n // e.g. zooming occurring when the new page is being navigated to.\n Promise.resolve().then(() => {\n this._popStateInProgress = false;\n });\n }\n }\n\n /**\n * Push the current position to the browser history.\n */\n pushCurrentPosition() {\n if (!this._initialized || this._popStateInProgress) {\n return;\n }\n this._tryPushCurrentPosition();\n }\n\n /**\n * Go back one step in the browser history.\n * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n */\n back() {\n if (!this._initialized || this._popStateInProgress) {\n return;\n }\n const state = window.history.state;\n if (this._isValidState(state) && state.uid > 0) {\n window.history.back();\n }\n }\n\n /**\n * Go forward one step in the browser history.\n * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n */\n forward() {\n if (!this._initialized || this._popStateInProgress) {\n return;\n }\n const state = window.history.state;\n if (this._isValidState(state) && state.uid < this._maxUid) {\n window.history.forward();\n }\n }\n\n /**\n * @type {boolean} Indicating if the user is currently moving through the\n * browser history, useful e.g. for skipping the next 'hashchange' event.\n */\n get popStateInProgress() {\n return (\n this._initialized &&\n (this._popStateInProgress || this._blockHashChange > 0)\n );\n }\n\n get initialBookmark() {\n return this._initialized ? this._initialBookmark : null;\n }\n\n get initialRotation() {\n return this._initialized ? this._initialRotation : null;\n }\n\n /**\n * @private\n */\n _pushOrReplaceState(destination, forceReplace = false) {\n const shouldReplace = forceReplace || !this._destination;\n const newState = {\n fingerprint: this._fingerprint,\n uid: shouldReplace ? this._uid : this._uid + 1,\n destination,\n };\n\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"CHROME\") &&\n window.history.state?.chromecomState\n ) {\n // history.state.chromecomState is managed by chromecom.js.\n newState.chromecomState = window.history.state.chromecomState;\n }\n this._updateInternalState(destination, newState.uid);\n\n let newUrl;\n if (this._updateUrl && destination?.hash) {\n const baseUrl = document.location.href.split(\"#\")[0];\n // Prevent errors in Firefox.\n if (!baseUrl.startsWith(\"file://\")) {\n newUrl = `${baseUrl}#${destination.hash}`;\n }\n }\n if (shouldReplace) {\n window.history.replaceState(newState, \"\", newUrl);\n } else {\n window.history.pushState(newState, \"\", newUrl);\n }\n\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"CHROME\") &&\n top === window\n ) {\n // eslint-disable-next-line no-undef\n chrome.runtime.sendMessage(\"showPageAction\");\n }\n }\n\n /**\n * @private\n */\n _tryPushCurrentPosition(temporary = false) {\n if (!this._position) {\n return;\n }\n let position = this._position;\n if (temporary) {\n position = Object.assign(Object.create(null), this._position);\n position.temporary = true;\n }\n\n if (!this._destination) {\n this._pushOrReplaceState(position);\n return;\n }\n if (this._destination.temporary) {\n // Always replace a previous *temporary* position.\n this._pushOrReplaceState(position, /* forceReplace = */ true);\n return;\n }\n if (this._destination.hash === position.hash) {\n return; // The current document position has not changed.\n }\n if (\n !this._destination.page &&\n (POSITION_UPDATED_THRESHOLD <= 0 ||\n this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)\n ) {\n // `this._destination` was set through the user changing the hash of\n // the document. Do not add `this._position` to the browser history,\n // to avoid \"flooding\" it with lots of (nearly) identical entries,\n // since we cannot ensure that the document position has changed.\n return;\n }\n\n let forceReplace = false;\n if (\n this._destination.page >= position.first &&\n this._destination.page <= position.page\n ) {\n // When the `page` of `this._destination` is still visible, do not\n // update the browsing history when `this._destination` either:\n // - contains an internal destination, since in this case we\n // cannot ensure that the document position has actually changed.\n // - was set through the user changing the hash of the document.\n if (this._destination.dest !== undefined || !this._destination.first) {\n return;\n }\n // To avoid \"flooding\" the browser history, replace the current entry.\n forceReplace = true;\n }\n this._pushOrReplaceState(position, forceReplace);\n }\n\n /**\n * @private\n */\n _isValidPage(val) {\n return (\n Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount\n );\n }\n\n /**\n * @private\n */\n _isValidState(state, checkReload = false) {\n if (!state) {\n return false;\n }\n if (state.fingerprint !== this._fingerprint) {\n if (checkReload) {\n // Potentially accept the history entry, even if the fingerprints don't\n // match, when the viewer was reloaded (see issue 6847).\n if (\n typeof state.fingerprint !== \"string\" ||\n state.fingerprint.length !== this._fingerprint.length\n ) {\n return false;\n }\n const [perfEntry] = performance.getEntriesByType(\"navigation\");\n if (perfEntry?.type !== \"reload\") {\n return false;\n }\n } else {\n // This should only occur in viewers with support for opening more than\n // one PDF document, e.g. the GENERIC viewer.\n return false;\n }\n }\n if (!Number.isInteger(state.uid) || state.uid < 0) {\n return false;\n }\n if (state.destination === null || typeof state.destination !== \"object\") {\n return false;\n }\n return true;\n }\n\n /**\n * @private\n */\n _updateInternalState(destination, uid, removeTemporary = false) {\n if (this._updateViewareaTimeout) {\n // When updating `this._destination`, make sure that we always wait for\n // the next 'updateviewarea' event before (potentially) attempting to\n // push the current position to the browser history.\n clearTimeout(this._updateViewareaTimeout);\n this._updateViewareaTimeout = null;\n }\n if (removeTemporary && destination?.temporary) {\n // When the `destination` comes from the browser history,\n // we no longer treat it as a *temporary* position.\n delete destination.temporary;\n }\n this._destination = destination;\n this._uid = uid;\n this._maxUid = Math.max(this._maxUid, uid);\n // This should always be reset when `this._destination` is updated.\n this._numPositionUpdates = 0;\n }\n\n /**\n * @private\n */\n _parseCurrentHash(checkNameddest = false) {\n const hash = unescape(getCurrentHash()).substring(1);\n const params = parseQueryString(hash);\n\n const nameddest = params.nameddest || \"\";\n let page = params.page | 0;\n\n if (!this._isValidPage(page) || (checkNameddest && nameddest.length > 0)) {\n page = null;\n }\n return { hash, page, rotation: this.linkService.rotation };\n }\n\n /**\n * @private\n */\n _updateViewarea({ location }) {\n if (this._updateViewareaTimeout) {\n clearTimeout(this._updateViewareaTimeout);\n this._updateViewareaTimeout = null;\n }\n\n this._position = {\n hash: this._isViewerInPresentationMode\n ? `page=${location.pageNumber}`\n : location.pdfOpenParams.substring(1),\n page: this.linkService.page,\n first: location.pageNumber,\n rotation: location.rotation,\n };\n\n if (this._popStateInProgress) {\n return;\n }\n\n if (\n POSITION_UPDATED_THRESHOLD > 0 &&\n this._isPagesLoaded &&\n this._destination &&\n !this._destination.page\n ) {\n // If the current destination was set through the user changing the hash\n // of the document, we will usually not try to push the current position\n // to the browser history; see `this._tryPushCurrentPosition()`.\n //\n // To prevent `this._tryPushCurrentPosition()` from effectively being\n // reduced to a no-op in this case, we will assume that the position\n // *did* in fact change if the 'updateviewarea' event was dispatched\n // more than `POSITION_UPDATED_THRESHOLD` times.\n this._numPositionUpdates++;\n }\n\n if (UPDATE_VIEWAREA_TIMEOUT > 0) {\n // When closing the browser, a 'pagehide' event will be dispatched which\n // *should* allow us to push the current position to the browser history.\n // In practice, it seems that the event is arriving too late in order for\n // the session history to be successfully updated.\n // (For additional details, please refer to the discussion in\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1153393.)\n //\n // To workaround this we attempt to *temporarily* add the current position\n // to the browser history only when the viewer is *idle*,\n // i.e. when scrolling and/or zooming does not occur.\n //\n // PLEASE NOTE: It's absolutely imperative that the browser history is\n // *not* updated too often, since that would render the viewer more or\n // less unusable. Hence the use of a timeout to delay the update until\n // the viewer has been idle for `UPDATE_VIEWAREA_TIMEOUT` milliseconds.\n this._updateViewareaTimeout = setTimeout(() => {\n if (!this._popStateInProgress) {\n this._tryPushCurrentPosition(/* temporary = */ true);\n }\n this._updateViewareaTimeout = null;\n }, UPDATE_VIEWAREA_TIMEOUT);\n }\n }\n\n /**\n * @private\n */\n _popState({ state }) {\n const newHash = getCurrentHash(),\n hashChanged = this._currentHash !== newHash;\n this._currentHash = newHash;\n\n if (\n (typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"CHROME\") &&\n state?.chromecomState &&\n !this._isValidState(state)) ||\n !state\n ) {\n // This case corresponds to the user changing the hash of the document.\n this._uid++;\n\n const { hash, page, rotation } = this._parseCurrentHash();\n this._pushOrReplaceState(\n { hash, page, rotation },\n /* forceReplace = */ true\n );\n return;\n }\n if (!this._isValidState(state)) {\n // This should only occur in viewers with support for opening more than\n // one PDF document, e.g. the GENERIC viewer.\n return;\n }\n\n // Prevent the browser history from updating until the new destination,\n // as stored in the browser history, has been scrolled into view.\n this._popStateInProgress = true;\n\n if (hashChanged) {\n // When the hash changed, implying that the 'popstate' event will be\n // followed by a 'hashchange' event, then we do *not* want to update the\n // browser history when handling the 'hashchange' event (in web/app.js)\n // since that would *overwrite* the new destination navigated to below.\n //\n // To avoid accidentally disabling all future user-initiated hash changes,\n // if there's e.g. another 'hashchange' listener that stops the event\n // propagation, we make sure to always force-reset `this._blockHashChange`\n // after `HASH_CHANGE_TIMEOUT` milliseconds have passed.\n this._blockHashChange++;\n waitOnEventOrTimeout({\n target: window,\n name: \"hashchange\",\n delay: HASH_CHANGE_TIMEOUT,\n }).then(() => {\n this._blockHashChange--;\n });\n }\n\n // Navigate to the new destination.\n const destination = state.destination;\n this._updateInternalState(\n destination,\n state.uid,\n /* removeTemporary = */ true\n );\n\n if (isValidRotation(destination.rotation)) {\n this.linkService.rotation = destination.rotation;\n }\n if (destination.dest) {\n this.linkService.goToDestination(destination.dest);\n } else if (destination.hash) {\n this.linkService.setHash(destination.hash);\n } else if (destination.page) {\n // Fallback case; shouldn't be necessary, but better safe than sorry.\n this.linkService.page = destination.page;\n }\n\n // Since `PDFLinkService.goToDestination` is asynchronous, we thus defer the\n // resetting of `this._popStateInProgress` slightly.\n Promise.resolve().then(() => {\n this._popStateInProgress = false;\n });\n }\n\n /**\n * @private\n */\n _pageHide() {\n // Attempt to push the `this._position` into the browser history when\n // navigating away from the document. This is *only* done if the history\n // is empty/temporary, since otherwise an existing browser history entry\n // will end up being overwritten (given that new entries cannot be pushed\n // into the browser history when the 'unload' event has already fired).\n if (!this._destination || this._destination.temporary) {\n this._tryPushCurrentPosition();\n }\n }\n\n /**\n * @private\n */\n _bindEvents() {\n if (this._boundEvents) {\n return; // The event listeners were already added.\n }\n this._boundEvents = {\n updateViewarea: this._updateViewarea.bind(this),\n popState: this._popState.bind(this),\n pageHide: this._pageHide.bind(this),\n };\n\n this.eventBus._on(\"updateviewarea\", this._boundEvents.updateViewarea);\n window.addEventListener(\"popstate\", this._boundEvents.popState);\n window.addEventListener(\"pagehide\", this._boundEvents.pageHide);\n }\n\n /**\n * @private\n */\n _unbindEvents() {\n if (!this._boundEvents) {\n return; // The event listeners were already removed.\n }\n this.eventBus._off(\"updateviewarea\", this._boundEvents.updateViewarea);\n window.removeEventListener(\"popstate\", this._boundEvents.popState);\n window.removeEventListener(\"pagehide\", this._boundEvents.pageHide);\n\n this._boundEvents = null;\n }\n}\n\nfunction isDestHashesEqual(destHash, pushHash) {\n if (typeof destHash !== \"string\" || typeof pushHash !== \"string\") {\n return false;\n }\n if (destHash === pushHash) {\n return true;\n }\n const { nameddest } = parseQueryString(destHash);\n if (nameddest === pushHash) {\n return true;\n }\n return false;\n}\n\nfunction isDestArraysEqual(firstDest, secondDest) {\n function isEntryEqual(first, second) {\n if (typeof first !== typeof second) {\n return false;\n }\n if (Array.isArray(first) || Array.isArray(second)) {\n return false;\n }\n if (first !== null && typeof first === \"object\" && second !== null) {\n if (Object.keys(first).length !== Object.keys(second).length) {\n return false;\n }\n for (const key in first) {\n if (!isEntryEqual(first[key], second[key])) {\n return false;\n }\n }\n return true;\n }\n return first === second || (Number.isNaN(first) && Number.isNaN(second));\n }\n\n if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {\n return false;\n }\n if (firstDest.length !== secondDest.length) {\n return false;\n }\n for (let i = 0, ii = firstDest.length; i < ii; i++) {\n if (!isEntryEqual(firstDest[i], secondDest[i])) {\n return false;\n }\n }\n return true;\n}\n\nexport { isDestArraysEqual, isDestHashesEqual, PDFHistory };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseTreeViewer } from \"./base_tree_viewer.js\";\n\n/**\n * @typedef {Object} PDFLayerViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {IL10n} l10n - Localization service.\n */\n\n/**\n * @typedef {Object} PDFLayerViewerRenderParameters\n * @property {OptionalContentConfig|null} optionalContentConfig - An\n * {OptionalContentConfig} instance.\n * @property {PDFDocument} pdfDocument - A {PDFDocument} instance.\n */\n\nclass PDFLayerViewer extends BaseTreeViewer {\n constructor(options) {\n super(options);\n this.l10n = options.l10n;\n\n this.eventBus._on(\"resetlayers\", this._resetLayers.bind(this));\n this.eventBus._on(\"togglelayerstree\", this._toggleAllTreeItems.bind(this));\n }\n\n reset() {\n super.reset();\n this._optionalContentConfig = null;\n }\n\n /**\n * @private\n */\n _dispatchEvent(layersCount) {\n this.eventBus.dispatch(\"layersloaded\", {\n source: this,\n layersCount,\n });\n }\n\n /**\n * @private\n */\n _bindLink(element, { groupId, input }) {\n const setVisibility = () => {\n this._optionalContentConfig.setVisibility(groupId, input.checked);\n\n this.eventBus.dispatch(\"optionalcontentconfig\", {\n source: this,\n promise: Promise.resolve(this._optionalContentConfig),\n });\n };\n\n element.onclick = evt => {\n if (evt.target === input) {\n setVisibility();\n return true;\n } else if (evt.target !== element) {\n return true; // The target is the \"label\", which is handled above.\n }\n input.checked = !input.checked;\n setVisibility();\n return false;\n };\n }\n\n /**\n * @private\n */\n async _setNestedName(element, { name = null }) {\n if (typeof name === \"string\") {\n element.textContent = this._normalizeTextContent(name);\n return;\n }\n element.textContent = await this.l10n.get(\"additional_layers\");\n element.style.fontStyle = \"italic\";\n }\n\n /**\n * @private\n */\n _addToggleButton(div, { name = null }) {\n super._addToggleButton(div, /* hidden = */ name === null);\n }\n\n /**\n * @private\n */\n _toggleAllTreeItems() {\n if (!this._optionalContentConfig) {\n return;\n }\n super._toggleAllTreeItems();\n }\n\n /**\n * @param {PDFLayerViewerRenderParameters} params\n */\n render({ optionalContentConfig, pdfDocument }) {\n if (this._optionalContentConfig) {\n this.reset();\n }\n this._optionalContentConfig = optionalContentConfig || null;\n this._pdfDocument = pdfDocument || null;\n\n const groups = optionalContentConfig?.getOrder();\n if (!groups) {\n this._dispatchEvent(/* layersCount = */ 0);\n return;\n }\n\n const fragment = document.createDocumentFragment(),\n queue = [{ parent: fragment, groups }];\n let layersCount = 0,\n hasAnyNesting = false;\n while (queue.length > 0) {\n const levelData = queue.shift();\n for (const groupId of levelData.groups) {\n const div = document.createElement(\"div\");\n div.className = \"treeItem\";\n\n const element = document.createElement(\"a\");\n div.appendChild(element);\n\n if (typeof groupId === \"object\") {\n hasAnyNesting = true;\n this._addToggleButton(div, groupId);\n this._setNestedName(element, groupId);\n\n const itemsDiv = document.createElement(\"div\");\n itemsDiv.className = \"treeItems\";\n div.appendChild(itemsDiv);\n\n queue.push({ parent: itemsDiv, groups: groupId.order });\n } else {\n const group = optionalContentConfig.getGroup(groupId);\n\n const input = document.createElement(\"input\");\n this._bindLink(element, { groupId, input });\n input.type = \"checkbox\";\n input.id = groupId;\n input.checked = group.visible;\n\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", groupId);\n label.textContent = this._normalizeTextContent(group.name);\n\n element.appendChild(input);\n element.appendChild(label);\n\n layersCount++;\n }\n\n levelData.parent.appendChild(div);\n }\n }\n\n this._finishRendering(fragment, layersCount, hasAnyNesting);\n }\n\n /**\n * @private\n */\n async _resetLayers() {\n if (!this._optionalContentConfig) {\n return;\n }\n // Fetch the default optional content configuration...\n const optionalContentConfig =\n await this._pdfDocument.getOptionalContentConfig();\n\n this.eventBus.dispatch(\"optionalcontentconfig\", {\n source: this,\n promise: Promise.resolve(optionalContentConfig),\n });\n\n // ... and reset the sidebarView to the default state.\n this.render({\n optionalContentConfig,\n pdfDocument: this._pdfDocument,\n });\n }\n}\n\nexport { PDFLayerViewer };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { parseQueryString } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n * for external links. Must use one of the values from {LinkTarget}.\n * Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n * external links. Defaults to stripping the referrer.\n * @property {boolean} [ignoreDestinationZoom] - Ignores the zoom argument,\n * thus preserving the current zoom level in the viewer, when navigating\n * to internal destinations. The default value is `false`.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nclass PDFLinkService {\n /**\n * @param {PDFLinkServiceOptions} options\n */\n constructor({\n eventBus,\n externalLinkTarget = null,\n externalLinkRel = null,\n ignoreDestinationZoom = false,\n } = {}) {\n this.eventBus = eventBus;\n this.externalLinkTarget = externalLinkTarget;\n this.externalLinkRel = externalLinkRel;\n this.externalLinkEnabled = true;\n this._ignoreDestinationZoom = ignoreDestinationZoom;\n\n this.baseUrl = null;\n this.pdfDocument = null;\n this.pdfViewer = null;\n this.pdfHistory = null;\n\n this._pagesRefCache = null;\n }\n\n setDocument(pdfDocument, baseUrl = null) {\n this.baseUrl = baseUrl;\n this.pdfDocument = pdfDocument;\n this._pagesRefCache = Object.create(null);\n }\n\n setViewer(pdfViewer) {\n this.pdfViewer = pdfViewer;\n }\n\n setHistory(pdfHistory) {\n this.pdfHistory = pdfHistory;\n }\n\n /**\n * @type {number}\n */\n get pagesCount() {\n return this.pdfDocument ? this.pdfDocument.numPages : 0;\n }\n\n /**\n * @type {number}\n */\n get page() {\n return this.pdfViewer.currentPageNumber;\n }\n\n /**\n * @param {number} value\n */\n set page(value) {\n this.pdfViewer.currentPageNumber = value;\n }\n\n /**\n * @type {number}\n */\n get rotation() {\n return this.pdfViewer.pagesRotation;\n }\n\n /**\n * @param {number} value\n */\n set rotation(value) {\n this.pdfViewer.pagesRotation = value;\n }\n\n /**\n * @private\n */\n _goToDestinationHelper(rawDest, namedDest = null, explicitDest) {\n // Dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>\n const destRef = explicitDest[0];\n let pageNumber;\n\n if (typeof destRef === \"object\" && destRef !== null) {\n pageNumber = this._cachedPageNumber(destRef);\n\n if (pageNumber === null) {\n // Fetch the page reference if it's not yet available. This could\n // only occur during loading, before all pages have been resolved.\n this.pdfDocument\n .getPageIndex(destRef)\n .then(pageIndex => {\n this.cachePageRef(pageIndex + 1, destRef);\n this._goToDestinationHelper(rawDest, namedDest, explicitDest);\n })\n .catch(() => {\n console.error(\n `PDFLinkService._goToDestinationHelper: \"${destRef}\" is not ` +\n `a valid page reference, for dest=\"${rawDest}\".`\n );\n });\n return;\n }\n } else if (Number.isInteger(destRef)) {\n pageNumber = destRef + 1;\n } else {\n console.error(\n `PDFLinkService._goToDestinationHelper: \"${destRef}\" is not ` +\n `a valid destination reference, for dest=\"${rawDest}\".`\n );\n return;\n }\n if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n console.error(\n `PDFLinkService._goToDestinationHelper: \"${pageNumber}\" is not ` +\n `a valid page number, for dest=\"${rawDest}\".`\n );\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new destination into\n // view, to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.push({ namedDest, explicitDest, pageNumber });\n }\n\n this.pdfViewer.scrollPageIntoView({\n pageNumber,\n destArray: explicitDest,\n ignoreDestinationZoom: this._ignoreDestinationZoom,\n });\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {string|Array} dest - The named, or explicit, PDF destination.\n */\n async goToDestination(dest) {\n if (!this.pdfDocument) {\n return;\n }\n let namedDest, explicitDest;\n if (typeof dest === \"string\") {\n namedDest = dest;\n explicitDest = await this.pdfDocument.getDestination(dest);\n } else {\n namedDest = null;\n explicitDest = await dest;\n }\n if (!Array.isArray(explicitDest)) {\n console.error(\n `PDFLinkService.goToDestination: \"${explicitDest}\" is not ` +\n `a valid destination array, for dest=\"${dest}\".`\n );\n return;\n }\n this._goToDestinationHelper(dest, namedDest, explicitDest);\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {number|string} val - The page number, or page label.\n */\n goToPage(val) {\n if (!this.pdfDocument) {\n return;\n }\n const pageNumber =\n (typeof val === \"string\" && this.pdfViewer.pageLabelToPageNumber(val)) ||\n val | 0;\n if (\n !(\n Number.isInteger(pageNumber) &&\n pageNumber > 0 &&\n pageNumber <= this.pagesCount\n )\n ) {\n console.error(`PDFLinkService.goToPage: \"${val}\" is not a valid page.`);\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new page into view,\n // to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.pushPage(pageNumber);\n }\n\n this.pdfViewer.scrollPageIntoView({ pageNumber });\n }\n\n /**\n * @param {string|Array} dest - The PDF destination object.\n * @returns {string} The hyperlink to the PDF object.\n */\n getDestinationHash(dest) {\n if (typeof dest === \"string\") {\n if (dest.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(dest));\n }\n } else if (Array.isArray(dest)) {\n const str = JSON.stringify(dest);\n if (str.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(str));\n }\n }\n return this.getAnchorUrl(\"\");\n }\n\n /**\n * Prefix the full url on anchor links to make sure that links are resolved\n * relative to the current URL instead of the one defined in <base href>.\n * @param {string} anchor - The anchor hash, including the #.\n * @returns {string} The hyperlink to the PDF object.\n */\n getAnchorUrl(anchor) {\n return (this.baseUrl || \"\") + anchor;\n }\n\n /**\n * @param {string} hash\n */\n setHash(hash) {\n if (!this.pdfDocument) {\n return;\n }\n let pageNumber, dest;\n if (hash.includes(\"=\")) {\n const params = parseQueryString(hash);\n if (\"search\" in params) {\n this.eventBus.dispatch(\"findfromurlhash\", {\n source: this,\n query: params.search.replace(/\"/g, \"\"),\n phraseSearch: params.phrase === \"true\",\n });\n }\n // borrowing syntax from \"Parameters for Opening PDF Files\"\n if (\"page\" in params) {\n pageNumber = params.page | 0 || 1;\n }\n if (\"zoom\" in params) {\n // Build the destination array.\n const zoomArgs = params.zoom.split(\",\"); // scale,left,top\n const zoomArg = zoomArgs[0];\n const zoomArgNumber = parseFloat(zoomArg);\n\n if (!zoomArg.includes(\"Fit\")) {\n // If the zoomArg is a number, it has to get divided by 100. If it's\n // a string, it should stay as it is.\n dest = [\n null,\n { name: \"XYZ\" },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n zoomArgs.length > 2 ? zoomArgs[2] | 0 : null,\n zoomArgNumber ? zoomArgNumber / 100 : zoomArg,\n ];\n } else {\n if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n dest = [null, { name: zoomArg }];\n } else if (\n zoomArg === \"FitH\" ||\n zoomArg === \"FitBH\" ||\n zoomArg === \"FitV\" ||\n zoomArg === \"FitBV\"\n ) {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n ];\n } else if (zoomArg === \"FitR\") {\n if (zoomArgs.length !== 5) {\n console.error(\n 'PDFLinkService.setHash: Not enough parameters for \"FitR\".'\n );\n } else {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs[1] | 0,\n zoomArgs[2] | 0,\n zoomArgs[3] | 0,\n zoomArgs[4] | 0,\n ];\n }\n } else {\n console.error(\n `PDFLinkService.setHash: \"${zoomArg}\" is not ` +\n \"a valid zoom value.\"\n );\n }\n }\n }\n if (dest) {\n this.pdfViewer.scrollPageIntoView({\n pageNumber: pageNumber || this.page,\n destArray: dest,\n allowNegativeOffset: true,\n });\n } else if (pageNumber) {\n this.page = pageNumber; // simple page\n }\n if (\"pagemode\" in params) {\n this.eventBus.dispatch(\"pagemode\", {\n source: this,\n mode: params.pagemode,\n });\n }\n // Ensure that this parameter is *always* handled last, in order to\n // guarantee that it won't be overridden (e.g. by the \"page\" parameter).\n if (\"nameddest\" in params) {\n this.goToDestination(params.nameddest);\n }\n } else {\n // Named (or explicit) destination.\n dest = unescape(hash);\n try {\n dest = JSON.parse(dest);\n\n if (!Array.isArray(dest)) {\n // Avoid incorrectly rejecting a valid named destination, such as\n // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n dest = dest.toString();\n }\n } catch (ex) {}\n\n if (typeof dest === \"string\" || isValidExplicitDestination(dest)) {\n this.goToDestination(dest);\n return;\n }\n console.error(\n `PDFLinkService.setHash: \"${unescape(hash)}\" is not ` +\n \"a valid destination.\"\n );\n }\n }\n\n /**\n * @param {string} action\n */\n executeNamedAction(action) {\n // See PDF reference, table 8.45 - Named action\n switch (action) {\n case \"GoBack\":\n if (this.pdfHistory) {\n this.pdfHistory.back();\n }\n break;\n\n case \"GoForward\":\n if (this.pdfHistory) {\n this.pdfHistory.forward();\n }\n break;\n\n case \"NextPage\":\n this.pdfViewer.nextPage();\n break;\n\n case \"PrevPage\":\n this.pdfViewer.previousPage();\n break;\n\n case \"LastPage\":\n this.page = this.pagesCount;\n break;\n\n case \"FirstPage\":\n this.page = 1;\n break;\n\n default:\n break; // No action according to spec\n }\n\n this.eventBus.dispatch(\"namedaction\", {\n source: this,\n action,\n });\n }\n\n /**\n * @param {number} pageNum - page number.\n * @param {Object} pageRef - reference to the page.\n */\n cachePageRef(pageNum, pageRef) {\n if (!pageRef) {\n return;\n }\n const refStr =\n pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;\n this._pagesRefCache[refStr] = pageNum;\n }\n\n /**\n * @private\n */\n _cachedPageNumber(pageRef) {\n const refStr =\n pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;\n return this._pagesRefCache?.[refStr] || null;\n }\n\n /**\n * @param {number} pageNumber\n */\n isPageVisible(pageNumber) {\n return this.pdfViewer.isPageVisible(pageNumber);\n }\n\n /**\n * @param {number} pageNumber\n */\n isPageCached(pageNumber) {\n return this.pdfViewer.isPageCached(pageNumber);\n }\n}\n\nfunction isValidExplicitDestination(dest) {\n if (!Array.isArray(dest)) {\n return false;\n }\n const destLength = dest.length;\n if (destLength < 2) {\n return false;\n }\n const page = dest[0];\n if (\n !(\n typeof page === \"object\" &&\n Number.isInteger(page.num) &&\n Number.isInteger(page.gen)\n ) &&\n !(Number.isInteger(page) && page >= 0)\n ) {\n return false;\n }\n const zoom = dest[1];\n if (!(typeof zoom === \"object\" && typeof zoom.name === \"string\")) {\n return false;\n }\n let allowNull = true;\n switch (zoom.name) {\n case \"XYZ\":\n if (destLength !== 5) {\n return false;\n }\n break;\n case \"Fit\":\n case \"FitB\":\n return destLength === 2;\n case \"FitH\":\n case \"FitBH\":\n case \"FitV\":\n case \"FitBV\":\n if (destLength !== 3) {\n return false;\n }\n break;\n case \"FitR\":\n if (destLength !== 6) {\n return false;\n }\n allowNull = false;\n break;\n default:\n return false;\n }\n for (let i = 2; i < destLength; i++) {\n const param = dest[i];\n if (!(typeof param === \"number\" || (allowNull && param === null))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * @implements {IPDFLinkService}\n */\nclass SimpleLinkService {\n constructor() {\n this.externalLinkTarget = null;\n this.externalLinkRel = null;\n this.externalLinkEnabled = true;\n this._ignoreDestinationZoom = false;\n }\n\n /**\n * @type {number}\n */\n get pagesCount() {\n return 0;\n }\n\n /**\n * @type {number}\n */\n get page() {\n return 0;\n }\n\n /**\n * @param {number} value\n */\n set page(value) {}\n\n /**\n * @type {number}\n */\n get rotation() {\n return 0;\n }\n\n /**\n * @param {number} value\n */\n set rotation(value) {}\n\n /**\n * @param {string|Array} dest - The named, or explicit, PDF destination.\n */\n async goToDestination(dest) {}\n\n /**\n * @param {number|string} val - The page number, or page label.\n */\n goToPage(val) {}\n\n /**\n * @param dest - The PDF destination object.\n * @returns {string} The hyperlink to the PDF object.\n */\n getDestinationHash(dest) {\n return \"#\";\n }\n\n /**\n * @param hash - The PDF parameters/hash.\n * @returns {string} The hyperlink to the PDF object.\n */\n getAnchorUrl(hash) {\n return \"#\";\n }\n\n /**\n * @param {string} hash\n */\n setHash(hash) {}\n\n /**\n * @param {string} action\n */\n executeNamedAction(action) {}\n\n /**\n * @param {number} pageNum - page number.\n * @param {Object} pageRef - reference to the page.\n */\n cachePageRef(pageNum, pageRef) {}\n\n /**\n * @param {number} pageNumber\n */\n isPageVisible(pageNumber) {\n return true;\n }\n\n /**\n * @param {number} pageNumber\n */\n isPageCached(pageNumber) {\n return true;\n }\n}\n\nexport { PDFLinkService, SimpleLinkService };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n addLinkAttributes,\n createPromiseCapability,\n LinkTarget,\n} from \"pdfjs-lib\";\nimport { BaseTreeViewer } from \"./base_tree_viewer.js\";\nimport { SidebarView } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} PDFOutlineViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} PDFOutlineViewerRenderParameters\n * @property {Array|null} outline - An array of outline objects.\n * @property {PDFDocument} pdfDocument - A {PDFDocument} instance.\n */\n\nclass PDFOutlineViewer extends BaseTreeViewer {\n /**\n * @param {PDFOutlineViewerOptions} options\n */\n constructor(options) {\n super(options);\n this.linkService = options.linkService;\n\n this.eventBus._on(\"toggleoutlinetree\", this._toggleAllTreeItems.bind(this));\n this.eventBus._on(\n \"currentoutlineitem\",\n this._currentOutlineItem.bind(this)\n );\n\n this.eventBus._on(\"pagechanging\", evt => {\n this._currentPageNumber = evt.pageNumber;\n });\n this.eventBus._on(\"pagesloaded\", evt => {\n this._isPagesLoaded = !!evt.pagesCount;\n\n // If the capability is still pending, see the `_dispatchEvent`-method,\n // we know that the `currentOutlineItem`-button can be enabled here.\n if (\n this._currentOutlineItemCapability &&\n !this._currentOutlineItemCapability.settled\n ) {\n this._currentOutlineItemCapability.resolve(\n /* enabled = */ this._isPagesLoaded\n );\n }\n });\n this.eventBus._on(\"sidebarviewchanged\", evt => {\n this._sidebarView = evt.view;\n });\n }\n\n reset() {\n super.reset();\n this._outline = null;\n\n this._pageNumberToDestHashCapability = null;\n this._currentPageNumber = 1;\n this._isPagesLoaded = false;\n\n if (\n this._currentOutlineItemCapability &&\n !this._currentOutlineItemCapability.settled\n ) {\n this._currentOutlineItemCapability.resolve(/* enabled = */ false);\n }\n this._currentOutlineItemCapability = null;\n }\n\n /**\n * @private\n */\n _dispatchEvent(outlineCount) {\n this._currentOutlineItemCapability = createPromiseCapability();\n if (\n outlineCount === 0 ||\n this._pdfDocument?.loadingParams.disableAutoFetch\n ) {\n this._currentOutlineItemCapability.resolve(/* enabled = */ false);\n } else if (this._isPagesLoaded) {\n this._currentOutlineItemCapability.resolve(/* enabled = */ true);\n }\n\n this.eventBus.dispatch(\"outlineloaded\", {\n source: this,\n outlineCount,\n currentOutlineItemPromise: this._currentOutlineItemCapability.promise,\n });\n }\n\n /**\n * @private\n */\n _bindLink(element, { url, newWindow, dest }) {\n const { linkService } = this;\n\n if (url) {\n addLinkAttributes(element, {\n url,\n target: newWindow ? LinkTarget.BLANK : linkService.externalLinkTarget,\n rel: linkService.externalLinkRel,\n enabled: linkService.externalLinkEnabled,\n });\n return;\n }\n\n element.href = linkService.getDestinationHash(dest);\n element.onclick = evt => {\n this._updateCurrentTreeItem(evt.target.parentNode);\n\n if (dest) {\n linkService.goToDestination(dest);\n }\n return false;\n };\n }\n\n /**\n * @private\n */\n _setStyles(element, { bold, italic }) {\n if (bold) {\n element.style.fontWeight = \"bold\";\n }\n if (italic) {\n element.style.fontStyle = \"italic\";\n }\n }\n\n /**\n * @private\n */\n _addToggleButton(div, { count, items }) {\n let hidden = false;\n if (count < 0) {\n let totalCount = items.length;\n if (totalCount > 0) {\n const queue = [...items];\n while (queue.length > 0) {\n const { count: nestedCount, items: nestedItems } = queue.shift();\n if (nestedCount > 0 && nestedItems.length > 0) {\n totalCount += nestedItems.length;\n queue.push(...nestedItems);\n }\n }\n }\n if (Math.abs(count) === totalCount) {\n hidden = true;\n }\n }\n super._addToggleButton(div, hidden);\n }\n\n /**\n * @private\n */\n _toggleAllTreeItems() {\n if (!this._outline) {\n return;\n }\n super._toggleAllTreeItems();\n }\n\n /**\n * @param {PDFOutlineViewerRenderParameters} params\n */\n render({ outline, pdfDocument }) {\n if (this._outline) {\n this.reset();\n }\n this._outline = outline || null;\n this._pdfDocument = pdfDocument || null;\n\n if (!outline) {\n this._dispatchEvent(/* outlineCount = */ 0);\n return;\n }\n\n const fragment = document.createDocumentFragment();\n const queue = [{ parent: fragment, items: outline }];\n let outlineCount = 0,\n hasAnyNesting = false;\n while (queue.length > 0) {\n const levelData = queue.shift();\n for (const item of levelData.items) {\n const div = document.createElement(\"div\");\n div.className = \"treeItem\";\n\n const element = document.createElement(\"a\");\n this._bindLink(element, item);\n this._setStyles(element, item);\n element.textContent = this._normalizeTextContent(item.title);\n\n div.appendChild(element);\n\n if (item.items.length > 0) {\n hasAnyNesting = true;\n this._addToggleButton(div, item);\n\n const itemsDiv = document.createElement(\"div\");\n itemsDiv.className = \"treeItems\";\n div.appendChild(itemsDiv);\n\n queue.push({ parent: itemsDiv, items: item.items });\n }\n\n levelData.parent.appendChild(div);\n outlineCount++;\n }\n }\n\n this._finishRendering(fragment, outlineCount, hasAnyNesting);\n }\n\n /**\n * Find/highlight the current outline item, corresponding to the active page.\n * @private\n */\n async _currentOutlineItem() {\n if (!this._isPagesLoaded) {\n throw new Error(\"_currentOutlineItem: All pages have not been loaded.\");\n }\n if (!this._outline || !this._pdfDocument) {\n return;\n }\n\n const pageNumberToDestHash = await this._getPageNumberToDestHash(\n this._pdfDocument\n );\n if (!pageNumberToDestHash) {\n return;\n }\n this._updateCurrentTreeItem(/* treeItem = */ null);\n\n if (this._sidebarView !== SidebarView.OUTLINE) {\n return; // The outline view is no longer visible, hence do nothing.\n }\n // When there is no destination on the current page, always check the\n // previous ones in (reverse) order.\n for (let i = this._currentPageNumber; i > 0; i--) {\n const destHash = pageNumberToDestHash.get(i);\n if (!destHash) {\n continue;\n }\n const linkElement = this.container.querySelector(`a[href=\"${destHash}\"]`);\n if (!linkElement) {\n continue;\n }\n this._scrollToCurrentTreeItem(linkElement.parentNode);\n break;\n }\n }\n\n /**\n * To (significantly) simplify the overall implementation, we will only\n * consider *one* destination per page when finding/highlighting the current\n * outline item (similar to e.g. Adobe Reader); more specifically, we choose\n * the *first* outline item at the *lowest* level of the outline tree.\n * @private\n */\n async _getPageNumberToDestHash(pdfDocument) {\n if (this._pageNumberToDestHashCapability) {\n return this._pageNumberToDestHashCapability.promise;\n }\n this._pageNumberToDestHashCapability = createPromiseCapability();\n\n const pageNumberToDestHash = new Map(),\n pageNumberNesting = new Map();\n const queue = [{ nesting: 0, items: this._outline }];\n while (queue.length > 0) {\n const levelData = queue.shift(),\n currentNesting = levelData.nesting;\n for (const { dest, items } of levelData.items) {\n let explicitDest, pageNumber;\n if (typeof dest === \"string\") {\n explicitDest = await pdfDocument.getDestination(dest);\n\n if (pdfDocument !== this._pdfDocument) {\n return null; // The document was closed while the data resolved.\n }\n } else {\n explicitDest = dest;\n }\n if (Array.isArray(explicitDest)) {\n const [destRef] = explicitDest;\n\n if (typeof destRef === \"object\" && destRef !== null) {\n pageNumber = this.linkService._cachedPageNumber(destRef);\n\n if (!pageNumber) {\n try {\n pageNumber = (await pdfDocument.getPageIndex(destRef)) + 1;\n\n if (pdfDocument !== this._pdfDocument) {\n return null; // The document was closed while the data resolved.\n }\n this.linkService.cachePageRef(pageNumber, destRef);\n } catch (ex) {\n // Invalid page reference, ignore it and continue parsing.\n }\n }\n } else if (Number.isInteger(destRef)) {\n pageNumber = destRef + 1;\n }\n\n if (\n Number.isInteger(pageNumber) &&\n (!pageNumberToDestHash.has(pageNumber) ||\n currentNesting > pageNumberNesting.get(pageNumber))\n ) {\n const destHash = this.linkService.getDestinationHash(dest);\n pageNumberToDestHash.set(pageNumber, destHash);\n pageNumberNesting.set(pageNumber, currentNesting);\n }\n }\n\n if (items.length > 0) {\n queue.push({ nesting: currentNesting + 1, items });\n }\n }\n }\n\n this._pageNumberToDestHashCapability.resolve(\n pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null\n );\n return this._pageNumberToDestHashCapability.promise;\n }\n}\n\nexport { PDFOutlineViewer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { normalizeWheelEventDelta, PresentationModeState } from \"./ui_utils.js\";\n\nconst DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; // in ms\nconst DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms\nconst ACTIVE_SELECTOR = \"pdfPresentationMode\";\nconst CONTROLS_SELECTOR = \"pdfPresentationModeControls\";\nconst MOUSE_SCROLL_COOLDOWN_TIME = 50; // in ms\nconst PAGE_SWITCH_THRESHOLD = 0.1;\n\n// Number of CSS pixels for a movement to count as a swipe.\nconst SWIPE_MIN_DISTANCE_THRESHOLD = 50;\n\n// Swipe angle deviation from the x or y axis before it is not\n// considered a swipe in that direction any more.\nconst SWIPE_ANGLE_THRESHOLD = Math.PI / 6;\n\n/**\n * @typedef {Object} PDFPresentationModeOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {PDFViewer} pdfViewer - The document viewer.\n * @property {EventBus} eventBus - The application event bus.\n */\n\nclass PDFPresentationMode {\n /**\n * @param {PDFPresentationModeOptions} options\n */\n constructor({ container, pdfViewer, eventBus }) {\n this.container = container;\n this.pdfViewer = pdfViewer;\n this.eventBus = eventBus;\n\n this.active = false;\n this.args = null;\n this.contextMenuOpen = false;\n this.mouseScrollTimeStamp = 0;\n this.mouseScrollDelta = 0;\n this.touchSwipeState = null;\n }\n\n /**\n * Request the browser to enter fullscreen mode.\n * @returns {boolean} Indicating if the request was successful.\n */\n request() {\n if (this.switchInProgress || this.active || !this.pdfViewer.pagesCount) {\n return false;\n }\n this._addFullscreenChangeListeners();\n this._setSwitchInProgress();\n this._notifyStateChange();\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n if (this.container.requestFullscreen) {\n this.container.requestFullscreen();\n } else {\n return false;\n }\n } else {\n if (this.container.requestFullscreen) {\n this.container.requestFullscreen();\n } else if (this.container.mozRequestFullScreen) {\n this.container.mozRequestFullScreen();\n } else if (this.container.webkitRequestFullscreen) {\n this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n } else {\n return false;\n }\n }\n\n this.args = {\n page: this.pdfViewer.currentPageNumber,\n previousScale: this.pdfViewer.currentScaleValue,\n };\n\n return true;\n }\n\n /**\n * @private\n */\n _mouseWheel(evt) {\n if (!this.active) {\n return;\n }\n\n evt.preventDefault();\n\n const delta = normalizeWheelEventDelta(evt);\n const currentTime = Date.now();\n const storedTime = this.mouseScrollTimeStamp;\n\n // If we've already switched page, avoid accidentally switching again.\n if (\n currentTime > storedTime &&\n currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME\n ) {\n return;\n }\n // If the scroll direction changed, reset the accumulated scroll delta.\n if (\n (this.mouseScrollDelta > 0 && delta < 0) ||\n (this.mouseScrollDelta < 0 && delta > 0)\n ) {\n this._resetMouseScrollState();\n }\n this.mouseScrollDelta += delta;\n\n if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\n const totalDelta = this.mouseScrollDelta;\n this._resetMouseScrollState();\n const success =\n totalDelta > 0\n ? this.pdfViewer.previousPage()\n : this.pdfViewer.nextPage();\n if (success) {\n this.mouseScrollTimeStamp = currentTime;\n }\n }\n }\n\n get isFullscreen() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return !!document.fullscreenElement;\n }\n return !!(\n document.fullscreenElement ||\n document.mozFullScreen ||\n document.webkitIsFullScreen\n );\n }\n\n /**\n * @private\n */\n _notifyStateChange() {\n let state = PresentationModeState.NORMAL;\n if (this.switchInProgress) {\n state = PresentationModeState.CHANGING;\n } else if (this.active) {\n state = PresentationModeState.FULLSCREEN;\n }\n this.eventBus.dispatch(\"presentationmodechanged\", {\n source: this,\n state,\n });\n }\n\n /**\n * Used to initialize a timeout when requesting Presentation Mode,\n * i.e. when the browser is requested to enter fullscreen mode.\n * This timeout is used to prevent the current page from being scrolled\n * partially, or completely, out of view when entering Presentation Mode.\n * NOTE: This issue seems limited to certain zoom levels (e.g. page-width).\n *\n * @private\n */\n _setSwitchInProgress() {\n if (this.switchInProgress) {\n clearTimeout(this.switchInProgress);\n }\n this.switchInProgress = setTimeout(() => {\n this._removeFullscreenChangeListeners();\n delete this.switchInProgress;\n this._notifyStateChange();\n }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\n }\n\n /**\n * @private\n */\n _resetSwitchInProgress() {\n if (this.switchInProgress) {\n clearTimeout(this.switchInProgress);\n delete this.switchInProgress;\n }\n }\n\n /**\n * @private\n */\n _enter() {\n this.active = true;\n this._resetSwitchInProgress();\n this._notifyStateChange();\n this.container.classList.add(ACTIVE_SELECTOR);\n\n // Ensure that the correct page is scrolled into view when entering\n // Presentation Mode, by waiting until fullscreen mode in enabled.\n setTimeout(() => {\n this.pdfViewer.currentPageNumber = this.args.page;\n this.pdfViewer.currentScaleValue = \"page-fit\";\n }, 0);\n\n this._addWindowListeners();\n this._showControls();\n this.contextMenuOpen = false;\n\n // Text selection is disabled in Presentation Mode, thus it's not possible\n // for the user to deselect text that is selected (e.g. with \"Select all\")\n // when entering Presentation Mode, hence we remove any active selection.\n window.getSelection().removeAllRanges();\n }\n\n /**\n * @private\n */\n _exit() {\n const page = this.pdfViewer.currentPageNumber;\n this.container.classList.remove(ACTIVE_SELECTOR);\n\n // Ensure that the correct page is scrolled into view when exiting\n // Presentation Mode, by waiting until fullscreen mode is disabled.\n setTimeout(() => {\n this.active = false;\n this._removeFullscreenChangeListeners();\n this._notifyStateChange();\n\n this.pdfViewer.currentScaleValue = this.args.previousScale;\n this.pdfViewer.currentPageNumber = page;\n this.args = null;\n }, 0);\n\n this._removeWindowListeners();\n this._hideControls();\n this._resetMouseScrollState();\n this.contextMenuOpen = false;\n }\n\n /**\n * @private\n */\n _mouseDown(evt) {\n if (this.contextMenuOpen) {\n this.contextMenuOpen = false;\n evt.preventDefault();\n return;\n }\n if (evt.button === 0) {\n // Enable clicking of links in presentation mode. Note: only links\n // pointing to destinations in the current PDF document work.\n const isInternalLink =\n evt.target.href && evt.target.classList.contains(\"internalLink\");\n if (!isInternalLink) {\n // Unless an internal link was clicked, advance one page.\n evt.preventDefault();\n\n if (evt.shiftKey) {\n this.pdfViewer.previousPage();\n } else {\n this.pdfViewer.nextPage();\n }\n }\n }\n }\n\n /**\n * @private\n */\n _contextMenu() {\n this.contextMenuOpen = true;\n }\n\n /**\n * @private\n */\n _showControls() {\n if (this.controlsTimeout) {\n clearTimeout(this.controlsTimeout);\n } else {\n this.container.classList.add(CONTROLS_SELECTOR);\n }\n this.controlsTimeout = setTimeout(() => {\n this.container.classList.remove(CONTROLS_SELECTOR);\n delete this.controlsTimeout;\n }, DELAY_BEFORE_HIDING_CONTROLS);\n }\n\n /**\n * @private\n */\n _hideControls() {\n if (!this.controlsTimeout) {\n return;\n }\n clearTimeout(this.controlsTimeout);\n this.container.classList.remove(CONTROLS_SELECTOR);\n delete this.controlsTimeout;\n }\n\n /**\n * Resets the properties used for tracking mouse scrolling events.\n *\n * @private\n */\n _resetMouseScrollState() {\n this.mouseScrollTimeStamp = 0;\n this.mouseScrollDelta = 0;\n }\n\n /**\n * @private\n */\n _touchSwipe(evt) {\n if (!this.active) {\n return;\n }\n if (evt.touches.length > 1) {\n // Multiple touch points detected; cancel the swipe.\n this.touchSwipeState = null;\n return;\n }\n\n switch (evt.type) {\n case \"touchstart\":\n this.touchSwipeState = {\n startX: evt.touches[0].pageX,\n startY: evt.touches[0].pageY,\n endX: evt.touches[0].pageX,\n endY: evt.touches[0].pageY,\n };\n break;\n case \"touchmove\":\n if (this.touchSwipeState === null) {\n return;\n }\n this.touchSwipeState.endX = evt.touches[0].pageX;\n this.touchSwipeState.endY = evt.touches[0].pageY;\n // Avoid the swipe from triggering browser gestures (Chrome in\n // particular has some sort of swipe gesture in fullscreen mode).\n evt.preventDefault();\n break;\n case \"touchend\":\n if (this.touchSwipeState === null) {\n return;\n }\n let delta = 0;\n const dx = this.touchSwipeState.endX - this.touchSwipeState.startX;\n const dy = this.touchSwipeState.endY - this.touchSwipeState.startY;\n const absAngle = Math.abs(Math.atan2(dy, dx));\n if (\n Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD &&\n (absAngle <= SWIPE_ANGLE_THRESHOLD ||\n absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)\n ) {\n // Horizontal swipe.\n delta = dx;\n } else if (\n Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD &&\n Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD\n ) {\n // Vertical swipe.\n delta = dy;\n }\n if (delta > 0) {\n this.pdfViewer.previousPage();\n } else if (delta < 0) {\n this.pdfViewer.nextPage();\n }\n break;\n }\n }\n\n /**\n * @private\n */\n _addWindowListeners() {\n this.showControlsBind = this._showControls.bind(this);\n this.mouseDownBind = this._mouseDown.bind(this);\n this.mouseWheelBind = this._mouseWheel.bind(this);\n this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);\n this.contextMenuBind = this._contextMenu.bind(this);\n this.touchSwipeBind = this._touchSwipe.bind(this);\n\n window.addEventListener(\"mousemove\", this.showControlsBind);\n window.addEventListener(\"mousedown\", this.mouseDownBind);\n window.addEventListener(\"wheel\", this.mouseWheelBind, { passive: false });\n window.addEventListener(\"keydown\", this.resetMouseScrollStateBind);\n window.addEventListener(\"contextmenu\", this.contextMenuBind);\n window.addEventListener(\"touchstart\", this.touchSwipeBind);\n window.addEventListener(\"touchmove\", this.touchSwipeBind);\n window.addEventListener(\"touchend\", this.touchSwipeBind);\n }\n\n /**\n * @private\n */\n _removeWindowListeners() {\n window.removeEventListener(\"mousemove\", this.showControlsBind);\n window.removeEventListener(\"mousedown\", this.mouseDownBind);\n window.removeEventListener(\"wheel\", this.mouseWheelBind, {\n passive: false,\n });\n window.removeEventListener(\"keydown\", this.resetMouseScrollStateBind);\n window.removeEventListener(\"contextmenu\", this.contextMenuBind);\n window.removeEventListener(\"touchstart\", this.touchSwipeBind);\n window.removeEventListener(\"touchmove\", this.touchSwipeBind);\n window.removeEventListener(\"touchend\", this.touchSwipeBind);\n\n delete this.showControlsBind;\n delete this.mouseDownBind;\n delete this.mouseWheelBind;\n delete this.resetMouseScrollStateBind;\n delete this.contextMenuBind;\n delete this.touchSwipeBind;\n }\n\n /**\n * @private\n */\n _fullscreenChange() {\n if (this.isFullscreen) {\n this._enter();\n } else {\n this._exit();\n }\n }\n\n /**\n * @private\n */\n _addFullscreenChangeListeners() {\n this.fullscreenChangeBind = this._fullscreenChange.bind(this);\n\n window.addEventListener(\"fullscreenchange\", this.fullscreenChangeBind);\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n window.addEventListener(\"mozfullscreenchange\", this.fullscreenChangeBind);\n window.addEventListener(\n \"webkitfullscreenchange\",\n this.fullscreenChangeBind\n );\n }\n }\n\n /**\n * @private\n */\n _removeFullscreenChangeListeners() {\n window.removeEventListener(\"fullscreenchange\", this.fullscreenChangeBind);\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n window.removeEventListener(\n \"mozfullscreenchange\",\n this.fullscreenChangeBind\n );\n window.removeEventListener(\n \"webkitfullscreenchange\",\n this.fullscreenChangeBind\n );\n }\n\n delete this.fullscreenChangeBind;\n }\n}\n\nexport { PDFPresentationMode };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createPromiseCapability, shadow } from \"pdfjs-lib\";\nimport { apiPageLayoutToSpreadMode } from \"./ui_utils.js\";\nimport { RenderingStates } from \"./pdf_rendering_queue.js\";\n\n/**\n * @typedef {Object} PDFScriptingManagerOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {string} sandboxBundleSrc - The path and filename of the scripting\n * bundle.\n * @property {Object} [scriptingFactory] - The factory that is used when\n * initializing scripting; must contain a `createScripting` method.\n * PLEASE NOTE: Primarily intended for the default viewer use-case.\n * @property {function} [docPropertiesLookup] - The function that is used to\n * lookup the necessary document properties.\n */\n\nclass PDFScriptingManager {\n /**\n * @param {PDFScriptingManagerOptions} options\n */\n constructor({\n eventBus,\n sandboxBundleSrc = null,\n scriptingFactory = null,\n docPropertiesLookup = null,\n }) {\n this._pdfDocument = null;\n this._pdfViewer = null;\n this._closeCapability = null;\n this._destroyCapability = null;\n\n this._scripting = null;\n this._mouseState = Object.create(null);\n this._ready = false;\n\n this._eventBus = eventBus;\n this._sandboxBundleSrc = sandboxBundleSrc;\n this._scriptingFactory = scriptingFactory;\n this._docPropertiesLookup = docPropertiesLookup;\n\n // The default viewer already handles adding/removing of DOM events,\n // hence limit this to only the viewer components.\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"COMPONENTS\") &&\n !this._scriptingFactory\n ) {\n window.addEventListener(\"updatefromsandbox\", event => {\n this._eventBus.dispatch(\"updatefromsandbox\", {\n source: window,\n detail: event.detail,\n });\n });\n }\n }\n\n setViewer(pdfViewer) {\n this._pdfViewer = pdfViewer;\n }\n\n async setDocument(pdfDocument) {\n if (this._pdfDocument) {\n await this._destroyScripting();\n }\n this._pdfDocument = pdfDocument;\n\n if (!pdfDocument) {\n return;\n }\n const [objects, calculationOrder, docActions] = await Promise.all([\n pdfDocument.getFieldObjects(),\n pdfDocument.getCalculationOrderIds(),\n pdfDocument.getJSActions(),\n ]);\n\n if (!objects && !docActions) {\n // No FieldObjects or JavaScript actions were found in the document.\n await this._destroyScripting();\n return;\n }\n if (pdfDocument !== this._pdfDocument) {\n return; // The document was closed while the data resolved.\n }\n try {\n this._scripting = this._createScripting();\n } catch (error) {\n console.error(`PDFScriptingManager.setDocument: \"${error?.message}\".`);\n\n await this._destroyScripting();\n return;\n }\n\n this._internalEvents.set(\"updatefromsandbox\", event => {\n if (event?.source !== window) {\n return;\n }\n this._updateFromSandbox(event.detail);\n });\n this._internalEvents.set(\"dispatcheventinsandbox\", event => {\n this._scripting?.dispatchEventInSandbox(event.detail);\n });\n\n this._internalEvents.set(\"pagechanging\", ({ pageNumber, previous }) => {\n if (pageNumber === previous) {\n return; // The current page didn't change.\n }\n this._dispatchPageClose(previous);\n this._dispatchPageOpen(pageNumber);\n });\n this._internalEvents.set(\"pagerendered\", ({ pageNumber }) => {\n if (!this._pageOpenPending.has(pageNumber)) {\n return; // No pending \"PageOpen\" event for the newly rendered page.\n }\n if (pageNumber !== this._pdfViewer.currentPageNumber) {\n return; // The newly rendered page is no longer the current one.\n }\n this._dispatchPageOpen(pageNumber);\n });\n this._internalEvents.set(\"pagesdestroy\", async event => {\n await this._dispatchPageClose(this._pdfViewer.currentPageNumber);\n\n await this._scripting?.dispatchEventInSandbox({\n id: \"doc\",\n name: \"WillClose\",\n });\n\n this._closeCapability?.resolve();\n });\n\n this._domEvents.set(\"mousedown\", event => {\n this._mouseState.isDown = true;\n });\n this._domEvents.set(\"mouseup\", event => {\n this._mouseState.isDown = false;\n });\n\n for (const [name, listener] of this._internalEvents) {\n this._eventBus._on(name, listener);\n }\n for (const [name, listener] of this._domEvents) {\n window.addEventListener(name, listener);\n }\n\n try {\n const docProperties = await this._getDocProperties();\n if (pdfDocument !== this._pdfDocument) {\n return; // The document was closed while the properties resolved.\n }\n\n await this._scripting.createSandbox({\n objects,\n calculationOrder,\n appInfo: {\n platform: navigator.platform,\n language: navigator.language,\n },\n docInfo: {\n ...docProperties,\n actions: docActions,\n },\n });\n\n this._eventBus.dispatch(\"sandboxcreated\", { source: this });\n } catch (error) {\n console.error(`PDFScriptingManager.setDocument: \"${error?.message}\".`);\n\n await this._destroyScripting();\n return;\n }\n\n await this._scripting?.dispatchEventInSandbox({\n id: \"doc\",\n name: \"Open\",\n });\n await this._dispatchPageOpen(\n this._pdfViewer.currentPageNumber,\n /* initialize = */ true\n );\n\n // Defer this slightly, to ensure that scripting is *fully* initialized.\n Promise.resolve().then(() => {\n if (pdfDocument === this._pdfDocument) {\n this._ready = true;\n }\n });\n }\n\n async dispatchWillSave(detail) {\n return this._scripting?.dispatchEventInSandbox({\n id: \"doc\",\n name: \"WillSave\",\n });\n }\n\n async dispatchDidSave(detail) {\n return this._scripting?.dispatchEventInSandbox({\n id: \"doc\",\n name: \"DidSave\",\n });\n }\n\n async dispatchWillPrint(detail) {\n return this._scripting?.dispatchEventInSandbox({\n id: \"doc\",\n name: \"WillPrint\",\n });\n }\n\n async dispatchDidPrint(detail) {\n return this._scripting?.dispatchEventInSandbox({\n id: \"doc\",\n name: \"DidPrint\",\n });\n }\n\n get mouseState() {\n return this._mouseState;\n }\n\n get destroyPromise() {\n return this._destroyCapability?.promise || null;\n }\n\n get ready() {\n return this._ready;\n }\n\n /**\n * @private\n */\n get _internalEvents() {\n return shadow(this, \"_internalEvents\", new Map());\n }\n\n /**\n * @private\n */\n get _domEvents() {\n return shadow(this, \"_domEvents\", new Map());\n }\n\n /**\n * @private\n */\n get _pageOpenPending() {\n return shadow(this, \"_pageOpenPending\", new Set());\n }\n\n /**\n * @private\n */\n get _visitedPages() {\n return shadow(this, \"_visitedPages\", new Map());\n }\n\n /**\n * @private\n */\n async _updateFromSandbox(detail) {\n // Ignore some events, see below, that don't make sense in PresentationMode.\n const isInPresentationMode =\n this._pdfViewer.isInPresentationMode ||\n this._pdfViewer.isChangingPresentationMode;\n\n const { id, siblings, command, value } = detail;\n if (!id) {\n switch (command) {\n case \"clear\":\n console.clear();\n break;\n case \"error\":\n console.error(value);\n break;\n case \"layout\":\n this._pdfViewer.spreadMode = apiPageLayoutToSpreadMode(value);\n break;\n case \"page-num\":\n this._pdfViewer.currentPageNumber = value + 1;\n break;\n case \"print\":\n await this._pdfViewer.pagesPromise;\n this._eventBus.dispatch(\"print\", { source: this });\n break;\n case \"println\":\n console.log(value);\n break;\n case \"zoom\":\n if (isInPresentationMode) {\n return;\n }\n this._pdfViewer.currentScaleValue = value;\n break;\n }\n return;\n }\n\n if (isInPresentationMode) {\n if (detail.focus) {\n return;\n }\n }\n delete detail.id;\n delete detail.siblings;\n\n const ids = siblings ? [id, ...siblings] : [id];\n for (const elementId of ids) {\n const element = document.getElementById(elementId);\n if (element) {\n element.dispatchEvent(new CustomEvent(\"updatefromsandbox\", { detail }));\n } else {\n // The element hasn't been rendered yet, use the AnnotationStorage.\n this._pdfDocument?.annotationStorage.setValue(elementId, detail);\n }\n }\n }\n\n /**\n * @private\n */\n async _dispatchPageOpen(pageNumber, initialize = false) {\n const pdfDocument = this._pdfDocument,\n visitedPages = this._visitedPages;\n\n if (initialize) {\n this._closeCapability = createPromiseCapability();\n }\n if (!this._closeCapability) {\n return; // Scripting isn't fully initialized yet.\n }\n const pageView = this._pdfViewer.getPageView(/* index = */ pageNumber - 1);\n\n if (pageView?.renderingState !== RenderingStates.FINISHED) {\n this._pageOpenPending.add(pageNumber);\n return; // Wait for the page to finish rendering.\n }\n this._pageOpenPending.delete(pageNumber);\n\n const actionsPromise = (async () => {\n // Avoid sending, and thus serializing, the `actions` data more than once.\n const actions = await (!visitedPages.has(pageNumber)\n ? pageView.pdfPage?.getJSActions()\n : null);\n if (pdfDocument !== this._pdfDocument) {\n return; // The document was closed while the actions resolved.\n }\n\n await this._scripting?.dispatchEventInSandbox({\n id: \"page\",\n name: \"PageOpen\",\n pageNumber,\n actions,\n });\n })();\n visitedPages.set(pageNumber, actionsPromise);\n }\n\n /**\n * @private\n */\n async _dispatchPageClose(pageNumber) {\n const pdfDocument = this._pdfDocument,\n visitedPages = this._visitedPages;\n\n if (!this._closeCapability) {\n return; // Scripting isn't fully initialized yet.\n }\n if (this._pageOpenPending.has(pageNumber)) {\n return; // The page is still rendering; no \"PageOpen\" event dispatched.\n }\n const actionsPromise = visitedPages.get(pageNumber);\n if (!actionsPromise) {\n return; // The \"PageClose\" event must be preceded by a \"PageOpen\" event.\n }\n visitedPages.set(pageNumber, null);\n\n // Ensure that the \"PageOpen\" event is dispatched first.\n await actionsPromise;\n if (pdfDocument !== this._pdfDocument) {\n return; // The document was closed while the actions resolved.\n }\n\n await this._scripting?.dispatchEventInSandbox({\n id: \"page\",\n name: \"PageClose\",\n pageNumber,\n });\n }\n\n /**\n * @returns {Promise<Object>} A promise that is resolved with an {Object}\n * containing the necessary document properties; please find the expected\n * format in `PDFViewerApplication._scriptingDocProperties`.\n * @private\n */\n async _getDocProperties() {\n if (this._docPropertiesLookup) {\n return this._docPropertiesLookup(this._pdfDocument);\n }\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"COMPONENTS\")) {\n const { docPropertiesLookup } = require(\"./generic_scripting.js\");\n\n return docPropertiesLookup(this._pdfDocument);\n }\n throw new Error(\"_getDocProperties: Unable to lookup properties.\");\n }\n\n /**\n * @private\n */\n _createScripting() {\n this._destroyCapability = createPromiseCapability();\n\n if (this._scripting) {\n throw new Error(\"_createScripting: Scripting already exists.\");\n }\n if (this._scriptingFactory) {\n return this._scriptingFactory.createScripting({\n sandboxBundleSrc: this._sandboxBundleSrc,\n });\n }\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"COMPONENTS\")) {\n const { GenericScripting } = require(\"./generic_scripting.js\");\n\n return new GenericScripting(this._sandboxBundleSrc);\n }\n throw new Error(\"_createScripting: Cannot create scripting.\");\n }\n\n /**\n * @private\n */\n async _destroyScripting() {\n if (!this._scripting) {\n this._pdfDocument = null;\n\n this._destroyCapability?.resolve();\n return;\n }\n if (this._closeCapability) {\n await Promise.race([\n this._closeCapability.promise,\n new Promise(resolve => {\n // Avoid the scripting/sandbox-destruction hanging indefinitely.\n setTimeout(resolve, 1000);\n }),\n ]).catch(reason => {\n // Ignore any errors, to ensure that the sandbox is always destroyed.\n });\n this._closeCapability = null;\n }\n this._pdfDocument = null;\n\n try {\n await this._scripting.destroySandbox();\n } catch (ex) {}\n\n for (const [name, listener] of this._internalEvents) {\n this._eventBus._off(name, listener);\n }\n this._internalEvents.clear();\n\n for (const [name, listener] of this._domEvents) {\n window.removeEventListener(name, listener);\n }\n this._domEvents.clear();\n\n this._pageOpenPending.clear();\n this._visitedPages.clear();\n\n this._scripting = null;\n delete this._mouseState.isDown;\n this._ready = false;\n\n this._destroyCapability?.resolve();\n }\n}\n\nexport { PDFScriptingManager };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PresentationModeState, SidebarView } from \"./ui_utils.js\";\nimport { RenderingStates } from \"./pdf_rendering_queue.js\";\n\nconst UI_NOTIFICATION_CLASS = \"pdfSidebarNotification\";\n\n/**\n * @typedef {Object} PDFSidebarOptions\n * @property {PDFSidebarElements} elements - The DOM elements.\n * @property {PDFViewer} pdfViewer - The document viewer.\n * @property {PDFThumbnailViewer} pdfThumbnailViewer - The thumbnail viewer.\n * @property {EventBus} eventBus - The application event bus.\n * @property {IL10n} l10n - The localization service.\n */\n\n/**\n * @typedef {Object} PDFSidebarElements\n * @property {HTMLDivElement} outerContainer - The outer container\n * (encasing both the viewer and sidebar elements).\n * @property {HTMLDivElement} viewerContainer - The viewer container\n * (in which the viewer element is placed).\n * @property {HTMLButtonElement} toggleButton - The button used for\n * opening/closing the sidebar.\n * @property {HTMLButtonElement} thumbnailButton - The button used to show\n * the thumbnail view.\n * @property {HTMLButtonElement} outlineButton - The button used to show\n * the outline view.\n * @property {HTMLButtonElement} attachmentsButton - The button used to show\n * the attachments view.\n * @property {HTMLButtonElement} layersButton - The button used to show\n * the layers view.\n * @property {HTMLDivElement} thumbnailView - The container in which\n * the thumbnails are placed.\n * @property {HTMLDivElement} outlineView - The container in which\n * the outline is placed.\n * @property {HTMLDivElement} attachmentsView - The container in which\n * the attachments are placed.\n * @property {HTMLDivElement} layersView - The container in which\n * the layers are placed.\n * @property {HTMLDivElement} outlineOptionsContainer - The container in which\n * the outline view-specific option button(s) are placed.\n * @property {HTMLButtonElement} currentOutlineItemButton - The button used to\n * find the current outline item.\n */\n\nclass PDFSidebar {\n /**\n * @param {PDFSidebarOptions} options\n */\n constructor({ elements, pdfViewer, pdfThumbnailViewer, eventBus, l10n }) {\n this.isOpen = false;\n this.active = SidebarView.THUMBS;\n this.isInitialViewSet = false;\n\n /**\n * Callback used when the sidebar has been opened/closed, to ensure that\n * the viewers (PDFViewer/PDFThumbnailViewer) are updated correctly.\n */\n this.onToggled = null;\n\n this.pdfViewer = pdfViewer;\n this.pdfThumbnailViewer = pdfThumbnailViewer;\n\n this.outerContainer = elements.outerContainer;\n this.viewerContainer = elements.viewerContainer;\n this.toggleButton = elements.toggleButton;\n\n this.thumbnailButton = elements.thumbnailButton;\n this.outlineButton = elements.outlineButton;\n this.attachmentsButton = elements.attachmentsButton;\n this.layersButton = elements.layersButton;\n\n this.thumbnailView = elements.thumbnailView;\n this.outlineView = elements.outlineView;\n this.attachmentsView = elements.attachmentsView;\n this.layersView = elements.layersView;\n\n this._outlineOptionsContainer = elements.outlineOptionsContainer;\n this._currentOutlineItemButton = elements.currentOutlineItemButton;\n\n this.eventBus = eventBus;\n this.l10n = l10n;\n\n this._addEventListeners();\n }\n\n reset() {\n this.isInitialViewSet = false;\n\n this._hideUINotification(/* reset = */ true);\n this.switchView(SidebarView.THUMBS);\n\n this.outlineButton.disabled = false;\n this.attachmentsButton.disabled = false;\n this.layersButton.disabled = false;\n this._currentOutlineItemButton.disabled = true;\n }\n\n /**\n * @type {number} One of the values in {SidebarView}.\n */\n get visibleView() {\n return this.isOpen ? this.active : SidebarView.NONE;\n }\n\n get isThumbnailViewVisible() {\n return this.isOpen && this.active === SidebarView.THUMBS;\n }\n\n get isOutlineViewVisible() {\n return this.isOpen && this.active === SidebarView.OUTLINE;\n }\n\n get isAttachmentsViewVisible() {\n return this.isOpen && this.active === SidebarView.ATTACHMENTS;\n }\n\n get isLayersViewVisible() {\n return this.isOpen && this.active === SidebarView.LAYERS;\n }\n\n /**\n * @param {number} view - The sidebar view that should become visible,\n * must be one of the values in {SidebarView}.\n */\n setInitialView(view = SidebarView.NONE) {\n if (this.isInitialViewSet) {\n return;\n }\n this.isInitialViewSet = true;\n\n // If the user has already manually opened the sidebar, immediately closing\n // it would be bad UX; also ignore the \"unknown\" sidebar view value.\n if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) {\n this._dispatchEvent();\n return;\n }\n // Prevent dispatching two back-to-back `sidebarviewchanged` events,\n // since `this._switchView` dispatched the event if the view changed.\n if (!this._switchView(view, /* forceOpen */ true)) {\n this._dispatchEvent();\n }\n }\n\n /**\n * @param {number} view - The sidebar view that should be switched to,\n * must be one of the values in {SidebarView}.\n * @param {boolean} [forceOpen] - Ensure that the sidebar is open.\n * The default value is `false`.\n */\n switchView(view, forceOpen = false) {\n this._switchView(view, forceOpen);\n }\n\n /**\n * @returns {boolean} Indicating if `this._dispatchEvent` was called.\n * @private\n */\n _switchView(view, forceOpen = false) {\n const isViewChanged = view !== this.active;\n let shouldForceRendering = false;\n\n switch (view) {\n case SidebarView.NONE:\n if (this.isOpen) {\n this.close();\n return true; // Closing will trigger rendering and dispatch the event.\n }\n return false;\n case SidebarView.THUMBS:\n if (this.isOpen && isViewChanged) {\n shouldForceRendering = true;\n }\n break;\n case SidebarView.OUTLINE:\n if (this.outlineButton.disabled) {\n return false;\n }\n break;\n case SidebarView.ATTACHMENTS:\n if (this.attachmentsButton.disabled) {\n return false;\n }\n break;\n case SidebarView.LAYERS:\n if (this.layersButton.disabled) {\n return false;\n }\n break;\n default:\n console.error(`PDFSidebar._switchView: \"${view}\" is not a valid view.`);\n return false;\n }\n // Update the active view *after* it has been validated above,\n // in order to prevent setting it to an invalid state.\n this.active = view;\n\n // Update the CSS classes, for all buttons...\n this.thumbnailButton.classList.toggle(\n \"toggled\",\n view === SidebarView.THUMBS\n );\n this.outlineButton.classList.toggle(\n \"toggled\",\n view === SidebarView.OUTLINE\n );\n this.attachmentsButton.classList.toggle(\n \"toggled\",\n view === SidebarView.ATTACHMENTS\n );\n this.layersButton.classList.toggle(\"toggled\", view === SidebarView.LAYERS);\n // ... and for all views.\n this.thumbnailView.classList.toggle(\"hidden\", view !== SidebarView.THUMBS);\n this.outlineView.classList.toggle(\"hidden\", view !== SidebarView.OUTLINE);\n this.attachmentsView.classList.toggle(\n \"hidden\",\n view !== SidebarView.ATTACHMENTS\n );\n this.layersView.classList.toggle(\"hidden\", view !== SidebarView.LAYERS);\n\n // Finally, update view-specific CSS classes.\n this._outlineOptionsContainer.classList.toggle(\n \"hidden\",\n view !== SidebarView.OUTLINE\n );\n\n if (forceOpen && !this.isOpen) {\n this.open();\n return true; // Opening will trigger rendering and dispatch the event.\n }\n if (shouldForceRendering) {\n this._updateThumbnailViewer();\n this._forceRendering();\n }\n if (isViewChanged) {\n this._dispatchEvent();\n }\n return isViewChanged;\n }\n\n open() {\n if (this.isOpen) {\n return;\n }\n this.isOpen = true;\n this.toggleButton.classList.add(\"toggled\");\n this.toggleButton.setAttribute(\"aria-expanded\", \"true\");\n\n this.outerContainer.classList.add(\"sidebarMoving\", \"sidebarOpen\");\n\n if (this.active === SidebarView.THUMBS) {\n this._updateThumbnailViewer();\n }\n this._forceRendering();\n this._dispatchEvent();\n\n this._hideUINotification();\n }\n\n close() {\n if (!this.isOpen) {\n return;\n }\n this.isOpen = false;\n this.toggleButton.classList.remove(\"toggled\");\n this.toggleButton.setAttribute(\"aria-expanded\", \"false\");\n\n this.outerContainer.classList.add(\"sidebarMoving\");\n this.outerContainer.classList.remove(\"sidebarOpen\");\n\n this._forceRendering();\n this._dispatchEvent();\n }\n\n toggle() {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * @private\n */\n _dispatchEvent() {\n this.eventBus.dispatch(\"sidebarviewchanged\", {\n source: this,\n view: this.visibleView,\n });\n }\n\n /**\n * @private\n */\n _forceRendering() {\n if (this.onToggled) {\n this.onToggled();\n } else {\n // Fallback\n this.pdfViewer.forceRendering();\n this.pdfThumbnailViewer.forceRendering();\n }\n }\n\n /**\n * @private\n */\n _updateThumbnailViewer() {\n const { pdfViewer, pdfThumbnailViewer } = this;\n\n // Use the rendered pages to set the corresponding thumbnail images.\n const pagesCount = pdfViewer.pagesCount;\n for (let pageIndex = 0; pageIndex < pagesCount; pageIndex++) {\n const pageView = pdfViewer.getPageView(pageIndex);\n if (pageView?.renderingState === RenderingStates.FINISHED) {\n const thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);\n thumbnailView.setImage(pageView);\n }\n }\n pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);\n }\n\n /**\n * @private\n */\n _showUINotification() {\n this.l10n.get(\"toggle_sidebar_notification2.title\").then(msg => {\n this.toggleButton.title = msg;\n });\n\n if (!this.isOpen) {\n // Only show the notification on the `toggleButton` if the sidebar is\n // currently closed, to avoid unnecessarily bothering the user.\n this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);\n }\n }\n\n /**\n * @private\n */\n _hideUINotification(reset = false) {\n if (this.isOpen || reset) {\n // Only hide the notification on the `toggleButton` if the sidebar is\n // currently open, or when the current PDF document is being closed.\n this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);\n }\n\n if (reset) {\n this.l10n.get(\"toggle_sidebar.title\").then(msg => {\n this.toggleButton.title = msg;\n });\n }\n }\n\n /**\n * @private\n */\n _addEventListeners() {\n this.viewerContainer.addEventListener(\"transitionend\", evt => {\n if (evt.target === this.viewerContainer) {\n this.outerContainer.classList.remove(\"sidebarMoving\");\n }\n });\n\n this.toggleButton.addEventListener(\"click\", () => {\n this.toggle();\n });\n\n // Buttons for switching views.\n this.thumbnailButton.addEventListener(\"click\", () => {\n this.switchView(SidebarView.THUMBS);\n });\n\n this.outlineButton.addEventListener(\"click\", () => {\n this.switchView(SidebarView.OUTLINE);\n });\n this.outlineButton.addEventListener(\"dblclick\", () => {\n this.eventBus.dispatch(\"toggleoutlinetree\", { source: this });\n });\n\n this.attachmentsButton.addEventListener(\"click\", () => {\n this.switchView(SidebarView.ATTACHMENTS);\n });\n\n this.layersButton.addEventListener(\"click\", () => {\n this.switchView(SidebarView.LAYERS);\n });\n this.layersButton.addEventListener(\"dblclick\", () => {\n this.eventBus.dispatch(\"resetlayers\", { source: this });\n });\n\n // Buttons for view-specific options.\n this._currentOutlineItemButton.addEventListener(\"click\", () => {\n this.eventBus.dispatch(\"currentoutlineitem\", { source: this });\n });\n\n // Disable/enable views.\n const onTreeLoaded = (count, button, view) => {\n button.disabled = !count;\n\n if (count) {\n this._showUINotification();\n } else if (this.active === view) {\n // If the `view` was opened by the user during document load,\n // switch away from it if it turns out to be empty.\n this.switchView(SidebarView.THUMBS);\n }\n };\n\n this.eventBus._on(\"outlineloaded\", evt => {\n onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE);\n\n evt.currentOutlineItemPromise.then(enabled => {\n if (!this.isInitialViewSet) {\n return;\n }\n this._currentOutlineItemButton.disabled = !enabled;\n });\n });\n\n this.eventBus._on(\"attachmentsloaded\", evt => {\n onTreeLoaded(\n evt.attachmentsCount,\n this.attachmentsButton,\n SidebarView.ATTACHMENTS\n );\n });\n\n this.eventBus._on(\"layersloaded\", evt => {\n onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS);\n });\n\n // Update the thumbnailViewer, if visible, when exiting presentation mode.\n this.eventBus._on(\"presentationmodechanged\", evt => {\n if (\n evt.state === PresentationModeState.NORMAL &&\n this.isThumbnailViewVisible\n ) {\n this._updateThumbnailViewer();\n }\n });\n }\n}\n\nexport { PDFSidebar };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst SIDEBAR_WIDTH_VAR = \"--sidebar-width\";\nconst SIDEBAR_MIN_WIDTH = 200; // pixels\nconst SIDEBAR_RESIZING_CLASS = \"sidebarResizing\";\n\n/**\n * @typedef {Object} PDFSidebarResizerOptions\n * @property {HTMLDivElement} outerContainer - The outer container\n * (encasing both the viewer and sidebar elements).\n * @property {HTMLDivElement} resizer - The DOM element that can be dragged in\n * order to adjust the width of the sidebar.\n */\n\nclass PDFSidebarResizer {\n /**\n * @param {PDFSidebarResizerOptions} options\n * @param {EventBus} eventBus - The application event bus.\n * @param {IL10n} l10n - Localization service.\n */\n constructor(options, eventBus, l10n) {\n this.isRTL = false;\n this.sidebarOpen = false;\n this.doc = document.documentElement;\n this._width = null;\n this._outerContainerWidth = null;\n this._boundEvents = Object.create(null);\n\n this.outerContainer = options.outerContainer;\n this.resizer = options.resizer;\n this.eventBus = eventBus;\n\n l10n.getDirection().then(dir => {\n this.isRTL = dir === \"rtl\";\n });\n this._addEventListeners();\n }\n\n /**\n * @type {number}\n */\n get outerContainerWidth() {\n return (this._outerContainerWidth ||= this.outerContainer.clientWidth);\n }\n\n /**\n * @private\n * returns {boolean} Indicating if the sidebar width was updated.\n */\n _updateWidth(width = 0) {\n // Prevent the sidebar from becoming too narrow, or from occupying more\n // than half of the available viewer width.\n const maxWidth = Math.floor(this.outerContainerWidth / 2);\n if (width > maxWidth) {\n width = maxWidth;\n }\n if (width < SIDEBAR_MIN_WIDTH) {\n width = SIDEBAR_MIN_WIDTH;\n }\n // Only update the UI when the sidebar width did in fact change.\n if (width === this._width) {\n return false;\n }\n this._width = width;\n this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`);\n return true;\n }\n\n /**\n * @private\n */\n _mouseMove(evt) {\n let width = evt.clientX;\n // For sidebar resizing to work correctly in RTL mode, invert the width.\n if (this.isRTL) {\n width = this.outerContainerWidth - width;\n }\n this._updateWidth(width);\n }\n\n /**\n * @private\n */\n _mouseUp(evt) {\n // Re-enable the `transition-duration` rules when sidebar resizing ends...\n this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);\n // ... and ensure that rendering will always be triggered.\n this.eventBus.dispatch(\"resize\", { source: this });\n\n const _boundEvents = this._boundEvents;\n window.removeEventListener(\"mousemove\", _boundEvents.mouseMove);\n window.removeEventListener(\"mouseup\", _boundEvents.mouseUp);\n }\n\n /**\n * @private\n */\n _addEventListeners() {\n const _boundEvents = this._boundEvents;\n _boundEvents.mouseMove = this._mouseMove.bind(this);\n _boundEvents.mouseUp = this._mouseUp.bind(this);\n\n this.resizer.addEventListener(\"mousedown\", evt => {\n if (evt.button !== 0) {\n return;\n }\n // Disable the `transition-duration` rules when sidebar resizing begins,\n // in order to improve responsiveness and to avoid visual glitches.\n this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);\n\n window.addEventListener(\"mousemove\", _boundEvents.mouseMove);\n window.addEventListener(\"mouseup\", _boundEvents.mouseUp);\n });\n\n this.eventBus._on(\"sidebarviewchanged\", evt => {\n this.sidebarOpen = !!evt?.view;\n });\n\n this.eventBus._on(\"resize\", evt => {\n // When the *entire* viewer is resized, such that it becomes narrower,\n // ensure that the sidebar doesn't end up being too wide.\n if (evt?.source !== window) {\n return;\n }\n // Always reset the cached width when the viewer is resized.\n this._outerContainerWidth = null;\n\n if (!this._width) {\n // The sidebar hasn't been resized, hence no need to adjust its width.\n return;\n }\n // NOTE: If the sidebar is closed, we don't need to worry about\n // visual glitches nor ensure that rendering is triggered.\n if (!this.sidebarOpen) {\n this._updateWidth(this._width);\n return;\n }\n this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);\n const updated = this._updateWidth(this._width);\n\n Promise.resolve().then(() => {\n this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);\n // Trigger rendering if the sidebar width changed, to avoid\n // depending on the order in which 'resize' events are handled.\n if (updated) {\n this.eventBus.dispatch(\"resize\", { source: this });\n }\n });\n });\n }\n}\n\nexport { PDFSidebarResizer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getVisibleElements,\n isValidRotation,\n scrollIntoView,\n watchScroll,\n} from \"./ui_utils.js\";\nimport { PDFThumbnailView, TempImageFactory } from \"./pdf_thumbnail_view.js\";\nimport { RenderingStates } from \"./pdf_rendering_queue.js\";\n\nconst THUMBNAIL_SCROLL_MARGIN = -19;\nconst THUMBNAIL_SELECTED_CLASS = \"selected\";\n\n/**\n * @typedef {Object} PDFThumbnailViewerOptions\n * @property {HTMLDivElement} container - The container for the thumbnail\n * elements.\n * @property {EventBus} eventBus - The application event bus.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {IL10n} l10n - Localization service.\n */\n\n/**\n * Viewer control to display thumbnails for pages in a PDF document.\n *\n * @implements {IRenderableView}\n */\nclass PDFThumbnailViewer {\n /**\n * @param {PDFThumbnailViewerOptions} options\n */\n constructor({ container, eventBus, linkService, renderingQueue, l10n }) {\n this.container = container;\n this.linkService = linkService;\n this.renderingQueue = renderingQueue;\n this.l10n = l10n;\n\n this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this));\n this._resetView();\n\n eventBus._on(\"optionalcontentconfigchanged\", () => {\n // Ensure that the thumbnails always render with the *default* optional\n // content configuration.\n this._setImageDisabled = true;\n });\n }\n\n /**\n * @private\n */\n _scrollUpdated() {\n this.renderingQueue.renderHighestPriority();\n }\n\n getThumbnail(index) {\n return this._thumbnails[index];\n }\n\n /**\n * @private\n */\n _getVisibleThumbs() {\n return getVisibleElements({\n scrollEl: this.container,\n views: this._thumbnails,\n });\n }\n\n scrollThumbnailIntoView(pageNumber) {\n if (!this.pdfDocument) {\n return;\n }\n const thumbnailView = this._thumbnails[pageNumber - 1];\n\n if (!thumbnailView) {\n console.error('scrollThumbnailIntoView: Invalid \"pageNumber\" parameter.');\n return;\n }\n\n if (pageNumber !== this._currentPageNumber) {\n const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1];\n // Remove the highlight from the previous thumbnail...\n prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS);\n // ... and add the highlight to the new thumbnail.\n thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);\n }\n const visibleThumbs = this._getVisibleThumbs();\n const numVisibleThumbs = visibleThumbs.views.length;\n\n // If the thumbnail isn't currently visible, scroll it into view.\n if (numVisibleThumbs > 0) {\n const first = visibleThumbs.first.id;\n // Account for only one thumbnail being visible.\n const last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;\n\n let shouldScroll = false;\n if (pageNumber <= first || pageNumber >= last) {\n shouldScroll = true;\n } else {\n visibleThumbs.views.some(function (view) {\n if (view.id !== pageNumber) {\n return false;\n }\n shouldScroll = view.percent < 100;\n return true;\n });\n }\n if (shouldScroll) {\n scrollIntoView(thumbnailView.div, { top: THUMBNAIL_SCROLL_MARGIN });\n }\n }\n\n this._currentPageNumber = pageNumber;\n }\n\n get pagesRotation() {\n return this._pagesRotation;\n }\n\n set pagesRotation(rotation) {\n if (!isValidRotation(rotation)) {\n throw new Error(\"Invalid thumbnails rotation angle.\");\n }\n if (!this.pdfDocument) {\n return;\n }\n if (this._pagesRotation === rotation) {\n return; // The rotation didn't change.\n }\n this._pagesRotation = rotation;\n\n for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n this._thumbnails[i].update(rotation);\n }\n }\n\n cleanup() {\n for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n if (\n this._thumbnails[i] &&\n this._thumbnails[i].renderingState !== RenderingStates.FINISHED\n ) {\n this._thumbnails[i].reset();\n }\n }\n TempImageFactory.destroyCanvas();\n }\n\n /**\n * @private\n */\n _resetView() {\n this._thumbnails = [];\n this._currentPageNumber = 1;\n this._pageLabels = null;\n this._pagesRotation = 0;\n this._optionalContentConfigPromise = null;\n this._pagesRequests = new WeakMap();\n this._setImageDisabled = false;\n\n // Remove the thumbnails from the DOM.\n this.container.textContent = \"\";\n }\n\n setDocument(pdfDocument) {\n if (this.pdfDocument) {\n this._cancelRendering();\n this._resetView();\n }\n\n this.pdfDocument = pdfDocument;\n if (!pdfDocument) {\n return;\n }\n const firstPagePromise = pdfDocument.getPage(1);\n const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();\n\n firstPagePromise\n .then(firstPdfPage => {\n this._optionalContentConfigPromise = optionalContentConfigPromise;\n\n const pagesCount = pdfDocument.numPages;\n const viewport = firstPdfPage.getViewport({ scale: 1 });\n const checkSetImageDisabled = () => {\n return this._setImageDisabled;\n };\n\n for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n const thumbnail = new PDFThumbnailView({\n container: this.container,\n id: pageNum,\n defaultViewport: viewport.clone(),\n optionalContentConfigPromise,\n linkService: this.linkService,\n renderingQueue: this.renderingQueue,\n checkSetImageDisabled,\n l10n: this.l10n,\n });\n this._thumbnails.push(thumbnail);\n }\n // Set the first `pdfPage` immediately, since it's already loaded,\n // rather than having to repeat the `PDFDocumentProxy.getPage` call in\n // the `this._ensurePdfPageLoaded` method before rendering can start.\n const firstThumbnailView = this._thumbnails[0];\n if (firstThumbnailView) {\n firstThumbnailView.setPdfPage(firstPdfPage);\n }\n\n // Ensure that the current thumbnail is always highlighted on load.\n const thumbnailView = this._thumbnails[this._currentPageNumber - 1];\n thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);\n })\n .catch(reason => {\n console.error(\"Unable to initialize thumbnail viewer\", reason);\n });\n }\n\n /**\n * @private\n */\n _cancelRendering() {\n for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n if (this._thumbnails[i]) {\n this._thumbnails[i].cancelRendering();\n }\n }\n }\n\n /**\n * @param {Array|null} labels\n */\n setPageLabels(labels) {\n if (!this.pdfDocument) {\n return;\n }\n if (!labels) {\n this._pageLabels = null;\n } else if (\n !(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)\n ) {\n this._pageLabels = null;\n console.error(\"PDFThumbnailViewer_setPageLabels: Invalid page labels.\");\n } else {\n this._pageLabels = labels;\n }\n // Update all the `PDFThumbnailView` instances.\n for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null);\n }\n }\n\n /**\n * @param {PDFThumbnailView} thumbView\n * @returns {PDFPage}\n * @private\n */\n _ensurePdfPageLoaded(thumbView) {\n if (thumbView.pdfPage) {\n return Promise.resolve(thumbView.pdfPage);\n }\n if (this._pagesRequests.has(thumbView)) {\n return this._pagesRequests.get(thumbView);\n }\n const promise = this.pdfDocument\n .getPage(thumbView.id)\n .then(pdfPage => {\n if (!thumbView.pdfPage) {\n thumbView.setPdfPage(pdfPage);\n }\n this._pagesRequests.delete(thumbView);\n return pdfPage;\n })\n .catch(reason => {\n console.error(\"Unable to get page for thumb view\", reason);\n // Page error -- there is nothing that can be done.\n this._pagesRequests.delete(thumbView);\n });\n this._pagesRequests.set(thumbView, promise);\n return promise;\n }\n\n forceRendering() {\n const visibleThumbs = this._getVisibleThumbs();\n const thumbView = this.renderingQueue.getHighestPriority(\n visibleThumbs,\n this._thumbnails,\n this.scroll.down\n );\n if (thumbView) {\n this._ensurePdfPageLoaded(thumbView).then(() => {\n this.renderingQueue.renderView(thumbView);\n });\n return true;\n }\n return false;\n }\n}\n\nexport { PDFThumbnailViewer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getOutputScale } from \"./ui_utils.js\";\nimport { RenderingCancelledException } from \"pdfjs-lib\";\nimport { RenderingStates } from \"./pdf_rendering_queue.js\";\n\nconst DRAW_UPSCALE_FACTOR = 2; // See comment in `PDFThumbnailView.draw` below.\nconst MAX_NUM_SCALING_STEPS = 3;\nconst THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px\nconst THUMBNAIL_WIDTH = 98; // px\n\n/**\n * @typedef {Object} PDFThumbnailViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {number} id - The thumbnail's unique ID (normally its number).\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n * A promise that is resolved with an {@link OptionalContentConfig} instance.\n * The default value is `null`.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {function} checkSetImageDisabled\n * @property {IL10n} l10n - Localization service.\n */\n\nconst TempImageFactory = (function TempImageFactoryClosure() {\n let tempCanvasCache = null;\n\n return {\n getCanvas(width, height) {\n let tempCanvas = tempCanvasCache;\n if (!tempCanvas) {\n tempCanvas = document.createElement(\"canvas\");\n tempCanvasCache = tempCanvas;\n }\n tempCanvas.width = width;\n tempCanvas.height = height;\n\n // Since this is a temporary canvas, we need to fill it with a white\n // background ourselves. `_getPageDrawContext` uses CSS rules for this.\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"MOZCENTRAL || GENERIC\")\n ) {\n tempCanvas.mozOpaque = true;\n }\n\n const ctx = tempCanvas.getContext(\"2d\", { alpha: false });\n ctx.save();\n ctx.fillStyle = \"rgb(255, 255, 255)\";\n ctx.fillRect(0, 0, width, height);\n ctx.restore();\n return [tempCanvas, tempCanvas.getContext(\"2d\")];\n },\n\n destroyCanvas() {\n const tempCanvas = tempCanvasCache;\n if (tempCanvas) {\n // Zeroing the width and height causes Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n }\n tempCanvasCache = null;\n },\n };\n})();\n\n/**\n * @implements {IRenderableView}\n */\nclass PDFThumbnailView {\n /**\n * @param {PDFThumbnailViewOptions} options\n */\n constructor({\n container,\n id,\n defaultViewport,\n optionalContentConfigPromise,\n linkService,\n renderingQueue,\n checkSetImageDisabled,\n l10n,\n }) {\n this.id = id;\n this.renderingId = \"thumbnail\" + id;\n this.pageLabel = null;\n\n this.pdfPage = null;\n this.rotation = 0;\n this.viewport = defaultViewport;\n this.pdfPageRotate = defaultViewport.rotation;\n this._optionalContentConfigPromise = optionalContentConfigPromise || null;\n\n this.linkService = linkService;\n this.renderingQueue = renderingQueue;\n\n this.renderTask = null;\n this.renderingState = RenderingStates.INITIAL;\n this.resume = null;\n this._checkSetImageDisabled =\n checkSetImageDisabled ||\n function () {\n return false;\n };\n\n const pageWidth = this.viewport.width,\n pageHeight = this.viewport.height,\n pageRatio = pageWidth / pageHeight;\n\n this.canvasWidth = THUMBNAIL_WIDTH;\n this.canvasHeight = (this.canvasWidth / pageRatio) | 0;\n this.scale = this.canvasWidth / pageWidth;\n\n this.l10n = l10n;\n\n const anchor = document.createElement(\"a\");\n anchor.href = linkService.getAnchorUrl(\"#page=\" + id);\n this._thumbPageTitle.then(msg => {\n anchor.title = msg;\n });\n anchor.onclick = function () {\n linkService.goToPage(id);\n return false;\n };\n this.anchor = anchor;\n\n const div = document.createElement(\"div\");\n div.className = \"thumbnail\";\n div.setAttribute(\"data-page-number\", this.id);\n this.div = div;\n\n const ring = document.createElement(\"div\");\n ring.className = \"thumbnailSelectionRing\";\n const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n ring.style.width = this.canvasWidth + borderAdjustment + \"px\";\n ring.style.height = this.canvasHeight + borderAdjustment + \"px\";\n this.ring = ring;\n\n div.appendChild(ring);\n anchor.appendChild(div);\n container.appendChild(anchor);\n }\n\n setPdfPage(pdfPage) {\n this.pdfPage = pdfPage;\n this.pdfPageRotate = pdfPage.rotate;\n const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n this.viewport = pdfPage.getViewport({ scale: 1, rotation: totalRotation });\n this.reset();\n }\n\n reset() {\n this.cancelRendering();\n this.renderingState = RenderingStates.INITIAL;\n\n const pageWidth = this.viewport.width,\n pageHeight = this.viewport.height,\n pageRatio = pageWidth / pageHeight;\n\n this.canvasHeight = (this.canvasWidth / pageRatio) | 0;\n this.scale = this.canvasWidth / pageWidth;\n\n this.div.removeAttribute(\"data-loaded\");\n const ring = this.ring;\n ring.textContent = \"\"; // Remove the thumbnail from the DOM.\n const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n ring.style.width = this.canvasWidth + borderAdjustment + \"px\";\n ring.style.height = this.canvasHeight + borderAdjustment + \"px\";\n\n if (this.canvas) {\n // Zeroing the width and height causes Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n this.canvas.width = 0;\n this.canvas.height = 0;\n delete this.canvas;\n }\n if (this.image) {\n this.image.removeAttribute(\"src\");\n delete this.image;\n }\n }\n\n update(rotation) {\n if (typeof rotation !== \"undefined\") {\n this.rotation = rotation;\n }\n const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n this.viewport = this.viewport.clone({\n scale: 1,\n rotation: totalRotation,\n });\n this.reset();\n }\n\n /**\n * PLEASE NOTE: Most likely you want to use the `this.reset()` method,\n * rather than calling this one directly.\n */\n cancelRendering() {\n if (this.renderTask) {\n this.renderTask.cancel();\n this.renderTask = null;\n }\n this.resume = null;\n }\n\n /**\n * @private\n */\n _getPageDrawContext(upscaleFactor = 1) {\n // Keep the no-thumbnail outline visible, i.e. `data-loaded === false`,\n // until rendering/image conversion is complete, to avoid display issues.\n const canvas = document.createElement(\"canvas\");\n\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"MOZCENTRAL || GENERIC\")\n ) {\n canvas.mozOpaque = true;\n }\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n const outputScale = getOutputScale(ctx);\n\n canvas.width = (upscaleFactor * this.canvasWidth * outputScale.sx) | 0;\n canvas.height = (upscaleFactor * this.canvasHeight * outputScale.sy) | 0;\n\n const transform = outputScale.scaled\n ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0]\n : null;\n\n return { ctx, canvas, transform };\n }\n\n /**\n * @private\n */\n _convertCanvasToImage(canvas) {\n if (this.renderingState !== RenderingStates.FINISHED) {\n throw new Error(\"_convertCanvasToImage: Rendering has not finished.\");\n }\n const reducedCanvas = this._reduceImage(canvas);\n\n const image = document.createElement(\"img\");\n image.className = \"thumbnailImage\";\n this._thumbPageCanvas.then(msg => {\n image.setAttribute(\"aria-label\", msg);\n });\n image.style.width = this.canvasWidth + \"px\";\n image.style.height = this.canvasHeight + \"px\";\n\n image.src = reducedCanvas.toDataURL();\n this.image = image;\n\n this.div.setAttribute(\"data-loaded\", true);\n this.ring.appendChild(image);\n\n // Zeroing the width and height causes Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n reducedCanvas.width = 0;\n reducedCanvas.height = 0;\n }\n\n draw() {\n if (this.renderingState !== RenderingStates.INITIAL) {\n console.error(\"Must be in new state before drawing\");\n return Promise.resolve(undefined);\n }\n const { pdfPage } = this;\n\n if (!pdfPage) {\n this.renderingState = RenderingStates.FINISHED;\n return Promise.reject(new Error(\"pdfPage is not loaded\"));\n }\n\n this.renderingState = RenderingStates.RUNNING;\n\n const finishRenderTask = async (error = null) => {\n // The renderTask may have been replaced by a new one, so only remove\n // the reference to the renderTask if it matches the one that is\n // triggering this callback.\n if (renderTask === this.renderTask) {\n this.renderTask = null;\n }\n\n if (error instanceof RenderingCancelledException) {\n return;\n }\n this.renderingState = RenderingStates.FINISHED;\n this._convertCanvasToImage(canvas);\n\n if (error) {\n throw error;\n }\n };\n\n // Render the thumbnail at a larger size and downsize the canvas (similar\n // to `setImage`), to improve consistency between thumbnails created by\n // the `draw` and `setImage` methods (fixes issue 8233).\n // NOTE: To primarily avoid increasing memory usage too much, but also to\n // reduce downsizing overhead, we purposely limit the up-scaling factor.\n const { ctx, canvas, transform } =\n this._getPageDrawContext(DRAW_UPSCALE_FACTOR);\n const drawViewport = this.viewport.clone({\n scale: DRAW_UPSCALE_FACTOR * this.scale,\n });\n const renderContinueCallback = cont => {\n if (!this.renderingQueue.isHighestPriority(this)) {\n this.renderingState = RenderingStates.PAUSED;\n this.resume = () => {\n this.renderingState = RenderingStates.RUNNING;\n cont();\n };\n return;\n }\n cont();\n };\n\n const renderContext = {\n canvasContext: ctx,\n transform,\n viewport: drawViewport,\n optionalContentConfigPromise: this._optionalContentConfigPromise,\n };\n const renderTask = (this.renderTask = pdfPage.render(renderContext));\n renderTask.onContinue = renderContinueCallback;\n\n const resultPromise = renderTask.promise.then(\n function () {\n return finishRenderTask(null);\n },\n function (error) {\n return finishRenderTask(error);\n }\n );\n resultPromise.finally(() => {\n // Zeroing the width and height causes Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n canvas.width = 0;\n canvas.height = 0;\n\n // Only trigger cleanup, once rendering has finished, when the current\n // pageView is *not* cached on the `BaseViewer`-instance.\n const pageCached = this.linkService.isPageCached(this.id);\n if (!pageCached) {\n this.pdfPage?.cleanup();\n }\n });\n\n return resultPromise;\n }\n\n setImage(pageView) {\n if (this._checkSetImageDisabled()) {\n return;\n }\n if (this.renderingState !== RenderingStates.INITIAL) {\n return;\n }\n const { canvas, pdfPage } = pageView;\n if (!canvas) {\n return;\n }\n if (!this.pdfPage) {\n this.setPdfPage(pdfPage);\n }\n this.renderingState = RenderingStates.FINISHED;\n this._convertCanvasToImage(canvas);\n }\n\n /**\n * @private\n */\n _reduceImage(img) {\n const { ctx, canvas } = this._getPageDrawContext();\n\n if (img.width <= 2 * canvas.width) {\n ctx.drawImage(\n img,\n 0,\n 0,\n img.width,\n img.height,\n 0,\n 0,\n canvas.width,\n canvas.height\n );\n return canvas;\n }\n // drawImage does an awful job of rescaling the image, doing it gradually.\n let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;\n let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;\n const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(\n reducedWidth,\n reducedHeight\n );\n\n while (reducedWidth > img.width || reducedHeight > img.height) {\n reducedWidth >>= 1;\n reducedHeight >>= 1;\n }\n reducedImageCtx.drawImage(\n img,\n 0,\n 0,\n img.width,\n img.height,\n 0,\n 0,\n reducedWidth,\n reducedHeight\n );\n while (reducedWidth > 2 * canvas.width) {\n reducedImageCtx.drawImage(\n reducedImage,\n 0,\n 0,\n reducedWidth,\n reducedHeight,\n 0,\n 0,\n reducedWidth >> 1,\n reducedHeight >> 1\n );\n reducedWidth >>= 1;\n reducedHeight >>= 1;\n }\n ctx.drawImage(\n reducedImage,\n 0,\n 0,\n reducedWidth,\n reducedHeight,\n 0,\n 0,\n canvas.width,\n canvas.height\n );\n return canvas;\n }\n\n get _thumbPageTitle() {\n return this.l10n.get(\"thumb_page_title\", {\n page: this.pageLabel ?? this.id,\n });\n }\n\n get _thumbPageCanvas() {\n return this.l10n.get(\"thumb_page_canvas\", {\n page: this.pageLabel ?? this.id,\n });\n }\n\n /**\n * @param {string|null} label\n */\n setPageLabel(label) {\n this.pageLabel = typeof label === \"string\" ? label : null;\n\n this._thumbPageTitle.then(msg => {\n this.anchor.title = msg;\n });\n\n if (this.renderingState !== RenderingStates.FINISHED) {\n return;\n }\n\n this._thumbPageCanvas.then(msg => {\n this.image?.setAttribute(\"aria-label\", msg);\n });\n }\n}\n\nexport { PDFThumbnailView, TempImageFactory };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScrollMode, SpreadMode } from \"./ui_utils.js\";\nimport { BaseViewer } from \"./base_viewer.js\";\nimport { shadow } from \"pdfjs-lib\";\n\nclass PDFViewer extends BaseViewer {\n get _viewerElement() {\n return shadow(this, \"_viewerElement\", this.viewer);\n }\n\n _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null }) {\n if (!pageSpot && !this.isInPresentationMode) {\n const left = pageDiv.offsetLeft + pageDiv.clientLeft;\n const right = left + pageDiv.clientWidth;\n const { scrollLeft, clientWidth } = this.container;\n if (\n this._isScrollModeHorizontal ||\n left < scrollLeft ||\n right > scrollLeft + clientWidth\n ) {\n pageSpot = { left: 0, top: 0 };\n }\n }\n super._scrollIntoView({ pageDiv, pageSpot, pageNumber });\n }\n\n _getVisiblePages() {\n if (this.isInPresentationMode) {\n // The algorithm in `getVisibleElements` doesn't work in all browsers and\n // configurations (e.g. Chrome) when Presentation Mode is active.\n return this._getCurrentVisiblePage();\n }\n return super._getVisiblePages();\n }\n\n _updateHelper(visiblePages) {\n if (this.isInPresentationMode) {\n return;\n }\n let currentId = this._currentPageNumber;\n let stillFullyVisible = false;\n\n for (const page of visiblePages) {\n if (page.percent < 100) {\n break;\n }\n if (\n page.id === currentId &&\n this._scrollMode === ScrollMode.VERTICAL &&\n this._spreadMode === SpreadMode.NONE\n ) {\n stillFullyVisible = true;\n break;\n }\n }\n if (!stillFullyVisible) {\n currentId = visiblePages[0].id;\n }\n this._setCurrentPageNumber(currentId);\n }\n}\n\nexport { PDFViewer };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createPromiseCapability, version } from \"pdfjs-lib\";\nimport {\n CSS_UNITS,\n DEFAULT_SCALE,\n DEFAULT_SCALE_VALUE,\n getVisibleElements,\n isPortraitOrientation,\n isValidRotation,\n isValidScrollMode,\n isValidSpreadMode,\n MAX_AUTO_SCALE,\n moveToEndOfArray,\n PresentationModeState,\n RendererType,\n SCROLLBAR_PADDING,\n scrollIntoView,\n ScrollMode,\n SpreadMode,\n TextLayerMode,\n UNKNOWN_SCALE,\n VERTICAL_PADDING,\n watchScroll,\n} from \"./ui_utils.js\";\nimport { PDFRenderingQueue, RenderingStates } from \"./pdf_rendering_queue.js\";\nimport { AnnotationLayerBuilder } from \"./annotation_layer_builder.js\";\nimport { NullL10n } from \"./l10n_utils.js\";\nimport { PDFPageView } from \"./pdf_page_view.js\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\nimport { StructTreeLayerBuilder } from \"./struct_tree_layer_builder.js\";\nimport { TextLayerBuilder } from \"./text_layer_builder.js\";\nimport { XfaLayerBuilder } from \"./xfa_layer_builder.js\";\n\nconst DEFAULT_CACHE_SIZE = 10;\n\n/**\n * @typedef {Object} PDFViewerOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} [viewer] - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {DownloadManager} [downloadManager] - The download manager\n * component.\n * @property {PDFFindController} [findController] - The find controller\n * component.\n * @property {PDFScriptingManager} [scriptingManager] - The scripting manager\n * component.\n * @property {PDFRenderingQueue} [renderingQueue] - The rendering queue object.\n * @property {boolean} [removePageBorders] - Removes the border shadow around\n * the pages. The default value is `false`.\n * @property {number} [textLayerMode] - Controls if the text layer used for\n * selection and searching is created, and if the improved text selection\n * behaviour is enabled. The constants from {TextLayerMode} should be used.\n * The default value is `TextLayerMode.ENABLE`.\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n * mainly for annotation icons. Include trailing slash.\n * @property {boolean} [renderInteractiveForms] - Enables rendering of\n * interactive form elements. The default value is `true`.\n * @property {boolean} [enablePrintAutoRotate] - Enables automatic rotation of\n * landscape pages upon printing. The default is `false`.\n * @property {string} renderer - 'canvas' or 'svg'. The default is 'canvas'.\n * @property {boolean} [useOnlyCssZoom] - Enables CSS only zooming. The default\n * value is `false`.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n * total pixels, i.e. width * height. Use -1 for no limit. The default value\n * is 4096 * 4096 (16 mega-pixels).\n * @property {IL10n} l10n - Localization service.\n * @property {boolean} [enableScripting] - Enable embedded script execution\n * (also requires {scriptingManager} being set). The default value is `false`.\n */\n\nfunction PDFPageViewBuffer(size) {\n const data = [];\n this.push = function (view) {\n const i = data.indexOf(view);\n if (i >= 0) {\n data.splice(i, 1);\n }\n data.push(view);\n if (data.length > size) {\n data.shift().destroy();\n }\n };\n /**\n * After calling resize, the size of the buffer will be newSize. The optional\n * parameter pagesToKeep is, if present, an array of pages to push to the back\n * of the buffer, delaying their destruction. The size of pagesToKeep has no\n * impact on the final size of the buffer; if pagesToKeep has length larger\n * than newSize, some of those pages will be destroyed anyway.\n */\n this.resize = function (newSize, pagesToKeep) {\n size = newSize;\n if (pagesToKeep) {\n const pageIdsToKeep = new Set();\n for (let i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {\n pageIdsToKeep.add(pagesToKeep[i].id);\n }\n moveToEndOfArray(data, function (page) {\n return pageIdsToKeep.has(page.id);\n });\n }\n while (data.length > size) {\n data.shift().destroy();\n }\n };\n\n this.has = function (view) {\n return data.includes(view);\n };\n}\n\nfunction isSameScale(oldScale, newScale) {\n if (newScale === oldScale) {\n return true;\n }\n if (Math.abs(newScale - oldScale) < 1e-15) {\n // Prevent unnecessary re-rendering of all pages when the scale\n // changes only because of limited numerical precision.\n return true;\n }\n return false;\n}\n\n/**\n * Simple viewer control to display PDF content/pages.\n * @implements {IRenderableView}\n */\nclass BaseViewer {\n /**\n * @param {PDFViewerOptions} options\n */\n constructor(options) {\n if (this.constructor === BaseViewer) {\n throw new Error(\"Cannot initialize BaseViewer.\");\n }\n const viewerVersion =\n typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : null;\n if (version !== viewerVersion) {\n throw new Error(\n `The API version \"${version}\" does not match the Viewer version \"${viewerVersion}\".`\n );\n }\n this._name = this.constructor.name;\n\n this.container = options.container;\n this.viewer = options.viewer || options.container.firstElementChild;\n\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || GENERIC\")\n ) {\n if (\n !(\n this.container?.tagName.toUpperCase() === \"DIV\" &&\n this.viewer?.tagName.toUpperCase() === \"DIV\"\n )\n ) {\n throw new Error(\"Invalid `container` and/or `viewer` option.\");\n }\n\n if (\n this.container.offsetParent &&\n getComputedStyle(this.container).position !== \"absolute\"\n ) {\n throw new Error(\"The `container` must be absolutely positioned.\");\n }\n }\n this.eventBus = options.eventBus;\n this.linkService = options.linkService || new SimpleLinkService();\n this.downloadManager = options.downloadManager || null;\n this.findController = options.findController || null;\n this._scriptingManager = options.scriptingManager || null;\n this.removePageBorders = options.removePageBorders || false;\n this.textLayerMode = Number.isInteger(options.textLayerMode)\n ? options.textLayerMode\n : TextLayerMode.ENABLE;\n this.imageResourcesPath = options.imageResourcesPath || \"\";\n this.renderInteractiveForms = options.renderInteractiveForms !== false;\n this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n this.renderer = options.renderer || RendererType.CANVAS;\n this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n this.maxCanvasPixels = options.maxCanvasPixels;\n this.l10n = options.l10n || NullL10n;\n this.enableScripting =\n options.enableScripting === true && !!this._scriptingManager;\n\n this.defaultRenderingQueue = !options.renderingQueue;\n if (this.defaultRenderingQueue) {\n // Custom rendering queue is not specified, using default one\n this.renderingQueue = new PDFRenderingQueue();\n this.renderingQueue.setViewer(this);\n } else {\n this.renderingQueue = options.renderingQueue;\n }\n\n this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this));\n this.presentationModeState = PresentationModeState.UNKNOWN;\n this._onBeforeDraw = this._onAfterDraw = null;\n this._resetView();\n\n if (this.removePageBorders) {\n this.viewer.classList.add(\"removePageBorders\");\n }\n // Defer the dispatching of this event, to give other viewer components\n // time to initialize *and* register 'baseviewerinit' event listeners.\n Promise.resolve().then(() => {\n this.eventBus.dispatch(\"baseviewerinit\", { source: this });\n });\n }\n\n get pagesCount() {\n return this._pages.length;\n }\n\n getPageView(index) {\n return this._pages[index];\n }\n\n /**\n * @type {boolean} - True if all {PDFPageView} objects are initialized.\n */\n get pageViewsReady() {\n if (!this._pagesCapability.settled) {\n return false;\n }\n // Prevent printing errors when 'disableAutoFetch' is set, by ensuring\n // that *all* pages have in fact been completely loaded.\n return this._pages.every(function (pageView) {\n return pageView?.pdfPage;\n });\n }\n\n /**\n * @type {number}\n */\n get currentPageNumber() {\n return this._currentPageNumber;\n }\n\n /**\n * @param {number} val - The page number.\n */\n set currentPageNumber(val) {\n if (!Number.isInteger(val)) {\n throw new Error(\"Invalid page number.\");\n }\n if (!this.pdfDocument) {\n return;\n }\n // The intent can be to just reset a scroll position and/or scale.\n if (!this._setCurrentPageNumber(val, /* resetCurrentPageView = */ true)) {\n console.error(\n `${this._name}.currentPageNumber: \"${val}\" is not a valid page.`\n );\n }\n }\n\n /**\n * @returns {boolean} Whether the pageNumber is valid (within bounds).\n * @private\n */\n _setCurrentPageNumber(val, resetCurrentPageView = false) {\n if (this._currentPageNumber === val) {\n if (resetCurrentPageView) {\n this._resetCurrentPageView();\n }\n return true;\n }\n\n if (!(0 < val && val <= this.pagesCount)) {\n return false;\n }\n const previous = this._currentPageNumber;\n this._currentPageNumber = val;\n\n this.eventBus.dispatch(\"pagechanging\", {\n source: this,\n pageNumber: val,\n pageLabel: this._pageLabels?.[val - 1] ?? null,\n previous,\n });\n\n if (resetCurrentPageView) {\n this._resetCurrentPageView();\n }\n return true;\n }\n\n /**\n * @type {string|null} Returns the current page label, or `null` if no page\n * labels exist.\n */\n get currentPageLabel() {\n return this._pageLabels?.[this._currentPageNumber - 1] ?? null;\n }\n\n /**\n * @param {string} val - The page label.\n */\n set currentPageLabel(val) {\n if (!this.pdfDocument) {\n return;\n }\n let page = val | 0; // Fallback page number.\n if (this._pageLabels) {\n const i = this._pageLabels.indexOf(val);\n if (i >= 0) {\n page = i + 1;\n }\n }\n // The intent can be to just reset a scroll position and/or scale.\n if (!this._setCurrentPageNumber(page, /* resetCurrentPageView = */ true)) {\n console.error(\n `${this._name}.currentPageLabel: \"${val}\" is not a valid page.`\n );\n }\n }\n\n /**\n * @type {number}\n */\n get currentScale() {\n return this._currentScale !== UNKNOWN_SCALE\n ? this._currentScale\n : DEFAULT_SCALE;\n }\n\n /**\n * @param {number} val - Scale of the pages in percents.\n */\n set currentScale(val) {\n if (isNaN(val)) {\n throw new Error(\"Invalid numeric scale.\");\n }\n if (!this.pdfDocument) {\n return;\n }\n this._setScale(val, false);\n }\n\n /**\n * @type {string}\n */\n get currentScaleValue() {\n return this._currentScaleValue;\n }\n\n /**\n * @param val - The scale of the pages (in percent or predefined value).\n */\n set currentScaleValue(val) {\n if (!this.pdfDocument) {\n return;\n }\n this._setScale(val, false);\n }\n\n /**\n * @type {number}\n */\n get pagesRotation() {\n return this._pagesRotation;\n }\n\n /**\n * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).\n */\n set pagesRotation(rotation) {\n if (!isValidRotation(rotation)) {\n throw new Error(\"Invalid pages rotation angle.\");\n }\n if (!this.pdfDocument) {\n return;\n }\n // Normalize the rotation, by clamping it to the [0, 360) range.\n rotation %= 360;\n if (rotation < 0) {\n rotation += 360;\n }\n if (this._pagesRotation === rotation) {\n return; // The rotation didn't change.\n }\n this._pagesRotation = rotation;\n\n const pageNumber = this._currentPageNumber;\n\n for (let i = 0, ii = this._pages.length; i < ii; i++) {\n const pageView = this._pages[i];\n pageView.update(pageView.scale, rotation);\n }\n // Prevent errors in case the rotation changes *before* the scale has been\n // set to a non-default value.\n if (this._currentScaleValue) {\n this._setScale(this._currentScaleValue, true);\n }\n\n this.eventBus.dispatch(\"rotationchanging\", {\n source: this,\n pagesRotation: rotation,\n pageNumber,\n });\n\n if (this.defaultRenderingQueue) {\n this.update();\n }\n }\n\n get firstPagePromise() {\n return this.pdfDocument ? this._firstPageCapability.promise : null;\n }\n\n get onePageRendered() {\n return this.pdfDocument ? this._onePageRenderedCapability.promise : null;\n }\n\n get pagesPromise() {\n return this.pdfDocument ? this._pagesCapability.promise : null;\n }\n\n /**\n * @private\n */\n get _viewerElement() {\n // In most viewers, e.g. `PDFViewer`, this should return `this.viewer`.\n throw new Error(\"Not implemented: _viewerElement\");\n }\n\n /**\n * @private\n */\n _onePageRenderedOrForceFetch() {\n // Unless the viewer *and* its pages are visible, rendering won't start and\n // `this._onePageRenderedCapability` thus won't be resolved.\n // To ensure that automatic printing, on document load, still works even in\n // those cases we force-allow fetching of all pages when:\n // - The viewer is hidden in the DOM, e.g. in a `display: none` <iframe>\n // element; fixes bug 1618621.\n // - The viewer is visible, but none of the pages are (e.g. if the\n // viewer is very small); fixes bug 1618955.\n if (\n !this.container.offsetParent ||\n this._getVisiblePages().views.length === 0\n ) {\n return Promise.resolve();\n }\n return this._onePageRenderedCapability.promise;\n }\n\n /**\n * @param pdfDocument {PDFDocument}\n */\n setDocument(pdfDocument) {\n if (this.pdfDocument) {\n this.eventBus.dispatch(\"pagesdestroy\", { source: this });\n\n this._cancelRendering();\n this._resetView();\n\n if (this.findController) {\n this.findController.setDocument(null);\n }\n if (this._scriptingManager) {\n this._scriptingManager.setDocument(null);\n }\n }\n\n this.pdfDocument = pdfDocument;\n if (!pdfDocument) {\n return;\n }\n const isPureXfa = pdfDocument.isPureXfa;\n const pagesCount = pdfDocument.numPages;\n const firstPagePromise = pdfDocument.getPage(1);\n // Rendering (potentially) depends on this, hence fetching it immediately.\n const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();\n\n this._pagesCapability.promise.then(() => {\n this.eventBus.dispatch(\"pagesloaded\", {\n source: this,\n pagesCount,\n });\n });\n\n this._onBeforeDraw = evt => {\n const pageView = this._pages[evt.pageNumber - 1];\n if (!pageView) {\n return;\n }\n // Add the page to the buffer at the start of drawing. That way it can be\n // evicted from the buffer and destroyed even if we pause its rendering.\n this._buffer.push(pageView);\n };\n this.eventBus._on(\"pagerender\", this._onBeforeDraw);\n\n this._onAfterDraw = evt => {\n if (evt.cssTransform || this._onePageRenderedCapability.settled) {\n return;\n }\n this._onePageRenderedCapability.resolve();\n\n this.eventBus._off(\"pagerendered\", this._onAfterDraw);\n this._onAfterDraw = null;\n };\n this.eventBus._on(\"pagerendered\", this._onAfterDraw);\n\n // Fetch a single page so we can get a viewport that will be the default\n // viewport for all pages\n firstPagePromise\n .then(firstPdfPage => {\n this._firstPageCapability.resolve(firstPdfPage);\n this._optionalContentConfigPromise = optionalContentConfigPromise;\n\n const scale = this.currentScale;\n const viewport = firstPdfPage.getViewport({ scale: scale * CSS_UNITS });\n const textLayerFactory =\n this.textLayerMode !== TextLayerMode.DISABLE ? this : null;\n const xfaLayerFactory = isPureXfa ? this : null;\n\n for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n const pageView = new PDFPageView({\n container: this._viewerElement,\n eventBus: this.eventBus,\n id: pageNum,\n scale,\n defaultViewport: viewport.clone(),\n optionalContentConfigPromise,\n renderingQueue: this.renderingQueue,\n textLayerFactory,\n textLayerMode: this.textLayerMode,\n annotationLayerFactory: this,\n xfaLayerFactory,\n structTreeLayerFactory: this,\n imageResourcesPath: this.imageResourcesPath,\n renderInteractiveForms: this.renderInteractiveForms,\n renderer: this.renderer,\n useOnlyCssZoom: this.useOnlyCssZoom,\n maxCanvasPixels: this.maxCanvasPixels,\n l10n: this.l10n,\n });\n this._pages.push(pageView);\n }\n // Set the first `pdfPage` immediately, since it's already loaded,\n // rather than having to repeat the `PDFDocumentProxy.getPage` call in\n // the `this._ensurePdfPageLoaded` method before rendering can start.\n const firstPageView = this._pages[0];\n if (firstPageView) {\n firstPageView.setPdfPage(firstPdfPage);\n this.linkService.cachePageRef(1, firstPdfPage.ref);\n }\n if (this._spreadMode !== SpreadMode.NONE) {\n this._updateSpreadMode();\n }\n\n // Fetch all the pages since the viewport is needed before printing\n // starts to create the correct size canvas. Wait until one page is\n // rendered so we don't tie up too many resources early on.\n this._onePageRenderedOrForceFetch().then(() => {\n if (this.findController) {\n this.findController.setDocument(pdfDocument); // Enable searching.\n }\n if (this.enableScripting) {\n this._scriptingManager.setDocument(pdfDocument);\n }\n\n // In addition to 'disableAutoFetch' being set, also attempt to reduce\n // resource usage when loading *very* long/large documents.\n if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > 7500) {\n // XXX: Printing is semi-broken with auto fetch disabled.\n this._pagesCapability.resolve();\n return;\n }\n let getPagesLeft = pagesCount - 1; // The first page was already loaded.\n\n if (getPagesLeft <= 0) {\n this._pagesCapability.resolve();\n return;\n }\n for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {\n pdfDocument.getPage(pageNum).then(\n pdfPage => {\n const pageView = this._pages[pageNum - 1];\n if (!pageView.pdfPage) {\n pageView.setPdfPage(pdfPage);\n }\n this.linkService.cachePageRef(pageNum, pdfPage.ref);\n if (--getPagesLeft === 0) {\n this._pagesCapability.resolve();\n }\n },\n reason => {\n console.error(\n `Unable to get page ${pageNum} to initialize viewer`,\n reason\n );\n if (--getPagesLeft === 0) {\n this._pagesCapability.resolve();\n }\n }\n );\n }\n });\n\n this.eventBus.dispatch(\"pagesinit\", { source: this });\n\n if (this.defaultRenderingQueue) {\n this.update();\n }\n })\n .catch(reason => {\n console.error(\"Unable to initialize viewer\", reason);\n });\n }\n\n /**\n * @param {Array|null} labels\n */\n setPageLabels(labels) {\n if (!this.pdfDocument) {\n return;\n }\n if (!labels) {\n this._pageLabels = null;\n } else if (\n !(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)\n ) {\n this._pageLabels = null;\n console.error(`${this._name}.setPageLabels: Invalid page labels.`);\n } else {\n this._pageLabels = labels;\n }\n // Update all the `PDFPageView` instances.\n for (let i = 0, ii = this._pages.length; i < ii; i++) {\n this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null);\n }\n }\n\n _resetView() {\n this._pages = [];\n this._currentPageNumber = 1;\n this._currentScale = UNKNOWN_SCALE;\n this._currentScaleValue = null;\n this._pageLabels = null;\n this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n this._location = null;\n this._pagesRotation = 0;\n this._optionalContentConfigPromise = null;\n this._pagesRequests = new WeakMap();\n this._firstPageCapability = createPromiseCapability();\n this._onePageRenderedCapability = createPromiseCapability();\n this._pagesCapability = createPromiseCapability();\n this._scrollMode = ScrollMode.VERTICAL;\n this._spreadMode = SpreadMode.NONE;\n\n if (this._onBeforeDraw) {\n this.eventBus._off(\"pagerender\", this._onBeforeDraw);\n this._onBeforeDraw = null;\n }\n if (this._onAfterDraw) {\n this.eventBus._off(\"pagerendered\", this._onAfterDraw);\n this._onAfterDraw = null;\n }\n // Remove the pages from the DOM...\n this.viewer.textContent = \"\";\n // ... and reset the Scroll mode CSS class(es) afterwards.\n this._updateScrollMode();\n }\n\n _scrollUpdate() {\n if (this.pagesCount === 0) {\n return;\n }\n this.update();\n }\n\n _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null }) {\n scrollIntoView(pageDiv, pageSpot);\n }\n\n _setScaleUpdatePages(newScale, newValue, noScroll = false, preset = false) {\n this._currentScaleValue = newValue.toString();\n\n if (isSameScale(this._currentScale, newScale)) {\n if (preset) {\n this.eventBus.dispatch(\"scalechanging\", {\n source: this,\n scale: newScale,\n presetValue: newValue,\n });\n }\n return;\n }\n\n for (let i = 0, ii = this._pages.length; i < ii; i++) {\n this._pages[i].update(newScale);\n }\n this._currentScale = newScale;\n\n if (!noScroll) {\n let page = this._currentPageNumber,\n dest;\n if (\n this._location &&\n !(this.isInPresentationMode || this.isChangingPresentationMode)\n ) {\n page = this._location.pageNumber;\n dest = [\n null,\n { name: \"XYZ\" },\n this._location.left,\n this._location.top,\n null,\n ];\n }\n this.scrollPageIntoView({\n pageNumber: page,\n destArray: dest,\n allowNegativeOffset: true,\n });\n }\n\n this.eventBus.dispatch(\"scalechanging\", {\n source: this,\n scale: newScale,\n presetValue: preset ? newValue : undefined,\n });\n\n if (this.defaultRenderingQueue) {\n this.update();\n }\n }\n\n /**\n * @private\n */\n get _pageWidthScaleFactor() {\n if (\n this._spreadMode !== SpreadMode.NONE &&\n this._scrollMode !== ScrollMode.HORIZONTAL &&\n !this.isInPresentationMode\n ) {\n return 2;\n }\n return 1;\n }\n\n _setScale(value, noScroll = false) {\n let scale = parseFloat(value);\n\n if (scale > 0) {\n this._setScaleUpdatePages(scale, value, noScroll, /* preset = */ false);\n } else {\n const currentPage = this._pages[this._currentPageNumber - 1];\n if (!currentPage) {\n return;\n }\n const noPadding = this.isInPresentationMode || this.removePageBorders;\n let hPadding = noPadding ? 0 : SCROLLBAR_PADDING;\n let vPadding = noPadding ? 0 : VERTICAL_PADDING;\n\n if (!noPadding && this._isScrollModeHorizontal) {\n [hPadding, vPadding] = [vPadding, hPadding]; // Swap the padding values.\n }\n const pageWidthScale =\n (((this.container.clientWidth - hPadding) / currentPage.width) *\n currentPage.scale) /\n this._pageWidthScaleFactor;\n const pageHeightScale =\n ((this.container.clientHeight - vPadding) / currentPage.height) *\n currentPage.scale;\n switch (value) {\n case \"page-actual\":\n scale = 1;\n break;\n case \"page-width\":\n scale = pageWidthScale;\n break;\n case \"page-height\":\n scale = pageHeightScale;\n break;\n case \"page-fit\":\n scale = Math.min(pageWidthScale, pageHeightScale);\n break;\n case \"auto\":\n // For pages in landscape mode, fit the page height to the viewer\n // *unless* the page would thus become too wide to fit horizontally.\n const horizontalScale = isPortraitOrientation(currentPage)\n ? pageWidthScale\n : Math.min(pageHeightScale, pageWidthScale);\n scale = Math.min(MAX_AUTO_SCALE, horizontalScale);\n break;\n default:\n console.error(\n `${this._name}._setScale: \"${value}\" is an unknown zoom value.`\n );\n return;\n }\n this._setScaleUpdatePages(scale, value, noScroll, /* preset = */ true);\n }\n }\n\n /**\n * Refreshes page view: scrolls to the current page and updates the scale.\n * @private\n */\n _resetCurrentPageView() {\n if (this.isInPresentationMode) {\n // Fixes the case when PDF has different page sizes.\n this._setScale(this._currentScaleValue, true);\n }\n\n const pageView = this._pages[this._currentPageNumber - 1];\n this._scrollIntoView({ pageDiv: pageView.div });\n }\n\n /**\n * @param {string} label - The page label.\n * @returns {number|null} The page number corresponding to the page label,\n * or `null` when no page labels exist and/or the input is invalid.\n */\n pageLabelToPageNumber(label) {\n if (!this._pageLabels) {\n return null;\n }\n const i = this._pageLabels.indexOf(label);\n if (i < 0) {\n return null;\n }\n return i + 1;\n }\n\n /**\n * @typedef ScrollPageIntoViewParameters\n * @property {number} pageNumber - The page number.\n * @property {Array} [destArray] - The original PDF destination array, in the\n * format: <page-ref> </XYZ|/FitXXX> <args..>\n * @property {boolean} [allowNegativeOffset] - Allow negative page offsets.\n * The default value is `false`.\n * @property {boolean} [ignoreDestinationZoom] - Ignore the zoom argument in\n * the destination array. The default value is `false`.\n */\n\n /**\n * Scrolls page into view.\n * @param {ScrollPageIntoViewParameters} params\n */\n scrollPageIntoView({\n pageNumber,\n destArray = null,\n allowNegativeOffset = false,\n ignoreDestinationZoom = false,\n }) {\n if (!this.pdfDocument) {\n return;\n }\n const pageView =\n Number.isInteger(pageNumber) && this._pages[pageNumber - 1];\n if (!pageView) {\n console.error(\n `${this._name}.scrollPageIntoView: ` +\n `\"${pageNumber}\" is not a valid pageNumber parameter.`\n );\n return;\n }\n\n if (this.isInPresentationMode || !destArray) {\n this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n return;\n }\n let x = 0,\n y = 0;\n let width = 0,\n height = 0,\n widthScale,\n heightScale;\n const changeOrientation = pageView.rotation % 180 !== 0;\n const pageWidth =\n (changeOrientation ? pageView.height : pageView.width) /\n pageView.scale /\n CSS_UNITS;\n const pageHeight =\n (changeOrientation ? pageView.width : pageView.height) /\n pageView.scale /\n CSS_UNITS;\n let scale = 0;\n switch (destArray[1].name) {\n case \"XYZ\":\n x = destArray[2];\n y = destArray[3];\n scale = destArray[4];\n // If x and/or y coordinates are not supplied, default to\n // _top_ left of the page (not the obvious bottom left,\n // since aligning the bottom of the intended page with the\n // top of the window is rarely helpful).\n x = x !== null ? x : 0;\n y = y !== null ? y : pageHeight;\n break;\n case \"Fit\":\n case \"FitB\":\n scale = \"page-fit\";\n break;\n case \"FitH\":\n case \"FitBH\":\n y = destArray[2];\n scale = \"page-width\";\n // According to the PDF spec, section 12.3.2.2, a `null` value in the\n // parameter should maintain the position relative to the new page.\n if (y === null && this._location) {\n x = this._location.left;\n y = this._location.top;\n } else if (typeof y !== \"number\") {\n // The \"top\" value isn't optional, according to the spec, however some\n // bad PDF generators will pretend that it is (fixes bug 1663390).\n y = pageHeight;\n }\n break;\n case \"FitV\":\n case \"FitBV\":\n x = destArray[2];\n width = pageWidth;\n height = pageHeight;\n scale = \"page-height\";\n break;\n case \"FitR\":\n x = destArray[2];\n y = destArray[3];\n width = destArray[4] - x;\n height = destArray[5] - y;\n const hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING;\n const vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING;\n\n widthScale =\n (this.container.clientWidth - hPadding) / width / CSS_UNITS;\n heightScale =\n (this.container.clientHeight - vPadding) / height / CSS_UNITS;\n scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n break;\n default:\n console.error(\n `${this._name}.scrollPageIntoView: ` +\n `\"${destArray[1].name}\" is not a valid destination type.`\n );\n return;\n }\n\n if (!ignoreDestinationZoom) {\n if (scale && scale !== this._currentScale) {\n this.currentScaleValue = scale;\n } else if (this._currentScale === UNKNOWN_SCALE) {\n this.currentScaleValue = DEFAULT_SCALE_VALUE;\n }\n }\n\n if (scale === \"page-fit\" && !destArray[4]) {\n this._scrollIntoView({\n pageDiv: pageView.div,\n pageNumber,\n });\n return;\n }\n\n const boundingRect = [\n pageView.viewport.convertToViewportPoint(x, y),\n pageView.viewport.convertToViewportPoint(x + width, y + height),\n ];\n let left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n let top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n if (!allowNegativeOffset) {\n // Some bad PDF generators will create destinations with e.g. top values\n // that exceeds the page height. Ensure that offsets are not negative,\n // to prevent a previous page from becoming visible (fixes bug 874482).\n left = Math.max(left, 0);\n top = Math.max(top, 0);\n }\n this._scrollIntoView({\n pageDiv: pageView.div,\n pageSpot: { left, top },\n pageNumber,\n });\n }\n\n _updateLocation(firstPage) {\n const currentScale = this._currentScale;\n const currentScaleValue = this._currentScaleValue;\n const normalizedScaleValue =\n parseFloat(currentScaleValue) === currentScale\n ? Math.round(currentScale * 10000) / 100\n : currentScaleValue;\n\n const pageNumber = firstPage.id;\n let pdfOpenParams = \"#page=\" + pageNumber;\n pdfOpenParams += \"&zoom=\" + normalizedScaleValue;\n const currentPageView = this._pages[pageNumber - 1];\n const container = this.container;\n const topLeft = currentPageView.getPagePoint(\n container.scrollLeft - firstPage.x,\n container.scrollTop - firstPage.y\n );\n const intLeft = Math.round(topLeft[0]);\n const intTop = Math.round(topLeft[1]);\n pdfOpenParams += \",\" + intLeft + \",\" + intTop;\n\n this._location = {\n pageNumber,\n scale: normalizedScaleValue,\n top: intTop,\n left: intLeft,\n rotation: this._pagesRotation,\n pdfOpenParams,\n };\n }\n\n _updateHelper(visiblePages) {\n throw new Error(\"Not implemented: _updateHelper\");\n }\n\n update() {\n const visible = this._getVisiblePages();\n const visiblePages = visible.views,\n numVisiblePages = visiblePages.length;\n\n if (numVisiblePages === 0) {\n return;\n }\n const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);\n this._buffer.resize(newCacheSize, visiblePages);\n\n this.renderingQueue.renderHighestPriority(visible);\n\n this._updateHelper(visiblePages); // Run any class-specific update code.\n\n this._updateLocation(visible.first);\n this.eventBus.dispatch(\"updateviewarea\", {\n source: this,\n location: this._location,\n });\n }\n\n containsElement(element) {\n return this.container.contains(element);\n }\n\n focus() {\n this.container.focus();\n }\n\n get _isScrollModeHorizontal() {\n // Used to ensure that pre-rendering of the next/previous page works\n // correctly, since Scroll/Spread modes are ignored in Presentation Mode.\n return this.isInPresentationMode\n ? false\n : this._scrollMode === ScrollMode.HORIZONTAL;\n }\n\n get _isContainerRtl() {\n return getComputedStyle(this.container).direction === \"rtl\";\n }\n\n get isInPresentationMode() {\n return this.presentationModeState === PresentationModeState.FULLSCREEN;\n }\n\n get isChangingPresentationMode() {\n return this.presentationModeState === PresentationModeState.CHANGING;\n }\n\n get isHorizontalScrollbarEnabled() {\n return this.isInPresentationMode\n ? false\n : this.container.scrollWidth > this.container.clientWidth;\n }\n\n get isVerticalScrollbarEnabled() {\n return this.isInPresentationMode\n ? false\n : this.container.scrollHeight > this.container.clientHeight;\n }\n\n /**\n * Helper method for `this._getVisiblePages`. Should only ever be used when\n * the viewer can only display a single page at a time, for example in:\n * - `PDFSinglePageViewer`.\n * - `PDFViewer` with Presentation Mode active.\n */\n _getCurrentVisiblePage() {\n if (!this.pagesCount) {\n return { views: [] };\n }\n const pageView = this._pages[this._currentPageNumber - 1];\n // NOTE: Compute the `x` and `y` properties of the current view,\n // since `this._updateLocation` depends of them being available.\n const element = pageView.div;\n\n const view = {\n id: pageView.id,\n x: element.offsetLeft + element.clientLeft,\n y: element.offsetTop + element.clientTop,\n view: pageView,\n };\n return { first: view, last: view, views: [view] };\n }\n\n _getVisiblePages() {\n return getVisibleElements({\n scrollEl: this.container,\n views: this._pages,\n sortByVisibility: true,\n horizontal: this._isScrollModeHorizontal,\n rtl: this._isScrollModeHorizontal && this._isContainerRtl,\n });\n }\n\n /**\n * @param {number} pageNumber\n */\n isPageVisible(pageNumber) {\n if (!this.pdfDocument) {\n return false;\n }\n if (\n !(\n Number.isInteger(pageNumber) &&\n pageNumber > 0 &&\n pageNumber <= this.pagesCount\n )\n ) {\n console.error(\n `${this._name}.isPageVisible: \"${pageNumber}\" is not a valid page.`\n );\n return false;\n }\n return this._getVisiblePages().views.some(function (view) {\n return view.id === pageNumber;\n });\n }\n\n /**\n * @param {number} pageNumber\n */\n isPageCached(pageNumber) {\n if (!this.pdfDocument || !this._buffer) {\n return false;\n }\n if (\n !(\n Number.isInteger(pageNumber) &&\n pageNumber > 0 &&\n pageNumber <= this.pagesCount\n )\n ) {\n console.error(\n `${this._name}.isPageCached: \"${pageNumber}\" is not a valid page.`\n );\n return false;\n }\n const pageView = this._pages[pageNumber - 1];\n if (!pageView) {\n return false;\n }\n return this._buffer.has(pageView);\n }\n\n cleanup() {\n for (let i = 0, ii = this._pages.length; i < ii; i++) {\n if (\n this._pages[i] &&\n this._pages[i].renderingState !== RenderingStates.FINISHED\n ) {\n this._pages[i].reset();\n }\n }\n }\n\n /**\n * @private\n */\n _cancelRendering() {\n for (let i = 0, ii = this._pages.length; i < ii; i++) {\n if (this._pages[i]) {\n this._pages[i].cancelRendering();\n }\n }\n }\n\n /**\n * @param {PDFPageView} pageView\n * @returns {Promise} Returns a promise containing a {PDFPageProxy} object.\n * @private\n */\n _ensurePdfPageLoaded(pageView) {\n if (pageView.pdfPage) {\n return Promise.resolve(pageView.pdfPage);\n }\n if (this._pagesRequests.has(pageView)) {\n return this._pagesRequests.get(pageView);\n }\n const promise = this.pdfDocument\n .getPage(pageView.id)\n .then(pdfPage => {\n if (!pageView.pdfPage) {\n pageView.setPdfPage(pdfPage);\n }\n this._pagesRequests.delete(pageView);\n return pdfPage;\n })\n .catch(reason => {\n console.error(\"Unable to get page for page view\", reason);\n // Page error -- there is nothing that can be done.\n this._pagesRequests.delete(pageView);\n });\n this._pagesRequests.set(pageView, promise);\n return promise;\n }\n\n forceRendering(currentlyVisiblePages) {\n const visiblePages = currentlyVisiblePages || this._getVisiblePages();\n const scrollAhead = this._isScrollModeHorizontal\n ? this.scroll.right\n : this.scroll.down;\n const pageView = this.renderingQueue.getHighestPriority(\n visiblePages,\n this._pages,\n scrollAhead\n );\n if (pageView) {\n this._ensurePdfPageLoaded(pageView).then(() => {\n this.renderingQueue.renderView(pageView);\n });\n return true;\n }\n return false;\n }\n\n /**\n * @param {HTMLDivElement} textLayerDiv\n * @param {number} pageIndex\n * @param {PageViewport} viewport\n * @param {boolean} enhanceTextSelection\n * @param {EventBus} eventBus\n * @returns {TextLayerBuilder}\n */\n createTextLayerBuilder(\n textLayerDiv,\n pageIndex,\n viewport,\n enhanceTextSelection = false,\n eventBus\n ) {\n return new TextLayerBuilder({\n textLayerDiv,\n eventBus,\n pageIndex,\n viewport,\n findController: this.isInPresentationMode ? null : this.findController,\n enhanceTextSelection: this.isInPresentationMode\n ? false\n : enhanceTextSelection,\n });\n }\n\n /**\n * @param {HTMLDivElement} pageDiv\n * @param {PDFPage} pdfPage\n * @param {AnnotationStorage} [annotationStorage] - Storage for annotation\n * data in forms.\n * @param {string} [imageResourcesPath] - Path for image resources, mainly\n * for annotation icons. Include trailing slash.\n * @param {boolean} renderInteractiveForms\n * @param {IL10n} l10n\n * @param {boolean} [enableScripting]\n * @param {Promise<boolean>} [hasJSActionsPromise]\n * @param {Object} [mouseState]\n * @returns {AnnotationLayerBuilder}\n */\n createAnnotationLayerBuilder(\n pageDiv,\n pdfPage,\n annotationStorage = null,\n imageResourcesPath = \"\",\n renderInteractiveForms = false,\n l10n = NullL10n,\n enableScripting = null,\n hasJSActionsPromise = null,\n mouseState = null\n ) {\n return new AnnotationLayerBuilder({\n pageDiv,\n pdfPage,\n annotationStorage:\n annotationStorage || this.pdfDocument?.annotationStorage,\n imageResourcesPath,\n renderInteractiveForms,\n linkService: this.linkService,\n downloadManager: this.downloadManager,\n l10n,\n enableScripting: enableScripting ?? this.enableScripting,\n hasJSActionsPromise:\n hasJSActionsPromise || this.pdfDocument?.hasJSActions(),\n mouseState: mouseState || this._scriptingManager?.mouseState,\n });\n }\n\n /**\n * @param {HTMLDivElement} pageDiv\n * @param {PDFPage} pdfPage\n * @param {AnnotationStorage} [annotationStorage] - Storage for annotation\n * data in forms.\n * @returns {XfaLayerBuilder}\n */\n createXfaLayerBuilder(pageDiv, pdfPage, annotationStorage = null) {\n return new XfaLayerBuilder({\n pageDiv,\n pdfPage,\n annotationStorage:\n annotationStorage || this.pdfDocument?.annotationStorage,\n });\n }\n\n /**\n * @param {PDFPage} pdfPage\n * @returns {StructTreeLayerBuilder}\n */\n createStructTreeLayerBuilder(pdfPage) {\n return new StructTreeLayerBuilder({\n pdfPage,\n });\n }\n\n /**\n * @type {boolean} Whether all pages of the PDF document have identical\n * widths and heights.\n */\n get hasEqualPageSizes() {\n const firstPageView = this._pages[0];\n for (let i = 1, ii = this._pages.length; i < ii; ++i) {\n const pageView = this._pages[i];\n if (\n pageView.width !== firstPageView.width ||\n pageView.height !== firstPageView.height\n ) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Returns sizes of the pages.\n * @returns {Array} Array of objects with width/height/rotation fields.\n */\n getPagesOverview() {\n return this._pages.map(pageView => {\n const viewport = pageView.pdfPage.getViewport({ scale: 1 });\n\n if (!this.enablePrintAutoRotate || isPortraitOrientation(viewport)) {\n return {\n width: viewport.width,\n height: viewport.height,\n rotation: viewport.rotation,\n };\n }\n // Landscape orientation.\n return {\n width: viewport.height,\n height: viewport.width,\n rotation: (viewport.rotation - 90) % 360,\n };\n });\n }\n\n /**\n * @type {Promise<OptionalContentConfig | null>}\n */\n get optionalContentConfigPromise() {\n if (!this.pdfDocument) {\n return Promise.resolve(null);\n }\n if (!this._optionalContentConfigPromise) {\n // Prevent issues if the getter is accessed *before* the `onePageRendered`\n // promise has resolved; won't (normally) happen in the default viewer.\n return this.pdfDocument.getOptionalContentConfig();\n }\n return this._optionalContentConfigPromise;\n }\n\n /**\n * @param {Promise<OptionalContentConfig>} promise - A promise that is\n * resolved with an {@link OptionalContentConfig} instance.\n */\n set optionalContentConfigPromise(promise) {\n if (!(promise instanceof Promise)) {\n throw new Error(`Invalid optionalContentConfigPromise: ${promise}`);\n }\n if (!this.pdfDocument) {\n return;\n }\n if (!this._optionalContentConfigPromise) {\n // Ignore the setter *before* the `onePageRendered` promise has resolved,\n // since it'll be overwritten anyway; won't happen in the default viewer.\n return;\n }\n this._optionalContentConfigPromise = promise;\n\n for (const pageView of this._pages) {\n pageView.update(pageView.scale, pageView.rotation, promise);\n }\n this.update();\n\n this.eventBus.dispatch(\"optionalcontentconfigchanged\", {\n source: this,\n promise,\n });\n }\n\n /**\n * @type {number} One of the values in {ScrollMode}.\n */\n get scrollMode() {\n return this._scrollMode;\n }\n\n /**\n * @param {number} mode - The direction in which the document pages should be\n * laid out within the scrolling container.\n * The constants from {ScrollMode} should be used.\n */\n set scrollMode(mode) {\n if (this._scrollMode === mode) {\n return; // The Scroll mode didn't change.\n }\n if (!isValidScrollMode(mode)) {\n throw new Error(`Invalid scroll mode: ${mode}`);\n }\n this._scrollMode = mode;\n this.eventBus.dispatch(\"scrollmodechanged\", { source: this, mode });\n\n this._updateScrollMode(/* pageNumber = */ this._currentPageNumber);\n }\n\n _updateScrollMode(pageNumber = null) {\n const scrollMode = this._scrollMode,\n viewer = this.viewer;\n\n viewer.classList.toggle(\n \"scrollHorizontal\",\n scrollMode === ScrollMode.HORIZONTAL\n );\n viewer.classList.toggle(\"scrollWrapped\", scrollMode === ScrollMode.WRAPPED);\n\n if (!this.pdfDocument || !pageNumber) {\n return;\n }\n // Non-numeric scale values can be sensitive to the scroll orientation.\n // Call this before re-scrolling to the current page, to ensure that any\n // changes in scale don't move the current page.\n if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n this._setScale(this._currentScaleValue, true);\n }\n this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n this.update();\n }\n\n /**\n * @type {number} One of the values in {SpreadMode}.\n */\n get spreadMode() {\n return this._spreadMode;\n }\n\n /**\n * @param {number} mode - Group the pages in spreads, starting with odd- or\n * even-number pages (unless `SpreadMode.NONE` is used).\n * The constants from {SpreadMode} should be used.\n */\n set spreadMode(mode) {\n if (this._spreadMode === mode) {\n return; // The Spread mode didn't change.\n }\n if (!isValidSpreadMode(mode)) {\n throw new Error(`Invalid spread mode: ${mode}`);\n }\n this._spreadMode = mode;\n this.eventBus.dispatch(\"spreadmodechanged\", { source: this, mode });\n\n this._updateSpreadMode(/* pageNumber = */ this._currentPageNumber);\n }\n\n _updateSpreadMode(pageNumber = null) {\n if (!this.pdfDocument) {\n return;\n }\n const viewer = this.viewer,\n pages = this._pages;\n // Temporarily remove all the pages from the DOM.\n viewer.textContent = \"\";\n\n if (this._spreadMode === SpreadMode.NONE) {\n for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n viewer.appendChild(pages[i].div);\n }\n } else {\n const parity = this._spreadMode - 1;\n let spread = null;\n for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n if (spread === null) {\n spread = document.createElement(\"div\");\n spread.className = \"spread\";\n viewer.appendChild(spread);\n } else if (i % 2 === parity) {\n spread = spread.cloneNode(false);\n viewer.appendChild(spread);\n }\n spread.appendChild(pages[i].div);\n }\n }\n\n if (!pageNumber) {\n return;\n }\n if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n this._setScale(this._currentScaleValue, true);\n }\n this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n this.update();\n }\n\n /**\n * @private\n */\n _getPageAdvance(currentPageNumber, previous = false) {\n if (this.isInPresentationMode) {\n return 1;\n }\n switch (this._scrollMode) {\n case ScrollMode.WRAPPED: {\n const { views } = this._getVisiblePages(),\n pageLayout = new Map();\n\n // Determine the current (visible) page layout.\n for (const { id, y, percent, widthPercent } of views) {\n if (percent === 0 || widthPercent < 100) {\n continue;\n }\n let yArray = pageLayout.get(y);\n if (!yArray) {\n pageLayout.set(y, (yArray ||= []));\n }\n yArray.push(id);\n }\n // Find the row of the current page.\n for (const yArray of pageLayout.values()) {\n const currentIndex = yArray.indexOf(currentPageNumber);\n if (currentIndex === -1) {\n continue;\n }\n const numPages = yArray.length;\n if (numPages === 1) {\n break;\n }\n // Handle documents with varying page sizes.\n if (previous) {\n for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {\n const currentId = yArray[i],\n expectedId = yArray[i + 1] - 1;\n if (currentId < expectedId) {\n return currentPageNumber - expectedId;\n }\n }\n } else {\n for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {\n const currentId = yArray[i],\n expectedId = yArray[i - 1] + 1;\n if (currentId > expectedId) {\n return expectedId - currentPageNumber;\n }\n }\n }\n // The current row is \"complete\", advance to the previous/next one.\n if (previous) {\n const firstId = yArray[0];\n if (firstId < currentPageNumber) {\n return currentPageNumber - firstId + 1;\n }\n } else {\n const lastId = yArray[numPages - 1];\n if (lastId > currentPageNumber) {\n return lastId - currentPageNumber + 1;\n }\n }\n break;\n }\n break;\n }\n case ScrollMode.HORIZONTAL: {\n break;\n }\n case ScrollMode.VERTICAL: {\n if (this._spreadMode === SpreadMode.NONE) {\n break; // Normal vertical scrolling.\n }\n const parity = this._spreadMode - 1;\n\n if (previous && currentPageNumber % 2 !== parity) {\n break; // Left-hand side page.\n } else if (!previous && currentPageNumber % 2 === parity) {\n break; // Right-hand side page.\n }\n const { views } = this._getVisiblePages(),\n expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;\n\n for (const { id, percent, widthPercent } of views) {\n if (id !== expectedId) {\n continue;\n }\n if (percent > 0 && widthPercent === 100) {\n return 2;\n }\n break;\n }\n break;\n }\n }\n return 1;\n }\n\n /**\n * Go to the next page, taking scroll/spread-modes into account.\n * @returns {boolean} Whether navigation occured.\n */\n nextPage() {\n const currentPageNumber = this._currentPageNumber,\n pagesCount = this.pagesCount;\n\n if (currentPageNumber >= pagesCount) {\n return false;\n }\n const advance =\n this._getPageAdvance(currentPageNumber, /* previous = */ false) || 1;\n\n this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);\n return true;\n }\n\n /**\n * Go to the previous page, taking scroll/spread-modes into account.\n * @returns {boolean} Whether navigation occured.\n */\n previousPage() {\n const currentPageNumber = this._currentPageNumber;\n\n if (currentPageNumber <= 1) {\n return false;\n }\n const advance =\n this._getPageAdvance(currentPageNumber, /* previous = */ true) || 1;\n\n this.currentPageNumber = Math.max(currentPageNumber - advance, 1);\n return true;\n }\n}\n\nexport { BaseViewer };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationLayer } from \"pdfjs-lib\";\nimport { NullL10n } from \"./l10n_utils.js\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\n\n/**\n * @typedef {Object} AnnotationLayerBuilderOptions\n * @property {HTMLDivElement} pageDiv\n * @property {PDFPage} pdfPage\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n * for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms\n * @property {IPDFLinkService} linkService\n * @property {DownloadManager} downloadManager\n * @property {IL10n} l10n - Localization service.\n * @property {boolean} [enableScripting]\n * @property {Promise<boolean>} [hasJSActionsPromise]\n * @property {Object} [mouseState]\n */\n\nclass AnnotationLayerBuilder {\n /**\n * @param {AnnotationLayerBuilderOptions} options\n */\n constructor({\n pageDiv,\n pdfPage,\n linkService,\n downloadManager,\n annotationStorage = null,\n imageResourcesPath = \"\",\n renderInteractiveForms = true,\n l10n = NullL10n,\n enableScripting = false,\n hasJSActionsPromise = null,\n mouseState = null,\n }) {\n this.pageDiv = pageDiv;\n this.pdfPage = pdfPage;\n this.linkService = linkService;\n this.downloadManager = downloadManager;\n this.imageResourcesPath = imageResourcesPath;\n this.renderInteractiveForms = renderInteractiveForms;\n this.l10n = l10n;\n this.annotationStorage = annotationStorage;\n this.enableScripting = enableScripting;\n this._hasJSActionsPromise = hasJSActionsPromise;\n this._mouseState = mouseState;\n\n this.div = null;\n this._cancelled = false;\n }\n\n /**\n * @param {PageViewport} viewport\n * @param {string} intent (default value is 'display')\n * @returns {Promise<void>} A promise that is resolved when rendering of the\n * annotations is complete.\n */\n render(viewport, intent = \"display\") {\n return Promise.all([\n this.pdfPage.getAnnotations({ intent }),\n this._hasJSActionsPromise,\n ]).then(([annotations, hasJSActions = false]) => {\n if (this._cancelled) {\n return;\n }\n if (annotations.length === 0) {\n return;\n }\n\n const parameters = {\n viewport: viewport.clone({ dontFlip: true }),\n div: this.div,\n annotations,\n page: this.pdfPage,\n imageResourcesPath: this.imageResourcesPath,\n renderInteractiveForms: this.renderInteractiveForms,\n linkService: this.linkService,\n downloadManager: this.downloadManager,\n annotationStorage: this.annotationStorage,\n enableScripting: this.enableScripting,\n hasJSActions,\n mouseState: this._mouseState,\n };\n\n if (this.div) {\n // If an annotationLayer already exists, refresh its children's\n // transformation matrices.\n AnnotationLayer.update(parameters);\n } else {\n // Create an annotation layer div and render the annotations\n // if there is at least one annotation.\n this.div = document.createElement(\"div\");\n this.div.className = \"annotationLayer\";\n this.pageDiv.appendChild(this.div);\n parameters.div = this.div;\n\n AnnotationLayer.render(parameters);\n this.l10n.translate(this.div);\n }\n });\n }\n\n cancel() {\n this._cancelled = true;\n }\n\n hide() {\n if (!this.div) {\n return;\n }\n this.div.hidden = true;\n }\n}\n\n/**\n * @implements IPDFAnnotationLayerFactory\n */\nclass DefaultAnnotationLayerFactory {\n /**\n * @param {HTMLDivElement} pageDiv\n * @param {PDFPage} pdfPage\n * @param {AnnotationStorage} [annotationStorage]\n * @param {string} [imageResourcesPath] - Path for image resources, mainly\n * for annotation icons. Include trailing slash.\n * @param {boolean} renderInteractiveForms\n * @param {IL10n} l10n\n * @param {boolean} [enableScripting]\n * @param {Promise<boolean>} [hasJSActionsPromise]\n * @param {Object} [mouseState]\n * @returns {AnnotationLayerBuilder}\n */\n createAnnotationLayerBuilder(\n pageDiv,\n pdfPage,\n annotationStorage = null,\n imageResourcesPath = \"\",\n renderInteractiveForms = true,\n l10n = NullL10n,\n enableScripting = false,\n hasJSActionsPromise = null,\n mouseState = null\n ) {\n return new AnnotationLayerBuilder({\n pageDiv,\n pdfPage,\n imageResourcesPath,\n renderInteractiveForms,\n linkService: new SimpleLinkService(),\n l10n,\n annotationStorage,\n enableScripting,\n hasJSActionsPromise,\n mouseState,\n });\n }\n}\n\nexport { AnnotationLayerBuilder, DefaultAnnotationLayerFactory };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A subset of the l10n strings in the `l10n/en-US/viewer.properties` file.\n */\nconst DEFAULT_L10N_STRINGS = {\n of_pages: \"of {{pagesCount}}\",\n page_of_pages: \"({{pageNumber}} of {{pagesCount}})\",\n\n document_properties_kb: \"{{size_kb}} KB ({{size_b}} bytes)\",\n document_properties_mb: \"{{size_mb}} MB ({{size_b}} bytes)\",\n document_properties_date_string: \"{{date}}, {{time}}\",\n document_properties_page_size_unit_inches: \"in\",\n document_properties_page_size_unit_millimeters: \"mm\",\n document_properties_page_size_orientation_portrait: \"portrait\",\n document_properties_page_size_orientation_landscape: \"landscape\",\n document_properties_page_size_name_a3: \"A3\",\n document_properties_page_size_name_a4: \"A4\",\n document_properties_page_size_name_letter: \"Letter\",\n document_properties_page_size_name_legal: \"Legal\",\n document_properties_page_size_dimension_string:\n \"{{width}} × {{height}} {{unit}} ({{orientation}})\",\n document_properties_page_size_dimension_name_string:\n \"{{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})\",\n document_properties_linearized_yes: \"Yes\",\n document_properties_linearized_no: \"No\",\n\n print_progress_percent: \"{{progress}}%\",\n\n \"toggle_sidebar.title\": \"Toggle Sidebar\",\n \"toggle_sidebar_notification2.title\":\n \"Toggle Sidebar (document contains outline/attachments/layers)\",\n\n additional_layers: \"Additional Layers\",\n page_landmark: \"Page {{page}}\",\n thumb_page_title: \"Page {{page}}\",\n thumb_page_canvas: \"Thumbnail of Page {{page}}\",\n\n find_reached_top: \"Reached top of document, continued from bottom\",\n find_reached_bottom: \"Reached end of document, continued from top\",\n \"find_match_count[one]\": \"{{current}} of {{total}} match\",\n \"find_match_count[other]\": \"{{current}} of {{total}} matches\",\n \"find_match_count_limit[one]\": \"More than {{limit}} match\",\n \"find_match_count_limit[other]\": \"More than {{limit}} matches\",\n find_not_found: \"Phrase not found\",\n\n error_version_info: \"PDF.js v{{version}} (build: {{build}})\",\n error_message: \"Message: {{message}}\",\n error_stack: \"Stack: {{stack}}\",\n error_file: \"File: {{file}}\",\n error_line: \"Line: {{line}}\",\n rendering_error: \"An error occurred while rendering the page.\",\n\n page_scale_width: \"Page Width\",\n page_scale_fit: \"Page Fit\",\n page_scale_auto: \"Automatic Zoom\",\n page_scale_actual: \"Actual Size\",\n page_scale_percent: \"{{scale}}%\",\n\n loading: \"Loading…\",\n loading_error: \"An error occurred while loading the PDF.\",\n invalid_file_error: \"Invalid or corrupted PDF file.\",\n missing_file_error: \"Missing PDF file.\",\n unexpected_response_error: \"Unexpected server response.\",\n\n printing_not_supported:\n \"Warning: Printing is not fully supported by this browser.\",\n printing_not_ready: \"Warning: The PDF is not fully loaded for printing.\",\n web_fonts_disabled:\n \"Web fonts are disabled: unable to use embedded PDF fonts.\",\n};\n\nfunction getL10nFallback(key, args) {\n switch (key) {\n case \"find_match_count\":\n key = `find_match_count[${args.total === 1 ? \"one\" : \"other\"}]`;\n break;\n case \"find_match_count_limit\":\n key = `find_match_count_limit[${args.limit === 1 ? \"one\" : \"other\"}]`;\n break;\n }\n return DEFAULT_L10N_STRINGS[key] || \"\";\n}\n\nconst PARTIAL_LANG_CODES = {\n en: \"en-US\",\n es: \"es-ES\",\n fy: \"fy-NL\",\n ga: \"ga-IE\",\n gu: \"gu-IN\",\n hi: \"hi-IN\",\n hy: \"hy-AM\",\n nb: \"nb-NO\",\n ne: \"ne-NP\",\n nn: \"nn-NO\",\n pa: \"pa-IN\",\n pt: \"pt-PT\",\n sv: \"sv-SE\",\n zh: \"zh-CN\",\n};\n\n// Try to support \"incompletely\" specified language codes (see issue 13689).\nfunction fixupLangCode(langCode) {\n return PARTIAL_LANG_CODES[langCode?.toLowerCase()] || langCode;\n}\n\n// Replaces {{arguments}} with their values.\nfunction formatL10nValue(text, args) {\n if (!args) {\n return text;\n }\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (all, name) => {\n return name in args ? args[name] : \"{{\" + name + \"}}\";\n });\n}\n\n/**\n * No-op implementation of the localization service.\n * @implements {IL10n}\n */\nconst NullL10n = {\n async getLanguage() {\n return \"en-us\";\n },\n\n async getDirection() {\n return \"ltr\";\n },\n\n async get(key, args = null, fallback = getL10nFallback(key, args)) {\n return formatL10nValue(fallback, args);\n },\n\n async translate(element) {},\n};\n\nexport { fixupLangCode, getL10nFallback, NullL10n };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n approximateFraction,\n CSS_UNITS,\n DEFAULT_SCALE,\n getOutputScale,\n RendererType,\n roundToDivide,\n TextLayerMode,\n} from \"./ui_utils.js\";\nimport {\n createPromiseCapability,\n RenderingCancelledException,\n SVGGraphics,\n} from \"pdfjs-lib\";\nimport { NullL10n } from \"./l10n_utils.js\";\nimport { RenderingStates } from \"./pdf_rendering_queue.js\";\nimport { viewerCompatibilityParams } from \"./viewer_compatibility.js\";\n\n/**\n * @typedef {Object} PDFPageViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} id - The page unique ID (normally its number).\n * @property {number} scale - The page scale display.\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n * A promise that is resolved with an {@link OptionalContentConfig} instance.\n * The default value is `null`.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {IPDFTextLayerFactory} textLayerFactory\n * @property {number} [textLayerMode] - Controls if the text layer used for\n * selection and searching is created, and if the improved text selection\n * behaviour is enabled. The constants from {TextLayerMode} should be used.\n * The default value is `TextLayerMode.ENABLE`.\n * @property {IPDFAnnotationLayerFactory} annotationLayerFactory\n * @property {IPDFXfaLayerFactory} xfaLayerFactory\n * @property {IPDFStructTreeLayerFactory} structTreeLayerFactory\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n * for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms - Turns on rendering of\n * interactive form elements. The default value is `true`.\n * @property {string} renderer - 'canvas' or 'svg'. The default is 'canvas'.\n * @property {boolean} [useOnlyCssZoom] - Enables CSS only zooming. The default\n * value is `false`.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n * total pixels, i.e. width * height. Use -1 for no limit. The default value\n * is 4096 * 4096 (16 mega-pixels).\n * @property {IL10n} l10n - Localization service.\n */\n\nconst MAX_CANVAS_PIXELS = viewerCompatibilityParams.maxCanvasPixels || 16777216;\n\n/**\n * @implements {IRenderableView}\n */\nclass PDFPageView {\n /**\n * @param {PDFPageViewOptions} options\n */\n constructor(options) {\n const container = options.container;\n const defaultViewport = options.defaultViewport;\n\n this.id = options.id;\n this.renderingId = \"page\" + this.id;\n\n this.pdfPage = null;\n this.pageLabel = null;\n this.rotation = 0;\n this.scale = options.scale || DEFAULT_SCALE;\n this.viewport = defaultViewport;\n this.pdfPageRotate = defaultViewport.rotation;\n this._optionalContentConfigPromise =\n options.optionalContentConfigPromise || null;\n this.hasRestrictedScaling = false;\n this.textLayerMode = Number.isInteger(options.textLayerMode)\n ? options.textLayerMode\n : TextLayerMode.ENABLE;\n this.imageResourcesPath = options.imageResourcesPath || \"\";\n this.renderInteractiveForms = options.renderInteractiveForms !== false;\n this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;\n\n this.eventBus = options.eventBus;\n this.renderingQueue = options.renderingQueue;\n this.textLayerFactory = options.textLayerFactory;\n this.annotationLayerFactory = options.annotationLayerFactory;\n this.xfaLayerFactory = options.xfaLayerFactory;\n this.structTreeLayerFactory = options.structTreeLayerFactory;\n this.renderer = options.renderer || RendererType.CANVAS;\n this.l10n = options.l10n || NullL10n;\n\n this.paintTask = null;\n this.paintedViewportMap = new WeakMap();\n this.renderingState = RenderingStates.INITIAL;\n this.resume = null;\n this._renderError = null;\n\n this.annotationLayer = null;\n this.textLayer = null;\n this.zoomLayer = null;\n this.xfaLayer = null;\n this.structTreeLayer = null;\n\n const div = document.createElement(\"div\");\n div.className = \"page\";\n div.style.width = Math.floor(this.viewport.width) + \"px\";\n div.style.height = Math.floor(this.viewport.height) + \"px\";\n div.setAttribute(\"data-page-number\", this.id);\n div.setAttribute(\"role\", \"region\");\n this.l10n.get(\"page_landmark\", { page: this.id }).then(msg => {\n div.setAttribute(\"aria-label\", msg);\n });\n this.div = div;\n\n container.appendChild(div);\n }\n\n setPdfPage(pdfPage) {\n this.pdfPage = pdfPage;\n this.pdfPageRotate = pdfPage.rotate;\n\n const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n this.viewport = pdfPage.getViewport({\n scale: this.scale * CSS_UNITS,\n rotation: totalRotation,\n });\n this.reset();\n }\n\n destroy() {\n this.reset();\n if (this.pdfPage) {\n this.pdfPage.cleanup();\n }\n }\n\n /**\n * @private\n */\n async _renderAnnotationLayer() {\n let error = null;\n try {\n await this.annotationLayer.render(this.viewport, \"display\");\n } catch (ex) {\n error = ex;\n } finally {\n this.eventBus.dispatch(\"annotationlayerrendered\", {\n source: this,\n pageNumber: this.id,\n error,\n });\n }\n }\n\n /**\n * @private\n */\n async _renderXfaLayer() {\n let error = null;\n try {\n await this.xfaLayer.render(this.viewport, \"display\");\n } catch (ex) {\n error = ex;\n } finally {\n this.eventBus.dispatch(\"xfalayerrendered\", {\n source: this,\n pageNumber: this.id,\n error,\n });\n }\n }\n\n /**\n * @private\n */\n _resetZoomLayer(removeFromDOM = false) {\n if (!this.zoomLayer) {\n return;\n }\n const zoomLayerCanvas = this.zoomLayer.firstChild;\n this.paintedViewportMap.delete(zoomLayerCanvas);\n // Zeroing the width and height causes Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n zoomLayerCanvas.width = 0;\n zoomLayerCanvas.height = 0;\n\n if (removeFromDOM) {\n // Note: `ChildNode.remove` doesn't throw if the parent node is undefined.\n this.zoomLayer.remove();\n }\n this.zoomLayer = null;\n }\n\n reset({\n keepZoomLayer = false,\n keepAnnotationLayer = false,\n keepXfaLayer = false,\n } = {}) {\n this.cancelRendering({ keepAnnotationLayer, keepXfaLayer });\n this.renderingState = RenderingStates.INITIAL;\n\n const div = this.div;\n div.style.width = Math.floor(this.viewport.width) + \"px\";\n div.style.height = Math.floor(this.viewport.height) + \"px\";\n\n const childNodes = div.childNodes,\n zoomLayerNode = (keepZoomLayer && this.zoomLayer) || null,\n annotationLayerNode =\n (keepAnnotationLayer && this.annotationLayer?.div) || null,\n xfaLayerNode = (keepXfaLayer && this.xfaLayer?.div) || null;\n for (let i = childNodes.length - 1; i >= 0; i--) {\n const node = childNodes[i];\n switch (node) {\n case zoomLayerNode:\n case annotationLayerNode:\n case xfaLayerNode:\n continue;\n }\n div.removeChild(node);\n }\n div.removeAttribute(\"data-loaded\");\n\n if (annotationLayerNode) {\n // Hide the annotation layer until all elements are resized\n // so they are not displayed on the already resized page.\n this.annotationLayer.hide();\n }\n if (xfaLayerNode) {\n // Hide the XFA layer until all elements are resized\n // so they are not displayed on the already resized page.\n this.xfaLayer.hide();\n }\n\n if (!zoomLayerNode) {\n if (this.canvas) {\n this.paintedViewportMap.delete(this.canvas);\n // Zeroing the width and height causes Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n this.canvas.width = 0;\n this.canvas.height = 0;\n delete this.canvas;\n }\n this._resetZoomLayer();\n }\n if (this.svg) {\n this.paintedViewportMap.delete(this.svg);\n delete this.svg;\n }\n\n this.loadingIconDiv = document.createElement(\"div\");\n this.loadingIconDiv.className = \"loadingIcon\";\n this.loadingIconDiv.setAttribute(\"role\", \"img\");\n this.l10n.get(\"loading\").then(msg => {\n this.loadingIconDiv?.setAttribute(\"aria-label\", msg);\n });\n div.appendChild(this.loadingIconDiv);\n }\n\n update(scale, rotation, optionalContentConfigPromise = null) {\n this.scale = scale || this.scale;\n // The rotation may be zero.\n if (typeof rotation !== \"undefined\") {\n this.rotation = rotation;\n }\n if (optionalContentConfigPromise instanceof Promise) {\n this._optionalContentConfigPromise = optionalContentConfigPromise;\n }\n\n const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n this.viewport = this.viewport.clone({\n scale: this.scale * CSS_UNITS,\n rotation: totalRotation,\n });\n\n if (this.svg) {\n this.cssTransform({\n target: this.svg,\n redrawAnnotationLayer: true,\n redrawXfaLayer: true,\n });\n\n this.eventBus.dispatch(\"pagerendered\", {\n source: this,\n pageNumber: this.id,\n cssTransform: true,\n timestamp: performance.now(),\n error: this._renderError,\n });\n return;\n }\n\n let isScalingRestricted = false;\n if (this.canvas && this.maxCanvasPixels > 0) {\n const outputScale = this.outputScale;\n if (\n ((Math.floor(this.viewport.width) * outputScale.sx) | 0) *\n ((Math.floor(this.viewport.height) * outputScale.sy) | 0) >\n this.maxCanvasPixels\n ) {\n isScalingRestricted = true;\n }\n }\n\n if (this.canvas) {\n if (\n this.useOnlyCssZoom ||\n (this.hasRestrictedScaling && isScalingRestricted)\n ) {\n this.cssTransform({\n target: this.canvas,\n redrawAnnotationLayer: true,\n redrawXfaLayer: true,\n });\n\n this.eventBus.dispatch(\"pagerendered\", {\n source: this,\n pageNumber: this.id,\n cssTransform: true,\n timestamp: performance.now(),\n error: this._renderError,\n });\n return;\n }\n if (!this.zoomLayer && !this.canvas.hidden) {\n this.zoomLayer = this.canvas.parentNode;\n this.zoomLayer.style.position = \"absolute\";\n }\n }\n if (this.zoomLayer) {\n this.cssTransform({ target: this.zoomLayer.firstChild });\n }\n this.reset({\n keepZoomLayer: true,\n keepAnnotationLayer: true,\n keepXfaLayer: true,\n });\n }\n\n /**\n * PLEASE NOTE: Most likely you want to use the `this.reset()` method,\n * rather than calling this one directly.\n */\n cancelRendering({ keepAnnotationLayer = false, keepXfaLayer = false } = {}) {\n if (this.paintTask) {\n this.paintTask.cancel();\n this.paintTask = null;\n }\n this.resume = null;\n\n if (this.textLayer) {\n this.textLayer.cancel();\n this.textLayer = null;\n }\n if (\n this.annotationLayer &&\n (!keepAnnotationLayer || !this.annotationLayer.div)\n ) {\n this.annotationLayer.cancel();\n this.annotationLayer = null;\n }\n if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) {\n this.xfaLayer.cancel();\n this.xfaLayer = null;\n }\n if (this._onTextLayerRendered) {\n this.eventBus._off(\"textlayerrendered\", this._onTextLayerRendered);\n this._onTextLayerRendered = null;\n }\n }\n\n cssTransform({\n target,\n redrawAnnotationLayer = false,\n redrawXfaLayer = false,\n }) {\n // Scale target (canvas or svg), its wrapper and page container.\n const width = this.viewport.width;\n const height = this.viewport.height;\n const div = this.div;\n target.style.width =\n target.parentNode.style.width =\n div.style.width =\n Math.floor(width) + \"px\";\n target.style.height =\n target.parentNode.style.height =\n div.style.height =\n Math.floor(height) + \"px\";\n // The canvas may have been originally rotated; rotate relative to that.\n const relativeRotation =\n this.viewport.rotation - this.paintedViewportMap.get(target).rotation;\n const absRotation = Math.abs(relativeRotation);\n let scaleX = 1,\n scaleY = 1;\n if (absRotation === 90 || absRotation === 270) {\n // Scale x and y because of the rotation.\n scaleX = height / width;\n scaleY = width / height;\n }\n target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`;\n\n if (this.textLayer) {\n // Rotating the text layer is more complicated since the divs inside the\n // the text layer are rotated.\n // TODO: This could probably be simplified by drawing the text layer in\n // one orientation and then rotating overall.\n const textLayerViewport = this.textLayer.viewport;\n const textRelativeRotation =\n this.viewport.rotation - textLayerViewport.rotation;\n const textAbsRotation = Math.abs(textRelativeRotation);\n let scale = width / textLayerViewport.width;\n if (textAbsRotation === 90 || textAbsRotation === 270) {\n scale = width / textLayerViewport.height;\n }\n const textLayerDiv = this.textLayer.textLayerDiv;\n let transX, transY;\n switch (textAbsRotation) {\n case 0:\n transX = transY = 0;\n break;\n case 90:\n transX = 0;\n transY = \"-\" + textLayerDiv.style.height;\n break;\n case 180:\n transX = \"-\" + textLayerDiv.style.width;\n transY = \"-\" + textLayerDiv.style.height;\n break;\n case 270:\n transX = \"-\" + textLayerDiv.style.width;\n transY = 0;\n break;\n default:\n console.error(\"Bad rotation value.\");\n break;\n }\n\n textLayerDiv.style.transform =\n `rotate(${textAbsRotation}deg) ` +\n `scale(${scale}) ` +\n `translate(${transX}, ${transY})`;\n textLayerDiv.style.transformOrigin = \"0% 0%\";\n }\n\n if (redrawAnnotationLayer && this.annotationLayer) {\n this._renderAnnotationLayer();\n }\n if (redrawXfaLayer && this.xfaLayer) {\n this._renderXfaLayer();\n }\n }\n\n get width() {\n return this.viewport.width;\n }\n\n get height() {\n return this.viewport.height;\n }\n\n getPagePoint(x, y) {\n return this.viewport.convertToPdfPoint(x, y);\n }\n\n draw() {\n if (this.renderingState !== RenderingStates.INITIAL) {\n console.error(\"Must be in new state before drawing\");\n this.reset(); // Ensure that we reset all state to prevent issues.\n }\n const { div, pdfPage } = this;\n\n if (!pdfPage) {\n this.renderingState = RenderingStates.FINISHED;\n\n if (this.loadingIconDiv) {\n div.removeChild(this.loadingIconDiv);\n delete this.loadingIconDiv;\n }\n return Promise.reject(new Error(\"pdfPage is not loaded\"));\n }\n\n this.renderingState = RenderingStates.RUNNING;\n\n // Wrap the canvas so that if it has a CSS transform for high DPI the\n // overflow will be hidden in Firefox.\n const canvasWrapper = document.createElement(\"div\");\n canvasWrapper.style.width = div.style.width;\n canvasWrapper.style.height = div.style.height;\n canvasWrapper.classList.add(\"canvasWrapper\");\n\n if (this.annotationLayer?.div) {\n // The annotation layer needs to stay on top.\n div.insertBefore(canvasWrapper, this.annotationLayer.div);\n } else {\n div.appendChild(canvasWrapper);\n }\n\n let textLayer = null;\n if (this.textLayerMode !== TextLayerMode.DISABLE && this.textLayerFactory) {\n const textLayerDiv = document.createElement(\"div\");\n textLayerDiv.className = \"textLayer\";\n textLayerDiv.style.width = canvasWrapper.style.width;\n textLayerDiv.style.height = canvasWrapper.style.height;\n if (this.annotationLayer?.div) {\n // The annotation layer needs to stay on top.\n div.insertBefore(textLayerDiv, this.annotationLayer.div);\n } else {\n div.appendChild(textLayerDiv);\n }\n\n textLayer = this.textLayerFactory.createTextLayerBuilder(\n textLayerDiv,\n this.id - 1,\n this.viewport,\n this.textLayerMode === TextLayerMode.ENABLE_ENHANCE,\n this.eventBus\n );\n }\n this.textLayer = textLayer;\n\n if (this.xfaLayer?.div) {\n // The xfa layer needs to stay on top.\n div.appendChild(this.xfaLayer.div);\n }\n\n let renderContinueCallback = null;\n if (this.renderingQueue) {\n renderContinueCallback = cont => {\n if (!this.renderingQueue.isHighestPriority(this)) {\n this.renderingState = RenderingStates.PAUSED;\n this.resume = () => {\n this.renderingState = RenderingStates.RUNNING;\n cont();\n };\n return;\n }\n cont();\n };\n }\n\n const finishPaintTask = async (error = null) => {\n // The paintTask may have been replaced by a new one, so only remove\n // the reference to the paintTask if it matches the one that is\n // triggering this callback.\n if (paintTask === this.paintTask) {\n this.paintTask = null;\n }\n\n if (error instanceof RenderingCancelledException) {\n this._renderError = null;\n return;\n }\n this._renderError = error;\n\n this.renderingState = RenderingStates.FINISHED;\n\n if (this.loadingIconDiv) {\n div.removeChild(this.loadingIconDiv);\n delete this.loadingIconDiv;\n }\n this._resetZoomLayer(/* removeFromDOM = */ true);\n\n this.eventBus.dispatch(\"pagerendered\", {\n source: this,\n pageNumber: this.id,\n cssTransform: false,\n timestamp: performance.now(),\n error: this._renderError,\n });\n\n if (error) {\n throw error;\n }\n };\n\n const paintTask =\n this.renderer === RendererType.SVG\n ? this.paintOnSvg(canvasWrapper)\n : this.paintOnCanvas(canvasWrapper);\n paintTask.onRenderContinue = renderContinueCallback;\n this.paintTask = paintTask;\n\n const resultPromise = paintTask.promise.then(\n () => {\n return finishPaintTask(null).then(() => {\n if (textLayer) {\n const readableStream = pdfPage.streamTextContent({\n normalizeWhitespace: true,\n includeMarkedContent: true,\n });\n textLayer.setTextContentStream(readableStream);\n textLayer.render();\n }\n });\n },\n function (reason) {\n return finishPaintTask(reason);\n }\n );\n\n if (this.annotationLayerFactory) {\n if (!this.annotationLayer) {\n this.annotationLayer =\n this.annotationLayerFactory.createAnnotationLayerBuilder(\n div,\n pdfPage,\n /* annotationStorage = */ null,\n this.imageResourcesPath,\n this.renderInteractiveForms,\n this.l10n,\n /* enableScripting */ null,\n /* hasJSActionsPromise = */ null,\n /* mouseState = */ null\n );\n }\n this._renderAnnotationLayer();\n }\n\n if (this.xfaLayerFactory) {\n if (!this.xfaLayer) {\n this.xfaLayer = this.xfaLayerFactory.createXfaLayerBuilder(\n div,\n pdfPage,\n /* annotationStorage = */ null\n );\n }\n this._renderXfaLayer();\n }\n\n // The structure tree is currently only supported when the text layer is\n // enabled and a canvas is used for rendering.\n if (this.structTreeLayerFactory && this.textLayer && this.canvas) {\n // The structure tree must be generated after the text layer for the\n // aria-owns to work.\n this._onTextLayerRendered = event => {\n if (event.pageNumber !== this.id) {\n return;\n }\n this.eventBus._off(\"textlayerrendered\", this._onTextLayerRendered);\n this._onTextLayerRendered = null;\n\n if (!this.canvas) {\n return; // The canvas was removed, prevent errors below.\n }\n this.pdfPage.getStructTree().then(tree => {\n if (!tree) {\n return;\n }\n if (!this.canvas) {\n return; // The canvas was removed, prevent errors below.\n }\n const treeDom = this.structTreeLayer.render(tree);\n treeDom.classList.add(\"structTree\");\n this.canvas.appendChild(treeDom);\n });\n };\n this.eventBus._on(\"textlayerrendered\", this._onTextLayerRendered);\n this.structTreeLayer =\n this.structTreeLayerFactory.createStructTreeLayerBuilder(pdfPage);\n }\n\n div.setAttribute(\"data-loaded\", true);\n\n this.eventBus.dispatch(\"pagerender\", {\n source: this,\n pageNumber: this.id,\n });\n return resultPromise;\n }\n\n paintOnCanvas(canvasWrapper) {\n const renderCapability = createPromiseCapability();\n const result = {\n promise: renderCapability.promise,\n onRenderContinue(cont) {\n cont();\n },\n cancel() {\n renderTask.cancel();\n },\n };\n\n const viewport = this.viewport;\n const canvas = document.createElement(\"canvas\");\n\n // Keep the canvas hidden until the first draw callback, or until drawing\n // is complete when `!this.renderingQueue`, to prevent black flickering.\n canvas.hidden = true;\n let isCanvasHidden = true;\n const showCanvas = function () {\n if (isCanvasHidden) {\n canvas.hidden = false;\n isCanvasHidden = false;\n }\n };\n\n canvasWrapper.appendChild(canvas);\n this.canvas = canvas;\n\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"MOZCENTRAL || GENERIC\")\n ) {\n canvas.mozOpaque = true;\n }\n\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n const outputScale = getOutputScale(ctx);\n this.outputScale = outputScale;\n\n if (this.useOnlyCssZoom) {\n const actualSizeViewport = viewport.clone({ scale: CSS_UNITS });\n // Use a scale that makes the canvas have the originally intended size\n // of the page.\n outputScale.sx *= actualSizeViewport.width / viewport.width;\n outputScale.sy *= actualSizeViewport.height / viewport.height;\n outputScale.scaled = true;\n }\n\n if (this.maxCanvasPixels > 0) {\n const pixelsInViewport = viewport.width * viewport.height;\n const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);\n if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n outputScale.sx = maxScale;\n outputScale.sy = maxScale;\n outputScale.scaled = true;\n this.hasRestrictedScaling = true;\n } else {\n this.hasRestrictedScaling = false;\n }\n }\n\n const sfx = approximateFraction(outputScale.sx);\n const sfy = approximateFraction(outputScale.sy);\n canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]);\n canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]);\n canvas.style.width = roundToDivide(viewport.width, sfx[1]) + \"px\";\n canvas.style.height = roundToDivide(viewport.height, sfy[1]) + \"px\";\n // Add the viewport so it's known what it was originally drawn with.\n this.paintedViewportMap.set(canvas, viewport);\n\n // Rendering area\n const transform = !outputScale.scaled\n ? null\n : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n const renderContext = {\n canvasContext: ctx,\n transform,\n viewport: this.viewport,\n renderInteractiveForms: this.renderInteractiveForms,\n optionalContentConfigPromise: this._optionalContentConfigPromise,\n };\n const renderTask = this.pdfPage.render(renderContext);\n renderTask.onContinue = function (cont) {\n showCanvas();\n if (result.onRenderContinue) {\n result.onRenderContinue(cont);\n } else {\n cont();\n }\n };\n\n renderTask.promise.then(\n function () {\n showCanvas();\n renderCapability.resolve(undefined);\n },\n function (error) {\n showCanvas();\n renderCapability.reject(error);\n }\n );\n return result;\n }\n\n paintOnSvg(wrapper) {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"MOZCENTRAL || CHROME\")\n ) {\n // Return a mock object, to prevent errors such as e.g.\n // \"TypeError: paintTask.promise is undefined\".\n return {\n promise: Promise.reject(new Error(\"SVG rendering is not supported.\")),\n onRenderContinue(cont) {},\n cancel() {},\n };\n }\n\n let cancelled = false;\n const ensureNotCancelled = () => {\n if (cancelled) {\n throw new RenderingCancelledException(\n `Rendering cancelled, page ${this.id}`,\n \"svg\"\n );\n }\n };\n\n const pdfPage = this.pdfPage;\n const actualSizeViewport = this.viewport.clone({ scale: CSS_UNITS });\n const promise = pdfPage.getOperatorList().then(opList => {\n ensureNotCancelled();\n const svgGfx = new SVGGraphics(\n pdfPage.commonObjs,\n pdfPage.objs,\n /* forceDataSchema = */ viewerCompatibilityParams.disableCreateObjectURL\n );\n return svgGfx.getSVG(opList, actualSizeViewport).then(svg => {\n ensureNotCancelled();\n this.svg = svg;\n this.paintedViewportMap.set(svg, actualSizeViewport);\n\n svg.style.width = wrapper.style.width;\n svg.style.height = wrapper.style.height;\n this.renderingState = RenderingStates.FINISHED;\n wrapper.appendChild(svg);\n });\n });\n\n return {\n promise,\n onRenderContinue(cont) {\n cont();\n },\n cancel() {\n cancelled = true;\n },\n };\n }\n\n /**\n * @param {string|null} label\n */\n setPageLabel(label) {\n this.pageLabel = typeof label === \"string\" ? label : null;\n\n if (this.pageLabel !== null) {\n this.div.setAttribute(\"data-page-label\", this.pageLabel);\n } else {\n this.div.removeAttribute(\"data-page-label\");\n }\n }\n}\n\nexport { PDFPageView };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst PDF_ROLE_TO_HTML_ROLE = {\n // Document level structure types\n Document: null, // There's a \"document\" role, but it doesn't make sense here.\n DocumentFragment: null,\n // Grouping level structure types\n Part: \"group\",\n Sect: \"group\", // XXX: There's a \"section\" role, but it's abstract.\n Div: \"group\",\n Aside: \"note\",\n NonStruct: \"none\",\n // Block level structure types\n P: null,\n // H<n>,\n H: \"heading\",\n Title: null,\n FENote: \"note\",\n // Sub-block level structure type\n Sub: \"group\",\n // General inline level structure types\n Lbl: null,\n Span: null,\n Em: null,\n Strong: null,\n Link: \"link\",\n Annot: \"note\",\n Form: \"form\",\n // Ruby and Warichu structure types\n Ruby: null,\n RB: null,\n RT: null,\n RP: null,\n Warichu: null,\n WT: null,\n WP: null,\n // List standard structure types\n L: \"list\",\n LI: \"listitem\",\n LBody: null,\n // Table standard structure types\n Table: \"table\",\n TR: \"row\",\n TH: \"columnheader\",\n TD: \"cell\",\n THead: \"columnheader\",\n TBody: null,\n TFoot: null,\n // Standard structure type Caption\n Caption: null,\n // Standard structure type Figure\n Figure: \"figure\",\n // Standard structure type Formula\n Formula: null,\n // standard structure type Artifact\n Artifact: null,\n};\n\nconst HEADING_PATTERN = /^H(\\d+)$/;\n\n/**\n * @typedef {Object} StructTreeLayerBuilderOptions\n * @property {PDFPage} pdfPage\n */\n\nclass StructTreeLayerBuilder {\n /**\n * @param {StructTreeLayerBuilderOptions} options\n */\n constructor({ pdfPage }) {\n this.pdfPage = pdfPage;\n }\n\n render(structTree) {\n return this._walk(structTree);\n }\n\n _setAttributes(structElement, htmlElement) {\n if (structElement.alt !== undefined) {\n htmlElement.setAttribute(\"aria-label\", structElement.alt);\n }\n if (structElement.id !== undefined) {\n htmlElement.setAttribute(\"aria-owns\", structElement.id);\n }\n }\n\n _walk(node) {\n if (!node) {\n return null;\n }\n\n const element = document.createElement(\"span\");\n if (\"role\" in node) {\n const { role } = node;\n const match = role.match(HEADING_PATTERN);\n if (match) {\n element.setAttribute(\"role\", \"heading\");\n element.setAttribute(\"aria-level\", match[1]);\n } else if (PDF_ROLE_TO_HTML_ROLE[role]) {\n element.setAttribute(\"role\", PDF_ROLE_TO_HTML_ROLE[role]);\n }\n }\n\n this._setAttributes(node, element);\n\n if (node.children) {\n if (node.children.length === 1 && \"id\" in node.children[0]) {\n // Often there is only one content node so just set the values on the\n // parent node to avoid creating an extra span.\n this._setAttributes(node.children[0], element);\n } else {\n for (const kid of node.children) {\n element.appendChild(this._walk(kid));\n }\n }\n }\n return element;\n }\n}\n\n/**\n * @implements IPDFStructTreeLayerFactory\n */\nclass DefaultStructTreeLayerFactory {\n /**\n * @param {PDFPage} pdfPage\n * @returns {StructTreeLayerBuilder}\n */\n createStructTreeLayerBuilder(pdfPage) {\n return new StructTreeLayerBuilder({\n pdfPage,\n });\n }\n}\n\nexport { DefaultStructTreeLayerFactory, StructTreeLayerBuilder };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { renderTextLayer } from \"pdfjs-lib\";\n\nconst EXPAND_DIVS_TIMEOUT = 300; // ms\n\n/**\n * @typedef {Object} TextLayerBuilderOptions\n * @property {HTMLDivElement} textLayerDiv - The text layer container.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} pageIndex - The page index.\n * @property {PageViewport} viewport - The viewport of the text layer.\n * @property {PDFFindController} findController\n * @property {boolean} enhanceTextSelection - Option to turn on improved\n * text selection.\n */\n\n/**\n * The text layer builder provides text selection functionality for the PDF.\n * It does this by creating overlay divs over the PDF's text. These divs\n * contain text that matches the PDF text they are overlaying. This object\n * also provides a way to highlight text that is being searched for.\n */\nclass TextLayerBuilder {\n constructor({\n textLayerDiv,\n eventBus,\n pageIndex,\n viewport,\n findController = null,\n enhanceTextSelection = false,\n }) {\n this.textLayerDiv = textLayerDiv;\n this.eventBus = eventBus;\n this.textContent = null;\n this.textContentItemsStr = [];\n this.textContentStream = null;\n this.renderingDone = false;\n this.pageIdx = pageIndex;\n this.pageNumber = this.pageIdx + 1;\n this.matches = [];\n this.viewport = viewport;\n this.textDivs = [];\n this.findController = findController;\n this.textLayerRenderTask = null;\n this.enhanceTextSelection = enhanceTextSelection;\n\n this._onUpdateTextLayerMatches = null;\n this._bindMouse();\n }\n\n /**\n * @private\n */\n _finishRendering() {\n this.renderingDone = true;\n\n if (!this.enhanceTextSelection) {\n const endOfContent = document.createElement(\"div\");\n endOfContent.className = \"endOfContent\";\n this.textLayerDiv.appendChild(endOfContent);\n }\n\n this.eventBus.dispatch(\"textlayerrendered\", {\n source: this,\n pageNumber: this.pageNumber,\n numTextDivs: this.textDivs.length,\n });\n }\n\n /**\n * Renders the text layer.\n *\n * @param {number} [timeout] - Wait for a specified amount of milliseconds\n * before rendering.\n */\n render(timeout = 0) {\n if (!(this.textContent || this.textContentStream) || this.renderingDone) {\n return;\n }\n this.cancel();\n\n this.textDivs = [];\n const textLayerFrag = document.createDocumentFragment();\n this.textLayerRenderTask = renderTextLayer({\n textContent: this.textContent,\n textContentStream: this.textContentStream,\n container: textLayerFrag,\n viewport: this.viewport,\n textDivs: this.textDivs,\n textContentItemsStr: this.textContentItemsStr,\n timeout,\n enhanceTextSelection: this.enhanceTextSelection,\n });\n this.textLayerRenderTask.promise.then(\n () => {\n this.textLayerDiv.appendChild(textLayerFrag);\n this._finishRendering();\n this._updateMatches();\n },\n function (reason) {\n // Cancelled or failed to render text layer; skipping errors.\n }\n );\n\n if (!this._onUpdateTextLayerMatches) {\n this._onUpdateTextLayerMatches = evt => {\n if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) {\n this._updateMatches();\n }\n };\n this.eventBus._on(\n \"updatetextlayermatches\",\n this._onUpdateTextLayerMatches\n );\n }\n }\n\n /**\n * Cancel rendering of the text layer.\n */\n cancel() {\n if (this.textLayerRenderTask) {\n this.textLayerRenderTask.cancel();\n this.textLayerRenderTask = null;\n }\n if (this._onUpdateTextLayerMatches) {\n this.eventBus._off(\n \"updatetextlayermatches\",\n this._onUpdateTextLayerMatches\n );\n this._onUpdateTextLayerMatches = null;\n }\n }\n\n setTextContentStream(readableStream) {\n this.cancel();\n this.textContentStream = readableStream;\n }\n\n setTextContent(textContent) {\n this.cancel();\n this.textContent = textContent;\n }\n\n _convertMatches(matches, matchesLength) {\n // Early exit if there is nothing to convert.\n if (!matches) {\n return [];\n }\n const { textContentItemsStr } = this;\n\n let i = 0,\n iIndex = 0;\n const end = textContentItemsStr.length - 1;\n const result = [];\n\n for (let m = 0, mm = matches.length; m < mm; m++) {\n // Calculate the start position.\n let matchIdx = matches[m];\n\n // Loop over the divIdxs.\n while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n iIndex += textContentItemsStr[i].length;\n i++;\n }\n\n if (i === textContentItemsStr.length) {\n console.error(\"Could not find a matching mapping\");\n }\n\n const match = {\n begin: {\n divIdx: i,\n offset: matchIdx - iIndex,\n },\n };\n\n // Calculate the end position.\n matchIdx += matchesLength[m];\n\n // Somewhat the same array as above, but use > instead of >= to get\n // the end position right.\n while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n iIndex += textContentItemsStr[i].length;\n i++;\n }\n\n match.end = {\n divIdx: i,\n offset: matchIdx - iIndex,\n };\n result.push(match);\n }\n return result;\n }\n\n _renderMatches(matches) {\n // Early exit if there is nothing to render.\n if (matches.length === 0) {\n return;\n }\n const { findController, pageIdx, textContentItemsStr, textDivs } = this;\n\n const isSelectedPage = pageIdx === findController.selected.pageIdx;\n const selectedMatchIdx = findController.selected.matchIdx;\n const highlightAll = findController.state.highlightAll;\n let prevEnd = null;\n const infinity = {\n divIdx: -1,\n offset: undefined,\n };\n\n function beginText(begin, className) {\n const divIdx = begin.divIdx;\n textDivs[divIdx].textContent = \"\";\n return appendTextToDiv(divIdx, 0, begin.offset, className);\n }\n\n function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n const div = textDivs[divIdx];\n const content = textContentItemsStr[divIdx].substring(\n fromOffset,\n toOffset\n );\n const node = document.createTextNode(content);\n if (className) {\n const span = document.createElement(\"span\");\n span.className = `${className} appended`;\n span.appendChild(node);\n div.appendChild(span);\n return className.includes(\"selected\") ? span.offsetLeft : 0;\n }\n div.appendChild(node);\n return 0;\n }\n\n let i0 = selectedMatchIdx,\n i1 = i0 + 1;\n if (highlightAll) {\n i0 = 0;\n i1 = matches.length;\n } else if (!isSelectedPage) {\n // Not highlighting all and this isn't the selected page, so do nothing.\n return;\n }\n\n for (let i = i0; i < i1; i++) {\n const match = matches[i];\n const begin = match.begin;\n const end = match.end;\n const isSelected = isSelectedPage && i === selectedMatchIdx;\n const highlightSuffix = isSelected ? \" selected\" : \"\";\n let selectedLeft = 0;\n\n // Match inside new div.\n if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n // If there was a previous div, then add the text at the end.\n if (prevEnd !== null) {\n appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n }\n // Clear the divs and set the content until the starting point.\n beginText(begin);\n } else {\n appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n }\n\n if (begin.divIdx === end.divIdx) {\n selectedLeft = appendTextToDiv(\n begin.divIdx,\n begin.offset,\n end.offset,\n \"highlight\" + highlightSuffix\n );\n } else {\n selectedLeft = appendTextToDiv(\n begin.divIdx,\n begin.offset,\n infinity.offset,\n \"highlight begin\" + highlightSuffix\n );\n for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n textDivs[n0].className = \"highlight middle\" + highlightSuffix;\n }\n beginText(end, \"highlight end\" + highlightSuffix);\n }\n prevEnd = end;\n\n if (isSelected) {\n // Attempt to scroll the selected match into view.\n findController.scrollMatchIntoView({\n element: textDivs[begin.divIdx],\n selectedLeft,\n pageIndex: pageIdx,\n matchIndex: selectedMatchIdx,\n });\n }\n }\n\n if (prevEnd) {\n appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n }\n }\n\n _updateMatches() {\n // Only show matches when all rendering is done.\n if (!this.renderingDone) {\n return;\n }\n const { findController, matches, pageIdx, textContentItemsStr, textDivs } =\n this;\n let clearedUntilDivIdx = -1;\n\n // Clear all current matches.\n for (let i = 0, ii = matches.length; i < ii; i++) {\n const match = matches[i];\n const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n for (let n = begin, end = match.end.divIdx; n <= end; n++) {\n const div = textDivs[n];\n div.textContent = textContentItemsStr[n];\n div.className = \"\";\n }\n clearedUntilDivIdx = match.end.divIdx + 1;\n }\n\n if (!findController?.highlightMatches) {\n return;\n }\n // Convert the matches on the `findController` into the match format\n // used for the textLayer.\n const pageMatches = findController.pageMatches[pageIdx] || null;\n const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;\n\n this.matches = this._convertMatches(pageMatches, pageMatchesLength);\n this._renderMatches(this.matches);\n }\n\n /**\n * Improves text selection by adding an additional div where the mouse was\n * clicked. This reduces flickering of the content if the mouse is slowly\n * dragged up or down.\n *\n * @private\n */\n _bindMouse() {\n const div = this.textLayerDiv;\n let expandDivsTimer = null;\n\n div.addEventListener(\"mousedown\", evt => {\n if (this.enhanceTextSelection && this.textLayerRenderTask) {\n this.textLayerRenderTask.expandTextDivs(true);\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n expandDivsTimer\n ) {\n clearTimeout(expandDivsTimer);\n expandDivsTimer = null;\n }\n return;\n }\n\n const end = div.querySelector(\".endOfContent\");\n if (!end) {\n return;\n }\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n // On non-Firefox browsers, the selection will feel better if the height\n // of the `endOfContent` div is adjusted to start at mouse click\n // location. This avoids flickering when the selection moves up.\n // However it does not work when selection is started on empty space.\n let adjustTop = evt.target !== div;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n adjustTop =\n adjustTop &&\n window\n .getComputedStyle(end)\n .getPropertyValue(\"-moz-user-select\") !== \"none\";\n }\n if (adjustTop) {\n const divBounds = div.getBoundingClientRect();\n const r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\n end.style.top = (r * 100).toFixed(2) + \"%\";\n }\n }\n end.classList.add(\"active\");\n });\n\n div.addEventListener(\"mouseup\", () => {\n if (this.enhanceTextSelection && this.textLayerRenderTask) {\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n expandDivsTimer = setTimeout(() => {\n if (this.textLayerRenderTask) {\n this.textLayerRenderTask.expandTextDivs(false);\n }\n expandDivsTimer = null;\n }, EXPAND_DIVS_TIMEOUT);\n } else {\n this.textLayerRenderTask.expandTextDivs(false);\n }\n return;\n }\n\n const end = div.querySelector(\".endOfContent\");\n if (!end) {\n return;\n }\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n end.style.top = \"\";\n }\n end.classList.remove(\"active\");\n });\n }\n}\n\n/**\n * @implements IPDFTextLayerFactory\n */\nclass DefaultTextLayerFactory {\n /**\n * @param {HTMLDivElement} textLayerDiv\n * @param {number} pageIndex\n * @param {PageViewport} viewport\n * @param {boolean} enhanceTextSelection\n * @param {EventBus} eventBus\n * @returns {TextLayerBuilder}\n */\n createTextLayerBuilder(\n textLayerDiv,\n pageIndex,\n viewport,\n enhanceTextSelection = false,\n eventBus\n ) {\n return new TextLayerBuilder({\n textLayerDiv,\n pageIndex,\n viewport,\n enhanceTextSelection,\n eventBus,\n });\n }\n}\n\nexport { DefaultTextLayerFactory, TextLayerBuilder };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { XfaLayer } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} XfaLayerBuilderOptions\n * @property {HTMLDivElement} pageDiv\n * @property {PDFPage} pdfPage\n * @property {AnnotationStorage} [annotationStorage]\n */\n\nclass XfaLayerBuilder {\n /**\n * @param {XfaLayerBuilderOptions} options\n */\n constructor({ pageDiv, pdfPage, xfaHtml, annotationStorage }) {\n this.pageDiv = pageDiv;\n this.pdfPage = pdfPage;\n this.xfaHtml = xfaHtml;\n this.annotationStorage = annotationStorage;\n\n this.div = null;\n this._cancelled = false;\n }\n\n /**\n * @param {PageViewport} viewport\n * @param {string} intent (default value is 'display')\n * @returns {Promise<void>} A promise that is resolved when rendering of the\n * annotations is complete.\n */\n render(viewport, intent = \"display\") {\n if (intent === \"print\") {\n const parameters = {\n viewport: viewport.clone({ dontFlip: true }),\n div: this.div,\n xfa: this.xfaHtml,\n page: null,\n annotationStorage: this.annotationStorage,\n intent,\n };\n\n // Create an xfa layer div and render the form\n const div = document.createElement(\"div\");\n this.pageDiv.appendChild(div);\n parameters.div = div;\n\n XfaLayer.render(parameters);\n return Promise.resolve();\n }\n\n // intent === \"display\"\n return this.pdfPage\n .getXfa()\n .then(xfa => {\n if (this._cancelled) {\n return;\n }\n const parameters = {\n viewport: viewport.clone({ dontFlip: true }),\n div: this.div,\n xfa,\n page: this.pdfPage,\n annotationStorage: this.annotationStorage,\n intent,\n };\n\n if (this.div) {\n XfaLayer.update(parameters);\n } else {\n // Create an xfa layer div and render the form\n this.div = document.createElement(\"div\");\n this.pageDiv.appendChild(this.div);\n parameters.div = this.div;\n\n XfaLayer.render(parameters);\n }\n })\n .catch(error => {\n console.error(error);\n });\n }\n\n cancel() {\n this._cancelled = true;\n }\n\n hide() {\n if (!this.div) {\n return;\n }\n this.div.hidden = true;\n }\n}\n\n/**\n * @implements IPDFXfaLayerFactory\n */\nclass DefaultXfaLayerFactory {\n /**\n * @param {HTMLDivElement} pageDiv\n * @param {PDFPage} pdfPage\n * @param {AnnotationStorage} [annotationStorage]\n * @param {Object} [xfaHtml]\n */\n createXfaLayerBuilder(\n pageDiv,\n pdfPage,\n annotationStorage = null,\n xfaHtml = null\n ) {\n return new XfaLayerBuilder({\n pageDiv,\n pdfPage,\n annotationStorage,\n xfaHtml,\n });\n }\n}\n\nexport { DefaultXfaLayerFactory, XfaLayerBuilder };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SCROLLBAR_PADDING, ScrollMode, SpreadMode } from \"./ui_utils.js\";\nimport { CursorTool } from \"./pdf_cursor_tools.js\";\nimport { PDFSinglePageViewer } from \"./pdf_single_page_viewer.js\";\n\n/**\n * @typedef {Object} SecondaryToolbarOptions\n * @property {HTMLDivElement} toolbar - Container for the secondary toolbar.\n * @property {HTMLButtonElement} toggleButton - Button to toggle the visibility\n * of the secondary toolbar.\n * @property {HTMLDivElement} toolbarButtonContainer - Container where all the\n * toolbar buttons are placed. The maximum height of the toolbar is controlled\n * dynamically by adjusting the 'max-height' CSS property of this DOM element.\n * @property {HTMLButtonElement} presentationModeButton - Button for entering\n * presentation mode.\n * @property {HTMLButtonElement} openFileButton - Button to open a file.\n * @property {HTMLButtonElement} printButton - Button to print the document.\n * @property {HTMLButtonElement} downloadButton - Button to download the\n * document.\n * @property {HTMLLinkElement} viewBookmarkButton - Button to obtain a bookmark\n * link to the current location in the document.\n * @property {HTMLButtonElement} firstPageButton - Button to go to the first\n * page in the document.\n * @property {HTMLButtonElement} lastPageButton - Button to go to the last page\n * in the document.\n * @property {HTMLButtonElement} pageRotateCwButton - Button to rotate the pages\n * clockwise.\n * @property {HTMLButtonElement} pageRotateCcwButton - Button to rotate the\n * pages counterclockwise.\n * @property {HTMLButtonElement} cursorSelectToolButton - Button to enable the\n * select tool.\n * @property {HTMLButtonElement} cursorHandToolButton - Button to enable the\n * hand tool.\n * @property {HTMLButtonElement} documentPropertiesButton - Button for opening\n * the document properties dialog.\n */\n\nclass SecondaryToolbar {\n /**\n * @param {SecondaryToolbarOptions} options\n * @param {HTMLDivElement} mainContainer\n * @param {EventBus} eventBus\n */\n constructor(options, mainContainer, eventBus) {\n this.toolbar = options.toolbar;\n this.toggleButton = options.toggleButton;\n this.toolbarButtonContainer = options.toolbarButtonContainer;\n this.buttons = [\n {\n element: options.presentationModeButton,\n eventName: \"presentationmode\",\n close: true,\n },\n { element: options.openFileButton, eventName: \"openfile\", close: true },\n { element: options.printButton, eventName: \"print\", close: true },\n { element: options.downloadButton, eventName: \"download\", close: true },\n { element: options.viewBookmarkButton, eventName: null, close: true },\n { element: options.firstPageButton, eventName: \"firstpage\", close: true },\n { element: options.lastPageButton, eventName: \"lastpage\", close: true },\n {\n element: options.pageRotateCwButton,\n eventName: \"rotatecw\",\n close: false,\n },\n {\n element: options.pageRotateCcwButton,\n eventName: \"rotateccw\",\n close: false,\n },\n {\n element: options.cursorSelectToolButton,\n eventName: \"switchcursortool\",\n eventDetails: { tool: CursorTool.SELECT },\n close: true,\n },\n {\n element: options.cursorHandToolButton,\n eventName: \"switchcursortool\",\n eventDetails: { tool: CursorTool.HAND },\n close: true,\n },\n {\n element: options.scrollVerticalButton,\n eventName: \"switchscrollmode\",\n eventDetails: { mode: ScrollMode.VERTICAL },\n close: true,\n },\n {\n element: options.scrollHorizontalButton,\n eventName: \"switchscrollmode\",\n eventDetails: { mode: ScrollMode.HORIZONTAL },\n close: true,\n },\n {\n element: options.scrollWrappedButton,\n eventName: \"switchscrollmode\",\n eventDetails: { mode: ScrollMode.WRAPPED },\n close: true,\n },\n {\n element: options.spreadNoneButton,\n eventName: \"switchspreadmode\",\n eventDetails: { mode: SpreadMode.NONE },\n close: true,\n },\n {\n element: options.spreadOddButton,\n eventName: \"switchspreadmode\",\n eventDetails: { mode: SpreadMode.ODD },\n close: true,\n },\n {\n element: options.spreadEvenButton,\n eventName: \"switchspreadmode\",\n eventDetails: { mode: SpreadMode.EVEN },\n close: true,\n },\n {\n element: options.documentPropertiesButton,\n eventName: \"documentproperties\",\n close: true,\n },\n ];\n this.items = {\n firstPage: options.firstPageButton,\n lastPage: options.lastPageButton,\n pageRotateCw: options.pageRotateCwButton,\n pageRotateCcw: options.pageRotateCcwButton,\n };\n\n this.mainContainer = mainContainer;\n this.eventBus = eventBus;\n\n this.opened = false;\n this.containerHeight = null;\n this.previousContainerHeight = null;\n\n this.reset();\n\n // Bind the event listeners for click, cursor tool, and scroll/spread mode\n // actions.\n this._bindClickListeners();\n this._bindCursorToolsListener(options);\n this._bindScrollModeListener(options);\n this._bindSpreadModeListener(options);\n\n // Bind the event listener for adjusting the 'max-height' of the toolbar.\n this.eventBus._on(\"resize\", this._setMaxHeight.bind(this));\n\n // Hide the Scroll/Spread mode buttons, when they're not applicable to the\n // current `BaseViewer` instance (in particular `PDFSinglePageViewer`).\n this.eventBus._on(\"baseviewerinit\", evt => {\n if (evt.source instanceof PDFSinglePageViewer) {\n this.toolbarButtonContainer.classList.add(\n \"hiddenScrollModeButtons\",\n \"hiddenSpreadModeButtons\"\n );\n } else {\n this.toolbarButtonContainer.classList.remove(\n \"hiddenScrollModeButtons\",\n \"hiddenSpreadModeButtons\"\n );\n }\n });\n }\n\n /**\n * @type {boolean}\n */\n get isOpen() {\n return this.opened;\n }\n\n setPageNumber(pageNumber) {\n this.pageNumber = pageNumber;\n this._updateUIState();\n }\n\n setPagesCount(pagesCount) {\n this.pagesCount = pagesCount;\n this._updateUIState();\n }\n\n reset() {\n this.pageNumber = 0;\n this.pagesCount = 0;\n this._updateUIState();\n\n // Reset the Scroll/Spread buttons too, since they're document specific.\n this.eventBus.dispatch(\"secondarytoolbarreset\", { source: this });\n }\n\n _updateUIState() {\n this.items.firstPage.disabled = this.pageNumber <= 1;\n this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;\n this.items.pageRotateCw.disabled = this.pagesCount === 0;\n this.items.pageRotateCcw.disabled = this.pagesCount === 0;\n }\n\n _bindClickListeners() {\n // Button to toggle the visibility of the secondary toolbar.\n this.toggleButton.addEventListener(\"click\", this.toggle.bind(this));\n\n // All items within the secondary toolbar.\n for (const { element, eventName, close, eventDetails } of this.buttons) {\n element.addEventListener(\"click\", evt => {\n if (eventName !== null) {\n const details = { source: this };\n for (const property in eventDetails) {\n details[property] = eventDetails[property];\n }\n this.eventBus.dispatch(eventName, details);\n }\n if (close) {\n this.close();\n }\n });\n }\n }\n\n _bindCursorToolsListener(buttons) {\n this.eventBus._on(\"cursortoolchanged\", function ({ tool }) {\n buttons.cursorSelectToolButton.classList.toggle(\n \"toggled\",\n tool === CursorTool.SELECT\n );\n buttons.cursorHandToolButton.classList.toggle(\n \"toggled\",\n tool === CursorTool.HAND\n );\n });\n }\n\n _bindScrollModeListener(buttons) {\n function scrollModeChanged({ mode }) {\n buttons.scrollVerticalButton.classList.toggle(\n \"toggled\",\n mode === ScrollMode.VERTICAL\n );\n buttons.scrollHorizontalButton.classList.toggle(\n \"toggled\",\n mode === ScrollMode.HORIZONTAL\n );\n buttons.scrollWrappedButton.classList.toggle(\n \"toggled\",\n mode === ScrollMode.WRAPPED\n );\n\n // Temporarily *disable* the Spread buttons when horizontal scrolling is\n // enabled, since the non-default Spread modes doesn't affect the layout.\n const isScrollModeHorizontal = mode === ScrollMode.HORIZONTAL;\n buttons.spreadNoneButton.disabled = isScrollModeHorizontal;\n buttons.spreadOddButton.disabled = isScrollModeHorizontal;\n buttons.spreadEvenButton.disabled = isScrollModeHorizontal;\n }\n this.eventBus._on(\"scrollmodechanged\", scrollModeChanged);\n\n this.eventBus._on(\"secondarytoolbarreset\", evt => {\n if (evt.source === this) {\n scrollModeChanged({ mode: ScrollMode.VERTICAL });\n }\n });\n }\n\n _bindSpreadModeListener(buttons) {\n function spreadModeChanged({ mode }) {\n buttons.spreadNoneButton.classList.toggle(\n \"toggled\",\n mode === SpreadMode.NONE\n );\n buttons.spreadOddButton.classList.toggle(\n \"toggled\",\n mode === SpreadMode.ODD\n );\n buttons.spreadEvenButton.classList.toggle(\n \"toggled\",\n mode === SpreadMode.EVEN\n );\n }\n this.eventBus._on(\"spreadmodechanged\", spreadModeChanged);\n\n this.eventBus._on(\"secondarytoolbarreset\", evt => {\n if (evt.source === this) {\n spreadModeChanged({ mode: SpreadMode.NONE });\n }\n });\n }\n\n open() {\n if (this.opened) {\n return;\n }\n this.opened = true;\n this._setMaxHeight();\n\n this.toggleButton.classList.add(\"toggled\");\n this.toggleButton.setAttribute(\"aria-expanded\", \"true\");\n this.toolbar.classList.remove(\"hidden\");\n }\n\n close() {\n if (!this.opened) {\n return;\n }\n this.opened = false;\n this.toolbar.classList.add(\"hidden\");\n this.toggleButton.classList.remove(\"toggled\");\n this.toggleButton.setAttribute(\"aria-expanded\", \"false\");\n }\n\n toggle() {\n if (this.opened) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * @private\n */\n _setMaxHeight() {\n if (!this.opened) {\n return; // Only adjust the 'max-height' if the toolbar is visible.\n }\n this.containerHeight = this.mainContainer.clientHeight;\n\n if (this.containerHeight === this.previousContainerHeight) {\n return;\n }\n this.toolbarButtonContainer.style.maxHeight = `${\n this.containerHeight - SCROLLBAR_PADDING\n }px`;\n\n this.previousContainerHeight = this.containerHeight;\n }\n}\n\nexport { SecondaryToolbar };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseViewer } from \"./base_viewer.js\";\nimport { shadow } from \"pdfjs-lib\";\n\nclass PDFSinglePageViewer extends BaseViewer {\n constructor(options) {\n super(options);\n\n this.eventBus._on(\"pagesinit\", evt => {\n // Since the pages are placed in a `DocumentFragment`, make sure that\n // the current page becomes visible upon loading of the document.\n this._ensurePageViewVisible();\n });\n }\n\n get _viewerElement() {\n // Since we only want to display *one* page at a time when using the\n // `PDFSinglePageViewer`, we cannot append them to the `viewer` DOM element.\n // Instead, they are placed in a `DocumentFragment`, and only the current\n // page is displayed in the viewer (refer to `this._ensurePageViewVisible`).\n return shadow(this, \"_viewerElement\", this._shadowViewer);\n }\n\n get _pageWidthScaleFactor() {\n return 1;\n }\n\n _resetView() {\n super._resetView();\n this._previousPageNumber = 1;\n this._shadowViewer = document.createDocumentFragment();\n this._updateScrollDown = null;\n }\n\n _ensurePageViewVisible() {\n const pageView = this._pages[this._currentPageNumber - 1];\n const previousPageView = this._pages[this._previousPageNumber - 1];\n\n const viewerNodes = this.viewer.childNodes;\n switch (viewerNodes.length) {\n case 0: // Should *only* occur on initial loading.\n this.viewer.appendChild(pageView.div);\n break;\n case 1: // The normal page-switching case.\n if (viewerNodes[0] !== previousPageView.div) {\n throw new Error(\n \"_ensurePageViewVisible: Unexpected previously visible page.\"\n );\n }\n if (pageView === previousPageView) {\n break; // The correct page is already visible.\n }\n // Switch visible pages, and reset the viewerContainer scroll position.\n this._shadowViewer.appendChild(previousPageView.div);\n this.viewer.appendChild(pageView.div);\n\n this.container.scrollTop = 0;\n break;\n default:\n throw new Error(\n \"_ensurePageViewVisible: Only one page should be visible at a time.\"\n );\n }\n this._previousPageNumber = this._currentPageNumber;\n }\n\n _scrollUpdate() {\n if (this._updateScrollDown) {\n this._updateScrollDown();\n }\n super._scrollUpdate();\n }\n\n _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null }) {\n if (pageNumber) {\n // Ensure that `this._currentPageNumber` is correct.\n this._setCurrentPageNumber(pageNumber);\n }\n const scrolledDown = this._currentPageNumber >= this._previousPageNumber;\n\n this._ensurePageViewVisible();\n // Ensure that rendering always occurs, to avoid showing a blank page,\n // even if the current position doesn't change when the page is scrolled.\n this.update();\n\n super._scrollIntoView({ pageDiv, pageSpot, pageNumber });\n\n // Since scrolling is tracked using `requestAnimationFrame`, update the\n // scroll direction during the next `this._scrollUpdate` invocation.\n this._updateScrollDown = () => {\n this.scroll.down = scrolledDown;\n this._updateScrollDown = null;\n };\n }\n\n _getVisiblePages() {\n return this._getCurrentVisiblePage();\n }\n\n _updateHelper(visiblePages) {}\n\n get _isScrollModeHorizontal() {\n // The Scroll/Spread modes are never used in `PDFSinglePageViewer`.\n return shadow(this, \"_isScrollModeHorizontal\", false);\n }\n\n _updateScrollMode() {}\n\n _updateSpreadMode() {}\n\n _getPageAdvance() {\n return 1;\n }\n}\n\nexport { PDFSinglePageViewer };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n animationStarted,\n DEFAULT_SCALE,\n DEFAULT_SCALE_VALUE,\n MAX_SCALE,\n MIN_SCALE,\n noContextMenuHandler,\n} from \"./ui_utils.js\";\n\nconst PAGE_NUMBER_LOADING_INDICATOR = \"visiblePageIsLoading\";\n// Keep the two values below up-to-date with the values in `web/viewer.css`:\nconst SCALE_SELECT_CONTAINER_WIDTH = 140; // px\nconst SCALE_SELECT_WIDTH = 162; // px\n\n/**\n * @typedef {Object} ToolbarOptions\n * @property {HTMLDivElement} container - Container for the secondary toolbar.\n * @property {HTMLSpanElement} numPages - Label that contains number of pages.\n * @property {HTMLInputElement} pageNumber - Control for display and user input\n * of the current page number.\n * @property {HTMLSpanElement} scaleSelectContainer - Container where scale\n * controls are placed. The width is adjusted on UI initialization.\n * @property {HTMLSelectElement} scaleSelect - Scale selection control.\n * @property {HTMLOptionElement} customScaleOption - The item used to display\n * a non-predefined scale.\n * @property {HTMLButtonElement} previous - Button to go to the previous page.\n * @property {HTMLButtonElement} next - Button to go to the next page.\n * @property {HTMLButtonElement} zoomIn - Button to zoom in the pages.\n * @property {HTMLButtonElement} zoomOut - Button to zoom out the pages.\n * @property {HTMLButtonElement} viewFind - Button to open find bar.\n * @property {HTMLButtonElement} openFile - Button to open a new document.\n * @property {HTMLButtonElement} presentationModeButton - Button to switch to\n * presentation mode.\n * @property {HTMLButtonElement} download - Button to download the document.\n * @property {HTMLAElement} viewBookmark - Element to link current url of\n * the page view.\n */\n\nclass Toolbar {\n /**\n * @param {ToolbarOptions} options\n * @param {EventBus} eventBus\n * @param {IL10n} l10n - Localization service.\n */\n constructor(options, eventBus, l10n) {\n this.toolbar = options.container;\n this.eventBus = eventBus;\n this.l10n = l10n;\n this.buttons = [\n { element: options.previous, eventName: \"previouspage\" },\n { element: options.next, eventName: \"nextpage\" },\n { element: options.zoomIn, eventName: \"zoomin\" },\n { element: options.zoomOut, eventName: \"zoomout\" },\n { element: options.openFile, eventName: \"openfile\" },\n { element: options.print, eventName: \"print\" },\n {\n element: options.presentationModeButton,\n eventName: \"presentationmode\",\n },\n { element: options.download, eventName: \"download\" },\n { element: options.viewBookmark, eventName: null },\n ];\n this.items = {\n numPages: options.numPages,\n pageNumber: options.pageNumber,\n scaleSelectContainer: options.scaleSelectContainer,\n scaleSelect: options.scaleSelect,\n customScaleOption: options.customScaleOption,\n previous: options.previous,\n next: options.next,\n zoomIn: options.zoomIn,\n zoomOut: options.zoomOut,\n };\n\n this._wasLocalized = false;\n this.reset();\n\n // Bind the event listeners for click and various other actions.\n this._bindListeners();\n }\n\n setPageNumber(pageNumber, pageLabel) {\n this.pageNumber = pageNumber;\n this.pageLabel = pageLabel;\n this._updateUIState(false);\n }\n\n setPagesCount(pagesCount, hasPageLabels) {\n this.pagesCount = pagesCount;\n this.hasPageLabels = hasPageLabels;\n this._updateUIState(true);\n }\n\n setPageScale(pageScaleValue, pageScale) {\n this.pageScaleValue = (pageScaleValue || pageScale).toString();\n this.pageScale = pageScale;\n this._updateUIState(false);\n }\n\n reset() {\n this.pageNumber = 0;\n this.pageLabel = null;\n this.hasPageLabels = false;\n this.pagesCount = 0;\n this.pageScaleValue = DEFAULT_SCALE_VALUE;\n this.pageScale = DEFAULT_SCALE;\n this._updateUIState(true);\n this.updateLoadingIndicatorState();\n }\n\n _bindListeners() {\n const { pageNumber, scaleSelect } = this.items;\n const self = this;\n\n // The buttons within the toolbar.\n for (const { element, eventName } of this.buttons) {\n element.addEventListener(\"click\", evt => {\n if (eventName !== null) {\n this.eventBus.dispatch(eventName, { source: this });\n }\n });\n }\n // The non-button elements within the toolbar.\n pageNumber.addEventListener(\"click\", function () {\n this.select();\n });\n pageNumber.addEventListener(\"change\", function () {\n self.eventBus.dispatch(\"pagenumberchanged\", {\n source: self,\n value: this.value,\n });\n });\n\n scaleSelect.addEventListener(\"change\", function () {\n if (this.value === \"custom\") {\n return;\n }\n self.eventBus.dispatch(\"scalechanged\", {\n source: self,\n value: this.value,\n });\n });\n // Here we depend on browsers dispatching the \"click\" event *after* the\n // \"change\" event, when the <select>-element changes.\n scaleSelect.addEventListener(\"click\", function (evt) {\n const target = evt.target;\n // Remove focus when an <option>-element was *clicked*, to improve the UX\n // for mouse users (fixes bug 1300525 and issue 4923).\n if (\n this.value === self.pageScaleValue &&\n target.tagName.toUpperCase() === \"OPTION\"\n ) {\n this.blur();\n }\n });\n // Suppress context menus for some controls.\n scaleSelect.oncontextmenu = noContextMenuHandler;\n\n this.eventBus._on(\"localized\", () => {\n this._wasLocalized = true;\n this._adjustScaleWidth();\n this._updateUIState(true);\n });\n }\n\n _updateUIState(resetNumPages = false) {\n if (!this._wasLocalized) {\n // Don't update the UI state until we localize the toolbar.\n return;\n }\n const { pageNumber, pagesCount, pageScaleValue, pageScale, items } = this;\n\n if (resetNumPages) {\n if (this.hasPageLabels) {\n items.pageNumber.type = \"text\";\n } else {\n items.pageNumber.type = \"number\";\n this.l10n.get(\"of_pages\", { pagesCount }).then(msg => {\n items.numPages.textContent = msg;\n });\n }\n items.pageNumber.max = pagesCount;\n }\n\n if (this.hasPageLabels) {\n items.pageNumber.value = this.pageLabel;\n this.l10n.get(\"page_of_pages\", { pageNumber, pagesCount }).then(msg => {\n items.numPages.textContent = msg;\n });\n } else {\n items.pageNumber.value = pageNumber;\n }\n\n items.previous.disabled = pageNumber <= 1;\n items.next.disabled = pageNumber >= pagesCount;\n\n items.zoomOut.disabled = pageScale <= MIN_SCALE;\n items.zoomIn.disabled = pageScale >= MAX_SCALE;\n\n this.l10n\n .get(\"page_scale_percent\", { scale: Math.round(pageScale * 10000) / 100 })\n .then(msg => {\n let predefinedValueFound = false;\n for (const option of items.scaleSelect.options) {\n if (option.value !== pageScaleValue) {\n option.selected = false;\n continue;\n }\n option.selected = true;\n predefinedValueFound = true;\n }\n if (!predefinedValueFound) {\n items.customScaleOption.textContent = msg;\n items.customScaleOption.selected = true;\n }\n });\n }\n\n updateLoadingIndicatorState(loading = false) {\n const pageNumberInput = this.items.pageNumber;\n\n pageNumberInput.classList.toggle(PAGE_NUMBER_LOADING_INDICATOR, loading);\n }\n\n /**\n * Increase the width of the zoom dropdown DOM element if, and only if, it's\n * too narrow to fit the *longest* of the localized strings.\n * @private\n */\n async _adjustScaleWidth() {\n const { items, l10n } = this;\n\n const predefinedValuesPromise = Promise.all([\n l10n.get(\"page_scale_auto\"),\n l10n.get(\"page_scale_actual\"),\n l10n.get(\"page_scale_fit\"),\n l10n.get(\"page_scale_width\"),\n ]);\n\n // The temporary canvas is used to measure text length in the DOM.\n let canvas = document.createElement(\"canvas\");\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"MOZCENTRAL || GENERIC\")\n ) {\n canvas.mozOpaque = true;\n }\n let ctx = canvas.getContext(\"2d\", { alpha: false });\n\n await animationStarted;\n const { fontSize, fontFamily } = getComputedStyle(items.scaleSelect);\n ctx.font = `${fontSize} ${fontFamily}`;\n\n let maxWidth = 0;\n for (const predefinedValue of await predefinedValuesPromise) {\n const { width } = ctx.measureText(predefinedValue);\n if (width > maxWidth) {\n maxWidth = width;\n }\n }\n const overflow = SCALE_SELECT_WIDTH - SCALE_SELECT_CONTAINER_WIDTH;\n maxWidth += 2 * overflow;\n\n if (maxWidth > SCALE_SELECT_CONTAINER_WIDTH) {\n items.scaleSelect.style.width = `${maxWidth + overflow}px`;\n items.scaleSelectContainer.style.width = `${maxWidth}px`;\n }\n // Zeroing the width and height cause Firefox to release graphics resources\n // immediately, which can greatly reduce memory consumption.\n canvas.width = 0;\n canvas.height = 0;\n canvas = ctx = null;\n }\n}\n\nexport { Toolbar };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;\n\n/**\n * View History - This is a utility for saving various view parameters for\n * recently opened files.\n *\n * The way that the view parameters are stored depends on how PDF.js is built,\n * for 'gulp <flag>' the following cases exist:\n * - MOZCENTRAL - uses sessionStorage.\n * - GENERIC or CHROME - uses localStorage, if it is available.\n */\nclass ViewHistory {\n constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) {\n this.fingerprint = fingerprint;\n this.cacheSize = cacheSize;\n\n this._initializedPromise = this._readFromStorage().then(databaseStr => {\n const database = JSON.parse(databaseStr || \"{}\");\n let index = -1;\n if (!Array.isArray(database.files)) {\n database.files = [];\n } else {\n while (database.files.length >= this.cacheSize) {\n database.files.shift();\n }\n\n for (let i = 0, ii = database.files.length; i < ii; i++) {\n const branch = database.files[i];\n if (branch.fingerprint === this.fingerprint) {\n index = i;\n break;\n }\n }\n }\n if (index === -1) {\n index = database.files.push({ fingerprint: this.fingerprint }) - 1;\n }\n this.file = database.files[index];\n this.database = database;\n });\n }\n\n async _writeToStorage() {\n const databaseStr = JSON.stringify(this.database);\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n sessionStorage.setItem(\"pdfjs.history\", databaseStr);\n return;\n }\n localStorage.setItem(\"pdfjs.history\", databaseStr);\n }\n\n async _readFromStorage() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return sessionStorage.getItem(\"pdfjs.history\");\n }\n return localStorage.getItem(\"pdfjs.history\");\n }\n\n async set(name, val) {\n await this._initializedPromise;\n this.file[name] = val;\n return this._writeToStorage();\n }\n\n async setMultiple(properties) {\n await this._initializedPromise;\n for (const name in properties) {\n this.file[name] = properties[name];\n }\n return this._writeToStorage();\n }\n\n async get(name, defaultValue) {\n await this._initializedPromise;\n const val = this.file[name];\n return val !== undefined ? val : defaultValue;\n }\n\n async getMultiple(properties) {\n await this._initializedPromise;\n const values = Object.create(null);\n\n for (const name in properties) {\n const val = this.file[name];\n values[name] = val !== undefined ? val : properties[name];\n }\n return values;\n }\n}\n\nexport { ViewHistory };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DefaultExternalServices, PDFViewerApplication } from \"./app.js\";\nimport { BasePreferences } from \"./preferences.js\";\nimport { DownloadManager } from \"./download_manager.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { GenericScripting } from \"./generic_scripting.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/genericcom\" shall not be used outside ' +\n \"GENERIC build.\"\n );\n}\n\nconst GenericCom = {};\n\nclass GenericPreferences extends BasePreferences {\n async _writeToStorage(prefObj) {\n localStorage.setItem(\"pdfjs.preferences\", JSON.stringify(prefObj));\n }\n\n async _readFromStorage(prefObj) {\n return JSON.parse(localStorage.getItem(\"pdfjs.preferences\"));\n }\n}\n\nclass GenericExternalServices extends DefaultExternalServices {\n static createDownloadManager(options) {\n return new DownloadManager();\n }\n\n static createPreferences() {\n return new GenericPreferences();\n }\n\n static createL10n({ locale = \"en-US\" }) {\n return new GenericL10n(locale);\n }\n\n static createScripting({ sandboxBundleSrc }) {\n return new GenericScripting(sandboxBundleSrc);\n }\n}\nPDFViewerApplication.externalServices = GenericExternalServices;\n\nexport { GenericCom };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions, OptionKind } from \"./app_options.js\";\n\n/**\n * BasePreferences - Abstract base class for storing persistent settings.\n * Used for settings that should be applied to all opened documents,\n * or every time the viewer is loaded.\n */\nclass BasePreferences {\n constructor() {\n if (this.constructor === BasePreferences) {\n throw new Error(\"Cannot initialize BasePreferences.\");\n }\n Object.defineProperty(this, \"defaults\", {\n value: Object.freeze(\n typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")\n ? AppOptions.getAll(OptionKind.PREFERENCE)\n : PDFJSDev.eval(\"DEFAULT_PREFERENCES\")\n ),\n writable: false,\n enumerable: true,\n configurable: false,\n });\n this.prefs = Object.create(null);\n\n this._initializedPromise = this._readFromStorage(this.defaults).then(\n prefs => {\n for (const name in this.defaults) {\n const prefValue = prefs?.[name];\n // Ignore preferences whose types don't match the default values.\n if (typeof prefValue === typeof this.defaults[name]) {\n this.prefs[name] = prefValue;\n }\n }\n }\n );\n }\n\n /**\n * Stub function for writing preferences to storage.\n * @param {Object} prefObj The preferences that should be written to storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been written.\n */\n async _writeToStorage(prefObj) {\n throw new Error(\"Not implemented: _writeToStorage\");\n }\n\n /**\n * Stub function for reading preferences from storage.\n * @param {Object} prefObj The preferences that should be read from storage.\n * @returns {Promise} A promise that is resolved with an {Object} containing\n * the preferences that have been read.\n */\n async _readFromStorage(prefObj) {\n throw new Error(\"Not implemented: _readFromStorage\");\n }\n\n /**\n * Reset the preferences to their default values and update storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been reset.\n */\n async reset() {\n await this._initializedPromise;\n this.prefs = Object.create(null);\n return this._writeToStorage(this.defaults);\n }\n\n /**\n * Set the value of a preference.\n * @param {string} name The name of the preference that should be changed.\n * @param {boolean|number|string} value The new value of the preference.\n * @returns {Promise} A promise that is resolved when the value has been set,\n * provided that the preference exists and the types match.\n */\n async set(name, value) {\n await this._initializedPromise;\n const defaultValue = this.defaults[name];\n\n if (defaultValue === undefined) {\n throw new Error(`Set preference: \"${name}\" is undefined.`);\n } else if (value === undefined) {\n throw new Error(\"Set preference: no value is specified.\");\n }\n const valueType = typeof value;\n const defaultType = typeof defaultValue;\n\n if (valueType !== defaultType) {\n if (valueType === \"number\" && defaultType === \"string\") {\n value = value.toString();\n } else {\n throw new Error(\n `Set preference: \"${value}\" is a ${valueType}, expected a ${defaultType}.`\n );\n }\n } else {\n if (valueType === \"number\" && !Number.isInteger(value)) {\n throw new Error(`Set preference: \"${value}\" must be an integer.`);\n }\n }\n this.prefs[name] = value;\n return this._writeToStorage(this.prefs);\n }\n\n /**\n * Get the value of a preference.\n * @param {string} name The name of the preference whose value is requested.\n * @returns {Promise} A promise resolved with a {boolean|number|string}\n * containing the value of the preference.\n */\n async get(name) {\n await this._initializedPromise;\n const defaultValue = this.defaults[name],\n prefValue = this.prefs[name];\n\n if (defaultValue === undefined) {\n throw new Error(`Get preference: \"${name}\" is undefined.`);\n }\n return prefValue !== undefined ? prefValue : defaultValue;\n }\n\n /**\n * Get the values of all preferences.\n * @returns {Promise} A promise that is resolved with an {Object} containing\n * the values of all preferences.\n */\n async getAll() {\n await this._initializedPromise;\n const obj = Object.create(null);\n\n for (const name in this.defaults) {\n const prefValue = this.prefs[name];\n obj[name] = prefValue !== undefined ? prefValue : this.defaults[name];\n }\n return obj;\n }\n}\n\nexport { BasePreferences };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createObjectURL, createValidAbsoluteUrl, isPdfFile } from \"pdfjs-lib\";\nimport { viewerCompatibilityParams } from \"./viewer_compatibility.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"CHROME || GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/download_manager\" shall not be used ' +\n \"outside CHROME and GENERIC builds.\"\n );\n}\n\nfunction download(blobUrl, filename) {\n const a = document.createElement(\"a\");\n if (!a.click) {\n throw new Error('DownloadManager: \"a.click()\" is not supported.');\n }\n a.href = blobUrl;\n a.target = \"_parent\";\n // Use a.download if available. This increases the likelihood that\n // the file is downloaded instead of opened by another PDF plugin.\n if (\"download\" in a) {\n a.download = filename;\n }\n // <a> must be in the document for recent Firefox versions,\n // otherwise .click() is ignored.\n (document.body || document.documentElement).appendChild(a);\n a.click();\n a.remove();\n}\n\nclass DownloadManager {\n constructor() {\n this._openBlobUrls = new WeakMap();\n }\n\n downloadUrl(url, filename) {\n if (!createValidAbsoluteUrl(url, \"http://example.com\")) {\n return; // restricted/invalid URL\n }\n download(url + \"#pdfjs.action=download\", filename);\n }\n\n downloadData(data, filename, contentType) {\n const blobUrl = createObjectURL(\n data,\n contentType,\n viewerCompatibilityParams.disableCreateObjectURL\n );\n download(blobUrl, filename);\n }\n\n /**\n * @returns {boolean} Indicating if the data was opened.\n */\n openOrDownloadData(element, data, filename) {\n const isPdfData = isPdfFile(filename);\n const contentType = isPdfData ? \"application/pdf\" : \"\";\n\n if (isPdfData && !viewerCompatibilityParams.disableCreateObjectURL) {\n let blobUrl = this._openBlobUrls.get(element);\n if (!blobUrl) {\n blobUrl = URL.createObjectURL(new Blob([data], { type: contentType }));\n this._openBlobUrls.set(element, blobUrl);\n }\n let viewerUrl;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // The current URL is the viewer, let's use it and append the file.\n viewerUrl = \"?file=\" + encodeURIComponent(blobUrl + \"#\" + filename);\n } else if (PDFJSDev.test(\"CHROME\")) {\n // In the Chrome extension, the URL is rewritten using the history API\n // in viewer.js, so an absolute URL must be generated.\n viewerUrl =\n // eslint-disable-next-line no-undef\n chrome.runtime.getURL(\"/content/web/viewer.html\") +\n \"?file=\" +\n encodeURIComponent(blobUrl + \"#\" + filename);\n }\n\n try {\n window.open(viewerUrl);\n return true;\n } catch (ex) {\n console.error(`openOrDownloadData: ${ex}`);\n // Release the `blobUrl`, since opening it failed, and fallback to\n // downloading the PDF file.\n URL.revokeObjectURL(blobUrl);\n this._openBlobUrls.delete(element);\n }\n }\n\n this.downloadData(data, filename, contentType);\n return false;\n }\n\n /**\n * @param sourceEventType {string} Used to signal what triggered the download.\n * The version of PDF.js integrated with Firefox uses this to to determine\n * which dialog to show. \"save\" triggers \"save as\" and \"download\" triggers\n * the \"open with\" dialog.\n */\n download(blob, url, filename, sourceEventType = \"download\") {\n if (viewerCompatibilityParams.disableCreateObjectURL) {\n // URL.createObjectURL is not supported\n this.downloadUrl(url, filename);\n return;\n }\n const blobUrl = URL.createObjectURL(blob);\n download(blobUrl, filename);\n }\n}\n\nexport { DownloadManager };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport \"../external/webL10n/l10n.js\";\nimport { fixupLangCode, getL10nFallback } from \"./l10n_utils.js\";\n\nconst webL10n = document.webL10n;\n\nclass GenericL10n {\n constructor(lang) {\n this._lang = lang;\n this._ready = new Promise((resolve, reject) => {\n webL10n.setLanguage(fixupLangCode(lang), () => {\n resolve(webL10n);\n });\n });\n }\n\n async getLanguage() {\n const l10n = await this._ready;\n return l10n.getLanguage();\n }\n\n async getDirection() {\n const l10n = await this._ready;\n return l10n.getDirection();\n }\n\n async get(key, args = null, fallback = getL10nFallback(key, args)) {\n const l10n = await this._ready;\n return l10n.get(key, args, fallback);\n }\n\n async translate(element) {\n const l10n = await this._ready;\n return l10n.translate(element);\n }\n}\n\nexport { GenericL10n };\n","/**\n * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n/*\n Additional modifications for PDF.js project:\n - Disables language initialization on page loading.\n - Disables document translation on page loading.\n - Removes consoleWarn and consoleLog and use console.log/warn directly.\n - Removes window._ assignment.\n - Remove compatibility code for OldIE.\n - Replaces `String.prototype.substr()` with `String.prototype.substring()`.\n - Removes `fireL10nReadyEvent` since the \"localized\" event it dispatches\n is unused and may clash with an identically named event in the viewer.\n*/\n\n/*jshint browser: true, devel: true, es5: true, globalstrict: true */\n'use strict';\n\ndocument.webL10n = (function(window, document, undefined) {\n var gL10nData = {};\n var gTextData = '';\n var gTextProp = 'textContent';\n var gLanguage = '';\n var gMacros = {};\n var gReadyState = 'loading';\n\n\n /**\n * Synchronously loading l10n resources significantly minimizes flickering\n * from displaying the app with non-localized strings and then updating the\n * strings. Although this will block all script execution on this page, we\n * expect that the l10n resources are available locally on flash-storage.\n *\n * As synchronous XHR is generally considered as a bad idea, we're still\n * loading l10n resources asynchronously -- but we keep this in a setting,\n * just in case... and applications using this library should hide their\n * content until the `localized' event happens.\n */\n\n var gAsyncResourceLoading = true; // read-only\n\n\n /**\n * DOM helpers for the so-called \"HTML API\".\n *\n * These functions are written for modern browsers. For old versions of IE,\n * they're overridden in the 'startup' section at the end of this file.\n */\n\n function getL10nResourceLinks() {\n return document.querySelectorAll('link[type=\"application/l10n\"]');\n }\n\n function getL10nDictionary() {\n var script = document.querySelector('script[type=\"application/l10n\"]');\n // TODO: support multiple and external JSON dictionaries\n return script ? JSON.parse(script.innerHTML) : null;\n }\n\n function getTranslatableChildren(element) {\n return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n }\n\n function getL10nAttributes(element) {\n if (!element)\n return {};\n\n var l10nId = element.getAttribute('data-l10n-id');\n var l10nArgs = element.getAttribute('data-l10n-args');\n var args = {};\n if (l10nArgs) {\n try {\n args = JSON.parse(l10nArgs);\n } catch (e) {\n console.warn('could not parse arguments for #' + l10nId);\n }\n }\n return { id: l10nId, args: args };\n }\n\n function xhrLoadText(url, onSuccess, onFailure) {\n onSuccess = onSuccess || function _onSuccess(data) {};\n onFailure = onFailure || function _onFailure() {};\n\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, gAsyncResourceLoading);\n if (xhr.overrideMimeType) {\n xhr.overrideMimeType('text/plain; charset=utf-8');\n }\n xhr.onreadystatechange = function() {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status === 0) {\n onSuccess(xhr.responseText);\n } else {\n onFailure();\n }\n }\n };\n xhr.onerror = onFailure;\n xhr.ontimeout = onFailure;\n\n // in Firefox OS with the app:// protocol, trying to XHR a non-existing\n // URL will raise an exception here -- hence this ugly try...catch.\n try {\n xhr.send(null);\n } catch (e) {\n onFailure();\n }\n }\n\n\n /**\n * l10n resource parser:\n * - reads (async XHR) the l10n resource matching `lang';\n * - imports linked resources (synchronously) when specified;\n * - parses the text data (fills `gL10nData' and `gTextData');\n * - triggers success/failure callbacks when done.\n *\n * @param {string} href\n * URL of the l10n resource to parse.\n *\n * @param {string} lang\n * locale (language) to parse. Must be a lowercase string.\n *\n * @param {Function} successCallback\n * triggered when the l10n resource has been successfully parsed.\n *\n * @param {Function} failureCallback\n * triggered when the an error has occurred.\n *\n * @return {void}\n * uses the following global variables: gL10nData, gTextData, gTextProp.\n */\n\n function parseResource(href, lang, successCallback, failureCallback) {\n var baseURL = href.replace(/[^\\/]*$/, '') || './';\n\n // handle escaped characters (backslashes) in a string\n function evalString(text) {\n if (text.lastIndexOf('\\\\') < 0)\n return text;\n return text.replace(/\\\\\\\\/g, '\\\\')\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\r/g, '\\r')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\b/g, '\\b')\n .replace(/\\\\f/g, '\\f')\n .replace(/\\\\{/g, '{')\n .replace(/\\\\}/g, '}')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\'/g, \"'\");\n }\n\n // parse *.properties text data into an l10n dictionary\n // If gAsyncResourceLoading is false, then the callback will be called\n // synchronously. Otherwise it is called asynchronously.\n function parseProperties(text, parsedPropertiesCallback) {\n var dictionary = {};\n\n // token expressions\n var reBlank = /^\\s*|\\s*$/;\n var reComment = /^\\s*#|^\\s*$/;\n var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/; // TODO: escape EOLs with '\\'\n\n // parse the *.properties file into an associative array\n function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n var currentLang = '*';\n var genericLang = lang.split('-', 1)[0];\n var skipLang = false;\n var match = '';\n\n function nextEntry() {\n // Use infinite loop instead of recursion to avoid reaching the\n // maximum recursion limit for content with many lines.\n while (true) {\n if (!entries.length) {\n parsedRawLinesCallback();\n return;\n }\n var line = entries.shift();\n\n // comment or blank line?\n if (reComment.test(line))\n continue;\n\n // the extended syntax supports [lang] sections and @import rules\n if (extendedSyntax) {\n match = reSection.exec(line);\n if (match) { // section start?\n // RFC 4646, section 4.4, \"All comparisons MUST be performed\n // in a case-insensitive manner.\"\n\n currentLang = match[1].toLowerCase();\n skipLang = (currentLang !== '*') &&\n (currentLang !== lang) && (currentLang !== genericLang);\n continue;\n } else if (skipLang) {\n continue;\n }\n match = reImport.exec(line);\n if (match) { // @import rule?\n loadImport(baseURL + match[1], nextEntry);\n return;\n }\n }\n\n // key-value pair\n var tmp = line.match(reSplit);\n if (tmp && tmp.length == 3) {\n dictionary[tmp[1]] = evalString(tmp[2]);\n }\n }\n }\n nextEntry();\n }\n\n // import another *.properties file\n function loadImport(url, callback) {\n xhrLoadText(url, function(content) {\n parseRawLines(content, false, callback); // don't allow recursive imports\n }, function () {\n console.warn(url + ' not found.');\n callback();\n });\n }\n\n // fill the dictionary\n parseRawLines(text, true, function() {\n parsedPropertiesCallback(dictionary);\n });\n }\n\n // load and parse l10n data (warning: global variables are used here)\n xhrLoadText(href, function(response) {\n gTextData += response; // mostly for debug\n\n // parse *.properties text data into an l10n dictionary\n parseProperties(response, function(data) {\n\n // find attribute descriptions, if any\n for (var key in data) {\n var id, prop, index = key.lastIndexOf('.');\n if (index > 0) { // an attribute has been specified\n id = key.substring(0, index);\n prop = key.substring(index + 1);\n } else { // no attribute: assuming text content by default\n id = key;\n prop = gTextProp;\n }\n if (!gL10nData[id]) {\n gL10nData[id] = {};\n }\n gL10nData[id][prop] = data[key];\n }\n\n // trigger callback\n if (successCallback) {\n successCallback();\n }\n });\n }, failureCallback);\n }\n\n // load and parse all resources for the specified locale\n function loadLocale(lang, callback) {\n // RFC 4646, section 2.1 states that language tags have to be treated as\n // case-insensitive. Convert to lowercase for case-insensitive comparisons.\n if (lang) {\n lang = lang.toLowerCase();\n }\n\n callback = callback || function _callback() {};\n\n clear();\n gLanguage = lang;\n\n // check all <link type=\"application/l10n\" href=\"...\" /> nodes\n // and load the resource files\n var langLinks = getL10nResourceLinks();\n var langCount = langLinks.length;\n if (langCount === 0) {\n // we might have a pre-compiled dictionary instead\n var dict = getL10nDictionary();\n if (dict && dict.locales && dict.default_locale) {\n console.log('using the embedded JSON directory, early way out');\n gL10nData = dict.locales[lang];\n if (!gL10nData) {\n var defaultLocale = dict.default_locale.toLowerCase();\n for (var anyCaseLang in dict.locales) {\n anyCaseLang = anyCaseLang.toLowerCase();\n if (anyCaseLang === lang) {\n gL10nData = dict.locales[lang];\n break;\n } else if (anyCaseLang === defaultLocale) {\n gL10nData = dict.locales[defaultLocale];\n }\n }\n }\n callback();\n } else {\n console.log('no resource to load, early way out');\n }\n // early way out\n gReadyState = 'complete';\n return;\n }\n\n // start the callback when all resources are loaded\n var onResourceLoaded = null;\n var gResourceCount = 0;\n onResourceLoaded = function() {\n gResourceCount++;\n if (gResourceCount >= langCount) {\n callback();\n gReadyState = 'complete';\n }\n };\n\n // load all resource files\n function L10nResourceLink(link) {\n var href = link.href;\n // Note: If |gAsyncResourceLoading| is false, then the following callbacks\n // are synchronously called.\n this.load = function(lang, callback) {\n parseResource(href, lang, callback, function() {\n console.warn(href + ' not found.');\n // lang not found, used default resource instead\n console.warn('\"' + lang + '\" resource not found');\n gLanguage = '';\n // Resource not loaded, but we still need to call the callback.\n callback();\n });\n };\n }\n\n for (var i = 0; i < langCount; i++) {\n var resource = new L10nResourceLink(langLinks[i]);\n resource.load(lang, onResourceLoaded);\n }\n }\n\n // clear all l10n data\n function clear() {\n gL10nData = {};\n gTextData = '';\n gLanguage = '';\n // TODO: clear all non predefined macros.\n // There's no such macro /yet/ but we're planning to have some...\n }\n\n\n /**\n * Get rules for plural forms (shared with JetPack), see:\n * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\n * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p\n *\n * @param {string} lang\n * locale (language) used.\n *\n * @return {Function}\n * returns a function that gives the plural form name for a given integer:\n * var fun = getPluralRules('en');\n * fun(1) -> 'one'\n * fun(0) -> 'other'\n * fun(1000) -> 'other'.\n */\n\n function getPluralRules(lang) {\n var locales2rules = {\n 'af': 3,\n 'ak': 4,\n 'am': 4,\n 'ar': 1,\n 'asa': 3,\n 'az': 0,\n 'be': 11,\n 'bem': 3,\n 'bez': 3,\n 'bg': 3,\n 'bh': 4,\n 'bm': 0,\n 'bn': 3,\n 'bo': 0,\n 'br': 20,\n 'brx': 3,\n 'bs': 11,\n 'ca': 3,\n 'cgg': 3,\n 'chr': 3,\n 'cs': 12,\n 'cy': 17,\n 'da': 3,\n 'de': 3,\n 'dv': 3,\n 'dz': 0,\n 'ee': 3,\n 'el': 3,\n 'en': 3,\n 'eo': 3,\n 'es': 3,\n 'et': 3,\n 'eu': 3,\n 'fa': 0,\n 'ff': 5,\n 'fi': 3,\n 'fil': 4,\n 'fo': 3,\n 'fr': 5,\n 'fur': 3,\n 'fy': 3,\n 'ga': 8,\n 'gd': 24,\n 'gl': 3,\n 'gsw': 3,\n 'gu': 3,\n 'guw': 4,\n 'gv': 23,\n 'ha': 3,\n 'haw': 3,\n 'he': 2,\n 'hi': 4,\n 'hr': 11,\n 'hu': 0,\n 'id': 0,\n 'ig': 0,\n 'ii': 0,\n 'is': 3,\n 'it': 3,\n 'iu': 7,\n 'ja': 0,\n 'jmc': 3,\n 'jv': 0,\n 'ka': 0,\n 'kab': 5,\n 'kaj': 3,\n 'kcg': 3,\n 'kde': 0,\n 'kea': 0,\n 'kk': 3,\n 'kl': 3,\n 'km': 0,\n 'kn': 0,\n 'ko': 0,\n 'ksb': 3,\n 'ksh': 21,\n 'ku': 3,\n 'kw': 7,\n 'lag': 18,\n 'lb': 3,\n 'lg': 3,\n 'ln': 4,\n 'lo': 0,\n 'lt': 10,\n 'lv': 6,\n 'mas': 3,\n 'mg': 4,\n 'mk': 16,\n 'ml': 3,\n 'mn': 3,\n 'mo': 9,\n 'mr': 3,\n 'ms': 0,\n 'mt': 15,\n 'my': 0,\n 'nah': 3,\n 'naq': 7,\n 'nb': 3,\n 'nd': 3,\n 'ne': 3,\n 'nl': 3,\n 'nn': 3,\n 'no': 3,\n 'nr': 3,\n 'nso': 4,\n 'ny': 3,\n 'nyn': 3,\n 'om': 3,\n 'or': 3,\n 'pa': 3,\n 'pap': 3,\n 'pl': 13,\n 'ps': 3,\n 'pt': 3,\n 'rm': 3,\n 'ro': 9,\n 'rof': 3,\n 'ru': 11,\n 'rwk': 3,\n 'sah': 0,\n 'saq': 3,\n 'se': 7,\n 'seh': 3,\n 'ses': 0,\n 'sg': 0,\n 'sh': 11,\n 'shi': 19,\n 'sk': 12,\n 'sl': 14,\n 'sma': 7,\n 'smi': 7,\n 'smj': 7,\n 'smn': 7,\n 'sms': 7,\n 'sn': 3,\n 'so': 3,\n 'sq': 3,\n 'sr': 11,\n 'ss': 3,\n 'ssy': 3,\n 'st': 3,\n 'sv': 3,\n 'sw': 3,\n 'syr': 3,\n 'ta': 3,\n 'te': 3,\n 'teo': 3,\n 'th': 0,\n 'ti': 4,\n 'tig': 3,\n 'tk': 3,\n 'tl': 4,\n 'tn': 3,\n 'to': 0,\n 'tr': 0,\n 'ts': 3,\n 'tzm': 22,\n 'uk': 11,\n 'ur': 3,\n 've': 3,\n 'vi': 0,\n 'vun': 3,\n 'wa': 4,\n 'wae': 3,\n 'wo': 0,\n 'xh': 3,\n 'xog': 3,\n 'yo': 0,\n 'zh': 0,\n 'zu': 3\n };\n\n // utility functions for plural rules methods\n function isIn(n, list) {\n return list.indexOf(n) !== -1;\n }\n function isBetween(n, start, end) {\n return start <= n && n <= end;\n }\n\n // list of all plural rules methods:\n // map an integer to the plural form name to use\n var pluralRules = {\n '0': function(n) {\n return 'other';\n },\n '1': function(n) {\n if ((isBetween((n % 100), 3, 10)))\n return 'few';\n if (n === 0)\n return 'zero';\n if ((isBetween((n % 100), 11, 99)))\n return 'many';\n if (n == 2)\n return 'two';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '2': function(n) {\n if (n !== 0 && (n % 10) === 0)\n return 'many';\n if (n == 2)\n return 'two';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '3': function(n) {\n if (n == 1)\n return 'one';\n return 'other';\n },\n '4': function(n) {\n if ((isBetween(n, 0, 1)))\n return 'one';\n return 'other';\n },\n '5': function(n) {\n if ((isBetween(n, 0, 2)) && n != 2)\n return 'one';\n return 'other';\n },\n '6': function(n) {\n if (n === 0)\n return 'zero';\n if ((n % 10) == 1 && (n % 100) != 11)\n return 'one';\n return 'other';\n },\n '7': function(n) {\n if (n == 2)\n return 'two';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '8': function(n) {\n if ((isBetween(n, 3, 6)))\n return 'few';\n if ((isBetween(n, 7, 10)))\n return 'many';\n if (n == 2)\n return 'two';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '9': function(n) {\n if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))\n return 'few';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '10': function(n) {\n if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))\n return 'few';\n if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))\n return 'one';\n return 'other';\n },\n '11': function(n) {\n if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n return 'few';\n if ((n % 10) === 0 ||\n (isBetween((n % 10), 5, 9)) ||\n (isBetween((n % 100), 11, 14)))\n return 'many';\n if ((n % 10) == 1 && (n % 100) != 11)\n return 'one';\n return 'other';\n },\n '12': function(n) {\n if ((isBetween(n, 2, 4)))\n return 'few';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '13': function(n) {\n if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n return 'few';\n if (n != 1 && (isBetween((n % 10), 0, 1)) ||\n (isBetween((n % 10), 5, 9)) ||\n (isBetween((n % 100), 12, 14)))\n return 'many';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '14': function(n) {\n if ((isBetween((n % 100), 3, 4)))\n return 'few';\n if ((n % 100) == 2)\n return 'two';\n if ((n % 100) == 1)\n return 'one';\n return 'other';\n },\n '15': function(n) {\n if (n === 0 || (isBetween((n % 100), 2, 10)))\n return 'few';\n if ((isBetween((n % 100), 11, 19)))\n return 'many';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '16': function(n) {\n if ((n % 10) == 1 && n != 11)\n return 'one';\n return 'other';\n },\n '17': function(n) {\n if (n == 3)\n return 'few';\n if (n === 0)\n return 'zero';\n if (n == 6)\n return 'many';\n if (n == 2)\n return 'two';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '18': function(n) {\n if (n === 0)\n return 'zero';\n if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)\n return 'one';\n return 'other';\n },\n '19': function(n) {\n if ((isBetween(n, 2, 10)))\n return 'few';\n if ((isBetween(n, 0, 1)))\n return 'one';\n return 'other';\n },\n '20': function(n) {\n if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(\n isBetween((n % 100), 10, 19) ||\n isBetween((n % 100), 70, 79) ||\n isBetween((n % 100), 90, 99)\n ))\n return 'few';\n if ((n % 1000000) === 0 && n !== 0)\n return 'many';\n if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))\n return 'two';\n if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))\n return 'one';\n return 'other';\n },\n '21': function(n) {\n if (n === 0)\n return 'zero';\n if (n == 1)\n return 'one';\n return 'other';\n },\n '22': function(n) {\n if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))\n return 'one';\n return 'other';\n },\n '23': function(n) {\n if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)\n return 'one';\n return 'other';\n },\n '24': function(n) {\n if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))\n return 'few';\n if (isIn(n, [2, 12]))\n return 'two';\n if (isIn(n, [1, 11]))\n return 'one';\n return 'other';\n }\n };\n\n // return a function that gives the plural form name for a given integer\n var index = locales2rules[lang.replace(/-.*$/, '')];\n if (!(index in pluralRules)) {\n console.warn('plural form unknown for [' + lang + ']');\n return function() { return 'other'; };\n }\n return pluralRules[index];\n }\n\n // pre-defined 'plural' macro\n gMacros.plural = function(str, param, key, prop) {\n var n = parseFloat(param);\n if (isNaN(n))\n return str;\n\n // TODO: support other properties (l20n still doesn't...)\n if (prop != gTextProp)\n return str;\n\n // initialize _pluralRules\n if (!gMacros._pluralRules) {\n gMacros._pluralRules = getPluralRules(gLanguage);\n }\n var index = '[' + gMacros._pluralRules(n) + ']';\n\n // try to find a [zero|one|two] key if it's defined\n if (n === 0 && (key + '[zero]') in gL10nData) {\n str = gL10nData[key + '[zero]'][prop];\n } else if (n == 1 && (key + '[one]') in gL10nData) {\n str = gL10nData[key + '[one]'][prop];\n } else if (n == 2 && (key + '[two]') in gL10nData) {\n str = gL10nData[key + '[two]'][prop];\n } else if ((key + index) in gL10nData) {\n str = gL10nData[key + index][prop];\n } else if ((key + '[other]') in gL10nData) {\n str = gL10nData[key + '[other]'][prop];\n }\n\n return str;\n };\n\n\n /**\n * l10n dictionary functions\n */\n\n // fetch an l10n object, warn if not found, apply `args' if possible\n function getL10nData(key, args, fallback) {\n var data = gL10nData[key];\n if (!data) {\n console.warn('#' + key + ' is undefined.');\n if (!fallback) {\n return null;\n }\n data = fallback;\n }\n\n /** This is where l10n expressions should be processed.\n * The plan is to support C-style expressions from the l20n project;\n * until then, only two kinds of simple expressions are supported:\n * {[ index ]} and {{ arguments }}.\n */\n var rv = {};\n for (var prop in data) {\n var str = data[prop];\n str = substIndexes(str, args, key, prop);\n str = substArguments(str, args, key);\n rv[prop] = str;\n }\n return rv;\n }\n\n // replace {[macros]} with their values\n function substIndexes(str, args, key, prop) {\n var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n var reMatch = reIndex.exec(str);\n if (!reMatch || !reMatch.length)\n return str;\n\n // an index/macro has been found\n // Note: at the moment, only one parameter is supported\n var macroName = reMatch[1];\n var paramName = reMatch[2];\n var param;\n if (args && paramName in args) {\n param = args[paramName];\n } else if (paramName in gL10nData) {\n param = gL10nData[paramName];\n }\n\n // there's no macro parser yet: it has to be defined in gMacros\n if (macroName in gMacros) {\n var macro = gMacros[macroName];\n str = macro(str, param, key, prop);\n }\n return str;\n }\n\n // replace {{arguments}} with their values\n function substArguments(str, args, key) {\n var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n return str.replace(reArgs, function(matched_text, arg) {\n if (args && arg in args) {\n return args[arg];\n }\n if (arg in gL10nData) {\n return gL10nData[arg];\n }\n console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n return matched_text;\n });\n }\n\n // translate an HTML element\n function translateElement(element) {\n var l10n = getL10nAttributes(element);\n if (!l10n.id)\n return;\n\n // get the related l10n object\n var data = getL10nData(l10n.id, l10n.args);\n if (!data) {\n console.warn('#' + l10n.id + ' is undefined.');\n return;\n }\n\n // translate element (TODO: security checks?)\n if (data[gTextProp]) { // XXX\n if (getChildElementCount(element) === 0) {\n element[gTextProp] = data[gTextProp];\n } else {\n // this element has element children: replace the content of the first\n // (non-empty) child textNode and clear other child textNodes\n var children = element.childNodes;\n var found = false;\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n if (found) {\n children[i].nodeValue = '';\n } else {\n children[i].nodeValue = data[gTextProp];\n found = true;\n }\n }\n }\n // if no (non-empty) textNode is found, insert a textNode before the\n // first element child.\n if (!found) {\n var textNode = document.createTextNode(data[gTextProp]);\n element.insertBefore(textNode, element.firstChild);\n }\n }\n delete data[gTextProp];\n }\n\n for (var k in data) {\n element[k] = data[k];\n }\n }\n\n // webkit browsers don't currently support 'children' on SVG elements...\n function getChildElementCount(element) {\n if (element.children) {\n return element.children.length;\n }\n if (typeof element.childElementCount !== 'undefined') {\n return element.childElementCount;\n }\n var count = 0;\n for (var i = 0; i < element.childNodes.length; i++) {\n count += element.nodeType === 1 ? 1 : 0;\n }\n return count;\n }\n\n // translate an HTML subtree\n function translateFragment(element) {\n element = element || document.documentElement;\n\n // check all translatable children (= w/ a `data-l10n-id' attribute)\n var children = getTranslatableChildren(element);\n var elementCount = children.length;\n for (var i = 0; i < elementCount; i++) {\n translateElement(children[i]);\n }\n\n // translate element itself if necessary\n translateElement(element);\n }\n\n return {\n // get a localized string\n get: function(key, args, fallbackString) {\n var index = key.lastIndexOf('.');\n var prop = gTextProp;\n if (index > 0) { // An attribute has been specified\n prop = key.substring(index + 1);\n key = key.substring(0, index);\n }\n var fallback;\n if (fallbackString) {\n fallback = {};\n fallback[prop] = fallbackString;\n }\n var data = getL10nData(key, args, fallback);\n if (data && prop in data) {\n return data[prop];\n }\n return '{{' + key + '}}';\n },\n\n // debug\n getData: function() { return gL10nData; },\n getText: function() { return gTextData; },\n\n // get|set the document language\n getLanguage: function() { return gLanguage; },\n setLanguage: function(lang, callback) {\n loadLocale(lang, function() {\n if (callback)\n callback();\n });\n },\n\n // get the direction (ltr|rtl) of the current language\n getDirection: function() {\n // http://www.w3.org/International/questions/qa-scripts\n // Arabic, Hebrew, Farsi, Pashto, Urdu\n var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n var shortCode = gLanguage.split('-', 1)[0];\n return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr';\n },\n\n // translate an element or document fragment\n translate: translateFragment,\n\n // this can be used to prevent race conditions\n getReadyState: function() { return gReadyState; },\n ready: function(callback) {\n if (!callback) {\n return;\n } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n window.setTimeout(function() {\n callback();\n });\n } else if (document.addEventListener) {\n document.addEventListener('localized', function once() {\n document.removeEventListener('localized', once);\n callback();\n });\n }\n }\n };\n}) (window, document);\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getPdfFilenameFromUrl, loadScript } from \"pdfjs-lib\";\n\nasync function docPropertiesLookup(pdfDocument) {\n const url = \"\",\n baseUrl = url.split(\"#\")[0];\n // eslint-disable-next-line prefer-const\n let { info, metadata, contentDispositionFilename, contentLength } =\n await pdfDocument.getMetadata();\n\n if (!contentLength) {\n const { length } = await pdfDocument.getDownloadInfo();\n contentLength = length;\n }\n\n return {\n ...info,\n baseURL: baseUrl,\n filesize: contentLength,\n filename: contentDispositionFilename || getPdfFilenameFromUrl(url),\n metadata: metadata?.getRaw(),\n authors: metadata?.get(\"dc:creator\"),\n numPages: pdfDocument.numPages,\n URL: url,\n };\n}\n\nclass GenericScripting {\n constructor(sandboxBundleSrc) {\n this._ready = loadScript(\n sandboxBundleSrc,\n /* removeScriptElement = */ true\n ).then(() => {\n return window.pdfjsSandbox.QuickJSSandbox();\n });\n }\n\n async createSandbox(data) {\n const sandbox = await this._ready;\n sandbox.create(data);\n }\n\n async dispatchEventInSandbox(event) {\n const sandbox = await this._ready;\n sandbox.dispatchEvent(event);\n }\n\n async destroySandbox() {\n const sandbox = await this._ready;\n sandbox.nukeSandbox();\n }\n}\n\nexport { docPropertiesLookup, GenericScripting };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PDFPrintServiceFactory, PDFViewerApplication } from \"./app.js\";\nimport { getXfaHtmlForPrinting } from \"./print_utils.js\";\nimport { viewerCompatibilityParams } from \"./viewer_compatibility.js\";\n\nlet activeService = null;\nlet overlayManager = null;\n\n// Renders the page to the canvas of the given print service, and returns\n// the suggested dimensions of the output page.\nfunction renderPage(\n activeServiceOnEntry,\n pdfDocument,\n pageNumber,\n size,\n printResolution,\n optionalContentConfigPromise\n) {\n const scratchCanvas = activeService.scratchCanvas;\n\n // The size of the canvas in pixels for printing.\n const PRINT_UNITS = printResolution / 72.0;\n scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);\n scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);\n\n const ctx = scratchCanvas.getContext(\"2d\");\n ctx.save();\n ctx.fillStyle = \"rgb(255, 255, 255)\";\n ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);\n ctx.restore();\n\n return pdfDocument.getPage(pageNumber).then(function (pdfPage) {\n const renderContext = {\n canvasContext: ctx,\n transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],\n viewport: pdfPage.getViewport({ scale: 1, rotation: size.rotation }),\n intent: \"print\",\n includeAnnotationStorage: true,\n optionalContentConfigPromise,\n };\n return pdfPage.render(renderContext).promise;\n });\n}\n\nfunction PDFPrintService(\n pdfDocument,\n pagesOverview,\n printContainer,\n printResolution,\n optionalContentConfigPromise = null,\n l10n\n) {\n this.pdfDocument = pdfDocument;\n this.pagesOverview = pagesOverview;\n this.printContainer = printContainer;\n this._printResolution = printResolution || 150;\n this._optionalContentConfigPromise =\n optionalContentConfigPromise || pdfDocument.getOptionalContentConfig();\n this.l10n = l10n;\n this.currentPage = -1;\n // The temporary canvas where renderPage paints one page at a time.\n this.scratchCanvas = document.createElement(\"canvas\");\n}\n\nPDFPrintService.prototype = {\n layout() {\n this.throwIfInactive();\n\n const body = document.querySelector(\"body\");\n body.setAttribute(\"data-pdfjsprinting\", true);\n\n const hasEqualPageSizes = this.pagesOverview.every(function (size) {\n return (\n size.width === this.pagesOverview[0].width &&\n size.height === this.pagesOverview[0].height\n );\n }, this);\n if (!hasEqualPageSizes) {\n console.warn(\n \"Not all pages have the same size. The printed \" +\n \"result may be incorrect!\"\n );\n }\n\n // Insert a @page + size rule to make sure that the page size is correctly\n // set. Note that we assume that all pages have the same size, because\n // variable-size pages are not supported yet (e.g. in Chrome & Firefox).\n // TODO(robwu): Use named pages when size calculation bugs get resolved\n // (e.g. https://crbug.com/355116) AND when support for named pages is\n // added (http://www.w3.org/TR/css3-page/#using-named-pages).\n // In browsers where @page + size is not supported (such as Firefox,\n // https://bugzil.la/851441), the next stylesheet will be ignored and the\n // user has to select the correct paper size in the UI if wanted.\n this.pageStyleSheet = document.createElement(\"style\");\n const pageSize = this.pagesOverview[0];\n this.pageStyleSheet.textContent =\n \"@page { size: \" + pageSize.width + \"pt \" + pageSize.height + \"pt;}\";\n body.appendChild(this.pageStyleSheet);\n },\n\n destroy() {\n if (activeService !== this) {\n // |activeService| cannot be replaced without calling destroy() first,\n // so if it differs then an external consumer has a stale reference to\n // us.\n return;\n }\n this.printContainer.textContent = \"\";\n\n const body = document.querySelector(\"body\");\n body.removeAttribute(\"data-pdfjsprinting\");\n\n if (this.pageStyleSheet) {\n this.pageStyleSheet.remove();\n this.pageStyleSheet = null;\n }\n this.scratchCanvas.width = this.scratchCanvas.height = 0;\n this.scratchCanvas = null;\n activeService = null;\n ensureOverlay().then(function () {\n if (overlayManager.active !== \"printServiceOverlay\") {\n return; // overlay was already closed\n }\n overlayManager.close(\"printServiceOverlay\");\n });\n },\n\n renderPages() {\n if (this.pdfDocument.isPureXfa) {\n getXfaHtmlForPrinting(this.printContainer, this.pdfDocument);\n return Promise.resolve();\n }\n\n const pageCount = this.pagesOverview.length;\n const renderNextPage = (resolve, reject) => {\n this.throwIfInactive();\n if (++this.currentPage >= pageCount) {\n renderProgress(pageCount, pageCount, this.l10n);\n resolve();\n return;\n }\n const index = this.currentPage;\n renderProgress(index, pageCount, this.l10n);\n renderPage(\n this,\n this.pdfDocument,\n /* pageNumber = */ index + 1,\n this.pagesOverview[index],\n this._printResolution,\n this._optionalContentConfigPromise\n )\n .then(this.useRenderedPage.bind(this))\n .then(function () {\n renderNextPage(resolve, reject);\n }, reject);\n };\n return new Promise(renderNextPage);\n },\n\n useRenderedPage() {\n this.throwIfInactive();\n const img = document.createElement(\"img\");\n const scratchCanvas = this.scratchCanvas;\n if (\n \"toBlob\" in scratchCanvas &&\n !viewerCompatibilityParams.disableCreateObjectURL\n ) {\n scratchCanvas.toBlob(function (blob) {\n img.src = URL.createObjectURL(blob);\n });\n } else {\n img.src = scratchCanvas.toDataURL();\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"printedPage\";\n wrapper.appendChild(img);\n this.printContainer.appendChild(wrapper);\n\n return new Promise(function (resolve, reject) {\n img.onload = resolve;\n img.onerror = reject;\n });\n },\n\n performPrint() {\n this.throwIfInactive();\n return new Promise(resolve => {\n // Push window.print in the macrotask queue to avoid being affected by\n // the deprecation of running print() code in a microtask, see\n // https://github.com/mozilla/pdf.js/issues/7547.\n setTimeout(() => {\n if (!this.active) {\n resolve();\n return;\n }\n print.call(window);\n // Delay promise resolution in case print() was not synchronous.\n setTimeout(resolve, 20); // Tidy-up.\n }, 0);\n });\n },\n\n get active() {\n return this === activeService;\n },\n\n throwIfInactive() {\n if (!this.active) {\n throw new Error(\"This print request was cancelled or completed.\");\n }\n },\n};\n\nconst print = window.print;\nwindow.print = function () {\n if (activeService) {\n console.warn(\"Ignored window.print() because of a pending print job.\");\n return;\n }\n ensureOverlay().then(function () {\n if (activeService) {\n overlayManager.open(\"printServiceOverlay\");\n }\n });\n\n try {\n dispatchEvent(\"beforeprint\");\n } finally {\n if (!activeService) {\n console.error(\"Expected print service to be initialized.\");\n ensureOverlay().then(function () {\n if (overlayManager.active === \"printServiceOverlay\") {\n overlayManager.close(\"printServiceOverlay\");\n }\n });\n return; // eslint-disable-line no-unsafe-finally\n }\n const activeServiceOnEntry = activeService;\n activeService\n .renderPages()\n .then(function () {\n return activeServiceOnEntry.performPrint();\n })\n .catch(function () {\n // Ignore any error messages.\n })\n .then(function () {\n // aborts acts on the \"active\" print request, so we need to check\n // whether the print request (activeServiceOnEntry) is still active.\n // Without the check, an unrelated print request (created after aborting\n // this print request while the pages were being generated) would be\n // aborted.\n if (activeServiceOnEntry.active) {\n abort();\n }\n });\n }\n};\n\nfunction dispatchEvent(eventType) {\n const event = document.createEvent(\"CustomEvent\");\n event.initCustomEvent(eventType, false, false, \"custom\");\n window.dispatchEvent(event);\n}\n\nfunction abort() {\n if (activeService) {\n activeService.destroy();\n dispatchEvent(\"afterprint\");\n }\n}\n\nfunction renderProgress(index, total, l10n) {\n const progressContainer = document.getElementById(\"printServiceOverlay\");\n const progress = Math.round((100 * index) / total);\n const progressBar = progressContainer.querySelector(\"progress\");\n const progressPerc = progressContainer.querySelector(\".relative-progress\");\n progressBar.value = progress;\n l10n.get(\"print_progress_percent\", { progress }).then(msg => {\n progressPerc.textContent = msg;\n });\n}\n\nwindow.addEventListener(\n \"keydown\",\n function (event) {\n // Intercept Cmd/Ctrl + P in all browsers.\n // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera\n if (\n event.keyCode === /* P= */ 80 &&\n (event.ctrlKey || event.metaKey) &&\n !event.altKey &&\n (!event.shiftKey || window.chrome || window.opera)\n ) {\n window.print();\n\n // The (browser) print dialog cannot be prevented from being shown in\n // IE11.\n event.preventDefault();\n if (event.stopImmediatePropagation) {\n event.stopImmediatePropagation();\n } else {\n event.stopPropagation();\n }\n }\n },\n true\n);\n\nif (\"onbeforeprint\" in window) {\n // Do not propagate before/afterprint events when they are not triggered\n // from within this polyfill. (FF / Chrome 63+).\n const stopPropagationIfNeeded = function (event) {\n if (event.detail !== \"custom\" && event.stopImmediatePropagation) {\n event.stopImmediatePropagation();\n }\n };\n window.addEventListener(\"beforeprint\", stopPropagationIfNeeded);\n window.addEventListener(\"afterprint\", stopPropagationIfNeeded);\n}\n\nlet overlayPromise;\nfunction ensureOverlay() {\n if (!overlayPromise) {\n overlayManager = PDFViewerApplication.overlayManager;\n if (!overlayManager) {\n throw new Error(\"The overlay manager has not yet been initialized.\");\n }\n\n overlayPromise = overlayManager.register(\n \"printServiceOverlay\",\n document.getElementById(\"printServiceOverlay\"),\n abort,\n true\n );\n document.getElementById(\"printCancel\").onclick = abort;\n }\n return overlayPromise;\n}\n\nPDFPrintServiceFactory.instance = {\n supportsPrinting: true,\n\n createPrintService(\n pdfDocument,\n pagesOverview,\n printContainer,\n printResolution,\n optionalContentConfigPromise,\n l10n\n ) {\n if (activeService) {\n throw new Error(\"The print service is created and active.\");\n }\n activeService = new PDFPrintService(\n pdfDocument,\n pagesOverview,\n printContainer,\n printResolution,\n optionalContentConfigPromise,\n l10n\n );\n return activeService;\n },\n};\n\nexport { PDFPrintService };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CSS_UNITS } from \"./ui_utils.js\";\nimport { DefaultXfaLayerFactory } from \"./xfa_layer_builder.js\";\nimport { getXfaPageViewport } from \"pdfjs-lib\";\n\nfunction getXfaHtmlForPrinting(printContainer, pdfDocument) {\n const xfaHtml = pdfDocument.allXfaHtml;\n const factory = new DefaultXfaLayerFactory();\n const scale = Math.round(CSS_UNITS * 100) / 100;\n\n for (const xfaPage of xfaHtml.children) {\n const page = document.createElement(\"div\");\n page.className = \"xfaPrintedPage\";\n printContainer.appendChild(page);\n\n const builder = factory.createXfaLayerBuilder(\n /* pageDiv = */ page,\n /* pdfPage = */ null,\n /* annotationStorage = */ pdfDocument.annotationStorage,\n /* xfaHtml = */ xfaPage\n );\n const viewport = getXfaPageViewport(xfaPage, { scale });\n\n builder.render(viewport, \"print\");\n }\n}\n\nexport { getXfaHtmlForPrinting };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions } from \"./app_options.js\";\nimport { PDFViewerApplication } from \"./app.js\";\n\n/* eslint-disable-next-line no-unused-vars */\nconst pdfjsVersion =\n typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : void 0;\n/* eslint-disable-next-line no-unused-vars */\nconst pdfjsBuild =\n typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_BUILD\") : void 0;\n\nwindow.PDFViewerApplication = PDFViewerApplication;\nwindow.PDFViewerApplicationOptions = AppOptions;\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")) {\n var defaultUrl; // eslint-disable-line no-var\n\n (function rewriteUrlClosure() {\n // Run this code outside DOMContentLoaded to make sure that the URL\n // is rewritten as soon as possible.\n const queryString = document.location.search.slice(1);\n const m = /(^|&)file=([^&]*)/.exec(queryString);\n defaultUrl = m ? decodeURIComponent(m[2]) : \"\";\n\n // Example: chrome-extension://.../http://example.com/file.pdf\n const humanReadableUrl = \"/\" + defaultUrl + location.hash;\n history.replaceState(history.state, \"\", humanReadableUrl);\n if (top === window) {\n // eslint-disable-next-line no-undef\n chrome.runtime.sendMessage(\"showPageAction\");\n }\n })();\n}\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n require(\"./firefoxcom.js\");\n require(\"./firefox_print_service.js\");\n}\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\")) {\n require(\"./genericcom.js\");\n}\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")) {\n require(\"./chromecom.js\");\n}\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME || GENERIC\")) {\n require(\"./pdf_print_service.js\");\n}\n\nfunction getViewerConfiguration() {\n let errorWrapper = null;\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n errorWrapper = {\n container: document.getElementById(\"errorWrapper\"),\n errorMessage: document.getElementById(\"errorMessage\"),\n closeButton: document.getElementById(\"errorClose\"),\n errorMoreInfo: document.getElementById(\"errorMoreInfo\"),\n moreInfoButton: document.getElementById(\"errorShowMore\"),\n lessInfoButton: document.getElementById(\"errorShowLess\"),\n };\n }\n\n return {\n appContainer: document.body,\n mainContainer: document.getElementById(\"viewerContainer\"),\n viewerContainer: document.getElementById(\"viewer\"),\n eventBus: null,\n toolbar: {\n container: document.getElementById(\"toolbarViewer\"),\n numPages: document.getElementById(\"numPages\"),\n pageNumber: document.getElementById(\"pageNumber\"),\n scaleSelectContainer: document.getElementById(\"scaleSelectContainer\"),\n scaleSelect: document.getElementById(\"scaleSelect\"),\n customScaleOption: document.getElementById(\"customScaleOption\"),\n previous: document.getElementById(\"previous\"),\n next: document.getElementById(\"next\"),\n zoomIn: document.getElementById(\"zoomIn\"),\n zoomOut: document.getElementById(\"zoomOut\"),\n viewFind: document.getElementById(\"viewFind\"),\n openFile: document.getElementById(\"openFile\"),\n print: document.getElementById(\"print\"),\n presentationModeButton: document.getElementById(\"presentationMode\"),\n download: document.getElementById(\"download\"),\n viewBookmark: document.getElementById(\"viewBookmark\"),\n },\n secondaryToolbar: {\n toolbar: document.getElementById(\"secondaryToolbar\"),\n toggleButton: document.getElementById(\"secondaryToolbarToggle\"),\n toolbarButtonContainer: document.getElementById(\n \"secondaryToolbarButtonContainer\"\n ),\n presentationModeButton: document.getElementById(\n \"secondaryPresentationMode\"\n ),\n openFileButton: document.getElementById(\"secondaryOpenFile\"),\n printButton: document.getElementById(\"secondaryPrint\"),\n downloadButton: document.getElementById(\"secondaryDownload\"),\n viewBookmarkButton: document.getElementById(\"secondaryViewBookmark\"),\n firstPageButton: document.getElementById(\"firstPage\"),\n lastPageButton: document.getElementById(\"lastPage\"),\n pageRotateCwButton: document.getElementById(\"pageRotateCw\"),\n pageRotateCcwButton: document.getElementById(\"pageRotateCcw\"),\n cursorSelectToolButton: document.getElementById(\"cursorSelectTool\"),\n cursorHandToolButton: document.getElementById(\"cursorHandTool\"),\n scrollVerticalButton: document.getElementById(\"scrollVertical\"),\n scrollHorizontalButton: document.getElementById(\"scrollHorizontal\"),\n scrollWrappedButton: document.getElementById(\"scrollWrapped\"),\n spreadNoneButton: document.getElementById(\"spreadNone\"),\n spreadOddButton: document.getElementById(\"spreadOdd\"),\n spreadEvenButton: document.getElementById(\"spreadEven\"),\n documentPropertiesButton: document.getElementById(\"documentProperties\"),\n },\n sidebar: {\n // Divs (and sidebar button)\n outerContainer: document.getElementById(\"outerContainer\"),\n viewerContainer: document.getElementById(\"viewerContainer\"),\n toggleButton: document.getElementById(\"sidebarToggle\"),\n // Buttons\n thumbnailButton: document.getElementById(\"viewThumbnail\"),\n outlineButton: document.getElementById(\"viewOutline\"),\n attachmentsButton: document.getElementById(\"viewAttachments\"),\n layersButton: document.getElementById(\"viewLayers\"),\n // Views\n thumbnailView: document.getElementById(\"thumbnailView\"),\n outlineView: document.getElementById(\"outlineView\"),\n attachmentsView: document.getElementById(\"attachmentsView\"),\n layersView: document.getElementById(\"layersView\"),\n // View-specific options\n outlineOptionsContainer: document.getElementById(\n \"outlineOptionsContainer\"\n ),\n currentOutlineItemButton: document.getElementById(\"currentOutlineItem\"),\n },\n sidebarResizer: {\n outerContainer: document.getElementById(\"outerContainer\"),\n resizer: document.getElementById(\"sidebarResizer\"),\n },\n findBar: {\n bar: document.getElementById(\"findbar\"),\n toggleButton: document.getElementById(\"viewFind\"),\n findField: document.getElementById(\"findInput\"),\n highlightAllCheckbox: document.getElementById(\"findHighlightAll\"),\n caseSensitiveCheckbox: document.getElementById(\"findMatchCase\"),\n entireWordCheckbox: document.getElementById(\"findEntireWord\"),\n findMsg: document.getElementById(\"findMsg\"),\n findResultsCount: document.getElementById(\"findResultsCount\"),\n findPreviousButton: document.getElementById(\"findPrevious\"),\n findNextButton: document.getElementById(\"findNext\"),\n },\n passwordOverlay: {\n overlayName: \"passwordOverlay\",\n container: document.getElementById(\"passwordOverlay\"),\n label: document.getElementById(\"passwordText\"),\n input: document.getElementById(\"password\"),\n submitButton: document.getElementById(\"passwordSubmit\"),\n cancelButton: document.getElementById(\"passwordCancel\"),\n },\n documentProperties: {\n overlayName: \"documentPropertiesOverlay\",\n container: document.getElementById(\"documentPropertiesOverlay\"),\n closeButton: document.getElementById(\"documentPropertiesClose\"),\n fields: {\n fileName: document.getElementById(\"fileNameField\"),\n fileSize: document.getElementById(\"fileSizeField\"),\n title: document.getElementById(\"titleField\"),\n author: document.getElementById(\"authorField\"),\n subject: document.getElementById(\"subjectField\"),\n keywords: document.getElementById(\"keywordsField\"),\n creationDate: document.getElementById(\"creationDateField\"),\n modificationDate: document.getElementById(\"modificationDateField\"),\n creator: document.getElementById(\"creatorField\"),\n producer: document.getElementById(\"producerField\"),\n version: document.getElementById(\"versionField\"),\n pageCount: document.getElementById(\"pageCountField\"),\n pageSize: document.getElementById(\"pageSizeField\"),\n linearized: document.getElementById(\"linearizedField\"),\n },\n },\n errorWrapper,\n printContainer: document.getElementById(\"printContainer\"),\n openFileInputName: \"fileInput\",\n debuggerScriptPath: \"./debugger.js\",\n };\n}\n\nfunction webViewerLoad() {\n const config = getViewerConfiguration();\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")) {\n Promise.all([\n import(\"pdfjs-web/genericcom.js\"),\n import(\"pdfjs-web/pdf_print_service.js\"),\n ]).then(function ([genericCom, pdfPrintService]) {\n PDFViewerApplication.run(config);\n });\n } else {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")) {\n AppOptions.set(\"defaultUrl\", defaultUrl);\n }\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\")) {\n // Give custom implementations of the default viewer a simpler way to\n // set various `AppOptions`, by dispatching an event once all viewer\n // files are loaded but *before* the viewer initialization has run.\n const event = document.createEvent(\"CustomEvent\");\n event.initCustomEvent(\"webviewerloaded\", true, true, {\n source: window,\n });\n try {\n // Attempt to dispatch the event at the embedding `document`,\n // in order to support cases where the viewer is embedded in\n // a *dynamically* created <iframe> element.\n parent.document.dispatchEvent(event);\n } catch (ex) {\n // The viewer could be in e.g. a cross-origin <iframe> element,\n // fallback to dispatching the event at the current `document`.\n console.error(`webviewerloaded: ${ex}`);\n document.dispatchEvent(event);\n }\n }\n\n PDFViewerApplication.run(config);\n }\n}\n\n// Block the \"load\" event until all pages are loaded, to ensure that printing\n// works in Firefox; see https://bugzilla.mozilla.org/show_bug.cgi?id=1618553\nif (document.blockUnblockOnload) {\n document.blockUnblockOnload(true);\n}\n\nif (\n document.readyState === \"interactive\" ||\n document.readyState === \"complete\"\n) {\n webViewerLoad();\n} else {\n document.addEventListener(\"DOMContentLoaded\", webViewerLoad, true);\n}\n\nexport { PDFViewerApplication, AppOptions as PDFViewerApplicationOptions };\n"],"sourceRoot":""}